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

Набросок проекта –Используя набор данных о транзакциях интернет-магазина, сегментируйте клиентов по давности (как давно они делали заказы), частоте (как часто они заказывали) и денежной стоимости ( определяется их доходом). Этот проект описывает весь рабочий процесс от очистки данных до интерпретации результатов.

Бизнес-потребность –сегментируйте клиентов, чтобы выявить наиболее ценных клиентов.

Используемый метод:K означает кластеризацию. Попробуйте идентифицировать сегменты алгоритмически, а не традиционным анализом, создавая децили для каждой метрики. K Means создает самые разные кластеры/сегменты с наибольшим сходством внутри кластера и максимальной разницей между кластерами.

Шаг 1. Исследовательский анализ данных и очистка данных

Импорт модулей и загрузка данных

import pandas as pd
import matplotlib.pyplot as plt
from sklearn.cluster import KMeans
from sklearn.preprocessing import StandardScaler
import datetime
import seaborn as sns
data=pd.read_excel('onlineretail.xlsx')
data.shape

Загрузка данных и запуск метода формы показывают ~541 тыс. транзакций с 8 столбцами данных.

data.head()

Обработка отсутствующих значений

data.dropna(inplace=True)
data.info()

Обработка очевидных выбросов

#Looking at the distribution for the sales quantity column
plt.hist(data.Quantity)
plt.show()

Q3=data.Quantity.quantile(0.95)
Q1=data.Quantity.quantile(0.05)
print(Q1," ",Q3)
1.0 36.0
  • Похоже, в столбце количества продаж есть выбросы
  • Отрицательные величины выглядят как возвраты. Для этого первого прохода мы удалим их
  • Большинство заказов меньше 15 000 или около того
  • 95-й процентиль соответствует 36 заказам на счет.
  • Для этого прохода мы будем фильтровать набор данных до менее чем 1000 заказов.

Шаг 2-. Создание показателей и создание модели

Создание показателя давности

sales=data.loc[(data.Quantity>=0)&(data.Quantity<1000),:].copy()
#Getting the first and last invoicedate
sales.sort_values(by=['CustomerID','InvoiceDate'],inplace=True)
first_sale=sales.groupby('CustomerID')['InvoiceDate'].first()
last_sale=sales.groupby('CustomerID')['InvoiceDate'].last()
#Creating merging the dataframes with the last and 1st Date
sale_date=pd.concat([first_sale,last_sale],axis=1)
#Defining the recency metric 
sale_date['datecomp']=datetime.datetime.strptime('2012-01-01','%Y-%m-%d')
sale_date['recency']=(sale_date.datecomp-sale_date.last_sale).dt.days

Создание показателя частоты

#Creating the frequency Metric
freq=sales.groupby('CustomerID')['InvoiceNo'].count()
# Adding the Frequency metric to the main dataset
sale_date['freq']=freq

Создание показателя денежного выражения

#Create a Monetary Value metric
sales['Monetaryval']=sales.Quantity*sales.UnitPrice
Mval=sales.groupby('CustomerID')['Monetaryval'].sum()
#Adding the Monetary value Metric to the dataset
sale_date['Mval']=Mval
sale_date

#Selecting only the needed features
select_df=sale_date.loc[:,['recency','freq','Mval']].copy()
#Standardizing and scaling data
X=StandardScaler().fit_transform(select_df)
#Running with multiple values for clusters
ssd=[]
K=range(1,10)
for k in K:
    model=KMeans(n_clusters=k)
    model.fit(X)
    ssd.append(model.inertia_)
#Plotting the number of clusters versus the Within Cluster Sum of Square Errors
plt.figure(figsize=(12,5))
plt.plot(K,ssd)
plt.xlabel('Number of clusters',fontsize=14)
plt.ylabel('WSSE',fontsize=14)
plt.title('Elbow plot',fontsize=14)
  • Запуск с несколькими значениями K или кластерами.
  • Затем рисование графика значений K по сравнению с WSSE.
  • Выберите значения K, при которых инкрементальный прирост в WSSE (мера сходства кластеров) начинает сглаживаться.

  • Очевидная точка локтя при K=3
  • Еще одна точка локтя при K=4 (не так очевидно)
#Running the model with 4 clusters
model=KMeans(n_clusters=4)
model.fit(X)
#Adding the cluster labels to the dataset
select_df['labels']=model.labels_
#Lets look at the clusters
select_df.groupby('labels')['CustomerID','freq','Mval','recency'].agg({'CustomerID':'count','freq':'mean','Mval':'mean','recency':'mean'})

Кластер 3 заказывает наибольшую частоту, имеет наивысшее значение и является самым последним →Платиновый

  • Кластер 2 заказывает чуть реже, немного меньшее значение, чем 3, немного реже → Золото
  • Кластер 0 ниже, чем 2 и 3 по всем 3 показателям → Серебряный
  • Кластер 1 очень редко совершают покупки → бронза

Окончательные именованные кластеры

Шаг 3 – Возможные бизнес-результаты

  • Целевые премиальные предложения для клиентов со статусом Gold и Platinum. Продвигайте новые предложения продуктов в эксклюзивных запусках для этого сегмента. Ориентируйтесь на клиентов уровня Platinum и Gold для кредитных карт в магазине
  • Используйте предложения, чтобы повысить актуальность для клиентов Серебряного уровня. В этом сегменте больше всего клиентов, увеличение частоты здесь окажет большое влияние на итоговую прибыль. Таргетированная кампания по электронной почте