尧图网站设计 尧图网站设计YAOTU DESIGN
ARTICLE DETAIL

资讯详情

深耕网站设计与一线实操的经验洞察。

聚类分析实战指南:从K-Means到SPSS,搞懂原理、选型与业务落地

聚类分析实战指南:从K-Means到SPSS,搞懂原理、选型与业务落地 聚类分析这事儿吧我现在的态度是越用越觉得它不像一个算法更像一门怎么跟数据对话的手艺。早些年我做客户分群项目拿到几百万行交易数据二话不说标准化后直接丢进K-Means聚类数选4跑出来一看每个群的均值差异都很显著心里还挺美。结果业务方一句话把我问住了这几个群你到底让我怎么运营我对着树状图和聚类中心憋了半天说不出个所以然。那次之后我才认真回过头来把从距离度量、算法选型、K值确定到SPSS操作、结果解读、业务翻译这一整套链路重新捋了一遍。这篇东西就是基于那几年的实践整理出来的你如果是刚接触聚类分析可以把它当入门地图如果已经跑过几个模型但总觉得哪里不对劲那第二部分之后的踩坑经验可能更能帮到你。1. 聚类不是自动分类先搞懂它解决什么问题很多人第一次接触聚类容易把它理解成不用打标签的分类这个理解方向是对的但不准确。分类是监督学习事先已经知道有哪几类、每一类是什么样子模型要学的是判别边界聚类是无监督学习事先没有任何标签甚至连应该分成几类都不确定模型要回答的是这批数据内部到底有没有结构、结构长什么样。就拿用户分群来说。分类任务是根据历史行为判断这个用户是高质量客户还是流失风险客户前提是你已经定义好了什么是高质量、什么是流失风险。聚类任务是这批用户的行为数据摆在这里你看看他们天然分成几拨每一拨有什么共同特征你不预设答案让数据自己说话。所以聚类真正的用武之地是这么几类场景探索性分析刚拿到一堆数据没有任何先验假设想看看里面有没有可解释的群体结构比如对问卷量表做人群细分降维与预处理几百个特征变量不好直接建模先聚成若干簇把簇标签当新特征用或者用簇中心的距离做相似度特征异常检测正常样本会聚成稠密的大簇离群点要么自己成一簇要么哪个簇都进不去天然暴露出来图像分割、文本主题归纳这类非结构化场景也是聚类的老本行。但要注意聚类不是万能的。如果数据本身就是连续均匀分布的没有天然簇结构硬聚类只会把一团没有边界的数据切成几块得到的簇纯粹是为了输出而输出。我见过不少人拿聚类结果当圣旨其实第一步就该先问这堆数据里到底有没有簇判断有没有簇结构简单做法是画个距离分布图或者跑完聚类后看轮廓系数能不能到0.25以上。如果轮廓系数在0附近甚至为负说明样本跟隔壁簇的距离跟自己在簇内的距离差不多这个聚类结果基本是硬凑的趁早换思路。2. 所有聚类算法都躲不开的地基距离度量与数据预处理聚类靠的核心逻辑就一句话物以类聚。但计算机不知道什么叫相似它只认识数字。怎么把相似翻译成数字就是距离度量。这一步看起来简单实际上决定了后面所有分析的天花板。2.1 连续变量的距离怎么算才合理最常用的是欧氏距离就是初中几何课学的两点间直线距离。它的特点是对每一个维度都一视同仁适合各维度都是连续数值、且量纲一致的场景比如经纬度坐标。曼哈顿距离算的是沿着坐标轴走的总路程对异常值的敏感度比欧氏距离低。因为异常值在欧氏距离里是被平方放大的而在曼哈顿距离里只是线性累加。如果你的数据里有明显噪声或者维度比较多曼哈顿距离往往更稳。余弦相似度则不看数值大小只看方向适合文本向量、用户行为模式这类场景。比如两个用户的购买金额差异很大但购买品类的偏好结构一致余弦相似度会认为他们很像欧氏距离则会把他们分开。没有哪个距离是绝对正确的关键看你想让相似代表什么业务含义。选距离度量的一个实用原则如果特征都是越多越好的强度型变量比如消费金额、访问次数欧氏距离问题不大如果特征是结构型变量比如品类占比、兴趣倾向余弦相似度更贴合直觉。2.2 混合变量和分类变量的处理现实中的数据很少全是连续数值经常是年龄、收入、消费频次后面跟着性别、地区、会员等级。这时候不能直接把性别编码成1和2丢进距离计算否则男和女之间的距离就是1而收入差1块钱也是1量纲完全不对等计算出来的距离毫无意义。解决办法有两条路。一条是用Gower距离它可以同时处理数值型、有序型和名义型变量算出样本间的综合相似度然后再喂给层次聚类或者K-Medoids。另一条是把分类变量做one-hot编码但对类别很多的变量要小心每个取值都会变成一列维度爆炸不说稀疏的one-hot向量还会稀释连续变量的贡献。我个人的建议是能用Gower距离就别硬编码。SPSS里虽然没有直接的Gower距离选项但可以用相似性矩阵配合层次聚类实现类似效果。操作上繁琐一点但比直接把分类变量当数值可靠得多。2.3 标准化这件事怎么强调都不过分这是聚类分析里最大的坑之一。K-Means用欧氏距离的时候变量的数值范围会直接决定聚类结果。设想一下收入范围是0到50000年龄范围是20到60距离计算时收入几乎垄断了全部贡献年龄再重要也会被淹没。结果就是按收入分群其他变量全成了摆设。所以跑距离类聚类算法之前标准化是必须做的前置动作。常见的做法是Z-score标准化让每个变量均值是0、标准差是1也可以用极差标准化把数值压到0到1之间。SPSS里可以通过描述统计-描述菜单把标准化后的变量另存为新变量或者直接在聚类对话框里勾选标准化选项部分版本支持。但标准化也不是万能的。如果你的业务目标就是要以某个核心指标为主来分群那就不该做全变量标准化而是缩放后给核心变量更高的权重。标准化的本质是给变量赋权全变量同等标准化等于告诉算法所有变量重要性相同这本身就是一种假设得想清楚再动手。3. 主流聚类算法逐个拆解原理、选型与适用场景聚类算法少说也有几十种但实际项目里反复用到、经过时间检验的集中在四类。我分别说说它们的原理、脾气和最合适的出场时机。3.1 K-Means快而美但有两个先天限制K-Means应该是接触面最广的聚类算法。它的逻辑很简单先随机挑K个点当簇中心然后把每个样本分给离它最近的中心分完之后重新计算每个簇的均值作为新中心再重新分配样本如此反复直到中心不再明显移动。它的优点是快特别快。几万、几十万条样本跑起来毫无压力而且只要特征尺度合理聚类效果通常不会太差。但它有个先天假设簇的形状近似球形而且簇的大小不能太悬殊。一旦数据里出现细长条或者月牙形的簇K-Means就会把真实结构拦腰截断因为它天生只会用圆形去框数据。另一个限制是它对初始中心敏感。不同的随机起点可能收敛到不同的局部最优解结果不稳定。解决方法是设多个随机种子跑多次比如SPSS里可以设置迭代次数和收敛条件也可以在外层多跑几轮选轮廓系数最好的那一次。实际经验是如果同一个数据集跑10次聚类结果分别属于好几种不同形态说明数据本身没有足够清晰的簇结构这时候K值再合理也白搭。3.2 层次聚类给你一张全景树状图层次聚类分两种方向凝聚式从每个样本单独成一簇逐步合并最近的两簇和分裂式从所有样本一簇开始逐步分裂。实践中绝大多数用的是凝聚式也叫AGNES。它最大的优势是不用预先指定K值跑完直接给你一棵树状图你可以像看家谱一样看到样本从个体到整体的聚合过程然后自己选一个合适的高度切一刀得到聚类结果。这对前期探索性分析特别友好老板问为什么分5类的时候你可以指着树状图说你看从这切下来自然就是5类。代价是计算复杂度高样本量一大就跑不动。几千条样本还能接受几万条就很吃力了。所以它在用户分群这种动辄几十万样本的场景里不太实用更适合问卷数据、区域分析、变量聚类这种中小规模数据。另外层次聚类的连接准则也值得注意。最短距离法容易产生链条效应就是一个个样本被串在一起簇的形状被拉得很长最长距离法对异常值敏感类平均法最均衡是默认首选Ward离差平方和法是另一种常见选择它倾向于生成大小相近的紧凑球形簇如果你准备用K-Means做后续验证Ward法的结果往往跟K-Means一致性更高。3.3 DBSCAN不用预设簇数还能自动挑出噪声DBSCAN的思路跟距离中心完全不一样。它从每个样本出发看它半径为ε邻域半径的范围内有没有足够多的邻居MinPts最小样本数如果有就把它当成核心点然后从核心点出发不断向外扩张把密度相连的点全部纳入同一个簇。它有三个突出的好处不用预设簇数能识别任意形状的簇解决了K-Means只能分圆球的痛点能自动标记噪声点不会为了凑簇数把离群点硬塞进某个簇。我在做异常行为检测的时候特别喜欢用这一条正常用户聚成大簇异常行为自动散落在噪声里连阈值都不用另设。难的是调参。ε和MinPts两个参数很敏感ε太小会碎成无数小簇太大又会把一堆本来不相关的点连成一片。实用做法是先画KNN距离图每个样本到第k个最近邻居的距离排序找曲线拐点位置的ε值MinPts一般取特征数的两倍左右再微调。还有一点要注意如果数据里几个簇的密度差异很大DBSCAN固定的一组ε和MinPts会顾此失彼疏的簇被当成噪声密的簇被过度合并。这种情况可以试试OPTICS算法本质上是DBSCAN的多密度版本但SPSS没内置得靠Python或者R实现。3.4 高斯混合模型软聚类的不错选择高斯混合模型假设数据由若干个高斯分布混合而成每个簇其实就是一个高斯分量样本不再属于某一个簇而是有概率地属于每一个簇。这种软分配特别适合用户群体之间存在重叠的情况比如一个用户既是母婴类目高潜客户又是家居类目摇摆客户硬切一刀就失真了。不过它在实际业务里用得比K-Means少得多主要原因是参数估计EM算法对初值敏感且特征维度高时容易产生奇异解。如果项目要求简单可解释、能快速落地我的建议是用K-Means打底做硬分群如果你确信群体间有重叠再上高斯混合模型做概率归属。下面这张表大概总结了四种主流算法的定位差异算法是否需要预设簇数簇的形状对异常值/噪声适用数据规模主要缺点K-Means是近似球形敏感大无法处理复杂形状、结果受初值影响层次聚类否不限取决于连接准则中等中小计算复杂度高DBSCAN否任意形状天然鲁棒中到大参数敏感、密度差异大时失效高斯混合是椭圆较敏感中复杂且不稳定、可解释性差4. K到底怎么定指标只是参考业务才是最终答案K值选择是聚类分析里另一个高频问题。没有哪个算法会直接告诉你应该分几类但你有很多间接证据可以帮你判断。4.1 肘部法则和轮廓系数怎么配合用肘部法则看的是簇内误差平方和SSE随K值增大的变化曲线。K越多每个簇内部越紧凑SSE必然越小但下降幅度会越来越平缓。那个下降速度从快到慢的转折点就是所谓的肘部对应的K被认为比较合理。轮廓系数是另一个常用指标它综合衡量了样本跟自家簇的紧密度和跟邻居簇的分离度取值在-1到1之间。简单来说为正且越大越好0附近说明样本在模糊地带负数说明分错了。一般能到0.5以上就算有可用的簇结构。但这两个指标不是万能的。真实数据往往不会给一个干净利落的肘部而是整条曲线平滑下降这时候肘部难找得很主观。轮廓系数的全局最大K也未必符合业务需要——分20类轮廓系数确实最高但你根本运营不过来。所以我的建议是把指标当参考不是当裁判。4.2 业务判断才是聚类的最后一公里我现在的做法是倒着来先想清楚分完类我要做什么再反推K值范围。比如运营团队说人手只够做5套差异化的运营策略那K落在4到6之间才有落地价值如果这是给推荐系统做用户兴趣细分K在20到30反而更合适因为每类越细推荐策略越精准。所以不妨这样操作用肘部法则和轮廓系数把候选K缩小到两三个比如指标说5类和8类都不错那就分别跑出来让业务方看两类方案的簇画像问他们哪一套更能对应上自己熟悉的客户类型。聚类分析做到最后说服业务的不再是数学指标而是每个簇是否一看就懂、能说清故事。5. SPSS做聚类分析全实操从菜单点击到结果落地不含糊地说SPSS的聚类功能虽然比不上R和Python灵活但它的菜单式操作对业务团队非常友好而且输出格式规范做探索性分群绰绰有余。下面是一套我已经反复跑通过的标准流程。5.1 数据准备阶段要注意的格式问题SPSS聚类分析对数据格式有几个硬性要求提前处理好能省去后面大量返工每一行是一个样本每一列是一个变量不能有文本型变量参与计算分类变量不能直接拖进K-Means要么先用哑变量转换要么改用层次聚类配合Gower距离思路处理缺失值要先处理。SPSS的K-Means对话框默认遇到缺失值会剔除整条记录如果你某列缺失率偏高等于白白扔掉大量样本。建议先做缺失值填补均值/中位数/多重插补任选再进聚类跑聚类前先做好标准化。用分析-描述统计-描述把连续变量Z-score另存为新变量或者记录原始极差之后再手动计算。我个人强烈建议把标准化和聚类分成两步做而不是依赖于聚类对话框里的隐藏选项。因为只有你自己控制标准化你才知道每个变量最终对距离的贡献是多少后面调权才有抓手。5.2 K-Means 操作步骤与参数选择SPSS里K-Means的入口是分析-分类-K-均值聚类。打开之后把标准化后的变量选入变量框把用来标识每条样本的ID变量选入个案标注依据这样聚类结果里能知道每一行属于哪个簇聚类数填你通过前面方法选出来的K值方法默认是迭代和分类即不断迭代直到收敛保持默认即可点迭代按钮最大迭代次数默认10次建议调大到50收敛性标准保持0.02也可以再严格一点到0.0001减少没收敛就强行停止的可能点选项按钮勾选每个个案的聚类信息SPSS会在数据表里新增一列记录每个样本被分到了哪一簇这一步很重要后续做簇画像全靠它然后点确定输出结果里重点看两部分一个是最终聚类中心表看每一簇在各个变量上的均值这是簇画像的核心依据另一个是ANOVA表看哪些变量在簇间差异显著差异不显著的变量基本说明它们没参与有效区分。SPSS的K-Means默认每次随机选择初始中心建议正式跑之前先做几次预实验对比几次跑出来的聚类中心是否稳定。只在一次运行里显著、换一次随机种子就全变样的结果不可信。5.3 层次聚类的操作细节层次聚类的入口是分析-分类-系统聚类。跟K-Means最大的不同是它默认输入的是原始个案数据输出会附带一张树状图。操作要点把标准化变量选入变量聚类选择个案这表示对样本聚类如果选择变量就是对指标聚类可以用来做变量降维绘制里勾选树状图这是层次聚类最有价值的一张图方法里设置聚类方法为Ward法或者组间联接类平均法距离测量选平方欧氏距离这是跟Ward法匹配的组合不要用默认配置跑完就交差如果样本量超过几百条树状图会密成一团黑看不了。建议先随机抽样几百条跑一次层次聚类定K值然后用K-Means在大样本上按这个K跑正式结果。这个层次定K、K-Means落地的组合在工程里非常实用。SPSS输出的凝聚计划表里的系数也可以用来辅助选K系数突增的位置说明这次合并把两个本来距离很远的簇强行合并在一起了所以在系数发生明显跳跃前的位置切分往往对应合理的聚类数。5.4 结果解读从统计输出到业务画像跑完聚类只是开始。真正见功力的是把聚类中心和ANOVA表翻译成人话。我通常按三步来做第一步看每个簇的变量均值跟总体均值比。比总体高20%以上的变量是这个簇的标签特征低20%以下的算短板特征写成一句句画像描述比如高消费高频次但活跃时段集中在深夜。第二步算每个簇的样本量占比。占样本总量不到5%的簇要警惕它可能只是数据里的离群小群体运营上单独打策略性价比很低。除非这个簇有明显的业务价值比如高净值客户否则建议并入邻近簇。第三步给每个簇起一个业务名字。不要叫簇1、簇2起一个业务方一眼就懂的名字比如价格敏感型新客、品牌忠诚型老客。命名这个动作看着简单实际上是把统计结果跟业务知识对表的环节名字起不出来往往说明你对这个簇的行为模式还没吃透。6. 这些坑我基本都踩过拿出来逐一拆解6.1 标准化范围搞错分群结果被单变量绑架有次做城市分级聚类变量包括GDP、人口、面积、社零总额。我发现聚类结果几乎是GDP一个变量的翻版GDP高的城市全在一簇跟其他变量没多大关系。查了半天发现数据源里GDP的单位是亿元其他指标是万元数量级差了上万倍标准化的时候我没仔细看导致GDP实际上还是主导了距离计算。从那以后我养成了两个习惯一是标准化后一定检查每个变量在新尺度上的均值和标准差确认量纲已经拉齐二是跑完聚类后做一次变量重要性复核很简单比较每个变量在簇间的F值或者效应量如果核心业务变量没有进入前三就要警惕是不是标准化或者权重设置有问题。6.2 异常值不处理K-Means会被带偏K-Means对异常值非常敏感因为簇中心是算均值一个极端大值就能把中心拉过去导致一整簇样本被错误地划走。暴力厚尾数据里这个现象特别常见。我的处理流程是先做一轮单变量异常值筛查用箱线图或Z-score找出极端值看它是数据录入错误比如年龄写成999还是真实存在的长尾客户。录入错误直接修正或删除真实长尾客户如果业务上很重要可以单独归为一类不要让它污染主聚类如果跑的是DBSCAN异常值直接就会变成噪声点不用专门处理这也是我推荐异常检测场景用DBSCAN的原因之一。6.3 聚类结果不稳定的排查方法如果你发现同样的数据和参数多跑几次聚类结果差异巨大大概率是这么几个原因数据没有清晰的簇结构K值选得跟真实结构不匹配初始中心太随机特征之间存在高相关导致距离计算冗余。排查时先做相关性分析把相关系数高于0.8的变量里挑一个保留或者先做PCA降维再聚类消除冗余特征对距离的干扰。然后固定随机种子多跑几次看聚类中心的变化幅度。如果还不稳定那就先回到数据分布本身画个二维可视化看看是否有明显的团状结构。没有团状结构的数据硬聚类结果不稳定是必然的。6.4 聚类结果怎么落地才不变成做完即死最后这点可能是最致命的。很多聚类分析项目做完了报告也写了结果业务方看完就没有然后了。后来我反思问题往往出在没有把簇标签接入业务流程。要让聚类结果真正产生价值至少要做完三件事第一把每个簇的标签回写到客户主数据表里让运营可以随时圈选某一簇人群第二针对每个簇设计一套差异化的触达策略和话术哪怕是A/B测试的对照组第三设定监控指标按月观察各簇的规模变化和核心指标迁移。没有这三步聚类分析就真的只是分析了一下。7. 结尾一点个人体会写到这里我回顾了一下这些年的实战经历最大的体会是聚类分析真正的门槛从来不在算法原理而在你是否知道自己在做什么。K-Means也好层次聚类也好SPSS菜单点起来都很容易难的是你对数据的理解、对业务问题的拆解以及面对一个统计上完美但业务上荒谬的结果时敢不敢推翻重来。我到现在还记得第一次把聚类结果拿到业务评审会上的狼狈样子。现在我会在每次聚类分析启动前先花至少半天时间和业务方聊清楚分完群你要干什么然后才打开软件。这个习惯让后面几乎所有环节都顺畅了很多。如果你正准备在自己的数据上跑一次聚类我的建议很简单先小样本跑通完整流程把标准化、K值、结果解读这一套串下来再谈扩大样本和算法优化。如果你已经被某个环节卡住了对照着这篇文章里说的逐一排查应该能找到问题所在。等你跑出第一个业务方一看就点头的簇画像你会发现之前踩那些坑都值了。
返回列表