Python中的正态分布和Shapiro-Wilk测试

488 阅读3分钟

正态分布是皮尔逊相关、t检验和回归等参数检验的一个统计前提条件。

  • 对正态分布的测试可以用sns.displot(x, kde=true) 来直观地完成。
  • Shapiro-Wilk正态性检验可以用pingouin'spg.normality(x) 最快完成。

💡 注意:一些出版物指出,正态分布是参数检验的最不重要的前提条件,在大样本量的情况下,你可以假设正态分布。查看本文以了解更多细节。

用于正态分布和Shapiro-Wilk的Python库

我们导入pingouin、seaborn和SciPy。SciPy是统计测试的标准包,pingouin 是一个快速单线统计测试的包。

import pandas as pd
import pingouin as pg
import seaborn as sns
import scipy as scipy

方法1:Seaborn

我们从seaborn加载关于不同种类和大小的企鹅的数据集。

penguins = sns.load_dataset('penguins')
penguins.head() 

我们将更仔细地检查企鹅的喙长。通过Seaborn,我们可以在我们的数据上绘制一条分布曲线。

一个正态分布将具有高斯曲线的形状。这就是为什么分布图是直观判断正态分布的好方法,因为它可以马上看出是否是钟形曲线。

sns.displot(penguins["bill_length_mm"], kde=True)

输出。

这条曲线看起来不是正态分布,但很接近。

Shapiro-Wilk检验是对正态分布的检验,可以证实我们的假设。

检验的假设是。

  • H0:我们的数据是正态分布。
  • H1:我们的数据不是正态分布。

如果检验结果显著,我们就要拒绝H0,也就是说,我们假设H1为真,数据不是正态分布。

方法2:用Pingouin进行Shapiro-Wilk检验

通过软件包pingouin ,我们可以有一个快速的测试输出。例如,函数调用pg.normality(x) ,将给我们提供夏皮罗-威尔克测试的结果,同时自动丢弃缺失值。

下面是一个对之前实例化的penguins 数据集进行正态性测试的例子。

pg.normality(penguins["bill_length_mm"])

p值是显著的,所以我们将拒绝H0假设,即我们的数据是正态分布,并确认我们的非正态分布的视觉假设。

方法3:SciPy中的Shapiro-Wilk检验

Shapiro-Wilk检验也可以用scipy.stats.shapiro(x) 。然而,SciPy不会自动放弃缺失值,所以检验将是无效的。因此,我们必须事先放弃它们。

bill_length = penguins["bill_length_mm"].dropna()
scipy.stats.shapiro(bill_length)

输出。

这提供了相同的结果,证实了我们关于非正态分布变量的假设。

虹膜数据集的正态分布

一个正态分布的变量看起来更像是虹膜数据集中的萼片宽度。

iris = sns.load_dataset('iris')
sns.displot(iris["sepal_width"], kde=True)

输出。

pg.normality(iris["sepal_width"])

输出。

scipy.stats.shapiro(iris["sepal_width"])

输出:输出。

在这里,Shapiro-Wilk检验并不显著,所以我们假设H0是正确的,数据是正态分布。

如果你想对你的数据应用参数测试,比如皮尔逊回归,你大多还是可以的,因为正态分布不是硬性前提,而且大型数据集往往是正态分布的。

你也可以对你的数据进行Z型转换和归一化,使数值具有相同的平均值和标准差。这对机器学习算法特别有用。


程序员的幽默

Q: How do you tell an introverted computer scientist from an extroverted computer scientist?

A: An extroverted computer scientist looks at your shoes when he talks to you.