Руководство по сегментации клиентов с помощью 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