☰
聚类分析实战指南:从K-Means到SPSS,搞懂原理、选型与业务落地
2026/10/5 12:48:21 网站建设 项目流程

聚类分析这事儿吧,我现在的态度是:越用越觉得它不像一个算法,更像一门"怎么跟数据对话"的手艺。早些年我做客户分群项目,拿到几百万行交易数据,二话不说标准化后直接丢进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值、结果解读这一套串下来,再谈扩大样本和算法优化。如果你已经被某个环节卡住了,对照着这篇文章里说的逐一排查,应该能找到问题所在。等你跑出第一个"业务方一看就点头"的簇画像,你会发现之前踩那些坑都值了。

需要专业的网站建设服务?

联系我们获取免费的网站建设咨询和方案报价,让我们帮助您实现业务目标

立即咨询