ヘロログ
統計学

t検定

「この新薬は本当に効果があるのか」「2つの製造ラインで品質に差があるのか」。こうした問いに答えるために、平均値の差を検定する手法が必要となる。その代表格がt検定である。

t検定は1908年、アイルランドのギネスビール醸造所で働いていた統計学者ウィリアム・ゴセットによって開発された。当時、ギネス社は社員の論文発表を禁じていたため、ゴセットは「Student」というペンネームで論文を発表した。そのため、t検定は「スチューデントのt検定」とも呼ばれる。ゴセットが開発したt分布は、少ないサンプルサイズでも信頼性の高い検定を可能にし、品質管理から医学研究まで幅広い分野で活用されている。

本記事では、t検定の基本的な考え方から、1標本t検定、対応のある2標本t検定、独立な2標本t検定まで体系的に解説する。統計的仮説検定の基礎知識があると理解しやすい。

t検定とは

t検定(t-test)は、母集団の平均に関する仮説を検定する手法である。母分散が未知の場合に用いられ、検定統計量がt分布に従うことからこの名がついた。

t検定には主に3つの種類がある。それぞれの違いを図で示す。

1標本t検定 1つの標本 標本平均 比較 基準値 μ₀ 例:規格値500g 対応のある2標本 同じ対象 処理前 X 処理後 Y 差 D = Y − X 平均差 ≠ 0 ? 例:ダイエット効果 独立な2標本 群A 平均、n人 群B 平均、m人 平均A ≠ 平均B ? 例:新薬 vs 既存薬 1標本t検定 対応のある2標本 独立な2標本 標本平均が特定の値と 異なるかを検定 ・製品重量が規格通りか ・平均点が合格ラインか 同じ対象の前後差が 0と異なるかを検定 ・治療前後の血圧変化 ・講習前後のスコア変化 独立した2群の平均が 異なるかを検定 ・薬Aと薬Bの効果比較 ・男性と女性の身長差
図1: t検定の3つの種類

いずれの場合も、母集団が正規分布に従うことを仮定する。サンプルサイズが十分大きい場合(目安として30以上)は、中心極限定理により正規性の仮定が緩和される。

1標本t検定

1標本t検定は、1つの標本から得られた平均が、ある特定の値(理論値や規格値など)と等しいかどうかを検定する手法である。

問題設定

母集団が正規分布 N(\mu, \sigma^2) に従うとする。母分散 \sigma^2未知である。標本 X_1, X_2, \ldots, X_n から、母平均 \mu がある値 \mu_0 と等しいかを検定する。

H_0: \mu = \mu_0 \quad \text{vs.} \quad H_1: \mu \neq \mu_0

検定統計量

標本平均 \bar{X}不偏分散 s^2 を次のように定義する。

\bar{X} = \dfrac{1}{n} \sum_{i=1}^{n} X_i, \quad s^2 = \dfrac{1}{n-1} \sum_{i=1}^{n} (X_i - \bar{X})^2

帰無仮説 H_0: \mu = \mu_0 のもとで、検定統計量

T = \dfrac{\bar{X} - \mu_0}{s / \sqrt{n}}

自由度 n-1 のt分布に従う。この性質を利用して検定を行う。

なぜ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) として、次の条件で帰無仮説を棄却する。

|T| \ge t_{\alpha/2}(n-1) \quad \Rightarrow \quad H_0 \text{ を棄却}

この棄却域を図で示すと以下のようになる。

t分布(自由度 n−1)の両側検定 T f(T) -4 -3 -2 -1 0 1 2 3 4 t α/2 t α/2 棄却域 α/2 棄却域 α/2 採択域 H₀を棄却しない
図2: 両側検定の棄却域(赤い部分に検定統計量が入れば帰無仮説を棄却)

片側検定の場合は、対立仮説の方向に応じて棄却域を設定する。

対立仮説 棄却域 意味
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:仮説の設定

「異なるか」を調べるので両側検定を行う。

H_0: \mu = 30 \quad \text{vs.} \quad H_1: \mu \neq 30

Step 2:統計量の計算

標本平均と標本標準偏差を計算する。

\bar{X} = \dfrac{28.5 + 29.2 + 28.8 + 29.5 + 28.3 + 29.0 + 28.7 + 29.3}{8} = \dfrac{231.3}{8} = 28.9125

各データと平均の差の二乗を計算する。

\begin{aligned} &(28.5-28.9125)^2 = 0.170 \\ &(29.2-28.9125)^2 = 0.083 \\ &(28.8-28.9125)^2 = 0.013 \\ &(29.5-28.9125)^2 = 0.345 \\ &(28.3-28.9125)^2 = 0.375 \\ &(29.0-28.9125)^2 = 0.008 \\ &(28.7-28.9125)^2 = 0.045 \\ &(29.3-28.9125)^2 = 0.150 \end{aligned}
s^2 = \dfrac{0.170 + 0.083 + \cdots + 0.150}{8-1} = \dfrac{1.189}{7} = 0.1699
s = \sqrt{0.1699} = 0.4121

Step 3:検定統計量の計算

T = \dfrac{28.9125 - 30}{0.4121 / \sqrt{8}} = \dfrac{-1.0875}{0.1457} = -7.464

Step 4:棄却域との比較

自由度7のt分布の上側2.5%点は t_{0.025}(7) = 2.365 である。

|T| = 7.464 > 2.365 = t_{0.025}(7)

検定統計量が棄却域に入るので、帰無仮説を棄却する。

結論:有意水準5%で、この菓子の平均重量は30gと異なると判断できる(表記より軽い傾向がある)。

P値による判定

棄却域を使う代わりに、P値(p-value)を計算して判定することもできる。P値とは「帰無仮説が正しいと仮定したとき、観測された検定統計量以上に極端な値が得られる確率」である。

T = −7.46 (グラフ外) P値の概念 T f ( T ) −5 −4 −3 −2 −1 0 1 2 3 4 5 −2.37 2.37 P値の計算 P値 = P(|T| ≥ 7.46)    = 0.00014 (両側の紫色部分の面積) 判定基準 P値 < α → 棄却 0.00014 < 0.05 ✔
図3: P値は「帰無仮説のもとで観測値以上に極端な値が出る確率」(T = −7.46 はグラフ範囲外)

この例では 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かどうかを検定する。

H_0: \mu_D = 0 \quad \text{vs.} \quad H_1: \mu_D \neq 0

D_i を1つの標本とみなせば、対応のある2標本t検定は1標本t検定に帰着される。検定統計量は

T = \dfrac{\bar{D}}{s_D / \sqrt{n}}

となる。ここで \bar{D} は差の標本平均、s_D は差の標本標準偏差である。この統計量は自由度 n-1 のt分布に従う。

計算例

例:学習プログラムの効果

6人の学生に対して、ある学習プログラムの効果を調べた。プログラム受講前後のテスト点数は以下の通りである。

学生受講前受講後差(後−前)
A65705
B72786
C58624
D80855
E68757
F75794

有意水準5%で、学習プログラムに効果があるか検定せよ。

【解答】

効果があるかを調べるので、差が正かどうか(点数が上がったか)の片側検定を行う。

H_0: \mu_D = 0 \quad \text{vs.} \quad H_1: \mu_D > 0

差のデータ:5, 6, 4, 5, 7, 4

\bar{D} = \dfrac{5+6+4+5+7+4}{6} = \dfrac{31}{6} = 5.167
s_D^2 = \dfrac{(5-5.167)^2 + (6-5.167)^2 + \cdots + (4-5.167)^2}{5} = \dfrac{6.833}{5} = 1.367
s_D = \sqrt{1.367} = 1.169

検定統計量を計算する。

T = \dfrac{5.167}{1.169 / \sqrt{6}} = \dfrac{5.167}{0.477} = 10.83

自由度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検定で検証できる。

\sigma_A^2 = \sigma_B^2 = \sigma^2

この共通の分散を推定するため、2群のデータを統合したプールした分散(pooled variance)を計算する。

s_p^2 = \dfrac{(n_A - 1)s_A^2 + (n_B - 1)s_B^2}{n_A + n_B - 2}

これは各群の不偏分散をサンプルサイズに応じて重み付け平均したものである。

検定統計量

帰無仮説 H_0: \mu_A = \mu_B のもとで、検定統計量

T = \dfrac{\bar{X}_A - \bar{X}_B}{s_p \sqrt{\dfrac{1}{n_A} + \dfrac{1}{n_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つの工場の電池寿命に差があるか検定せよ。等分散を仮定する。

【解答】

差があるかを調べるので両側検定を行う。

H_0: \mu_A = \mu_B \quad \text{vs.} \quad H_1: \mu_A \neq \mu_B

各群の統計量を計算する。

\bar{X}_A = \dfrac{245+252+\cdots+246}{8} = 249.0
\bar{X}_B = \dfrac{238+242+\cdots+241}{10} = 241.0
s_A^2 = \dfrac{\sum(X_{Ai}-249)^2}{7} = 8.571 \quad \Rightarrow \quad s_A = 2.928
s_B^2 = \dfrac{\sum(X_{Bi}-241)^2}{9} = 6.667 \quad \Rightarrow \quad s_B = 2.582

プールした分散を計算する。

s_p^2 = \dfrac{7 \times 8.571 + 9 \times 6.667}{8 + 10 - 2} = \dfrac{60 + 60}{16} = 7.50
s_p = \sqrt{7.50} = 2.739

検定統計量を計算する。

T = \dfrac{249.0 - 241.0}{2.739 \times \sqrt{\dfrac{1}{8} + \dfrac{1}{10}}} = \dfrac{8.0}{2.739 \times 0.474} = \dfrac{8.0}{1.299} = 6.16

自由度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検定では、検定統計量を次のように計算する。

T = \dfrac{\bar{X}_A - \bar{X}_B}{\sqrt{\dfrac{s_A^2}{n_A} + \dfrac{s_B^2}{n_B}}}

自由度はWelch-Satterthwaiteの近似式で計算する。

\nu = \dfrac{\left( \dfrac{s_A^2}{n_A} + \dfrac{s_B^2}{n_B} \right)^2}{\dfrac{(s_A^2/n_A)^2}{n_A - 1} + \dfrac{(s_B^2/n_B)^2}{n_B - 1}}

この自由度は一般に整数にならないため、t分布表を使う場合は小数点以下を切り捨てる。

どちらの検定を使うべきか

近年では、等分散の仮定が成り立つかどうかに関わらず、ウェルチのt検定を使用することが推奨されている。等分散が成り立つ場合でもウェルチのt検定は妥当な結果を与え、等分散が成り立たない場合にはスチューデントのt検定より信頼性が高い。多くの統計ソフトではウェルチのt検定がデフォルトとなっている。

練習問題

問1. ある清涼飲料水の表記容量は500mlである。品質管理のため10本を抽出して容量を測定したところ、標本平均は497ml、標本標準偏差は5mlであった。有意水準5%で、平均容量が500mlより少ないか検定せよ。

H_0: \mu = 500 vs H_1: \mu < 500(左片側検定)

検定統計量:

T = \dfrac{497 - 500}{5 / \sqrt{10}} = \dfrac{-3}{1.581} = -1.897

自由度9のt分布の上側5%点:t_{0.05}(9) = 1.833

T = -1.897 < -1.833 なので帰無仮説を棄却する。

結論:有意水準5%で、平均容量は500mlより少ないといえる。

問2. 5人の被験者に対して、睡眠薬の効果を調べた。薬を服用しない場合と服用した場合の睡眠時間(時間)は以下の通りである。有意水準5%で、睡眠薬に効果があるか検定せよ。
被験者服用なし服用あり
16.07.2
25.56.8
36.57.5
47.07.8
55.86.7

対応のある2標本t検定を使用する。

差(服用あり − 服用なし):1.2, 1.3, 1.0, 0.8, 0.9

\bar{D} = 1.04s_D = 0.207

検定統計量:

T = \dfrac{1.04}{0.207 / \sqrt{5}} = \dfrac{1.04}{0.093} = 11.2

自由度4のt分布の上側5%点:t_{0.05}(4) = 2.132

T = 11.2 > 2.132 なので帰無仮説を棄却する。

結論:有意水準5%で、睡眠薬には睡眠時間を延長する効果があるといえる。

問3. 2つの肥料(A, B)を使って植物を育てた。収穫量(kg)は以下の通りである。等分散を仮定して、有意水準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.67s_A = 0.653n_A = 6

\bar{X}_B = 10.80s_B = 0.495n_B = 5

プールした分散:

s_p^2 = \dfrac{5 \times 0.653^2 + 4 \times 0.495^2}{6 + 5 - 2} = \dfrac{2.132 + 0.980}{9} = 0.346

s_p = 0.588

検定統計量:

T = \dfrac{12.67 - 10.80}{0.588 \times \sqrt{\dfrac{1}{6} + \dfrac{1}{5}}} = \dfrac{1.87}{0.588 \times 0.605} = 5.24

自由度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検定の実装例を示す。

t_test.py
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}")
=== 1標本t検定 === 標本平均 = 28.9125 標本標準偏差 = 0.4121 t統計量 = -7.464 P値 = 0.000142 scipy: t = -7.464, P = 0.000142 === 対応のある2標本t検定 === 差の平均 = 5.167 差の標準偏差 = 1.169 t統計量 = 10.826 P値 = 0.000117 === 独立な2標本t検定(スチューデント)=== 工場A: 平均=249.0, 標準偏差=2.928 工場B: 平均=241.0, 標準偏差=2.582 t統計量 = 6.158 P値 = 0.000014 === ウェルチのt検定 === t統計量 = 6.068 P値 = 0.000028