製造業の品質管理では、製品の寸法や重量の「ばらつき」が重要な管理対象となる。平均値が規格内であっても、ばらつきが大きければ不良品が発生しやすくなるためだ。このばらつきを表す指標が分散である。
母平均の信頼区間では母平均の区間推定を扱ったが、本記事では母分散の区間推定と、2つの母集団の分散比の区間推定を解説する。母分散の推定にはカイ二乗分布を、分散比の推定にはF分布を用いる。
母分散の区間推定
母集団が正規分布 N(\mu, \sigma^2) に従うとき、母分散 \sigma^2 の信頼区間を求める。母平均 \mu は未知とする。
カイ二乗分布との関係
この母集団から独立に抽出した標本 X_1, X_2, \ldots, X_n について、偏差平方和を
とおく。このとき、統計量
は自由度 n-1 のカイ二乗分布に従う。自由度が n ではなく n-1 になるのは、偏差の計算に標本平均 \bar{X} を使うことで1つの自由度が失われるためである。
偏差 X_i - \bar{X} の総和は必ず0になる(\sum_{i=1}^{n}(X_i - \bar{X}) = 0)。そのため、n 個の偏差のうち n-1 個が決まれば残りの1個は自動的に決まる。自由に値を取れる個数が n-1 なので、自由度は n-1 となる。
信頼区間の導出
自由度 n-1 のカイ二乗分布の上側 \dfrac{\alpha}{2} 点を \chi^2_{\alpha/2}(n-1)、上側 1-\dfrac{\alpha}{2} 点を \chi^2_{1-\alpha/2}(n-1) とすると
が成り立つ。\chi^2 = S/\sigma^2 を代入して \sigma^2 について整理すると
または不偏分散 s^2 = \dfrac{S}{n-1} を使って
カイ二乗分布は正規分布やt分布と異なり左右非対称なので、信頼区間の下限と上限で異なる分位点を使う。95%信頼区間では \chi^2_{0.025}(n-1)(上側2.5%点)と \chi^2_{0.975}(n-1)(上側97.5%点)を用いる。
計算例
ある部品の直径を10個測定したところ、不偏分散は s^2 = 18 mm² だった。母分散 \sigma^2 の95%信頼区間を求める。
自由度 n-1 = 9 のカイ二乗分布より、\chi^2_{0.025}(9) = 19.02、\chi^2_{0.975}(9) = 2.70 である。
95%信頼区間は (8.52, 60.0) mm² となる。母標準偏差の信頼区間は平方根をとって (2.92, 7.75) mm である。
分散比の区間推定
2つの独立した母集団の分散を比較したい場合、分散の比 \dfrac{\sigma_1^2}{\sigma_2^2} の信頼区間を求める。これにはF分布を用いる。
F分布との関係
第1の母集団 N(\mu_1, \sigma_1^2) から n_1 個、第2の母集団 N(\mu_2, \sigma_2^2) から n_2 個の標本を独立に抽出する。それぞれの不偏分散を s_1^2、s_2^2 とすると、統計量
は自由度 (n_1 - 1, n_2 - 1) のF分布に従う。
信頼区間の導出
自由度 (\phi_1, \phi_2) = (n_1-1, n_2-1) のF分布の上側 \dfrac{\alpha}{2} 点を F_{\alpha/2}(\phi_1, \phi_2)、上側 1-\dfrac{\alpha}{2} 点を F_{1-\alpha/2}(\phi_1, \phi_2) とすると
F の定義を代入し、分散比 \dfrac{\sigma_1^2}{\sigma_2^2} について整理すると
計算例
2つの工場A、Bで同じ製品を製造している。品質のばらつきを比較するため、工場Aから12個、工場Bから16個の製品をサンプリングしたところ、不偏分散はそれぞれ s_1^2 = 25、s_2^2 = 16 だった。分散比 \dfrac{\sigma_1^2}{\sigma_2^2} の95%信頼区間を求める。
自由度 (\phi_1, \phi_2) = (11, 15) のF分布より、F_{0.025}(11, 15) = 3.01、F_{0.975}(11, 15) = 0.300 である。
95%信頼区間は (0.52, 5.21) となる。この区間は1を含むため、95%の信頼率では「2つの工場の分散が異なる」とは言えない。
分散比の95%信頼区間が1を含む場合、「2つの母分散が等しい」という帰無仮説を有意水準5%で棄却できない。逆に、信頼区間が1を含まない場合は、分散に有意な差があると判断できる。
練習問題
n = 16、s^2 = 20、自由度 n-1 = 15
95%信頼区間は (10.91, 47.92)
母集団1: n_1 = 10、s_1^2 = 36
母集団2: n_2 = 8、s_2^2 = 16
(F_{0.025}(9, 7) = 4.82、F_{0.975}(9, 7) = 0.238)
自由度 (\phi_1, \phi_2) = (9, 7)
95%信頼区間は (0.47, 9.45)。1を含むため、分散に有意な差があるとは言えない。
信頼区間の上限/下限の比は
を満たせばよい。いくつかの自由度で計算すると:
- 自由度9: 19.02 / 2.70 = 7.04
- 自由度15: 27.49 / 6.26 = 4.39
- 自由度30: 47.0 / 16.8 ≈ 2.80
概算で n \ge 31 程度が必要。
まとめ
| 推定対象 | 使用する分布 | 自由度 |
|---|---|---|
| 母分散 \sigma^2 | カイ二乗分布 | n - 1 |
| 分散比 \sigma_1^2 / \sigma_2^2 | F分布 | (n_1 - 1, n_2 - 1) |
| 項目 | 95%信頼区間 |
|---|---|
| 母分散 | \left( \dfrac{(n-1)s^2}{\chi^2_{0.025}}, \dfrac{(n-1)s^2}{\chi^2_{0.975}} \right) |
| 分散比 | \left( \dfrac{s_1^2/s_2^2}{F_{0.025}}, \dfrac{s_1^2/s_2^2}{F_{0.975}} \right) |
Python実装
SciPyを使って母分散と分散比の信頼区間を計算する。
import numpy as np
from scipy import stats
# === 母分散の信頼区間 ===
print("=== 母分散の区間推定 ===")
n = 10
s2 = 18 # 不偏分散
alpha = 0.05
df = n - 1
# カイ二乗分布の分位点
chi2_lower = stats.chi2.ppf(alpha/2, df) # 下側2.5%点
chi2_upper = stats.chi2.ppf(1 - alpha/2, df) # 上側2.5%点
# 信頼区間
ci_lower = (n - 1) * s2 / chi2_upper
ci_upper = (n - 1) * s2 / chi2_lower
print(f"標本サイズ: n = {n}")
print(f"不偏分散: s² = {s2}")
print(f"自由度: {df}")
print(f"χ²_0.975({df}) = {chi2_lower:.3f}")
print(f"χ²_0.025({df}) = {chi2_upper:.3f}")
print(f"母分散の95%信頼区間: ({ci_lower:.2f}, {ci_upper:.2f})")
print(f"母標準偏差の95%信頼区間: ({np.sqrt(ci_lower):.2f}, {np.sqrt(ci_upper):.2f})")
print()
# === 分散比の信頼区間 ===
print("=== 分散比の区間推定 ===")
n1, n2 = 12, 16
s1_sq, s2_sq = 25, 16
df1, df2 = n1 - 1, n2 - 1
# F分布の分位点
f_lower = stats.f.ppf(alpha/2, df1, df2)
f_upper = stats.f.ppf(1 - alpha/2, df1, df2)
# 信頼区間
ratio = s1_sq / s2_sq
ci_lower_f = ratio / f_upper
ci_upper_f = ratio / f_lower
print(f"標本1: n₁ = {n1}, s₁² = {s1_sq}")
print(f"標本2: n₂ = {n2}, s₂² = {s2_sq}")
print(f"自由度: ({df1}, {df2})")
print(f"F_0.975({df1},{df2}) = {f_lower:.4f}")
print(f"F_0.025({df1},{df2}) = {f_upper:.4f}")
print(f"s₁²/s₂² = {ratio:.4f}")
print(f"分散比の95%信頼区間: ({ci_lower_f:.3f}, {ci_upper_f:.3f})")
# 1を含むか判定
if ci_lower_f <= 1 <= ci_upper_f:
print("→ 信頼区間は1を含む(分散に有意差なし)")
else:
print("→ 信頼区間は1を含まない(分散に有意差あり)")
print()
# === 関数化 ===
def variance_ci(s2, n, alpha=0.05):
"""母分散の信頼区間を計算"""
df = n - 1
chi2_l = stats.chi2.ppf(alpha/2, df)
chi2_u = stats.chi2.ppf(1 - alpha/2, df)
return (df * s2 / chi2_u, df * s2 / chi2_l)
def variance_ratio_ci(s1_sq, n1, s2_sq, n2, alpha=0.05):
"""分散比の信頼区間を計算"""
df1, df2 = n1 - 1, n2 - 1
f_l = stats.f.ppf(alpha/2, df1, df2)
f_u = stats.f.ppf(1 - alpha/2, df1, df2)
ratio = s1_sq / s2_sq
return (ratio / f_u, ratio / f_l)
# 使用例
print("=== 関数の使用例 ===")
ci = variance_ci(s2=20, n=16)
print(f"variance_ci(s2=20, n=16): ({ci[0]:.2f}, {ci[1]:.2f})")
ci_ratio = variance_ratio_ci(s1_sq=36, n1=10, s2_sq=16, n2=8)
print(f"variance_ratio_ci(36, 10, 16, 8): ({ci_ratio[0]:.2f}, {ci_ratio[1]:.2f})")