butch’s blog

メモ置き場。

ベイズの定理で読み解く新型コロナウィルスとPCR検査の陽性率

というタイトルですが実際は以下の動画を見た感想になります。

【医師解説】全員にコロナウイルス検査をしても意味がない理由

実際に新型コロナウィルス(COVID-19)のデータを使って計算している訳ではないので注意して下さい。
(※内容に誤りなどがあれば遠慮なくコメント欄で指摘してください。)
新型コロナウィルスで話題になっているPCR検査の陽性率とその信頼性について気になったので上記の動画で設定されているトイモデルを用いて自分でも計算してみました。
上記の動画では明にベイズの定理を使ってはいませんが、この記事ではベイズの定理を使って計算していきます。

まずは記号の定義をします。

  • $P(\text{罹+})$:病気に罹患している確率
  • $P(\text{罹-})$:病気に罹患していない確率
  • $P(\text{検+})$:検査で陽性になる確率
  • $P(\text{検-})$:検査で陽性にならない確率

上記の確率は「病気に罹患している確率」と「検査で要請になる確率」が独立しています。
これらに加えて以下の条件付き確率を定義します。

  • $P(\text{検+}|\text{罹+})$:病気に罹患している人が検査を受けて陽性になる確率、別名「感度」
  • $P(\text{検-}|\text{罹-})$:病気に罹患していない人が検査を受けて陰性になる確率、別名「特異度」
  • $P(\text{罹+}|\text{検+})$:検査で陽性になった人が本当に病気に罹患している確率

「感度」と「特異度」が高い方が検査の精度が良いことになります。
知りたいのは「検査で陽性になった人が本当に病気に罹患している確率」で$P(\text{罹+}|\text{検+})$になります。

問題で与えられている情報は以下になります。

  • $P(\text{罹+})$:0.1%
  • $P(\text{検+}|\text{罹+})$:90%
  • $P(\text{検-}|\text{罹-})$:80%

動画の医師が説明されている様にこの検査の精度は高いみたいです。
上記より以下の確率も求まります。

  • $P(\text{罹-})$:99.9%
  • $P(\text{検-}|\text{罹+})$:10%
  • $P(\text{検+}|\text{罹-})$:20%

これは$\sum_aP(a|b)=1$から計算しました。
($P(a|b) =P(a, b)/P(b)$をaについて和と取ると導けます。)

$P(\text{罹+}|\text{検+})$をベイズの定理を使って上記の確率だけで表すことを目標に式を変形していきます。
まずはベイズの定理を使って、


P(\text{罹+}|\text{検+}) = \frac{P(\text{検+}|\text{罹+}) P(\text{罹+}) }{P(\text{検+})}

$P(\text{検+})$が求まれば計算できます。
確率の周辺化


P(a) = \sum_{b}P(a, b) = \sum_b P(a|b)P(b)

を利用すると、


P(\text{検+}) = P(\text{検+}|\text{罹+})P(\text{罹+}) + P(\text{検+}|\text{罹-})P(\text{罹-})

と表せます。以上をまとめると、


P(\text{罹+}|\text{検+}) = \frac{P(\text{検+}|\text{罹+}) P(\text{罹+}) }{P(\text{検+}|\text{罹+})P(\text{罹+}) + P(\text{検+}|\text{罹-})P(\text{罹-})}

になります。
実際に与えられた数値を代入して計算してみると、


P(\text{罹+}|\text{検+}) = \frac{90*0.1}{90*0.1 + 20*(100-0.1)} = 0.00448

となり、約0.45%になります。
またこれより、「検査で陽性になった人が病気に罹患していない確率」も計算することができて、$P(\text{罹-}|\text{検+}) = 1 - P(\text{罹+}|\text{検+})=0.99552$となります。
検査の精度が優れていても病気の事前確率$P(\text{罹+})$が低いと、検査で陽性になっても実際に病気に罹患している確率はぐっと低くなることがわかります。
動画の医師も言われている様に国民全体にPCR検査を実施してもあまり意味がなく、新型コロナの症状が疑われる人や高齢者に実施していくこと、つまり事前確率の高い集団に重点的に検査を実施していくことが重要であることが分かります。
この理由より政府は初期段階では37.5度の発熱が数日間続く人のみにPCR検査を実施することで事前確率を高くしていたのだと思います。(知らんけど)
その事前確率を変化させたときの$P(\text{罹+}|\text{検+})$を下にプロットしてみました。

f:id:butch416:20200807200337j:plain
事前確率と事後確率

10%付近までのフォーカスした結果も載せておきます。

f:id:butch416:20200807200359j:plain
事前確率と事後確率2

数値計算には以下のgithubリポジトリにあるコードを使いました。

github.com

import numpy as np
import matplotlib.pyplot as plt
%matplotlib inline
pre_prob = []
post_prob = []
a = 90
b = 20
x = 0.1
for _ in range(1000):
    pre_prob.append(x)
    post_prob.append((a*x)/(a*x + b*(100-x))*100)
    x += 0.1
plt.plot(pre_prob, post_prob)
plt.xlabel('pre_prob')
plt.ylabel('post_prob')
plt.title('sensitivity:{},  specificity:{}'.format(a, 100-b))
plt.show()
plt.savefig('./fig/sensitivity_specificity.jpg')

「検査で陰性になった人が本当に病気に罹患していない確率」である$P(\text{罹-}|\text{検-})$も気になります。
先ほどと同様に計算していきます。


P(\text{罹-}|\text{検-}) = \frac{P(\text{検-}|\text{罹-}) P(\text{罹-}) }{P(\text{検-})}

より、


P(\text{罹-}|\text{検-}) = \frac{P(\text{検-}|\text{罹-}) P(\text{罹-}) }{P(\text{検-}|\text{罹-})P(\text{罹-}) + P(\text{検-}|\text{罹+})P(\text{罹+})}

に値を代入すると、


P(\text{罹-}|\text{検-}) = \frac{80*(100-0.1)}{80*(100-0.1) +10*0.1} = 0.9998

となり、ほぼ100%に近いことが分かります。
この問題の精度の検査であれば陰性と判定されれば病気に罹患している可能性はないと信じて良さそうです。
一方で陽性と診断されたからといって本当に病気に罹患しているかどうかは断定できないことが分かりました。

この記事では完全にトイモデルで計算しましたが実際の新型コロナウィルスではどうなるか計算してみるのも面白そうですね。