📈 第11章 误差
📄 一句话概括

计算器没错,错在它只交了一个数。数一离开分析师的桌子,就会被人当成承诺。 客户不是一个人,是三类人:员工要依据、人事要解释、老板要预算。一个点估计一个都答不了。 一个预测必须写成「一个数 + 一个误差」。少一半,对方一定会自己补,而且补错。

📝 本章和前面几章的关系

第 10 章把回归线立起来了,误差 0.94 个百分点。第 11 章讲这个误差怎么用、怎么交出去。 这一章的技术部 60 条和第 10 章完全同一批(同种子、同公式),所以 0.94 这个数是接得上的。

一、电话是周一早上来的

人事把加薪计算器拿去用了两周,然后打来电话,语气很硬。 问题不是「算错了」。他们核对过,算出来的数和历史数据基本对得上。 问题是「算出来的数被人当真了」:有人拿着计算器给的百分数去找主管,说按你们的模型我该拿这么多。

主管说制度上没有这一档。两边都不觉得自己错,事情就卡住了。 一个模型出了这种事,通常不是精度问题,是交付方式的问题。

二、计算器到底给了什么

回头看交付物:一张两列的表。左边输入点数,右边输出一个百分数。 55 分给 5.64%,70 分给 6.98%,85 分给 8.33%。每一行都是孤零零一个数。 没有「大概」,没有「上下」,没有「这个数的可信程度」。

这就是点估计:一个数,把不确定性全藏起来了。 藏起来不等于不存在。它只是从交付物里挪到了别人的想象里,而别人想的方向通常对你有利。

三、客户不是一个人,是三类人

谁 他要什么 计算器给了他什么
员工 我该拿多少,凭什么 一个百分数,没有依据
人事 这套制度能不能对外解释 一个方程,没有边界
老板 明年预算要多少 只能一个个算,没有总额

同一份计算器,三类人拿去问三个不同的问题。它一个都没答好。 因为你只交了一个数,他们各自往里填了自己想要的解释。 这不是他们理解能力的问题,是交付物本身留了太多空白。

四、缺的那句话

缺的是:这个数有多准。 说「你会加 8.6%」是一句话;说「8.6%,上下浮动一个点,十次里有六次落在里头」是另一句话。 第二句话才让人知道该拿它干什么:谈预算可以,签合同不行。

第一句话听着更干脆,但它把判断责任推给了听的人——而听的人没有算过模型。 交付一个预测,等于交付一个数加一个误差。这不是谨慎,是完整。

五、先查那个 108 分的

闹得最凶的那位,点数填的是 108——比模型见过的最高分 95 还高。 他的数是怎么算出来的?这个问题比「计算器准不准」更要紧。 下一篇专讲这件事。它有个名字,叫外插。

六、动手 Demo:客户大为恼火:一个数被当成了承诺

把计算器的交付物原样摆出来:四行「输入 → 输出」。 再看三类客户各自拿它问什么问题,以及缺的那句话是什么。

S = [20261102]

def rnd():
    S[0] = (S[0] * 1103515245 + 12345) % 2147483648
    return S[0] / 2147483648.0

DATA = []
for i in range(60):
    x = 40 + int(round(i * 55 / 59.0))
    y = 1.2 + 0.085 * x + (rnd() - 0.5) * 3.2
    DATA.append((x, round(y, 1)))

XS = [d[0] for d in DATA]
YS = [d[1] for d in DATA]
n = len(XS)
mx = sum(XS) / float(n)
my = sum(YS) / float(n)
m = sum((x - mx) * (y - my) for x, y in zip(XS, YS)) / sum((x - mx) ** 2 for x in XS)
b = my - m * mx

print("计算器的交付物:")
for q in (55, 70, 85, 108):
    print("  点数 %3d  ->  %.2f%%" % (q, b + m * q))

print()
print("模型见过的范围:%d ~ %d 分" % (min(XS), max(XS)))
print("108 分在里面吗:%s" % ("在" if min(XS) <= 108 <= max(XS) else "不在"))

实跑输出:

--------------------------------------------------------------------
客户大为恼火:一个数被当成了承诺
--------------------------------------------------------------------

  ① 电话是周一早上来的
  --------------------------------------------------------------------
  人事把加薪计算器拿去用了两周,然后打来电话,语气很硬。
  问题不是「算错了」,是「算出来的数被人当真了」。
  有人拿着计算器给的数去找主管,说「按你们的模型我该拿这么多」,主管说「制度上没有这一档」。

  ② 计算器到底给了什么
  --------------------------------------------------------------------

| 输入的点数 | 计算器给的加薪幅度 |
|:---:|---:|
| 55 | 5.64% |
| 70 | 6.98% |
| 85 | 8.33% |
| 108 | 10.40% |

  四行都是孤零零一个百分数,后面什么都没有。
  没有「大概」,没有「上下」,没有「这个数的根据是什么程度」。
  ! 这就是点估计:一个数,把不确定性全藏起来了。

  ③ 客户不是一个人,是三类人
  --------------------------------------------------------------------

| 谁 | 他要什么 | 计算器给了他什么 |
|---|---|---|
| 员工 | 我该拿多少,凭什么 | 一个百分数,没有依据 |
| 人事 | 这套制度能不能对外解释 | 一个方程,没有适用边界 |
| 老板 | 明年预算要多少 | 只能一个人一个人加,没有总额 |

  同一份计算器,三类人拿去问三个不同的问题。它一个都没答好。
  因为你只交了一个数,他们各自往里填了自己想要的解释。

  ④ 缺的那句话
  --------------------------------------------------------------------
  缺的是:这个数有多准。
  说「你会加 8.6%」是一句话;说「8.6%,上下浮动一个点,十次里有六次落在里头」是另一句话。
  第二句才让人知道该拿它干什么:谈预算可以,签合同不行。
  ! 交付一个预测,等于交付一个数加一个误差。少一半,对方一定会自己补,而且补错。

  ⑤ 先查那个 108 分的
  --------------------------------------------------------------------
  闹得最凶的那位,点数填的是 108——比模型见过的最高分 95 还高。
  下一节专讲这件事:那个数是怎么被算出来的。

四行输出长得一模一样,看不出哪一行是可信的、哪一行是硬算的。 这就是点估计最大的问题:它把可靠和不可靠抹成了同一个样子。 最后两行是在自查范围。这一步几乎没人做,但它能挡住后面一半的麻烦。

30 秒实验

  1. 如果把交付物改成三列(预测值、下界、上界),三类客户的追问会分别变成什么?
  2. 有人说「我不要区间,给我一个数就行」时,你该怎么回?
  3. 想一想:为什么同一个数,越是被当成精确答案,用起来越危险?

常见误区

  1. 只交点估计:一个数看着干脆,实际上把不确定性转嫁给了不会算的人。
  2. 以为客户恼火是因为算错:多数时候他们恼火是因为「说好的事不算数」。
  3. 把三类客户当一类:员工、人事、老板要的是三种不同的东西。
  4. 道歉并承诺「下次算准点」:问题不在精度,在交付物缺了一半。
自测三问(点开对答案) 1. 计算器算错了吗? —— 没有。系数和历史上对得上。它的问题是只给了点估计,没给误差,于是被人当成了承诺。 2. 三类客户分别缺什么? —— 员工缺依据,人事缺适用边界,老板缺可以直接汇总的总额。三者都需要误差才能补上。 3. 为什么说「交付预测等于交付一个数加一个误差」? —— 因为不确定性和估计值是一体两面。 只给一个数,等于让别人替你假设误差,而他们必然往有利自己的方向假设。

先说清楚那个 108 分的数是怎么来的。它是这一章所有麻烦的起点。

相关笔记