📈 第1章 数据分析引言
📄 一句话概括

总体客单价跌了 3%,拆成四个细分,每一块都在涨。这不是算错,是权重变了。 这种「每一块都在涨、合起来在跌」的现象叫辛普森悖论,它是数据里最常见的陷阱之一。 这一篇讲怎么发现它、怎么解释它,以及什么时候该怀疑自己的总体结论。

📝 本章和前面几章的关系

上一篇给模型加了「不知道」这一层。 这一篇往下挖数据本身:同一个平均值的背后,可能藏着完全不同的结构。 第 9 章(直方图)会把「看结构」变成看图,第 11 章(误差)会把它变成「分割数据」。

一、第一版结论通常是错的

Acme 的客单价从 134.80 跌到 130.81,跌 3.0%。报告写到这里,结论是「客户买得越来越便宜」。 这句话有两个问题:一是它把「平均」当成了「每个人」;二是它默认了客户结构没变。 第二个问题最要命,因为客户结构恰恰是最容易变的东西。

二、拆成四格再看

按渠道乘产品线切成四格,每格算自己的均价,再看每格占多大份额——

细分 2014 均价 2015 均价 份额变化
线下彩妆 148.00 152.44 35% → 18%
线下护肤 121.00 124.63 10% → 8%
线上彩妆 142.00 146.26 25% → 14%
线上护肤 118.00 121.54 30% → 60%

四格全都涨了 3.0%。可加权平均在跌。

三、加权平均的真相

总体均价不是四格均价的简单平均,是「各格均价乘各格份额」再相加。 2014 年是 0.35×148 + 0.10×121 + 0.25×142 + 0.30×118 = 134.80。 2015 年份额换成了 18/8/14/60,最便宜的那格(线上护肤 118 元)从三成涨到六成, 于是加权平均被拽到 130.81。

每一格都在涨,合起来在跌——因为客户跑到便宜的那一档去了。

四、辛普森悖论

这个现象有名字:辛普森悖论。 它的条件是「分组的结果和总体的结果方向相反」,而根源是各组权重在两次比较之间变了。 它不是数学诡计,是真实世界的常态。 营销把低价产品推给新客、医院把轻症分到新病区、学校把好学生集中到重点班,都会造出这种东西。 判断有没有中招,一个简单的自查:把数据按可能的「结构变量」分组,看组内方向和总体方向是否相反。

五、什么时候该怀疑总体

三个信号:总体变化幅度很小而各细分变化很大;总体的构成在两年间明显移动; 有人汇报「我们这块明明在涨,为什么公司整体在跌」。 出现任何一个,就该停下来拆一遍。拆完再写结论,报告的可信度会完全不同。

六、动手 Demo:深入挖掘:总体在跌,每一块都在涨

下面这段代码把四个细分、两套份额摆开,先算总体,再算加权平均,最后对比。 留意输出里「四个细分全涨 3%」和「加权平均跌 3%」这两行并排出现的样子。

segs = [
    # 名称, 2014 均价, 2014 份额, 2015 份额
    ('off-makeup', 148.00, 0.35, 0.18),
    ('off-skin',   121.00, 0.10, 0.08),
    ('on-makeup',  142.00, 0.25, 0.14),
    ('on-skin',    118.00, 0.30, 0.60),
]

for name, p14, w14, w15 in segs:
    p15 = p14 * 1.03          # 每一格都涨 3%
    print('%-11s %.2f -> %.2f  %+.1f%%  份额 %d%% -> %d%%'
          % (name, p14, p15, 3.0, w14 * 100, w15 * 100))

a = sum(p * w for _, p, w, _ in segs)
b = sum(p * 1.03 * w for _, p, _, w in segs)
print('加权平均 %.2f -> %.2f  %+.1f%%' % (a, b, (b / a - 1) * 100))

实跑输出:

--------------------------------------------------------------------
深入挖掘:总体在跌,每一块都在涨
--------------------------------------------------------------------

  ① 先看总体
  --------------------------------------------------------------------
  Acme 的客单价:2014 年 134.80 元,2015 年 130.81 元。
  跌了 3.0%。报告写到这里,结论是「客户买得越来越便宜」。

  ② 拆成四个细分再看
  --------------------------------------------------------------------

| 细分 | 2014 均价 | 2015 均价 | 变化 | 14 份额 | 15 份额 |
|---|---:|---:|---:|---:|---:|
| 线下彩妆 | 148.00 | 152.44 | +3.0% | 35% | 18% |
| 线下护肤 | 121.00 | 124.63 | +3.0% | 10% | 8% |
| 线上彩妆 | 142.00 | 146.26 | +3.0% | 25% | 14% |
| 线上护肤 | 118.00 | 121.54 | +3.0% | 30% | 60% |

  加权平均:134.80 → 130.81(-3.0%)
  ! 四个细分全在涨(都涨了 3%),加权平均却在跌 3.0%——
  因为客户跑去了便宜的那一档:线上护肤的份额从 30% 涨到 60%。

  ③ 这就是辛普森悖论
  --------------------------------------------------------------------
  每一块都在涨,合起来在跌。不是算错,是权重变了。
  总体的平均数,是「各块的值」乘「各块的份额」再相加——
  份额一动,平均数就跟着动,跟你每块做得好不好没关系。

  ④ 所以该往哪挖
  --------------------------------------------------------------------
  「客户买得越来越便宜」是错的结论。
  对的是:客户没变抠,是客户结构变了——线上护肤拉来了大批新客,
  这批人本来就买便宜货。
  ! 挖到能推翻自己第一版结论的那一层,才算真的挖过。

这段代码里「每格涨 3%」是写死的,而加权平均是算出来的——两者方向相反,不是 bug。 自己动手改一下份额(比如把线上护肤从 60% 改回 30%),方向立刻就翻过来了。

30 秒实验

  1. 把线上护肤的 2015 份额从 60% 改成 30%,加权平均变成涨还是跌?
  2. 让四格涨幅不一样(148 那格涨 5%,118 那格涨 1%),看总体方向会不会变。
  3. 想一想:如果只按渠道切两层,能不能发现这个问题?

常见误区

  1. 把平均当个体:「平均客单价跌了」不等于「每个客户花得更少了」。
  2. 只看总体不看结构:结构一变,总体就会撒谎,而且撒得毫无痕迹。
  3. 分组后忘了看份额:只看组内均价会得出「全面向好」,那份额的变化就被掩盖了。
  4. 把辛普森悖论当借口:不是所有反直觉的结果都是它,先确认权重真的变了。
自测三问(点开对答案) 1. 辛普森悖论成立的必要条件是什么? —— 各组权重在两次比较之间发生了变化,且变化方向与组内趋势相反。 2. 为什么四格都涨 3%,加权平均却跌 3%? —— 份额从贵的格子移到了便宜的格子。价格都涨了,但客户结构变了,平均被拉低。 3. 发现总体和细分方向相反,报告该怎么写? —— 两个都写,并说明结构变化。只写一个,不管写哪个,都是在掩盖一半事实。

分析做到这一步,结论已经有了。 可客户要的不是结论,是一个决定——下一篇讲怎么把分析收成一句话的下一步。

相关笔记