星巴仕的销售额掉了,董事会在三个月后要一个答案:降价到底有没有用。 你手里只有一张八家门店的表格——两年的销售额、店址、有没有降价。这是「观察数据」。 观察数据的特点是:分组不是你分的,是别人早就分好的。这一篇先把它看清楚。
第 1 章处理的是「自己公司的数怎么拆」。这一章换了个更硬的问题:一个动作到底有没有用。 这个问题不能靠拆解回答,因为拆解只能告诉你「哪块在变」,不能告诉你「是谁让它变的」。
一、董事会要的不是描述,是判断
「销售额掉了 9%」是描述,「降价有没有用」是判断。前者看数据就有,后者要看两组人的差别。 判断类问题的答案,永远是一个比较:和什么比、差多少、这个差是不是真的。 所以拿到问题先问一句:我打算拿什么和什么比。答不上来,就还没开始分析。
二、先看清手里这张表
八家店,两年,三个字段:店址、有没有降价、销售额。
| 字段 | 是什么 | 能回答什么 |
|---|---|---|
| 店址 | 社区店/商圈店 | 客流的来源不同,是潜在的混杂因素 |
| 降价 | 降了/没降 | 这是我们要研究的那个动作 |
| 销售额 | 万元/年 | 结果变量 |
三个字段,一个是原因、一个是结果、一个是可能的干扰。这张表的全部信息就这些。
三、什么叫观察数据
降价是门店自己决定的,可能是店长申请、可能是区域经理拍板。你没有插手。 这种「你只是看着它发生」的数据,就是观察数据。它的反面是实验数据——分组由你决定。 两者的差别不在数据量,在谁决定了谁进哪一组。这一点决定了后面能不能说因果。
四、最粗的那个比法
把八家店按「降没降价」分成两组,各算一个总额变化:降价组 −12.4%,未降组 −7.5%。 降价组跌得更多。直觉的结论是:降价不但没用,还更糟。 这个结论干脆、好看、也最容易写进报告。它唯一的问题是:它可能是错的。
五、为什么先别下结论
这个比法隐含了一个前提——两组店除了降不降价,别的都一样。 可八家店里,降价的三家社区店恰好都在同一片老城区。它们和商圈店本来就不在一个战场上。 两组不可比,比较就没有意义。 下一篇专门拆这件事。
六、动手 Demo:咖啡业的寒冬:先看清手里是什么数据
八家店摆开,先算最粗的两组总额变化。 注意最后一行:这个结论现在还不能交,因为两组根本不在同一个战场上。
# 名称, 店址, 是否降价, 2014 销售额
stores = [
('S01', 'community', True, 120.0),
('S02', 'community', True, 110.0),
('S03', 'community', True, 90.0),
('S04', 'downtown', True, 80.0),
('S05', 'downtown', False, 130.0),
('S06', 'downtown', False, 100.0),
('S07', 'downtown', False, 85.0),
('S08', 'community', False, 75.0),
]
rate = {('community', True): -0.15, ('community', False): -0.18,
('downtown', True): -0.02, ('downtown', False): -0.05}
now = [s[3] * (1 + rate[(s[1], s[2])]) for s in stores]
for i, s in enumerate(stores):
print('%s %-9s %-5s %6.1f -> %6.1f %+.1f%%'
% (s[0], s[1], 'cut' if s[2] else 'keep', s[3], now[i],
(now[i] / s[3] - 1) * 100))
for cut in (True, False):
idx = [i for i, s in enumerate(stores) if s[2] == cut]
a, b = sum(stores[i][3] for i in idx), sum(now[i] for i in idx)
print('%s 组 %d 家: %.1f -> %.1f %+.1f%%'
% ('cut' if cut else 'keep', len(idx), a, b, (b / a - 1) * 100))
实跑输出:
--------------------------------------------------------------------
咖啡业的寒冬:先看清手里是什么数据
--------------------------------------------------------------------
① 董事会三个月后召开
--------------------------------------------------------------------
星巴仕是一家连锁咖啡店,去年销售额掉了。
首席执行官给了你一张调查表:八家门店两年的销售额、店址、有没有降价。
董事会要一个答案:降价到底有没有用。
② 手里的数据长什么样
--------------------------------------------------------------------
| 门店 | 店址 | 降价 | 2014 | 2015 | 变化 |
|---|---|:---:|---:|---:|---:|
| S01 | 社区 | 降 | 120.0 | 102.0 | -15.0% |
| S02 | 社区 | 降 | 110.0 | 93.5 | -15.0% |
| S03 | 社区 | 降 | 90.0 | 76.5 | -15.0% |
| S04 | 商圈 | 降 | 80.0 | 78.4 | -2.0% |
| S05 | 商圈 | 没降 | 130.0 | 123.5 | -5.0% |
| S06 | 商圈 | 没降 | 100.0 | 95.0 | -5.0% |
| S07 | 商圈 | 没降 | 85.0 | 80.8 | -5.0% |
| S08 | 社区 | 没降 | 75.0 | 61.5 | -18.0% |
③ 这是「观察数据」
--------------------------------------------------------------------
所谓观察数据,就是你只是看着它发生,没有插手。
降价是门店自己决定的,不是你分配的——这一点非常关键,后面会要你的命。
④ 先算一个最粗的数
--------------------------------------------------------------------
降价的四家:400.0 → 350.4(-12.4%)
没降的四家:390.0 → 360.8(-7.5%)
! 降价的跌得更多。看起来降价不但没用,还更糟。
如果报告写到这儿就交,结论会很干脆,也会很错——下一篇说为什么。
两组总额变化是 −12.4% 和 −7.5%,看上去降价组更差。 但这个数字现在还不能用:它把「降价的效果」和「店址的差异」混在一起了, 分母里有两件事在同时起作用。
30 秒实验
- 把 S07 的店址从商圈改成社区,两组总额变化会变成多少?为什么变这么多?
- 只算销售额的绝对差(而不是百分比),结论会不一样吗?
- 想一想:如果八家店全是社区店,这个比较还会不会有问题?
常见误区
- 把观察数据当实验数据:分组不是随机的,任何组间差异都可能来自分组方式本身。
- 只看百分比不看基数:120 万跌 15% 是 18 万,80 万跌 2% 是 1.6 万,量级差十倍。
- 拿两个总额直接比:总额受规模影响,规模又和店址相关,等于让混杂因素进了分子。
- 结论写得太早:观察数据能提假设,不能定因果,这是它的能力边界。
自测三问(点开对答案)
1. 观察数据和实验数据的根本区别是什么? —— 谁决定分组。观察数据的分组由当事人自己决定,实验数据的分组由研究者随机分配。 2. 为什么这张表里的「降价」字段不能直接当原因用? —— 因为降不降价本身受店址、店长、业绩影响,它和结果之间的关联里混着别的变量。 3. 「降价组跌得更多」这句话,现在能说明什么? —— 只能说明这两组在这两年里表现不同,不能说明是降价造成的。两组不可比,比较就没意义。下一篇讲比较法的三个条件,以及缺少可比性时会发生什么。
- ☐ (本篇完,下一篇 2.2 比较法是破解观察数据的法宝)