跳转至

6.5   均值的置信区间

小率把 8 盒牛奶摆在桌上,每盒标称 250 mL。他用量杯测了一遍,得到 8 个数:249、252、248、253、251、247、250、252。

他想估计这批牛奶的平均容量。但问题来了:上一节的公式要求总体标准差 \(\sigma\) 已知,现实里我们通常不知道 \(\sigma\)

图 6.5.0 小样本下估计牛奶平均容量

σ 不知道,还能做均值区间吗

可以。用样本标准差 \(s\) 代替总体标准差 \(\sigma\),但必须承认 \(s\) 也是估出来的。这个额外不确定性会把标准正态 \(z\) 换成 t 分布(Student's t Distribution)

我已经用样本均值估 $\mu$ 了,为什么标准差还要再麻烦一次?
因为你连波动有多大也不知道。用 $s$ 代替 $\sigma$,区间就要更保守一点。

6.5.1   t 分布是在给小样本补保险

\(\sigma\) 已知:

\[ Z=\frac{\bar X-\mu}{\sigma/\sqrt n}\sim N(0,1) \]

\(\sigma\) 通常未知,只能用 \(s\) 代替:

\[ T=\frac{\bar X-\mu}{s/\sqrt n} \]

这时:

\[ T\sim t_{n-1} \]

图 6.5.1 σ 未知时用 t 分布补上不确定性

t 分布比标准正态尾巴更厚,尤其在样本量小时更明显。尾巴更厚意味着同样 95% 置信水平下,临界值更大,区间更宽。

Student 是谁

t 分布由 William Sealy Gosset 在啤酒厂小样本质量控制问题中推导出来。由于公司不允许公开发表,他用笔名 “Student” 发表,所以今天仍叫 Student's t 分布。


6.5.2   单样本均值 t 区间

当总体近似正态,或样本量足够大时,均值的 t 置信区间是:

\[ \mu \in \bar x \pm t_{\alpha/2,n-1}\cdot\frac{s}{\sqrt n} \]

其中自由度是 \(n-1\)

用牛奶例子手算:

盒号 容量(mL)
1 249
2 252
3 248
4 253
5 251
6 247
7 250
8 252

样本均值:

\[ \bar x = 250.25 \]

样本标准差:

\[ s \approx 2.12 \]

自由度 \(df=7\),95% 临界值 \(t_{0.025,7}\approx 2.365\),所以:

\[ 250.25\pm 2.365\cdot\frac{2.12}{\sqrt 8} \approx 250.25\pm1.77 \]

即:

\[ [248.48,\ 252.02] \]
这个区间包含 250,所以目前看不出平均容量明显偏离标称值?
对。第 7 章假设检验会把这句话写成更正式的判断。

6.5.3   什么时候可以放心用 t 区间

t 区间的常用条件:

  • 数据来自近似正态总体,小样本也可用。
  • 总体不太正态,但样本量较大时,中心极限定理会帮忙。
  • 小样本且明显偏态、有极端值时,谨慎使用,优先考虑 Bootstrap。

小样本最怕离群值

\(n=8\) 时,一个异常值就能明显改变 \(\bar x\)\(s\)。这时不要只套公式,也要画图、查原始记录,必要时用 Bootstrap 做稳健性检查。


6.5.4   Python 计算 t 区间

import numpy as np
from scipy import stats

milk = np.array([249, 252, 248, 253, 251, 247, 250, 252])
n = len(milk)
xbar = milk.mean()
s = milk.std(ddof=1)
tcrit = stats.t.ppf(0.975, df=n - 1)
margin = tcrit * s / np.sqrt(n)

print(f"样本均值 = {xbar:.2f} mL")
print(f"样本标准差 = {s:.2f} mL")
print(f"95% t-CI = [{xbar - margin:.2f}, {xbar + margin:.2f}]")

完整脚本见:

# docs/assets/scripts/ch06_estimation/05_ci_for_mean/main.py

小率的笔记本

\(\sigma\) 已知用 \(z\)\(\sigma\) 未知用 \(t\)。t 区间把“用 \(s\)\(\sigma\)”带来的额外不确定性补进去。样本越小,自由度越小,t 临界值越大,区间越宽。