📈 第6章 贝叶斯统计
📄 一句话概括

医生说试验准确率 99%,你测出阳性。你以为自己有 99% 的概率得病——实际是 16.7%。 错的不是算术,是分母。「病人里多少测出阳性」和「阳性里多少真有病」,是两个完全不同的概率。 这一篇只做一件事:把医生那句话拆开,看清里面到底藏了几个概率。

📝 本章和前面几章的关系

第 5 章用贝叶斯式的乘法筛过假设。第 6 章把那一套乘法讲成完整规则,从一场体检开始。 书里的例子是蜥蜴流感。 这里的三个数(基础率 1%、灵敏度 99%、特异度 95%)是本节设定值,机制与书里一致, 具体数值按设定值算,不假装是教材原数。

一、消息来了

医生说:你得了一种叫蜥蜴流感的病,概率不高,但要做个试验确认。 试验结果:阳性。 医生补了一句:这个试验挺准的,病人测出来 99% 是阳性,健康人测出来 95% 是阴性。

接下来这句话最要命:「准确率 99%,那我大概就是得病了。」大多数人到这里就停了。

二、逐条细读那份正确性分析

医生那句话里其实有三条信息,只是说的时候连成了一串。

医生说的 翻译过来 记作
病人测出来 99% 是阳性 得病的人里,99% 会被测出阳性 灵敏度 0.99
健康人测出来 95% 是阴性 没病的人里,95% 会被测出阴性 特异度 0.95
隐含的一条 没病的人里,5% 会被误测成阳性 假阳性率 0.05

三条信息说的都是「在某个前提下,出现某个结果的可能」。没有一条在说「你有病」。 你要问的那个概率,医生一个字都没提。这不是医生藏私,是他说的和你想问的本来就是两件事。

三、直觉错在哪儿

99% 的分母是「病人」。它的意思是:随便抓 100 个病人,其中 99 个会测出阳性。 你想知道的那个概率,分母是「测出阳性的人」。它的意思是:随便抓 100 个阳性的人,其中几个真有病。 分母一换,答案就换。而且换得极其剧烈——因为健康人的基数太大了。

四、把 1000 个人摆出来数

1000 个人里,按 1% 的基础率,10 个真有病,990 个没病。 10 个病人里,99% 会亮阳性,也就是 9.9 个。 990 个健康人里,5% 会亮阳性,也就是 49.5 个。

阳性总数 59.4 人,其中真病人 9.9 人。所以阳性者真得病的比例是 16.7%。 直觉 99%,实际 16.7%,差了将近六倍。而这个差距不是算错,是问错了。

五、一个必须记住的句式

P(病|阳) 和 P(阳|病) 长得几乎一样,含义差着十万八千里。 竖线读作「在……条件下」。P(阳|病) 是医生的说法,P(病|阳) 是你要的答案。 把这两个调换过来,是概率误用里最常见的一种,也是最贵的一种——它能让一个人白白恐慌好几天。

看到任何「准确率多少」的说法,先问一句:这是在谁身上测出来的?

六、动手 Demo:阳性结果,我到底有多大病

把医生那三条信息代进去,算两个答案:直觉的和正确的。 三个参数是本节设定值:基础率 1%、灵敏度 99%、特异度 95%。

BASE, SENS, SPEC = 0.01, 0.99, 0.95

intuition = SENS                      # 直觉:把灵敏度当成患病概率
print("直觉答案:%.1f%%" % (intuition * 100))

hit = BASE * SENS                    # 真阳性
fa = (1 - BASE) * (1 - SPEC)         # 假阳性
print("真阳性 %.4f,假阳性 %.4f" % (hit, fa))

p = hit / (hit + fa)
print("正确算法:%.1f%%" % (p * 100))
print("两个答案差 %.1f 倍" % (intuition / p))

print()
print("分母换了:99%% 的分母是病人,%.1f%% 的分母是阳性者" % (p * 100))

实跑输出:

--------------------------------------------------------------------
阳性结果,我到底有多大病
--------------------------------------------------------------------

  ① 医生说的话
  --------------------------------------------------------------------
  医生说:你得了一种叫蜥蜴流感的病,概率不高,但要做个试验确认。
  试验结果:阳性。
  医生补了一句:这个试验挺准的,病人测出来 99% 是阳性,健康人测出来 95% 是阴性。

  ② 直觉的答案
  --------------------------------------------------------------------
  「99% 准确」听着就像「我有 99% 的概率得病」。
  大部分人在这一步就停住了,然后开始安排后事。
  ! 这个答案错得很远,而且错的方向一致:人都把「准确率」和「我得病的概率」当成同一件事。

  ③ 换成 1000 个人来看
  --------------------------------------------------------------------

| 人群 | 人数 | 测出阴性 | 测出阳性 |
|---|---:|---:|---:|
| 真病人 | 10 | 0.1 | 9.9 |
| 健康人 | 990 | 940.5 | 49.5 |

  1000 个人里,10 个真有病,990 个没病。
  有病的 10 个里,9.9 个测出阳性。
  没病的 990 个里,49.5 个也测出阳性(假阳性)。

  ④ 阳性的人一共多少
  --------------------------------------------------------------------
  阳性总数 59.4 人,其中真病人 9.9 人。
  所以「测出阳性」的人里,真得病的比例是 9.9 / 59.4 = 16.7%。
  ! 直觉说 99%,实际 16.7%。差了将近六倍。

  ⑤ 差在哪儿
  --------------------------------------------------------------------
  分母换了。99% 的分母是「病人」,问的是「病人里多少测出阳性」。
  你真正想知道的,分母是「测出阳性的人」,问的是「阳性里多少真有病」。
  这两个数在基础率极低的时候差得非常远——因为健康人太多了,5% 的假阳性乘出来比真病人还多。

注意那个 16.7% 不是「你没事」的意思,它只是「阳性这件事本身不足以说明你有事」。 分母一换,答案从 99% 掉到 16.7%。这一篇全部内容就是这一句。

30 秒实验

  1. 把特异度从 95% 改成 99%(假阳性率 1%),正确的答案会变成多少?
  2. 如果基础率不是 1% 而是 20%,阳性者的患病概率是多少?和直觉的差距还剩多少?
  3. 想一想:为什么医生说「概率不高」?他依据的是哪一条信息?

常见误区

  1. 把 P(阳|病) 当 P(病|阳):两个概率长得像,含义完全不同,这是最贵的一种混淆。
  2. 忽略基础率:不问这病多常见就算,答案一定错,而且错得离谱。
  3. 把「准确率」当单一数:准确率可能指灵敏度、特异度或两者平均,含糊的写法必须追问。
  4. 阳性就下结论:单次阳性只是一个疑点,够不上结论。
自测三问(点开对答案) 1. 医生说的 99% 到底是什么概率? —— 灵敏度:得病的人里,99% 会测出阳性。它的分母是病人。 2. 为什么阳性者真得病的概率远低于 99%? —— 因为健康人基数大,5% 的假阳性乘出来的人比真病人还多,把分母灌大了。 3. P(病|阳) 与 P(阳|病) 有什么区别? —— 前者在阳性者里数病人,后者在病人里数阳性者。分母不同,含义不同,数值可以差几十倍。

16.7% 这个数是算出来的。下一篇追问一句:为什么它这么低?答案在「这病到底有多普遍」。

相关笔记