
我接手过不少数据分析需求其中相当一部分最后都落到了“聚类分析”这四个字上。但跟业务方聊的时候经常发现大家默认的“聚类”其实不是一回事有人想给客户分群有人想给商品归类还有人拿着一张满是变量的表不知道该先删谁。这些场景表面都在说聚类底层思路却分成两条完全不同的路——Q型聚类和R型聚类。这篇文章我从头把这两类聚类的逻辑、操作、坑和实际业务应用串一遍顺带把SPSS实操、K-means与DBSCAN的选型、以及自然断点法和聚类分析的区别一起讲透。无论你是刚接触数据分析的新手还是已经在跑模型但没系统梳理过原理的从业者这篇都能给到可直接落地的参考。1. Q型聚类与R型聚类先搞清楚聚类对象到底是谁很多教程上来就给公式却不说清楚最核心的问题这次聚类到底是“对谁”聚。这个“对谁”决定了你走Q型还是R型。1.1 一张数据表的两种聚类方向拿一张最普通的电商用户数据表举例每一行是一个用户每一列是用户的属性比如消费金额、购买频次、最近一次购买时间、客单价。这张表本质上是一个二维矩阵行和列代表完全不同的含义。Q型聚类是对样本行聚类目标是把相似的用户归到同一类最后得到的是“几群用户”。业务里常说的“用户分群”“客户画像”“市场细分”本质上都是Q型聚类。它回答的问题是“哪些用户是一类人”。R型聚类是对变量列聚类目标是把相关性高的变量归到一起最后得到的是“几组变量”。它回答的问题是“哪些指标反映的是同一件事”。比如消费金额和客单价可能高度相关最近购买时间和购买频次可能反映不同的行为特征R型聚类就能帮我们把一堆指标浓缩成几个有代表性的维度。这两种聚类处理的是同一张表但因为聚类对象不同数据矩阵在运算前需要转置。忘了这一步是新手最常见的错误拿R型聚类的思路去跑Q型的数据出来的结果完全没法看。1.2 相似性度量距离和相似系数是两套语言Q型聚类针对样本样本间的“相似程度”用距离来衡量。距离越小越相似常见的有欧氏距离、曼哈顿距离、切比雪夫距离。最常用的欧氏距离公式很直观就是多维空间里的直线距离。注意一点欧氏距离对量纲极其敏感。举个例子“消费金额”取值范围是0到几万元“购买频次”取值范围是1到几十次如果没有做标准化消费金额会完全主导距离计算购买频次形同虚设。所以Q型聚类前标准化是必做项而且建议用Z-score标准化让每个变量均值是0、标准差是1。R型聚类针对变量变量间的“相似程度”用相似系数来衡量最常见的是皮尔逊相关系数。相关系数取值在-1到1之间越接近1表示越正相关越接近-1表示越负相关。做R型聚类时通常用1减去相关系数的绝对值或者直接基于相关系数矩阵做变换把“相关性高”转化为“距离近”这样才能套用聚类算法。可以这样理解Q型聚类看的是“人跟人像不像”R型聚类看的是“指标跟指标像不像”。度量的语言不一样后面选算法、解读结果的方式也不一样。1.3 业务直觉帮你判断该做哪种不用记复杂定义你只要问自己一句话这次分析结束后我要交付的对象是什么如果交付物是“我们把用户分成了高价值、中价值、低价值三个群体每个群体的特征是……”那就是Q型聚类。如果交付物是“我们梳理了20个指标发现其实可以浓缩成4个核心维度分别是……”那就是R型聚类。还有一种情况是R型和Q型连起来用先用R型聚类剔除高相关冗余变量再用Q型聚类做用户分群。这样既降了维又保住了聚类的可解释性。把这一步想清楚后续所有操作才不会跑偏。2. 距离计算与数据预处理这步偷懒聚类结果必然翻车做了这么多年的聚类分析我越来越确定一件事聚类算法本身很少是瓶颈真正决定结果质量的是数据预处理。很多初学者把精力放在调参上却忽略了一个事实——你喂给算法的数据长什么样结果就长什么样。2.1 量纲处理不要让“金额”主导一切前面提到欧氏距离对量纲敏感这里展开说说具体操作。我在做一个零售客户分群项目时数据里有“年消费金额”和“年购买次数”两个字段。年消费金额均值在8000元左右年购买次数均值在15次左右。如果不做标准化两个样本在“金额”维度差1000元对距离的影响要“次数”维度差60多次才能抵消。这显然不符合业务逻辑消费次数差5次可能就代表完全不同的消费习惯而金额差几百元可能只是因为买了件大衣。我常用的标准化方法是Z-scorez (x - μ) / σ其中μ是均值σ是标准差。标准化之后每个变量都变成均值为0、标准差为1的分布这时候再算欧氏距离每个变量对距离的贡献才是等权的。还有一个细节容易被忽略如果某些变量的分布严重右偏比如消费金额通常是长尾分布少数大客户会把均值拉得很高。这种情况下建议先做对数变换再标准化效果会好很多。2.2 相关系数矩阵与多重共线性筛查R型聚类中第一步通常是计算相关系数矩阵。这不只是为后续聚类做准备本身就是一个很好的变量筛查工具。我有一次处理一份经营分析数据里面有“销售额”“毛利额”“订单量”“客单价”“连带率”等20多个指标。先算相关系数矩阵发现“销售额”和“毛利额”相关系数高达0.97“订单量”和“连带率”也接近0.9。这些高相关变量背后其实是同一个业务事实的不同口径表达如果全部进入后续分析会让模型重复强化某些信息维度。R型聚类这时候特别管用它会自动把高相关的变量归到一组我们只需从每组里挑一个代表性变量留下来其余删除或者合成一个综合指标。这比肉眼逐个看相关系数矩阵要高效得多因为变量一多矩阵根本看不过来。2.3 异常值处理聚类的隐形杀手另外一个很关键的问题就是异常值。异常值对聚类的影响比对回归分析还大因为聚类是基于距离的一个极端值可能自己成为一个单独类别还可能导致附近几个样本被错误地拉走。比如电商数据里有个企业采购用户单次消费金额是普通用户的100倍如果不做处理这个点可能自成一类还会影响周围几个中等消费用户的归类。处理异常值有几种方式直接删除如果确认是录入错误、做截尾处理Winsorize比如把超过99%分位数的值替换为99%分位数的值、或者用对异常值不敏感的聚类算法比如DBSCAN后面会详细说。具体用哪种取决于异常值是否代表真实的业务情况如果真实存在的特殊群体恰好是你要找的那就不要轻易删除。3. 层次聚类、K-means与DBSCAN三种算法的边界要搞清楚聚类算法远不止一种但实际项目中90%以上跑不出这老三样层次聚类、K-means和DBSCAN。它们各自解决不同类型的问题选错算法不会报错但结果会很难解释。热点里特别提到的“基于K-means与DBSCAN的电商用户消费行为聚类分析”我用自己的项目经验来说说这三种算法分别适合什么场景。3.1 层次聚类Q型聚类的经典选择层次聚类的基本逻辑是先把每个样本各自当成一个类然后不断合并距离最近的两个类直到最后合并成一个大类或者反过来先是一个大类不断分裂。这个过程自然生成一棵“树状图”Dendrogram你可以从任何高度“切一刀”得到不同数量的分类结果。这个特性非常实用因为它不需要预先指定聚类数量。做Q型聚类时如果业务方不确定要分几群层次聚类可以先跑一遍看一眼树状图再结合业务语义决定切几类。但层次聚类有个明显的局限计算复杂度高。传统层次聚类的时间复杂度是O(n²)到O(n³)样本量一旦超过一两万跑起来就非常慢。我用几万条样本做过一次跑了一个多小时。所以它更适合中小样本量比如几千用户规模的客户分群。3.2 K-means做用户分群时的高性价比选手K-means是实际项目里用得最多的算法。思路很简单预先设定K个聚类的中心迭代地把每个样本归到最近的中心然后更新中心位置直到收敛。它最大的优点是快适合大数据量场景。电商用户分群动辄几十万、上百万样本层次聚类根本跑不动K-means几轮迭代就能出结果。代价是它有两个硬性要求需要特别注意需要预先指定K值。这个通常靠“肘部法则”确定具体做法是画出不同K值对应的簇内误差平方和SSE找一个“拐点”这个拐点对应的K就是比较合理的类数。对初始中心敏感容易陷入局部最优。解决方法是多跑几次不同的随机种子取效果最好的结果或者用K-means算法做初始中心选择。3.3 DBSCAN发现不规则形状和异常点的利器疫情后我做过一个线上教育平台的用户行为分析用户活跃时间分布极其不规则有的用户只在深夜活跃有的用户工作日和周末行为差异极大。用K-means强行分结果很拧巴。后来换了DBSCAN效果好了很多。DBSCAN是密度聚类算法它的核心思想是“物以类聚”如果一个点周围足够密集那这些点就是一个类处于稀疏区域的点则被标记为噪声点。这带来两个独特优势不需要预先指定类别数量参数只需要两个邻域半径eps和最少样本数minPts比较容易从业务含义出发来设定。能识别出不属于任何类别的异常点对于寻找异常用户很有价值。但DBSCAN效果高度依赖eps的设定需要对数据分布有感觉。3.4 电商用户行为场景的算法选择对比表算法样本量要求是否需要预设K值对异常值敏感度聚类形状结果可解释性电商场景适用性层次聚类中小样本1万不需要敏感任意强有树状图细分用户画像、市场调研K-means大样本1万需要敏感主要球形中大规模用户分群、RFM分析DBSCAN中到大样本不需要不敏感任意中噪声点需解释异常检测、不规则行为分群选算法的时候不要盲目追新先把业务需求想清楚要分几类不知道选层次聚类数据量大、业务上大概知道分几类选K-means数据里有明显异常点、形状不规则的选DBSCAN。4. SPSS做聚类分析的完整操作流程工具层面SPSS依然是很多业务分析师的主力选择。它不需要写代码菜单点选就能完成大部分聚类分析工作。但正因为操作门槛低很多人反而忽略了参数设置的含义。这节把SPSS做Q型聚类和R型聚类的完整流程以及每一步背后的逻辑讲清楚。4.1 SPSS做Q型聚类层次聚类法SPSS里做Q型聚类最常用的是“分析—分类—系统聚类”菜单。这个功能默认执行的是层次聚类法适合样本量在几千以内的场景。操作步骤数据准备每一行是一个样本每一列是一个变量变量建议都已做标准化处理。点击“分析—分类—系统聚类”把样本标识变量选入“标注个案”框把聚类变量选入“变量”框。在“绘制”选项卡中勾选“树状图”。在“方法”选项卡中聚类方法选择“组间联接”距离测量方式选择“平方欧氏距离”。在“保存”选项卡中选择“单一方案”类别数可以先填3-5之间的一个值后续根据树状图调整。这里解释几个关键选择的理由为什么聚类方法选“组间联接”这是最常用的类间距离定义方式它计算的是两个类中所有样本两两之间距离的平均值。这种方法的优点是对异常值不敏感聚类结果相对均衡不会产生特别偏斜的类。为什么距离选“平方欧氏距离”SPSS的系统聚类中“组间联接”方法和“平方欧氏距离”是搭配最稳定的组合尤其在已经做标准化的情况下平方欧氏距离等价于在欧氏距离意义上比较接近度而且计算上更高效。树状图怎么看跑完后会生成一张树状图从右往左看所有的样本先各自独立然后逐渐合并成越来越大的类。你可以在合适的距离位置“切一刀”得到想要的类数。我在实际操作中一般会这样判断切几类先看树状图的层次结构如果某一段高度差特别大说明在这个位置合并会大幅损失类内一致性那么“切”在这里就是合理的分类方案。然后再结合业务含义跑出不同类别数下的聚类结果看哪一版的特征差异最容易被业务解释。4.2 SPSS做K-means聚类如果样本量大层次聚类跑不动就用“分析—分类—K均值聚类”。操作步骤数据标准化。点击“分析—分类—K均值聚类”把聚类变量选入变量框。在“聚类数”里填入K值比如先填4。在“迭代”里设置最大迭代次数默认10次一般够用保险起见改成25次。在“选项”里勾选“ANOVA表”这样会输出每个变量在不同类别间的方差分析结果用来检验变量对聚类的区分度。在“保存”里勾选“聚类成员”原始数据表会多出一列标明每个样本被分到哪一类。K值怎么定我常用的流程是先用层次聚类跑一个小样本子集看树状图确定合适的类数范围或者跑3、4、5、6类几次K-means比较哪个K值下各类的特征差异最有业务意义。单纯依赖肘部法则拿到的K值往往需要业务验证才能真正落地。K-means结果最容易出现的坑是某些类别样本量极小比如只有几十个人业务上不可用。这时候可以适当减少K值或者在聚类前用DBSCAN把离群点先识别出来并剔除再做K-means分群效果通常会更好。4.3 SPSS做R型聚类R型聚类在SPSS里的操作路径和Q型不太一样原因是R型聚类需要对变量执行聚类逻辑而SPSS的系统聚类在默认设置下是针对样本个案的。最简单的方式是转置数据矩阵把原始数据的行和列互换让变量变成“行”、样本变成“列”然后再跑一次系统聚类。SPSS里操作是“数据—转置”注意转置前把所有变量统一成数值型并且输出结果中原来的变量名会成为“个案标注”。转置之后的分析逻辑和4.1节步骤一致只是聚类对象从样本变成了变量。得到树状图后你看到的不是“哪些用户聚在一起”而是“哪些指标聚在一起”。还有一个更省事的方法是用“分析—相关—相关分析”先跑出变量间的相关系数矩阵然后用层次聚类方式对相关系数矩阵做分析。部分SPSS版本里可以通过语法方式直接调用PROXIMITIES过程生成变量间相似性矩阵再用CLUSTER过程聚类。如果你习惯用菜单操作转置法是最直观的。4.4 SPSS做聚类分析时容易踩的隐形坑这类工具用了很久有些坑是固定会出现的值得提前留意。第一个坑是变量类型不统一。SPSS聚类分析不会检查数据类型直接按数值计算。如果你的数据里有“性别”这种分类变量虽然编码成了1和2但直接参与欧氏距离计算产生的距离是不合理的。正确做法是把分类变量做哑变量处理再参与聚类或者对数据做加权处理让分类变量的权重被适当降低。第二个坑是未标准化的数据在SPSS里照样能跑但结果不可解释。SPSS菜单不会主动提醒你做标准化需要你自己在“描述统计”里做Z-score标准化。第三个坑是样本量太小时结果不稳定。如果只有50个样本无论Q型还是R型聚类结果都缺乏统计意义很难推广到整体。5. 自然断点法和聚类分析的区别概念混淆重灾区网络热词里专门提到了“自然断点法和聚类分析的区别”这确实是很多人搞混淆的一组概念特别是做地理数据分析、行业分档、等级划分场景时经常混用。严格来说这俩不是同一层次的概念解决的任务也不完全一样。5.1 自然断点法到底在做什么自然断点法Natural Breaks最早是地理学家Jenks提出的一种数据分类方法核心逻辑是找到一种数据分段方式让每个类内部的差异尽量小类与类之间的差异尽量大。它的本质是把一个单变量的一维数值分布切分成几个区间。比如对一个城市的房价数据用自然断点法把它切成5个等级每个等级内部的房价差异最小等级之间的房价差异最大。这种方法在GIS制图、专题图分类中非常常见。自然断点法的计算原理本质上是在做一维数据的方差优化。它对连续型数值变量有效但严格限制在单个变量维度。5.2 和聚类分析的关键差异聚类分析主要指Q型聚类处理的对象是多维数据它同时考虑样本在所有变量上的表现最终把样本分成多个组而自然断点法只处理单变量输出的是一维的分段区间。用生活场景类比一下自然断点法像把一条绳子按颜色深浅分段聚类像把一堆人按身高、体重、年龄、收入四个维度分成几类。前者只有一个决策标准后者要同时权衡多个标准。具体差异可以从几个维度来看维度自然断点法聚类分析输入变量数单个连续变量多个变量可连续或分类输出形式变量的分段区间样本的分组或变量的分组优化目标类内方差最小、类间方差最大类内距离最小、类间距离最大典型应用地图分级展示、指标分档用户分群、市场细分、变量降维工具实现Excel、ArcGIS、SPSS的分类汇总SPSS、Python sklearn、R5.3 两种方法实际怎么选如果你只是想给一个连续指标做分档展示比如把城市GDP分成高、中、低三档画地图用自然断点法更方便SPSS里通过“转换—可视化分箱”也能实现类似功能如果你的分群需要同时考虑多个指标比如既要看用户消费金额又要看购买频次和活跃度那就必须使用聚类分析。值得留意的是聚类分析中如果K-means对一个单变量做聚类得到的结果在思路上和自然断点法有相似之处因为都追求组内差异小、组间差异大。但自然断点法通常不需要指定类别数而是算法自动根据数据的跳跃点来划分区间这是两者的一个重要区别。此外自然断点法通常只针对单一维度、面向展示目的运算效率远高于多维聚类。6. 实战复盘电商用户消费行为的完整聚类分析过程最后用一个实际项目完整串一遍前面所有理论。这是一个某电商平台的用户消费行为聚类案例数据规模在两万用户左右需要解决的核心问题是如何对用户分群以便运营团队针对性设计促销策略。这个案例网上很多教材提过我把在实际执行中真正有效、且容易踩坑的细节补全。6.1 特征构建先想清楚用什么指标描述用户原始数据里字段很多订单表、浏览日志、用户注册信息都有。第一步不是急着算距离而是基于业务定义构建特征。我最后敲定的聚类特征是最近一次购买距今天数RecencyR值年购买次数FrequencyF值年平均客单价MonetaryM值这就是经典的RFM模型三个核心维度。为什么不直接用原始订单明细因为订单是行为流水不能直接作为聚类样本需要汇总到用户粒度。要注意的是传统RFM里“消费金额”我换成了“平均客单价”。原因是两个用户年消费金额相同可能是高频低客单也可能是低频高客单这两类用户运营策略完全不同。用客单价能把“质量”这个维度剥离出来。6.2 预处理和聚类执行两万样本量不大不小综合考虑后我选择了先标准化、再用K-means聚类的方案。层次聚类在这个样本量下跑起来太慢DBSCAN又要处理参数调优K-means在业务解释性上更直接。数据预处理有几个关键操作最近购买距今天数做了对数变换因为大部分用户在一周内活跃少数用户很久没来分布严重偏斜。年购买次数和平均客单价做了Z-score标准化。用箱线图检查了极端值把年购买次数超过99%分位数的用户做了截尾处理。聚类数怎么定我跑了K3到K6的几轮聚类对比每轮的组间差异和业务可解释性。最终选了4类原因是这4类用户的特征差异非常清晰业务故事讲得通而分5类时有两类重叠度过高难以差异化运营。6.3 四类用户的结果解读K-means跑出来后把4个类别的特征均值汇总成一张表用户群近期购买R值越小越新购买频率F值客单价M值群体规模占比A类7天28次/年180元18%B类15天12次/年420元22%C类40天5次/年280元35%D类90天以上2次/年600元25%解读很清楚A类是高频低客单用户典型的价格敏感型适合用满减券、打折促销来刺激复购。B类是黏性较高、客单价也中等的用户属于核心用户适合做会员体系、专属客服。C类是活跃度一般的普通用户占比最大适合用推送点亮“沉睡”用户、内容种草来提频次。D类是低频高客单用户可能是按需购买型比如买家电、数码产品适合在大促节点做定向推送日常沟通反而会打扰。这里有个细节值得分享看聚类中心时不要只看绝对数值要看相对差异。比如A类“7天”的R值表示这批用户最近很活跃B类“15天”虽然也活跃但两者在F值和M值上的差异才是分群的关键。6.4 这次实践里的坑和应对这个项目里遇到几个典型问题各写下来供参考。第一个坑是标准化后结果的含义变了。聚类的中心值都是标准化后的数值需要转换回原始尺度才好向业务方解读。我的做法是先用聚类结果给每个用户打上类标签然后用原始数据按类分组计算均值和分布再汇报给业务方。不要拿着标准化数值直接讲业务对方听不懂你也讲不顺。第二个坑是K-means每次跑结果可能不一样。因为初始中心是随机的两次跑出来的分群结果可能略有差异尤其在类别边界处的样本最容易被分到不同的类。应对方法是固定随机种子或者在多轮运行后保留业务解释性最好的那版。第三个坑是聚类结果需要业务验证不能只看统计指标。我一开始K5时轮廓系数是最高的但业务方看完五类特征之后觉得有两类没什么差异实际落地时无法制定差异化策略最后还是砍成了4类。聚类最终是给业务用的统计指标只是参考。6.5 从“用户分群”到“运营策略”的最后一公里聚类完成之后不是输出一个标签就结束了。真正有价值的是让每一类用户都能对应到可执行的运营动作。我把4类用户标签写回了CRM系统运营侧配合做了三件事给A类用户配置每周五的优惠券推送给B类用户开通了会员成长体系给D类用户设置了大促节点定向短信。一个月后复盘数据A类用户的下单转化率提高了2.1个百分点B类用户的月复购率提升了3个百分点。虽然不能说全部是聚类的功劳但分群确实让运营动作从“广撒网”变成了“对准打”。这一步也是我在带团队时反复强调的聚类分析不是终点跟业务落地动作对接上分析的价值才算闭环。结合前面讲的Q型与R型聚类、距离计算与预处理、算法选型、SPSS操作、与自然断点法的对比这套完整流程应该能帮你把聚类分析真正用起来少走不少弯路。