LoginSignup
5
0

More than 1 year has passed since last update.

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

Last updated at Posted at 2022-05-31

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 : 等分散を仮定するか?

    デフォルトは True で,二群の分散が等しいと仮定する検定を行う。False を指定することで,二群の等分散を仮定しない Welch の方法による検定を行う。
  • nan_policy : nan の取り扱いかた
    • 'propagate': 結果として nan を返す
    • 'raise': エラーを発生させる
    • 'omit': nan を除いたデータで検定する
  • permutations : 並べ替え検定

    0 または None (デフォルト) の場合,並べ替え検定は行わず,$p$ 値の計算に $t$ 分布を使用する。
    整数値を指定した場合は並べ替えを行う回数として扱われる。この回数が,$k$:一方のサンプルサイズ,$n$が全体のサンプルサイズとしたときの組み合わせの数 ${}_nC_k$ 以上の場合は,正確な検定(exact test)を行う。
  • alternative : 両側検定,片側検定の種別
    • 'two-sided' 両側検定
    • 'less' 片側検定(最初に指定したデータの母平均値が二番目に指定したデータの母平均値より小さい)
    • 'greater': 片側検定(最初に指定したデータの母平均値が二番目に指定したデータの母平均値より大きい)
  • trim : トリムデータを使うか?

    [0, 0.5) で指定した割合で,データの小さい方と大きい方から取り除いたデータで検定を行う(Yuen's t-test)。デフォルトは 0(トリム無しで,すべてのデータを使う)。

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

2. テストデータの生成

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 で指定する。常に,この指定で検定を行おう。

from scipy.stats import ttest_ind
ttest_ind(x, y, equal_var=False)
Ttest_indResult(statistic=-3.0162740163873116, pvalue=0.006380154142525381)

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

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

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$

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 の指定によって結果は異なる。

ttest_ind(x, y, equal_var=False, permutations=2496143)
Ttest_indResult(statistic=-3.0162740163873116, pvalue=0.007176672169823604)
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)である。

ttest_ind(x, y, equal_var=False, permutations=2496144)
Ttest_indResult(statistic=-3.0162740163873116, pvalue=0.007235960745854406)

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

ttest_ind(x, y, equal_var=False, permutations=2496145)
Ttest_indResult(statistic=-3.0162740163873116, pvalue=0.007235960745854406)

5. 棄却域の設定

5.1. 両側検定

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

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 になる。

ttest_ind(x, y, equal_var=False, alternative='less')
Ttest_indResult(statistic=-3.0162740163873116, pvalue=0.0031900770712626906)

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

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

ttest_ind(x, y, equal_var=False, alternative='greater')
Ttest_indResult(statistic=-3.0162740163873116, pvalue=0.9968099229287373)
ttest_ind(x, y, equal_var=False, alternative='greater',nan_policy='omit', permutations=249)
Ttest_indResult(statistic=-3.0162740163873116, pvalue=0.9839357429718876)
5
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
5
0