基于产品的RFM模型的k-means聚类分析

12 篇文章 1 订阅
7 篇文章 0 订阅

首先我们可以看看数据集的数据形态:
在这里插入图片描述
导入rfm数据,查看数据的统计学参数

df =pd.read_csv('rfm.csv')
df.describe()

在这里插入图片描述
在实施Kmeans聚类之前,我们必须检查这些关键k-means假设
-变量对称分布(不倾斜)
-具有相同平均值的变量
-方差相同的变量

从这个表中,我们发现了这个问题:均值和方差不相等
解决:使用scikit-learn库中的标量来缩放变量

#绘制RFM值的分布
f,ax = plt.subplots(figsize=(10, 12))
plt.subplot(3, 1, 1); sns.distplot(rfm.Recency, label = 'Recency')
plt.subplot(3, 1, 2); sns.distplot(rfm.Frequency, label = 'Frequency')
plt.subplot(3, 1, 3); sns.distplot(rfm.MonetaryValue, label = 'Monetary Value')
plt.style.use('fivethirtyeight')
plt.tight_layout()
plt.show()

在这里插入图片描述
在这里插入图片描述

还有另一个问题:变量的不对称分布(数据倾斜)
解决方案:对数转换(仅为正值)将管理倾斜程度

我们使用这些结构化预处理步骤的顺序
1。取消数据倾斜-log转换的倾斜
2。标准化到相同的平均值
3。比例化到相同的标准偏差
4。存储为单独的数组用于分簇

#解决数据倾斜,log transfrom
rfm_log = rfm.apply(np.log, axis = 1).round(3)

# 查看分布
f,ax = plt.subplots(figsize=(10, 12))
plt.subplot(3, 1, 1); sns.distplot(rfm_log.Recency, label = 'Recency')
plt.subplot(3, 1, 2); sns.distplot(rfm_log.Frequency, label = 'Frequency')
plt.subplot(3, 1, 3); sns.distplot(rfm_log.MonetaryValue, label = 'Monetary Value')
plt.style.use('fivethirtyeight')
plt.tight_layout()
plt.show()

在这里插入图片描述

在这里插入图片描述
接下来运用kmeans聚类人群

  1. 数据预处理
  2. 选择一些集群
  3. 对预处理数据运行k-means聚类
  4. 分析每个集群的平均RFM值

数据预处理

#标准化变量
from sklearn.preprocessing import StandardScaler
scaler = StandardScaler()
scaler.fit(rfm_log)
#存储导独立的数组里
rfm_normalized= scaler.transform(rfm_log)

选择合适的簇值

肘部判定方法
绘制群集数量与群集内的平方和误差(SSE) -从每个数据点到其群集中心的平方距离的和
在情节中找出一个“肘部”
肘部——代表“最佳”簇数的点

from sklearn.cluster import KMeans

#获取最佳的kmeans
ks = range(1,8)
inertias=[]
for k in ks :
    # Create a KMeans clusters
    kc = KMeans(n_clusters=k,random_state=1)
    kc.fit(rfm_normalized)
    inertias.append(kc.inertia_)

# Plot ks vs inertias
f, ax = plt.subplots(figsize=(15, 8))
plt.plot(ks, inertias, '-o')
plt.xlabel('Number of clusters, k')
plt.ylabel('Inertia')
plt.xticks(ks)
plt.style.use('ggplot')
plt.title('find the best clustering ?')
plt.show()

在这里插入图片描述
如图,我们在图中选择一个“肘”,在这里选择斜率开始缓慢下降的点,故选择3作为kmeans的簇

# 创建kmeans类
kc = KMeans(n_clusters= 3, random_state=1)
kc.fit(rfm_normalized)

#创建一个聚类后的标签列
cluster_labels = kc.labels_

#增加新列
rfm_k3 = rfm.assign(K_Cluster = cluster_labels)

#计算每个簇下的R F M值的平均值
rfm_rfm_k3.groupby('K_Cluster').agg({'Recency': 'mean','Frequency': 'mean','MonetaryValue': ['mean', 'count'],}).round(0)

在这里插入图片描述

  • 3
    点赞
  • 18
    收藏
    觉得还不错? 一键收藏
  • 2
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值