7.9 非参数检验¶
小率在奶茶店做等待时间调查。大多数人 5 到 15 分钟拿到饮品,但有一位顾客因为外卖单插队等了 48 分钟。均值被这个极端值拖得很高,t 检验也跟着摇摆。
一个 48 分钟就能把结论带跑,那还怎么检验?
这时可以少看具体数值,多看排序。这就是非参数检验的入口。
7.9.1 把数值换成名次¶
非参数检验(Nonparametric Tests)通常不要求总体服从正态分布。很多非参数方法会把数据换成秩(Rank),也就是排序名次。
| 原始等待时间 | 5 | 8 | 9 | 11 | 12 | 48 |
|---|---|---|---|---|---|---|
| 排名 | 1 | 2 | 3 | 4 | 5 | 6 |
48 分钟依然最大,但在秩里只是第 6 名,不会像原始数值那样把均值猛烈拉走。
秩只保留谁大谁小,会不会损失信息?
会损失一点,但换来稳健。偏态、离群、评分数据经常值得这样做。
7.9.2 选哪个非参数检验¶
常见参数检验都有对应的非参数版本:
| 问题 | 参数方法 | 非参数方法 |
|---|---|---|
| 一组或配对差值是否偏离 0 | 单样本/配对 t | Wilcoxon 符号秩 |
| 两个独立组是否不同 | 独立样本 t | Mann-Whitney U |
| 三组及以上是否不同 | ANOVA | Kruskal-Wallis |
| 两个变量是否单调相关 | Pearson 相关 | Spearman 秩相关 |
三秒判断法
数据是评分、排名、严重偏态、小样本或有离群值时,优先考虑非参数检验。若样本量大且分布没有明显问题,参数检验通常更有功效。
7.9.3 Mann-Whitney U 的直觉¶
假设比较两家奶茶店等待时间。把两组等待时间混在一起排序,如果 A 店整体更快,那么 A 店的排名会更多挤在前面。
Mann-Whitney U 检验的原假设是:
\[
H_0: \text{两组等待时间来自相同分布}
\]
它不直接问均值是否相等,而是问两组整体位置是否有系统差异。
所以非参数检验不是“低配版”,只是问法更稳健?
对。它牺牲一点数值细节,换来对坏数据的耐受。
7.9.4 Python 同时跑参数和非参数¶
完整脚本见:docs/assets/scripts/ch07_hypothesis_testing/09_nonparametric_tests/main.py。
import numpy as np
from scipy import stats
rng = np.random.default_rng(7)
old = rng.lognormal(mean=2.1, sigma=0.35, size=24)
new = rng.lognormal(mean=1.9, sigma=0.35, size=24)
old[-1] = 48
t_stat, t_p = stats.ttest_ind(old, new, equal_var=False)
u_stat, u_p = stats.mannwhitneyu(old, new, alternative="two-sided")
print(f"Welch t: t = {t_stat:.2f}, p = {t_p:.4f}")
print(f"Mann-Whitney U: U = {u_stat:.0f}, p = {u_p:.4f}")
print(f"旧版中位数 = {np.median(old):.1f}, 新版中位数 = {np.median(new):.1f}")
需要注意
非参数检验不等于“完全没有假设”。例如 Mann-Whitney U 常被解释为位置差异,但若两组分布形状差很多,它检验到的可能是分布整体差异,而不只是中位数差异。
小率的笔记本
非参数检验的关键词是“秩”。当均值和正态假设被偏态、离群值、评分等级搅乱时,先把数据排序,再用 Wilcoxon、Mann-Whitney、Kruskal-Wallis 或 Spearman。

