正态性检验方法汇总

article/2025/1/5 9:47:50

本文主要对正态性检验方法做了汇总,重点阐述了常用的正态性检验方法的使用场景及其在 R 或 Python 中的实现。

0.概述

正态分布在统计学中有着极为重要的地位,它是 χ 2 \chi^2 χ2分布、 t t t分布、 F F F分布的基础,也是许多统计方法的理论基础,故检验样本是否来自正态分布具有十分重要的意义。
正态性检验的方法有很多,以下列举了一些常见的方法:
图1 正态性检验常见方法
对于正态性检验,建议首先利用直方图或核密度估计得到样本数据的分布图,若分布严重偏态或尖峰,可认为其不是来自于正态分布;若根据直方图或核密估计分布不容易做出判断,再利用各检验方法对其检验。
注意:对于正态性检验,应该避免仅根据一种检验方法便轻易的做出决策,应该使用多种方法,综合评价。 source:参考文献[1]

另还有一些选择正态性检验的规定,仅供参考:

  • SPSS 规定:当样本含量 3≤n≤5000 时,结果以 Shapiro—Wilk(W 检验) 为准,当样本含量 n>5000 结果以 Kolmogorm —Smimov(D 检验,修正后的KS检验,即Lillie检验,见2.2.3) 为准。
  • SAS 规定:当样本含量 n≤2000 时,结果以 Shapim—Wilk(W 检验) 为准,当样本含量 n>2000 时,结果以 Kolmogorov—Smimov(D 检验,修正后的KS检验) 为准。

下文对直方图、Q-Q图以及Shapiro检验、KS检验的原理做一个较为详细的叙述,并给出对应方法在R语言和Python中的实现。另外,对其余方法做简要叙述。

本文内容中理论部分是作者阅读文献后整理得到

1.图示法

1.1 直方图

1.1.1 介绍

直方图(histogram)是用于展示分组数据分布的一种图形,它是用矩形的宽度和高度(即面积)来表示频数分布的。绘制该图时,在平面直角坐标系中,用横轴表示数据分组,纵轴表示频数或频率,这样就形成了一个矩形(即直方图)。
直方图与柱状图的区别:①直方图的高度与宽度都有意义。柱状图是用柱子的长度表示各类别频数的多少,其宽度(表示类别)固定;而直方图是用面积表示各组频数的多少,矩形的高度表示每一组的频数或频率,宽度则表示各组的组距;②由于分组数据具有连续性,直方图的各矩形通常是连续排列,而柱状图则是分开排列;③柱状图用于展示分类型数据,直方图用于展示数值型数据。source:参考文献[2]
直方图的具体绘制方法见参考文献[3] p 15 p_{15} p15

1.1.2 直方图初判

1.2 Q-Q图检验法(直线检验法)

1.2.1 Q-Q图性质

假设样本 X 1 , X 2 , . . . , X n X_1 ,X_2 ,...,X_n X1,X2,...,Xn来自正态总体 N ( µ , σ 2 ) N(µ,σ^2 ) N(µ,σ2). 将样本观测值按照由小到大的顺序排列, 得到次序统计量 x ( 1 ) ≤ x ( 2 ) ≤ ⋅ ⋅ ⋅ ≤ x ( n ) x_{(1)} \le x_{(2)} \le ··· \le x_{(n)} x(1)x(2)⋅⋅⋅x(n)和经验分布函数

F n ( x ) = { 0 x < x ( 1 ) k / n x ( k ) ≤ x ≤ x ( k + 1 ) , k = 1 , 2 , . . . , n 1 x ≥ x ( n ) F_n(x)=\left\{ \begin{array}{rcl} 0 & & {x < x_{(1)}}\\ k/n & & {x_{(k)}\le x \le x_{(k+1)}, k=1,2,...,n}\\ 1 & & {x\ge x{(n)}}\\ \end{array} \right. Fn(x)= 0k/n1x<x(1)x(k)xx(k+1),k=1,2,...,nxx(n)
由于当 n n n充分大时, ∀ ε > 0 \forall \varepsilon >0 ε>0 P ( ∣ F n ( x ) − F ( x ) ∣ > ε ) = 0 P(|F_n(x)-F(x)| >\varepsilon)=0 P(Fn(x)F(x)>ε)=0.
F ( x ) = P ( X ≤ x ) = ϕ ( x − μ σ ) F(x)=P(X\le x) =\phi(\frac{x-\mu}{\sigma}) F(x)=P(Xx)=ϕ(σxμ)
故当 n n n充分大时, F n ( x ) = ϕ ( x − μ σ ) F_n(x)=\phi(\frac{x-\mu}{\sigma}) Fn(x)=ϕ(σxμ), a . s a.s a.s
x − μ σ = ϕ ( − 1 ) ( F n ( x ) ) , a . s \frac{x-\mu}{\sigma}=\phi^{(-1)}(F_n(x)), a.s σxμ=ϕ(1)(Fn(x)),a.s
∀ x ∈ R \forall x \in R xR, 令 ϕ − 1 ( F n ( x ) ) ≡ ω \phi^{-1}(F_n(x)) \equiv \omega ϕ1(Fn(x))ω, 则有
x ≡ σ ω + μ , a . s x \equiv \sigma \omega + \mu, a.s xσω+μ,a.s
上式意味着,当总体是 N ( μ , σ 2 ) N(\mu, \sigma^2) N(μ,σ2)且样本量 n n n充分大时,样本观测值 x x x和逆标准正态分布值 ω \omega ω组成的点 ( ω , x ) (\omega, x) (ω,x)几乎处于一条直线上. source: 参考文献[3] p 22 p_{22} p22

1.2.2 作Q-Q图的步骤

  1. 将原始数据按升序排序,得到次序统计量 x ( 1 ) ≤ x ( 2 ) ≤ ⋅ ⋅ ⋅ ≤ x ( n ) ; x_{(1)} \le x_{(2)} \le ··· \le x_{(n)}; x(1)x(2)⋅⋅⋅x(n);
  2. 计算与 x ( n ) x_{(n)} x(n)相应的事件 X ≤ x ( n ) {X \le x_{(n)}} Xx(n)的概率(每个数据对应的百分位数)
    p i = F n ( x ( n ) ) = i − 0.5 n ; p_i = F_n(x_{(n)})=\frac{i-0.5}{n}; pi=Fn(x(n))=ni0.5;
  3. 对概率 p i p_i pi计算相应的标准正态分位数 u i ( i = 1 , 2 , . . . , n ) ; u_i(i=1,2,...,n); ui(i=1,2,...,n);
  4. 把点 ( u i , x ( i ) ) (u_i, x_{(i)}) (ui,x(i))画在平面直角坐标系上,并考察它们是否在一条直线上;
  5. #计算相关系数
    r = ∑ ( x ( i ) − x ‾ ) ( u i − u ‾ ) ∑ ( x ( i ) − x ‾ ) 2 ∑ ( u i − u ‾ ) 2 r = \frac{\sum (x_{(i)}-\overline{x})(u_i-\overline{u})}{\sqrt{\sum (x_{(i)}-\overline{x})^2}\sqrt{\sum (u_i-\overline{u})^2}} r=(x(i)x)2 (uiu)2 (x(i)x)(uiu)
    并检验其正态性(若点 ( u i , x ( i ) ) (u_i, x_{(i)}) (ui,x(i))近似在一条直线上(相关系数r=…),故可认为样本来自正态总体)

1.2.3 Q-Q图实现

  • R
library(car)
qqnorm(x)
  • Python
# QQ图
import statsmodels.api as sm
sm.qqplot(y,line='s')# PP图
from scipy import stats
stats.probplot(x, dist="norm", plot=plt)

1.3 其他图示法

  • 核密度图判断该样本是否来自正态总体与直方图类似。
  • P-P图见参考文献[3] p 24 p_{24} p24

2.假设检验法

建立假设
H 0 : H_0: H0:总体 X X X的分布为正态分布 N ( μ , σ 2 ) N(\mu, \sigma^2) N(μ,σ2);(样本来自总体与正态分布无显著差异,即符合正态分布)
H 1 : H_1: H1:总体 X X X的分布不是正态分布 N ( μ , σ 2 ) N(\mu, \sigma^2) N(μ,σ2)

2.1 Shapiro-Wilk检验(Shapiro)

W 检验全称 Shapiro-Wilk 检验,是一种基于相关性的算法。计算可得到一个相关系数,它越接近 1 就越表明数据和正态分布拟合得越好。

2.1.1 检验步骤

  1. 将原始数据按升序排序,得到次序统计量 x ( 1 ) ≤ x ( 2 ) ≤ ⋅ ⋅ ⋅ ≤ x ( n ) ; x_{(1)} \le x_{(2)} \le ··· \le x_{(n)}; x(1)x(2)⋅⋅⋅x(n);
  2. 构造统计量
    W = ( ∑ i = 1 n a i x i ) 2 ∑ i = 1 n ( x i − x ‾ ) 2 ; W=\frac{(\sum_{i=1}^{n} a_i x_i)^2}{\sum_{i=1}^{n}(x_i - \overline{x})^2}; W=i=1n(xix)2(i=1naixi)2;

注:这里, x i x_i xi是第 i 个顺序统计量,即第 i 个最小的样本观测值。
$a_i , i=1,2…,n $是常数,它们的定义为
( a 1 , . . . , a n ) = m T V − 1 ( m T V − 1 V − 1 m ) 1 / 2 (a_1, ..., a_n) = \frac{m^TV^{-1}}{(m^TV^{-1}V^{-1}m)^{1/2}} (a1,...,an)=(mTV1V1m)1/2mTV1
m = ( m 1 , . . . , m n ) T m=(m_1, ..., m_n) ^T m=(m1,...,mn)T 是样本顺序统计量的样本均值, V是样本
顺序统计量的协方差矩阵。
(a可直接查表得到)

  1. 计算检验统计量 W W W,并与判断临界值 W α W_\alpha Wα做比较。
  2. 得出结论:若 W < W α W < W_{\alpha} W<Wα,按表上行写明的显著性水平α舍弃正态性假设( H 0 H_0 H0),若 W > W α W>W_\alpha W>Wα, 接受正态性假设.

2.1.2 实现

  • R
shapiro.test(x)
  • Python
from scipy import statsstats.shapiro(x)

2.2 Kolmogorov-Smirnor检验(KS)

KS检验基于经验分布函数,该检验用大样本近似。其检验的是标化后的数据是否服从理论的分布
需要注意的是样本数据如果有结点(及是重复的数据),则无法计算准确的P值。

2.2.1 KS检验步骤

设样本的经验概率分布函数定义为 F n ( x ) = 1 n ∑ i = 1 n I X i ≤ x F_n(x)=\frac{1}{n}\sum_{i=1}^nI_{X_i \le x} Fn(x)=n1i=1nIXix,若 X i ≤ 1 X_i \le 1 Xi1 I X i ≤ x = 1 I_{X_i \le x}=1 IXix=1,否则0.

  1. 构造统计量(样本的累计分布函数与理论分布的分布函数的最大值)
    D n = sup ⁡ x ∣ F n ( x ) − F ( x ) ∣ D_n = \sup_{x}|F_n(x)-F(x)| Dn=xsupFn(x)F(x)
  2. 计算检验统计量 D n D_n Dn的值,拒绝域或者 p- 值由 K-S 分布计算给出。

D n D_n Dn的计算:
1)计算原数据的均值 x ‾ \overline{x} x与标准差 s s s,以及各水平对应的频数;
2)对水平的大小排序,得到频数序列,计算累计频数;
3)再计算累计频率,以及对应水平用Z-score法标准化后的取值;
4)使用标准化后的取值 x x x,查表得到理论分布的值;
5) D n = m a x ( 累计频率 − 理论分布 ) D_n=max(累计频率 - 理论分布) Dn=max(累计频率理论分布)
D值越小越接近正态分布

2.2.2 KS检验实现

  • R
ks.test(x, "pnorm",mean(x),sd(x))
#x为要检验的样本数据,其函数默认修改的精确公式、双边检验。
#需要大样本近似命令中加exact = F;
#单边我们可以用alternative = "less"或alternative= "greater"选择。
  • Python
from scipy import statsstats.kstest(x, 'norm', (x.mean(), x.std()))  # 注意,Python的ks检验其P-value有时会与其他统计软件略微不同

2.2.3 Lilliefors检验(K-S检验的修正)

Lilliefors (Lillie)检验最早由Lilliefors 于1967年提出,它是对KS正态性检验的的修正,适合大样本。
适用于一般的正态性检验
Lillie检验实现

library(nortest)lillie.test(x)
# Python中未找到lillie检验的封装函数.

2.3 其他检验法

  • 偏峰检验法
    详见参考文献[3] p 21 p_{21} p21
  • Pearson chi-square (Pearson)检验
    R nortest包中pearson.test()可以实现
    详见参考文献[3] p 20 p_{20} p20 [4][1]
  • Cramer-von Mises (CVM)检验
    R中nortest 包中的cvm.test()可以实现),需要注意的是如果(1+0.5/n)W的值不能大于2.64
    详见参考文献[4][1]
  • Anderson-Darling(AD)检验
    R中nortest包中的ad.test()可以实现
    详见参考文献[4][1]
  • Jarque-Bera (JB)检验(时间序列中常用
    Python实现:
import scipy.stats as ss
ss.jarque_bera(y)

https://www.php.cn/python-tutorials-391980.html
R中可用tseries包中的jarque.bera.test()实现
详见参考文献[4][1]

  • D’Agostino(Dago) 检验
    R的fBasics包中 dagoTest()可以实现
    详见参考文献[1]
  • Shapiro-Francia(SF)检验
    R中nortest包,sf.test()实现。是Shapiro检验的修正。
    详见参考文献[1]

还可以参考:
https://blog.csdn.net/u013524655/article/details/41053045 (SPSS)
http://www.mamicode.com/info-detail-937349.html (R)https://blog.csdn.net/cyan_soul/article/details/81236124 (Python)

参考文献:
[1] 何凤霞,马学俊. 基于R软件的正态性检验的功效比较[J].统计与决策,2012(18):17-19.
[2] 贾俊平. 统计学[M]. 第6版. 北京:中国人民大学出版社, 2014.12
[3] 高慧璇. 统计计算[M]. 北京:北京大学出版社, 1995.
[4] 李洪成. 数据的正态性检验方法及其统计软件实现 [J]. 统计与决策, 2009(12):155-156.


http://chatgpt.dhexx.cn/article/ikECBnNA.shtml

相关文章

python语言程序设计(MOOC 嵩天)第五章 学习笔记(0214)

第五章 函数和代码的复用 5.1 函数的定义与使用 5.1.1 函数的理解和定义 函数是一段代码的表示&#xff1a; 函数是IPO的实现 函数是一段代码的封装 ①特定功能、可重用的语句组 ②功能的抽象 #作用&#xff1a;降低编程难度、代码复用 def <函数名> ( <变量> )…

Python-3.函数和代码复用

一、函数的定义与使用 使用保留字def定义函数,lambda 定义匿名函数可选参数(赋初值)、可变参数(*b)、名称传递保留字 return 可以返回任意多个结果保留字 global 声明使用全局变量,一些隐式规则1.1 函数的理解与定义 函数是一段代码的表示 函数是一段具有特定功能的、可重用的…

python123练习5: 函数和代码复用 (第5周)

实例7:七段数码管绘制 ‪‬‪‬‪‬‪‬‪‬‮‬‪‬‫‬‪‬‪‬‪‬‪‬‪‬‮‬‪‬‮‬‪‬‪‬‪‬‪‬‪‬‮‬‫‬‫‬‪‬‪‬‪‬‪‬‪‬‮‬‪‬‪‬‪‬‪‬‪‬‪‬‪‬‮‬‭‬‫‬‪‬‪‬‪‬‪‬‪‬‮‬‫‬‪‬ 描述 这是"实例"题,与课上讲解实…

北京理工大学:《Python语言程序设计》详细笔记

第一章&#xff1a;程序设计基本方法 计算机与程序设计 计算机是根据指令操作数据的设备计算机发展参照摩尔定律&#xff0c;表现为指数形式 编译和解释 计算机执行源程序两种方式&#xff1a;编译和解释编译&#xff1a;将源代码一次性转换成目标代码的过程。执行编译过程…

Python语言程序设计(嵩天)-第5周-函数和代码复用

目录&#xff1a; 5.1 函数的定义与使用5.2 实例7: 七段数码管绘制5.3 代码复用与函数递归5.4模块4: PyInstaller库的使用5.5实例8: 科赫雪花小包裹 导学 前课复习 数字类型及操作&#xff1a; 整数类型的无限范围及4种进制表示浮点数类型的近似无限范围、小尾数及科学计数…

练习5: 函数和代码复用

练习5: 函数和代码复用 1 .1实例7&#xff1a;七段数码管绘制 描述 这是"实例"题&#xff0c;与课上讲解实例相同&#xff0c;请作答检验学习效果。‪‬‪‬‪‬‪‬‪‬‮‬‪‬‭‬‪‬‪‬‪‬‪‬‪‬‮‬‪‬‮‬‪‬‪‬‪‬‪‬‪‬‮‬‪‬‪‬‪‬‪‬‪‬…

《python语言程序设计》笔记

《python语言程序设计》笔记 第一章 程序设计基本方法1.1基本知识1.2计算机编程1.3数据类型温度转换1.4课后习题1.5python123习题与测试第二章2.1turtle库(海龟库)2.1.1空间坐标体系2.1.2turtle角度坐标体系2.1.3RGB色彩体系2.2turtle程序语法元素分析2.2.1库引用和 import2.…

中国大学MOOCPython语言程序设计(北京理工大学)第5-6周学习笔记和课后练习

中国大学MOOCPython语言程序设计&#xff08;北京理工大学&#xff09;第5-6周学习笔记和课后练习 第5周 函数与代码复用5.1 函数的定义与使用5.2 实例7: 七段数码管绘制5.3 代码复用与函数递归汉诺塔问题 5.4 模块4: PyInstaller库的使用5.5 实例8: 科赫雪花小包裹任意累积斐波…

全国计算机等级考试二级Python(2021年9月)备考笔记 第五天

文章目录 Python语言程序设计-嵩天老师(MOOC)听课笔记 第5周知识点一函数的定义函数的调用函数的调用过程参数个数可选参数传递可变参数传递参数传递的两种方式函数的返回值局部变量和全局变量lambda函数lambda函数的应用 实例 七段数码管绘制问题分析举一反三 知识点二代码复用…

Python语言程序设计笔记

例&#xff1a;获得用户输入数字N&#xff0c;计算并输出从N开始的5个质数&#xff0c;单行输出 首先&#xff1a;定义函数判断一个数是否是质数&#xff0c;return True/False&#xff0c;注意return True的格式&#xff0c;不在for循环体中&#xff0c;在函数体中(循环的高…

Python——函数和代码复用(模块4:PyInstaller库的使用)(实例:七段数码管绘制科赫雪花小包裹)

前言 本篇主要介绍函数和代码复用&#xff0c;以七段数码管绘制为例&#xff0c;介绍函数的定义和使用。以科赫雪花小包裹为例&#xff0c;介绍PyInstaller库的使用。 &#xff08;从本篇开始&#xff0c;出现的一些库中函数介绍以及部分简单代码都将以图片形式呈现&#xff0…

Python语言程序设计第五章

第五章 函数和代码复用 方法论 -Python基本代码抽象即函数的使用方法 实践能力 -学会编写带有函数并复用代码的程度 5.1 函数的定义与使用 1、函数的理解与定义 函数是一段代码的表示 -函数是一段具有特定功能的、可重用的语句组 -函数是一种功能的抽象&#xff0c;一般函数…

创意画板延伸内容

在完成了创意画板的基础功能实现后&#xff0c;我们就可以通过画板来绘制一些有趣的图形了 1.平面山脉图 效果图如上 山脉图是由一个个山峰构成的&#xff0c;所以先绘制一个山峰 而山峰的绘制算法是&#xff1a;先确定两个点A B&#xff0c;然后获取A B的中间点P&#xff0…

Java第六课——画图板

Java第六课——画图板 这节课画一个画图板&#xff0c;可以画线画圆&#xff0c;还可以通过递归画出好看的图案如&#xff1a;谢尔宾斯基三角形&#xff0c;康托尔方形集&#xff0c;甚至立体图门格海绵。 首先创建一个窗体。定义一个类和一个方法。 public class Draw{publ…

分形理论中的分维解析

最近打算利用一段时间好好学习一下分形理论&#xff0c;也写一系列博客记录下自己的学习归纳情况。下面是这部分文章的目录&#xff1a; 一、分形理论的历史过程 二、分形理论的基础概念 三、分形理论的分维解析 四、分形理论的Hausdorff维数 五、分形理论的盒维数 六、分形理论…

python绘制n阶科赫曲线线段_分形几何中科赫雪花的绘制

目录分形几何在自然界中广泛存在(康托尔集、谢尔滨斯基三角形、门格海绵、龙形曲线、科赫曲线...),实际上分形几何是一种迭代的几何图形。本文主要讨论科赫曲线。 科赫曲线的绘制: import turtle def koch(size,n):#绘制科赫曲线含俩个参数,大小和阶数 if n == 0:#基线情…

【计算几何】大自然的数学模型--分形几何

一、前言 分形几何是几何数学中的一个分支&#xff0c;也称大自然几何学&#xff0c;由著名数学家本华曼德勃罗&#xff08; 法语&#xff1a;BenoitB.Mandelbrot&#xff09;在 1975 年构思和发展出来的一种新的几何学。分形几何是对大自然中微观与宏观和谐统一之美的发现&…

Java分形递归——门格海绵

门格海绵的结构简单来说就是从一个正方体开始&#xff1b;再把正方体的每一个面分成9个正方形&#xff0c;这时就形成了由27个小正方体组成的一个大正方体&#xff1b;然后再把每一面的中间的正方体和最中心的正方体去掉&#xff0c;最终留下20个正方体。最后&#xff0c;把每一…

门格海绵的实现

实现效果&#xff1a; 源代码&#xff1a; package sponge;import java.awt.Color; import java.awt.Graphics; import java.awt.Graphics2D; import java.awt.Point; import java.awt.Polygon;import javax.swing.JFrame;public class Sponge_Main extends JFrame impleme…

混沌与分形(一):谢尔宾斯基三角形与门格海绵

研究混沌运动&#xff0c;少不了对分形理论的探讨。分形&#xff1a;通常被定义为“一个粗糙或零碎的几何形状&#xff0c;可以分成数个部分&#xff0c;且每一部分都&#xff08;至少近似地&#xff09;是整体缩小后的形状”&#xff0c;即具有自相似的性质。 本篇将从一维过…