第17章 测试人员必备的统计学基础
2026/9/19大约 3 分钟
第17章 测试人员必备的统计学基础
统计学是AI测试的底层语言。不懂统计就无法正确解读评估指标、设计A/B测试、判断模型差异是否显著。本章精
选测试人员最需要的统计知识。
17.1 描述统计
17.1.1 集中趋势
| 指标 | 计算方法 | 适用场景 | 注意事项 |
|---|---|---|---|
| 均值(Mean) | 所有值的算术平均 | 数据近似正态分布 | 受极端值影响大 |
| 中位数(Median) | 排序后中间位置的值 | 数据有偏态/异常值 | 鲁棒性好 |
| 众数(Mode) | 出现频率最高的值 | 分类数据 | 可能不唯一 |
17.1.2 离散程度
| 指标 | 含义 | 公式/方法 |
|---|---|---|
| 方差(Variance) | 数据偏离均值的平均程度 | 各值与均值差的平方的均值 |
| 标准差(Std) | 方差的平方根 | 方差开根号,与数据同量纲 |
| 四分位距(IQR) | Q3-Q1,中间50%数据范围 | 不受极端值影响 |
| 变异系数(CV) | 标准差/均值 | 适合比较不同量纲的数据 |
17.2 概率分布
17.2.1 正态分布
正态分布(高斯分布)是最重要的概率分布。许多自然现象和测量误差都近似正态分布。掌握正态分布的68-95-99.7法则:
- 68%的数据落在均值正负1个标准差内
- 95%的数据落在均值正负2个标准差内
- 99.7%的数据落在均值正负3个标准差内
17.2.2 其他重要分布
| 分布 | 适用场景 | AI测试中的应用 |
|---|---|---|
| 二项分布 | n次独立试验中成功次数 | 分类准确率的置信区间 |
| 泊松分布 | 单位时间内事件发生次数 | 错误/异常事件频率 |
| 均匀分布 | 等概率取值 | 随机测试数据生成 |
| 指数分布 | 事件间隔时间 | 服务响应时间建模 |
17.3 假设检验
假设检验是判断'模型A是否真的比模型B好'的科学方法,而非仅凭一次测试结果拍脑袋决定。
17.3.1 假设检验流程
- 提出假设
H0(原假设): 两个模型无差异; H1(备择假设): 模型A更好 - 选择检验方法
根据数据类型选择t检验/卡方检验/Mann-Whitney等 - 确定显著性水平
通常alpha=0.05,即接受5%的假阳性风险 - 计算p值
在原假设成立条件下观察到当前结果的概率 - 做出决策
p < alpha则拒绝原假设(差异显著),否则不拒绝
17.3.2 实际应用示例
from scipy import stats
def compare_models(scores_a, scores_b):'''比较两个模型的性能差异是否显著'''
# 配对t检验(同一测试集上的两个模型)
t_stat, p_value = stats.ttest_rel(scores_a, scores_b)
print(f'模型A均分: {np.mean(scores_a):.3f}')
print(f'模型B均分: {np.mean(scores_b):.3f}')
print(f't统计量: {t_stat:.3f}')
print(f'p值: {p_value:.4f}')
if p_value < 0.05:
better = 'A' if np.mean(scores_a) > np.mean(scores_b) else 'B'
print(f'结论: 模型{better}显著优于另一个')
else:
print('结论: 两模型无显著差异')
# 效应量(Cohen's d)
diff = np.array(scores_a) - np.array(scores_b)
cohens_d = diff.mean() / diff.std()
print(f'效应量(Cohen d): {cohens_d:.3f}')常见误区:p值不是'模型A更好的概率'!p值是'假设两模型相同时,观察到如此差异的概率'。p<0.05也不代表差
异有实际意义——需要同时看效应量(effect size)。
17.4 置信区间
比起点估计(如准确率=92%),置信区间(如92% +/- 2%)更有信息量。它告诉你估计值的不确定性范围。
def accuracy_confidence_interval(n_correct, n_total,
confidence=0.95):'''计算准确率的置信区间(Wilson区间法)'''
from statsmodels.stats.proportion import (
proportion_confint
)
p = n_correct / n_total
lower, upper = proportion_confint(
n_correct, n_total, alpha=1 - confidence,
method='wilson'
)
print(f'准确率: {p:.3f}')
print(f'{confidence*100:.0f}% 置信区间: '
f'[{lower:.3f}, {upper:.3f}]')
return lower, upper