总体客单价跌了 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 秒实验
- 把线上护肤的 2015 份额从 60% 改成 30%,加权平均变成涨还是跌?
- 让四格涨幅不一样(148 那格涨 5%,118 那格涨 1%),看总体方向会不会变。
- 想一想:如果只按渠道切两层,能不能发现这个问题?
常见误区
- 把平均当个体:「平均客单价跌了」不等于「每个客户花得更少了」。
- 只看总体不看结构:结构一变,总体就会撒谎,而且撒得毫无痕迹。
- 分组后忘了看份额:只看组内均价会得出「全面向好」,那份额的变化就被掩盖了。
- 把辛普森悖论当借口:不是所有反直觉的结果都是它,先确认权重真的变了。
自测三问(点开对答案)
1. 辛普森悖论成立的必要条件是什么? —— 各组权重在两次比较之间发生了变化,且变化方向与组内趋势相反。 2. 为什么四格都涨 3%,加权平均却跌 3%? —— 份额从贵的格子移到了便宜的格子。价格都涨了,但客户结构变了,平均被拉低。 3. 发现总体和细分方向相反,报告该怎么写? —— 两个都写,并说明结构变化。只写一个,不管写哪个,都是在掩盖一半事实。分析做到这一步,结论已经有了。 可客户要的不是结论,是一个决定——下一篇讲怎么把分析收成一句话的下一步。
- ☐ (本篇完,下一篇 1.7 回顾工作与英明的决策)