t.interval适用于小样本或总体方差未知情形,基于t分布自动按自由度调整;bootstrap用重采样避免分布假设,适合偏态、异常值或非均值参数估计。

用 scipy.stats.t.interval 计算小样本或未知总体方差的置信区间
当样本量小于 30,或你无法假设总体服从正态分布、且总体标准差未知时,t.interval 是最稳妥的选择。它基于 t 分布,自动根据自由度(n-1)调整临界值。
常见错误是直接套用 norm.interval 而不检查样本量和方差是否已知——这会导致区间过窄,显著低估不确定性。
- 必须传入样本均值
loc和样本标准误scale=std / sqrt(n),不是样本标准差 -
df参数由函数内部根据len(data)-1推导,无需手动指定(除非你传入的是预计算的scale) - 若数据明显偏态(如
skewness > 2),即使 n > 30,t 区间仍可能失真,此时应考虑 bootstrap
from scipy import stats import numpy as np <p>data = np.random.exponential(2, size=25) # 小样本、右偏 n, mean, std = len(data), data.mean(), data.std(ddof=1) se = std / np.sqrt(n) ci = stats.t.interval(0.95, df=n-1, loc=mean, scale=se) </p>
用 numpy.quantile 做非参数 bootstrap 置信区间(适合任意分布)
当你怀疑数据不服从任何经典分布、样本有异常值、或需要估计中位数、分位数等非均值指标的置信区间时,bootstrap 是更鲁棒的方案。它不依赖分布假设,只靠重采样。
容易踩的坑是 bootstrap 迭代次数太少(n_resamples=100)或未设置随机种子导致结果不可复现;另外,对极端分位数(如 0.01)估计不稳定,需至少 10000 次重采样。
- 每次重采样必须使用
replace=True,否则得不到 bootstrap 分布 - 推荐用
np.quantile(..., [0.025, 0.975])直接取双侧 95% 区间,比拟合分布再求逆更快 - 若原始样本量
n ,bootstrap 区间可能严重偏移,此时应谨慎解释或补充收集数据
rng = np.random.default_rng(42)
n_resamples = 5000
boot_means = np.array([
np.mean(rng.choice(data, size=len(data), replace=True))
for _ in range(n_resamples)
])
ci_bootstrap = np.quantile(boot_means, [0.025, 0.975])
何时该用 statsmodels.stats.api.DescrStatsW?
当你需要一次性获取均值、标准误、置信区间、偏度、峰度等多个统计量,并且希望支持加权样本(比如 survey 数据含抽样权重)时,DescrStatsW 比零散调用多个函数更省事、更一致。
注意它默认使用 t 分布,但不会自动检测数据分布形态;如果你传入了权重,std 和 se_mean 的计算会按加权公式更新,这点和裸用 np.std 不同,容易被忽略。
- 构造对象时传入
weights参数后,所有统计量(包括 CI)都会自动加权校正 -
get_confidence_interval()返回的是数组,不是元组,索引为[0]下限、[1]上限 - 不支持直接对中位数做加权置信区间;若需该功能,仍得回退到加权 bootstrap
from statsmodels.stats.api import DescrStatsW <p>weighted_stats = DescrStatsW(data, weights=np.ones_like(data)) ci_w = weighted_stats.get_confidence_interval(alpha=0.05) </p>
大样本下用 norm.interval 的边界条件必须核对
很多人看到“大样本”就无脑用 norm.interval,但关键要看:总体标准差是否已知?样本是否独立同分布?中心极限定理在当前 n 下是否真正起效?
例如,n=200 的指数分布样本,均值的抽样分布仍略右偏,此时用 norm.interval 得到的 95% CI 实际覆盖概率可能只有 93% 左右。真正安全的阈值往往不是固定 n,而是看 abs(skewness)/sqrt(n) 这类经验判据。
- 仅当总体标准差
sigma已知(如实验室标定设备误差),才可用scale=sigma/sqrt(n) - 若仅用样本标准差代替
sigma,却仍调用norm.interval,相当于混用了 z 和 t 的逻辑,CI 会系统性偏窄 - 时间序列或聚类数据不满足独立性,即使 n 很大,也不能直接套用 —— 此时需块 bootstrap 或 HAC 标准误
实际项目中,最常被跳过的一步是分布诊断:画个直方图 + Q-Q 图,花 30 秒确认是否真能放心用 t 或 z。否则后面所有“快速计算”都只是快速出错。
Python免费学习笔记(深入):立即使用
在学习笔记中,你将探索 Python 的核心概念和高级技巧!











