Взятие большого набора данных о транзакциях клиентов и сегментация на основе давности, частоты и денежной стоимости.
Набросок проекта –Используя набор данных о транзакциях интернет-магазина, сегментируйте клиентов по давности (как давно они делали заказы), частоте (как часто они заказывали) и денежной стоимости ( определяется их доходом). Этот проект описывает весь рабочий процесс от очистки данных до интерпретации результатов.
Бизнес-потребность –сегментируйте клиентов, чтобы выявить наиболее ценных клиентов.
Используемый метод: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 для кредитных карт в магазине
- Используйте предложения, чтобы повысить актуальность для клиентов Серебряного уровня. В этом сегменте больше всего клиентов, увеличение частоты здесь окажет большое влияние на итоговую прибыль. Таргетированная кампания по электронной почте