医生说试验准确率 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 秒实验
- 把特异度从 95% 改成 99%(假阳性率 1%),正确的答案会变成多少?
- 如果基础率不是 1% 而是 20%,阳性者的患病概率是多少?和直觉的差距还剩多少?
- 想一想:为什么医生说「概率不高」?他依据的是哪一条信息?
常见误区
- 把 P(阳|病) 当 P(病|阳):两个概率长得像,含义完全不同,这是最贵的一种混淆。
- 忽略基础率:不问这病多常见就算,答案一定错,而且错得离谱。
- 把「准确率」当单一数:准确率可能指灵敏度、特异度或两者平均,含糊的写法必须追问。
- 阳性就下结论:单次阳性只是一个疑点,够不上结论。
自测三问(点开对答案)
1. 医生说的 99% 到底是什么概率? —— 灵敏度:得病的人里,99% 会测出阳性。它的分母是病人。 2. 为什么阳性者真得病的概率远低于 99%? —— 因为健康人基数大,5% 的假阳性乘出来的人比真病人还多,把分母灌大了。 3. P(病|阳) 与 P(阳|病) 有什么区别? —— 前者在阳性者里数病人,后者在病人里数阳性者。分母不同,含义不同,数值可以差几十倍。16.7% 这个数是算出来的。下一篇追问一句:为什么它这么低?答案在「这病到底有多普遍」。
- ☐ (本篇完,下一篇 6.2 蜥蜴流感到底有多普遍)