k均值聚类(电商客户分类)

119 阅读6分钟

问题总述

随着信息技术的快速发展和电商市场线上消费人群日趋壮大,众多的企业将营销重点从产品转向客户,维持良好的客户关系逐渐成为企业发展的核心问题。商场如战场,只有充分了解客户群体,知道哪些客户是高价值客户、哪些客户是潜在客户、哪些客户是一般客户等并通过这样的客户群分,才能便于企业在有限的资源下,针对不同类别的客户制订个性化服务方案,采取不同的营销策略,实现企业利润的最大化。如何精准区分电商系统中客户目前的状态,并根据客户群分结果采取不同的措施,保持客户黏度,是具有挑战性的问题。本案例将基于该场景采用聚类分析算法将电商客户进行合理群分,并基于不同类别的客户群体特征采用不同的营销措施来保持客户黏度。

RFM模型介绍

R(recency)指客户最近一次消费时间与截止时间的消费间隔。显然,R越小,即客户对即时提供的产品或服务最有可能感兴趣,倾向于或喜欢在这里消费。

F(frequency)指客户在某段时间内的消费频率。客户的F越大,说明客户对产品或服务的满意度越高,忠诚度也越高,这样的客户对企业而言价值越大。

M(monetary)指客户在某段时间内的消费总额。M越大,说明客户的消费能力越大,这也符合“20%的重要客户贡献了80%的效益”的二八原则。对于企业来说,要尽量留住M大的客户,刺激M小的客户消费。

在RFM模型中,最近一次消费间隔R、消费频率F和消费总额M这3个要素是评价客户价值的重要指标。这3个指标都可以通过原始的客户消费记录来计算,有了这3个指标,就可以利用k均值算法对客户进行聚类,然后根据客户群分结果来调整营销策略,以达到提升客户满意度和增加企业销售额的目的。

任务一:选择最佳的客户群分数目k

总代码

'''
任务1-选择最佳的客户群分数目k
'''
from sklearn.cluster import KMeans
from sklearn import metrics
from sklearn import preprocessing
import matplotlib.pyplot as plt
import pandas as pd



kfm_datas=pd.read_csv(r'D:/Python/电商用户分类/RFM.csv')
kfm_datas1=kfm_datas.iloc[:,1:]
X=preprocessing.StandardScaler().fit_transform(kfm_datas1)
ch_score =[]
ss_score =[]
inertia =[]
for k in range(2,10):
    kmeans =KMeans(n_clusters=k,max_iter=1000)
    pred = kmeans.fit_predict(X)
    ch = metrics.calinski_harabasz_score (X,pred)
    ss =metrics.silhouette_score(X,pred)
    ch_score.append(ch)
    ss_score.append(ss)
    inertia.append(kmeans.inertia_)
plt.figure(figsize=(10,4))
plt.rcParams['font.sans-serif']=['SimHei']
ax1=plt.subplot(131)
plt.plot(list(range(2,10)),ch_score,label='ch 分数',c='y')
plt.legend()
ax2=plt.subplot(132)
plt.plot(list(range(2,10)),ss_score,label='轮廓系数 ss',c='b')
plt.legend()
ax3=plt.subplot(133)
plt.plot(list(range(2,10)),inertia,label='方差和inertia',c='g')
plt.legend()
plt.show()

任务描述:根据 RFM模型来统计客户的3个重要特征,对客户原始的消费记录进行汇总统计,计算出客户最近一次消费间隔R、近半年的消费频率F和消费总额M,这涉及数据的统计和预处理方法,在此略过,直接给出处理后的结果,保存在 RFM.csv文件中。新建文件task1.py

运行结果:

image.png

1.清洗无关数据

kfm_datas1=kfm_datas.iloc[:,1:]

2.对数据进行标准化处理

X=preprocessing.StandardScaler().fit_transform(kfm_datas1)

3.求不同k值下客户群分的聚类性能指标

ch_score =[]
ss_score =[]
inertia =[]
for k in range(2,10):
    kmeans =KMeans(n_clusters=k,max_iter=1000)
    pred = kmeans.fit_predict(X)
    ch = metrics.calinski_harabasz_score (X,pred)
    ss =metrics.silhouette_score(X,pred)
    ch_score.append(ch)
    ss_score.append(ss)
    inertia.append(kmeans.inertia_)

4.绘制3个内部聚类性能指标的变化图

plt.figure(figsize=(10,4))
plt.rcParams['font.sans-serif']=['SimHei']
ax1=plt.subplot(131)
plt.plot(list(range(2,10)),ch_score,label='ch 分数',c='y')
plt.legend()
ax2=plt.subplot(132)
plt.plot(list(range(2,10)),ss_score,label='轮廓系数 ss',c='b')
plt.legend()
ax3=plt.subplot(133)
plt.plot(list(range(2,10)),inertia,label='方差和inertia',c='g')
plt.legend()
plt.show()

任务二:计算3类客户的RFM均值

总代码

'''
任务 2-计算三类客户的 REM 均值
'''
from sklearn.cluster import KMeans
from sklearn import metrics
from sklearn import preprocessing
import matplotlib.pyplot as plt
import pandas as pd

kfm_datas=pd.read_csv(r'D:/Python/电商用户分类/RFM.csv')
kfm_datas1=kfm_datas.iloc[:1:]
stand_scaler=preprocessing.StandardScaler()
X=stand_scaler.fit_transform(kfm_datas1)
kmeans = KMeans(n_clusters=1,random_state=151,max_iter=1000)
labels = pd.Series(kmeans.fit_predict(X))
centers=stand_scaler.inverse_transform(kmeans.cluster_centers_)
centers =pd.DataFrame(centers)
result = pd.concat([centers,labels.value_counts().sort_index(ascending=True)],axis=1)
result.columns =list(kfm_datas1.columns)+['counts']
result
print(result)

任务描述:根据最佳k值3重新对客户进行聚类,根据各类的质心来了解不同客户群体在R、F、M这3个特征上的均值情况,据此结合业务实情来辨别3个具体的客户类型,如哪类是重要客户、哪类是重要发展或挽客户、哪类是一般或低价值客户等。新建文件task2.py

运行结果:

image.png 1.重新聚类

kfm_datas=pd.read_csv(r'D:/Python/电商用户分类/RFM.csv')
kfm_datas1=kfm_datas.iloc[:1:]
stand_scaler=preprocessing.StandardScaler()
X=stand_scaler.fit_transform(kfm_datas1)
kmeans = KMeans(n_clusters=1,random_state=151,max_iter=1000)
labels = pd.Series(kmeans.fit_predict(X))

2.求质心数据

centers=stand_scaler.inverse_transform(kmeans.cluster_centers_)
centers =pd.DataFrame(centers)
result = pd.concat([centers,labels.value_counts().sort_index(ascending=True)],axis=1)
result.columns =list(kfm_datas1.columns)+['counts']
result
print(result)

任务三:为三类客户提出营销建议

总代码

'''
任务3-为三类客户提出营销建议
'''
from sklearn.cluster import KMeans
from sklearn import metrics
from sklearn import preprocessing
import matplotlib.pyplot as plt
import pandas as pd
kfm_datas=pd.read_csv(r'D:/Python/电商用户分类/RFM.csv')
kfm_datas1=kfm_datas.iloc[:,1:]
stand_scaler=preprocessing.StandardScaler()
X=stand_scaler.fit_transform(kfm_datas1)
kmeans = KMeans(n_clusters=3,random_state=151,max_iter=1000)
labels =pd.Series(kmeans.fit_predict(X))
centers=stand_scaler.inverse_transform(kmeans.cluster_centers_)
centers =pd.DataFrame(centers)
result =pd.concat([centers,labels.value_counts().sort_index(ascending=True)],axis=1)
result.columns = list(kfm_datas1.columns)+['counts']
fig =plt.figure(figsize=(10,4))
plt.rcParams['font.sans-serif']=['SimHei']
ax1= plt.subplot(131)
plt.plot(list(range(1,4)),result.R_days,c='y',label='R指标')
plt.legend()
ax2= plt.subplot(132)
plt.plot(list(range(1,4)),result.F_times,c='b',label='指标')
plt.legend()
ax3= plt.subplot(133)
plt.plot(list(range(1,4)),result.M_money,c='g',label='M指标')
plt.legend()
plt.show()

任务描述:对各个客户群体进行特征分析,对各个客户群体进行价值排名,针对不同类型的客户群体提供不同的产品或服务,以达到提升客户消费水平的目的。新建文件task3.

运行结果:

image.png

1.绘制客户群体的R、F、M指标折线图

kfm_datas=pd.read_csv(r'D:/Python/电商用户分类/RFM.csv')
kfm_datas1=kfm_datas.iloc[:,1:]
stand_scaler=preprocessing.StandardScaler()
X=stand_scaler.fit_transform(kfm_datas1)
kmeans = KMeans(n_clusters=3,random_state=151,max_iter=1000)
labels =pd.Series(kmeans.fit_predict(X))
centers=stand_scaler.inverse_transform(kmeans.cluster_centers_)
centers =pd.DataFrame(centers)
result =pd.concat([centers,labels.value_counts().sort_index(ascending=True)],axis=1)
result.columns = list(kfm_datas1.columns)+['counts']
fig =plt.figure(figsize=(10,4))
plt.rcParams['font.sans-serif']=['SimHei']
ax1= plt.subplot(131)
plt.plot(list(range(1,4)),result.R_days,c='y',label='R指标')
plt.legend()
ax2= plt.subplot(132)
plt.plot(list(range(1,4)),result.F_times,c='b',label='指标')
plt.legend()
ax3= plt.subplot(133)
plt.plot(list(range(1,4)),result.M_money,c='g',label='M指标')
plt.legend()
plt.show()

2.提供营销建议

image.png