跳至内容

正态性检验:如何检查您的数据是否服从正态分布

了解何为正态性检验、其重要性,以及如何使用 Shapiro-Wilk、Kolmogorov-Smirnov 等常见方法与可视化来检查数据,并附 Python 与 R 示例。
更新 2026年5月4日  · 14分钟

您是否曾做过 t 检验,拿到一个干净的 p 值,却发现自己从没检查过数据是否服从正态分布?

统计检验并不会在假设被违背时提醒您,它只会给出一个结果。问题在于,t 检验和方差分析(ANOVA)等方法都假设您的数据服从正态分布。若并非如此,您的结论就建立在不牢靠的基础上。

正态性检验能帮助您核验这一假设。既有可视化方法,也有统计方法;了解何时用哪一种、以及如何解读结果,能让您更有把握地为结论背书。

本文将带您走一遍最常见的正态性检验的可视化与统计方法,展示如何在 Python 与 R 中运行,并解释当数据未通过检验时应如何处理。

实践中的正态分布是什么

您也许见过钟形曲线,但这对您的数据实际意味着什么?

正态分布是一种模式:大多数数值聚集在中心,越往两侧走数值越少。将其绘出,您会看到对称的钟形曲线——左侧与右侧互为镜像。

正态分布图

正态分布图

正态分布的独特之处在于,均值、中位数与众数重合于同一点——即钟形中央。不存在左偏或右偏。换言之,数据是平衡的。

这种形态在现实世界的测量数据中屡见不鲜。人体身高、血压读数、制造公差、考试分数——当样本量足够大时,这些往往近似服从正态分布。生物与物理系统的自然变异常常产生这种形状。

话虽如此,并非所有数据都如此。收入数据右偏;网站响应时间往往有长尾。

在现实中,若不加检查就假设正态性,后果可能会非常糟糕。

为何要进行正态性检验

不检查正态性的麻烦在于,多数常见统计检验——t 检验、ANOVA——都是参数检验

这意味着它们建立在关于数据分布的假设之上,正态性便是其中之一。当该假设失效时,检验背后的数学也随之失效。您仍会得到一个结果,但可能会把您引向错误的结论。

参数检验通过对样本来源总体作出数学假设来发挥作用。当这些假设成立时,它们既有用又准确;当不成立时,p 值就不可靠,您也无法得出准确结论。

这时就轮到非参数检验登场了。

Mann-Whitney U 或 Kruskal-Wallis 等检验不假设正态性——它们基于秩而非原始数值。它们更灵活,但当数据确实正态时往往不如参数检验有效。因此,不必要地切换到它们并非良策。

许多数据科学新手真正的问题是彻底跳过了这一检查。

正态性检验只需几行代码。不做检验则意味着您要么在盲目信任数据,要么根本没想过这个问题。

检查正态性的可视化方法

在进行任何正式检验之前,先画图。可视化能让您迅速了解手头数据的特点。

直方图

直方图展示分布的形状。

直方图示例

直方图示例

若数据近似正态,直方图应呈钟形——中间高、两侧对称地逐渐变矮。您需要留意的是偏度:右侧长尾表示正偏,左侧长尾表示负偏。无论哪种,都预示数据可能并不正态。

直方图的问题在于形状取决于箱宽(分箱数):

  • 分箱太少会看起来很平
  • 分箱太多会显得锯齿状

在下结论前,务必尝试几种分箱设置。

Q-Q 图

一张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 检验的输出

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 检验的输出

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 检验的输出

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 检验的输出

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 检验的输出

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 图

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.statsmannwhitneyu()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 形曲线指向偏度,而两端同时远离参考线则可能表明尾部比正态分布更厚或更薄。

主题

与 DataCamp 一起学习

Courses

Understanding Data Science

2小时
845.3K
An introduction to data science with no coding involved.
查看详情Right Arrow
开始课程
查看更多Right Arrow