许多统计测试都假设数据集是正态分布。
在Python中,有四种常见的方法来检查这个假设。
1.(视觉方法)创建一个直方图。
- 如果直方图大致呈 "钟形",那么就可以认为数据是正态分布。
(视觉方法) 创建一个Q-Q图。
- 如果图中的点大致沿着一条对角线落下,那么就可以认为数据是正态分布。
3.(正式的统计检验)进行夏皮罗-威尔克检验。
- 如果检验的P值大于α=0.05,则假定数据为正态分布。
4.(正式的统计测试)进行Kolmogorov-Smirnov测试。
- 如果检验的P值大于α=0.05,那么就假定数据是正态分布。
下面的例子说明了如何在实践中使用这些方法中的每一种。
方法1:创建直方图
下面的代码显示了如何为一个遵循对数正态分布的数据集创建直方图。
import math
import numpy as np
from scipy.stats import lognorm
import matplotlib.pyplot as plt
#make this example reproducible
np.random.seed(1)
#generate dataset that contains 1000 log-normal distributed values
lognorm_dataset = lognorm.rvs(s=.5, scale=math.exp(1), size=1000)
#create histogram to visualize values in dataset
plt.hist(lognorm_dataset, edgecolor='black', bins=20)
通过简单地观察这个直方图,我们可以知道这个数据集没有表现出 "钟形",不是正态分布。
方法2:创建一个Q-Q图
下面的代码显示了如何为遵循对数正态分布的数据集创建一个Q-Q图。
import math
import numpy as np
from scipy.stats import lognorm
import statsmodels.api as sm
import matplotlib.pyplot as plt
#make this example reproducible
np.random.seed(1)
#generate dataset that contains 1000 log-normal distributed values
lognorm_dataset = lognorm.rvs(s=.5, scale=math.exp(1), size=1000)
#create Q-Q plot with 45-degree line added to plot
fig = sm.qqplot(lognorm_dataset, line='45')
plt.show()
如果图上的点大致沿着一条对角线落下,那么我们通常认为数据集是正态分布。
然而,这个图上的点显然不在红线上,所以我们不会假设这个数据集是正态分布。
考虑到我们使用对数正态分布函数生成数据,这应该是有意义的。
方法3:进行夏皮罗-威尔克检验
下面的代码显示了如何对遵循对数正态分布的数据集进行Shapiro-Wilk测试。
import math
import numpy as np
from scipy.stats import shapiro
from scipy.stats import lognorm
#make this example reproducible
np.random.seed(1)
#generate dataset that contains 1000 log-normal distributed values
lognorm_dataset = lognorm.rvs(s=.5, scale=math.exp(1), size=1000)
#perform Shapiro-Wilk test for normality
shapiro(lognorm_dataset)
ShapiroResult(statistic=0.8573324680328369, pvalue=3.880663073872444e-29)
从输出结果中我们可以看到,测试统计量为0.857 ,相应的p值为3.88e-29(极其接近于零)。
由于p值小于0.05,我们拒绝夏皮罗-威尔克检验的无效假设。
这意味着我们有足够的证据可以说,样本数据不是来自正态分布。
方法4:进行Kolmogorov-Smirnov检验
下面的代码显示了如何对遵循对数正态分布的数据集进行Kolmogorov-Smirnov检验。
import math
import numpy as np
from scipy.stats import kstest
from scipy.stats import lognorm
#make this example reproducible
np.random.seed(1)
#generate dataset that contains 1000 log-normal distributed values
lognorm_dataset = lognorm.rvs(s=.5, scale=math.exp(1), size=1000)
#perform Kolmogorov-Smirnov test for normality
kstest(lognorm_dataset, 'norm')
KstestResult(statistic=0.84125708308077, pvalue=0.0)
从输出中我们可以看到,测试统计量为0.841 ,相应的P值为0.0。
由于p值小于0.05,我们拒绝了Kolmogorov-Smirnov检验的无效假设。
这意味着我们有足够的证据可以说,样本数据不是来自正态分布。
如何处理非正态数据
如果一个给定的数据集不是正态分布,我们通常可以进行以下一种转换,使其更符合正态分布。
1.对数转换:将x的值转换为log(x)。
2.2.平方根转换:将x的值转换为√x。
3.3.立方根转换:将x的值转换为x1/3。
通过进行这些转换,数据集通常会变得更加正常分布。
阅读本教程,看看如何在Python中进行这些转换。
The postHow to Test for Normality in Python (4 Methods)appeared first onStatology.