跳转至

7.9   非参数检验

小率在奶茶店做等待时间调查。大多数人 5 到 15 分钟拿到饮品,但有一位顾客因为外卖单插队等了 48 分钟。均值被这个极端值拖得很高,t 检验也跟着摇摆。

图 7.9.0 非参数检验的等待时间场景

一个 48 分钟就能把结论带跑,那还怎么检验?
这时可以少看具体数值,多看排序。这就是非参数检验的入口。

7.9.1   把数值换成名次

非参数检验(Nonparametric Tests)通常不要求总体服从正态分布。很多非参数方法会把数据换成秩(Rank),也就是排序名次。

原始等待时间 5 8 9 11 12 48
排名 1 2 3 4 5 6

48 分钟依然最大,但在秩里只是第 6 名,不会像原始数值那样把均值猛烈拉走。

图 7.9.1 非参数检验用秩替代原始数值

图 7.9.1   非参数检验把偏态数值、离群值和顺序评分转化为更稳健的秩信息。
秩只保留谁大谁小,会不会损失信息?
会损失一点,但换来稳健。偏态、离群、评分数据经常值得这样做。

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。