• home
  • about
  • 全ての投稿
  • ソフトウェア・ハードウェアの設定のまとめ
  • 分析関連のまとめ
  • ヘルスケア関連のまとめ
  • 生涯学習関連のまとめ

フィッシャーの正確確率検定

date: 2019-10-03 excerpt: フィッシャーの正確確率検定について

tag: statisticsフィッシャーの正確確率検定フィッシャーの直接確率検定nonparametric


フィッシャーの正確確率検定(フィッシャーの直接確率検定)について

概要

  • ノンパラメトリック検定の一つで、分割表のような形で整数値しか取らない場合、適応できる
  • 超幾何分布と考えられて、aの値を変数とすると、下界と上界を定義できるので、この範囲の確率を計算し、有意判定等を計算できる

数式

2×2の分割表で表される時、その確率は以下の通り

\[p = \frac{(a+b)!(b+c)!(c+d)!(d+a)!}{N!a!b!c!d!}\]

具体例

以下のようなデータがあったとする

  甘い物が好き 辛い物が好き 合計
男性 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())

google colab

  • colab

参考

  • フィッシャーの直接確率法の考え方と計算方法
  • フィッシャーの直接確率検定
  • フィッシャーの正確確率検定


statisticsフィッシャーの正確確率検定フィッシャーの直接確率検定nonparametric Share Tweet