ベイズ推定

このページでは、ベイズ推定について復習しておく。

ベイズの公式

XYというふたつの事象の結合確率 P(X,Y)とすると、それぞれの事象の確率 P(X), P(Y)と条件付き確率 P(X|Y), P(Y|X) には (1)P(X,Y)=P(X|Y)P(Y)=P(Y|X)P(X) という関係が成り立つので、これを (2)P(Y|X)=P(X|Y)P(Y)P(X) と書き直してみる。この関係式は特に「ベイズの公式」と呼ばれている。

ここで、事象 Y が、全事象を {Y1,Y2,,Yk,} と分割したひとつとすれば 式(2)の分母は、P(X)=kP(X|Yk)P(Yk) と書けるから、ベイズの公式は (3)P(Y|X)=P(X|Y)P(Y)kP(X|Yk)P(Yk) とも書ける。

Yを「原因」、Xを「結果」と考えるとき、 結果Xについての情報を持たない状況(情報を得る「前」)のYの確率 、という意味で、P(Y)は事前確率と呼ばれる。 他方、P(Y|X)は、結果Xを得た「後」の確率という意味を込めて、事後確率と呼ぶ。

検査結果の解釈

感染症の検査(PCR検査や抗原・抗体検査)を考えてみよう。 Xを検査の結果(「陽性」がX0、「陰性」がX1)、 Yを感染の有無(「感染」がY0、「未感染」がY1)とする。 そのとき、状況は以下のように分類できる:

対象は感染している(Y0) 対象は未感染(Y1)
検査が陽性(X0) 真陽性(検査結果は正しい) 偽陽性
検査が陰性(X1) 偽陰性 真陰性(検査結果は正しい)

ここで、ある検査キットを使って、10000人分の検査を行い、さらにその結果を確認する調査を実施したところ、 それぞれに該当する人数は以下のようであったとしよう(あくまで架空の数値)。

感度(sensitivity)は罹患している人の中で検査で陽性になった人の割合、 特異度(specificity)は罹患していない人の中で検査で陰性になった人の割合を表す。

*計算に間違いがあったので修正(2021-07-06)

対象は感染している(Y0) 対象は未感染(Y1)
検査が陽性(X0) 75(感度 75.0%) 343
検査が陰性(X1) 25 9557 (特異度96.5%)

このとき、集団の中の感染者の割合P(Y)

感染している(Y0) 0.01
未感染(Y1) 0.99

となる。

これと同様な集団からひとりを検査し、陽性という判定が出された場合、実際にその人が感染している確率はどれくらいであろうか。

ベイズの公式を使うと、検査が陽性という条件のもとで、罹患している確率は、 P(Y0|X0)=P(X0|Y0)P(Y0)P(X0|Y0)P(Y0)+P(X0|Y1)P(Y1) であるから、具体的な数値を入れると P(Y0|X0)=7575+25×0.017575+25×0.01+3439557+343×0.990.18 となる。

これはやや意外な結果である。というのは、表からは、感染者に対して検査はそれなりに高い感度を持つことがわかっているのに、 陽性と判定されたからといって、実際に罹患している可能性はむしろ小さい。 その理由は、感染者の割合が小さい(事前確率が P(Y0)=0.01)ところにある。

この場合は全ての組み合わせについての人数が与えられているのだから、ベイズの定理を持ち出すまでもなく P(Y0|X0)=7575+343 と求まるが、一般には、事前確率や感度、特異性は別個のデータとして与えられるので、ベイズの定理の出番となる。

icon-pc 練習:モンティ・ホール問題

あなたはあるテレビ番組に出場し、景品を得るチャンスを得た。スタジオには3つのドア、A, B, Cが用意されており、 その中のひとつに豪華な景品が置かれている。 このとき、

  1. あなたはドアのうちひとつを選ぶことができる。
  2. 司会者は正解を知っており、あなたが選んだドア以外の、景品が置かれていないドアを開けて見せる。
  3. あなたは選択したドアを変更することもできるし、そのままとしてもよい
  4. 司会者はあなたが選択したドアを開け、そこに景品があればあなたはそれを得ることができる

上記のステップ3で、あなたは最初に選択したドアを変更したほうが良いか、あるいはそのままのするのが良いか、 確率にもとづいて考えてみなさい。

icon-hint ヒント

この問題は、モンティ・ホール問題としてよく知られているので、ネット上などにたくさんのヒントが見つかるはずである。

選択肢を変えない場合の景品獲得確率は、明らかに1/3である。 ドアを変更した場合の獲得確率をモンテカルロ・シミュレーションするコードの例を以下に示す:

# coding: utf-8
import random

ntrial=10000

n_you_win=0
for _ in range(ntrial):
    prize = random.choice(['A','B','C'])
    you_first_chose = random.choice(['A','B','C'])
    doors={'A','B','C'}
    doors.discard(prize)
    doors.discard(you_first_chose)
    monty_opened = random.choice(list(doors))
    doors={'A','B','C'}
    doors.discard(monty_opened)
    doors.discard(you_first_chose)
    you_finally_chose = doors.pop()
    if you_finally_chose==prize:
        n_you_win += 1

print("p=",n_you_win/ntrial)