walkingsdbgの日記

データ分析技術(機械学習・統計等)についてのメモを書きます。

統計的仮説検定によるウマ娘のトレーニング失敗率の妥当性検証


はじめに

 スマートフォン/PCアプリ「ウマ娘 プリティダービー」が配信されてからはや半年弱。多くのトレーナーがウマ娘の育成に力を注いでいると思います。ところで、ウマ娘のトレーニングの失敗率が、表記の数値より高いと感じたことはありませんか?(失敗率が数%でも普通に失敗したり...)この失敗率の検証について、既に他のトレーナーの方がYoutubeに動画を公開されたりしています。しかし、検証結果の信頼性を統計的に評価したものは私が見た限りではありませんでした。そこで、本記事では「トレーニング失敗率が表記の数値より高いか」を統計的仮説検定を用いて検証します。

無残にもトレーニングで散るウマ娘

検証方法

統計的仮説検定とは

 統計的仮説検定とは、その名の通り、確率的な出来事に対する仮説をデータに基づいて検証する方法のことです。例えば、コイントスを10回行って10回とも表が出た場合、このコインはどこかおかしいと考える方が多いと思います。これは、以下のように推論した結果と考えることができます。

  1. コインが普通のコイン(表・裏が出る確率がそれぞれ50%)と仮定する
  2. コイントスを10回行った結果、10回とも表という結果が得られた
  3. 表が出る確率が50%と仮定すると、この結果は極めて起こりにくいため、この仮定が間違っている(コインがおかしい)と考える

このように、仮説の下で期待される結果(例:表裏が5回ずつ出る)と観測結果(表が10回出る)との差が、単に偶然によるものなのか、それとも仮説が誤っているのかを確率に基づいて判断する方法が統計的仮説検定です。

2種類の誤り

 上記の例題のように、統計的仮説検定では、観測結果に基づいて2種類の仮説のどちらかを採用します。初めに立てる仮説(例:コインが普通)を帰無仮説と呼び、帰無仮説と対立する仮説(例:コインがおかしい)を対立仮説と呼びます。統計的仮説検定には、どちらの仮説を採用するかによって2種類の誤りを犯すリスクがあります。1つは、帰無仮説が正しいのに対立仮説を採用してしまう誤りで、もう一つは、対立仮説が正しいのに帰無仮説を採用してしまう誤りです。1つ目の誤りを第1種の過誤、2つ目の誤りを第2種の過誤と呼びます。統計的仮説検定では、これらの誤りを犯す確率を閾値以下に抑えるように仮説の採用基準を定めることで、正しい仮説を高い確率で採用することが可能です。

正しい仮説
帰無仮説 対立仮説
採用する仮説 帰無仮説 ×(第2種の過誤)
対立仮説 ×(第1種の過誤)

仮説の採用基準

 それでは、仮説の採用基準をどのように定めればよいでしょうか?ここからは、ウマ娘の失敗率検証に絞って話を進めます。コイントスの例と同様に考えると、例えば「失敗率10%のトレーニングを100回行い、20回以上トレーニングに失敗すれば、失敗率の表記がおかしい」のように定めることができます。しかし、第1種の過誤・第2種の過誤を閾値(例:10%)以下に抑えるために、トレーニングの回数・失敗数の閾値を何回にすればよいかは自明ではありません。そこで、以下では第1種の過誤・第2種の過誤の確率とトレーニング回数等との関係式を求め、その関係式から逆算して、トレーニング回数等を設定します。

※ここからは、第1種の過誤・第2種の過誤の確率計算のために技術的な話が多くなるため、結果のみに関心がある方は「データの収集方法」までスキップして差し支えありません。

第1種の過誤の確率

 本節では、第1種の過誤の確率を求めます。そのために、まずトレーニングの失敗回数が従う確率分布を設定します。トレーニング回数をn、失敗回数をx、失敗率をpとするとき、失敗回数xは以下の二項分布に従うと仮定します。


 \displaystyle p(x) = nCxp^x(1-p)^{n-x} \tag{1} \label{1}
ここで、p(x)は失敗回数がxになる確率を表します。二項分布は、コイントスのように二種類の結果が得られる確率的な出来事を表す分布です。トレーニングも成功/失敗の二種類の結果が現れるため、この分布を仮定します。
次に、失敗率pに対して、帰無仮説 H_0と対立仮説 H_1を以下のように設定します。

ここで、p_0はゲーム内で表示される失敗率(以下、表示失敗率)を表します。つまり、帰無仮説 H_0は真の失敗率が表示通りであること、対立仮説 H_1は真の失敗率が表示失敗率より大きい(=不正がある)ことを表します。さらに、仮説の採用基準を以下のように設定します。
 u_0 = \frac{\hat{p}-p_0}{\sqrt{p_0(1-p_0)/n}} \  \ (\hat{p} = \frac{x}{n})とし、u_0 \le cのとき帰無仮説 H_0を採用し、u_0 > cのとき対立仮説H_1を採用する」
ここで、cは分析者が設定する閾値です。採用基準には、前節のように失敗回数xを用いた方が分かりやすいのですが、 u_0の方がトレーニング回数等の設定を行いやすいので、 u_0を使います。
 u_0の直感的なイメージは次の通りです。 u_0の分子を見ると分かるように、実験から得られる失敗率の推定値\hat{p}と表示失敗率p_0の差を計算していて、この差が大きいほど、真の失敗率が表示失敗率より大きい(=不正がある)可能性が高いと考えることができます。
 準備が長くなりましたが、以上の前提から第1種の過誤の確率を求めます。帰無仮説が成り立つとき、トレーニング回数nが十分大きければ、中心極限定理より、 u_0が従う確率分布は標準正規分布で近似することができます。これを用いると、第1種の過誤が起きる確率は


 {
\displaystyle  
\begin{eqnarray}
  \mathrm{Pr} \left(u_0 > c \right) = 1 - \mathrm{Pr} \left(u_0 \le c \right) \approx 1 - \Phi(c) \tag{2} \label{1stError}
\end{eqnarray}
}
と表すことが可能です。ここで、\Phi(x)は標準正規分布の累積分布関数を表します。上式より、第1種の過誤が生じる確率を\alphaに抑えたいとき、標準正規分布の上側\alpha%点をz_{\alpha}とすると、閾値c
c = z_{\alpha} \tag{3} \label{c}
と設定すればよいことが分かります。

第2種の過誤の確率

 次に、第2種の過誤の確率を計算します。第2種の過誤は対立仮説が正しいのに帰無仮説を採用してしまう誤りなので、対立仮説(p > p_0)が成り立つと仮定して次式を計算すればよいです。


 {
\displaystyle  
\begin{eqnarray}
  \mathrm{Pr} \left(u_0 \le c \right) &=& \mathrm{Pr} \left(u_0 \le z_{\alpha} \right) \\
      &=& \mathrm{Pr} \left(\frac{\hat{p}-p_0}{\sqrt{p_0(1-p_0)/n}} \le z_{\alpha} \right) \\
      &=& \mathrm{Pr} \left(  \left\{ \frac{\hat{p}-p}{\sqrt{p(1-p)/n}} + \frac{p-p_0}{\sqrt{p(1-p)/n}} \right\} \sqrt{ \frac{p(1-p)}{p_0(1-p_0)} } \le z_{\alpha} \right) \\
      &=& \mathrm{Pr} \left(  u \le z_{\alpha}A-B \right) \\
      &\approx& \Phi(z_{\alpha}A-B) \tag{4} \label{2ndError}
\end{eqnarray}
}
ここで、1行目では前節の結果(c = z_{\alpha})を適用しました。また、4行目のu, A, Bは以下のように定義しました。さらに5行目では、トレーニング回数nが十分大きければ、中心極限定理よりuの従う確率分布が標準正規分布で近似できることを利用しました。
 u = \frac{\hat{p}-p}{\sqrt{p(1-p)/n}}, \  A = \sqrt{ \frac{p_0(1-p_0)}{p(1-p)} }, \ B = \frac{p-p_0}{\sqrt{p(1-p)/n}} \tag{5} \label{5}
式(\ref{2ndError})を見ると、第2種の過誤の確率はトレーニング回数nと真の失敗率pに依存することが分かります。第2種の過誤の確率とn,pとの関係を視覚化するため、様々なn,pに対して第2種の過誤の確率を以下に示します。ここで、作図のために\alpha=0.1, \ p_0=0.05としています。

f:id:walkingsdbg:20210730231955p:plain
α=0.1,p0=0.05の場合の第2種の過誤の確率。実線,破線,点線はそれぞれn=10,100,1000に対応する。

上図より、nが大きいほど第2種の過誤の確率は小さくなり、また、真の失敗率pが表示失敗率p_0に近いほど第2種の過誤の確率は大きくなることが分かります。したがって、p_0の近くで第2種の過誤の確率を小さくするためにはnを大きくする必要があり、その分データ取得が大変になることが分かります。一方、今は「真の失敗率pが表示失敗率p_0より不正と言える程大きいか」に関心があるため、p_0の近くで第2種の過誤の確率を小さくする必要性は低いです。そこで、本分析では、真の失敗率pが表示失敗率p_0より\Delta_0以上大きい場合に、第2種の過誤の確率を\beta以下に抑えられるようにnを求めます。上図より、pp_0に最も近い場合、つまりp=p_0+\Delta_0の場合に第2種の過誤の確率が最も大きいので、この時の確率が\betaになるようにnを計算します。式(\ref{2ndError})より、この条件は次式で表すことができます。
 z_{\alpha}A(p_0+\Delta_0)-B(p_0+\Delta_0,n) = z_{1-\beta} \tag{6} \label{6}
ここで、A, \ Bがそれぞれp,nに依存することを示すためにA(p), \ B(p,n)と表記しました。上式をnについて解くと、トレーニング回数nは次式で表すことができます。
n = \frac{(p_0+\Delta_0)(1-(p_0+\Delta_0))}{{\Delta_0}^2} \left( z_{\alpha}A(p_0+\Delta_0) + z_{\beta} \right)^2 \tag{7} \label{n}

各種条件の設定

 ここまでの検討を整理します。仮説の採用基準を以下のように設定し、第1種の過誤の確率、第2種の過誤の確率をそれぞれ\alpha, \betaに抑えるようなc, nはそれぞれ式(\ref{c})、式(\ref{n})で表されることを示しました。

  • 帰無仮説 H_0:p = p_0
  • 対立仮説 H_1:p > p_0
  • 仮説の採用基準:「 u_0 = \frac{\hat{p}-p_0}{\sqrt{p_0(1-p_0)/n}} \  \ (\hat{p} = \frac{x}{n})とし、u_0 \le cのとき帰無仮説 H_0を採用し、u_0 > cのとき対立仮説H_1を採用する」

本節では、\alpha, \beta, \Delta_0, p_0の値を設定することでc, \ nの値を決めます。もちろん、 \alpha, \betaを小さくするほど分析結果の信頼性は高くなり、また、\Delta_0を小さくするほどp_0との僅かな差を検出しやすくなります。しかし、その分nが大きくなって実験が大変になるので、今回は\alpha=0.1, \beta=0.1, \Delta_0=0.05と設定します。また、次節のデータ収集の都合上、p_0=0.05に設定します。このときc, \ nは、式(\ref{c})、式(\ref{n})より次式で与えられます。
c = z_{0.1} = 1.296, \  \ n = 176.3... < 177 \tag{8} \label{candn}
したがって、表示失敗率5%のもとでトレーニングを177回行えば、表示失敗率の妥当性に関する検証を行うことができます。次節ではこのトレーニングデータの収集方法について説明します。

データの収集方法

レーニング失敗率の検証を行うにあたり、育成対象をスーパークリークに絞ります。なぜなら、スーパークリークは育成期間中に失敗率を一定値に固定することができるため、実験が行いやすいからです。通常、トレーニングの失敗率は体力によって変動するため、ある失敗率に対してデータを収集するのが大変です。しかし、スーパークリークは、クラシック級3月前半~クラシック級10月前半の間「小さなほころび」というバッドステータスが付与され、(体力が十分にあっても)常に失敗率が5%になります。そこで、この期間を利用して、失敗率を5%に固定しつつ177回分のトレーニングデータを集めました。*1

「小さなほころび」状態のスーパークリーク。体力が十分にあっても失敗率が常に5%になる

検証結果

表示失敗率5%のもとで177回トレーニングを行った結果、失敗回数は7回、仮説の採用基準で用いるu_0-0.638でした。これは閾値z_{0.1}=1.296より小さいため、帰無仮説(真の失敗率が表示失敗率と同じ)を採用します。帰無仮説を採用する際には第2種の過誤を犯すリスクがありますが、真の失敗率と表記失敗率との差が\Delta_0=0.05以上の場合にこの過誤を犯す確率を10%以下に抑えているので、この結果から「トレーニング失敗率は概ね表記通り(+5%以上の乖離はない)」と言えます。
 

まとめ

第一種の過誤・第二種の過誤の確率を10%以下に抑えた上で統計的仮説検定を行った結果、「トレーニング失敗率は概ね表記通り(+5%以上の乖離はない)」という結論が得られました。「失敗率が表記の数値より高い!」とこれまで感じていたのは、単に失敗したときのショックが大きく、その時のことを強く覚えているからだったのでしょう。。。

補足

本分析で使用したデータ・プログラムは以下にアップしていますので、興味がある方はご覧ください。
github.com

*1:ただし、効率的にデータを集めるため、「小さなほころび」が無い状態でも失敗率が5%のトレーニングがあれば、そのデータも分析対象に含めています