假设检验与置信区间

一句话概述

假设检验和置信区间是统计推断的两大核心工具——前者用来判断"数据是否支持某个假设",后者用来量化"估计值有多精确"。在 AI 中,A/B 测试决定新模型是否优于旧模型,置信区间衡量模型性能的可靠性,p 值帮助我们判断实验结果的显著性。

💡 核心要点:①假设检验是"反证法"——先假设原假设 H₀ 为真,再看数据是否与 H₀ 矛盾,矛盾则拒绝 H₀ ②p 值是"在原假设为真时,观察到当前或更极端结果的概率"——p 值越小,拒绝 H₀ 的证据越强 ③置信区间是对参数估计的不确定性量化——95% 置信区间意味着如果重复实验 100 次,约 95 次区间会包含真实参数 ④在 AI 中,A/B 测试、模型比较、超参数选择、特征重要性评估都依赖假设检验与置信区间

教学与演示

一、假设检验——判断"假设"是否成立

是什么(定义):假设检验(Hypothesis Testing)是一种统计决策方法。设定原假设 H₀(如"新模型与旧模型效果相同")和备择假设 H₁(如"新模型效果更好"),基于样本数据决定是否拒绝 H₀。核心步骤:①设立假设 → ②选择检验统计量 → ③确定显著性水平 α → ④计算 p 值或比较临界值 → ⑤做出决策。

大白话 假设检验就像法庭审判——你先假设被告"无罪"(H₀),然后看证据是否足够"推翻"这个假设。如果证据非常有力(p 值很小),就判"有罪"(拒绝 H₀)。如果证据不够有力,只能说"证据不足"(不能拒绝 H₀),但不能说"被告无罪"(不能证明 H₀ 为真)。

为什么(原理):假设检验基于"小概率事件原理"——如果原假设为真,那么出现极端情况的概率应该很小。如果极端情况确实发生了,就有理由怀疑原假设。显著性水平 α(通常 0.05)是预先设定的"可容忍错误拒绝 H₀ 的概率"。第一类错误(Type I Error)是 H₀ 为真时拒绝 H₀,概率 = α;第二类错误(Type II Error)是 H₁ 为真时未拒绝 H₀,概率 = β。

怎么做(实现)

import numpy as np

# 场景:比较两种网页设计的转化率,做假设检验
np.random.seed(42)  # 固定种子

# 假设:设计A(旧)转化率=10%,设计B(新)转化率=12%
n_A, n_B = 1000, 1000  # 各1000个用户
p_A, p_B = 0.10, 0.12  # 真实转化率

# 模拟A/B测试数据
conversions_A = np.random.binomial(1, p_A, n_A)  # 设计A的转化结果
conversions_B = np.random.binomial(1, p_B, n_B)  # 设计B的转化结果

rate_A = np.mean(conversions_A)  # 设计A转化率
rate_B = np.mean(conversions_B)  # 设计B转化率
print(f"设计A转化率: {rate_A:.4f}")  # 约10%
print(f"设计B转化率: {rate_B:.4f}")  # 约12%
print(f"差异: {rate_B - rate_A:.4f}")  # 约2%

# Z检验:检验两个比例的差异是否显著
# H₀: p_A = p_B, H₁: p_A ≠ p_B
pooled_rate = (np.sum(conversions_A) + np.sum(conversions_B)) / (n_A + n_B)  # 合并转化率
# 标准误
se = np.sqrt(pooled_rate * (1 - pooled_rate) * (1/n_A + 1/n_B))  # 标准误
z_stat = (rate_B - rate_A) / se  # Z统计量
# 双尾检验的p值(用正态近似)
from math import erf, sqrt
def norm_cdf(x):
    return 0.5 * (1 + erf(x / sqrt(2)))  # 正态CDF近似

p_value = 2 * (1 - norm_cdf(abs(z_stat)))  # 双尾p值
print(f"\nZ统计量: {z_stat:.4f}")  # Z值
print(f"p值: {p_value:.4f}")  # p值
alpha = 0.05  # 显著性水平
if p_value < alpha:
    print(f"p值({p_value:.4f}) < α({alpha}),拒绝H₀,两种设计有显著差异")  # 拒绝H₀
else:
    print(f"p值({p_value:.4f}) ≥ α({alpha}),不能拒绝H₀")  # 不能拒绝H₀

什么用(应用):AI 中最常见的应用是 A/B 测试——比较新模型 vs 旧模型、新特征 vs 旧特征时,用假设检验判断性能提升是否"统计显著"而非随机波动。在特征选择中,用 t 检验判断特征在不同类别间的均值是否有显著差异。在异常检测中,检验观测值是否显著偏离正常模式。

哪些坑(缺点):p 值被广泛误解和滥用——p 值不是"原假设为真的概率",也不是"效应大小的度量"。p 值小于 0.05 不代表"结果很重要",只代表"不太可能是随机波动"。p-hacking(通过多次检验、数据筛选等操作人为制造 p<0.05)是严重的科研诚信问题。建议同时报告效应大小(effect size)和置信区间。

二、p 值——拒绝原假设的"底气"

是什么(定义):p 值(p-value)是在原假设 H₀ 为真的前提下,观察到当前统计量或更极端结果的概率。p 值越小,数据与 H₀ 的矛盾越大,拒绝 H₀ 的证据越强。

大白话 p 值就像"如果对方说的是真的,你看到现在这个结果的概率有多大"。如果这个概率非常小(比如 p=0.001),你会觉得"如果对方说的是真的,我怎么可能看到这么离谱的结果?"——于是你倾向于认为对方在说谎(拒绝 H₀)。但如果 p=0.3,你会觉得"这个结果在对方说真话的情况下并不罕见"——于是你不能判断对方说谎。

为什么(原理):p 值的计算依赖于检验统计量的分布。对于 Z 检验,p = 2·P(Z > |z_obs|)(双尾)。对于 t 检验,p = 2·P(T > |t_obs|)(双尾,自由度 n-1)。p 值不是"H₀ 为真的概率"——那是贝叶斯后验概率,需要先验才能计算。p 值是在 H₀ 为真的条件下数据的概率,方向完全相反。

怎么做(实现)

import numpy as np

# 演示 p 值的含义
np.random.seed(42)  # 固定种子

# 场景:检验一枚硬币是否公平(H₀: p=0.5)
def coin_toss_experiment(n_tosses, true_p=0.5):
    """模拟抛硬币实验,返回正面的次数和比例"""
    tosses = np.random.binomial(1, true_p, n_tosses)  # 抛硬币
    n_heads = np.sum(tosses)  # 正面次数
    return n_heads, n_heads / n_tosses  # 返回次数和比例

# 实验1:抛10次,得到8次正面
n1, rate1 = coin_toss_experiment(10, true_p=0.5)  # 公平硬币抛10次
print(f"实验1: 抛10次,{n1}次正面({rate1:.0%})")  # 如果H₀为真,这不太可能

# 计算p值:二项分布 Binomial(10, 0.5) 下,≥8次正面或≤2次正面的概率
from math import comb
p_val_1 = 2 * sum(comb(10, k) * (0.5**10) for k in range(n1, 11))  # 双尾p值
print(f"p值 = {p_val_1:.4f}")  # 约0.109(双尾)—— 在α=0.05下不显著!

# 实验2:抛100次,得到60次正面
n2, rate2 = coin_toss_experiment(100, true_p=0.5)  # 公平硬币抛100次
print(f"\n实验2: 抛100次,{n2}次正面({rate2:.0%})")  # 60%正面

# 使用正态近似计算p值
z_stat_2 = (rate2 - 0.5) / np.sqrt(0.5 * 0.5 / 100)  # Z统计量
from math import erf, sqrt
p_val_2 = 2 * (1 - 0.5 * (1 + erf(abs(z_stat_2) / sqrt(2))))  # 双尾p值
print(f"p值 = {p_val_2:.4f}")  # 约0.046 —— 在α=0.05下显著!

# 关键区别:同样的比例差距(60%),n=100时显著,n=10时不显著
print(f"\n关键洞察:")
print(f"比例相同({rate1:.0%} vs {rate2:.0%}),但")  # 比例相同
print(f"样本量越大,同样的比例差异越容易达到统计显著")  # 样本量影响
print("这就是为什么大样本下即使微小差异也可能'显著'——需要结合效应大小判断")
假设检验与p值\(z = \frac{\hat{p} - p_0}{\sqrt{p_0(1-p_0)/n}}, \quad p\text{-value} = P(|Z| > |z_{\text{obs}}| \mid H_0)\)

什么用(应用):在模型比较中,用 McNemar 检验或配对 t 检验比较两个模型的性能差异是否显著。在特征选择中,用 ANOVA F 检验判断特征是否与目标变量显著相关。在超参数调优中,用 Friedman 检验比较多个配置的排名是否显著不同。

哪些坑(缺点):p 值的最常见误解包括:①p<0.05 不代表"结果很重要"(效应可能很小但统计显著);②p>0.05 不代表"H₀ 为真"(只能说"证据不足");③p 值不能比较——p=0.01 不比 p=0.04 意味着"更显著"(p 值本身不是效应大小的度量);④多重比较问题——做 20 次检验,就算 H₀ 全为真,也大约有 1 次会 p<0.05(纯随机)。解决方案:Bonferroni 校正、FDR 控制。

三、置信区间——估计值的"误差条"

是什么(定义):置信区间(Confidence Interval, CI)是对参数估计的不确定性量化。95% CI 意味着:如果重复实验无数次,每次构造一个 CI,约 95% 的 CI 会包含真实参数值。公式:CI = 点估计 ± 临界值 × 标准误。

大白话 你估计模型准确率是 85%,但这个 85% 有多准?95% 置信区间可能是 [83%, 87%],意思是"真实准确率有 95% 的把握落在这个区间内"(更准确的说法是:这个区间有 95% 的概率包含了真实值)。区间越窄,估计越精确;样本量越大,区间越窄。

为什么(原理):置信区间基于中心极限定理——样本均值近似正态分布。对于均值,95% CI = X̄ ± 1.96 × σ/√n。对于比例,95% CI = p̂ ± 1.96 × √(p̂(1-p̂)/n)。CI 的宽度由三个因素决定:①置信水平(越高越宽);②样本量(越大越窄,∝ 1/√n);③数据变异程度(方差越大越宽)。

怎么做(实现)

import numpy as np

# 演示置信区间:模型准确率的95% CI
np.random.seed(42)  # 固定种子

# 模拟模型在测试集上的表现
true_accuracy = 0.85  # 真实准确率
test_sizes = [50, 100, 200, 500, 1000, 5000]  # 不同测试集大小

print("不同测试集大小下的准确率估计和95%置信区间:")
for n in test_sizes:
    # 模拟一次测试
    correct = np.random.binomial(n, true_accuracy)  # 正确预测次数
    est_acc = correct / n  # 估计准确率

    # 计算95% CI:p̂ ± 1.96 × √(p̂(1-p̂)/n)
    se = np.sqrt(est_acc * (1 - est_acc) / n)  # 标准误
    ci_lower = est_acc - 1.96 * se  # 置信区间下界
    ci_upper = est_acc + 1.96 * se  # 置信区间上界
    contains_true = ci_lower <= true_accuracy <= ci_upper  # 是否包含真实值

    print(f"n={n:5d}: 准确率={est_acc:.4f}, 95%CI=[{ci_lower:.4f}, {ci_upper:.4f}], "
          f"宽度={ci_upper-ci_lower:.4f}, 包含真实值={contains_true}")  # CI宽度随n增大而减小

# 验证:多次重复实验,检查CI覆盖率
n_trials = 1000  # 重复1000次
n_test = 200  # 测试集大小
coverage_count = 0  # CI包含真实值的次数

for _ in range(n_trials):
    correct = np.random.binomial(n_test, true_accuracy)  # 每次模拟
    est_acc = correct / n_test  # 估计准确率
    se = np.sqrt(est_acc * (1 - est_acc) / n_test)  # 标准误
    ci_lower = est_acc - 1.96 * se  # 下界
    ci_upper = est_acc + 1.96 * se  # 上界
    if ci_lower <= true_accuracy <= ci_upper:  # 检查包含
        coverage_count += 1  # 包含计数

print(f"\n重复{n_trials}次,95%CI实际覆盖率: {coverage_count/n_trials:.3f}")  # 应接近95%
置信区间\(\text{CI} = \hat{\theta} \pm z_{\alpha/2} \cdot \text{SE}, \quad \text{SE} = \frac{\sigma}{\sqrt{n}} \quad \text{or} \quad \sqrt{\frac{\hat{p}(1-\hat{p})}{n}}\)

什么用(应用):在论文中报告模型性能时,不仅报告准确率 85%,还应报告 95% CI [83%, 87%]。在 A/B 测试中,报告转化率提升的 CI 而非仅报告"是否显著"。在超参数调优中,用 CI 判断不同配置的差异是否在统计上可信。在强化学习中,报告策略回报的 CI 而非仅报告点估计。

哪些坑(缺点):CI 的常见误解:①95% CI 不意味着"真实值有 95% 的概率落在区间内"(这是贝叶斯可信区间的解释);②CI 的覆盖率依赖于正态近似假设,在小样本或非正态数据下可能不准;③CI 只反映抽样误差,不反映测量误差、模型误设等系统性偏差。

四、AI中的应用——A/B测试、模型比较

是什么(定义):在 AI 中,假设检验和置信区间用于:①A/B 测试——科学比较两个模型/策略/特征的效果;②模型比较——用统计检验判断模型 A 是否显著优于模型 B;③超参数选择——判断不同超参数配置的差异是否统计显著;④特征重要性——用 t 检验或 ANOVA 判断特征是否与目标显著相关。

大白话 你训练了一个新模型,准确率 86%,旧模型是 85%。这个 1% 的提升是"真实改进"还是"测试集上的随机波动"?你上线了一个新推荐策略,CTR 从 5% 升到 5.2%——这 0.2% 的差异够不够"显著"来下结论?假设检验和置信区间就是用来回答这些问题的。

为什么(原理):模型比较中常用的检验:①McNemar 检验——比较两个分类器在相同测试集上的错误率差异(适用于配对数据);②配对 t 检验——比较两个模型在多个测试集上的性能差异;③Wilcoxon 符号秩检验——配对 t 检验的非参数替代;④Friedman 检验——比较多个模型在多个数据集上的排名差异。

怎么做(实现)

import numpy as np

# 模拟A/B测试:比较两个推荐策略的CTR
np.random.seed(42)  # 固定种子

# 策略A(对照组):CTR=5%,策略B(实验组):CTR=5.3%
n_users = 10000  # 每组用户数
p_A, p_B = 0.050, 0.053  # 真实CTR

# 模拟实验数据
clicks_A = np.random.binomial(1, p_A, n_users)  # 策略A的点击结果
clicks_B = np.random.binomial(1, p_B, n_users)  # 策略B的点击结果

ctr_A = np.mean(clicks_A)  # 策略A的CTR
ctr_B = np.mean(clicks_B)  # 策略B的CTR
lift = (ctr_B - ctr_A) / ctr_A * 100  # 相对提升百分比

print(f"策略A CTR: {ctr_A:.4f}")  # 约5%
print(f"策略B CTR: {ctr_B:.4f}")  # 约5.3%
print(f"相对提升: {lift:.2f}%")  # 约6%

# Z检验比较两个比例
pooled = (np.sum(clicks_A) + np.sum(clicks_B)) / (2 * n_users)  # 合并CTR
se = np.sqrt(pooled * (1 - pooled) * (2 / n_users))  # 标准误
z_stat = (ctr_B - ctr_A) / se  # Z统计量
from math import erf, sqrt
p_value = 2 * (1 - 0.5 * (1 + erf(abs(z_stat) / sqrt(2))))  # 双尾p值

# 计算提升的95%置信区间
se_lift = np.sqrt(ctr_A*(1-ctr_A)/n_users + ctr_B*(1-ctr_B)/n_users)  # 差异的标准误
ci_lower = (ctr_B - ctr_A) - 1.96 * se_lift  # 提升的CI下界
ci_upper = (ctr_B - ctr_A) + 1.96 * se_lift  # 提升的CI上界

print(f"\n统计检验结果:")
print(f"Z统计量: {z_stat:.4f}")  # Z值
print(f"p值: {p_value:.4f}")  # p值
print(f"CTR提升的95%CI: [{ci_lower:.4f}, {ci_upper:.4f}]")  # 提升的CI

if p_value < 0.05:
    print(f"结论:p值<0.05,策略B显著优于策略A")  # 统计显著
else:
    print(f"结论:p值≥0.05,差异不显著(可能是随机波动)")  # 不显著

# 演示:样本量对统计显著性的影响
print(f"\n\n演示样本量对统计显著性的影响(相同效应大小):")
for n_small in [1000, 2000, 5000, 10000]:
    c_A = np.random.binomial(1, 0.05, n_small)  # 小样本A
    c_B = np.random.binomial(1, 0.053, n_small)  # 小样本B
    p_pool = (np.sum(c_A)+np.sum(c_B))/(2*n_small)  # 合并CTR
    se_s = np.sqrt(p_pool*(1-p_pool)*(2/n_small))  # 标准误
    z_s = (np.mean(c_B)-np.mean(c_A))/se_s  # Z统计量
    p_s = 2*(1-0.5*(1+erf(abs(z_s)/sqrt(2))))  # p值
    print(f"n={n_small:5d}: Z={z_s:.3f}, p={p_s:.4f}, {'显著' if p_s<0.05 else '不显著'}")  # 样本量影响

什么用(应用):A/B 测试是互联网公司产品迭代的核心方法论——新功能上线前必须通过 A/B 测试验证效果。模型部署时,用统计检验确认新模型确实优于线上模型。在 AutoML 中,统计检验用于判断不同 pipeline 的差异是否显著。在可解释 AI 中,置换特征重要性检验(Permutation Importance Test)判断特征重要性是否显著。

哪些坑(缺点):A/B 测试的常见陷阱:①偷看问题(peeking)——在实验未达到预定样本量时多次检查 p 值,会显著增加第一类错误率;②多重比较——同时测试多个变体,需要多重比较校正;③新奇效应(novelty effect)——用户对新界面/策略的短期反应可能不同于长期行为;④网络效应——社交网络中的用户相互影响,违反独立假设。

概念关系图谱

概念核心含义与AI的关系关联概念
假设检验基于数据判断是否拒绝H₀A/B测试、模型比较、特征选择p值、置信区间、显著性水平
原假设H₀默认假设("无差异")新模型与旧模型"无差异"备择假设、p值
p值H₀为真时观察极端结果的概率判断模型改进是否统计显著假设检验、显著性水平
显著性水平α可容忍的Type I错误率通常设为0.05假设检验、p值
置信区间(CI)参数估计的不确定性范围模型性能的可靠性量化假设检验、标准误
Type I ErrorH₀真时拒绝H₀(假阳性)误以为新模型更好α、假设检验
Type II ErrorH₁真时未拒绝H₀(假阴性)错过真实改进β、统计功效
A/B测试随机对照实验比较两版本模型上线前的标准评估流程假设检验、置信区间
多重比较同时做多次检验增加假阳性超参数调优中的校正Bonferroni、FDR
效应大小差异的实际幅度补充p值,判断差异是否"有意义"假设检验、置信区间

重点答疑

Q1: p 值到底是什么?p=0.04 意味着什么?

p=0.04 意味着:如果原假设 H₀ 为真(如"新模型和旧模型效果相同"),那么观察到当前差异或更大差异的概率只有 4%。这通常被认为"证据足够强"来拒绝 H₀。但 p=0.04 不意味着"新模型有 96% 的概率更好"——这是贝叶斯后验概率,需要先验信息才能计算。p 值也不意味着"差异很大"——在大样本下,微小的差异也可以达到 p<0.05。

Q2: 置信区间和假设检验有什么关系?

它们是等价的!如果 95% CI 不包含 H₀ 指定的值(如 0),则在 α=0.05 水平拒绝 H₀。例如,检验"模型 A 和 B 的准确率差异为 0"时,如果差异的 95% CI 为 [0.5%, 2.5%](不包含 0),则拒绝 H₀。CI 比单纯的 p 值提供更多信息——它不仅告诉你"是否显著",还告诉你"差异有多大"以及"估计有多精确"。

Q3: 为什么 A/B 测试中不能"偷看"(peeking)?

如果你在实验过程中多次检查 p 值,每次看到 p>0.05 就继续实验,看到 p<0.05 就停止,那么即使 H₀ 为真,你最终有远大于 5% 的概率会"偶然"看到 p<0.05。这就是"顺序检验"问题。解决方案:①预先确定样本量和实验时长;②使用序贯检验方法(如 Sequential Probability Ratio Test);③使用贝叶斯 A/B 测试方法。

Q4: 统计显著 vs 实际显著有什么区别?

统计显著(p<0.05)只意味着"差异不太可能是随机波动导致的",但不意味着"差异很大或很重要"。在大样本下,微小的差异(如 CTR 从 5.000% 升到 5.001%)也可以达到统计显著,但这样的提升在实际业务中毫无意义。这就是为什么需要同时报告效应大小(effect size)和置信区间。一个好的实践是:先问"这个差异在实际中有意义吗?"(如提升 0.5% 的 CTR 是否值得全量上线),再问"这个差异在统计上可靠吗?"(p 值和置信区间)。

Q5: 在模型比较中,为什么 McNemar 检验比简单的 t 检验更合适?

McNemar 检验专门为配对数据设计——同一个测试集上,模型 A 和模型 B 对每个样本的预测正确/错误是配对的(不是独立的)。t 检验假设两组样本独立,但在模型比较中,模型 A 和 B 在相同测试集上评估,结果高度相关(两个模型在"简单"样本上都可能正确,在"困难"样本上都可能错误)。McNemar 检验只关注"两个模型预测不一致的样本"(A 对 B 错 vs A 错 B 对),利用这些不一致样本的比例来判断差异是否显著,更准确地反映了模型比较的本质。

章节单词汇总

英文音标术语/释义
Hypothesis Testing/haɪˈpɒθəsɪs ˈtestɪŋ/假设检验,基于数据判断假设是否成立
Null Hypothesis (H₀)/nʌl haɪˈpɒθəsɪs/原假设,默认假设(通常为"无差异")
Alternative Hypothesis (H₁)/ɔːlˈtɜːrnətɪv haɪˈpɒθəsɪs/备择假设,与原假设对立的假设
p-value/piː ˈvæljuː/p值,H₀为真时观察到极端结果的概率
Significance Level (α)/sɪɡˈnɪfɪkəns ˈlevəl/显著性水平,可容忍的Type I错误率
Type I Error/taɪp wʌn ˈerər/第一类错误,H₀为真时拒绝H₀(假阳性)
Type II Error/taɪp tuː ˈerər/第二类错误,H₁为真时未拒绝H₀(假阴性)
Statistical Power/stəˈtɪstɪkəl ˈpaʊər/统计功效,1-β,正确拒绝H₀的概率
Confidence Interval (CI)/ˈkɒnfɪdəns ˈɪntərvəl/置信区间,参数估计的不确定性范围
Effect Size/ɪˈfekt saɪz/效应大小,差异的实际幅度
A/B Testing/eɪ biː ˈtestɪŋ/A/B测试,比较两个版本的随机对照实验
Multiple Comparison/ˈmʌltɪpəl kəmˈpærɪsən/多重比较,同时做多次检验
Bonferroni Correction/ˌbɒnfəˈroʊni kəˈrekʃən/Bonferroni校正,多重比较的p值调整
Standard Error (SE)/ˈstændərd ˈerər/标准误,估计量的标准差
Z-test / t-test/ziː test/ /tiː test/Z检验/t检验,常用的假设检验方法

面试练习

Q1 [单选] 假设检验中,显著性水平 α=0.05 的含义是什么?

  • A. 有 95% 的概率 H₀ 为真
  • B. 容忍在 H₀ 为真时有 5% 的概率错误拒绝 H₀
  • C. 有 5% 的概率 H₁ 为真
  • D. 结果有 95% 的概率是正确的
解答:α 是第一类错误(Type I Error)的概率——当 H₀ 为真时错误拒绝 H₀ 的概率。我们设定 α=0.05,意味着我们愿意承受 5% 的"假阳性"风险。

Q2 [单选] 关于 p 值,以下哪项是正确的?

  • A. p 值是 H₀ 为真的概率
  • B. p 值越大,拒绝 H₀ 的证据越强
  • C. p 值是 H₀ 为真时,观察到当前或更极端结果的概率
  • D. p=0.01 比 p=0.04 意味着效应大 4 倍
解答:p 值的定义是 P(data or more extreme | H₀)。A 错误(混淆了方向)。B 错误(p 越小证据越强)。D 错误(p 值不是效应大小的度量)。

Q3 [多选] 关于置信区间,正确的有?

  • A. 95% CI 意味着如果重复实验很多次,约 95% 的 CI 会包含真实参数
  • B. 样本量越大,CI 越窄
  • C. 95% CI 意味着真实值有 95% 的概率落在区间内
  • D. CI 与假设检验等价——如果 CI 不包含 H₀ 值,则拒绝 H₀
解答:A 正确(频率学派的解释)。B 正确,CI 宽度 ∝ 1/√n。C 错误,这是贝叶斯可信区间的解释。D 正确,CI 和假设检验是等价的。

Q4 [单选] 做了 20 次独立的假设检验(α=0.05),即使所有 H₀ 都为真,期望有多少次会错误拒绝 H₀?

  • A. 0 次
  • B. 1 次
  • C. 5 次
  • D. 20 次
解答:20 × 0.05 = 1 次。这就是多重比较问题——即使没有任何真实效应,平均也会有 1 次"显著"结果。解决方法:Bonferroni 校正(α/20=0.0025)或 FDR 控制。

Q5 [多选] 以下哪些关于 A/B 测试的实践是正确的?

  • A. 实验前预先确定样本量和实验时长
  • B. 避免在实验未完成时多次检查 p 值(偷看)
  • C. 只要 p<0.05 就立即上线新版本
  • D. 同时报告效应大小和置信区间,而非仅报告 p 值
解答:A 正确,避免 peeking 问题。B 正确,偷看会增大第一类错误率。C 错误,还需考虑效应大小和实际意义。D 正确,这是好的统计实践。

Q6 [单选] 第一类错误(Type I Error)是什么?

  • A. H₁ 为真时未拒绝 H₀
  • B. H₀ 为真时拒绝 H₀(假阳性)
  • C. H₀ 为真时未拒绝 H₀
  • D. H₁ 为真时拒绝 H₀
解答:Type I Error = 假阳性 = H₀ 为真时错误拒绝 H₀ = 冤枉好人。概率 = α。Type II Error = 假阴性 = H₁ 为真时未拒绝 H₀ = 放走坏人。概率 = β。

Q7 [单选] 模型 A 准确率 85%,模型 B 准确率 86%,差异的 95% CI 为 [-0.5%, 2.5%]。以下哪个结论正确?

  • A. 模型 B 显著优于模型 A
  • B. 模型 A 显著优于模型 B
  • C. 差异不显著,不能下结论
  • D. 两个模型准确率相同
解答:95% CI 包含 0([-0.5%, 2.5%] 跨越 0),意味着在 α=0.05 水平下不能拒绝 H₀(差异=0)。差异不显著不代表"两个模型相同"——只能说"证据不足以证明有差异"。

Q8 [多选] 在机器学习模型比较中,以下哪些是常见的统计检验方法?

  • A. McNemar 检验(比较两个分类器的错误率)
  • B. 配对 t 检验(比较跨多个测试集的性能)
  • C. Wilcoxon 符号秩检验(配对 t 检验的非参数替代)
  • D. Friedman 检验(比较多个模型在多个数据集上的排名)
解答:以上全部都是模型比较中常用的统计检验方法。McNemar 适用于配对分类结果,配对 t 检验和 Wilcoxon 用于连续性能指标,Friedman 检验用于多模型多数据集比较。

Q9 [单选] 增大样本量,以下哪个会发生变化?

  • A. 显著性水平 α
  • B. 置信区间的宽度(变窄)
  • C. 真实的效应大小
  • D. 总体参数
解答:CI 宽度 ∝ 1/√n,样本量增大 CI 变窄。α 是人为设定的,不变。真实效应大小和总体参数是客观存在的,不受样本量影响。但要注意:大样本下微小差异也可能达到统计显著。

Q10 [单选] 在 A/B 测试中,为什么需要随机分配用户?

  • A. 为了让 p 值更小
  • B. 为了消除混杂因素,确保两组可比
  • C. 为了让实验更省时间
  • D. 为了让置信区间更窄
解答:随机分配是 A/B 测试的核心——通过随机化,两组的用户特征(年龄、性别、使用习惯等)在统计上趋于平衡,这样两组之间的差异就只能归因于实验变量(如新策略 vs 旧策略),而不是其他混杂因素。