Courses
您是否曾做过 t 检验,拿到一个干净的 p 值,却发现自己从没检查过数据是否服从正态分布?
统计检验并不会在假设被违背时提醒您,它只会给出一个结果。问题在于,t 检验和方差分析(ANOVA)等方法都假设您的数据服从正态分布。若并非如此,您的结论就建立在不牢靠的基础上。
正态性检验能帮助您核验这一假设。既有可视化方法,也有统计方法;了解何时用哪一种、以及如何解读结果,能让您更有把握地为结论背书。
本文将带您走一遍最常见的正态性检验的可视化与统计方法,展示如何在 Python 与 R 中运行,并解释当数据未通过检验时应如何处理。
实践中的正态分布是什么
您也许见过钟形曲线,但这对您的数据实际意味着什么?
正态分布是一种模式:大多数数值聚集在中心,越往两侧走数值越少。将其绘出,您会看到对称的钟形曲线——左侧与右侧互为镜像。

正态分布图
正态分布的独特之处在于,均值、中位数与众数重合于同一点——即钟形中央。不存在左偏或右偏。换言之,数据是平衡的。
这种形态在现实世界的测量数据中屡见不鲜。人体身高、血压读数、制造公差、考试分数——当样本量足够大时,这些往往近似服从正态分布。生物与物理系统的自然变异常常产生这种形状。
话虽如此,并非所有数据都如此。收入数据右偏;网站响应时间往往有长尾。
在现实中,若不加检查就假设正态性,后果可能会非常糟糕。
为何要进行正态性检验
不检查正态性的麻烦在于,多数常见统计检验——t 检验、ANOVA——都是参数检验。
这意味着它们建立在关于数据分布的假设之上,正态性便是其中之一。当该假设失效时,检验背后的数学也随之失效。您仍会得到一个结果,但可能会把您引向错误的结论。
参数检验通过对样本来源总体作出数学假设来发挥作用。当这些假设成立时,它们既有用又准确;当不成立时,p 值就不可靠,您也无法得出准确结论。
这时就轮到非参数检验登场了。
Mann-Whitney U 或 Kruskal-Wallis 等检验不假设正态性——它们基于秩而非原始数值。它们更灵活,但当数据确实正态时往往不如参数检验有效。因此,不必要地切换到它们并非良策。
许多数据科学新手真正的问题是彻底跳过了这一检查。
正态性检验只需几行代码。不做检验则意味着您要么在盲目信任数据,要么根本没想过这个问题。
检查正态性的可视化方法
在进行任何正式检验之前,先画图。可视化能让您迅速了解手头数据的特点。
直方图
直方图展示分布的形状。

直方图示例
若数据近似正态,直方图应呈钟形——中间高、两侧对称地逐渐变矮。您需要留意的是偏度:右侧长尾表示正偏,左侧长尾表示负偏。无论哪种,都预示数据可能并不正态。
直方图的问题在于形状取决于箱宽(分箱数):
- 分箱太少会看起来很平
- 分箱太多会显得锯齿状
在下结论前,务必尝试几种分箱设置。
Q-Q 图
一张Q-Q 图(分位数-分位数图)将您的数据分位数与理论正态分布的分位数进行比较。

Q-Q 图示例
若数据正态,点将沿对角直线分布。偏离该直线之处提示正态性失效的位置。两端上翘表明厚尾;S 形曲线指向偏度问题。
与直方图相比,Q-Q 图更擅长发现细微的偏离——尤其在直方图往往忽略的尾部。
箱线图
箱线图可同时展示中位数、离散程度与离群点。

箱线图示例
若数据近似正态,中位数大致位于箱体中央,两侧“胡须”长度大致相等。若中位数偏移,或一侧胡须明显更长,即为偏度。胡须外的点为离群点。
可视化的一般问题在于主观性。两个人看同一张直方图可能会得出不同结论。先用它们把握数据大致形态,再用正式检验确认。
常见的正态性统计检验
没有一种正态性检验能在所有场景中都是最佳。合适与否取决于样本量以及您想侦测的偏离类型。
Shapiro-Wilk 检验
Shapiro-Wilk 是小到中等样本(通常几百个观测以内)的首选。
它通过将观测值与正态分布下的期望值比较,衡量数据与正态分布的贴合程度。该方法应用广泛、原理清晰,主流统计库都支持。对大多数分析者而言,这是首选检验。
其主要局限是样本量很大时会过于敏感,容易把极小且实际无关紧要的偏差判为显著。
Kolmogorov-Smirnov 检验
Kolmogorov-Smirnov(KS)检验将样本的累积分布与某个理论分布进行比较——此处为正态分布。
它比 Shapiro-Wilk 更通用,可针对任意分布进行检验,而非仅限正态。但在正态性检验上,KS 的检验力弱于 Shapiro-Wilk,因而不易捕捉到细微偏离。它还要求预先指定分布参数,若用同一数据估计参数会引入偏差。
需要快速、通用检查时使用它——不要将其作为主要的正态性检验。
Anderson-Darling 检验
Anderson-Darling 是 KS 的一种变体,但有一处关键差异:它对分布尾部给予更高权重。
这使其更擅长捕捉出现在极端位置的偏离——如厚尾、离群点,或 KS 可能错过的非正态行为。若您的场景对尾部行为敏感,Anderson-Darling 是不错的选择。
D'Agostino-Pearson 检验
D'Agostino-Pearson 采取不同思路。
它不直接比较分布,而是度量数据的两个性质:偏度(不对称性)与峰度(尾部的厚或薄)。
并将二者合成为一个检验统计量。这有助于定位数据为何可能不正态——而不只是判断是否正态。它更适用于较大的样本,在那时偏度与峰度的估计更可靠。
Jarque-Bera 检验
Jarque-Bera 与 D'Agostino-Pearson 类似,也基于偏度与峰度。
它在计量经济学与时间序列分析中常见。与 D'Agostino-Pearson 一样,需要足够大的样本才能给出可靠结果;小样本下该检验并不太可靠。若您从事金融或经济领域,可能会经常遇到它。
总之,小样本先用 Shapiro-Wilk,并配合 Q-Q 图。尾部行为重要时用 Anderson-Darling;想了解偏离性质时用 D'Agostino-Pearson。
如何解读正态性检验结果
每个正态性检验本质上都是假设检验。
其原假设都是:您的数据服从正态分布。检验要回答的问题是:在观测到的数据下,这个原假设成立的可能性有多大?
答案以p 值给出:
- p > 0.05 —— 证据不足以拒绝正态性。可假定数据正态,继续使用参数检验
- p < 0.05 —— 与正态的偏离已达到统计上可检出的程度。拒绝正态性假设
听起来很简单,但很多人会在这里出错。
低 p 值并不告诉您数据“有多不正态”——只说明检测到了差异。样本很大时,正态性检验会极其敏感,哪怕极小的偏离也会被标记为显著,但对分析影响甚微。
反过来的问题也存在。样本很小,即便数据在视觉上明显偏斜,也可能得到 p > 0.05,因为检验力不足以检测到该偏离。
统计显著性与实际显著性并不等同。
p 值只能告诉您是否存在偏离,不会告诉您该偏离对当前分析是否重要。务必将检验结果与 Q-Q 图结合——若点与参考线贴合良好,那么无论 p 值如何,您的数据很可能已“足够正态”。
Python 中的正态性检验
Python 的 scipy.stats 模块提供了进行正态性检验所需的一切,只需几行代码。
以下示例均使用同一数据集——从正态分布中抽取的 100 个样本——方便您复现与跟进。
import numpy as np
from scipy import stats
np.random.seed(42)
data = np.random.normal(loc=0, scale=1, size=100)
Shapiro-Wilk 检验
对较小数据集,优先使用 shapiro() 作为首检。
stat, p_value = stats.shapiro(data)
print(f"Statistic: {stat:.4f}, p-value: {p_value:.4f}")
输出如下:

Python 中 Shapiro-Wilk 检验的输出
p 值明显大于 0.05,因此我们不拒绝正态性。数据看起来正态——这也合理,因为我们是从正态分布生成的。
Kolmogorov-Smirnov 检验
kstest() 将样本与某个命名分布比较。做正态性检验时,传入 "norm" 并提供样本的均值和标准差。
stat, p_value = stats.kstest(data, 'norm', args=(data.mean(), data.std()))
print(f"Statistic: {stat:.4f}, p-value: {p_value:.4f}")

Python 中 Kolmogorov-Smirnov 检验的输出
同样,p > 0.05——没有反对正态性的证据。
在 Python 中使用该检验时,务必通过 args 显式传入均值与标准差。若省略,kstest() 将默认为标准正态(均值=0,标准差=1),除非您的数据已标准化,否则结果将不可靠。
D'Agostino-Pearson 检验
normaltest() 通过联合检验偏度与峰度来判断正态性,更适用于较大的样本。
stat, p_value = stats.normaltest(data)
print(f"Statistic: {stat:.4f}, p-value: {p_value:.4f}")

Python 中 D'Agostino-Pearson 检验的输出
依然是 p > 0.05。这里数据通过了三种检验,这也在预期之中——毕竟我们生成的是正态数据。在实践中,这些检验常会出现分歧,尤其在 0.05 附近。当发生这种情况时,请回到 Q-Q 图来做最终判断。
R 中的正态性检验
R 自带用于正态性检验的函数。完成基础功能无需额外包。
与 Python 示例一样,下面也使用同一数据集:来自正态分布的 100 个样本。
set.seed(42)
data <- rnorm(100, mean = 0, sd = 1)
Shapiro-Wilk 检验
shapiro.test() 是小到中等样本的首选。直接传入数据向量即可:
shapiro.test(data)

R 中 Shapiro-Wilk 检验的输出
p > 0.05——没有反对正态性的证据。W 统计量范围为 0 到 1,越接近 1 说明数据越贴近正态分布。
Kolmogorov-Smirnov 检验
ks.test() 将样本与理论分布比较。做正态性检验时,指定 "pnorm" 并传入样本均值与标准差。
ks.test(data, "pnorm", mean(data), sd(data))

R 中 Kolmogorov-Smirnov 检验的输出
仍为 p > 0.05。与 Python 中相同的注意事项:务必传入 mean(data) 与 sd(data)。否则会默认比较标准正态,除非您的数据已标准化,否则会扭曲结果。
Q-Q 图
R 内置的 qqnorm() 与 qqline() 两行代码即可绘制 Q-Q 图。
qqnorm(data, main = "Q-Q Plot")
qqline(data, col = "steelblue", lwd = 2)

R 中的 Q-Q 图
qqnorm() 将样本分位数与理论正态分位数作图;qqline() 绘制参考线。点紧贴该线意味着数据表现接近正态;两端的偏离提示值得关注的尾部问题。
当数据不正态时该怎么办
若数据未通过正态性检验,您有几种稳妥的应对方式。
对数据做变换
有时可以通过对数据做变换,使其更接近正态,再在变换后的数值上运行原有检验。
对数变换最常见。它适用于右偏数据——如收入、响应时间或右侧长尾的生物测量。Python 中使用 np.log(data),R 中用 log(data)。
平方根变换较为温和,适用于中等偏度,且当数据包含 0 时很有用(因为无法对 0 取对数)。Python 用 np.sqrt(data),R 用 sqrt(data)。
变换后请重新进行正态性检验。若通过,可继续使用参数检验——但请记得以变换后的量纲来解读结果。
使用非参数检验
若变换无效或不适用,请切换到非参数检验。它们不假设正态性——通过对数据排序而非使用原值来进行推断。
- Mann-Whitney U 检验是独立样本 t 检验的非参数替代方案。用于比较两个组
- Kruskal-Wallis 检验是一元方差分析的非参数版本。用于比较三个或以上的组
两者在 scipy.stats(mannwhitneyu() 与 kruskal())以及 R 的 base 包(wilcox.test() 与 kruskal.test())中均可使用。
依靠大样本
当样本足够大时,常常可以不再过分担心正态性。
根据中心极限定理,随着样本量增大,样本均值的抽样分布趋近于正态——无论原始数据的分布如何。实际上,即便底层数据不完美正态,参数检验在大样本下通常也较为可靠。
正态性检验中的常见错误
正态性检验并不难——您已经看到只需一行代码。但仍有不少踩坑方式。
以下是数据科学新手常见的一些错误:
- 只看 p 值: p 值只告诉您是否检测到了偏离,而非偏离有多大或是否重要。将 p > 0.05 视为绿灯、p < 0.05 视为红灯过于粗糙。务必结合 Q-Q 图解读
- 忽视样本量效应: 小样本时,正态性检验可能漏检真实偏离,即便数据肉眼可见地偏斜也会给出 p > 0.05;大样本时,检验过于敏感,会将微小且无关痛痒的偏离标记为显著。样本量会改变 p 值的意义
- 过度检验正态性: 不是每次分析都需要正式的正态性检验。若在探索阶段,一张直方图和一张 Q-Q 图通常足够
- 误读轻微偏离: 现实世界的数据几乎从不“完美正态”。Q-Q 图上轻微偏离参考线,或 p 值略低于 0.05,并不意味着数据远离正态。关键在于是否对您所做的检验“足够正态”
总之,正态性检验只是数据检查中的一环。将其作为众多信号之一,而非最终定论。
何时可以跳过正态性检验
并非总要做正态性检验。若您时间紧迫,知道何时可以跳过,能节省时间且不影响结果。
大型数据集
当样本很大时,中心极限定理保证均值的抽样分布近似正态,而不管原始数据的形状如何。在这种情况下,参数检验通常可靠,正式的正态性检验附加价值不大。
有些统计方法对非正态也具一定鲁棒性。比如线性回归在样本量适中且违背不严重时通常表现良好。(线性回归仍假设残差近似正态。)
探索性分析
在浏览数据、建立直觉或决定进一步研究变量时,一张直方图或 Q-Q 图就足够。正式检验用于验证性分析——当您的结论需要经得起推敲时。
请记住,正态性检验的存在是为了避免您得出错误结论。若结论出错并无实际后果,或您的方法并不依赖正态性,那么该检验是可选项。
结语
正态性检验旨在检查您的假设是否足够成立,从而让结果值得信赖。
没有哪个数据集是“完美正态”的。目标是理解数据的行为并据此选择方法。Q-Q 图告诉您偏离出在哪;正式检验告诉您偏离是否在统计上可检。当二者结合使用,所得图景比单独使用更清晰。
合适的检验取决于情境。小样本用 Shapiro-Wilk;尾部重要时用 Anderson-Darling;无法假定正态时用非参数替代。有时——在大样本或方法具鲁棒性时——甚至无需检验。
觉得 p 值概念令人困惑吗?请阅读我们的《轻松掌握假设检验》一文,确保您能正确解读它们。
正态性检验常见问答
什么是正态性检验?
正态性检验是一种统计方法,用于检查您的数据是否服从正态(高斯)分布。多数常见统计检验——如 t 检验、ANOVA 与线性回归——都假设正态性,因此在分析前核验该假设有助于避免得出错误结论。
我是否总要做正态性检验?
并非总是需要。对于大样本,中心极限定理会让参数检验在底层分布未知时仍然可靠。做探索性分析时,一张直方图或 Q-Q 图通常就够了——正式的正态性检验更多用于验证性分析,尤其当您的结论需要经得起检验时。
如果我的数据未通过正态性检验,该怎么办?
有几种选择。您可以对数据做对数或平方根变换,然后重新检验;若变换无效,改用非参数检验,如 Mann-Whitney U(两组比较)或 Kruskal-Wallis(三组及以上比较),它们不假设正态性。
Shapiro-Wilk 与 Kolmogorov-Smirnov 检验有何区别?
Shapiro-Wilk 专为正态性检验设计,最适合小到中等样本。Kolmogorov-Smirnov 更通用——可将样本与任意理论分布比较,而非仅限正态——但在正态性检验这一特定任务上,其检验力弱于 Shapiro-Wilk,更可能错过细微偏离。
如何解读用于正态性的 Q-Q 图?
Q-Q 图将您的数据分位数与理论正态分位数比较。若点落在对角参考线附近,说明数据表现接近正态;在两端的偏离提示尾部问题——S 形曲线指向偏度,而两端同时远离参考线则可能表明尾部比正态分布更厚或更薄。