Math-01.显著性检验-08.正态性检验

正态性检验判断样本是否来自 正态分布,是选用 t 检验ANOVA参数检验前的常见诊断。常用 Shapiro-WilkAnderson-DarlingQQ 图

段末注释QQ 图(quantile-quantile plot)将样本分位数与理论正态分位数对比,直线表示近似正态。

系列01 总论 | 分布:20.正态


1. 检验问题(D1)

图 1 正态性检验直观

  • $H_0$:数据来自正态分布
  • $H_1$:非正态

注意:不拒绝 $H_0$ 证明正态,只表示无足够证据拒绝;应结合 QQ 图与样本量。


2. 数据条件(D2)

条件 说明
连续 离散大量结时 Shapiro 需谨慎
$n$ 范围 Shapiro 常用 $3 \le n \le 5000$
独立 i.i.d.
用途 诊断而非最终科研结论

3. 常用方法(D3–D4)

图 2 QQ 图与检验

方法 特点
Shapiro-Wilk 小样本功效高,常用
Anderson-Darling 对尾部更敏感
Kolmogorov-Smirnov 05.KS
QQ 图 视觉诊断,无 p 值
偏度/峰度 辅助,非正式检验

4. 适用场景(D5–D7)

图 3 适用场景

场景 做法
t 检验前 Shapiro + QQ
ANOVA 前 各组残差 / 各组 Shapiro
回归残差 残差 QQ
酶活偏态 失败则 log 变换或 Mann-Whitney

5. 局限与误用(D8)

图 4 局限

问题 说明
大 $n$ 必拒绝 微小偏离也「显著非正态」
小 $n$ 功效低 非正态也「不显著」
仅检验正态 不检验方差齐性(Levene)
通过正态即可 t 仍须独立、方差齐
忽略变换 log / Box-Cox 后再检

6. 示例代码

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
import numpy as np
from scipy import stats
import matplotlib.pyplot as plt

rng = np.random.default_rng(42)
normal_data = rng.normal(0, 1, 30)
skew_data = rng.lognormal(0, 0.8, 30)

for name, data in [("normal", normal_data), ("lognormal", skew_data)]:
w, p = stats.shapiro(data)
print(f"{name}: Shapiro W={w:.4f}, p={p:.4f}")

# Anderson-Darling
ad = stats.anderson(normal_data, dist='norm')
print(f"AD statistic={ad.statistic:.3f}, critical 5%={ad.critical_values[2]:.3f}")

# QQ plot
fig, axes = plt.subplots(1, 2, figsize=(10, 4))
for ax, data, title in zip(axes, [normal_data, skew_data], ["Normal", "Log-normal"]):
stats.probplot(data, dist="norm", plot=ax)
ax.set_title(title)
plt.savefig("normality_qq.png", dpi=150)

# 变换后重检
log_skew = np.log(skew_data)
print("log-transform Shapiro p:", stats.shapiro(log_skew).pvalue)

7. 小结

  • 正态性检验为参数检验的前提诊断;Shapiro + QQ 图并用。
  • 非正态:变换、06 Mann-Whitney 或非参。
  • 大样本下 p 值易显著,看图形与稳健方法。

系列导航02 t | 05 KS


参考文献

  1. scipy.stats.shapiro
-------------本文结束感谢您的阅读-------------