📊 第12章 Python 实现客户价值分析
📄 一句话概括

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 秒实验

  1. 把 by_m[1] 和 by_m[2] 对调,看两个名字会不会贴反,均值表还能不能自证。
  2. 把 k 改成 3,看四类合并成哪三类。
  3. 想一想:如果没有「真身份」,你会用哪三个办法验证这次分群?

常见误区

  1. 按簇号贴名字:簇号是随机的,重跑一次就全错。要按均值排序贴。
  2. 按人数多少起名:人多的不等于「一般」,人少的不等于「重要」。
  3. 贴完名不复核:名字和均值对不上,整份报告都不可信。
  4. 不做任何验证就交付:没有外部标准对过一次,分群只是好看。
自测三问(点开对答案) 1. 为什么名字要按平均 M 排序贴,而不是按簇号? —— 簇号是 KMeans 随机分配的,每次重跑都可能变;按均值排序,顺序和业务含义才稳定。 2. 对得上 52.25%,这个结果算好还是不好? —— 说明「一般」和「流失」在 RFM 上本来就难分,忠诚客户识别得很准。不粉饰,照实写。 3. 没有真身份时,怎么验证聚类? —— 用上一次分群结果、业务同事的人工判断,或者后续三个月的真实行为做对照。

名单有了。最后一篇把这四类人换成四套花钱办法,并给整章和四个项目收尾。

相关笔记