用途:当某个随机变量 X X X 不服从正态分布的时候,可以尝试通过这种变换将其变成正态分布。
两个常用的变换
- 对数变换:已知随机变量 X X X,如果有 ln  X ∼ N ( μ , σ 2 ) \ln X\sim N(\mu,\sigma^2) lnX∼N(μ,σ2),那么对 X X X 使用对数变换。适合随着自变量的增加,因变量的方差也增大的模型。
- 平方根变换:已知随机变量 X X X,如果有 X ∼ N ( μ , σ 2 ) \sqrt X\sim N(\mu,\sigma^2) X∼N(μ,σ2),那么对 X X X 使用平方根变换。适合服从Poission分布的计数资料,或轻度偏态资料。
Box-Cox 变换简介
  Box-Cox变换的基本思想是通过对数据进行一定的变换,使得变换后的数据更加符合正态分布的特征。这种变换是一种幂函数变换,其公式如下:
  
      
       
        
         
         
           y 
          
         
           ~ 
          
         
        
          = 
         
         
         
           { 
          
          
           
            
             
              
               
                
                 
                  
                  
                    y 
                   
                  
                    λ 
                   
                  
                 
                   − 
                  
                 
                   1 
                  
                 
                
                  λ 
                 
                
               
              
                , 
               
              
             
            
            
             
              
              
                λ 
               
              
                ≠ 
               
              
                0 
               
              
             
            
           
           
            
             
              
              
                ln 
               
              
                 
               
              
                y 
               
              
                , 
               
              
             
            
            
             
              
              
                λ 
               
              
                = 
               
              
                0 
               
              
             
            
           
          
         
        
       
         \tilde{y}=\left \{{\begin{matrix}\cfrac{{{y}^{\lambda }}-1}{\lambda },&\lambda \ne 0\\\ln{y},&\lambda =0\end{matrix}}\right . 
        
       
     y~=⎩ 
              ⎨ 
              ⎧λyλ−1,lny,λ=0λ=0
  将原数据  
     
      
       
       
         y 
        
       
      
        y 
       
      
    y 变为大致服从正态分布的  
     
      
       
        
        
          y 
         
        
          ~ 
         
        
       
      
        \tilde y 
       
      
    y~。Box-Cox 变换可以很好地根据一组随机变量  
     
      
       
       
         X 
        
       
      
        X 
       
      
    X 的观测值,构造出一个服从正态分布的变量  
     
      
       
        
        
          X 
         
        
          ~ 
         
        
       
      
        \tilde X 
       
      
    X~,从而能够根据这个正态分布进行一些数据分析。传统的 Fitter 库给出的最佳拟合可能是一些从来没有见过的分布函数。
   注意上式只适合非负数,如果存在负数,需要将  
     
      
       
       
         y 
        
       
      
        y 
       
      
    y 加上一个偏移量后再进行 Box-Cox 变换。
   对数变换是  
     
      
       
       
         λ 
        
       
         = 
        
       
         0 
        
       
      
        \lambda =0 
       
      
    λ=0 的 Box-Cox 变换,平方根变换是  
     
      
       
       
         λ 
        
       
         = 
        
       
         1 
        
       
         / 
        
       
         2 
        
       
      
        \lambda=1/2 
       
      
    λ=1/2 的 Box-Cox 变换。
代码实例
from scipy.stats import boxcox
# 下面这个库也含有 boxcox 变换方法,但是这个库的 boxcox 需要自行提供 λ。而 scipy.stats.boxcox 可以通过极大似然等方法自行计算 λ。
# from scipy.special import boxcox
from scipy.special import inv_boxcox
import numpy as np
np.random.seed(114514)
# F 分布有点偏态正态分布的意思,生成一组 F 分布数据
x = np.random.f(dfnum=3, dfden=10, size=10000)
# box-cox 正变换
y, lambda_ = boxcox(x, lmbda=None, alpha=None)
print(lambda_)
# 0.1678598919247737
import seaborn as sns
import matplotlib.pyplot as plt
plt.rcParams['font.family'] = 'Euclid'
plt.subplot(121)
sns.distplot(x)
plt.title('Origin')
plt.subplot(122)
sns.distplot(y)
plt.title('Transformed')
plt.show()
# 这是反变换,经验证和之前的 x 是一样的
x = inv_boxcox(y, lambda_)
  做出来图片如下。
 
参考文献
下面的资料对 Box-Cox 变换有深入的介绍:
- 统计学中的数值变换 – 标点符
- 【机器学习】Box-Cox变换详解-CSDN博客
- 数据预处理—5.box-cox变换及python实现_box-cox变换python-CSDN博客



















