Tribute to error
페이스북에서 'regression model에서 regression 이라는 용어는 잘못되었다' 는 글(https://www.facebook.com/dgtgrade/posts/1153483458043852) 를 봤습니다.
우선 '회귀(regression)' 라는 단어가 일상에서 잘 안쓰이는 단어이고 직관적이지 못하다는 점은 저도 공감합니다. 수학이나 과학 용어 중에는 이렇게 비직관적이고 어려운 용어들이 많이 있죠. 따라서 이런 용어들을 좀 더 쉬운 단어로 바꿔야 한다고 생각합니다. 그러나 비록 회귀 모델의 '회귀'라는 용어가 비직관적이긴 하지만 잘못된 용어라고는 생각하지 않습니다.
이 글에서는 그 이유를 설명하기 위해 제가 이해하는 '회귀'의 의미와 함께 회귀 모델에 대해 정리합니다.
이 글은 이미 회귀 모델이 무엇인지에 대해서 기본적인 지식은 있다는 전제하에 내용을 전개해 나가겠지만 명확한 소통을 위해 회귀 모델에 대해 다음과 같이 정의를 내리고 시작합니다.
회귀 모델은 어떤 연속형 데이터 Y와 이 Y의 원인이 되는(엄밀히 말해 원인이라고 추정되는) X간의 관계를 추정하기 위해 만든 아래와 같은 형식의 관계식을 말합니다.
Y = f(X)
그런데 실제 데이터는 측정상의 한계나 기타 여러 가지 원인으로 인해 데이터 자체에 잡음이 들어가거나 유실이 발생합니다. 따라서 실제로는 수학이나 물리학의 수식들처럼 정확한 관계식(equation function)을 만들 수 없기 때문에 다음과 같이 확률 변수인 오차항을 두게 됩니다.
Y = f(X) + e
예를 들어 온도에 따른 어떤 물질의 부피 변화에 대한 관계식을 물리학에서는 '부피 = w*온도' 라고 정의할 것입니다. 그러나 실제 실험에서 온도에 따라 물체의 부피를 측정하면 정확하게 위 관계식에 맞는 w를 찾을 수 없습니다. 왜냐하면 측정상의 오차나 실험 환경 상에서 발생하는 여러 가지 변수(이를 테면 습도)들이 영향을 줄테니까요. 물리학에서는 이런 오차는 무시하고 수식을 만들지만 통계학에서는 이런 오차를 모두 e라는 확률 변수로 대신 표기합니다.
얼핏 생각하기에 여기서 중요한 것은 부피와 온도 사이의 관계이기 때문에 e 라는 오차항은 그냥 무시하면 될 것 같습니다. 그리고 실제로 만약 우리가 f(X)를 정확하게 알고 있다면 e는 무시해도 됩니다. 심지어 E=MC^2 같은 수식을 생각해 보면, 물리학에서는 관계 계수인 w의 구체적인 값도 그냥 적당히 무시해 버리는 대인배의 풍모를 자랑합니다. 그러나 데이터 분석가들은 매우 쪼잔한 존재이기 때문에 모델링을 할 때는 f(X)를 모르는 상태에서 이것을 추정하는 것부터 시작하기 때문에 이 오차항을 무시할 수 없습니다. 다시 말해 내가 추정한 회귀 모델인 f(X)를 실제 데이터에 적용했을 때 나오는 오차항이 무시해도 좋은 정도인지 먼저 확인해 본 후, 무시해도 좋다고 판단될 때만 무시해야 합니다. 그러나 대개는 이런 사실을 모르거나, 귀찮거나 아니면 이 검정을 통과할만큼 정확한 모델을 만들 방법이나 시간이 부족해서 무시하고 넘어갑니다.
여기서 오차항에 대해 이렇게 강조하는 이유는 바로 이 오차항이 회귀 모델에서 '회귀'의 의미를 이해하는 것과 깊은 관련이 있기 때문입니다.
회귀의 사전적 정의는 '한바퀴 돌아 제자리로 돌아가다' 입니다. 따라서 회귀 모델에서 말하는 '회귀'의 의미를 이해하려면 무엇이 어디로 회귀하는 것인지 아는 것이 중요합니다. 위 링크 글을 비롯하여 많은 글에서는 이 회귀에 대해 골턴이 제시했던 '평균으로의 회귀'를 예로 들며 데이터가 회귀 모델이 제시한 추세선으로 회귀하는 것이라고 설명합니다.
그러나 위 링크의 댓글에도 나와 있듯이 데이터가 추세선으로 회귀한다는 설명은 뭔가 어색합니다. 오히려 반대로 추세선이 데이터를 따라 간다는 것이 더 맞는 설명같습니다. 그렇기 때문에 'regression' 보다는 'progression' 이라고 해야 한다는 주장이 나오는 것 같습니다. 그러나 제가 생각하기에 이 설명은 제대로된 설명이 아닙니다.
제가 이해하기에 회귀 모델에서 '회귀'는 '잔차(residual: 데이터의 실측치와 모델의 예측치 사이의 차이. 즉, 회귀식에서 오차항에 대한 관측치)가 평균으로 회귀하는 것'을 의미합니다. 그리고 이런 맥락에서 회귀 모델은 '잔차가 평균으로 회귀하도록 만든 모델'이라고 정의할 수 있습니다. 이렇게 정의를 내리고 나면 아래 문장은 부정확하다는 것을 알 수 있습니다.
'회귀 모델링은 오차의 합이 최소가 되도록 만드는 작업이다.'
회귀 모델을 만드는 작업을 '데이터와의 오차합이 가장 작은 선'을 찾는 작업이라고 얘기한다면 엄밀히 말해 절반만 맞습니다. 실제 회귀 모델링을 할 때는 잔차가 최소가 되는 선을 찾기에 앞서 다음과 같은 전제 조건이 선행되어야 합니다.
데이터의 실측치와 모델의 추정치 사이의 잔차가 i.i.d.(Independent and Identically Distributed random) 성질을 만족해야 한다.
위 전제 조건을 만족하지 않으면 설령 오차가 최소가 되는 선이라 하더라도 제대로 된 회귀 모델이 아닙니다. 그 이유를 설명하려면 먼저 모델링이란 무엇인가에 대해 먼저 이해해야 합니다.
회귀식을 모델링할 때는 X와 Y 간의 관계에 대해 먼저 추정을 한 후 구체적인 파라미터를 추정하게 됩니다. 가령 앞부분에서 예로 든 물체의 부피와 온도에 대한 회귀식의 경우 X(온도)와 Y(부피) 사이에는 선형 관계가 있고 그 가중치가 w일 것이라는 추정을 먼저 한 것입니다. 그리고 이렇게 추정된 관계식 안에서 구체적으로 w가 무엇인지 계수에 대한 추정을 합니다.
그런데 위의 예에서 만약 실제로는 물체의 부피와 온도 사이에 아무런 관계가 없거나 혹은 온도의 제곱과 선형 관계에 있거나(부피 = w * 온도^2)아니면 온도 뿐만 아니라 습도와도 밀접하게 관련이 있다면(부피 = w1*온도 + w2*습도) 비록 오차의 합이 최소가 되도록 w를 추정하더라도 그 회귀식은 정확한 회귀 모델이 되지 못합니다. 따라서 이 회귀식을 이용해서 부피를 예측하면 실제 부피와 차이가 생길 수 밖에 없습니다.
한편, 만약 실제로 부피는 온도와 선형 관계에 있는 것이 맞다면 이 회귀 모델은 부피와 온도의 관계를 잘 추정한 모델이기 때문에 이 관계식을 이용해서 파라미터인 w를 추정하면 정확한 회귀식을 만들 수 있습니다. 그런데 설령 이렇게 정확한 모델을 만들더라도 앞서 언급했듯이 현실 세계에서의 여러 가지 오차(잡음)로 인해 이 모델을 이용해서 부피를 예측한 값과 실제 부피 사이에는 여전히 약간의 차이가 발생합니다.
결국 정확한 회귀 모델을 만들든 그렇지 못하든 항상 모델의 예측치와 실측치 사이에는 차이가 존재합니다. 다만 부정확한 회귀 모델로 인한 차이와 정확한 회귀 모델에서 발생하는 차이 사이에는 근본적으로 다른 성질이 있습니다. 즉, 정확한 모델을 만들었다면 잔차는 평균인 0으로 회귀하지만 부정확한 모델에서는 그렇지 못합니다. 이것이 위에서 얘기한 잔차의 성질입니다. 따라서 내가 추정한 관계식이 제대로 된 회귀 모델인지 여부를 판단할 때는 내가 만든 모델의 예측치와 실제값 사이의 잔차의 기대치(평균)가 0이고 평균으로 회귀하는지 살펴 봐야 합니다.
다시 말해, 내가 추정한 모델과 실제 데이터 사이의 오차가 단순히 현실 세계에 존재하는 잡음인지 아니면 내가 고려하지 못한 어떤 속성 때문인지를 알려면 잔차가 i.i.d. 한 속성을 갖고 있는지 확인해야 합니다. 이를 위해선 다음과 같은 조건을 모두 만족하는지 살펴 봐야 합니다.
잔차의 분포는 정규 분포이어야 한다.
잔차와 독립변수 X 사이에 상관 관계가 없고 자기 자신과도 상관이 없어야 한다(잔차는 독립이어야 한다).
잔차의 분포가 일정해야 한다(잔차는 등분산성을 만족해야 한다).
위 조건을 모두 만족한다면 해당 모델의 예측치와 실제 데이터 사이의 차이인 잔차는 평균으로 회귀하게 됩니다. 다시 말하면, 비록 실제 세계에서 어쩔 수 없이 존재하는 잡음으로 인해 완전히 예측치와 실측치가 일치하지는 않으며 그래서 어떤 데이터에 대해서는 그 차이가 클 수 있지만, 전체 추세로 볼 때는 잔차의 평균(대개는 0)으로 수렴합니다.
그럼 위에서 나열한 잔차의 조건에 대해서 좀 더 자세히 알아 보겠습니다.
만약 어떤 데이터에 대해 정확한 모델을 만들었다면 그 모델과 실제 데이터 사이의 오차의 확률 분포는 정규 분포를 따릅니다. 그 이유는 정규 분포 자체가 원래 오차에 대한 확률 분포이기 때문입니다. 즉, '왜 오차의 분포가 정규 분포를 따르는가?' 라는 질문은 '왜 당근 케익에서는 당근 맛이 나는가?' 라는 질문과 같습니다(어찌보면 통계학에서 먼저 바꿔야 할 용어는 '회귀' 모델이 아니라 '정규' 분포인 것 같습니다).
비록 정규 분포는 여러 수학자들에 의해서 각기 다른 방식으로 연구되었긴 하지만 이들 중에서 가장 큰 기여를 한 가우스(그래서 정규 분포를 '가우스의 분포'라고도 하죠)의 경우 천체 관측 시 발생하는 오차의 성질을 연구하던 중 이 정규 분포를 발견했습니다. 당시에는 기술이 발달하지 못해 천체를 눈으로 관측하다 보니 매번 관측을 할 때마다 조금씩 오차가 발생했습니다. 그런데 이런 차이값들 사이의 관계를 분석해 보니 이 값들이 평균에 근접할 수록 발생확률이 높고 평균에서 멀어질수록 확률이 떨어지는 아래와 같은 분포 규칙을 따른다는 것을 발견한 것이죠.
따라서 만약 어떤 모델이 데이터의 성질을 정확히 설명한다면 이 둘 사이의 차이는 잡음만 남게 되며 이런 잡음의 분포는 정규 분포입니다. 반대로 말해 만약 모델과 데이터 사이의 차이의 분포가 정규 분포가 아니라면 이 둘 사이의 차이에는 단순한 잡음 뿐만 아니라 내가 반영하지 못한 어떤 특징이 포함되어 있다는 것을 의미합니다.
아주 간단한 예로 다음과 같이 R에서 테스트를 해보겠습니다.
x <- 1:100
# model1
y1 <- 0.5 * x + rnorm(100)*5
m1 <- lm(y1~x)
e1 <- y1 - m1$fitted.values
# model2
y2 <- 0.5 * x^2 + rnorm(100)*5
m2 <- lm(y2~x)
e2 <- y2 - m2$fitted.values
위에서 y1은 x와, y2는 x^2와 선형 관계를 갖는 데이터입니다. 그리고 m1은 y1 ~ x 라는 관계식으로 추정한 회귀 모델이고 m2는 y2 ~ x라는 관계식으로 추정한 회귀 모델입니다. 따라서 m1은 관계식으로 정확히 추정했지만 m2는 잘못된 회귀 모델입니다(원래는 x^2 에 대해서 모델을 추정해야 합니다). 이 상태에서 두 모델의 예측치와 실측치 사이의 잔차인 e1, e2의 히스토그램을 그려보면 아래와 같이 나옵니다.
이렇듯 m1의 잔차인 e1은 종모양의 분포를 띄는 반면 잘못 추정된 모델인 m2의 잔차인 e2는 왼쪽으로 쏠린 분포를 갖습니다. 이렇게 잔차의 정규 분포 여부는 히스토그램으로도 어느 정도 추정이 가능합니다. 하지만 히스토그램은 bin(막대)의 개수나 넓이를 어떻게 주느냐에 따라 모양이 크게 달라질 수 있기 때문에 다소 부정확한 자료입니다. 따라서 좀 더 정확하게 정규성 여부를 측정하고 싶다면 다른 여러 가지 방법을 사용할 수 있습니다.
이 중에서 R에서 간단하게 확인할 수 있는 방법은 아래와 같습니다.
위 방법은 Shapiro-Wilk normality test 라고 합니다. 결과로 나온 p-value가 높으면 정규 분포를 따른다고 볼 수 있으며 반대로 낮을 수록 정규 분포일 가능성이 낮습니다. 위 그림에 나와 있듯이 e1은 p-value가 0.9599 로 매우 높으며 e2는 거의 0에 가깝습니다. 따라서 이것을 통해 m2 모델의 잔차인 e2는 정규 분포를 따르지 않으며 모델이 잘못 추정되었다고 판단할 수 있습니다.
그 외에 normal quantile plot을 그려서 확인하는 방법도 있습니다. 사용 방법은 아래와 같습니다. 왼쪽 그림처럼 데이터가 qqline에서 크게 벗어나지 않으면 정규 분포를 띈다고 판단할 수 있습니다.
실상 데이터의 정규성을 검정하는 방법은 널리 알려진 것만해도 열 가지가 넘기 때문에 이 중에서 적절한 것을 사용하면 됩니다. 어쨌든 이렇게 잔차가 (평균이 0인) 정규 분포를 갖는다는 의미는 잔차가 평균에서 크게 벗어날 확률이 매우 낮다는 의미이며 따라서 골턴이 얘기한 '평균으로의 회귀'와도 연관이 깊습니다.
잔차의 분포가 정규 분포를 갖는다고 하더라도 회귀 모델을 잘 추정했다고 섣불리 판단하면 안됩니다. 더 나아가 잔차의 독립성을 확인해야 합니다. 잔차가 독립이 아니라는 말은 잔차가 어떤 패턴을 갖고 있다는 것을 의미합니다. 앞서 설명했듯이 모델을 정확히 만들었다면 잔차는 단순 잡음이기 때문에 아무런 특징을 갖고 있지 않아야 합니다. 그런데 패턴을 갖고 있다는 것은 단순 잡음이 아님을 의미하며 모델이 정확하지 않다는 뜻이 됩니다.
잔차의 독립성은 아래와 같은 두 가지 관계를 확인해야 합니다.
X와의 상관성
자기 자신과의 상관성
상관성을 확인하는 가장 쉬운 방법은 피어슨 상관 계수를 구하는 것입니다. 그러나 피어슨 상관 계수는 위 예제처럼 잔차가 x에 대해서 일정한 추세를 갖지 않고 높았다가 낮아지는 관계를 갖는다면 일정한 패턴을 갖더라도 낮은 값이 나올 수 있습니다. 따라서 이럴 때는 scatter plot을 찍어 보면 쉽게 확인이 가능합니다.
한편, 잔차의 독립성을 검정할 때는 독립 변수인 X와의 상관성뿐만 아니라 자기 자신과의 상관성도 확인해야 합니다. 이것은 특히 시계열 데이터에서 매우 중요합니다. 시계열 분석에서 흔히 사용하는 auto regression 류의 모델은 모두 잔차의 자기 상관성을 반영한 모델입니다. 그래서 만약 독립변수와는 독립이지만 잔차가 자기 상관성을 갖는다면 이 잔차에 대한 자기 상관 관계를 모델에 반영해줘야 합니다. 예를 들어 바로 직전의 잔차와 자기 상관을 갖는 데이터라면 아래와 같이 auto regression 모델을 만들 수 있습니다.
y = f(x) + e(i)
e(i) = a1*e(i-1) + a0 + e'
물론 여기서 e(i)에 대한 잔차인 e' 에 대해서도 동일하게 i.i.d. 성질을 만족하는지 확인해야겠죠.
이렇듯 잔차가 독립성을 가지면 데이터의 특성에 영향을 받지 않고 원래의 확률인 정규 분포를 그대로 따르게 되기 때문에 전체 추세로 볼 때 평균으로 회귀합니다. 다시 말해 '예측치가 데이터의 값에 영향을 받아 실측치에서 크게 벗어날 확률'이 매우 낮습니다.
마지막으로 확인해야 할 것은 분산이 항상 일정한지 여부입니다. 아래 예를 먼저 살펴 보겠습니다.
y3 <- 0.5 * x + rnorm(100)*5 + rnorm(100)*0.2*x
m3 <- lm(y3 ~ x)
e3 <- y3 - m3$fitted.values
plot(x, y3)
abline(m3)
plot(x, e3)
단순히 x와 y 사이의 관계만 보면 모델을 잘 추정한 것 같지만 잔차와 x 사이의 관계를 scatter plot으로 그려 보면 x가 커질수록 잔차인 e3의 퍼짐 정도가 점점 커지는 것을 볼 수 있습니다. 반면 <그림 4>의 왼쪽 그림의 경우 e1은 x와 상관없이 퍼짐 정도가 일정합니다. 이런 경우 역시 추정한 모델이 정확한 모델이 아님을 의미합니다.
잔차의 분산이 일정치 못하다면, 특히 위 예처럼 점점 발산하는 형태를 취한다면 설령 정규 분포를 띄고 있더라도 x값이 커질수록 점점 평균에서 크게 벗어난 값을 가질 확률이 커져서 평균으로 회귀하지 못합니다. 따라서 이 모델은 실제 데이터의 성질을 잘 반영한 모델이 아닙니다.
잔차가 1) 정규 분포를 띄고 2) 데이터와 상관이 없으며 3) 분산이 항상 일정하다면 평균으로 회귀하는 속성을 갖습니다. 그리고 이렇게 잔차가 평균으로 '회귀'하도록 만든 모델을 '회귀 모델'이라고 합니다. 결국 회귀 모델에서 '회귀' 라는 용어가 잘못되었다는 주장은 잔차의 성질을 고려하지 않은 채 회귀 모델을 이해함으로써 생긴 오해라고 생각합니다.
사실 위에서 정리한 잔차에 대한 조건은 보통 선형 회귀 모델에 대해 설명할 때 변수간의 선형 결합 관계에 대한 조건과 함께 거론됩니다. 그런데 이런 잔차의 성질은 꼭 선형 회귀 모델이 아니더라도 데이터 모델을 만들 때 염두해 둬야할 매우 중요한 정보입니다. 보통 데이터 모델의 성능을 측정할 때 R^2, RMSE, AUC 등의 값만 측정하는 경우가 많은데 보다 엄밀한 모델링을 위해선 이렇게 잔차가 어떤 특성을 갖고 있는지를 분석하는 것이 필요합니다.