在后面的文章中讲过,很多模型的假如条件都是数据是遵从正态分布的。这篇文章次要讲讲如何判断数据是否合乎正态分布。次要分为两种办法:描述统计办法和统计测验办法。
01. 描述统计办法
描述统计就是用形容的数字或图表来判断数据是否合乎正态分布。罕用的办法有 Q - Q 图、P- P 图、直方图、茎叶图。
1.1 Q- Q 图
此 Q - Q 非用于聊天的 QQ,Q 是 quantile 的缩写,即分位数。分位数就是将数据从小到大排序,而后切成 100 份,看不同地位处的值。比方中位数,就是两头地位的值。
Q- Q 图的 x 轴为分位数,y 轴为分位数对应的样本值。x- y 是散点图的模式,通过散点图能够拟合出一条直线,如果这条直线是从左下角到右上角的一条直线,则能够判断数据合乎正态分布,否则则不能够。
拟合进去的这条直线和正态分布之间有什么关系呢?为什么能够依据这条直线来判断数据是否合乎正态分布呢。
咱们先来想一下正态分布的特色,正态分布的 x 轴为样本值,从左到右 x 是逐步增大的,y 轴是每个样本值对应的呈现的概率。概率值先回升后降落,且在两头地位达到最高。
能够把 Q - Q 图中的 y 轴了解成正态分布中的 x 轴,如果拟合进去的直线是 45 度,能够保障中位数两边的数值散布是一样的,即正态分布中基于中位数左右对称。
在 Python 中能够应用如下代码来绘制 Q - Q 图:
from scipy import stats
fig = plt.figure()
res = stats.probplot(x, plot=plt)
plt.show()
与 Q - Q 图相似的是 P - P 图,两者的区别是前者的 y 轴是具体的分位数对应的样本值,而后者是累计概率。
1.2 直方图
直方图分为两种,一种是频率散布直方图,一种是频数散布直方图。频数就是样本值呈现的次数,频率是某个值呈现的次数与所有样本值呈现总次数的比值。
在 Python 中咱们能够应用如下代码来绘制频数散布直方图:
import matplotlib.pyplot as plt
plt.hist(x,bins = 10)
能够应用如下代码来绘制频率散布直方图:
import seaborn as sns
sns.distplot(x)
与直方图相似的还有茎叶图,茎叶图是相似于表格模式去示意每个值呈现的频次。
02. 统计测验办法
讲完了描述统计的办法,咱们来看一下统计测验的办法。统计测验的办法次要有 SW 测验、KS 测验、AD 测验、W 测验。
SW 测验中的 S 就是偏度,W 就是峰度,峰度和偏度与正态的关系咱们在后面的文章有讲过。
2.1 KS 测验
KS 测验是基于样本累积散布函数来进行判断的。能够用于判断某个样本集是否合乎某个已知散布,也能够用于测验两个样本之间的显著性差别。
如果是判断某个样本是否合乎某个已知散布,比方正态分布,则须要先计算出规范正态分布的累计散布函数,而后在计算样本集的累计散布函数。两个函数之间在不同的取值处会有不同的差值。咱们只须要找进去差值最大的那个点 D。而后基于样本集的样本数和显著性程度找到差值边界值(相似于 t 测验的边界值)。判断边界值和 D 的关系,如果 D 小于边界值,则能够认为样本的散布合乎已知散布,否则不能够。
PDF(probability density function):概率密度函数。
CDF(cumulative distribution function):累积散布函数,是概率密度函数的积分。
在 Python 中有现成的包能够间接用于 KS 测验:
from scipy.stats import kstest
kstest(x,cdf = "norm")
x 示意待测验的样本集,cdf 用来指明要判断的已知散布类型,有:‘norm’,’expon’,’logistic’,’gumbel’,’gumbel_l’, gumbel_r’,
‘extreme1’值能够选,其中 norm 示意正态分布测验。
kstest 会返回两个值:D 和对应的 p_value 值。
2.2 AD 测验
AD 测验是在 KS 根底上进行革新的,KS 测验只思考了两个散布之间差值最大的那个点,然而这容易受异样值的影响。AD 测验思考了散布上每个点处的差值。
在 Python 中能够用如下代码:
from scipy.stats import anderson
anderson(x, dist='norm')
x 为待测验的样本集,dist 用来指明已知散布的类型。可选值与 ks 测验中可选值统一。
下面代码会返回三个后果:第一个为统计值,第二个为评判值,第三个为每个评判值对应的显著性程度
AD 测验和 anderson 有啥关系呢?anderson 创造了 AD 测验。
2.3 W 测验
W 测验 (Shapiro-Wilk 的简称) 是基于两个散布的相关性来进行判断,会得出一个相似于皮尔逊相关系数的值。值越大,阐明两个散布越相干,越合乎某个散布。
在 Python 中的实现代码如下:
from scipy.stats import shapiro
shapiro(x)
下面的代码会返回两个后果:W 值和其对应的 p_value。
shapiro 是专门用于正态性测验的,所以不须要指明散布类型。且 shapiro 不适宜做样本数>5000 的正态性测验。
03. 非正态数据的解决方法
个别数据不是正态就是偏态,如果偏态不重大能够对数据取平方根来进行转换。如果偏态很重大,则能够对数据进行对数转换。