boxcox数据转换

定义

Box-Cox变换是Box和Cox在1964年提出的一种广义幂变换方法,是统计建模中常用的一种数据变换,用于连续的响应变量不满足正态分布的情况。Box-Cox变换之后,可以一定程度上减小不可观测的误差和预测变量的相关性。Box-Cox变换的主要特点是引入一个参数,通过数据本身估计该参数进而确定应采取的数据变换形式,Box-Cox变换可以明显地改善数据的正态性、对称性和方差相等性,对许多实际数据都是行之有效的。
box-cox转换

数学公式

box-cox转换数学公式如下
y(\lambda)=\left\{\begin{array}{l} \frac{y^{\lambda}-1}{\lambda}, \lambda \neq 0 \\ \ln y, \lambda=0 \end{array}\right.
其中λ是一个固定的常数,在计算中可以通过最大似然估计估计方法算出。当λ≠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()
test22.png

上图为偏态分布的loggamma数据的密度分布图,下图为经过boxcox转换的数据密度分布图,从图中可以看出,经过boxcox转换,数据呈正态分布。
在scipy中boxcox转换中,会自动使用最大似然估计方法去计算做合适的λ值去转化数据。在scipy中special包中boxcox以及boxcox1p两个同样的功能。需要进一步的去学习。

©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容

  • 特征工程(feature engineering):利用领域知识和现有数据,创造出新的特征,用于机器学习算法;可以...
    rowcolumn阅读 733评论 2 1
  • Author: 杜七 一、前言 数据挖掘过程中,不同变量数据单位不一,比如,我们想知道一个人身体健康状况,其身高是...
    杜七阅读 31,004评论 0 12
  • 1、数据分桶(分桶后需要编码) 连续值经常离散化或者分离成“箱子”进行分析, 为什么要做数据分桶呢? 离散后稀疏向...
    堂堂正正的大号阅读 945评论 0 5
  • 夜莺2517阅读 127,761评论 1 9
  • 版本:ios 1.2.1 亮点: 1.app角标可以实时更新天气温度或选择空气质量,建议处女座就不要选了,不然老想...
    我就是沉沉阅读 6,961评论 1 6