サンプルサイズの決め方：原神の☆4キャラクターの出現確率は異なるのか？

#はじめに
最近、[原神](https://genshin.mihoyo.com/ja)というゲームにハマっているので、ガチャの確率について統計的にサンプルサイズを決めて実験をしてみました。実験計画の立て方について少しでも参考になると嬉しいです。

# 検証したい仮説
まずは原神のガチャの仕様について説明します。原神のガチャの確率は以下のようになっています。

|レアリティ  |出現確率  |
|---|---|
|☆5  |0.6%  |
|☆4  |5.1%  |
|☆3  |94.3%  |

☆4の中には3人のピックアップキャラクターというのが存在しています（ピックアップされるキャラは時期によって異なります）。☆4を引いたときに50%の確率でピックアップ☆4キャラがどれか出現するようになっているため、他のキャラよりもピックアップ☆4キャラが出現しやすくなっています。今回はそのピックアップ☆4キャラの出現確率に注目します。

以前ガチャを140回くらい引いたときのピックアップ☆4キャラの出現数が以下の表になります。

|キャラクター名  |出現回数  |
|---|---|
|辛炎  |7  |
|ディオナ  |2  |
|北斗  |1  |

ん？なんか偏ってね？

この結果からピックアップ☆4キャラ3人の出現確率に差が有るのか？という疑問が生じました。今回は統計的にサンプルサイズを決めた上でこの仮説を検証することにします。

ちなみに以前のガチャの結果を$\chi^2$適合度検定で出現確率の一様性を検定するとP値は0.04505になりますが、この結果から「ピックアップ☆4キャラ3人の出現確率に差が有る」と結論してしまうのは、いわゆる[HARKing](https://ja.wikipedia.org/wiki/HARKing)っぽくなるのであまり望ましく無いと思っています。以前のガチャ結果から仮説が生じたのですから、仮説を検証するには新しく実験を行ってデータを取得する必要があるでしょう。


# 仮説の検証方法
今回はピックアップ☆4キャラ3人の出現確率の差の有無を$\chi^2$適合度検定により検証することにします。出現確率に偏りが無ければピックアップ☆4キャラを引いた時の各キャラの出現確率は$1/3$なので、$n$人のピックアップ☆4キャラを引いた時の観測度数と期待度数は以下の表のようになります。

|  |キャラ1  |キャラ2  |キャラ3  |合計  |
|---|---|---|---|---|
|観測度数  |$n_1$  |$n_2$  |$n_3$  |$n$  |
|期待度数  |$n/3$  |$n/3$  |$n/3$  |$n$  |

帰無仮説と対立仮説を

帰無仮説 $H_0$: 出現確率に差はない (各キャラの出現確率は一様に$1/3$)
対立仮説 $H_1$: 出現確率に差がある (各キャラの出現確率は一様に$1/3$ではない)

とすると、$H_0$の下で以下の検定統計量$\chi^2$は自由度2の$\chi^2$分布に（漸近的に）従います。

```math
\chi^2 = \frac{(n_1-n/3)^2}{n/3} + \frac{(n_2-n/3)^2}{n/3} + \frac{(n_3-n/3)^2}{n/3}
```
そこで、検定統計量$\chi^2$の実現値からP値を求めて、P値があらかじめ決めておいた有意水準を下回れば$H_0$を棄却して「ピックアップ☆4キャラ3人の出現確率には差がある」と結論することにします。

#実験計画を立てる
興味ある仮説とその検証方法を決めた後は「仮説を検証するためにはサンプルをどれくらい集める必要があるか」を考える必要があります。

サンプルサイズが大きければ出現確率の差がとても小さくても検出することができます。しかし、サンプルサイズを大きくするとそれだけ実験にかかるコスト（ガチャ石や課金）も大きくなる、という問題があります。また、サンプルサイズを大きくすると非常に小さな差でも差があると結論できてしまうので、例えば出現確率に1%の差があったとして、その差の大きさに実質的な意味があるのかを検討することも必要になります。~~そもそもガチャの確率なんか検証したところで何の意味もない。~~

そこで、「有意水準」「効果量」「検出力」の3つを考慮することで、興味ある仮説を検証することのできる最小のサンプルサイズを決めることにします。

### 有意水準
有意水準は5%とします。つまり、P値が0.05以下であれば$H_0$を棄却して「ピックアップ☆4キャラ3人の出現確率には差がある」と結論することにします。

### 効果量
効果量とは簡単に言うと「出現確率の差がどれくらいあるか」の指標です。どれくらいの大きさの差を検出したいのか、どれくらい差があれば意味があるのか、を考えて適切な効果量を設定する必要があります。

今回は以前のガチャの結果と同じくらい出現確率に差があるとしましょう。つまりピックアップ☆4キャラ3人の出現確率はそれぞれ0.7, 0.2, 0.1で、出現確率には最低限これくらいの差があると仮定し、これを検出したいとします。$\chi^2$適合度検定の効果量はCohenのWを用いることにして、Rのpwrパッケージを用いて計算します。$H_0$に対応する出現確率である1/3, 1/3, 1/3も計算に使用しています。

```R:R
library("pwr")

p0 <- c(1, 1, 1)/3
p1 <- c(7, 2, 1)/(7 + 2 + 1)
effect_size <- ES.w1(p0, p1)

> effect_size
[1] 0.7874008
```
0.787は効果量としてはなかなか大きい値です。今回は効果量がこの0.787以下であれば出現確率の差に実質的な意味は無いとして検証を進めます。これは完全に個人的な主観によるものなので、どれくらいの出現確率の差に意味を見出すかは人によって異なるでしょう。例えば、薬の臨床試験なんかでは「最低限これくらい効果がないと薬として意味がないよね」という最低限の数値を用いて効果量をちゃんと設定したりします。効果量をちゃんと決めるにはその分野の専門知識が必要になってきます。今回はまあゲームのガチャなんでね。

### 検出力
検出力は0.8とします。つまり、対立仮説 $H_1$が正しい時に帰無仮説 $H_0$を棄却できる確率を80%に設定します。

興味ある仮説が正しいときにその仮説を証明できる確率が低いと実験をする意味がないので、検出力はある程度高い値にしておく必要があります。検出力が50%以下になるような実験を計画してしまうと、コインを投げて表か裏かで結果を決めるよりも仮説を証明できる確率が低くなっちゃいます。仮説を証明できる確率の低い実験に無駄にコストをかけることになるので検出力をあらかじめ考えておきましょう。

### サンプルサイズ
効果量で0.787の差を有意水準0.05、検出力0.8で検出するために必要な最小のサンプルサイズを決めます。まず、サンプルサイズと検出力の関係を調べてみます。検出力の計算にもRのpwrパッケージを利用します。

```R:R
alpha <- 0.05       # 有意水準
df <- 2             # カイ二乗分布の自由度
sample_size <- 5:50 # サンプルサイズ

# 検出力の算出
power <- pwr.chisq.test(w = effect_size, sig.level = alpha, df = df, N = sample_size, power = NULL)$power

# プロット
ggplot(data = tibble(x = sample_size, y = power), aes(x = x, y = y)) +
  geom_point() +
  geom_line() +
  geom_abline(intercept = 0.8, slope = 0, color = "red")
```
<img width="700" alt="poer.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/697043/d8ff5ab2-8828-b1a3-7938-73af20ffb911.png">

このグラフを見るとサンプルサイズが16以上であれば検出力が0.8を超えるので、今回の実験のサンプルサイズを16にすることにします。つまり、ピックアップ☆4キャラを16人引くまでガチャを回して、その時点までのデータを用いて検定を実施する計画とします。

サンプルサイズが分かると実験に必要なコストを見積もることができます。今回は今まで我慢して溜め込んだ原石（ガチャを引くための石）を使えば目標のサンプルサイズを実現できることができそうです。実験に必要なコストが許容できない場合はここで計画の修正が必要になることもあるでしょう。検証的な実験では、実験計画を実験を行う前に決めておくことも重要です。

# ガチャを回して検定を行う
実際にガチャを回したところピックアップ☆4キャラの出現数は以下のようになりました。

|キャラクター名  |スクロース  |香菱  　|九条裟羅  |合計  |
|---|---|---|---|---|
|観測度数  |$4$  |$6$  |$6$  |$16$  |
|期待度数  |$5.33$  |$5.33$  |$5.33$  |$16$  |

明らかに偏ってないですが、このデータを用いて$\chi^2$適合度検定を行います。

```R:R
observed_data <- c(4, 6, 6)
chisq.test(observed_data, p = c(1, 1, 1)/3)

	Chi-squared test for given probabilities

data:  observed_data
X-squared = 0.5, df = 2, p-value = 0.7788
```
P値は$0.7788$となりました。あらかじめ決めた有意水準$0.05$よりも大きいので、$H_0$を棄却することはできません。つまり、ピックアップ☆4キャラの出現確率には差があるとは言えない、という実験結果になりました。

#まとめ
今回の実験では帰無仮説を棄却することができず、ピックアップ☆4キャラの出現確率には差があるとは言えません。帰無仮説を棄却できないことは帰無仮説が正しいことの証拠にはなりませんが、十分に検出力の高い実験を行えば、少なくとも事前に設定した意味のある効果量の大きさよりも小さな効果量しか無いことはある程度自信を持って主張できるでしょう。

ちなみに今回の実験結果の効果量を計算すると0.177になります。サンプルサイズが16の実験では検出力は約9%しかありません。この効果量の大きさのときに検出力80%にしようとすると必要なサンプルサイズは309になります。この出現確率の差に意味があるとは思えませんが、検出したい場合はかなり課金しないとダメですね。

# 参考文献
1. https://cran.r-project.org/web/packages/pwr/pwr.pdf
2. Cohen, J. (1988). Statistical Power Analysis for the Behavioral Sciences (2nd ed.). Routledge. https://doi.org/10.4324/9780203771587