我们之前讲过数据的正态性检验,介绍了两种检验数据是否正态性的方法。这一节我们就来看看数据不满足正态性怎么办。答案是通过Box-Cox变换将非正态数据进一步转化为符合正态分布的数据。本文将和大家分享Box-Cox变换的具体内容。Box-Cox变换是各种变换的总称。具体公式如下:上式中,y(λ)表示变换后的值。根据λ的值,属于不同的变换。当λ的值取下列具体值时,当λ=0时,Box-Cox变换变为对数变换,y(λ)=ln(y);当λ=0.5时,Box-Cox变换变成变成平方根变换,y(λ)=y^1/2当λ=1时,Box-Cox变换就是它自己,y(λ)=y当λ=2时,Box-Cox变换变为Square变化,y(λ)=y^2当λ=-1时,Box-Cox变换变为倒数变化,y(λ)=1/y。除了上述具体值外,λ值还可以选择其他值。当我们得到一段非正态数据时,我们应该取多少对齐来让λ值进行变换呢?这应该如何确定?我们可以使用Python中现成的函数,让函数自动探索,然后返回给我们最优值。该函数为boxcox_normmax,用于计算给定非正态数据对应的最优λ值。boxcox_normmax(x[,bracket,method])参数:x:非正态数据bracket:λ值搜索区间,默认即可,即按照相关法计算。如果选择全部,将返回各种方法的计算结果。有时可以使用另一个函数boxcox,它根据指定的λ值转换原始数据。boxcox(x[,lmbda,alpha])参数:x:非正态数据lambda:转换后的λ值alpha:计算置信区间时使用的alpha值返回值:boxcox:转换后的数据maxlog:if如果lambda参数值不是输入时指定,函数还会计算一个λ值(min_ci,max_ci):如果lambda参数为空且alpha参数不为空,则计算maxlog的置信区间。上面我们讲了计算λ值的方法有很多种,那么计算λ值哪种方法比较靠谱呢?我们可以使用另一个函数boxcox_normplot来查看哪种方法计算出的λ值更可靠。boxcox_normplot(x,la,lb,plot=None,N=80)参数:x:非正态数据la,lb:λ值上下界plot:绘制的画布N:坐标点个数横轴上的返回值:lmbdas:box-cox计算出的多个λ值ppcc:相关系数,可以理解为λ值的可靠性。以上是box-cox变换过程中用到的三个不同的函数。接下来,我们将给大家实际演示如何使用这三个功能。首先,我们导入一段非正态数据,画出这段数据的概率密度图。需要此数据的可以通过在公众号后台回复非正常数据获取。importpandasaspdimportnumpyasnpiimportseabornassnsdf=pd.read_excel(r"Nonnormaldataset.xlsx")sns.distplot(df["price"],color="#D86457")通过上面的概率密度图,我们可以看到这是一个偏斜的数据,也就是非正态的。接下来,我们首先使用boxcox_normmax函数寻找最优λ值,代码如下:fromscipyimportstatsstats.boxcox_normmax(df["price"])---return:0.17896037184755484得到最优λ值后,我们再使用boxcox函数进行数据转换,具体代码如下:x=stats.boxcox(df["price"],stats.boxcox_normmax(df["price"]))sns.distplot(x,color="#D86457")转换后再次对数据绘制概率密度图,可以看到数据非常正常。接下来,让我们看看我们计算出的λ值是否是最优的。具体代码如下:fig=plt.figure()ax=fig.add_subplot(111)stats.boxcox_normplot(df["price"],-20,20,plot=ax)plt.axvline(x=stats.boxcox_normmax(df["price"]),color="#D86457")plt.show()中间红线的位置是最优秀的λ值,结果非常一致。以上就是Box-Cox变换的理论和实践内容,请多多练习。
