先看原題:
某地區居民的肝癌發病率為0.0004 ,現用甲胎蛋白法進行普查。醫學研究表明,化驗結是有錯檢的可能的。已知患有肝癌的人其化驗結果99%呈陽性, 而沒患肝癌的人其化驗結果99.9% 呈陰性。現某人的檢查結果呈陽性,問他真的患有肝癌的概率是多少?
先說答案,一個人化驗結果呈陽性,則他患有肝癌的概率是28.4%。
乍一看,覺得這個概率真的好小,看題設里說的,患有肝癌的人,99%的概率是化驗結果呈陽性(1%的誤判是技術等其他原因導致的)。那為什么反過來,一個人化驗結果呈陽性,則他患有肝癌的概率概率就變成了28.4%,這似乎有點違背常識。
解題
我們先把題設化成圖,便於取數計算。

解:
設A={該患者是肝癌患者},B={該患者檢驗呈陽性}
求\(P(A|B)\)
則
由貝葉斯公式可知:
這里分子的展開使用了 乘法公式,分母的展開使用了 全概率公式。
我們依次求每一項:
\(P(B|A)\)代表是肝癌患者的前提下,檢測呈陽性的概率。我們已經知道了是 0.99
\(P(B|\overline{A})\)代表不是肝癌患者的前提下,檢測呈陽性的概率。我們已經知道了是 0.001
即:
將公式(1)(3)代入(2)可得\(P(A|B)=0.284\),即 一個人在第一次化驗結果呈陽性的前提下,則他患有肝癌的概率是28.4%
分析
其實憑直覺,我們也應該能猜出,這與肝癌的發病率有關,因為在樣本空間(所有人)中,他的發病率只有0.0004。
對此,如果我們把樣本空間換成首次檢驗結果呈陽性的個體,也就是理解成,對首次檢查呈陽性的個體進行復查。再去計算
如果復查結果還是陽性,那么此時患肝癌的概率的值。
由於首次檢驗結果呈陽性的患者,發病率是 0.284(上面已經計算出來了),我們再去使用一次貝葉斯公式(2),
此時的參數是:
代入(2),可得P = 0.997,可見若第二次化驗結果還是陽性,此時是肝癌患者的概率變成了99.7%,這也就是現實生活中,要復查的原因了。
作圖
在目前技術水平不變的情況下,化驗結果的概率,我們假設是一個定值。
那么對於公式
我們畫出求\(P(A|B)\)關於\(P(A)\)的函數,即檢驗結果是陽性的前提下,該患者患肝癌的概率與人群肝癌發病率的關系。
設人群肝癌發病率為x,檢驗結果是陽性的前提下,該患者患肝癌的概率為y。
可得:
作圖:
假設當疾病發病率為4%時,若檢測為陽性,則患肝癌的概率是97.63%。
代碼:
# coding=gbk
import numpy as np
import matplotlib.pyplot as plt
from pylab import mpl
mpl.rcParams['font.sans-serif'] = ['FangSong'] # 指定默認字體
mpl.rcParams['axes.unicode_minus'] = False # 解決保存圖像是負號'-'顯示為方塊的問題
def morbidity(x):
y = x*0.99 / (x*0.99 + (1-x)*0.001)
return y
if __name__ == '__main__':
x = np.arange(0, 1, 0.01)
y = morbidity(x)
# 開始作圖
fig = plt.figure(figsize=(20, 6)) # 設置畫布大小
plt.grid(linestyle="-.", axis='y', alpha=0.4)
plt.xlabel("人群發病率", fontsize=15)
plt.ylabel("患肝癌概率", fontsize=15)
plt.plot(x, y)
plt.show()
總結
進一步降低錯檢率是提高檢驗精度的關鍵。但在實際中由於技術和操作等種種原因,降低錯檢率是很困難的。仔細分析一下會發現檢驗精度低的主要原因是肝癌發病率很低。所以在實際中,常采用復查的方法來減少錯誤。因為此時被懷疑的對象群體中,肝癌的發病率已大大提高了。
概率有時候與我們的經驗不太一樣,這也是其魅力之一。