フィッシャーの正確検定(Fisher’s exact test)とは

フィッシャーの正確検定(Fisher’s exact test)は、フィッシャーの直接確率法とも呼ばれるもので、2x2の分割表が得られたときに有意差があるかないかを調べるときに使われます。χ2乗検定も同じ目的で使われますが、違いはデータの個数が少ないかどうかです。データの数値が5以下のものがあるときにはχ2乗検定ではなく、フィッシャーの正確検定が用いられます。データが多いと、フィッシャーの正確検定は計算に時間がかかること、データが多いと、χ2乗検定の正確さが増すことから、このようにデータの数によって使い分けます。

ウェブリオのフィッシャーの正確確率検定(直接確率)は、具体的に全部を示していてわかりやすい。そのほか、フィッシャーの正確検定のわかりやすい説明は、ウィキペディアにもあります。

フィッシャーは、そのためには小計が観測値と同じになるような場合だけを考慮すればよいことを示した。(フィッシャーの正確検定 ウィキペディア

Fisherの正確検定(oku.edu.mie-u.ac.jp)のウェブページも、わかりやすい説明の仕方でお勧め。

  1. フィッシャーの直接確率検定 データ科学便覧

実際に自分で計算してみたほうが、理解しやすいと思ってpythonで計算してみます。答え合わせが出来たほうがいいので、準1級対応統計学実践ワークブック264ページ例1の数字を使います。

コードは、

from scipy.special import comb

n_row1=7#新薬Aを処方した実験群 7人
n_row2=7#既存薬Bを処方した対照群 7人
n_col1=9#病気が治癒した人 9人
n_col2=5#病気が治らなかった人 5人
n_total=n_row1+n_row2#総数14人

def probability(a):

#変数は一つaしか自由に動かせない。aが決まると他の値b,c,dは一意に決まる。
b=n_row1-a
c=n_col1-a
d=n_row2-(n_col1-a)

data = [[a,b,n_row1], [c,d,n_row2], [n_col1,n_col2,n_total]]
p=comb(n_row1,a)*comb(n_row2,c)/comb(n_total,n_col1)

return data, p

P=0#初期値
for x in range(0,n_row1+1):#0からn_row1まで、全てについて起こる確率を調べて、極端な例(x>=a)が起こる確率を足し合わせる。
df,p = probability(x)
print(“p=”,round(p,4), df)
if x>=a:#片側検定
P=P+p
print(“P=”,round(P,3))#

#データの値がマイナスになるのはありえない。小計の小さいほうの値より大きな値は取れない。

実行した結果は、

となりました。人数がマイナスになるのはあり得ないので、そこは外して考えます。 [[6, 1, 7], [3, 4, 7], [9, 5, 14]]の分割表になる確率はそもそも0.05を超えていました。この確率0.1224よりも稀にしか起こらない確率を足し合わせると0.05を超えますので、有意差はないという結論になりました。つまり新薬Aが既存薬Bよりも優れているとは言えないということです。

pythonだと、コードを書かなくてもフィッシャーの正確検定を行う関数が用意されています。

from scipy.stats import fisher_exact

table=[[6,1],[3,4]]
oddsr, p = fisher_exact(table, alternative=’greater’)
p

出力結果は、

となり、コードで計算したものと一致しました。用意されている関数を使えば簡単なのですが、引数や返り値の意味がわからないことがあります。自分でコードを書いて、中身を理解するように努めると、そのような疑問が解けることが多いです。

 

キーワード:フィッシャー 正確検定 エクセル フィッシャー 正確検定 フィッシャーの正確検定 多重比較 フィッシャーの正確検定 計算 フィッシャーの正確検定 意味 フィッシャーの正確検定 式 フィッシャーの正確検定 両側 フィッシャーの正確検定 エクセル フィッシャーの正確検定 カイ二乗検定 フィッシャーの正確検定 r フィッシャーの正確検定 直接確率計算 フィッシャー フィッシャー 直接確率法 フィッシャー 直接確率 フィッシャー 直接確率検定