본문 바로가기
Business Analytics/R로 하는 통계검정

변수 변환 - log 변환, Exp 변환, 박스-콕스 변환(Box-Cox Transformation)

by BA815 2023. 1. 2.
728x90
반응형

회귀분석을 진행함에 있어서 독립변수를 통해 종속변수를 설명하고자 할 때, 단순히 Raw 한 형태(따로 변환이 없는 상태)의 독립변수는 종속변수에 제대로 Fit하지 못한 경우가 있을 수 있다.

로그 변환 전에는 Fit이 덜 맞았으나, 로그 변환 후 Fit이 잘 맞는 걸 알 수 있다. (Reference : https://lmc2179.github.io/posts/multiplicative.html)

 

이에 따라 독립변수의 값을 변환하여 회귀모형을 Fitting값을 개선하고자 할 때가 있다.

 

변환에는 Log변환, Power변환(제곱, 세제곱 등) 등이 있다. (예를 들어 타 분야에서는 잘 하지 않지만, 금융쪽에서는 Mini-Modeling을 통한 변수 변환도 진행한다)  

 

로그나 지수 변환의 경우 변수의 분포가 좌측이나, 우측으로 치우쳐있는 경우 진행하게 된다. 

 

Log Transformation/ Exponetial Transformation 비교

위의 그림과 같이 우측으로 치우친 경우 Exponential 변환을 진행하게 되고, 좌측으로 치우친 경우 log 변환을 진행하게 된다. 각각에 대한 코드는 아래와 같다. 

 

#로그 변환 
log_x <- log(x) 

#지수 변환
exp_x <- exp(x)

다음으로 Box-Cox Transformation을 통해 어떤 배수를 곱해주는 것이 종속변수를 설명해주는 것에 가장 도움이 되는지를 확인할 수 있다. 

 

Box-Cox Transformation에 대한 코드는 아래과 같다. 

 

#임의의 데이터 만들기 
x <- 11:100
tmp <- rnorm(90, sd = 5) #간단하게 error term 만들어주기 
y <- (x +tmp)^(-1/1.5) 

#회귀분석하기
#1) 단순 선형회귀 
m <- lm(y~x)
summary(m)

이에 대한 결과는 아래와 같다. 

단순 Raw 데이터인 경우의 R sqaure는 약 0.72

 

물론 Raw 데이터 기반의 R sqaure도 충분히 높은 값이지만, R square를 더 높여보기 위해(사실 위의 데이터 생성 과정에서 이미 Power값을 -1.5정도로 줬기 때문에 오차를 고려해도, -1.5에 근접한 값을 Power로 넣어주면, 더 나은 결과가 생성될 것이다) 

이를 위해 MASS Package를 불러와서 boxcox함수를 사용해본다. 

# 2) 단순 선형회귀 기반 box-cox transformation 하기 
library(MASS)
bc <- boxcox(m)

boxcox 함수의 결과

위의 그림을 보면, 대략 -1.5 정도의 값에서 가장 높은 log-likelihood를 가짐을 알 수 있다. 

 

이를 기반으로 새롭게 회귀분석을 진행해보면,  

#결과상 최적의 람다값(최적의 x축값 찾기- 여기서 log-likelihood는 높을수록 좋음)
lambda <- bc$x[which.max(bc$y)]

#위의 결과 기반 선형회귀 
z <- y^lambda

m2 <- lm(z~x)
summary(m2)

R sqaure가 Raw 데이터였을 때보다 많이 개선된 걸 알 수 있다.

이와 같이 단순히 Box-Cox transformation을 해주는 것만으로도 R square의 개선이 나타날 수 있음을 알 수 있다. 

 

728x90
반응형

댓글