KMeans 只给 0、1、2、3,起名是人干的活:看均值表贴业务词。 四类人数:重要价值 92(7.67%)、潜力 498、一般 419、流失 191。 拿造数时的「真身份」对一遍:对得上 627 人(52.25%),忠诚 92 人一个没漏。
上一篇分出四堆,这一篇给它们起名字,然后做一件很少有人做的事:验一遍。 验证只有造数据时能做,但它提醒的是方法论——聚类结果必须拿外部标准对一次。
一、算法只分堆,不起名
KMeans 给出的标签是 0、1、2、3,它不知道什么叫「重要客户」。 起名是人干的活:看每堆的 R、F、M 均值,按业务逻辑贴一个词上去。 贴词的标准要能一句话说清:来得勤、买得多、最近还来——这就是「重要价值」。
说不清就说明这堆人还没看懂,得回去再看均值表,而不是硬起个名字糊过去。
二、四条规则,四个名字
平均 M 最高的那堆叫「重要价值客户」,最低的叫「流失客户」。 中间两堆按 M 分开:M 高的那堆叫「潜力客户」,另一堆叫「一般客户」。 潜力那堆的 R 更小(112.5 天对 310.3 天),说明还有活跃度,值得再投入。
贴完名一定要回头再看一遍均值表。名字和均值对不上,就是贴错了——这一步最容易糊弄自己。 还有一种常见错法:按人数起名。人多的叫「一般」,人少的叫「重要」,那是按数量不是按价值。
三、四类客户各多少人
| 类别 | 人数 | 占比 |
|---|---|---|
| 重要价值客户 | 92 | 7.67% |
| 潜力客户 | 498 | 41.50% |
| 一般客户 | 419 | 34.92% |
| 流失客户 | 191 | 15.92% |
一共 1200 个客户,四类都分到了人,没有空堆。 重要价值客户只有 92 人,占 7.67%。这个比例合不合理,要看行业——高客单行业 5% 到 10% 很常见。 如果一个类别只有几个人,先别急着写策略。样本太小,可能是聚类硬分出来的。
四、拿「真身份」验一遍
| 聚类\真实 | 真实一般 | 真实忠诚 | 真实流失 | 真实潜力 |
|---|---|---|---|---|
| 重要价值 | 0 | 92 | 0 | 0 |
| 潜力 | 171 | 0 | 96 | 231 |
| 一般 | 233 | 0 | 154 | 32 |
| 流失 | 119 | 0 | 71 | 1 |
造数据时每个客户的类别是写死的,现在拿它和聚类结果对一遍。 对得上 627 人,占 52.25%。忠诚那 92 个人,一个没漏,全进了「重要价值」。 混得最厉害的是「一般」和「流失」——这两类在 F 和 M 上几乎重合,全靠 R 区分。
而 R 的分布本身就重叠,所以聚类只能一刀切,切错一批很正常。 两堆人真的一样,算法分不开;不一样,才分得开。这不是算法不行,是数据就长这样。
五、验证这件事为什么重要
真实项目里没有「真身份」,但验证这一步不能省。 换三种替代标准:上一次分群的结果、业务同事的人工判断、或者后续的行为(比如三个月后谁真的走了)。 能被验证的分群才是分群,不能被验证的只是一次演示。
52.25% 这个数不好看,但它是真的。把它写进报告,比粉饰成 95% 有用得多。 而且它顺便说明了一件事:这份数据里「一般」和「流失」本来就该合成一类, 因为它们在 RFM 上根本没区别。
六、动手 Demo:标记客户类别
按均值给四堆起名,统计人数,最后拿造数时的真身份做交叉表验一遍。 第四节那张交叉表是这一篇的核心,看得出聚类到底学到了什么。
import pandas as pd
from sklearn.cluster import KMeans
from sklearn.preprocessing import StandardScaler
rfm = pd.read_csv("rfm.csv", index_col=0)
Z = StandardScaler().fit_transform(rfm[ ["R", "F", "M"]].values.astype(float))
Z[:, 0] = -Z[:, 0]
rfm["簇"] = KMeans(n_clusters=4, n_init=10, random_state=42).fit_predict(Z)
g = rfm.groupby("簇").agg(人数=("R", "size"), 平均M=("M", "mean"))
by_m = list(g.sort_values("平均M", ascending=False).index)
NAME = {by_m[0]: "重要价值客户", by_m[1]: "潜力客户",
by_m[2]: "一般客户", by_m[3]: "流失客户"}
rfm["类别"] = rfm["簇"].map(NAME)
print(rfm["类别"].value_counts().to_string())
print("占 %.2f%% 的是重要价值客户"
% ((rfm["类别"] == "重要价值客户").mean() * 100))
实跑输出:
--------------------------------------------------------------------
标记客户类别
--------------------------------------------------------------------
① 算法只分堆,不起名
--------------------------------------------------------------------
KMeans 给出的标签是 0、1、2、3。它不知道什么叫「重要客户」。
起名是人干的活:看每堆的 R、F、M 均值,按业务逻辑贴一个词上去。
贴词的标准要能一句话说清,说不清就说明这堆人还没看懂。
② 按均值排,四个名字
--------------------------------------------------------------------
规则很直白:平均 M 最高的那堆叫「重要价值」,最低的叫「流失」。
中间两堆按 M 分成「潜力」和「一般」——潜力那堆 R 更小,说明还有活跃度。
名字要和均值对得上。贴完名回头再看一遍均值表,对不上就是贴错了。
③ 四类客户各多少人
--------------------------------------------------------------------
| 类别 | 人数 | 占比 |
|---|---:|---:|
| 重要价值客户 | 92 | 7.67% |
| 潜力客户 | 498 | 41.50% |
| 一般客户 | 419 | 34.92% |
| 流失客户 | 191 | 15.92% |
一共 1200 个客户,四类都分到了人。
如果一个类别只有几个人,先别急着写策略。样本太小,可能是聚类硬分出来的。
④ 拿「真身份」对一遍
--------------------------------------------------------------------
造数据的时候,每个客户的类别是写死的。现在拿它和聚类结果对一遍:
| 聚类\真实 | 真实一般 | 真实忠诚 | 真实流失 | 真实潜力 |
|---|---:|---:|---:|---:|
| 一般客户 | 233 | 0 | 154 | 32 |
| 流失客户 | 119 | 0 | 71 | 1 |
| 潜力客户 | 171 | 0 | 96 | 231 |
| 重要价值客户 | 0 | 92 | 0 | 0 |
对角线上的人数越多,说明聚类越贴近「真实结构」。
对得上 627 人,占 52.25%。忠诚那 92 个人,一个没漏,全进了「重要价值」。
混得最厉害的是「一般」和「流失」——这两类在 F 和 M 上几乎重合,全靠 R 区分。
而 R 的分布本身就重叠,所以聚类只能一刀切,切错一批很正常。
两堆人真的一样,算法分不开;不一样,才分得开。这不是算法不行,是数据就长这样。
这一步只有造数据时才能做。但它提醒一件事:聚类结果必须拿一个外部标准验一次。
真实项目里没有「真身份」,就得换成「上次分群的结果」或者「业务同事的判断」。
! 能被验证的分群,才是分群。不能被验证的,只是一次演示。
by_m 是「按平均 M 从高到低排好的簇号」。名字跟着序位走,不跟着簇号走,重跑也不会错。
value_counts() 默认按次数从多到少排,想按类别固定顺序得用 reindex。
(条件).mean() 直接得到比例——布尔值求平均就是 True 的占比,比 sum()/len() 短。
30 秒实验
- 把
by_m[1]和by_m[2]对调,看两个名字会不会贴反,均值表还能不能自证。 - 把 k 改成 3,看四类合并成哪三类。
- 想一想:如果没有「真身份」,你会用哪三个办法验证这次分群?
常见误区
- 按簇号贴名字:簇号是随机的,重跑一次就全错。要按均值排序贴。
- 按人数多少起名:人多的不等于「一般」,人少的不等于「重要」。
- 贴完名不复核:名字和均值对不上,整份报告都不可信。
- 不做任何验证就交付:没有外部标准对过一次,分群只是好看。
自测三问(点开对答案)
1. 为什么名字要按平均 M 排序贴,而不是按簇号? —— 簇号是 KMeans 随机分配的,每次重跑都可能变;按均值排序,顺序和业务含义才稳定。 2. 对得上 52.25%,这个结果算好还是不好? —— 说明「一般」和「流失」在 RFM 上本来就难分,忠诚客户识别得很准。不粉饰,照实写。 3. 没有真身份时,怎么验证聚类? —— 用上一次分群结果、业务同事的人工判断,或者后续三个月的真实行为做对照。名单有了。最后一篇把这四类人换成四套花钱办法,并给整章和四个项目收尾。
- ☐ (本篇完,下一篇 12.7 客户价值结果分析)