フィッシャーの正確確率検定
date: 2019-10-03 excerpt: フィッシャーの正確確率検定について
フィッシャーの正確確率検定(フィッシャーの直接確率検定)について
概要
- ノンパラメトリック検定の一つで、分割表のような形で整数値しか取らない場合、適応できる
- 超幾何分布と考えられて、aの値を変数とすると、下界と上界を定義できるので、この範囲の確率を計算し、有意判定等を計算できる
数式
2×2の分割表で表される時、その確率は以下の通り
具体例
以下のようなデータがあったとする
甘い物が好き | 辛い物が好き | 合計 | |
---|---|---|---|
男性 | 2 | 6 | 8 |
女性 | 5 | 5 | 10 |
合計 | 7 | 11 | 18 |
これを男性の甘い物が好き
の部分を変数にして合計の部分が変わらないようにすると
甘い物が好き | 辛い物が好き | 合計 | |
---|---|---|---|
男性 | a | 8-a | 8 |
女性 | 7-a | 5+a | 10 |
合計 | 7 | 11 | 18 |
となる
aの範囲が0 ~ 7
まで取れるが、2
までの0
, 1
, 2
についての正確確率の和を計算する
するとP_sum = 0.0007
程度になり、男性と女性で差があるという結果になる
pythonのコード
import numpy as np
import pandas as pd
import random
from math import factorial
# [2, 6]
# [5, 5]
# 以上のようなデータがあった場合、どうなのか
a, b = [2, 6]
c, d = [5, 5]
W = a + b
X = c + d
Y = a + c
Z = b + d
N = a + b + c + d
a_init = 0
b_init = b + a
c_init = c + a
d_init = d - a
data = []
for a in range(0, 6+1):
a0 = a
b0 = b_init - a
c0 = c_init - a
d0 = d_init + a
p = (factorial(W) * factorial(X) * factorial(Y) * factorial(Z)) / ( factorial(n) * factorial(a0) * factorial(b0) * factorial(c0) * factorial(d0) )
data.append((a0, b0, c0, d0, p))
df = pd.DataFrame(data)
df.columns = ["a", "b", "c", "d", "p"]
display(df)
display(df.query('a <= 2')["p"].sum())