1. 为什么需要正态性检验?
做数据分析的朋友们应该都听过一个词叫"正态分布",它就像统计学里的黄金标准,很多高级分析方法(比如t检验、方差分析、回归分析)都要求数据符合这个标准。但现实中的数据往往没那么听话,这时候就需要先做个"体检"——正态性检验。
我刚开始做数据分析时,曾经直接用t检验分析了一组销售数据,结果被导师一眼看穿问题:"你这数据明显右偏,做t检验不合适啊!"后来才知道,如果数据不符合正态分布却强行用这些方法,得出的结论可能完全不靠谱。
2. S-W检验到底是什么?
在所有正态性检验方法中,Shapiro-Wilk检验(简称S-W检验)是小样本情况下的"金牌裁判"。它由Shapiro和Wilk在1965年提出,通过计算一个神奇的W统计量来判断数据是否服从正态分布。
原始版S-W检验有个小遗憾:只适用于8≤n≤50的样本量。好在Royston教授后来改进了算法,让检验范围扩大到12≤n≤5000,这就是现在SPSS等软件内置的改进版S-W检验。
我在分析一组30人的实验数据时,分别用原始版和改进版做了对比测试,发现两种方法的结论基本一致,但改进版的计算过程确实更稳定。
3. Excel实现原始版S-W检验
3.1 数据准备阶段
假设我们有15个产品的销售额数据(单位:万元):
12, 15, 17, 18, 20, 22, 23, 24, 25, 26, 28, 30, 32, 35, 40第一步:排序处理在Excel中:
- 将数据输入A列(A2:A16)
- 使用
=SORT(A2:A16)函数自动排序
第二步:计算关键参数
- 样本量n=15(奇数)
- m=(n-1)/2=7
- 需要查表获取系数a(可从real-statistics.com获取)
3.2 计算W统计量
在Excel中建立计算表格:
| i | x(i) | x(n-i+1) | a_i | 计算项 |
|---|---|---|---|---|
| 1 | 12 | 40 | 0.5150 | =0.5150*(40-12) |
| 2 | 15 | 35 | 0.3306 | =0.3306*(35-15) |
| ... | ... | ... | ... | ... |
W统计量计算公式:
W = [Σa_i(x_(n-i+1) - x_i)]² / Σ(x_i - x̄)²具体操作:
- 在B列计算分子部分:
=SUMPRODUCT(D2:D8, (C2:C8-B2:B8))^2 - 在E列计算分母部分:
=DEVSQ(A2:A16) - 最终W值:
=B17/E17
3.3 结果判断
查S-W临界值表(α=0.05,n=15)得临界值为0.881。我们计算得到W=0.923 > 0.881,因此不能拒绝正态性假设。
小贴士:W值越接近1,数据越符合正态分布。我一般把0.9作为分水岭,但具体还要看样本量对应的临界值。
4. 改进版S-W检验的Excel实现
4.1 计算累计概率
对排序后的数据,计算累计概率:
=RANK.AVG(A2,$A$2:$A$16,1)/(COUNT($A$2:$A$16)+1)计算标准正态分位数:
=NORM.S.INV(B2)
4.2 计算系数a
使用Royston给出的近似公式:
=IF(ROW()=2, 0.2047, IF(ROW()=n, 0.2047, (NORMDIST((ROW()-3.5)/n*0.5,0,1,FALSE)-0.5)/(ROW()-3.5)/n*0.5 ))4.3 计算转换后的Z值
根据公式:
z = (ln(1-W) - μ)/σ其中μ和σ可通过查表获得,在Excel中可以用近似公式计算。
最终p值计算:
=1-NORM.S.DIST(z,TRUE)5. 实战案例演示
我用某电商30天的日销售额数据做了完整演示:
数据清洗:先剔除618大促日的异常值
描述统计:用
=AVERAGE()、=STDEV()看基本分布绘制Q-Q图:
- 排序数据
- 计算理论分位数
- 插入散点图
S-W检验结果:
- W=0.956
- p=0.32 > 0.05
- 结论:符合正态分布
踩坑提醒:有次我忘记数据排序,直接计算导致W值异常偏低。后来发现排序是S-W检验的关键步骤,千万不能省略!
6. 常见问题解答
Q:样本量很大时还需要做正态性检验吗?A:我的经验是,当n>200时,直方图+Q-Q图的组合判断可能更可靠。有次分析500个样本,S-W检验反而过于敏感。
Q:检验结果不显著但直方图明显偏态怎么办?A:这种情况我通常会:
- 尝试数据转换(如取对数)
- 改用非参数检验
- 结合业务背景判断
Q:Excel和SPSS结果不一致?A:确实遇到过。后来发现是SPSS默认使用改进版算法,而我的Excel模板是原始版。建议超过50的样本直接用改进版。
7. 效率提升技巧
- 模板化:把计算公式保存为模板,我做了个带自动查表功能的版本,效率提升80%
- 数据验证:用
=IF(AND(W>0.9, p>0.1),"正态","非正态")自动判断 - 动态图表:连接检验结果和图表,实现结果联动更新
最后分享我的一个真实教训:有次赶项目报告,没做正态性检验就直接用t检验,结果被客户质疑结论。现在我的分析流程里,正态性检验永远是第一步。记住:磨刀不误砍柴工,这一步的时间绝对不能省!