Pythonを利用して、2つの正規分布の母集団平均に差があるかの検定を行ってみます。
母平均の差の検定のパターン
2つの母平均の差に関する検定を行う場合、以下のパターンが考えられます。
標本に対応がない場合 | 母分散が既知の場合 | 正規分布による検定 |
母分散が未知で等しいと仮定できる場合 | t検定(Studentのt検定) | |
母分散が未知で等しいと仮定できない場合 | t検定(Welchのt検定) | |
標本に対応がある場合 | 母分散が既知の場合 | 正規分布による検定 |
母分散が未知の場合 | t検定 |
例題
パン屋さんで、ある1週間に製造されたサンドイッチの平均重量と翌週に製造されたサンドイッチで平均重量に差があるかどうか調べます。
各週に製造されたサンドイッチから無作為に10個ずつ選び、重量を量った結果は以下のとおりでした。
1週目 | 2週目 |
137.9 | 142.5 |
139.7 | 144.7 |
129.3 | 132.2 |
148.2 | 154.8 |
131.0 | 134.2 |
135.8 | 139.9 |
142.5 | 148.0 |
133.8 | 137.5 |
134.7 | 138.7 |
135.5 | 139.5 |
Python実装
動作確認したpython、モジュールのバージョンは以下のとおりです。
python 3.6.0
pandas 0.22.0
scipy 1.2.0
例題の場合、2つの標本に対応関係はありません。
サンプルサイズが大きい場合、大数の法則で不偏分散=母分散とすることもできますが、今回はサンプルサイズが10であるため、母分散が未知となります。
等分散と仮定できるかを判断するため、等分散性の検定を行ってみます。
等分散性の検定
F検定により等分散と仮定できるか判定します。
import pandas as pd
from scipy import stats
# 1週目の重量データ
s_week1 = pd.Series([137.9, 139.7, 129.3, 148.2, 131.0, 135.8, 142.5, 133.8, 134.7, 135.5])
# 2週目の重量データ
s_week2 = pd.Series([142.5, 144.7, 132.2, 154.8, 134.2, 139.9, 148.0, 137.5, 138.7, 139.5])
week1_var = s_week1.var(ddof=1)
week2_var = s_week2.var(ddof=1)
week1_dof = len(s_week1) - 1
week2_dof = len(s_week2) - 1
f = week1_var / week2_var
p1 = stats.f.cdf(f, week1_dof, week2_dof)
p2 = stats.f.sf(f, week1_dof, week2_dof)
p = min(pval1, pval2) * 2 # 両側検定のp値
print("P値:", pval)
出力結果は以下のようになります。
P値: 0.5975182555077299
p値から、帰無仮説(1週目と2週目で分散が等しい)を棄却できず、等分散と仮定できると判断します。
t検定
等分散と仮定できると判断したため、Studentのt検定を行います。
t, p = stats.ttest_ind(s_week1, s_week2)
print("t値:", t)
print("p値:", p)
出力結果は以下のようになります。
t値: -1.5888676382391864
p値: 0.12950031472471907
p値から帰無仮説(サンドイッチの平均重量は1週目と2週目で等しい)を棄却できず、平均重量は同じと判断できます。
まとめ
母平均の差の検定をt検定で行い、前準備のためのF検定についても記載しました。
Pythonでの検定の方法については、他の記事でも紹介しておりますので、よろしければご覧ください。