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)
Топ-5 потерянных клиентов
Топ-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. В итоге создадим понятный и полезный график с данными, чтобы уже после занятия вы смогли применять навыки в работе. Регистрация на мероприятие.