基于产品的RFM模型的k-means聚类分析
首先我们可以看看数据集的数据形态: 导入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聚类人群
- 数据预处理
- 选择一些集群
- 对预处理数据运行k-means聚类
- 分析每个集群的平均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)
下一篇:
基于javaweb图书借阅管理系统