プログラムで自己対局したときに、その対局数と勝敗の数から何%勝ちなら強くなったといえるのか。
そのような問題に統計的に答える方法として、仮説検定という方法がある。
仮説検定
仮説検定は、帰無仮設と対立仮説を設定し、帰無仮説が定めた有意水準の範囲内かにより、棄却されるか採択されるか判定する。
詳しい説明は、統計の教科書に譲るとして、対局結果から強いかの検定には以下の式で計算する。
帰無仮説 :
対立仮説 :
と設定すると、
が棄却域
にあれば、帰無仮説
は棄却され、対立仮説
が採択される。
ここで、は勝率、
は対局数で、棄却域
は、有意水準
とすると
となる。
棄却域の臨界値は、R言語を使って、
qnorm(0.05, lower.tail=FALSE)
で計算できる。
対局数がの場合、勝率
が有意であるためには、
から、
であれば有意に強いと言える。
対局数が1000回だと、
となる。
例
前回の日記で、自己対局の結果、100回対局して勝率が54%で強くなっていると判断したが、統計的には有意とは言えない。
逆に、勝率54%を有意と言うには、
から
の対局が必要になる。
勝率と必要対局数
勝率と必要対局数の関係は、以下のグラフのようになる。
※横軸は勝率で、縦軸は必要対局数(10の対数)
need_n <- function(r) { qnorm(0.05, lower.tail=FALSE)^2 * 0.5 * (1-0.5) / (r - 0.5)^2 } need_n_log10 <- function(r) { log10(need_n(r)) } plot(need_n_log10, 0.5, 1)
Pythonでグラフを描くには、以下のように実行する。
import matplotlib.pyplot as plt import numpy as np import scipy.stats x = np.linspace(0.5, 1, 100) plt.plot(x, scipy.stats.norm.ppf(0.95)**2 * 0.5 * (1 - 0.5) / (x - 0.5) ** 2) plt.yscale("log")