「この新薬は本当に効果があるのか」「2つの製造ラインで品質に差があるのか」。こうした問いに答えるために、平均値の差を検定する手法が必要となる。その代表格がt検定である。
t検定は1908年、アイルランドのギネスビール醸造所で働いていた統計学者ウィリアム・ゴセットによって開発された。当時、ギネス社は社員の論文発表を禁じていたため、ゴセットは「Student」というペンネームで論文を発表した。そのため、t検定は「スチューデントのt検定」とも呼ばれる。ゴセットが開発したt分布は、少ないサンプルサイズでも信頼性の高い検定を可能にし、品質管理から医学研究まで幅広い分野で活用されている。
本記事では、t検定の基本的な考え方から、1標本t検定、対応のある2標本t検定、独立な2標本t検定まで体系的に解説する。統計的仮説検定の基礎知識があると理解しやすい。
t検定とは
t検定(t-test)は、母集団の平均に関する仮説を検定する手法である。母分散が未知の場合に用いられ、検定統計量がt分布に従うことからこの名がついた。
t検定には主に3つの種類がある。それぞれの違いを図で示す。
いずれの場合も、母集団が正規分布に従うことを仮定する。サンプルサイズが十分大きい場合(目安として30以上)は、中心極限定理により正規性の仮定が緩和される。
1標本t検定
1標本t検定は、1つの標本から得られた平均が、ある特定の値(理論値や規格値など)と等しいかどうかを検定する手法である。
問題設定
母集団が正規分布 N(\mu, \sigma^2) に従うとする。母分散 \sigma^2 は未知である。標本 X_1, X_2, \ldots, X_n から、母平均 \mu がある値 \mu_0 と等しいかを検定する。
検定統計量
標本平均 \bar{X} と不偏分散 s^2 を次のように定義する。
帰無仮説 H_0: \mu = \mu_0 のもとで、検定統計量
は自由度 n-1 のt分布に従う。この性質を利用して検定を行う。
母分散 \sigma^2 が既知なら、Z = \dfrac{\bar{X} - \mu_0}{\sigma / \sqrt{n}} は標準正規分布に従う(Z検定)。しかし実際には母分散は未知であることが多く、標本から推定した s で代用する必要がある。この推定の不確実性を考慮したのがt分布である。サンプルサイズが小さいほどt分布の裾は厚くなり、より保守的な検定となる。
棄却域と判定
有意水準 \alpha の両側検定では、t分布の上側 \alpha/2 点を t_{\alpha/2}(n-1) として、次の条件で帰無仮説を棄却する。
この棄却域を図で示すと以下のようになる。
片側検定の場合は、対立仮説の方向に応じて棄却域を設定する。
| 対立仮説 | 棄却域 | 意味 |
|---|---|---|
| H_1: \mu > \mu_0(右片側) | T \ge t_{\alpha}(n-1) | 平均が基準値より大きいか |
| H_1: \mu < \mu_0(左片側) | T \le -t_{\alpha}(n-1) | 平均が基準値より小さいか |
| H_1: \mu \neq \mu_0(両側) | |T| \ge t_{\alpha/2}(n-1) | 平均が基準値と異なるか |
計算例
ある菓子の表記重量は30gである。品質管理のため8個を抽出して重量を測定したところ、以下のデータが得られた(単位:g)。
28.5, 29.2, 28.8, 29.5, 28.3, 29.0, 28.7, 29.3
有意水準5%で、平均重量が30gと異なるかを検定せよ。
【解答】
Step 1:仮説の設定
「異なるか」を調べるので両側検定を行う。
Step 2:統計量の計算
標本平均と標本標準偏差を計算する。
各データと平均の差の二乗を計算する。
Step 3:検定統計量の計算
Step 4:棄却域との比較
自由度7のt分布の上側2.5%点は t_{0.025}(7) = 2.365 である。
検定統計量が棄却域に入るので、帰無仮説を棄却する。
結論:有意水準5%で、この菓子の平均重量は30gと異なると判断できる(表記より軽い傾向がある)。
P値による判定
棄却域を使う代わりに、P値(p-value)を計算して判定することもできる。P値とは「帰無仮説が正しいと仮定したとき、観測された検定統計量以上に極端な値が得られる確率」である。
この例では P値 = 0.00014 であり、有意水準 α = 0.05 より小さいので帰無仮説を棄却する。P値が小さいほど、帰無仮説に対する証拠が強いといえる。
対応のある2標本t検定
対応のある2標本t検定(paired t-test)は、同じ対象に対する2回の測定値の差を検定する手法である。「前後比較」や「マッチドペア」の分析に用いられる。
どんなときに使う?
以下のような「同じ対象を2回測定する」場面で使う。
- 同じ患者の治療前後の血圧
- 同じ学生の講習前後のテスト点数
- 同じ製品の改良前後の性能
- 同じ土地での異なる肥料の効果(左右の畑で比較)
対応のある検定を使う最大のメリットは、個体差の影響を取り除けることである。たとえば、ある人はもともと血圧が高く、別の人は低いとしても、「差」を見れば個人差はキャンセルされる。
検定の考え方
n 個の対象について、処理前の測定値 X_1, \ldots, X_n と処理後の測定値 Y_1, \ldots, Y_n が得られたとする。各対象の差 D_i = Y_i - X_i を計算し、この差の母平均が0かどうかを検定する。
差 D_i を1つの標本とみなせば、対応のある2標本t検定は1標本t検定に帰着される。検定統計量は
となる。ここで \bar{D} は差の標本平均、s_D は差の標本標準偏差である。この統計量は自由度 n-1 のt分布に従う。
計算例
6人の学生に対して、ある学習プログラムの効果を調べた。プログラム受講前後のテスト点数は以下の通りである。
| 学生 | 受講前 | 受講後 | 差(後−前) |
|---|---|---|---|
| A | 65 | 70 | 5 |
| B | 72 | 78 | 6 |
| C | 58 | 62 | 4 |
| D | 80 | 85 | 5 |
| E | 68 | 75 | 7 |
| F | 75 | 79 | 4 |
有意水準5%で、学習プログラムに効果があるか検定せよ。
【解答】
効果があるかを調べるので、差が正かどうか(点数が上がったか)の片側検定を行う。
差のデータ:5, 6, 4, 5, 7, 4
検定統計量を計算する。
自由度5のt分布の上側5%点は t_{0.05}(5) = 2.015 である。
T = 10.83 > 2.015 なので、帰無仮説を棄却する。
結論:有意水準5%で、学習プログラムには点数を向上させる効果があると判断できる。
独立な2標本t検定
独立な2標本t検定(two-sample t-test)は、互いに独立な2つの群の母平均に差があるかを検定する手法である。「スチューデントのt検定」とも呼ばれる。
どんなときに使う?
対応のある検定と違い、2つの群が別々の対象である場合に使う。
- 新薬群とプラセボ群の効果比較
- 工場Aと工場Bの製品品質比較
- 男性と女性の平均身長比較
等分散の仮定とプールした分散
群Aから n_A 個の標本、群Bから n_B 個の標本が得られたとする。スチューデントのt検定では、2群の母分散が等しい(等分散)と仮定する。この仮定が妥当かどうかはF検定で検証できる。
この共通の分散を推定するため、2群のデータを統合したプールした分散(pooled variance)を計算する。
これは各群の不偏分散をサンプルサイズに応じて重み付け平均したものである。
検定統計量
帰無仮説 H_0: \mu_A = \mu_B のもとで、検定統計量
は自由度 n_A + n_B - 2 のt分布に従う。
計算例
2つの工場(A, B)で製造された電池の寿命(時間)を比較する。
工場A(8個):245, 252, 248, 251, 247, 253, 250, 246
工場B(10個):238, 242, 240, 244, 239, 241, 243, 237, 245, 241
有意水準5%で、2つの工場の電池寿命に差があるか検定せよ。等分散を仮定する。
【解答】
差があるかを調べるので両側検定を行う。
各群の統計量を計算する。
プールした分散を計算する。
検定統計量を計算する。
自由度16のt分布の上側2.5%点は t_{0.025}(16) = 2.120 である。
|T| = 6.16 > 2.120 なので、帰無仮説を棄却する。
結論:有意水準5%で、2つの工場の電池寿命には有意な差がある(工場Aの方が長寿命)。
ウェルチのt検定
スチューデントのt検定は等分散を仮定するが、実際には2群の分散が異なる場合も多い。このような場合に用いるのがウェルチのt検定(Welch's t-test)である。
スチューデントとウェルチの違い
| スチューデントのt検定 | ウェルチのt検定 | |
|---|---|---|
| 分散の仮定 | 等分散を仮定 | 等分散を仮定しない |
| 分散の推定 | プールした分散 s_p^2 | 各群の分散を個別に使用 |
| 自由度 | n_A + n_B - 2(整数) | Welch-Satterthwaite近似(非整数) |
| 頑健性 | 等分散が崩れると不正確 | 分散が異なっても正確 |
検定統計量と自由度
ウェルチのt検定では、検定統計量を次のように計算する。
自由度はWelch-Satterthwaiteの近似式で計算する。
この自由度は一般に整数にならないため、t分布表を使う場合は小数点以下を切り捨てる。
近年では、等分散の仮定が成り立つかどうかに関わらず、ウェルチのt検定を使用することが推奨されている。等分散が成り立つ場合でもウェルチのt検定は妥当な結果を与え、等分散が成り立たない場合にはスチューデントのt検定より信頼性が高い。多くの統計ソフトではウェルチのt検定がデフォルトとなっている。
練習問題
H_0: \mu = 500 vs H_1: \mu < 500(左片側検定)
検定統計量:
自由度9のt分布の上側5%点:t_{0.05}(9) = 1.833
T = -1.897 < -1.833 なので帰無仮説を棄却する。
結論:有意水準5%で、平均容量は500mlより少ないといえる。
| 被験者 | 服用なし | 服用あり |
|---|---|---|
| 1 | 6.0 | 7.2 |
| 2 | 5.5 | 6.8 |
| 3 | 6.5 | 7.5 |
| 4 | 7.0 | 7.8 |
| 5 | 5.8 | 6.7 |
対応のある2標本t検定を使用する。
差(服用あり − 服用なし):1.2, 1.3, 1.0, 0.8, 0.9
\bar{D} = 1.04、s_D = 0.207
検定統計量:
自由度4のt分布の上側5%点:t_{0.05}(4) = 2.132
T = 11.2 > 2.132 なので帰無仮説を棄却する。
結論:有意水準5%で、睡眠薬には睡眠時間を延長する効果があるといえる。
肥料A(6株):12.5, 13.2, 11.8, 12.9, 13.5, 12.1
肥料B(5株):10.8, 11.5, 10.2, 11.0, 10.5
独立な2標本t検定を使用する。
\bar{X}_A = 12.67、s_A = 0.653、n_A = 6
\bar{X}_B = 10.80、s_B = 0.495、n_B = 5
プールした分散:
s_p = 0.588
検定統計量:
自由度9のt分布の上側2.5%点:t_{0.025}(9) = 2.262
|T| = 5.24 > 2.262 なので帰無仮説を棄却する。
結論:有意水準5%で、肥料による収穫量に有意な差がある(肥料Aの方が多い)。
まとめ
| 検定の種類 | 検定統計量 | 自由度 | 使う場面 |
|---|---|---|---|
| 1標本t検定 | T = \dfrac{\bar{X} - \mu_0}{s / \sqrt{n}} | n - 1 | 平均が基準値と異なるか |
| 対応のある2標本 | T = \dfrac{\bar{D}}{s_D / \sqrt{n}} | n - 1 | 同じ対象の前後比較 |
| 独立な2標本 (スチューデント) |
T = \dfrac{\bar{X}_A - \bar{X}_B}{s_p \sqrt{\frac{1}{n_A} + \frac{1}{n_B}}} | n_A + n_B - 2 | 2群比較(等分散) |
| 独立な2標本 (ウェルチ) |
T = \dfrac{\bar{X}_A - \bar{X}_B}{\sqrt{\frac{s_A^2}{n_A} + \frac{s_B^2}{n_B}}} | Welch-Satterthwaite | 2群比較(推奨) |
Python実装
SciPyを使ったt検定の実装例を示す。
import numpy as np
from scipy import stats
# === 1標本t検定 ===
print("=== 1標本t検定 ===")
# 菓子の重量データ(表記30g)
candy = np.array([28.5, 29.2, 28.8, 29.5, 28.3, 29.0, 28.7, 29.3])
mu0 = 30
# 手計算
n = len(candy)
x_bar = np.mean(candy)
s = np.std(candy, ddof=1)
t_stat = (x_bar - mu0) / (s / np.sqrt(n))
p_value = 2 * stats.t.sf(abs(t_stat), df=n-1)
print(f"標本平均 = {x_bar:.4f}")
print(f"標本標準偏差 = {s:.4f}")
print(f"t統計量 = {t_stat:.3f}")
print(f"P値 = {p_value:.6f}")
# scipyで直接計算
t_scipy, p_scipy = stats.ttest_1samp(candy, mu0)
print(f"scipy: t = {t_scipy:.3f}, P = {p_scipy:.6f}")
print()
# === 対応のある2標本t検定 ===
print("=== 対応のある2標本t検定 ===")
before = np.array([65, 72, 58, 80, 68, 75])
after = np.array([70, 78, 62, 85, 75, 79])
diff = after - before
print(f"差の平均 = {np.mean(diff):.3f}")
print(f"差の標準偏差 = {np.std(diff, ddof=1):.3f}")
t_paired, p_paired = stats.ttest_rel(after, before)
print(f"t統計量 = {t_paired:.3f}")
print(f"P値 = {p_paired:.6f}")
print()
# === 独立な2標本t検定(等分散を仮定)===
print("=== 独立な2標本t検定(スチューデント)===")
factory_a = np.array([245, 252, 248, 251, 247, 253, 250, 246])
factory_b = np.array([238, 242, 240, 244, 239, 241, 243, 237, 245, 241])
print(f"工場A: 平均={np.mean(factory_a):.1f}, 標準偏差={np.std(factory_a, ddof=1):.3f}")
print(f"工場B: 平均={np.mean(factory_b):.1f}, 標準偏差={np.std(factory_b, ddof=1):.3f}")
# 等分散を仮定
t_student, p_student = stats.ttest_ind(factory_a, factory_b, equal_var=True)
print(f"t統計量 = {t_student:.3f}")
print(f"P値 = {p_student:.6f}")
print()
# === ウェルチのt検定(等分散を仮定しない)===
print("=== ウェルチのt検定 ===")
t_welch, p_welch = stats.ttest_ind(factory_a, factory_b, equal_var=False)
print(f"t統計量 = {t_welch:.3f}")
print(f"P値 = {p_welch:.6f}")