技術メモ

役に立てる技術的な何か、時々自分用の覚書。幅広く色々なことに興味があります。

pythonで符号検定、ウィルコクソンの符号付き順位検定

符号検定

符号検定とは、勝ち負けなど〇×の判定で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()

f:id:swdrsker:20170307053459p:plain:w500
これを見ると、
「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

のように取り出す

補足2:勝率の信頼区間を求めたい

「将棋ソフトAに対するソフトBの勝率を信頼区間を含めて知りたい」というとき、
二項分布の正規近似を使う。
二項分布は試行回数を大きくしていけば正規分布のような形になる。
二項分布の極限が正規分布になることの証明【正規近似の証明】 - 技術メモ

二項分布B(n,p)nを十分に大きくしていけば平均np、分散np(1-p)正規分布に近づく。

勝率ベースに直せば、平均p、分散\frac{p(1-p)}{n}ということ。
例えば、勝率55%で試行回数300回の時、平均は0.55標準偏差は0.029なので、
95%信頼区間付きで表すなら勝率は55.0%(±5.7%)となる。

(上の例と同じこと(n=300,p=0.55の時p>0.5を検定)を正規近似でやると、確かに95.7%となる。)


参考サイト:
scipy.stats.binom_test — SciPy v0.14.0 Reference Guide
scipy.stats.wilcoxon — SciPy v0.14.0 Reference Guide
二項分布の正規近似(ラプラスの定理) | 高校数学の美しい物語



関連:
swdrsker.hatenablog.com