符号検定
符号検定とは、勝ち負けなど〇×の判定で2つの群の優劣を判定する検定のこと。
「将棋ソフト同士を対決させて、試合の勝敗だけでソフトの強さを比較したい」等に使える。
scipyを使う
from scipy import stats
stats.binom_test(x, n=None, p=0.5, alternative='two-sided')
x=勝利回数、n=試合回数
あるいは
x = [勝利回数, 敗北回数] (n=None)
のように記述する。
alternativeは片側検定("greater", "less") か両側検定("two-sided") か。
結果はfloatで採択する確率が返ってくる。
「一方が55%の勝率をあげていた時、何試合をすればどれくらいの確率で強さに差があると言えるか」
について検定してみる。
強さに差があるというのはすなわち、どちらかが勝つ(負ける)確率pが0.5ではないということである。
したがって、p=0.5を棄却する確率を片側検定で求めることになる。
import numpy as np
import matplotlib.pyplot as plt
from scipy import stats
win_rate = 0.55
ns = range(10,800,20)
xs = [int(i * win_rate) for i in ns]
results = []
for x, n in zip(xs, ns):
result = stats.binom_test(x,n, p=0.5,alternative="greater")
results.append(1-result)
plt.plot(ns, results)
plt.show()
これを見ると、
「55%の勝率をあげている方が強いと95%の確からしさで言うには、約300回の試合数が必要である」
ということがわかる。
補足:Wilcoxonの符号付き順位検定
符号検定では試合の勝敗のように〇×で表すものだったが、連続値で比較する基準がある場合Wilcoxonの符号付順位検定を用いる。
「何人かの患者に睡眠薬の新薬を飲ませて、どれだけ睡眠時間が変化したかで効果の有無を確かめたい」等に使える。
from scipy import stats
stats.wilcoxon(x, y=None, zero_method='wilcox', correction=False)
x,yは対応のある2組の値と見なされる。
y=Noneの時は、xはペアの差分と見なされる。
zero_methodには"pratt","wilcox","zsplit"がある。
"pratt":差が0である場合を許す検定
"wilcox":差が0である場合を無視する検定
"zsplit": 差分の正負しか見ない検定(符号検定と同じ?)
correctionは連続値補正をかけるか否か。デフォルトではFalse
結果のp値は
result = stats.wilcoxon(x, y=None, zero_method='wilcox', correction=False)
result.pvalue
のように取り出す