ARTICLE · INTELLIGENCE

战地情报 · 详情页

来自尧图项目组的一线实战观察与深度解析

Stata KMeans聚类结果解读:从聚类中心到用户分群实践

Stata KMeans聚类结果解读:从聚类中心到用户分群实践 跑完KMeansStata回显了几行聚类结果然后呢这是我在社群里被问得最多的问题之一。很多人用Stata做机器学习里的KMeans聚类分析数据标准化做了、聚类命令也执行了但看着结果窗口里的分组变量和聚类中心完全不知道该怎么解读更不知道怎么跟业务结合起来写结论。这篇文章就从“聚类结果怎么看”这个核心痛点出发用Stata完整走一遍KMeans应用案例把输出结果拆开讲清楚。文章既适合刚接触聚类分析的论文党也适合想在业务报告里用聚类做用户分群的分析师。1. Stata跑完KMeans输出结果先看这三块KMeans本身并不复杂算法思路就是“物以类聚”随机挑K个初始中心不断迭代让每个样本归到离它最近的中心再重新计算中心直到中心不再明显移动。难点从来不在跑算法而在跑完之后手里那一堆结果该怎么消化。Stata和SPSS最大的不同是它不会帮你把所有图表放在一个输出窗口里核心产出就三类东西分组变量、聚类中心、迭代过程信息。把这三块看懂解读就完成了一大半。1.1 聚类成员表先看每个类别分到了多少人在Stata里执行聚类后新生成的类别变量会追加到数据集中。比如用cluster kmeans命令加一个name()选项Stata就会生成一个名为c3的变量取值为1、2、3表示每个样本最终归属于哪个类别。cluster kmeans z_r z_f z_m, k(3) name(c3)跑完之后第一件事永远是看样本量分布tabulate c3这一步没做好后面解读全是白搭。原因很简单如果某个类别只有3个样本而总样本量是500那这个类别的聚类中心会非常不稳定也不具备业务推广意义反过来如果某个类别占了80%的样本那这个聚类结构很可能不合格——KMeans本身不会强制类别规模均衡但极端不均衡通常意味着K值选得不合适或者数据里存在严重的异常值。我见过有人一上来就盯着聚类中心表分析结果发现“高价值用户”只包含两个样本根本没有任何统计效力。所以我的习惯是先看频数分布确认每个类别都有足够的样本量再往下读。通常来说每个类别至少要有总样本的5%到10%低于这个比例就需要警惕了。1.2 聚类中心整份分析的信息压缩包聚类中心是KMeans结果里信息密度最高的部分。每个类别的中心本质上就是该类全部样本在各变量上的均值向量。比如分成3类、用了5个变量中心就是一个3行5列的均值表。Stata内置的cluster kmeans命令不会像某些外部命令那样直接弹出一张聚心表但可以用table命令自己算效果完全一样table c3, statistic(mean z_r z_f z_m)这样得到的就是每个类别在标准化后变量上的均值也就是真正的聚类中心位置。中心值的正负和大小直接反映了这个类别的特征方向某个变量上中心值远高于整体平均水平就说明这个类别的样本在该维度上明显偏高。读这张表时我有个原则先横向看方向再纵向看差距。先看某个类别内部哪些变量高、哪些变量低形成初步画像再和别的类别对比看每个类别之间在哪些变量上拉开了显著差距。一个合格的聚类结果类别之间的中心值应该有足够大的区分度而不是几个数字挤在一起。1.3 迭代历史与收敛状态别忘了看过程聚类结果窗口里还有一类容易被忽略的信息就是迭代过程。cluster kmeans默认会在结果区打印每一次迭代后类内误差的变化情况或者给出收敛提示。如果输出里出现类似“converged after X iterations”的说明说明算法正常终止。反过来如果你看到did not converge或者迭代次数达到上限就要小心了。这可能意味着两点一是K值设置不合理算法在类别归属上反复震荡二是初始值选得太差迭代迟迟无法稳定。解决办法很简单用iteration()选项增大最大迭代次数或者在聚类前用set seed固定随机种子换一批初始中心再跑。收敛状态看起来是过程信息但我建议把它当成结果可信度的信号。收敛的聚类结果不一定对但不收敛的聚类结果一定不能直接用。尤其是写论文的场景审稿人一旦看到聚类没有收敛第一反应就是你的结果不可复现、不可靠。2. K值怎么定肘部法则、伪F指数与业务判断聚类结果值不值得解读很大程度上在确定K值的那一刻就已经注定了。K太小类别太粗看不出差异K太大类别太碎每类都是一个极端小群体业务上完全没法落地。很多人跑KMeans用默认K3全凭感觉这是个很大的误区。K值应该是一个有依据的选择过程。2.1 肘部法则用WCSS折线图找拐点肘部法则的核心指标是WCSSWithin-Cluster Sum of Squares组内平方和它衡量的是每个样本到所属聚类中心距离的平方和。KMeans的目标是最小化WCSS但K越大WCSS天然就越小——极端情况下K等于样本数WCSS直接归零。所以不能单纯追求WCSS小而是要看“增加K带来的下降幅度”。下降幅度大的时候说明新增类别显著改善了样本的归属紧密度当下降幅度明显变缓、折线图上出现一个类似手肘的拐点时这个拐点对应的K就是比较合适的选择。Stata不像Python的sklearn那样直接给你一份WCSS清单但实际操作也不麻烦。我一般是循环跑多个K记录下每次的WCSS再用twoway画折线图。组内平方和的本质就是各变量方差之和乘以样本量也可以用每个类别内部的离差平方和累加来近似计算。论文里如果只写“根据肘部法则选择K3”原则上完全说得通但前提是真的画过这张图。2.2 伪F指数让K值选择更有说服力除了肘部法则我还强烈建议用cluster stop命令看一个辅助指标——Calinski-Harabasz伪F指数Stata里可以直接调用cluster stop z_r z_f z_m, clusters(2/6)输出结果是一个包含多个K值对应统计量的表格其中Calinski/Harabasz pseudo-F是常用参考同一个K下伪F越大说明类间离散度相对类内离散度越高聚类结构越清晰。需要提醒的是伪F指数不是越大就一定越好它经常在多个K值上出现多个峰值。我遇到过一个数据集K3时伪F是120K5时伪F是135但K5分出的类别里有两个在业务上完全没法解释。在这种场景下统计指标只能作为参考不能替代人的判断。2.3 业务合理性才是最终拍板的依据把统计方法挨个跑一遍之后真正做决定的时候还是要回到业务本身。做客户分群如果K3能直接对应“高价值活跃客户、普通客户、沉睡客户”那它就是最合适的选择如果K5只是把普通客户又拆成了两个无所谓的小群体那即便伪F更高也未必值得采用。我自己的经验是K值选择记录不要只留结果要把过程也留着。比如“通过肘部法则和伪F指数比较了K2到K6最终选取K3主要考虑到类别解释性与业务可操作性”这句话写进论文或报告里比单扔一个“K3”要有说服力得多也侧面证明了你的结论不是拍脑袋拍出来的。3. 聚类中心表的阅读方法从均值到用户画像聚类中心表是解读KMeans结果的核心素材。但很多人在这一步卡住主要是因为直接拿原始变量跑聚类得到一张既有天数又有元数还有次数的表格完全不知道从哪里下手。要读懂中心表第一前提是数据标准化做到位第二是掌握“横向看画像、纵向看区分”的读表方法。3.1 为什么必须标准化否则中心表没法读KMeans基于距离计算样本相似度而距离对量纲极其敏感。举个实际例子用户消费金额的取值范围可能是0到1万元购买频率只有0到20次如果把原始数据丢进KMeans金额变量会主导整个距离计算频率变量再重要也几乎不起作用得到的聚类结果相当于“按金额一刀切”。解决办法是聚类前对每个变量做标准化。Stata里可以直接用egen函数foreach v of varlist r f m { egen z_v std(v) }标准化后的变量均值为0标准差为1。这时候聚类中心的数值就能直接解读了中心值为1意味着该类别在这个变量上高出整体平均水平一个标准差中心值为-0.8就是比平均水平低0.8个标准差。这种解读方式比盯着原始数值看要直观得多也避免了量纲干扰。3.2 用均值对比给类别画像下面是演示用的标准化聚类中心表假设我们对用户做了三类分群使用的变量是最近消费间隔、消费频率、消费金额类别最近消费间隔(z)消费频率(z)消费金额(z)1-0.921.251.4820.38-0.31-0.2431.34-1.12-0.95这一张表就能读出三类人的完整画像。类别1最近消费间隔显著低于均值消费频率和金额显著高于均值毫无疑问是活跃且高价值的用户类别3正好反过来间隔长、频率低、金额低属于沉睡或者流失风险用户类别2各项指标都在平均值附近是典型的普通用户。读表时我有一个习惯不要只盯着正负号还要看数值差距的幅度。±0.3以内的差异说明该类在这个变量上和整体平均水平没有本质区别描述时可以忽略超过±0.8的差异才是值得写进结论的核心特征。这样可以避免在报告里堆砌那种“某类别A变量稍高、B变量略低”的无意义废话。3.3 聚类标签没有等级含义命名要基于数据这是新手最容易踩的坑把类别1当成“最好的”类别。KMeans输出的类别编号是算法随机分配的和排序、等级半毛钱关系都没有。第1类可能是高价值人群也可能是沉睡人群完全取决于初始中心落在了哪里。所以拿到聚类结果后第一件事不是看编号大小而是根据中心表重新命名。建议在数据集中生成一个新变量比如gen group replace group 高价值活跃 if c3 1 replace group 普通客户 if c3 2 replace group 沉睡客户 if c3 3这样后续所有分析都可以用带业务含义的标签变量而不是对着1、2、3猜含义。星标变量一多报告自然清晰很多。4. 完整案例RFM用户分群的结果解读全过程理论说再多不如实操一遍。下面用一个典型的RFM客户分群案例从数据预处理到最终业务结论完整走一遍KMeans结果解读的流程。数据是模拟生成的但流程和真实项目完全一致你可以直接换成自己的数据照做。4.1 数据准备从原始变量到标准化变量假设手头数据包含三个变量r表示最近一次消费距今天数f表示过去一年购买次数m表示过去一年消费总金额。目标是把客户分成三个有业务意义的群体。第一步永远是先看数据概况检查缺失和极端值summarize r f m确认数据无异常后标准化foreach v of varlist r f m { egen z_v std(v) }标准化这步别偷懒直接拿r f m跑聚类虽然也能出结果但解读时就会陷入“金额是元、频率是次、间隔是天”的量纲泥潭。4.2 执行聚类与初步结果检查执行KMeans聚类set seed 42 cluster kmeans z_r z_f z_m, k(3) name(rfm3)为什么固定种子因为cluster kmeans的初始中心是随机挑选的不固定种子每次跑出来的结果可能不一样论文和报告里最忌讳这种不可复现的情况。设置种子后结果稳定也方便别人复核。先看样本量tabulate rfm3假设得到的结果是类别1有150人、类别2有230人、类别3有120人占总样本比例分别为30%、46%、24%分布比较均衡可以继续往下解读。4.3 聚类中心的业务翻译计算聚类中心表分别看标准化和原始尺度的均值table rfm3, statistic(mean z_r z_f z_m) table rfm3, statistic(mean r f m)标准化中心表可能长这样类别最近消费间隔(z_r)购买频率(z_f)消费金额(z_m)1-0.851.311.5220.42-0.28-0.2231.21-1.18-1.05结合原始尺度表类别平均间隔(天)均购买次数(次)均消费金额(元)1818.572002327.221503782.1380解读逻辑很清晰类别1隔几天就来买一次高频且高额是核心价值客户类别2各项指标都在中间地带是普通客户类别3将近三个月才买一次频次金额双低是沉睡客户。业务上就可以将三者命名为“高价值活跃客户”“一般客户”“沉睡流失客户”。到了这一步聚类结果才算真正有了意义。Stata里跑出的三列数字经过标准化中心表的方向判断和原始尺度表的业务对照就变成了可以直接汇报的结论“通过KMeans聚类我们将客户分为高价值活跃、一般、沉睡流失三类分别占30%、46%、24%其中高价值活跃客户近3个月表现突出……”4.4 可视化补充散点图验证分群效果数字解读完还要用图表确认聚类是否真的把不同群体分开了。常见的做法是先做主成分分析把多维数据压缩到两个主成分再按聚类标签画散点图pca z_r z_f z_m predict pc1 pc2, score scatter pc2 pc1 if rfm3 1, color(red) /// || scatter pc2 pc1 if rfm3 2, color(blue) /// || scatter pc2 pc1 if rfm3 3, color(green) /// legend(order(1 高价值活跃 2 一般客户 3 沉睡客户))如果图上三个群体明显分落在不同区域说明聚类质量不错如果重叠严重就要回头检查变量选择或K值。散点图的另外一个作用是排查异常聚类——如果某类样本在图上被拉成一条细线往往暗示数据里有极端值在作祟。5. 解读结果时必须避开的五个坑5.1 不标准化直接跑结果跟着量纲跑前面反复强调过这里单独拎出来再提醒一次。量纲差异大的变量直接进KMeans相当于默认金额比频率重要几百倍。我在实际项目里见过有人把“金额单位是元”改成“金额单位是万元”后聚类结果完全变了一个样——这本身就是不标准化导致的问题。无论用什么软件聚类前标准化都是标准动作不是可选项。5.2 忘记固定种子结果今天一个样明天一个样KMeans的初始中心选择是随机的如果不加set seed同一个数据集连续跑两次聚类结果可能完全不同。有次帮人复现论文里的聚类结果对方说“用同样的数据跑出来跟论文不一样”最后发现就是种子没固定。写论文、出报告、做自动化流程一定要在聚类前固定随机种子并在文档里记录这个种子值。5.3 把类别编号当成等级或排名这是解读阶段最容易犯的错。KMeans的类别1、2、3只是标签没有任何顺序关系。类别1不等于第一、最好、最优先。所有类别特征都必须回到中心表去看。给类别起名字之前先忘掉编号只看均值。5.4 忽略异常值对聚类中心的扭曲KMeans对异常值非常敏感。一个极端高消费样本可能单独形成一个类别也可能把某个类的中心拉走一大截。聚类前检查变量的分布和极端值比聚类后补救省力得多。遇到明显的长尾变量可以考虑做对数变换或者winsorize缩尾处理再进聚类。聚类后如果发现某类只有一个样本或者极少样本也大概率是异常值问题。5.5 统计指标合理但业务解释不通最后一个坑是过度迷信统计指标。伪F指数高、肘部图清晰只能说明算法角度上这个聚类结构是成立的但不能保证业务上能解释。你分出的“高价值客户”如果运营根本没法对应到具体人群那这个聚类结果就只能停在论文里无法落到报告中。我的建议永远是两步走先用统计指标缩小K值的候选范围再用业务可解释性做最终决策。这些坑我都踩过尤其是标准化和种子这两个看着不起眼影响却是全局性的。做KMeans聚类的过程其实就是一个不断“看结果、调参数、再看结果”的循环只要每次跑完都能把这几个方面检查一遍聚类项目的成功概率会大大提高。
RELATED READING

延伸阅读

更多一线实战笔记与深度复盘,助您持续精进