[Modeling] Tobit Model
안녕하세요~! 빅데이터가 아닌 스몰데이터일 경우, AI 모델보다 통계 모델이 더 잘 적합되는 경우가 많기 때문에 통계 분석 카테고리도 만들어 보았습니다! Statistical Analysis의 첫 번째 포스트로 Tobit Model에 대해 설명하도록 하겠습니다. 일반적인 통계 분석에서는 많이 사용되지 않지만, 실제 데이터와 같이 정형화되지 않은 데이터를 모델링할 때, 종종 이 모델이 유용하게 사용되는 경우가 있습니다. 생각보다 이러한 데이터의 특성을 마주치는 경우들이 많으니 보시면 좋을 것 같습니다.
개요
1. Censored Data
통계 분석을 진행할 때, Python 내 DataSet들이나 각종 서적에서 제공되는 정형화된 데이터들은 어느 정도 전처리가 되어있기 때문에 정규 분포를 따르지 않더라도 회귀분석으로 설명 가능한 경우들이 많습니다. 하지만, 실제 현업에서 사용되는 데이터는 거의 정제돼 있지 않아 일반적인 회귀 분석을 적용시켰을 때, 충분히 적합되지 않은 모델이 만들어진 가능성이 높습니다. 대표적인 예시가 바로 데이터가 검열되어 중단된 경우입니다. 한 마디로 데이터가 뚝 끊긴 것이죠!
예를 들어 어느 학교에서 수학 시험 점수로 회귀분석을 진행하려고 할때, 최저 수학 점수를 20점으로 설정한 경우가 있습니다. 즉, 10점, 15점 점수를 받더라도 20점으로 간주하게 되는데, 데이터를 인위적으로 왜곡시켰기 때문에 정규 분포와 너무나 벗어난 데이터 분포가 그려지게 됩니다. 따라서, 정규분포를 가정하는 회귀분석을 사용했을 때, 예측력이 저하되고, 계수 추정치도 올바르게 추정되지 않는 문제가 발생합니다.
이렇듯 일부 Y 관측치가 검열되어 절단된(제한된) 정보를 가지는 데이터를 Censored Data(검열 데이터)라고 하며, 이 경우 검열 정보를 고려한 모델을 이용하여 분석을 진행해야 합니다. 데이터가 0 이하에서 절단되어 0값이 상당히 많이 발생하는 경우가 있는데 이런 0 과잉 데이터들이 대표적인 Censored Data 입니다.
2. Tobit Model
Tobit Model은 Censored Data의 검열된 종속변수를 고려해서 새로운 잠재 종속변수를 만들어 추정하는 모델입니다. 검열은 좌측 검열, 우측 검열, 양쪽 검열이 있으며 좌측 검열을 예로 들어 설명드리겠습니다.
$ \begin{align*} y_{i}^{*} &= X_{i}\beta + \epsilon_{i},~~~ \epsilon_{i} \sim N(0, \sigma^{2}),~~~i=1, 2, \cdots,n \\ y_{i} &= \begin{cases} y_{i}^{*} & y_{i}^{*} > \tau \\ \tau, & y_{i}^{*} \le \tau \end{cases} \\ \end{align*}$
위 식에서 $\tau$가 검열 임계값입니다. 실제값인 $y_i$는 검열된 값이기 때문에 검열 전의 값인 잠재변수 $y_i^{*}$를 정의합니다. 즉, 잠재변수 $y_i^{*}$는 정상적인 정규분포를 따른다고 가정합니다. $y_i^{*} > \tau$일 경우, 실제 $y_i^{*}$ 값을 그대로 관측하게 되며, $y_i^{*} \le \tau$일 경우, 실제값이 아닌 임계값 $\tau$를 관측하게 됩니다.
위 Tobit 모델에서 MLE를 이용하여 파라미터 $\beta, \sigma$를 추정하면 최종 모델이 만들어지며 예측값을 산출할 수 있습니다. 먼저 MLE를 구하기 위해 아래와 같이 검열 되지 않았을 때와 검열 됐을 때의 pdf를 구해보겠습니다.
(1) 검열 되지 않은 관측치일 경우 (Uncensored) : $y_i^{*} > \tau$
- $y_i = y_i^{*}$가 되며, $y_i^{*} \sim N(X_{i} \beta, \sigma^{2})$을 따르게 됩니다.
- $\displaystyle {\therefore f(y_i \mid X_i, \beta, \sigma) = \frac {1}{\sigma} \phi(\frac {y_i - X_i \beta} {\sigma})}$
(2) 검열 된 관측치일 경우 (censored) : $y_i^{*} \le \tau$
- $y_i^{*}$ 는 모두 $\tau$ 가 되며, $y_i = \tau$ 일 때의 pdf는 $y_i^{*} \le \tau$ 일 확률로서 구해지게 됩니다. 즉, 정규분포의 cdf로 구해집니다.
- $\displaystyle {\therefore f(y_i \mid X_i, \beta, \sigma) = P(y_i^{*} \le \tau \mid X_i, \beta, \sigma) = \Phi(\frac {\tau - X_i \beta} {\sigma})}$
이렇게 구해진 pdf식을 이용하여 우도함수를 만들어 MLE를 구합니다.
$ \begin{align*} L &= \prod_{i=1}^{N} L_{i} \\ &= \prod_{X_i~~is~~Uncensored} \frac {1}{\sigma} \phi(\frac {y_i - X_i \beta} {\sigma}) \prod_{X_i~~is~~censored} \Phi(\frac {\tau - X_i \beta} {\sigma}) \\ \end{align*} $
위 식에 log를 취하여 $logL$을 만든 후, $logL$을 최대화하는 파라미터 $\beta, \sigma$를 찾으면 모델 적합은 완료됩니다. Newton-Raphson이나 BFGS와 같은 방법으로 파라미터 최적화를 진행하여 MLE를 찾는 것으로 알려져 있으며, 최적화 방법에 대해서는 따로 포스팅을 하도록 하겠습니다.
그렇다면 실습을 통해 Tobit Model의 성능을 보도록 하겠습니다.
실습
이번 실습 데이터는 지역별 북한 주민들의 임금 데이터를 가져와 봤습니다. 이를 이용해 북한 지역 간의 정규소득 불평등이 있는지 확인하고자 합니다. 참고로 임금/소득 데이터는 0보다 작은 음수값이 존재 하지 않기 때문에 0에 대해 좌측 검열된 경우들이 꽤 많습니다. 이러한 특성으로 임금/소득 데이터 통계 분석에 Tobit Model을 종종 사용하곤 합니다.
먼저 Tobit Model을 이용하려면 py4etrics 패키지를 설치해야 합니다.
!pip install py4etrics
이후 local 데이터를 불러옵니다. 간단히 데이터 요약을 하면 다음과 같습니다.
- Shape : $(235, 12)$
- gender : 1(남자), 2(여자)
- age : 20대, 30대, 40대, 50대, 60대
- region : 1(평양), 2(내륙), 3(북중 접견 지역)
- job1 : 1(저소득 직업), 2(중소득 직업), 3(고소득 직업)
- official1 : 공식소득
import numpy as np
import pandas as pd
from py4etrics import tobit
import statsmodels.api as sm
north = pd.read_csv("~")
north
전체 235개 데이터 중 109개의 공식소득이 0임이 확인됩니다. 즉, 해당 데이터는 임계값이 0으로 좌측 검열된 것을 알 수 있습니다.
north.loc[north['official1'] == 0, ].shape[0]
--------------------------------------------------------------------------------------------------------------------------------
109
검열여부(censored) 변수와 intercept 변수를 만들어주고, X 변수들을 전처리 해줍니다. 이 때 검열여부(censored) 변수는 좌측 검열일 경우 -1, 우측 검열일 경우 1, 검열 데이터가 아닐 경우 0으로 표기해야 합니다. 해당 데이터는 좌측 검열이기 때문에 -1로 표기합니다. 이후 Tobit Model에 들어갈 검열여부 변수, X변수, y변수를 지정합니다.
north['censored'] = np.where(north['official1'] > 0, 0, -1)
north['intercept'] = 1
north['gender2'] = np.where(north['gender'] == 2, 1, 0)
north['age_30'] = np.where(north['age'] == 30, 1, 0)
north['age_40'] = np.where(north['age'] == 40, 1, 0)
north['age_50'] = np.where(north['age'] == 50, 1, 0)
north['age_60'] = np.where(north['age'] == 60, 1, 0)
north['region2'] = np.where(north['region'] == 2, 1, 0)
north['region3'] = np.where(north['region'] == 3, 1, 0)
north['official_job2'] = np.where(north['job1'] == 2, 1, 0)
north['official_job3'] = np.where(north['job1'] == 3, 1, 0)
cens = north['censored'].values
endog = north['official1']
exog = north[['intercept', 'gender2', 'age_30', 'age_40', 'age_50', 'age_60', 'region2', 'region3', 'official_job2', 'official_job3']]
tobit.Tobit 함수를 이용하여 모델을 적합했을 때, 아래와 같은 결과를 얻게 되며 AIC, BIC는 각각 3,500 정도 나오는 것을 볼 수 있습니다. 아래 결과를 토대로 평양(Region1)의 공식소득이 다른 두 지역보다 약 10만원 이상 높으며, 그 다음으로 북중 접견 지역(Region3)이 내륙 지방(Region2)보다 약 3만원 정도 더 소득이 높은 것을 알 수 있습니다.
tobit_res = tobit.Tobit(endog, exog, cens).fit()
tobit_res.summary()
Tobit Model의 적합성을 알기 위해 일반 회귀모델을 적합시켰을 때의 결과와 비교해보도록 하겠습니다. 우선 이 모델의 AIC, BIC는 약 6,200으로 Tobit Model보다 값이 2배로 크게 나와 모델 적합성이 떨어지며, 우리가 알고 싶은 Region 값에 대해서는 Tobit Model과 비슷한 해석을 할 수 있으나, 나이변수는 이 모델에 모두 유효하지 않은 것으로 나타나 잘못된 해석을 할 수 있습니다. 따라서, 이와 같이 검열된 데이터에는 Tobit Model이 일반적인 회귀모델보다 더 좋은 성능을 보이고 있습니다.
ols_mod = sm.OLS(endog, exog)
ols_res = ols_mod.fit()
ols_res.summary()
Tobit Model에 대해서 글을 마치며, 추후 기회가 된다면 이보다 한 단계 더 나아간 Censored Model인 Heckman Model에 대해 설명드리도록 하겠습니다.
Reference
- 통계 상담 I 수업 [조형준 교수님]
댓글남기기