scipy.stats: 独立2標本の平均値の差の検定 ttest_ind

# scipy.stats: 独立2標本の平均値の差の検定 `ttest_ind`

# 1.　関数定義

`ttest_ind(a, b, axis=0, equal_var=True, nan_policy='propagate', permutations=None, random_state=None, alternative='two-sided', trim=0)

あまり使われない引数もあるので，一応説明を加えておく。

- equal_var :　等分散を仮定するか？<br>
    デフォルトは `True` で，二群の分散が等しいと仮定する検定を行う。`False` を指定することで，二群の等分散を仮定しない Welch の方法による検定を行う。
- nan_policy :　`nan` の取り扱いかた<br>
    * 'propagate': 結果として `nan` を返す
    * 'raise': エラーを発生させる
    * 'omit': `nan` を除いたデータで検定する
- permutations :　並べ替え検定<br>
    0 または None (デフォルト)　の場合，並べ替え検定は行わず，$p$ 値の計算に $t$ 分布を使用する。
    整数値を指定した場合は並べ替えを行う回数として扱われる。この回数が，$k$:一方のサンプルサイズ，$n$が全体のサンプルサイズとしたときの組み合わせの数 ${}_nC_k$ 以上の場合は，正確な検定(exact test)を行う。 
- alternative :　両側検定，片側検定の種別<br>
    * 'two-sided' 両側検定
    * 'less' 片側検定（最初に指定したデータの母平均値が二番目に指定したデータの母平均値より小さい）
    * 'greater': 片側検定（最初に指定したデータの母平均値が二番目に指定したデータの母平均値より大きい）
- trim :　トリムデータを使うか?<br>
    [0, 0.5) で指定した割合で，データの小さい方と大きい方から取り除いたデータで検定を行う(Yuen's t-test)。デフォルトは 0(トリム無しで，すべてのデータを使う）。

戻り値は $t$ 統計量と $p$ 値である。

# 2.　テストデータの生成


```python
import numpy as np
def gen(n, m=50, s=10, decimals=1):
    return np.around(np.random.normal(m, s, n), decimals=decimals)

np.random.seed(123)
x = gen(11)
print(*x, sep=', ')
y = gen(13, m=55.1, s=15)
print(*y, sep=', ')
```

    39.1, 60.0, 52.8, 34.9, 44.2, 66.5, 25.7, 45.7, 62.7, 41.3, 43.2
    53.7, 77.5, 45.5, 48.4, 48.6, 88.2, 87.9, 70.2, 60.9, 66.2, 77.5, 41.1, 72.7


# 3.　等分散を仮定するか?

## 3.1.　等分散を仮定しない場合 -- Welch の方法

`equal_var=False` で指定する。常に，この指定で検定を行おう。


```python
from scipy.stats import ttest_ind
```


```python
ttest_ind(x, y, equal_var=False)
```




    Ttest_indResult(statistic=-3.0162740163873116, pvalue=0.006380154142525381)



## 3.2.　等分散を仮定する場合

デフォルトでは，等分散を仮定する検定になる。これは使わないようにしよう。


```python
ttest_ind(x, y)
```




    Ttest_indResult(statistic=-2.9512037942064135, pvalue=0.0073822752654926745)



# 4.　並べ替え検定 permutation test

両群のサンプルサイズが $n_1$，$n_2$，$n=n_1+n_2$とする。

両群のデータをプールして（一緒にして），ランダムに $n_1$，$n_2$ 個のデータに分割し，平均値の差の検定を `permutations` 回行う。

得られる $t$ 検定統計量が，観察されたデータにおける $t$ 統計量より極端な値になる場合の割合を $p$ 値とする。これが並べ替え検定である。

このような並べ替えは $\text{Binom}(n, n_1) = {}_nC_{n_1}$ 通りある。

例題においては $n_1=11$，$n_2=13$，$n=24$ なので，$\text{Binom}(n, n_1) = 2496144$


```python
from scipy.special import binom
binom(24, 11)
```




    2496144.0



## 4.1.　並べ替え検定（permutation test）

`1 < permutations < 2496144` の場合にはデータをランダムに並べ替えて $t$ 統計量を求めることを `permutations` 回繰り返し，観察されたデータにおける $t$ 統計量より極端な値が得られた割合を $p$ とする。

したがって，同じ `permutations` を指定して複数回検定を行っても，$p$ 値は一致しない。

また，観察されたデータにおける $t$ 統計量と比較するのであるから，当然 `equal_var` の指定によって結果は異なる。


```python
ttest_ind(x, y, equal_var=False, permutations=2496143)
```




    Ttest_indResult(statistic=-3.0162740163873116, pvalue=0.007176672169823604)




```python
ttest_ind(x, y, equal_var=False, permutations=2496143)
```




    Ttest_indResult(statistic=-3.0162740163873116, pvalue=0.007218336449474249)



## 4.2.　正確な検定（exact test）

`permutations ≧ 2496144` が指定された場合は，データのすべての並べ替えを尽くして（2496144個の） $t$ 統計量を求め，観察されたデータにおける $t$ 統計量より極端な値が得られた割合を $p$ 値とする。これは，正確な検定(exact test)である。


```python
ttest_ind(x, y, equal_var=False, permutations=2496144)
```




    Ttest_indResult(statistic=-3.0162740163873116, pvalue=0.007235960745854406)



2496144 より大きな値を指定しても 2496144 が指定されたとみなして正確な検定を行う。


```python
ttest_ind(x, y, equal_var=False, permutations=2496145)
```




    Ttest_indResult(statistic=-3.0162740163873116, pvalue=0.007235960745854406)



# 5.　棄却域の設定

## 5.1. 両側検定

デフォルトで両側検定である（指定するとすれば `alternative='two-sided'`）。帰無仮説は「2群の母平均は等しい」である。


```python
ttest_ind(x, y, equal_var=False, alternative='two-sided')
```




    Ttest_indResult(statistic=-3.0162740163873116, pvalue=0.006380154142525381)



## 5.2. 片側検定

帰無仮説が「最初に指定したデータの母平均は，二番目に指定したデータの母平均より小さい」ならば，`alternative = 'less'` で指定する。

データ例では，両側検定の場合の $p$ 値の 1/2 になる。


```python
ttest_ind(x, y, equal_var=False, alternative='less')
```




    Ttest_indResult(statistic=-3.0162740163873116, pvalue=0.0031900770712626906)



帰無仮説が「最初に指定したデータの母平均は，二番目に指定したデータの母平均より大きい」ならば，`alternative = 'greater'` で指定す。

データ例では，最初に指定した平均値のほうが小さいので，`alternative = 'greater'` を指定すると $p$ 値は 0.5 より大きくなる。


```python
ttest_ind(x, y, equal_var=False, alternative='greater')
```




    Ttest_indResult(statistic=-3.0162740163873116, pvalue=0.9968099229287373)




```python
ttest_ind(x, y, equal_var=False, alternative='greater',nan_policy='omit', permutations=249)
```




    Ttest_indResult(statistic=-3.0162740163873116, pvalue=0.9839357429718876)