Руководство по сегментации клиентов с помощью RFM.

Определение RFM

Новизна, частота, денежная стоимость — это инструмент маркетингового анализа, используемый для классификации лучших клиентов компании или организации путем измерения и анализа покупательских привычек.

Это известная и простая в применении техника. Мы сегментируем наших клиентов в соответствии с их структурой расходов.

Он широко используется в маркетинге баз данных и прямом маркетинге и получил особое внимание в сфере розничной торговли и профессиональных услуг.

Модель RFM основана на трех количественных факторах:

Давность: как давно клиент совершил покупку.
Частота: как часто клиент совершает покупку.
Денежная стоимость. : сколько денег клиент тратит на покупки

Мы стандартизируем эти числа по их важности.

После того, как мы вычислим баллы RFM, мы снова сегментируем в соответствии с таблицей;

Мы проигнорировали MONETARY [M] потому чтопо логике, если значения F[Frequency] и R[Receny] высокие, значение M также будет высоким. А еще, 2д таблица намного проще, чем 3д.

после обновления наших клиентов в соответствии с таблицей наверху
Похоже ;

Итак, давайте начнем с нашей бизнес-задачи и посмотрим, как RFM работает на практике.

1. Бизнес-проблема

Компания электронной коммерции хочет сегментировать своих клиентов и определять маркетинговые стратегии в соответствии с этими сегментами.

набор данных; https://archive.ics.uci.edu/ml/datasets/Online+Retail+II
Набор данных показывает продажи британского интернет-магазина между 12.01.2009 и 12.09.2011.

Информация об атрибутах:

InvoiceNo: номер счета. Номинал. 6-значный целочисленный номер, однозначно присвоенный каждой транзакции. Если этот код начинается с буквы «с», это означает отмену.
StockCode: код товара (товара). Номинал. 5-значный целочисленный номер, уникальный для каждого отдельного продукта.
Описание: название продукта (элемента). Номинальное.
Количество: количество каждого продукта (элемента) за транзакцию. Числовой.
InvoiceDate: дата и время выставления счета. Числовой. День и время создания транзакции.
UnitPrice: цена за единицу. Числовой. Цена товара за единицу в фунтах стерлингов (£).
CustomerID: номер клиента. Номинал. 5-значный целочисленный номер, уникальный для каждого клиента.
Страна: название страны. Номинал. Название страны, в которой проживает клиент.

2. Понимание данных

import datetime as dt
import pandas as pd
pd.set_option('display.max_columns', None)
pd.set_option('display.max_rows', None)
pd.set_option('display.float_format', lambda x: '%.5f' % x)
# 2009-2010 years data
df_ = pd.read_excel("online_retail_II.xlsx", sheet_name="Year 2009-2010")
df=df_.copy()
df.head()

df.describe().T

Как мы легко видим, у данных есть некоторые проблемы, например, данные и количество не могут быть «отрицательными». Так что, вероятно, в данных есть отмены, и нам нужно их удалить.

df.shape
Output = (525461, 8)

Давайте добавим несколько новых функций, таких как «TotalPrice».

df["TotalPrice"] = df["Quantity"] * df["Price"]
df.head() 

Сколько уникальных продуктов?

df['Description'].nunique()
Output = 4681

Сколько таких продуктов?

df['Description'].value_counts().head(5)

Какие продукты чаще всего заказывают?

a=df.groupby('Description').agg({'Quantity':'sum'})
a.sort_values(by='Quantity',ascending=False).head(5)

Сколько всего счетов-фактур было выставлено?

df['Invoice'].nunique()
Output =  28816

Сколько счетов-фактур было аннулировано?

df[df['Invoice'].str.contains('C',na=False)].head()

Сколько мы зарабатываем в каждой стране?

df.groupby('Country').agg({'TotalPrice':'sum'}).sort_values('TotalPrice',ascending=False).head()

Какие товары чаще всего возвращаются?

df_c=df[df['Invoice'].str.contains('C',na=False)]
df_c['Description'].value_counts().head()

3. Подготовка данных

df.isnull().sum()
OUTPUT;
Invoice             0
StockCode           0
Description      2928
Quantity            0
InvoiceDate         0
Price               0
Customer ID    107927
Country             0
TotalPrice          0
dtype: int64

Мы искали пропущенные значения и пропускаем этот пункт, так как наша основная задача не является предварительной обработкой данных.

df.dropna(inplace=True)
#Removing Returns
df = df[~df["Invoice"].str.contains("C", na=False)]
#latest version of our data
df.head(5)

df.describe().T

4. Расчет показателей RFM

Давность: как давно клиент совершил покупку?
Частота: как часто клиент совершает покупку?
Денежная стоимость: Сколько денег клиент тратит на покупки?

df["InvoiceDate"].max()
#I will consider this day as analyze day.
OUTPUT =
Timestamp('2010-12-09 20:01:00')
today_date = dt.datetime(2010, 12, 11) 
#today = 2010-12-11

rfm.head()

rfm.columns = ['recency', 'frequency', 'monetary']
rfm.head()

rfm.describe().T

rfm = rfm[rfm["monetary"] > 0]
rfm.head()

5. Расчет показателей RFM

#Recency , if the transaction happened recently give 5 points . 
rfm["recency_score"] = pd.qcut(rfm['recency'], 5, labels=[5, 4, 3, 2, 1])
#Frequency = , 5 =Most frequent , 1 = rarely
rfm["frequency_score"] = pd.qcut(rfm['frequency'].rank(method="first"), 5, labels=[1, 2, 3, 4, 5])

#5 =best 1= least
rfm["monetary_score"] = pd.qcut(rfm['monetary'], 5, labels=[1, 2, 3, 4, 5])
rfm.head(5)

rfm["RFM_SCORE"] = (rfm['recency_score'].astype(str) +
                    rfm['frequency_score'].astype(str))
#Scores converted to catherigocal variables and writen side by side
rfm.head(5)

6. Создание и анализ сегментов RFM

# RFM naming
seg_map = {
 r’[1–2][1–2]’: ‘hibernating’,
 r’[1–2][3–4]’: ‘at_Risk’,
 r’[1–2]5': ‘cant_loose’,
 r’3[1–2]’: ‘about_to_sleep’,
 r’33': ‘need_attention’,
 r’[3–4][4–5]’: ‘loyal_customers’,
 r’41': ‘promising’,
 r’51': ‘new_customers’,
 r’[4–5][2–3]’: ‘potential_loyalists’,
 r’5[4–5]’: ‘champions’
}
rfm[‘segment’] = rfm[‘RFM_SCORE’].replace(seg_map, regex=True)

Проведена работа по сегментации. Вы можете выполнять различные анализы данных в соответствии с вашими пожеланиями. Сейчас покажу несколько.

rfm[[“segment”, “recency”, “frequency”, “monetary”]].groupby(“segment”).agg([“mean”, “count”])

rfm[rfm["segment"] == "need_attention"].head()
#Show me "need attention" class

Большое спасибо за прочтение, надеюсь, вам понравилось и вы узнали.

Источники:



Больше контента на plainenglish.io