K-means聚类实战:用Sklearn快速搞定客户分群,附Python代码与结果可视化

张开发
2026/4/17 20:07:24 15 分钟阅读

分享文章

K-means聚类实战:用Sklearn快速搞定客户分群,附Python代码与结果可视化
K-means聚类实战用Sklearn快速搞定客户分群附Python代码与结果可视化客户分群是商业分析中的经典问题。想象一下你手头有一份包含数千名客户消费记录的Excel表格市场总监要求你在两天内给出分群方案——这时候从零开始实现聚类算法显然不现实。作为从业五年的数据分析师我推荐直接使用Scikit-learn的K-means模块配合pandas进行数据预处理30行代码就能完成从数据清洗到可视化输出的全流程。1. 环境准备与数据加载工欲善其事必先利其器。建议使用Anaconda创建Python 3.8的虚拟环境核心依赖库包括# 基础数据处理 import pandas as pd import numpy as np # 机器学习与可视化 from sklearn.cluster import KMeans from sklearn.preprocessing import StandardScaler import matplotlib.pyplot as plt import seaborn as sns假设我们有一份客户消费数据customer_data.csv包含以下字段字段名类型说明customer_idstring客户唯一标识recencyint最近一次消费间隔天数frequencyint消费频次monetaryfloat消费金额加载数据时需特别注意字符编码和缺失值处理df pd.read_csv(customer_data.csv, encodinggb18030) print(f原始数据形状: {df.shape}) df.dropna(inplaceTrue) # 删除包含缺失值的记录提示商业场景中建议保留至少6个月的消费数据样本量不宜少于500条2. 数据预处理与特征工程原始数据直接输入K-means会导致严重问题——量纲差异会使算法被大数值特征主导。我们需要进行标准化处理# 选择数值型特征 features [recency, frequency, monetary] X df[features] # Z-score标准化 scaler StandardScaler() X_scaled scaler.fit_transform(X) # 转换为DataFrame便于后续分析 X_df pd.DataFrame(X_scaled, columnsfeatures)对于消费数据我习惯增加两个衍生特征X_df[recency_freq] X_df[recency] * X_df[frequency] # 活跃度指标 X_df[monetary_ratio] X_df[monetary] / (X_df[frequency] 1e-5) # 客单价指标3. 确定最佳聚类数量K-means需要预先指定聚类数量k这里介绍三种实用方法3.1 肘部法则Elbow Methodinertia [] for k in range(2, 11): kmeans KMeans(n_clustersk, random_state42) kmeans.fit(X_df) inertia.append(kmeans.inertia_) plt.figure(figsize(10,6)) plt.plot(range(2,11), inertia, markero) plt.xlabel(Number of clusters) plt.ylabel(Inertia) plt.title(Elbow Method For Optimal k) plt.show()3.2 轮廓系数Silhouette Scorefrom sklearn.metrics import silhouette_score silhouette_scores [] for k in range(2, 11): kmeans KMeans(n_clustersk, random_state42) preds kmeans.fit_predict(X_df) score silhouette_score(X_df, preds) silhouette_scores.append(score) plt.figure(figsize(10,6)) plt.plot(range(2,11), silhouette_scores, markero) plt.xlabel(Number of clusters) plt.ylabel(Silhouette Score) plt.title(Silhouette Analysis For Optimal k) plt.show()3.3 业务经验法则根据我的项目经验客户分群通常4-6个群组最具可操作性少于4群可能遗漏重要细分超过6群会导致营销资源分散4. 模型训练与结果分析确定k5后训练模型并解析结果# 模型训练 final_kmeans KMeans(n_clusters5, random_state42) df[cluster] final_kmeans.fit_predict(X_df) # 查看各群规模 cluster_dist df[cluster].value_counts().sort_index() print(cluster_dist) # 计算群内均值 cluster_means df.groupby(cluster)[features].mean() print(cluster_means.round(2))典型分群结果示例群组规模占比recencyfrequencymonetary业务解读022%1201.2300流失风险客户118%158.51500高频低价值客户230%453.2800潜力客户315%712.14500VIP客户415%902.12500高价值低频客户5. 可视化呈现技巧5.1 二维散点矩阵sns.pairplot(df, varsfeatures, huecluster, paletteviridis, plot_kws{alpha:0.6}) plt.suptitle(Cluster Distribution Across Feature Pairs, y1.02) plt.show()5.2 雷达图展示群特征from math import pi # 准备数据 categories features N len(categories) angles [n / float(N) * 2 * pi for n in range(N)] angles angles[:1] fig plt.figure(figsize(8,8)) ax fig.add_subplot(111, polarTrue) ax.set_theta_offset(pi/2) ax.set_theta_direction(-1) for cluster in sorted(df[cluster].unique()): values cluster_means.loc[cluster].values.flatten().tolist() values values[:1] ax.plot(angles, values, linewidth2, labelfCluster {cluster}) ax.fill(angles, values, alpha0.25) plt.xticks(angles[:-1], categories) plt.yticks(colorgrey, size7) ax.legend(locupper right, bbox_to_anchor(1.3,1.1)) plt.title(Customer Cluster Profiles, size15, y1.1) plt.show()5.3 业务报表输出# 生成分群统计报告 report df.groupby(cluster).agg({ recency: [mean, std], frequency: [mean, count], monetary: [mean, sum] }) # 保存Excel report.to_excel(cluster_analysis_report.xlsx, sheet_nameCluster Summary)6. 实战注意事项特征选择陷阱避免高度相关特征如消费次数与消费总额分类变量需先进行独热编码参数调优经验# 更稳健的模型配置 kmeans KMeans( n_clusters5, initk-means, # 更好的初始中心选择 n_init20, # 多次初始化取最优 max_iter300, random_state42 )业务落地建议给每个群组打标签如高价值沉睡客设计差异化营销策略群组0唤醒优惠流失预警群组3专属客服新品试用模型监控机制# 每月更新分群结果 def monthly_clustering(raw_data): # ...预处理流程... kmeans.fit(new_data) # ...分析流程... return updated_report在最近一次零售项目中这种分析方法帮助客户识别出占总收入38%的VIP客户群针对性营销活动使该群体复购率提升27%。关键是要记住聚类结果只是起点真正的价值在于如何基于数据洞察采取行动。

更多文章