当前位置:网站首页>基于购买行为数据对超市顾客进行市场细分(RFM模型)

基于购买行为数据对超市顾客进行市场细分(RFM模型)

2022-07-06 06:29:00 啥也不会(sybh)

 

目录

题目:

一、什么叫RFM?

二、聚类

三、结果分析


 

题目:

基于购买行为数据对超市顾客进行市场细分:现有超市顾客购买行为的RFM数据集(数据文件:RFM数据.txt),请利用各种聚类算法实现顾客群细分。完成下列问题:

1)分析顾客购买行为的RFM数据集中,R\F\M这三个变量有怎样的分布特征?(10分)

2)尝试将购买分成4类,并分析各顾客的购买行为特征。(10分)

3)评价模型,并分析聚成4类是否恰当。(30分)

一、什么叫RFM?

RFM是一种对用户质量进行聚类的模型,对应于三个指标

R(Recency):用户最近一次消费的时间间隔,衡量用户是否存在流失可能性
F(Frequency)
:用户最近一段时间内累计消费频次,衡量用户的粘性
M(Money): 用户最近一段时间内累计消费金额,衡量用户的消费能力和忠诚度

二、聚类

# 项目一:电商用户质量RFM聚类分析

from sklearn.cluster import KMeans
from sklearn import metrics
import matplotlib.pyplot as plt
from sklearn import preprocessing

# 导入并清洗数据
data = pd.read_table('RFM数据.txt',sep=" ")
# data=pd.read_table("RFM数据.txt",encoding="gbk",sep=" ")
# data.user_id = data.user_id.astype('str')
print(data.info())
print(data.describe())
X = data.values[:,1:]

# 数据标准化(z_score)
Model = preprocessing.StandardScaler()
X = Model.fit_transform(X)

# 迭代,选择合适的K
ch_score = []
ss_score = []
inertia = []
for k in range(2,10):
    clf = KMeans(n_clusters=k,max_iter=1000)
    pred = clf.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(clf.inertia_)

# 做图对比
fig = plt.figure()
ax1 = fig.add_subplot(131)
plt.plot(list(range(2,10)),ch_score,label='ch',c='y')
plt.title('CH(calinski_harabaz_score)')
plt.legend()

ax2 = fig.add_subplot(132)
plt.plot(list(range(2,10)),ss_score,label='ss',c='b')
plt.title('轮廓系数')
plt.legend()

ax3 = fig.add_subplot(133)
plt.plot(list(range(2,10)),inertia,label='inertia',c='g')
plt.title('inertia')
plt.legend()
plt.rcParams['font.sans-serif'] = ['SimHei']
plt.rcParams['font.serif'] = ['SimHei']  # 设置正常显示中文
plt.show()

08b7416225f0404e950cb994670b5053.png

 

 

201dcd0592c94901814a714d681bba5b.png

 

本次采用3个指标综合判定聚类质量,CH,轮廓系数和inertia分数,第1和第3均是越大越好,轮廓系数是越接近于1越好,综合来看,聚为4类效果比较好

 

CH指标越大,聚类效果越好

clf.inertia_是一种聚类评估指标,我常见有人用这个。说一下他的缺点:这个评价参数表示的是簇中某一点到簇中距离的和,这种方法虽然在评估参数最小时表现了聚类的精细性,但是这种情况会出现划分过于精细的状况,并且未考虑和簇外点的距离最大化,因此,我推荐使用方法二:

 使用轮廓系数法进行K值的选择,在此,我需要解释一下轮廓系数,以及为何选用轮廓系数作为内部评价的标准,轮廓系数的公式为:S=(b-a)/max(a,b),其中a是单个样本离同类簇所有样本的距离的平均数,b是单个样本到不同簇所有样本的平均。

# 根据最佳的K值,聚类得到结果
model = KMeans(n_clusters=4,max_iter=1000)
model.fit_predict(X)
labels = pd.Series(model.labels_)
centers = pd.DataFrame(model.cluster_centers_)
result1 = pd.concat([centers,labels.value_counts().sort_index(ascending=True)],axis=1) # 将聚类中心和聚类个数拼接在一起
result1.columns = list(data.columns[1:]) + ['counts']
print(result1)
result = pd.concat([data,labels],axis=1)   # 将原始数据和聚类结果拼接在一起
result.columns = list(data.columns)+['label']  # 修改列名
pd.options.display.max_columns = None  # 设定展示所有的列
print(result.groupby(['label']).agg('mean')) # 分组计算各指标的均值

 

 

# 对聚类结果做图

fig = plt.figure()
ax1= fig.add_subplot(131)
ax1.plot(list(range(1,5)),result1.R,c='y',label='R')
plt.title('R指标')
plt.legend()
ax2= fig.add_subplot(132)
ax2.plot(list(range(1,5)),result1.F,c='b',label='F')
plt.title('F指标')
plt.legend()
ax3= fig.add_subplot(133)
ax3.plot(list(range(1,5)),result1.M,c='g',label='M')
plt.title('M指标')
plt.legend()
plt.show()

三、结果分析

25b61dfc45614ce287b4b9a892a35102.png

d5f428ceb6264951ba2f6fe17ac41d83.png

1.流失顾客:消费周期长、消费次数少、消费能力几乎为零       

2.活跃顾客:消费周期短、消费次数多、消费能力强

3.VIP顾客:消费周期一般、消费次数一般、消费能力非常强

4.闲逛顾客:消费周期一般、消费次数少、消费能力一般

 

9760623461634e0d9666794a29f8ecca.png

e693ca136640419a9850b1beee1416ce.png

 

 504b6c1b66fb40dcbd1973100eac4b88.png

 

fd954c9f76ff4052ac26b29fd4bdb759.png

 

1.流失顾客:消费周期长、消费次数少、消费能力几乎为零       

2.vip顾客:消费周期短、消费次数多、消费能力非常强

3.普通顾客:消费周期一般、消费次数一般、消费能力一般

 

 

 

 

 

原网站

版权声明
本文为[啥也不会(sybh)]所创,转载请带上原文链接,感谢
https://blog.csdn.net/m0_68036862/article/details/125212617