混同行列について(医学的検査の偽陽性を例に)

## 何だかんだで話題

今日, 新型コロナウイルス(COVID-19) の話は各種メディアをはじめ, 至る所でされています. 一日中引きこもっている私でも知っているのですごいことです.

このとき私は, 家に引きこもり, 十分な睡眠をとり, 手洗いうがいを心掛けているため, COVID-19 どころかインフルエンザすらかかる気配がない生活を送っています. この病気とはあまり縁がなさそうな気がしています.
とはいえ, ホットな話題, ~~少し暇~~ ということもあっていくつか調べてみました.

すると, SNS 上では他国と比べてCOVID-19 の検査数が少ないことを疑問視している人がいました. 個人的にも, 「医療機関がパンクしないように調整しなければならないが, もっと調査したらいいのに」と思っていたところ, 医療関係者(と名乗る人) からこのような指摘が.

 「検査はすればするほどいいわけでも, 安心できるわけでもない」

これはなんだか(少なくとも個人的には) 直感に反する意見でありどういうことだろうと調べていたところ, 数学的に(機械学習的に)面白い話が見つかったため, これをまとめてみます.

## 混同行列
タイトルにも入っている混同行列について簡単に. 

混同行列(Confusion Matrix) とは, 機械学習, 中でも分類器の性能を評価する際に多く使用される表であり, 以下のようなものです.

![混同行列.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/277804/d05c0000-a416-d680-5e36-e275aa3c53f0.png)


ここでは, 顔か顔ではないかを分類する分類器について考えます. すなわち,  $\omega_1$ : 顔, $\omega_2$ : 顔ではない

このとき, 「TP」,「FP」,「FN」,「TN」とはそれぞれ

| 名称           | 略称 | 日本語訳 | 概要                       |
| -------------- | ---- | -------- | -------------------------- |
| True Positive  | TP   | 真陽性   | 正しい検出(Hit)            |
| False Positive | FP   | 偽陽性   | 誤検出(誤報)(False Alarm)  |
| False Negative | FN   | 偽陰性   | 未検出(見逃し)(Miss)       |
| True Negative  | TN   | 真陰性   | 正しい棄却(Correct Reject) |

となります.

さて, なぜこのようなものをいちいち定義するのでしょうか?~~めんどくさいのに~~ 

分類器の性能なんて正答率(Accuracy), すなわち
$$
Accuracy = \frac{TP + TN}{TP + FP + FN + TN}
$$
だけで十分なのでは?

こう思っていたことが私にもありました. これについては, [そのものずばり]([https://qiita.com/TsutomuNakamura/items/a1a6a02cb9bb0dcbb37f#%E6%AD%A3%E8%A7%A3%E7%8E%87%E6%AD%A3%E7%A2%BA%E3%81%95accuracy-%E4%BB%A5%E5%A4%96%E3%81%AE%E6%8C%87%E6%A8%99%E3%81%8C%E5%BF%85%E8%A6%81%E3%81%AA%E7%90%86%E7%94%B1](https://qiita.com/TsutomuNakamura/items/a1a6a02cb9bb0dcbb37f#正解率正確さaccuracy-以外の指標が必要な理由)) を答えた記事であったり, 実際に分類器を作成した際に, 正答率以外の評価方法を使用することでその問題の特徴が理解できた[例](https://qiita.com/wataoka/items/5201a1ac8696160828fd) などを参考にされることをお勧めします. (あと次の章で具体例やります)

一言でいうと, 分類結果が偏っている場合, 正答率だけでは分類器を正しく評価できないことが問題です. これを解決するために, 他の評価指標も使用します. よく使われる指標としては,

適合率(Precision)
$$
Precision = \frac{TP}{TP + FP}
$$
再現率(Recall)
$$
Recall = \frac{TP}{TP + FN}
$$
F値(F-measure)
$$
F = \frac{2Precision \cdot Recall}{Precision + Recall}
$$


などがあります.

また, 混同行列及びそこから派生する性能指標の計算については, すでに[scikit-learn](https://scikit-learn.org/stable/modules/classes.html#module-sklearn.metrics) にて実装されています. 

| 関数名                                 | 内容           | URL                                                          |
| -------------------------------------- | -------------- | ------------------------------------------------------------ |
| ``sklearn.metrics.accuracy_score()``   | 正答率の計算   | [URL](https://scikit-learn.org/stable/modules/generated/sklearn.metrics.accuracy_score.html#sklearn.metrics.accuracy_score) |
| ``sklearn.metrics.confusion_matrix()`` | 混同行列の計算 | [URL](https://scikit-learn.org/stable/modules/generated/sklearn.metrics.confusion_matrix.html#sklearn.metrics.confusion_matrix) |
| ``sklearn.metrics.precision_score()``  | 適合率の計算   | [URL](https://scikit-learn.org/stable/modules/generated/sklearn.metrics.precision_score.html#sklearn.metrics.precision_score) |
| ``sklearn.metrics.recall_score()``     | 再現率の計算   | [URL](https://scikit-learn.org/stable/modules/generated/sklearn.metrics.recall_score.html#sklearn.metrics.recall_score) |
| ``sklearn.metrics.f1_score()``         | F値の計算      | [URL](https://scikit-learn.org/stable/modules/generated/sklearn.metrics.f1_score.html#sklearn.metrics.f1_score) |

## 医学的検査の偽陽性

さて, 集団のうちおよそ1000人に1人かかる病気があると仮定します. この病気のための検査があり, その正答率(Accuracy) は95% とします. この検査は~~計算の都合より~~ 偽陰性(FN) すなわち「検査ではこの病気ではないと判定されたにも関わらず, 実はかかっていた人」は存在しないものとします. 

このとき, 適合率(Precision) すなわち「検査を受けて陽性と判定されたとき, 実際に病気にかかっている確率」を求めてみましょう.  ここで, 混同行列を参考にする際は, $\omega_1$ :陽性, $\omega_2$ :陰性 とした分類器として扱います.

---

真面目に計算をする前に少し.

正答率が95% もあるのであれば, 求める確率(適合率)も十分に高いと考える人もいるかもしれません. これは, この病気が集団の中では非常にまれであることが見落とされています. 

なぜなら, 検査で陽性と判定された人のうち, 本当はかかっていない人(FP) は5% だけといっても, そもそも病気にかかっている人(TP) はその集団の0.1% しかいないためです.

実際に数値を使うとイメージがつきやすいと思うので次に進みます.

---

では, 対象とする集団の数(検査を受けた人数) を10万人 として実際に計算してみます.

この病気にかかっている人(TP+FN) の期待値は 100人であり, 残りの9万9900人はかかっていない(TN+FP)計算になります. ここで, 偽陰性(FN) は存在しないと仮定しているため, この100人は検査で陽性と判定されます(TP). また, 9万9900人のうちの5%, つまり, 4995人が偽陽性(FP) の判定を受けることになります.

これらより, 求める確率ー適合率は
$$
\begin{eqnarray}
Precision 
&=& \frac{TP}{TP + FP} \\
&=& \frac{100}{100 + 4995} \\
&=& \frac{100}{5095} \\
&=& 0.01962...
\end{eqnarray}
$$
すなわち, **約2%**. これは確かに

 「検査はすればするほどいいわけでも, 安心できるわけでもない」

## 基準率錯誤

話の文脈から, 何となく適合率の値が低くなることは予想できたものの, ここまで低くなる想定をしていなかったため, 計算を実際にした際には少し驚きました. しかし, この計算結果から

「検査で陽性と判定されても, その病気にかかっている証拠としては無意味」

と結論付けることは早計です. なぜなら, この検査結果は病気である確率の見積もりを 0.1% から 2% へ変えたためです. これは, 20倍も確率を上げることに成功しています. そもそも病気になる確率があまりにも低かったため, これほど率が上がっても, かかっていそうだと思えないだけと考えられます.

## 補足

今回計算した仮定は, あくまで仮定であり, COVID-19 とは無関係です.(数値例は参考文献[1]の本より)

## 参考文献

[1]モンティ・ホール問題 テレビ番組から生まれた史上最も議論を呼んだ確率問題の紹介と解説
     ジェイソン・ローゼンハウス／著 松浦俊輔／訳 ISBN:9784791767526

[2]Pythonによる機械学習入門
     株式会社システム計画研究所 編／著 ISBN:9784274219634