03.3.7 高校生向け
感度・特異度(高校生向け)
こんな場面を想像してみよう #
インフルエンザの簡易検査キットの箱に「感度 90%、特異度 95%」と書いてあります。学校で 1,000 人が検査を受け、そのうち本当に感染している人が 100 人だとすると、結果はどんな表になるでしょうか。
| 検査:陽性 | 検査:陰性 | 行の合計 | |
|---|---|---|---|
| 実際:感染している(100 人) | 90(真陽性) | 10(見逃し) | 100 |
| 実際:感染していない(900 人) | 45(誤報) | 855(真陰性) | 900 |
感度 90% は上の行の話で、感染者 100 人のうち 90 人が陽性と出て、見逃しは 10 人です。特異度 95% は下の行の話で、非感染者 900 人のうち 855 人が陰性と出て、誤報は 45 人です。
$$ \text{感度} = \frac{90}{90 + 10} = 0.90, \qquad \text{特異度} = \frac{855}{855 + 45} = 0.95 $$ここでクイズです。陽性と出た 135 人が本当に感染している確率はいくつでしょう。陽性と出たのは左の列の 90 + 45 = 135 人で、そのうち感染者は 90 人。だから 90/135 ≒ 0.67 です。感度 0.90 とはまったく別の数で、こちらは「列」で割っています。行で割る(感度 0.90・特異度 0.95)か列で割る(陽性者のうち本物の割合 0.67)かを混ぜないのが、この単元のいちばん大事な点です。
仕組み:線を動かすと 2 つの割合が逆に動く #
検査キットは、体の中のウイルス量のようなものを測り、ある基準の線(カットオフ)を超えたら陽性と出します。機械学習のモデルも同じで、「陽性らしさ」の点数に線を引きます。
まず、横軸に点数をとると、感染者の点数は右寄りの山、非感染者の点数は左寄りの山になり、2 つの山は少し重なっています。次に線を 1 本引き、線より右を陽性、左を陰性と判定します。右側にある感染者の山の面積が感度 0.90、左側にある非感染者の山の面積が特異度 0.95 に当たります。線を左へ動かす(基準をゆるくする)と、感染者の山はほぼ全部が右側に入って感度は 1 に近づきますが、非感染者の山も右側にはみ出して特異度は 0.95 から下がります。表では見逃しの 10 人が減り、誤報の 45 人が増える動きです。線を右へ動かす(基準をきびしくする)と、今度は特異度が 1 に近づいて感度が下がります。最後にバランスを 1 つの数で見るなら、感度 + 特異度 − 1(Youden 指数)が最大になる線が 2 つの山をいちばんうまく分ける位置で、上の例では 0.90 + 0.95 − 1 = 0.85 です。
動かして見てみよう #
下の図で「再生」を押すと、説明した手順が 1 つずつ進みます。手順ごとの説明は図の下に出ます。
気をつけたいこと #
最初の注意は、感度と「陽性者が感染している確率」を混同しないことです。感度 90% でも、感染者が 1,000 人に 10 人しかいない集団では、陽性と出た人の多くは誤報になります。4 マスの表を書いて列で割り直す習慣を付けてください。二つ目は、感度と特異度のどちらを優先するかは「間違いの痛さ」で決まることです。重い病気のスクリーニングでは見逃しが致命的なので感度を優先し、陽性なら精密検査に回します。逆に「陽性なら手術」のような重い処置につながる検査では、誤報を避けるために特異度を優先します。三つ目は、感度・特異度は集団の感染率に左右されないが、「陽性と出た」ことの意味は左右されることです。同じキットでも、流行期と平常時では陽性と出たときの重みが変わります。
やってみよう #
最初の課題は、上の例で、感染者が 1,000 人中 10 人しかいない集団に同じキット(感度 90%、特異度 95%)を使ったときの 4 マスの表を作り、陽性と出た人が感染している確率を計算することです。二つ目は、基準をゆるくして見逃しを 10 人から 2 人に減らしたら誤報が 45 人から 150 人に増えたとして、感度・特異度・Youden 指数を計算し直すことです。三つ目は、「感度を優先したい検査」と「特異度を優先したい検査」を身の回りから 1 つずつ探し、理由を説明することです(例:空港の手荷物検査、スマホの顔認証)。
つぎに読む #
Python での計算、ROC 曲線としきい値の関係は 標準版の感度と特異度 で扱っています。4 マスの表の読み方は 混同行列(高校生向け)、感度と同じ「再現率」を誤報側の「適合率」と組にした見方は 適合率・再現率(高校生向け) へ。指標の一覧は 分類の評価指標 にまとめています。