当前位置:网站首页>基于购买行为数据对超市顾客进行市场细分(RFM模型)
基于购买行为数据对超市顾客进行市场细分(RFM模型)
2022-07-06 06:29:00 【啥也不会(sybh)】
目录
题目:
基于购买行为数据对超市顾客进行市场细分:现有超市顾客购买行为的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()
本次采用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()
三、结果分析
1.流失顾客:消费周期长、消费次数少、消费能力几乎为零
2.活跃顾客:消费周期短、消费次数多、消费能力强
3.VIP顾客:消费周期一般、消费次数一般、消费能力非常强
4.闲逛顾客:消费周期一般、消费次数少、消费能力一般
1.流失顾客:消费周期长、消费次数少、消费能力几乎为零
2.vip顾客:消费周期短、消费次数多、消费能力非常强
3.普通顾客:消费周期一般、消费次数一般、消费能力一般
边栏推荐
- 删除外部表源数据
- MFC dynamically creates dialog boxes and changes the size and position of controls
- 模拟卷Leetcode【普通】1143. 最长公共子序列
- Defense (greed), FBI tree (binary tree)
- [ 英语 ] 语法重塑 之 英语学习的核心框架 —— 英语兔学习笔记(1)
- 记一个基于JEECG-BOOT的比较复杂的增删改功能的实现
- Simulation volume leetcode [general] 1314 Matrix area and
- Full link voltage measurement: building three models
- SourceInsight Chinese garbled
- 英语论文翻译成中文字数变化
猜你喜欢
记一个基于JEECG-BOOT的比较复杂的增删改功能的实现
Today's summer solstice
LeetCode 739. Daily temperature
Advanced MySQL: Basics (1-4 Lectures)
国产游戏国际化离不开专业的翻译公司
(practice C language every day) reverse linked list II
Chinese English comparison: you can do this Best of luck
SourceInsight Chinese garbled
What are the commonly used English words and sentences about COVID-19?
Tms320c665x + Xilinx artix7 DSP + FPGA high speed core board
随机推荐
On the first day of clock in, click to open a surprise, and the switch statement is explained in detail
Luogu p2141 abacus mental arithmetic test
Simulation volume leetcode [general] 1219 Golden Miner
Office-DOC加载宏-上线CS
我的创作纪念日
Simulation volume leetcode [general] 1109 Flight reservation statistics
How much is the price for the seal of the certificate
leetcode 24. 两两交换链表中的节点
Tms320c665x + Xilinx artix7 DSP + FPGA high speed core board
模拟卷Leetcode【普通】1218. 最长定差子序列
How to do a good job in financial literature translation?
Is the test cycle compressed? Teach you 9 ways to deal with it
LeetCode 729. My schedule I
LeetCode每日一题(1997. First Day Where You Have Been in All the Rooms)
Postman core function analysis - parameterization and test report
ECS accessKey key disclosure and utilization
利用快捷方式-LNK-上线CS
Luogu p2089 roast chicken
记一个基于JEECG-BOOT的比较复杂的增删改功能的实现
国产游戏国际化离不开专业的翻译公司