본문 바로가기
종속변수가 더 특이하면 어쩌죠? 일반화회귀(GLM)의 Link함수는 어떻게 정함?

GLM - Generalized Linear Model이라고 일반형 회귀라는 게 있습니다. 흔히 일반형 회귀를 시작할 때 처음에 나오는 설명들이 있는데, 종속변수가 정규분포할 때는 선형회귀를, 종속변수가 Binary일 때는 Logistic 회귀를, 종속변수가 Poisson일 때에는 Poisson회귀를 한다면서, 대뜸 Link 함수를 소개하는 경우가 많습니다.

어떤 식이냐면,

이런 식의 정리표 인데요, 여기에서 Link함수라는 건 Link함수를 이용하면 독립변수와 종속변수가 선형관계를 갖지 않는 경우, 로지스틱 회귀에서 보았던 것처럼 종속변수의 분포를 쫙 펴서 선형회귀로 문제를 풀 수 있다는 의미입니다. - 당연히 Link함수는 종속변수에 적용하는 함수겠죠. 그냥 처음 보면 음. 그럴 듯 한 걸 싶긴 한데, 이걸 보고 있으면 이 Link함수를 정하는 그럴듯한 방법이 있지 않을까? 하는 생각이 들지 않나요. 뭐 복잡하게 생각하지 않고, 오, 그렇군, 썡유! 하고 외우면 될 테지만, 이대로 받아들이면 자다가도 문뜩 왜?라고 외치게 되는 의문을 해결할 수가 없습니다. - 아무리 궁금해도 이런 사람은 없을 거라 생각합니다만. 이 Link함수라는 것을 이해하기 위해서는 회귀를 할 때 모회귀선에 대한 가정을 이해하는 것이 매우 중요한데 말이죠, 이걸 더 자세하게 알아보기 위해서 선형회귀, 로지스틱회귀, 포아송회귀, 그리고 일반적인 회귀 순서로 이것들을 살펴보도록 하겠습니다.

첫 번째로 선형회귀 이야기.

선형회귀에서 회귀분석을 할 때에는 어떤 가정을 만족해야 하는데, 그 가정이 무엇이냐 하면, 첫 번째로 독립변수와 종속변수가 선형관계이고, 회귀선이 지나는 y의 값은 각 xᵢ에서의 모집단 yᵢ의 추정 평균(True Estimated Mean)을 지나게 된다는 것입니다. 그리고, 모집단 yᵢ는 가우시안 분포를 한다는 것이죠. 그러니까 추세는 직선의 모양새를 보이겠죠.

그러니까 선형회귀의 경우, x와 y가 선형관계이고, 각 x에서의 회귀선상의 각 y의 의미는 가우시안 분포를 가지는 y에 대한 모평균 추정값(Estimated True Mean)을 의미합니다.

이걸 어떻게 표현하냐면

$$ \mu_i = b_0 + b_1 x_i$$

이렇게 됩니다. 각 관측점의 종속변수의 모분포를 표현하면 $$ y_i \sim \mathcal{N}(\mu_i, \epsilon)$$ 입니다.

오, 그렇군요. 이걸 잘 기억해 두고요.

두 번째로 로지스틱 회귀 이야기.

같은 의미로 로지스틱회귀에서 회귀분석을 할 때 만족해야 하는 가정은 독립변수와 종속변수, 즉 xᵢ와 Odds $\cfrac{P_i}{1-P_i}$가 지수관계이고, 회귀선이 지나는 y의 값은 각 xᵢ에서의 모집단 yᵢ의 추정 확률(True Estimated Probability)을 지나게 됩니다. 그리고, 모집단 yᵢ는 베르누이 분포를 한다는 것이죠. 회귀선을 찾기 위한 각 xᵢ에서의 표본 확률을 이용합니다.

이걸 수식으로 풀어쓰면 다음과 같습니다.

$$ \ln \left(\cfrac{P_i}{1-P_i} \right) = b_0 + b_1 x_i$$ 이걸 선형회귀의 경우와 똑같이 각 관측점 xᵢ에서의 종속변수의 모분포는 베르누이 분포니까, $$ y_i \sim Ber(P_i) $$

가 되겠습니다. 뭐 간단하..... 하..

그러면 세 번째로 포아송 회귀는 어떨지 상상해 볼까요?

포아송회귀에서 회귀분석을 할 때 만족해야 하는 가정은 독립변수와 종속변수가 지수관계를 가지고, 회귀선이 지나는 y의 값은 각 xᵢ에서의 모집단 yᵢ의 추정 평균 발생률(True Estimated Mean Number of Event)을 지나게 됩니다. 각 xᵢ에서의 종속변수인 모집단 yᵢ는 포아송분포를 한다는 것이죠.

$$ \lambda_i = e^{(b_0 + b_1 x_i)} $$ 요렇게 표현할 수 있겠네요. 그리고, 각 관측점 xᵢ에서 관측된 종속변수 yᵢ의 분포는 모평균발생률을 모수로 한 Poisson 분포를 갖습니다. 각 xᵢ에서의 표본 yᵢ의 표본평균발생률을 이용해서 선형회귀선을 찾습니다.

$$ y_i \sim Poisson(\lambda_i) $$ 자, 이걸 자세히 들여다보겠습니다. 일단 어떤 데이터들이 포아송 분포 같은 느낌이냐 하면,

자, 요런 느낌인데요, 이런 데이터를 실제로 관측했다고 봅시다. 그냥 데이터를 본 감상을 늘어놓자면

⓵ 이거 선형은 아닌 것 같은데, Exponential 느낌이 강하군요.

⓶ 각 관측점에서 yᵢ의 분산이 점점 더 커지는 느낌입니다. 음.

자, 이런 감상평을 회귀분석에 잘 적용하기 위해 이런 성질을 갖는 것이 무엇일까? 를 생각해 보면, 그것이 바로~ 포아송분포입니다. 힉? 뭐라고요?

포아송 분포는 - x가 발생 횟수, λ가 평균 발생률일 때 $$ P(X=x) = \cfrac{\lambda ^x e^{-\lambda}}{x!} $$ 입니다. 요 포아송 분포라는 게 평균 발생률에 따라 모양새가 바뀝니다.

자, 이걸 고개를 돌려서 한번 보시죠. 

이런 건데 이걸 해석해 보면, λᵢ가 평균발생률이거든요. 그러니까, 이것은 평균발생율이 λᵢ일 때 yᵢ번 발생할 확률입니다. 이해하기 쉽도록 이 데이터 분포를 Poisson 분포와 겹쳐서 그려보면

이런 식이 됩니다. y축이 실제 발생 횟수입니다. 대~충 특정 xᵢ에서 확률분포와 표본분포가 비스므리하게~ 맞아 들어가죠? 음. 그럴듯합니다. 이 확률 분포를 바라보면 다음과 같이 해석할 수 있습니다. 각 xᵢ에서 관찰된 발생 횟수는 yᵢ로 관찰되고 관찰된 yᵢ에 대하여 계산한 평균 발생률 λᵢ에 따라서 발생 횟수의 yᵢ모분포가 결정됩니다. 이렇게 의미를 알고 보니까 더 대~충 겹쳐본 게 맞아 들어가는 것 같죠? 자 이때 회귀선이 어떻게 생겼나요~? 지수함수처럼 늘어나는군요! 그러니까 이 경우에는 $$ \lambda_i = e^{b_0 + b_1 x_i} $$ 형태가 되겠군요. 결국

$$ ln \lambda_i = b_0 + b_1 x_i $$ 가 되고 $$ y_i \sim Poisson(\lambda_i) $$ 입니다. 그렇다면 λᵢ값들을 어떻게 변환해야 직선처럼 될까요? 그렇습니다. "데이터를 로그 변환 했을 때 벌어지는 일과 결과 해석" 편에서 본 대로 로그를 취하면 마구 늘어나는 오른쪽 구간의 λᵢ를 줄이고, 잘 안 늘어나는 왼쪽 구간의 λᵢ을 큰 값으로 만들어 주겠죠. 아하~ 그래서 그랬구나 무릎 탁 자, 각 xᵢ에서의 λᵢ를 활용해서 회귀를 하고 λᵢ가 지수형태를 가지니까, $$ ln(\lambda_i) = b_0 + b_1 x$$ $$ y_i \sim Poisson(\lambda_i) $$ 이런 식으로 정리할 수 있겠습니다.

자, 이렇게 정리하면 바로~ 선형회귀로 고쳐서 회귀를 할 수 있겠습니다.

참고로 처음에 했던 말을 정리를 다시 하자면 선형회귀는 굳이 선형으로 바꿔줄 필요가 없으니까 링크함수를 항등원 = 으로 쓰겠죠? 그러면 로지스틱회귀는 링크함수가 logit입니다. 그리고 마지막으로 포아송은 경우에는 ln입니다.

이게 link 함수를 선정하는 원리인데, 그러면 이런 경우도 있지 않겠어요? 지수함수처럼 늘어나는데 각 관찰점에서의 종속변수는 포아송이 아닌 가우시안 분포를 따르는 거예요. 아 그럴 수도 있겠군요?

예를 들면 이런 식입니다.

캬.. 이런 식으로 생긴 데이터에 대하여 Link function을 정한다면 어떻게 하면 좋을까요? 자, 첫 번째 질문을 다시 해 보면, 이럴 때는 yᵢ는 어떤 분포를 갖는가? 와 전체 추세가 어떤가?를 보면 좋은데, 가만히 살펴보면 지수함수 꼴이니까, 방금 보았듯이 로그를 씌우면 선형회귀처럼 만들 수 있겠습니다.

즉,

$$ ln(\mu_i) = b_0 + b_1 x $$ $$ y_i \sim \mathcal{N}(\mu_i, \epsilon)$$ 으로 표시할 수 있겠습니다.

이런 식으로 로그함수를 링크함수로 정해서 회귀를 해 주면 됩니다. 후후. 어때요 간단하죠? 후후.

그러면 어떤 식으로 Poisson 회귀를 하는지 한번 statsmodel의 코드 예시를 구경해 보시고, 마지막에 봤던 지수느낌의 Gaussian도 한번 보시죠.

 

# Poisson 회귀 
import statsmodels.api as sm 

exog, endog = sm.add_constant(x), y 

model = sm.GLM(endog, exog, sm.families.Poisson(link=sm.families.links.log) 

reg = model.fit()  # link함수는 log, yi의 분포는 Poisson이라는 의미입니다.

 

처음 보는 용어가 있는데, exog는 exogenous라고 해서 독립변수 x를 의미하고, endog는 endogenous라고 해서 종속변수 y를 의미합니다. 이 용어는 처음 봤으니까 소개를 한다면 exog는 외생변수, endog는 내생변수를 의미하고, 독립변수는 모형에 외부에서 영향을 주는 변수, 종속변수는 모형 내부에서 독립변수의 영향을 받는 변수라는 느낌으로 알아두면 좋겠습니다. 왜 이렇게 여러 가지로 부르는지 알다가도 모르겠습니다만, 여튼 알고는 있어야 되니 참고해 주세요. 코드의 의미는 특정 분포의 종속변수에 link함수를 씌우듯이 같은 순서로 종속변수 포아송에, 링크 함수는 log로 정해주면 자동으로 회귀 분석을 해줍니다.

자, 그럼 지수 느낌의 가우시안은?

model = sm.GLM(endog, exog, family=sm.families.Gaussian(sm.families.links.log) # link함수는 log, yi의 분포는 Gaussian이라는 이야기입니다. 

reg = model.fit()

 

이렇게 하면 됩니다. 종속변수 가우시안에, 링크함수 log로 해서 회귀 분석 결과를 알려줍니다. 뭐야, 이거 꽤나 간단하잖아?라고 생각해 주시면, GLM에 관해서 누가 도발한다고 해서 당황하고 얼굴이 빨개지지는 않을 거라 생각합니다.

일반형 회귀분석 결과는 이제까지와 마찬가지의 해석을 하면 됩니다. 이제는 익숙할 테니까 너무 두려워 말고 달달하게 해석해 보세요! 전 이만.

친절한 데이터 사이언스 강좌 글 전체 목차 (정주행 링크) -



댓글





친절한 데이터 사이언스 강좌 글 전체 목차 (정주행 링크) -