People-Analytics201

[회귀분석] 변수에 log(로그)변환을 함부로 하면 안되는 이유 본문

Theory/Statistics

[회귀분석] 변수에 log(로그)변환을 함부로 하면 안되는 이유

Editor_PA201 2023. 5. 8. 18:01

 

언제 로그변환을 해야하나?

회귀분석에 있어서 로그 변환은 중요한 도구이다. 변수의 값 변동이 항상 일정한 경우에는 로그 변환이 필요하지 않을 수 있다. 예를 들어, 변수의 값이 일정한 편차를 가지고 있다면 로그 변환이 필요하지 않을 수 있다.

하지만, 일정하지 않은 값 변동을 가지면서도 백분율의 변화는 일정하게 느껴지는 경우에는 로그 변환이 필요할 수 있다. 예를 들어, 매출, 가격, 물량과 같은 변수들은 값의 변동이 일정하지 않을 수 있지만, 백분율의 변화는 상대적으로 일정하게 느껴질 수 있다.

음수가 될 수 있는 변수들인 순이익, 순수출과 같은 경우에는 로그 변환이 불가능하다. 이런 경우에는 다른 변수들로 나누어 데이터를 조정하는 것이 좋습니다. 예를 들어, 직원 수로 나누어 인당 순이익이나 인당 순수출을 만들어줄 수 있다. 이렇게 하면 데이터값들이 튀는 현상을 완화할 수 있다.

비율 변수(즉, 0을 포함하는 변수)에 대해서는 로그 변환을 적용하는 데에 신중해야 한다. 이유는 비율 변수의 경우 로그 변환을 함부로 적용하면 문제가 발생할 수 있기 때문이다. 로그 변환을 적용할 때에는 해당 변수의 특성과 데이터의 분포를 고려해야 한다.

0을 로그변환 하는법

무엇이 가장 좋은 방법일까? 어떤 방법을 사용해도 괜찮은 걸까? 아니다. 위 방법에 따라 결과는 확연히 바뀐다. 따라서 우리는 분석에 주의를 기울여야 한다.

  1. 0을 제거하는 방법은 가장 쉽고 간편한 방법 중 하나이다. 속이 시원하게, 0이 있는 행(row)을 제거해버리는 것이다. 그러나, 0이 너무 많거나 0인 이유가 있는 경우에는 회귀분석이 올바르게 이루어지지 않을 수 있다.
  2. 0을 특정한 단위값으로 치환하는 방법도 있다. 모든 0을 1이나 다른 값으로 바꾸는 것이다. 그러나, 어떤 값으로 바꿔야 올바른지는 고민해야 한다.
  3. 더하나 마나 한 값을 더하는 방법은 위의 방법과 비슷하다. 다른 점은 0이 아닌 모든 값에 더하는 것입니다. 보통 1을 더하는 방법이 많이 사용된다.
  4. 0을 1로 치환한 후 0에 해당하는 더미(dummy)를 사용하는 방법은 2번 방법을 좀 더 확장한 방법이다. 1로 변경된 값을 사용하고, 해당 변수에 대해 0인 경우를 나타내는 더미 변수(dummy variable)를 추가하여 인위적인 효과를 보정하는 방법이다.
  5. 비선형성을 제곱항으로 처리하는 방법은 로그 변환이 필요하지 않을 때 사용하는 방법이다. 해당 변수의 제곱 항을 추가하여 비선형성을 반영할 수 있다.

어떤 방법이 가장 좋은 방법인지는 알기 어렵다. 위의 방법에 따라 결과는 확연히 달라질 수 있습니다. 따라서 우리는 분석에 신중함을 기울여야 한다. 위 방법들을 실습을 통해 비교해보았다. 실습에는 한치록 교수님의 "계량경제학 강의" 내 데이터셋과 예제(11.4)을 사용하였다. 결과를 확인해 보자.


데이터 셋 : 계량경제학강의(한치록) 데이터 http://econ.korea.ac.kr/~chirokhan/book/

hies16subset은 통계청에서 작성한 2016년 가계동향조사로부터 몇가지 변수에 대해 가구주 연령이 30-39세인 가구들을 재 추출한 자료(n = 1,368)

# cons : 소비지출
# inc : 소득
# famsize : 가구원수
# emp : 가구주 고용 여부
# age : 가구주 연령
# ownhouse : 자기 주택 소유 여부
# female : 여성 가구주 여부
# educ : 가구주 교육년수

# 기본적인 설정
%matplotlib inline                # 그래프를 주피터 노트북 화면에 바로 보여줌
pd.options.display.precision = 3  # 통계량의 숫자표현을 소수점 3번째 자리까지 보여줌
                                  # 이거 안쓰면 과학적 표기법 나옴(0.e05..등)
# 사용한 라이브러리
import numpy as np 
import pandas as pd
import statsmodels.formula.api as smf
from statsmodels.iolib.summary2 import summary_col # 여러개의 회귀분석 결과 비교
import seaborn as sns
import matplotlib.pyplot as plt

# 기본적인 경로설정
csv_path = "사용한 데이터 경로!"
hies = pd.read_csv(csv_path + '/loedata/Hies.csv')
# 필요한 변수 추출
hies = hies[['famsize', 'age', 'emp', 'ownhouse', 'inc', 'cons', 'educ', 'female']]

# 요약통계량 확인
hies.describe().T

# 변수생성
## inca : inc이 0인 경우, 1원으로 치환한 변수
hies['inca'] = hies['inc'].replace(0, 1)
hies['inc0dm'] = np.where(hies['inc'] == 0, 1, 0)
## incmil : inc를 100만 단위로 치환
hies['incmil'] = hies['inc']/1e06
# formula 생성
fm = 'np.log(cons)~np.log(famsize)+emp+age+np.power(age, 2)+ownhouse+female+educ'
fm1 = fm + "+np.log(inc)" # 0을 모두 제거
fm2 = fm + "+np.log(inca)" # 0을 1로 변경
fm3 = fm + "+np.log(1+inc)" # 모든 값에 1 더함
fm4 = fm + "+np.log(inca)+inc0dm" # 0을 1로 바꾸고, 더미 생성
fm5 = fm + "+incmil+np.power(incmil, 2)" # 소득의 제곱항 추가

ols = smf.ols(fm, data=hies).fit()
ols1 = smf.ols(fm1, data=hies[hies['inc'] > 0]).fit() # 파이썬은 log0을 -Inf로 인식한다.
ols2 = smf.ols(fm2, data=hies).fit()
ols3 = smf.ols(fm3, data=hies).fit()
ols4 = smf.ols(fm4, data=hies).fit()
ols5 = smf.ols(fm5, data=hies).fit()
res = summary_col([ols1, ols2, ols3, ols4, ols5], stars=True)
res.tables[0].to_csv("test.csv")
res.tables

결과

아래 표에서 보면 알 수 있듯이, 모델 1,4,5와 모델 2,3의 계수는 확연히 차이가 난다. 우선 소비지출에 대한 emp(가구주 고용여부)의 계수가 모델 2,3에서는 통계적으로 유의하다. 다만 age(가구주 연령)과 ownhouse(자기 주택 소유 여부)는 모델 1,4,5에서만 유의하고, 2,3에서는 유의하게 나타나지 않았다. 마찬가지로 educ, female에서도 모델간 차이를 발견했다.

우리가 살펴보고 싶은 inc의 경우에도 모델 1,4에서는 0.4의 계수를 가지지만, 모델 2,3에서는 0.05 수준밖에 되지 않는다.

우리는 위 분석을 통해 데이터에서 0을 어떻게 처리하느냐에 따라 분석의 결과가 확연히 변하는 것을 확인할 수 있다.

모두들 0변환에 있어서 주의하도록!

Comments