統計的仮説検定についてまとめてPythonで実施する

#はじめに
統計的仮説検定についてまとめました。後々「検出力」や「効果量」について整理した記事を書きたいと思っておりその前段として本記事を書きました。
筆者は統計の専門家ではないため誤りがあればご指摘いただけると幸いです。

##参考
「統計的仮説検定」についてまとめるあたって下記を参考にしています。

- [統計学の時間](https://bellcurve.jp/statistics/course/)
- [統計学入門 (基礎統計学Ⅰ)   東京大学教養学部統計学教室](https://www.amazon.co.jp/dp/4130420658/ref=cm_sw_r_tw_dp_U_x_r56nEb3G5Y13F)
- [仮説検定とは？](https://ai-trend.jp/basic-study/hypothesis-testing/about-2/)


#統計的仮説検定について
統計的仮説検定についてその流れを整理し最後にPythonで実施します。

##統計的仮説検定とは何か
統計的仮説検定についてはwikipediaは下記以下のように説明されています。

>統計的仮説検定（statistical hypothesis testing）とは、母集団分布の母数に関する仮説を標本から検証する統計学的方法のひとつ。日本工業規格では、仮説(statistical hypothesis)を「母数又は確率分布についての宣言。帰無仮説と対立仮説がある。」と定義している。検定(statistical test)を「帰無仮説を棄却し対立仮説を支持するか，又は帰無仮説を棄却しないかを観測値に基づいて決めるための統計的手続き。その手続きは，帰無仮説が成立しているにもかかわらず棄却する確率がα以下になるように決められる。このαを有意水準という。」と定義している。

「帰無仮説」や「対立仮説」、「有意水準」など専門用語が出てきて定義が難しくなっていますが、私は下記のような論理で検証を実施する手法であると理解しています。

**ある仮説が正しいと仮定した時に、実際に観測されたデータからその仮説の状態になる確率を計算した時、その確率が十分に小さい場合はその仮説は成り立ちそうにないと判断する**


##統計的仮説検定の手順
統計的仮説検定は下記のような手順で実施をします。

1. 帰無仮説を立てる
2. 検定の方法を決定する
3. 有意水準と棄却域を決定する
4. 統計量を計算する 
5. 帰無仮説の棄却または採択を行う

手順だけ羅列すると抽象的でわかりにくいので具体例を上げて説明します。

##統計的仮説検定の具体例

--------------

コイントスを5回実施して、表が出たら500円はらい、裏が出たら500円もらうゲームを行った。
すると結果5回とも表が出て2500円払うはめになった。何となくイカサマの匂いがするがこのコインはインチキであると言えるだろうか

--------------

「5回連続表が出るくらいはたまにはあるんじゃない？」という人もいれば、「5回も連続で表が出るなんておかしい」という人もいると思います。そういったもの統計的仮説検定を使用して客観的に判断することができます。

###帰無仮説を立てる
今回は無に帰したい仮説(否定したい仮説)として**このコインはインチキではない**という仮説を立てます。インチキではないということは表が出る確率$p=0.5$なので下記のように表されます。

帰無仮説:$H_{0}:p=0.5$

またその対立仮説(表が出る確率は50%以上である)は下記のようになります。

対立仮説:$H_{0}:p>0.5$

###検定の方法を決定する

今回は二項検定を採用します。(サンプル数が多い場合、二項分布は正規分布に近似できるためその他の手法も使用することが可能です。)

###有意水準と棄却域を決定する

今回の検定では**有意水準を5%**と設定します。帰無仮説:$H_{0}:p=0.5$という前提において**観測データが得られる確率が5%以下**であれば帰無仮説が棄却される(すなわち**このコインはインチキである**)ということになります。

また今回はコインが**異常に表がでやすいのではないかという疑惑を検証する検定**のため**片側検定**を行います。棄却域は片側のみにおくことになります。

###統計量の計算を行う

p値と呼ばれる統計量は**帰無仮説が正しいとしたときに、観測データの実現値が得られる確率、またはそれ以上に極端なデータが得られる確率**を表します。

従って今回におけるp値は、表が出る確率が$50\%$であると仮定した時に表が5回とも出る確率にあたります。

$(\frac{1}{2})^5 = \frac{1}{32} \fallingdotseq 0.03125$

###帰無仮説の棄却または採択を行う
仮説検定に必要な情報は出そろったので、帰無仮説の棄却または採択の判断を行います。
今回の仮説検定の有意水準は$0.05$($5\%$)で統計量(p値)は計算した結果$0.03125$でした。

$0.03125 < 0.05$なので帰無仮説は棄却され、対立仮説が採用されます。

従って$H_{0}:p>0.5$(このコインはインチキである)ということが検証できました。

##Pythonで統計的仮説検定を実施する
先ほどの計算はPythonで簡単に実施することができます。
以下がscipyの1.3.1を使用して二項検定を行った結果です。

```python

from scipy import stats
# xは観測データの成功回数
# nは試行回数
# pは想定する成功確率
# alternativeは両側検定か片側検定か、また片側検定であればどちら側であるかを指定する
p = stats.binom_test(x = 5, n = 5,  p = 0.5, alternative = 'greater' )
print(p)
```
出力結果はこちらです。指定した引数に合わせてp値を出力することできます。

```
0.03125
```
上記を使用して設定した有意水準に合わせて棄却または採択の判断をすれば簡単に二項検定を実施できます。(別の検定を実施する場合は別のメソッド使用します。)

##Pythonで分布を描画する
先ほどまでは計算だけで仮説検定を実施しましたが、実際に分布を描画すると非常にわかりやすくなります。
コイントスを5回実施して表が出る回数の分布を描画します。

```python
import numpy as np
import matplotlib.pyplot as plt
import math
%matplotlib inline

def comb_(n, k):
    result = math.factorial(n) / (np.math.factorial(n - k) * np.math.factorial(k))
    return result


def binomial_dist(p, n, k):
    result = comb_(n, k) * (p**k) * ((1 - p) ** (n - k))
    return result

x =  np.arange(0, 6, 1)

y = [binomial_dist(0.5, 5, i) for i in x]

plt.bar(x, y, alpha = 0.5)
```
![ダウンロード.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/395230/9fb5e6c3-8117-5f50-e99b-f6c917b38a83.png)

上記が描画した結果ですが、**表が5回とも出る確率は有意水準の0.05を下回っている**ことがすぐにわかります。


#NEXT
次回は仮説検定における第一種の過誤、第二種の過誤、そして検出力についてまとめます。