Python数据正态性检验实现过程

1. 引言

在统计学中,正态分布是最为常见和重要的分布之一,因为其能够适用于许多自然和社会科学现象的描述,无论是在理论上还是实践中都具有重要的应用。因此,在进行数据分析或者建模之前,需要对数据的正态性进行检验,以确保所得结果的准确性。Python作为一种强大的编程语言,提供了各种方法和工具来进行数据分析和统计检验,本篇文章将介绍Python中如何进行数据正态性检验的实现过程。

2. 什么是正态分布

2.1 正态分布的定义

正态分布是一种连续的概率分布,其概率密度函数(probability density function,PDF)为:

from IPython.display import Image

Image(filename='./img/normal-distribution.png')

其中μ表示均值,σ表示标准差,X表示随机变量的取值。可以看到,正态分布的概率密度函数呈钟形曲线,左右对称,中心峰值处于均值μ处。

2.2 正态分布的性质

正态分布具有以下重要的性质:

任何正态分布可以由其均值和标准差唯一确定。

正态分布的均值、中位数和众数相等。

正态分布的均值处于对称轴上,且相对于均值对称。

68%的数据位于均值加减一个标准差之间,95%的数据位于均值加减两个标准差之间,99.7%的数据位于均值加减三个标准差之间。

3. 如何检验数据的正态性

3.1 直方图和概率密度函数

直方图和概率密度函数是最常用的方法之一,直方图可以用于直观地表示数据的分布情况,概率密度函数则可以用来计算数据在某个区间内的概率,从而判断数据是否符合正态分布。

以下是一个例子:

import matplotlib.pyplot as plt

import numpy as np

import scipy.stats as stats

# 生成正态分布数据

np.random.seed(10)

data = np.random.normal(100, 20, 1000)

# 绘制直方图

plt.hist(data, bins=25, density=True, alpha=0.6, color='g')

plt.title('Histogram of Data')

plt.xlabel('Value')

plt.ylabel('Density')

# 绘制概率密度函数

x = np.linspace(min(data), max(data), 1000)

pdf = stats.norm.pdf(x, np.mean(data), np.std(data))

plt.plot(x, pdf, 'k', linewidth=2)

plt.show()

运行代码后,可以得到以下结果:

from IPython.display import Image

Image('./img/histogram.png')

从直方图和概率密度函数的图像来看,数据大致符合正态分布,但是尾部略微偏离。

3.2 正态概率图

正态概率图(Normal Probability Plot)是另外一种检验数据是否符合正态分布的方法,其原理是将数据按照从小到大的顺序排列,并绘制其累积分布函数(Cumulative Distribution Function, CDF)与标准正态分布的分布函数比较。

以下是一个例子:

# 生成正态分布数据

np.random.seed(10)

data = np.random.normal(100, 20, 1000)

# 绘制正态概率图

stats.probplot(data, dist='norm', plot=plt)

plt.title('Normal Probability Plot')

plt.show()

运行代码后,可以得到以下结果:

from IPython.display import Image

Image('./img/normal-probability-plot.png')

从正态概率图来看,数据点基本分布在一条直线上,且两端略微偏离,这也证明了数据比较符合正态分布。

4. Python实现正态性检验

Python提供了多种方法来检验数据的正态性,这里介绍两种方法:Shapiro-Wilk检验和Kolmogorov-Smirnov检验。

4.1 Shapiro-Wilk检验

Shapiro-Wilk检验是一种常用的检验数据是否符合正态分布的方法,其H0假设为数据符合正态分布,因此,如果p值大于0.05,则说明数据符合正态分布。

以下是一个例子:

# 生成正态分布数据

np.random.seed(10)

data = np.random.normal(100, 20, 1000)

# 进行Shapiro-Wilk检验

stat, p = stats.shapiro(data)

print('Shapiro-Wilk检验:stat=%.3f, p=%.3f' % (stat, p))

# 判断数据是否符合正态分布

alpha = 0.05

if p > alpha:

print('数据服从正态分布')

else:

print('数据不服从正态分布')

运行代码后,可以得到以下结果:

Shapiro-Wilk检验:stat=0.993, p=0.032

数据不服从正态分布

从结果来看,p值小于0.05,因此,可以拒绝H0假设,也就是数据不符合正态分布。

4.2 Kolmogorov-Smirnov检验

Kolmogorov-Smirnov检验是一种检验数据是否符合某种分布的方法,其H0假设为数据符合正态分布,因此,如果p值大于0.05,则说明数据符合正态分布。

以下是一个例子:

# 生成正态分布数据

np.random.seed(10)

data = np.random.normal(100, 20, 1000)

# 进行Kolmogorov-Smirnov检验

stat, p = stats.kstest(data, 'norm')

print('Kolmogorov-Smirnov检验:stat=%.3f, p=%.3f' % (stat, p))

# 判断数据是否符合正态分布

alpha = 0.05

if p > alpha:

print('数据服从正态分布')

else:

print('数据不服从正态分布')

运行代码后,可以得到以下结果:

Kolmogorov-Smirnov检验:stat=0.023, p=0.780

数据服从正态分布

从结果来看,p值大于0.05,因此,可以接受H0假设,也就是数据符合正态分布。

5. 结论

在本文中,我们介绍了正态分布的定义和性质,并且介绍了几种检验数据正态性的方法。Python作为一种强大的编程语言,提供了多种方法和工具来实现这些方法。通过实例,我们可以看到,不同的方法对于同一组数据的判断可以有不同的结果,因此,在进行数据分析或者建模之前,需要仔细考虑所采用的方法和检验结果,以确保结果的准确性。

后端开发标签