定义
Box-Cox变换是Box和Cox在1964年提出的一种广义幂变换方法,是统计建模中常用的一种数据变换,用于连续的响应变量不满足正态分布的情况。Box-Cox变换之后,可以一定程度上减小不可观测的误差和预测变量的相关性。Box-Cox变换的主要特点是引入一个参数,通过数据本身估计该参数进而确定应采取的数据变换形式,Box-Cox变换可以明显地改善数据的正态性、对称性和方差相等性,对许多实际数据都是行之有效的。
box-cox转换
数学公式
box-cox转换数学公式如下
其中λ是一个固定的常数,在计算中可以通过最大似然估计估计方法算出。当λ≠0的情况下,y(λ)等于y的指数次方减去常数。可以看做为该数据的指数变换。
而当lambda为0的时候,可以看做数据的对数转换。因而box-cox为数据的指数、对数转换。
box-cox转换是在数据处理中常用的方法之一,通过box-cox转换,可以是整体数据呈正态分布,便于使用后续的差异分析。
Box-cox的python实现
box-cox转换在python统计分析包scipy已有实现,具体见以下代码
import matplotlib.pyplot as plt
import scipy.stats as st
import matplotlib
matplotlib.use("agg")
import seaborn as sns
#使用scipy生成具有偏态分布的loggamma分布的数据
x = st.loggamma.rvs(5, size=500) + 5
xt,_ = st.boxcox(x)
#boxcox会同时返回两个参数,转化后的数据和最合适的λ值,此示例不需要返回λ值,因而设置为空
fig = plt.figure()
ax1 = fig.add_subplot(211)
sns.distplot(x,rug=True)
ax2 = fig.add_subplot(212)
sns.distplot(xt,rug=True)
plt.savefig("test22.png",dpi=300)
plt.close()
上图为偏态分布的loggamma数据的密度分布图,下图为经过boxcox转换的数据密度分布图,从图中可以看出,经过boxcox转换,数据呈正态分布。
在scipy中boxcox转换中,会自动使用最大似然估计方法去计算做合适的λ值去转化数据。在scipy中special包中boxcox以及boxcox1p两个同样的功能。需要进一步的去学习。