正态分布是皮尔逊相关、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.