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

比较是破解观察数据最有效的工具,但比较有前提:两组得可比。 星巴仕的降价组四家里三家在社区,未降组四家里三家在商圈——两组不在同一个战场上。 这一篇讲比较法的三个条件,以及缺了可比性之后,比较会怎样骗人。

📝 本章和前面几章的关系

上一篇拿到了两组总额变化,看上去降价更糟。这一篇要问的是:这个「看上去」站不站得住。 「可比性」这个概念会一直用到第 11 章(误差)——那里讲的是模型的误差,这里讲的是比较的误差。

一、只看自己,看不出因果

最朴素的比法是「前后比」:这家店去年 120 万,今年 102 万,跌了 15%,所以降价有害。 问题在于,这一年整个行业都在跌。15% 里有多少是降价造成的,有多少是大环境,这个比法分不开。 没有对照,就没有归因。 前后比只能告诉你「变了」,不能告诉你「为什么变」。

二、两组得在同一个战场上

于是有了组间比:降价的四家对没降的四家。可这个比法要求两组尽量像。

维度 降价组 未降组 像不像
门店数 4 家 4 家 像
社区店占比 3/4 = 75% 1/4 = 25% 不像
2014 规模 400 万 390 万 像

规模差不多,店址差得远。而店址恰恰是决定客流的东西。

三、比较法的三个条件

同时性:两组比的是同一段时间。跨年比会把季节、政策、竞品全混进来。 可比性:除了要研究的因素,两组在别的方面尽量一致。 有对照:至少有一组没被处理,用来给出「什么都不做会怎样」这个背景值。

三条里最容易缺的是第二条。因为它不像缺对照那样一眼能看出来,它藏在字段里。

四、缺了可比性会怎样

缺可比性不会报错,它会安安静静地给你一个错结论。 星巴仕这个例子就是:降价组跌 12.4%,未降组跌 7.5%,看上去降价有害 4.9 个百分点。 实际上降价在两类店里都是更好的选择。方向被彻底颠倒了,而报表上看不出任何异常。

五、可比性可以补

补的办法有两个:一是把两组拆成同类再比(下一篇做),二是重新分组(第 2.7 篇做)。 前者适合数据已经收完的情况,后者要能重来一次。 能重来的时候,一定要重来——因为拆分只能处理你想得到的那些差异。

六、动手 Demo:比较法:破解观察数据的法宝

先算两组总额变化,再算两组的店址构成。第二个表才是关键。 看完你会明白:第一张表的差值,量的是店址,不是降价。

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]

print('组      家数  社区店  商圈店  变化')
for cut in (True, False):
    idx = [i for i, s in enumerate(stores) if s[2] == cut]
    com = len([i for i in idx if stores[i][1] == 'community'])
    a, b = sum(stores[i][3] for i in idx), sum(now[i] for i in idx)
    print('%-6s  %d    %d      %d     %+.1f%%'
          % ('cut' if cut else 'keep', len(idx), com, len(idx) - com,
             (b / a - 1) * 100))

实跑输出:

--------------------------------------------------------------------
比较法:破解观察数据的法宝
--------------------------------------------------------------------

  ① 只看自己,看不出因果
  --------------------------------------------------------------------
  有人会说:降价那四家跌了 12.4%,不降价那四家跌了 7.5%,差别一目了然。
  可这个比法有一个前提:两组店除了降不降价,别的都一样。
  这个前提成立吗?先看店址。

  ② 两组的店址构成完全不同
  --------------------------------------------------------------------

| 组 | 门店数 | 社区店 | 商圈店 |
|---|:---:|:---:|:---:|
| 降价 | 4 家 | 3 家(75%) | 1 家(25%) |
| 没降 | 4 家 | 1 家(25%) | 3 家(75%) |

  降价组四家里三家在社区,没降组四家里三家在商圈。
  两组根本不在同一个战场上。

  ③ 比较法的三个条件
  --------------------------------------------------------------------

| 条件 | 意思 | 这里满足吗 |
|---|---|---|
| **同时性** | 两组在同一段时间里比 | 满足 |
| **可比性** | 两组除研究因素外尽量像 | **不满足**,店址差太多 |
| **有对照** | 有一组没被处理 | 满足,但有偏 |

  ! 比较是破解观察数据的法宝,可比性就是这个法宝的把手——把手断了,法宝就废了。

  ④ 那还能不能救
  --------------------------------------------------------------------
  能,但要往下拆:把「店址」这个变量固定住,在同类店内部比。
  这就是下一篇要做的「拆分数据块,管理混杂因素」。

降价组社区店 3 家,未降组 1 家——这个差比销售额的差重要得多。 先查分组均衡,再看结果差异,这个顺序不能反。反了就会把一个店址差异当成降价效果。

30 秒实验

  1. 把降价组改成全在商圈、未降组全在社区,两组的总额变化会不会调个个儿?
  2. 只保留商圈店(四家),重算两组变化,差值还剩多少?
  3. 想一想:如果两组连规模也不一样(400 万对 200 万),该怎么比才公平?

常见误区

  1. 只做前后比:没有对照组,把行业趋势全算成了自己的功劳或罪过。
  2. 用总额比而不看结构:总额 = 规模 × 变化率,规模差异会被误读成效果差异。
  3. 以为「样本量一样」就等于可比:4 家对 4 家只是数量齐,结构可能完全不同。
  4. 先看结果后查分组:这会让你的判断被第一眼看到的差值锚住,后面再怎么查都带着偏见。
自测三问(点开对答案) 1. 比较法的三个条件是什么? —— 同时性、可比性、有对照。最容易缺的是可比性,因为它藏在字段里,不报错。 2. 为什么「降价组跌得更多」这个结论是错的? —— 因为降价组里社区店占 75%,而未降组只占 25%,社区店本身跌得更多。差值量的是店址。 3. 缺可比性时,报表上会出现异常吗? —— 不会。它会安静地给一个错结论,数字干净、逻辑通顺,只有把数据拆开才会露馅。

可比性缺在店址上,那就要把店址拆开。 拆之前先看一眼手里的另一份数据——那份问卷,它藏着一个更隐蔽的错误。

相关笔记