KMeans聚类实战:用Python给客户分群(RFM模型),附完整数据集和代码

发布时间:2026/6/2 3:42:19

KMeans聚类实战:用Python给客户分群(RFM模型),附完整数据集和代码 KMeans聚类实战用Python给客户分群RFM模型在电商和零售行业理解客户价值是精细化运营的关键。传统的客户分类往往依赖人工经验或简单规则难以捕捉复杂的客户行为模式。本文将带你用Python实现一个完整的客户分群项目结合经典的RFM模型和KMeans聚类算法从原始交易数据中挖掘出有商业价值的客户群体。1. 理解RFM模型与KMeans的协同价值RFM模型是客户价值分析中最经典的框架之一它通过三个核心维度评估客户价值Recency最近一次消费客户最近一次购买距今的时间Frequency消费频率客户在特定周期内的购买次数Monetary消费金额客户在特定周期内的总消费金额这三个维度天然适合作为聚类算法的输入特征。KMeans算法能够自动发现具有相似RFM特征的客户群体相比人工设定阈值划分客户群体这种方法更加客观且能发现潜在模式。提示在实际业务中RFM指标的统计周期需要根据业务特点确定。对于快消品可能是3个月对于耐用品可能是1年。2. 数据准备与RFM指标计算我们从模拟的电商交易数据开始假设数据包含以下字段customer_id客户唯一标识order_date订单日期order_amount订单金额首先计算每个客户的RFM指标import pandas as pd from datetime import datetime # 假设df是原始交易数据 current_date datetime.now() # 计算RFM指标 rfm df.groupby(customer_id).agg({ order_date: lambda x: (current_date - x.max()).days, # Recency customer_id: count, # Frequency order_amount: sum # Monetary }).rename(columns{ order_date: recency, customer_id: frequency, order_amount: monetary })RFM指标通常需要标准化处理因为它们的量纲和尺度不同from sklearn.preprocessing import StandardScaler scaler StandardScaler() rfm_scaled scaler.fit_transform(rfm) rfm_scaled pd.DataFrame(rfm_scaled, indexrfm.index, columnsrfm.columns)3. 确定最佳聚类数量KMeans需要预先指定聚类数量K我们可以使用肘部法则和轮廓系数两种方法确定最佳K值。3.1 肘部法则实现from sklearn.cluster import KMeans import matplotlib.pyplot as plt inertia [] for k in range(1, 11): kmeans KMeans(n_clustersk, random_state42) kmeans.fit(rfm_scaled) inertia.append(kmeans.inertia_) plt.plot(range(1, 11), inertia, markero) plt.xlabel(Number of clusters) plt.ylabel(Inertia) plt.title(Elbow Method) plt.show()3.2 轮廓系数分析from sklearn.metrics import silhouette_score silhouette_scores [] for k in range(2, 11): kmeans KMeans(n_clustersk, random_state42) cluster_labels kmeans.fit_predict(rfm_scaled) silhouette_avg silhouette_score(rfm_scaled, cluster_labels) silhouette_scores.append(silhouette_avg) plt.plot(range(2, 11), silhouette_scores, markero) plt.xlabel(Number of clusters) plt.ylabel(Silhouette Score) plt.title(Silhouette Analysis) plt.show()根据这两种方法的输出我们通常选择肘部曲线拐点附近且轮廓系数较高的K值。4. 训练KMeans模型与结果分析假设我们确定K5训练最终的聚类模型kmeans KMeans(n_clusters5, random_state42) clusters kmeans.fit_predict(rfm_scaled) rfm[cluster] clusters接下来分析每个簇的特征为它们赋予业务含义cluster_summary rfm.groupby(cluster).agg({ recency: mean, frequency: mean, monetary: [mean, count] }) print(cluster_summary)典型的客户分群可能包括聚类标签Recency特征Frequency特征Monetary特征业务含义0高低低新客户或即将流失客户1低高高高价值忠实客户2中中中潜力客户3高高高近期流失的高价值客户4低低低低频低价客户5. 可视化与业务应用5.1 3D散点图可视化import plotly.express as px fig px.scatter_3d(rfm, xrecency, yfrequency, zmonetary, colorcluster, opacity0.7) fig.update_layout(margindict(l0, r0, b0, t0)) fig.show()5.2 制定营销策略建议基于聚类结果可以为不同群体设计针对性的营销策略高价值忠实客户簇1提供VIP服务和专属优惠推荐高价值商品或捆绑销售邀请参与新品测试或调研近期流失的高价值客户簇3发送挽回优惠券进行流失原因调查提供个性化回归奖励潜力客户簇2增加交叉销售机会提供中等力度促销加强品牌内容推送6. 模型优化与进阶技巧基础的KMeans实现有几个可以改进的方向6.1 特征工程优化对RFM指标进行对数变换处理偏态分布添加衍生特征如购买周期稳定性考虑时间衰减加权计算RFM6.2 算法选择比较算法优点缺点适用场景KMeans简单高效需要指定K对异常值敏感均匀分布的球形簇DBSCAN自动确定簇数参数敏感高维效果差不规则形状的簇高斯混合模型软聚类概率输出计算复杂度高不同大小和密度的簇6.3 评估指标扩展除了轮廓系数还可以考虑Calinski-Harabasz指数Davies-Bouldin指数聚类稳定性评估在实际项目中我通常会先用KMeans快速得到基线结果再根据业务需求尝试更复杂的算法。对于客户分群这种业务解释性强的场景简单模型往往更容易被业务方理解和接受。

相关新闻