Shapiro-Wilk 检验与 stats.shapiro
使用详解
1. Shapiro-Wilk 检验概述
Shapiro-Wilk 检验是一种用于检验数据是否服从正态分布的非参数统计方法,由 S.S. Shapiro 和 M.B. Wilk 于 1965 年提出。其优势在于对小样本数据(通常 (3 \leq n \leq 5000))具有较高的敏感性和准确性,因此在科研和工程领域被广泛使用。
2. 假设设定
原假设((H_0)):数据服从正态分布。
备择假设((H_1)):数据不服从正态分布。
通过计算统计量 (W) 和对应的 (p) 值进行判断:
若 (p < $\alpha $)(如 ( $\alpha $=0.05)),拒绝 (H_0),认为数据非正态。
若 (p $\geq \alpha $),无法拒绝 (H_0),即无足够证据否定正态性。
3. 统计量 (W) 的计算
Shapiro-Wilk 统计量 (W) 的公式为:
$$
W = \frac{\left( \sum_{i=1}^n a_i x_{(i)} \right)^2}{\sum_{i=1}^n (x_i - \bar{x})^2}
$$
其中:
( $x_{(i)} $) 是样本数据的第 (i) 个顺序统计量(从小到大排序后的值)。
( $a_i $) 是与样本量 (n) 和正态分布理论分位数相关的系数。
( $\bar{x} $) 是样本均值。
特点:
(W) 的取值范围为 ( $0 < W \leq 1 $),值越接近 1,数据越接近正态。
计算依赖样本排序和理论分位数的协方差,复杂度较高,需借助统计软件。
4. stats.shapiro
函数使用
Python 的 scipy.stats
模块提供了 shapiro
函数,可直接调用进行检验。
函数语法
from scipy.stats import shapiro stat, p_value = shapiro(data)
参数说明
data
:一维数组或列表,待检验的数据序列。返回值:
stat
:Shapiro-Wilk 统计量 (W)。p_value
:检验的 (p) 值。
示例代码
import numpy as np from scipy.stats import shapiro # 生成正态分布样本(示例) np.random.seed(42) normal_data = np.random.normal(loc=0, scale=1, size=30) # 生成非正态分布样本(示例) non_normal_data = np.random.exponential(scale=1, size=30) # 正态性检验 def check_normality(data, name): stat, p = shapiro(data) print(f"数据集 {name}:") print(f" W统计量 = {stat:.4f}") print(f" p值 = {p:.4f}") if p > 0.05: print(" 结论:数据服从正态分布 (p > 0.05)") else: print(" 结论:数据不服从正态分布 (p ≤ 0.05)") check_normality(normal_data, "正态数据") check_normality(non_normal_data, "非正态数据")
输出结果示例
数据集 正态数据: W统计量 = 0.9847 p值 = 0.9107 结论:数据服从正态分布 (p > 0.05) 数据集 非正态数据: W统计量 = 0.8622 p值 = 0.0016 结论:数据不服从正态分布 (p ≤ 0.05)
5. 注意事项与常见问题
样本量限制:
推荐样本量 ( $3 \leq n \leq 5000 $),超出范围可能不准确。
大样本(如 (n > 5000))建议改用 Kolmogorov-Smirnov 检验或 Anderson-Darling 检验。
数据要求:
数据需为独立同分布(i.i.d.)的连续变量。
缺失值需提前处理(如删除或插补),否则会报错。
结果解读:
(p > 0.05) 仅表示“无足够证据拒绝正态性”,而非“证明数据正态”。
小样本时检验效力低,可能无法检测到轻微偏离。
6. 与其他正态性检验方法的对比
检验方法 | 适用场景 | 优点 | 缺点 |
---|---|---|---|
Shapiro-Wilk | 小样本(( $n \leq 5000 $)) | 对小样本敏感,准确性高 | 计算复杂,依赖排序统计量 |
Kolmogorov-Smirnov | 大样本,任意分布对比 | 非参数,适用广泛 | 对中心区域敏感,尾部效果差 |
Anderson-Darling | 中等样本,多种分布检验 | 对尾部差异敏感,适用于多种分布 | 计算复杂,需查表 |
Jarque-Bera | 大样本,检验偏度与峰度 | 基于矩(偏度、峰度)的快速检验 | 小样本表现差,仅适用于大样本 |
7. 实际应用建议
综合判断:
结合 Q-Q 图、直方图等图形工具验证。
例如,Q-Q 图中数据点是否沿参考线分布。
数据转换:
若数据非正态,可尝试对数变换(log)、Box-Cox 变换等。
替代方法:
非参数检验(如 Mann-Whitney U 检验)或稳健统计方法。
8. 总结
Shapiro-Wilk 检验是小样本数据正态性检验的首选方法,通过
stats.shapiro
函数可快速实现。需注意样本量限制和检验结果的合理解释,避免过度依赖单一检验。
实际分析中应结合图形观察和多种检验方法,确保结论的可靠性。
附:完整代码流程图
graph TD A[准备数据] --> B{调用shapiro函数} B --> C[获取W统计量和p值] C --> D{判断p值是否≤0.05} D -->|是| E[拒绝原假设,数据非正态] D -->|否| F[不拒绝原假设,数据可能正态]
系统当前共有 468 篇文章