📈 第2章 实验
📄 一句话概括

星巴仕的销售额掉了,董事会在三个月后要一个答案:降价到底有没有用。 你手里只有一张八家门店的表格——两年的销售额、店址、有没有降价。这是「观察数据」。 观察数据的特点是:分组不是你分的,是别人早就分好的。这一篇先把它看清楚。

📝 本章和前面几章的关系

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

  1. 把 S07 的店址从商圈改成社区,两组总额变化会变成多少?为什么变这么多?
  2. 只算销售额的绝对差(而不是百分比),结论会不一样吗?
  3. 想一想:如果八家店全是社区店,这个比较还会不会有问题?

常见误区

  1. 把观察数据当实验数据:分组不是随机的,任何组间差异都可能来自分组方式本身。
  2. 只看百分比不看基数:120 万跌 15% 是 18 万,80 万跌 2% 是 1.6 万,量级差十倍。
  3. 拿两个总额直接比:总额受规模影响,规模又和店址相关,等于让混杂因素进了分子。
  4. 结论写得太早:观察数据能提假设,不能定因果,这是它的能力边界。
自测三问(点开对答案) 1. 观察数据和实验数据的根本区别是什么? —— 谁决定分组。观察数据的分组由当事人自己决定,实验数据的分组由研究者随机分配。 2. 为什么这张表里的「降价」字段不能直接当原因用? —— 因为降不降价本身受店址、店长、业绩影响,它和结果之间的关联里混着别的变量。 3. 「降价组跌得更多」这句话,现在能说明什么? —— 只能说明这两组在这两年里表现不同,不能说明是降价造成的。

两组不可比,比较就没意义。下一篇讲比较法的三个条件,以及缺少可比性时会发生什么。

相关笔记