![見出し画像](https://assets.st-note.com/production/uploads/images/146638947/rectangle_large_type_2_e402f5a4d49527fa16240fb57528516c.png?width=1200)
【学マス】コンテスト編成の比較を統計学的に行う方法
この記事の目的:何となくリハーサルや本番のスコアで編成を比較している状態から、統計学的に自信を持って編成を比較できるようになる。
今回は「順位和検定」と「ブートストラップ法」について紹介します。
実際に比較するステージと編成
ステージ
![](https://assets.st-note.com/img/1720434690989-f566td3ecc.png?width=1200)
編成(Before)
![](https://assets.st-note.com/img/1720434735314-O0gxzF3jvu.png?width=1200)
編成(After)
![](https://assets.st-note.com/img/1720434750830-xteL7NhePj.png?width=1200)
今回はBeforeとAfterでリハーサルをそれぞれ30回(計60回)し、スコアを測定しました。
箱ひげ図による視覚的な比較
まず箱ひげ図というグラフで、スコアの分布を視覚的に確認します。(Excelでも作成可能。)
![](https://assets.st-note.com/img/1720436006314-EIcnOnlVAA.png?width=1200)
箱の中に、データの50%が含まれます。箱の黄色い線は中央値、箱の下端は下から25%の値、箱の上端は下から75%の値を示します。伸びた黒線(ひげ)が最小値と最大値を示します。
中央値は、Beforeが9,440でAfterが12,200でした。平均値ではなく中央値を比較するメリットは、外れ値(極端に低いスコアや高いスコア)に影響されない点です。
(ウィルコクソンの)順位和検定
「いや、Afterの方が強いのは一目瞭然だろ」と思ったかも知れません。しかしながら、どの程度自信を持って言えるのか数値で示したいところです。
まず結論から言います。順位和検定という手法を用いると「Beforeの方が中央値が高い確率は、約0.000002%」でした。よって極めて高い自信を持って、Afterの方が改善したと言えます。
より具体的には、帰無仮説を「BeforeとAfterで中央値は変わらない」、対立仮説を「Afterの方がBeforeより中央値が高い」とした順位和検定ではp値が約0.00000002という結果でした。
順位和検定を採用した理由は「母集団の分布を仮定しなくてもよい」「サンプル数(スコアの測定回数)がBeforeとAfterで異なってもよい」の2点が挙げられます。順位和検定の説明は省略します。
欠点はサンプル数が10以上程度であれば人力で計算するのが大変な点です。ただしExcel等では実装可能です。Pythonでは以下のように実装できます。
# python
from scipy import stats
_, p_value = stats.ranksums(before_scores, after_scores, alternative='less')
ブートストラップ法
順位和検定では「Afterの方がスコアの中央値が改善した」ことを示せましたが、どの程度改善したのかは算出できませんでした。しかしブートストラップ法を用いれば算出できます。
結論から言えば「中央値の差(After - Before)の95%信頼区間は1,398~4,545」という結果でした。95%信頼区間をどう解釈するかについては説明が難しいですが、簡単に言い換えれば「95%の自信を持って、中央値は1,398~4,545改善した」と言い換えられます。
順位和検定に比べたメリットは、中央値だけではなく「平均値」や「下から75%の値」も対象にして信頼区間を算出できる点です。欠点はPython等を用いコンピュータ上で解くことが推奨される点です。以下に実装例を示します。
# python
iterations = 10000
diffs = []
for _ in range(iterations):
sample1 = before_data.sample(frac=1, replace=True)
sample2 = after_data.sample(frac=1, replace=True)
diff = sample2.median() - sample1.median()
diffs.append(diff)
diffs = pd.Series(diffs)
# confidence interval
a = 0.05
ci = diffs.quantile([a / 2, 1 - a / 2])
print(f'{1 - a} confidence interval: {ci.values}')
まとめ
順位和検定:中央値が本当に改善したのかを検証できる。
ブートストラップ法:中央値がどの程度改善できたのかを算出できる。
参考文献
現代数理統計学の基礎, 久保川 達也 著, 共立出版, ISBN 9784320111660
新装改訂版 現代数理統計学, 竹村 彰通 著, 学術図書出版社, ISBN 4780608600
この記事が気に入ったらサポートをしてみませんか?