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

Комментарии (1)


  1. dm_deko
    21.05.2022 03:34

    Мы получили список лучших клиентов, но пока не понятно кто именно они. Спортсмены? Пенсионеры? Юные леди?

    Т.е над полученной выборкой придется изрядно поколдовать и лучше заранее заложить возможность сохранения в ней максимума интересующих признаков (пол, возраст и т.п.)