RFM — это метод, используемый для анализа потребительской ценности.
Он группирует клиентов на основе истории их транзакций:
Recency (Давность) — Как давно клиент совершил покупку?
Frequency (Частота) — Как часто они совершают покупки?
Monetary Value (Денежная ценность) — Сколько они тратят?
Объедините и сгруппируйте клиентов в различные сегменты для легкого запоминания и целевой ориентации кампаний. Это очень полезно для понимания степени отклика ваших клиентов и маркетинга баз данных на основе сегментации.
Полученные сегменты можно упорядочить от наиболее ценных (наибольшая повторяемость, частота и ценность) до наименее ценных (наименьшая повторяемость, частота и ценность). Идентификация наиболее ценных сегментов RFM помогает в извлечении выгоды из случайных взаимосвязей в данных, используемых для этого анализа.
Давайте рассмотрим имплементацию нашей сегментации на практике.
# import libraries
import numpy as np # linear algebra
import pandas as pd # data processing, CSV file I/O (e.g. pd.read_csv)
import matplotlib.pyplot as plt
import pandas_profiling as pp
import seaborn as sns
import datetime as dt
#Load the data
data=pd.read_csv(“sales_data_sample.csv”,encoding=’unicode_escape’)
#Glimpse of data
print(data.info())
print(data.head())
print(data.describe()) #validate min and max values of each values.
# Before moving forward towards RFM score calculations we need to proceed with some basic preprocessing steps:
Clean the data like Delete all negative Quantity and Price;
Delete NA customer ID;
Handle duplicate null values;
Remove unnecessary columns
#After preprocessing, we will proceed forward towards RFM score calculations
Для RFM-анализа нам потребуются определенные данные о каждом из клиентов:
ID клиента / имя / компания и т.д. - для их идентификации.
Давность (R) как количество дней с момента последней покупки: Сколько дней назад была совершена их последняя покупка? Вычтите дату последней покупки из сегодняшнего дня, чтобы рассчитать значение давности. 1 день назад? 14 дней назад? 500 дней назад?
Частота (F) как общее количество транзакций: Сколько раз клиент совершал покупки в нашем магазине? Например, если кто-то сделал 10 заказов за определенный период времени, его частота равна 10.
Деньги (М) как общая сумма потраченных денег: Сколько $$ (или любой другой валюты расчета) потратил этот клиент? Просто суммируйте деньги от всех транзакций, чтобы получить значение M.
Чтобы извлечь эти значения, нам понадобятся только следующие столбцы из датасета.
'CUSTOMERNAME', 'ORDERNUMBER', 'ORDERDATE' и 'SALES'. ("ИМЯ ЗАКАЗЧИКА», «НОМЕР ЗАКАЗА», «ДАТА ЗАКАЗА» и «ПРОДАЖИ")
temp=['CUSTOMERNAME', 'ORDERNUMBER', 'ORDERDATE', 'SALES']
RFM_data=data[temp]
RFM_data.shape
Создание таблицы RFM
В датасете последний заказ был сделан 31 мая 2005 года, для расчета давности мы использовали его в качестве даты для функции NOW.
NOW = dt.datetime(2005,5,31)
#Convert ORDERDATE to datetime format.
RFM_data['ORDERDATE'] = pd.to_datetime(RFM_data['ORDERDATE'])
# RFM Table
RFM_table=RFM_data.groupby('CUSTOMERNAME').agg({'ORDERDATE': lambda x: (NOW - x.max()).days, # Recency
'ORDERNUMBER': lambda x: len(x.unique()), # Frequency
'SALES': lambda x: x.sum()}) # Monetary
RFM_table['ORDERDATE'] = RFM_table['ORDERDATE'].astype(int)
RFM_table.rename(columns={'ORDERDATE': 'recency',
'ORDERNUMBER': 'frequency',
'SALES': 'monetary_value'}, inplace=True)
RFM_table.head()
Теперь у нас есть значения RFM в отношении каждого клиента
RFM_table.head()
Давайте поработаем с показателем RFM. Для его расчета мы использовали квинтили — составление четырех равных частей на основе доступных значений — для расчета показателя RFM.
quantiles = RFM_table.quantile(q=[0.25,0.5,0.75])
quantiles
# Converting quantiles to a dictionary, easier to use.
quantiles = quantiles.to_dict()
## RFM Segmentation ----
RFM_Segment = RFM_table.copy()
# Arguments (x = value, p = recency, monetary_value, frequency, k = quartiles dict)
def R_Class(x,p,d):
if x <= d[p][0.25]:
return 4
elif x <= d[p][0.50]:
return 3
elif x <= d[p][0.75]:
return 2
else:
return 1
# Arguments (x = value, p = recency, monetary_value, frequency, k = quartiles dict)
def FM_Class(x,p,d):
if x <= d[p][0.25]:
return 1
elif x <= d[p][0.50]:
return 2
elif x <= d[p][0.75]:
return 3
else:
return 4
RFM_Segment['R_Quartile'] = RFM_Segment['recency'].apply(R_Class, args=('recency',quantiles,))
RFM_Segment['F_Quartile'] = RFM_Segment['frequency'].apply(FM_Class, args=('frequency',quantiles,))
RFM_Segment['M_Quartile'] = RFM_Segment['monetary_value'].apply(FM_Class, args=('monetary_value',quantiles,))
RFM_Segment['RFMClass'] = RFM_Segment.R_Quartile.map(str) \
+ RFM_Segment.F_Quartile.map(str) \
+ RFM_Segment.M_Quartile.map(str)
RFM-сегментация легко ответит на данные вопросы для вашего бизнеса...
Кто мои лучшие клиенты?
Какие клиенты находятся на пороге оттока?
Кто является потерянными клиентами, которым не нужно уделять много внимания?
Кто ваши постоянные клиенты?
Каких клиентов вы должны удержать?
Кто имеет потенциал для преобразования в более прибыльных клиентов?
Какая группа клиентов с наибольшей вероятностью откликнется на вашу текущую кампанию?
Вот некоторые из них:
Вопрос: Кто мои лучшие клиенты?
#RFMClass = 444
RFM_Segment[RFM_Segment['RFMClass']=='444'].sort_values('monetary_value', ascending=False).head()
Вопрос: Какие клиенты находятся на пороге оттока?
#Customers who's recency value is low
RFM_Segment[RFM_Segment['R_Quartile'] <= 2 ].sort_values('monetary_value', ascending=False).head(5)
Вопрос: Кто такие потерянные клиенты?
#Customers who's recency, frequency as well as monetary values are low
RFM_Segment[RFM_Segment['RFMClass']=='111'].sort_values('recency',ascending=False).head(5)
Вопрос: Кто такие лояльные клиенты?
#Customers with high frequency value
RFM_Segment[RFM_Segment['F_Quartile'] >= 3 ].sort_values('monetary_value', ascending=False).head(5)
Версии модели RFM
RFM — это простая структура для количественной оценки поведения клиентов. Многие пользователи дополнили и расширили модель сегментации RFM, создав ее вариации.
Две наиболее примечательные версии:
RFD (Recency, Frequency, Duration) — Duration здесь — это затраченное время. Особенно полезна при анализе поведения потребителей продуктов, ориентированных на просмотр/чтение/серфинг.
RFE (Recency, Frequency, Engagement) — Engagement (вовлеченность) может быть составной величиной, основанной на времени, проведенном на странице, количестве страниц за посещение, показателе отказов, активности в социальных сетях и т. д. Особенно полезно для онлайн-бизнеса.
Вы можете осуществлять RFM-анализ по всей своей клиентской базе или только для ее части. Например, можно сначала сегментировать клиентов на основе географического региона или других демографических характеристик, а затем провести RFM для исторических сегментов поведения, основанных на транзакциях.
Наша рекомендация: начните с чего-то простого, экспериментируйте и развивайте дальше.
Приглашаем всех желающих на открытое занятие «Визуализация данных с помощью библиотек Python». На этом вебинаре научимся, как выводить данные на графики, поработаем с Jupyter Notebook и разберем популярные Python-библиотеки для визуализации данных — Matplotlib, Seaborn, Plotly. В итоге создадим понятный и полезный график с данными, чтобы уже после занятия вы смогли применять навыки в работе. Регистрация на мероприятие.
dm_deko
Мы получили список лучших клиентов, но пока не понятно кто именно они. Спортсмены? Пенсионеры? Юные леди?
Т.е над полученной выборкой придется изрядно поколдовать и лучше заранее заложить возможность сохранения в ней максимума интересующих признаков (пол, возраст и т.п.)