えんじにあのじゆうちょう

勉強したことを中心にアウトプットしていきます。

t検定をPythonでやってみる

はじめに

統計の勉強をして大きく立ちはだかったのは個人的には検定の話でした。
ようやく計算ができるようになってきたので、一度やり方とPythonでの計算の仕方をまとめてみます。

統計検定

t検定

仮説がt分布に従うときに仮説を立て、それに合致するかそうではないかを計算することをt検定と言います。
例えば、もととなる集団(母集団)の平均と分散がわからない状態で、サンプリングを行い、そこで得られた標本平均\bar{X}と不偏分散s^2を用いて、本当の集団の平均値が想定した通りの範囲に収まっていそうかを計算します。

このとき、2つ仮説を立てますが、H_0を帰無仮説、H_1を対立仮説といいます。
母集団はH_0であることを仮定して、それに合致しなければ帰無仮説H_0を棄却しH_1対立仮説を採用し、そうでなければH_0を採用します。
先程の母集団の平均の例で言うなら、H_0は母集団の平均\muがXXであること、H_1は母集団の平均\muがXXでないこと/より大きいこと/より小さいこと、が仮説の例になります。

サンプル問題

例えば1本あたり500mlの飲み物を製造する機械があり、10本ほどサンプリングして調査したら以下の様なパラメータを得たときに、製造した飲み物は500mlと言ってよいかの検定を考えます。

仮説
H_0:母平均500ml
H_1:母平均は500mlではない

また、得られている情報は以下の通りであるとしましょう。

  • サンプルサイズ:10
  • 標本平均\bar{X}:501.1
  • 不偏分散s^2:3.4
  • 有意水準\alpha:0.05

この問題は本当に適当に設定しているので、パラメータを変えて色々変えてみると楽しいかもしれません。

Pythonで書くと以下のようになります。

# 仮定する母平均
mu = 500

# 標本
# 標本サイズ
sample_size = 10
# 標本の平均
sample_mean = 501.1
# 不偏分散
unbiased_sample_variance = 3.4

仮説の考え方

母平均が500ml or not 500mlが仮説になっています。
今回は不偏分散を使って母平均が500mlであるかどうかの検定を行うものですので、t分布を使いますが、t分布を使う検定はt検定と呼ばれます。
t分布は自由度というパラメータがあり、自由度はサンプルサイズ-1となりますので、今回は自由度10-1=9のt分布となります。
自由度9のt分布は以下のような形になっていて、青色の部分が全体の95%の範囲でここをはみ出た黄色い部分が残りの5%です。

f:id:marufeuillex:20191029000951p:plain
t分布

有意水準\alphaはこれを指していて、今回であればもし全体の5%程度の位置にある値を取っていたのであれば、H_0を棄却し、H_1を採択します。
下側の2.5%点と上側の97.5%点はPythonなら以下のようにして求められます。

from scipy.stats import t

degree_of_freedom = 9
lower = t.ppf(0.025, df=degree_of_freedom)
upper = - lower
print("upper threshold is {}".format(upper))
print("lower threshold is {}".format(lower))

実行すると、横軸tの値が-2.262157162740992を下回った場合、もしくは、2.262157162740992を上回った場合、5%程度の確率でしか怒らないことが発生した、といえます。

そして、t値の計算は以下のように行います。

t = \frac{\mu - \bar{X}}{\sqrt{\frac{s^2}{N}}}

Pythonで書くと以下のようになります。

t_val = (mu - sample_mean) / np.sqrt(unbiased_sample_variance / sample_size) 
print("t-value is {}".format(t_val))

t値として-1.8864844365676363という値が得られたはずです。
さて、得られた諸々の値から検定を行ってみましょう。

繰り返しになりますが、t値は-1.89です。これとt分布から得られた下側2.5%点(-2.26)を見比べるとt値のほうが大きい値です。
逆に上側の97.5%点(2.26)と比べるとt値のほうが小さいです。
以上より、今回のt値は青い95%ゾーンの中に含まれており、「ふつうのコトが起こった」つまるH_0は棄却しないということになります。

Pythonで書くとこんな感じです。

if t_val < lower or upper < t_val:
    print("H0 is rejected")
else:
    print("H0 is not rejected")

まとめ

t検定に限らず、検定はある確率分布を仮定してその確率分布に収まるか/収まらないかで仮説を採択/棄却します。
収まる、収まらないの判断基準が有意水準である\alphaです。一般的には0.05に設定されることが多いようですが、統計検定ではたまに0.1に設定されている問題があるので注意しましょう笑

このように検定を用いると、標本で得られた値がそれらしいのか、それらしくないのか簡単に計算することができます。
なにかそのデータがもっともらしいのか確認したいときは、適切な確率分布の元で検定を実施すると良いかと思います。