Python에서 box-cox 변환을 수행하는 방법


박스콕스 변환(box-cox 변환)은 비정규 분포 데이터 세트를 보다 정규 분포된 세트로 변환하는 데 일반적으로 사용되는 방법입니다.

이 방법의 기본 아이디어는 다음 공식을 사용하여 변환된 데이터가 정규 분포에 최대한 가깝도록 λ 값을 찾는 것입니다.

  • y(λ) = (y λ – 1) / y ≠ 0인 경우 λ
  • y(λ) = log(y) y = 0인 경우

scipy.stats.boxcox() 함수를 사용하여 Python에서 box-cox 변환을 수행할 수 있습니다.

다음 예에서는 이 기능을 실제로 사용하는 방법을 보여줍니다.

예: Python의 Box-Cox 변환

지수 분포 에서 1000개의 값으로 구성된 무작위 세트를 생성한다고 가정합니다.

 #load necessary packages
import numpy as np 
from scipy. stats import boxcox 
import seaborn as sns 

#make this example reproducible
n.p. random . seeds (0)

#generate dataset
data = np. random . exponential (size= 1000 )

#plot the distribution of data values
sns. distplot (data, hist= False , kde= True ) 

분포가 정상적으로 보이지 않는 것을 볼 수 있습니다.

boxcox() 함수를 사용하여 보다 정규 분포를 생성하는 최적의 람다 값을 찾을 수 있습니다.

 #perform Box-Cox transformation on original data
transformed_data, best_lambda = boxcox(data) 

#plot the distribution of the transformed data values
sns. distplot (transformed_data, hist= False , kde= True ) 

Python의 Box-Cox 변환

변환된 데이터가 훨씬 더 정규 분포를 따르는 것을 볼 수 있습니다.

Box-Cox 변환을 수행하는 데 사용된 정확한 람다 값도 찾을 수 있습니다.

 #display optimal lambda value
print (best_lambda)

0.2420131978174143

최적의 람다는 약 0.242 인 것으로 나타났습니다.

따라서 각 데이터 값은 다음 방정식을 사용하여 변환되었습니다.

새 = (기존 0.242 – 1) / 0.242

원본 데이터와 변환된 데이터의 값을 보면 이를 확인할 수 있습니다.

 #view first five values of original dataset
data[0:5]

array([0.79587451, 1.25593076, 0.92322315, 0.78720115, 0.55104849])

#view first five values of transformed dataset
transformed_data[0:5]

array([-0.22212062, 0.23427768, -0.07911706, -0.23247555, -0.55495228])

원본 데이터세트의 첫 번째 값은 0.79587 입니다. 따라서 이 값을 변환하기 위해 다음 공식을 적용했습니다.

신규 = (.79587 0.242 – 1) / 0.242 = -0.222

변환된 데이터세트의 첫 번째 값이 실제로 -0.222 임을 확인할 수 있습니다.

추가 리소스

Python에서 QQ 플롯을 만들고 해석하는 방법
Python에서 Shapiro-Wilk 정규성 테스트를 수행하는 방법

의견을 추가하다

이메일 주소는 공개되지 않습니다. 필수 필드는 *로 표시됩니다