「精度99%の検査で陽性」でも病気の確率は50%——ベイズの定理を手を動かして理解する【第2回】

はじめに

前回から、統計検定準1級の勉強を生成AIと一緒にやり直す連載を始めました。今回は第1章「事象と確率」から、ベイズの定理を扱います。

方針は前回宣言した通りです。定義や数式から入らず、「何に使うのか」から始めます。 そしてAIの説明をそのまま信じず、自分で計算して確かめます。

なお筆者は統計の専門家ではありません。理解の誤りが含まれる可能性があるため、試験対策として読む場合は必ず公式テキストで確認してください。

TL;DR

  • 精度99%の検査で陽性でも、**病気である確率は50%**しかない(有病率1%の場合)
  • 答えを支配していたのは検査の性能ではなく**「検査前の確率」**だった
  • 感度を半分にしても答えは50%→34%しか変わらないが、特異度を0.9ポイント上げると91%に跳ね上がる
  • 同じ構造がA/Bテストにもあり、「p<0.05で有意」の半分が偽陽性になりうる
  • ベイズの定理の正体は「情報を1つ得るたびに確率を書き換える手続き」

統計の用語が出てくるので、先に用語集を置いておきます。用語を知っている方は「こういう困りごとから始まる」まで飛ばしてください。

用語集

この記事に出てくる統計用語をまとめておきます。すべて後で具体例つきで説明するので、いま覚える必要はありません。 読んでいて「これ何だっけ」となったらここに戻ってください。

検査の性能を表す言葉

用語意味覚え方
感度病気の人を、正しく「陽性」と判定できる率病気を見逃さない
特異度健康な人を、正しく「陰性」と判定できる率健康な人を間違って陽性にしない
偽陽性健康なのに「陽性」と出てしまうこと特異度が低いと増える
見逃し(偽陰性)病気なのに「陰性」と出てしまうこと感度が低いと増える

感度99%なら「病気の人100人を検査すると99人が陽性になる」、特異度99%なら「健康な人100人を検査すると99人が陰性になる(1人は誤って陽性になる)」という意味です。

なお「精度99%の検査」という表現はこの2つをまとめて言っており、本記事の主題はまさにこの雑なまとめ方が誤解を生むという話です。

確率の更新に関する言葉

用語意味この記事での例
有病率集団全体のうち、その病気の人の割合1%(1万人なら100人)
事前確率情報を得るの、確率の見積もり検査を受ける前は1%
事後確率情報を得たに、更新された確率陽性と分かった後は50%
尤度(ゆうど)その状態のとき、その結果が出る確率病気なら陽性になる確率=感度99%

注意:「尤度=感度」ではありません。 この記事では「陽性だった」ケースを扱うので尤度が感度と一致しますが、これは偶然そうなっているだけです。尤度は**「原因を仮定したときの、結果の出やすさ」という役割の名前**で、感度はその具体例のひとつに過ぎません。

観測された結果が変われば、尤度の中身も変わります。

観測結果病気のときの尤度健康のときの尤度
陽性だった感度(99%)1−特異度(1%)
陰性だった1−感度(1%)特異度(99%)

「陰性だった人が病気である確率」を計算するなら、使う尤度は感度ではなく 1−感度 の1%になります。

さらに重要なのは、ベイズの式の分母にも尤度が入っていることです。

P(病気陽性)=感度尤度×有病率感度尤度×有病率+(1特異度)これも尤度×(1有病率)P(\text{病気} \mid \text{陽性}) = \frac{\overbrace{\text{感度}}^{\text{尤度}} \times \text{有病率}}{\underbrace{\text{感度}}_{\text{尤度}} \times \text{有病率} + \underbrace{(1-\text{特異度})}_{\text{これも尤度}} \times (1-\text{有病率})}

分子の尤度は感度ですが、分母の第2項の尤度は 1特異度1-\text{特異度} です。感度と特異度の両方が尤度として登場しているので、「尤度=感度」と覚えると分母のほうを見落とします。

この違いは後の章で効いてきます。第8章の最尤推定では、尤度を母数 θ\theta の関数 L(θ)=f(データθ)L(\theta) = f(\text{データ} \mid \theta) として扱い、θ\theta を動かして「観測データが最も出やすい θ\theta」を探します。このとき尤度は固定値ではなく関数です。

A/Bテストの用語(後半で使います)

用語意味
CVRConversion Rate。訪問者のうち購入・登録などに至った割合
有意差/有意「偶然では説明しづらいほどの差」と判定されること
p値効果がないと仮定したとき、これほどの差が偶然出る確率
有意水準 α「偶然ではない」と判定する基準。通常5%(p<0.05)
検出力本当に効果があるとき、それを有意と判定できる確率。通常80%を目標にする

医療の検査とA/Bテストは、実は同じ構造をしています。感度が検出力に、偽陽性率(1−特異度)が有意水準αに対応します。この対応は記事の後半で詳しく扱います。

こういう困りごとから始まる

検査で陽性が出た。この検査は精度99%だという。 ——では、自分が本当に病気である確率は何%だろうか?

直感的には「99%くらいだろう」と答えたくなります。実際にはそうなりません。

1万人並べると、答えが目に見える

有病率1%の病気を、感度99%・特異度99%の検査で1万人に実施したと考えます。感度は「病気の人を正しく陽性と判定する率」、特異度は「健康な人を正しく陰性と判定する率」です。

1万人を検査したときの内訳と、陽性者198人の構成。陽性者のうち本当に病気なのは半分だけ

区分人数内訳
病気の人100人1万人の1%
 うち陽性(正しく検出)99人100人の99%
 うち陰性(見逃し)1人
健康な人9,900人
 うち陽性(偽陽性99人9,900人の1%
 うち陰性(正しく除外)9,801人

ここが肝心です。検査の間違いはたった1%ですが、健康な人が9,900人もいるので、その1%だけで99人の偽陽性が生まれます。一方、本当に病気で陽性になるのは99人。母数の大きさが効いて、両者が同じ人数になってしまう。

だから陽性者198人のうち本当に病気なのは99人。**50%**です。

答えを決めていたのは「検査前の確率」

ここが本質でした。同じ検査を使っても、答えは検査を受ける前にどれくらい病気らしいかで激変します。

検査前の確率と陽性的中率の関係。同じ検査でも1%から99%まで変わる

検査前の状況事前確率陽性なら病気の確率
希少疾患を無症状で検査0.01%1.0%
先ほどの例1%50.0%
強い症状があって受診50%99.0%

検査の性能は3つとも同じです。変わったのは事前の見込みだけ。

これがベイズの定理の使いどころです。 ベイズの定理は「検査結果」という新しい情報を使って、もともと持っていた見込み(事前確率)を更新する道具でした。

「症状があると50%」はどこから来るのか

この説明をAIとやり取りしながら書いていて、自分でも詰まった箇所があります。「強い症状があれば事前確率50%」と言われても、なぜ50%なのかが分かりませんでした。

答えは、症状も一つの検査として扱えばいいというものでした。検査に感度と特異度があるように、症状にも同じものが定義できます。

検査の場合症状の場合
感度病気の人が陽性になる率病気の人にその症状が出る率
特異度健康な人が陰性になる率健康な人にその症状が出ない率

こう置けば、まったく同じ式で計算できます。「病気の人の70%に出る/健康な人でも1%に出る」症状で計算してみます。

症状で絞り込むと病気の割合が1%から41.4%に上がる

病気10万人のうち7万人に症状が出る(感度70%)。健康990万人のうち9.9万人に症状が出る(特異度99%)。症状を訴えて受診するのは合計16.9万人で、そのうち病気は7万人。つまり**41.4%**です。

面白いのは、症状が「ありふれているか」で結果が激変する点でした。

症状の種類感度特異度症状ありなら病気
発熱など、ありふれた症状80%90.00%7.5%
やや特徴的な症状70%97.00%19.1%
かなり特徴的な症状70%99.00%41.4%
その病気に特有の症状60%99.90%85.8%

発熱のように健康な人の10%にも出る症状だと、症状があっても病気の確率は7.5%しか上がりません。逆に健康な人の0.1%にしか出ない特有の症状なら85.8%まで跳ね上がる。

ベイズ更新は何度でも重ねられる

そして症状で更新した確率を出発点にして、さらに検査結果で更新できます。

症状と検査による2段階のベイズ更新。症状が特徴的なほど最終的な確率が高い

症状の種類症状での更新後さらに検査陽性なら
ありふれた症状7.5%88.9%
かなり特徴的な症状41.4%98.6%
その病気に特有の症状85.8%99.8%
(症状なしで集団検診)1%50.0%

症状がある人の陽性は88.9%〜99.8%、症状のない人の陽性は50%。同じ検査・同じ「陽性」でも意味がまるで違うのは、この事前確率の差が原因でした。

医師が症状を詳しく聞くのは、この1段目のベイズ更新をやっているのだと理解できます。

パラメータを1つずつ動かしてみた

50%という答えは3つのパラメータの組み合わせで決まっています。1つずつ動かして計算しました。

有病率・特異度・感度をそれぞれ動かしたときの影響比較

意外だったのは感度がほとんど効かないこと

感度陽性なら病気の確率見逃し(1万人中)
50%33.6%50人
70%41.4%30人
90%47.6%10人
99%50.0%1人
100%50.3%0人

感度を99%から50%へ半減させても、答えは50%→34%しか下がりません。 感度100%でも50.3%で、ほぼ改善しない。

理由は、感度が動かすのは分子(真陽性99人→50人)だけで、偽陽性99人には一切影響しないからです。一方で感度を下げると見逃しは1人から50人へ激増します。つまり感度は「陽性の信頼度」ではなく「見逃さない力」を決めるパラメータで、役割がまったく違う。

対照的に特異度は劇的に効く

特異度偽陽性率陽性なら病気の確率真陽性 : 偽陽性
90.00%10.00%9.1%99 : 990
99.00%1.00%50.0%99 : 99
99.90%0.10%90.9%99 : 9.9
99.99%0.01%99.0%99 : 1

特異度を99%から99.9%へ、わずか0.9ポイント上げるだけで50%が91%に跳ね上がります。真陽性99人は一切変わらず、偽陽性だけが990人から9.9人まで動くためです。

「精度99%の検査」という言い方が誤解を招くのは、感度と特異度という別物をひとまとめにしている点と、最も効く事前確率が式に含まれていない点の2つが理由でした。

数式は、この操作を書き写しただけ

ここまでの計算を式にすると、こうなります。

P(病気陽性)=P(陽性病気)×P(病気)P(陽性)P(\text{病気} \mid \text{陽性}) = \frac{P(\text{陽性} \mid \text{病気}) \times P(\text{病気})}{P(\text{陽性})}

数字を当てはめます。

  • 分子:病気で陽性になる割合 = 0.99 × 0.01 = 0.0099(1万人なら99人)
  • 分母:陽性になる人すべて = 0.0099 + 0.01 × 0.99 = 0.0198(198人)
  • 割る:0.0099 ÷ 0.0198 = 0.550%

分母の P(陽性) が「病気の人の陽性 + 健康な人の偽陽性」の合計で、先ほど198人を数えた操作そのものです。式が先にあるのではなく、人数を数える作業に名前を付けたものが定理だと捉えると見通しがよくなりました。

本当にそうなるのか、200万人ぶん試す

理屈は通っていても、実際にそうなるかは別の話です。乱数で200万人を検査して確かめました。

import numpy as np

rng = np.random.default_rng(0)
prev, sens, spec = 0.01, 0.99, 0.99

N = 2_000_000
sick = rng.random(N) < prev                      # 誰が病気か
pos = np.where(sick,
               rng.random(N) < sens,             # 病気なら感度で陽性
               rng.random(N) < (1 - spec))       # 健康なら偽陽性率で陽性

# 陽性だった人のうち、本当に病気だった割合
print(sick[pos].mean())   # → 0.5000

シミュレーションによる検証。陽性者が増えるにつれ実測値が理論値50%に収束する

陽性者39,491人での実測値は50.00%。理論値と小数4桁まで一致しました。

この検証で分かったのは、数式を暗記していなくても答えが出せるということです。状況をシミュレートすれば同じ数字にたどり着く。逆に言えば、定理は「毎回200万人試さなくても答えが出せるようにした近道」でした。

「逆確率」の逆とは何か

ここで一つ、自分の理解が間違っていた点があります。私はベイズの定理を「事後確率から事前確率を求めるもの」と記憶していました。これは向きが逆でした。

ベイズの定理の計算方向と、「逆」と呼ばれる本当の意味

計算は事前確率 →(情報)→ 事後確率の方向に進みます。事後確率が求めるもので、事前確率は出発点として与えるものです。

では「逆」とは何なのか。ベイズの定理は歴史的に「逆確率の法則」と呼ばれていましたが、この逆は条件と結果の逆という意味でした。

確率意味
わかるのはP(陽性病気)P(\text{陽性} \mid \text{病気})99%病気を条件とした陽性の確率
知りたいのはP(病気陽性)P(\text{病気} \mid \text{陽性})50%陽性を条件とした病気の確率

この2つは条件と結果が入れ替わっており、値もまったく違います。

なぜ入れ替えが必要かというと、医学研究で測定できるのは前者だけだからです。病気だとわかっている人を集めて検査すれば測れる。しかし患者が知りたいのは後者。測れる方向と知りたい方向が反対なので、変換が必要になる。これがベイズの定理の存在理由でした。

A/Bテストに置き換えると、実務の話になる

ここまでは医療の例でしたが、同じ構造がA/Bテストにあります。ITの仕事をしている人にはこちらのほうが刺さるはずです。

医療診断A/Bテスト
病気である施策が本当に効果を持つ
検査が陽性有意差が出た(p<0.05)
有病率(事前確率)その施策が効く見込み=仮説の質
感度検出力(効果があるとき有意にできる率)
偽陽性率(1−特異度)有意水準 α(効果がないのに有意になる率)
陽性なら病気の確率有意なら本物である確率

ここで気づくことがあります。A/Bテストで管理しているのはαと検出力ですが、最も結果を左右する事前確率——その仮説がもともとどれくらい当たりそうか——は、どこにも入力していません

100件テストしたら何件が本物か

業界標準の設定(α=5%・検出力80%)で100件のA/Bテストを回したと考えます。

A/Bテスト100件の内訳。仮説の質によって偽陽性の割合が変わる

仮説の当たる確率「有意」が本物である確率真の発見偽の発見
2%24.6%1.6件4.9件
5%45.7%4.0件4.8件
10%64.0%8.0件4.5件
30%88.7%26.4件3.4件
50%94.1%40.0件2.5件

思いつきレベルの施策(当たる確率5%)を100件テストすると、有意になるのは約9件。そのうち半分以上が偽陽性です。「p<0.05だから効果あり」と判断した施策の半分が、実際には効果ゼロということになります。

一方、事前に分析して仮説を絞れば(30%)、有意なもののうち88.7%が本物になる。統計的手法は何も変えていません。仮説の質だけが違います。

改善策の効き方も医療と同じだった

事前確率10%の場合で計算しました。

やること変化
検出力を80%→100%に上げる(サンプル数を増やす)64.0% → 69.0%(+5pt)
有意水準を5%→1%に厳しくする64.0% → 89.9%(+26pt)

医療診断のときと同じ結論です。検出力(=感度)はあまり効かず、有意水準(=偽陽性率)が大きく効く。理由も同じで、検出力は真の発見の数しか動かさないのに対し、αは偽陽性の数を直接動かすからでした。

多重比較という落とし穴

実務でよくある「とりあえず全指標を見て、有意になったものを報告する」という運用が何をしているか計算しました。

指標を増やすほど「何かが有意」になる確率が上がる

効果がまったくない施策でも、指標を10個見れば40%、20個見れば64%の確率で「どれかが有意」になります。

これは実質的にαを引き上げているのと同じです。10指標を同時に見る運用は α=40% で検定しているのと変わらず、事前確率5%と組み合わせると**「有意」が本物である確率は9.5%まで落ちます**。10件の「発見」を報告して1件しか本物がない状態です。

事前確率が低いと「価値がない」のか

ここで疑問が出ました。事前確率が低いと有意でも確信が持てないなら、そういう施策のテストは無意味なのでは、と。

計算してみると、**答えは「無意味ではない。1回では足りないだけ」**でした。

確率ではなくオッズ(確率÷(1−確率))で書くと、ベイズの定理は掛け算になります。

事後オッズ=事前オッズ×検出力α\text{事後オッズ} = \text{事前オッズ} \times \frac{\text{検出力}}{\alpha}

この設定なら 0.8 ÷ 0.05 = 16倍。そして重要なのは、この16倍は事前確率が何%でも変わらないことです。検定そのものが持つ「証拠を出す力」は事前確率と無関係に一定でした。

つまり事前確率が低いときに足りないのは検定の性能ではなく証拠の量です。

有意にならなかった場合も情報になっている

事前確率有意だった場合有意でなかった場合
5%45.7%1.1%
10%64.0%2.3%
30%87.3%8.3%

事前5%のケースを見てください。有意なら45.7%ですが、有意でなければ1.1%まで下がります。つまり「この施策はほぼ効果がない」と自信を持って却下できる。

事前確率が低い検定は、本物を見つけるより偽物を捨てるのに向いているわけです。実務のリソース配分では、こちらのほうが重要な場面も多いはずです。

そして証拠は積み重ねられる

繰り返し検定による確率の上昇。事前5%でも2回有意なら93%に達する

事前5%の施策でも、2回続けて有意なら93.1%、3回なら99.5%。低い事前確率は追試で乗り越えられます。

ただしこれには独立なテストであることという前提があります。ここは自分が引っかかった点なので書いておきます。同じ期間・同じ実装のデータを2つに分割しただけでは、独立な2つの情報ではなく1つの情報を分割しただけです。それは「まとめて1つのテスト」と解釈するのが正しく、証拠は積み上がりません。

時期や条件を変えて再現したときに初めて、新しい情報として積み上がる。A/Bテストでは独立性は自動的には手に入らず、意識して設計するものでした。

p値の誤解もここで解ける

最後に、この回で一番すっきりした点です。

「p=0.03」が意味するのは P(このデータ効果なし)P(\text{このデータ} \mid \text{効果なし}) であって、P(効果なしこのデータ)P(\text{効果なし} \mid \text{このデータ}) ではありません。まさに「条件と結果が逆」という話がそのまま当てはまります。

p値が答えているのは「効果がないと仮定したら、こんなデータが出る確率」。私たちが知りたいのは「こんなデータが出たから、効果がある確率」。この変換にはベイズの定理と事前確率が必要で、p値だけでは埋まりません

だから「p=0.03なので97%の確率で効果がある」という言い方は誤りです。正しくは「効果がないと仮定すると、これほどの差が出るのは3%の確率」になります。

この章で押さえること

冒頭の用語集に挙げた言葉は、結局すべて一つの流れの中に収まりました。

事前確率(1%) ──[尤度で重みづけ]──→ 事後確率(50%)

              新しい情報(陽性だった)
              このとき尤度は 感度99% と 1−特異度1% の2つ

そして今回いちばんの収穫は、ベイズの定理の正体が「情報を1つ得るたびに確率を書き換える手続き」だったと分かったことです。

ワークブック第1章では条件付き確率とベイズの定理が数式で並んでいるだけですが、その裏にはこの手続きがありました。第31章のベイズ法は、これを連続量(分布)に対して行う話になります。

第1章(今回)第31章(ベイズ法)
事前有病率 1%事前分布 π(θ)\pi(\theta)
尤度感度 99%尤度 f(xθ)f(x \mid \theta)
事後50%事後分布 π(θx)\pi(\theta \mid x)

構造はまったく同じで、点の確率が分布に変わるだけです。

AIを使ってみた感想

今回の勉強でAIに助けられたのは、「何に使うのか」を言い換えてもらう部分でした。「症状も検査として扱えばいい」という発想や、A/Bテストへの置き換えは、自分だけでは思いつかなかったと思います。

一方で、AIの説明をそのまま受け取らずに検算したのも役に立ちました。「症状があれば事前確率50%」という説明は、実はもっともらしい設定で計算すると41.4%であって、50%は都合よく置いた数字でした。こういうところは自分で計算しないと気づけません。

前回宣言した「AIの説明をそのまま記事に載せない。必ず自分で計算して確かめる」というルールは、続けていく価値がありそうです。

次回

第3回は第3章「分布の特性値」から。期待値・分散・歪度あたりを扱う予定です。

今回も途中で「分散って2乗の期待値と期待値の2乗の差だっけ?」と怪しくなったので、そのあたりも含めて手を動かしながら整理します。


この連載は、うまくいった記録だけでなく詰まった箇所も含めて書いています。同じく準1級を目指している方、一度挫折した方の参考になれば嬉しいです。