회귀란 무엇인가?[1]

사전적으로 회귀(Regression)란 말은 '다시 원래 자리로 돌아간다'는 뜻으로 이를 통계 분석에 처음 사용한 사람은 영국의 우생학자 Galton으로 알려져있다. 그는 완두콩 실험을 통해 부모콩의 무게를 xx축으로 하고 자식콩의 무게를 yy축으로 산점도(scatter plot)를 그려 두 세대 간의 관계를 살펴보았다. 그는 부모콩의 무게가 무거울수록 자식콩의 무게도 무거워지는 경향이 있기는 하지만 그 경향이 기울기가 1보다 작아서 자식의 무게는 부모콩의 평균 무게로 돌아가려는 경향이 있다는 사실을 발견하고 이를 회귀라 표현하였다. 즉, 부모의 무게와는 무관하게 자식들의 무게는 대체적으로 평균을 중심으로 분포한다는 것이다. Galton의 연구실 동료 Karl Pearson은 이를 계량적으로 처음 분석하여 발표하였다.

20세기 초에는 회귀분석이란 용어가 세대 간의 회귀관계를 나타내는 분석으로 사용되었으나 차츰 세월이 흐르면서 변수들 간의 함수관계를 데이터로부터 분석하는 통계적 방법을 회귀분석이라고 이해하게 되었으며, 오늘날에도 이 용어들이 그대로 사용되고 있다.


설명변수와 반응변수

회귀분석은 매우 광범위하게 활용된다. 간단한 예로 다음과 같은 문제를 들 수 있다.

  • 국민소득과 자동차 보유대수 간의 관계
  • 자동차사고 발생건수와 병원의 입원 환자수의 관계

위 예시에서 국민소득과 자동차사고 발생건수와 같이 다른 변수에 영향을 주는 변수를 독립변수(independent variable) 또는 설명변수(explanatory variable)이라 부른다. 반면, 자동차사고 발생건수와 병원의 입원 환자수와 같이 독립변수에 의해 결정되는 변수들을 종속변수(dependent variable) 또는 반응변수(response variable)이라고 부른다. 즉,

  • 설명변수(explanatory variable)=독립변수(independent variable)
  • 반응변수(response variable)=종속변수(dependent variable)

회귀분석을 설명변수와 반응변수에 대하여 정의하자면, 회귀분석은 설명변수와 반응변수 간의 함수관계를 규명하는 통계적 분석방법이다. 참고로 앞으로 회귀모델을 다루는 포스트에서는 위 용어들을 혼재하여 사용할 것이다.


단순회귀모델

모델의 정의

[그림 1] 단순회귀모델의 예시 (빨간색은 regression line을 의미)

[그림 1]과 같이 설명변수 xx와 반응변수 yy의 관계가 직선의 형태를 가지는 경우 우리는 두 변수간의 적합모델을 다음과 같이 쓸 수 있다 [1]. (그림에서 파란색 원이 데이터이다.)

yi=β0+β1xi+ϵi(1)\tag{1} y_i=\beta_0 + \beta_1x_i + \epsilon_i

여기서

  • yiy_i: ii번째 반응변수 값
  • xix_i: ii번째 설명변수 값
  • β0\beta_0: 절편 회귀계수
  • β1\beta_1: 기울기 회귀계수
  • ϵi\epsilon_i: ii번째 측정된 yiy_i의 오차 성분
  • E[ϵi]=0E[\epsilon_i]=0, Var(ϵi)=σ2Var(\epsilon_i)=\sigma^2, E[ϵiϵj]=δijE[\epsilon_i\epsilon_j]=\delta_{ij}

식 (1)과 같은 모델을 단순선형회귀모델(simple linear regression model)이라 부른다. 단순(simple)이라는 말의 의미는 다음과 같다.

  • 모델이 회귀계수(β0,β1\beta_0, \beta_1)에 대하여 선형
  • 모델이 독립변수(xix_i)에 대하여 선형
  • 독립변수가 하나

식 (1)로부터 우리는 단순회귀모델에서 다음과 같은 사실을 알 수 있다.

  • eie_i가 random variable이므로 yiy_i도 random variable
  • 주어진 xx에서의 yy의 기대값은 μYX=E[yi]=β0+β1xi\mu_{YX}=E[y_i]=\beta_0 + \beta_1x_i와 같다. 따라서 yi=μYX+ϵiy_i=\mu_{YX}+\epsilon_i와 같이 나타낼 수 있다.
  • Var(y)=E[yiμYX2]=E[μYX+ϵiμYX2]=σ2Var(y)=E[|y_i-\mu_{YX}|^2]=E[|\mu_{YX}+\epsilon_i-\mu_{YX}|^2]=\sigma^2 (yy의 분산이 xx와 무관)
  • 오차 항들은 서로 독립이라고 가정한다. 따라서 반응변수 yiy_iyjy_j도 서로 독립이다.

회귀선의 추정

NN개의 샘플이 주어졌다고 하자. 우리의 목표는 NN개의 샘플을 이용하여 이를 대표하는 직선의 기울기 β1\beta_1과 절편 β0\beta_0를 추정하는 것이다. 이때 회귀직선은 yy의 추정할 때 발생하는 오차들을 가장 작게 하는 것이 좋을 것이다. 그러나 모든 샘플에 대한 오차를 최소화할 수는 없기 때문에 오차의 크기를 전체적으로 작게하는 방법을 선택하여야 한다. 이를 위해, 식 (1)을 참고하여 오차제곱합(Sum of Squared Error: SSE)를 다음과 같이 나타낼 수 있다.

S=i=1Nyiy^i2=i=1Nyiβ^0β^1xi2(2)\tag{2} \begin{aligned} S &= \sum_{i=1}^{N}\left|y_i- \hat{y}_i\right|^2 \\ &= \sum_{i=1}^{N}\left|y_i- \hat{\beta}_0 - \hat{\beta}_1 x_i\right|^2 \end{aligned}

올바른 회귀직선을 찾는다는 것은 SSE를 최소화한다는 것이므로 아래와 같이 SSE를 β^0\hat{\beta}_0β^1\hat{\beta}_1에 대하여 편미분하고, 0이 되는 값을 찾는다. 먼저 β^0\hat{\beta}_0에 대한 미분을 살펴보자.

dSdβ^0=2i=1N(yiβ^0β^1xi)=0\frac{dS}{d\hat{\beta}_0}=-2\sum_{i=1}^N \left(y_i-\hat{\beta}_0-\hat{\beta}_1x_i\right)=0

따라서

β^0=1Ni=1Nyiβ^1Ni=1Nyi=yˉβ^1xˉ(3)\tag{3} \begin{aligned} \hat{\beta}_0 &= \frac{1}{N}\sum_{i=1}^N y_i - \frac{\hat{\beta}_1}{N}\sum_{i=1}^N y_i\\ &=\bar{y} - \hat{\beta}_1\bar{x} \end{aligned}

위 식으로부터 β^0\hat{\beta}_0 구하기 위해서는 β^1\hat{\beta}_1을 먼저 구해야 함을 알 수 있다. β^1\hat{\beta}_1을 구하기 위해 β^1\hat{\beta}_1에 대한 SSE의 미분 값이 0이 되는 경우를 살펴보자.

dSdβ^1=2i=1N(yiβ^0β^1xi)xi=0(4)\tag{4} \frac{dS}{d\hat{\beta}_1}=-2\sum_{i=1}^N \left(y_i-\hat{\beta}_0-\hat{\beta}_1x_i\right)x_i=0

식 (4)에 식 (3)의 결과를 대입 후 식을 정리하면 다음과 같다.

i=1N(xiyi(yˉβ^1xˉ)xiβ^1xi2)=i=1N(xiyiyˉxi)β^1i=1N(xi2xˉxi)=i=1NxiyiNyˉxˉβ^1(i=1Nxi2Nxˉ2)=0(5)\tag{5} \begin{aligned} \sum_{i=1}^N \left(x_i y_i - (\bar{y} - \hat{\beta}_1\bar{x})x_i - \hat{\beta}_1 x_i^2\right) &= \sum_{i=1}^N \left(x_iy_i-\bar{y}x_i\right) - \hat{\beta}_1\sum_{i=1}^N\left(x_i^2-\bar{x}x_i\right) \\ &= \sum_{i=1}^N x_iy_i - N\bar{y}\bar{x} - \hat{\beta}_1\left(\sum_{i=1}^Nx_i^2 - N\bar{x}^2\right) \\ &=0 \end{aligned}

따라서

β^1=i=1NxiyiNyˉxˉi=1Nxi2Nxˉ2=i=1N(xiyiyˉxi)+i=1N(xˉyˉyixˉ)i=1N(xi2xˉxi)+i=0N(xˉ2xixˉ)=i=1N(xixˉ)(yiyˉ)i=1N(xixˉ)=Cov(x,y)Var(x)(6)\tag{6} \begin{aligned} \hat{\beta}_1 &= \frac{\sum_{i=1}^N x_iy_i - N\bar{y}\bar{x}}{\sum_{i=1}^Nx_i^2 - N\bar{x}^2} \\ &=\frac{\sum_{i=1}^N \left(x_iy_i-\bar{y}x_i\right) + \sum_{i=1}^N\left(\bar{x}\bar{y}-y_i\bar{x}\right)}{\sum_{i=1}^N\left(x_i^2-\bar{x}x_i\right)+\sum_{i=0}^N\left(\bar{x}^2-x_i\bar{x}\right)} \\ &=\frac{\sum_{i=1}^N (x_i-\bar{x})(y_i-\bar{y})}{\sum_{i=1}^N (x_i-\bar{x})} \\ &=\frac{Cov(x,y)}{Var(x)} \end{aligned}

식 (6)의 첫 번째 줄은 식 (5)의 두 번째 줄로부터 유도된 결과이고, 식 (6)의 두 번째 줄은
식 (5)의 첫 번째 줄로부터 유도된 결과이다. 그리고 식 (6)의 두 번째 줄에서 i=1N(xˉyˉyixˉ)\sum_{i=1}^N\left(\bar{x}\bar{y}-y_i\bar{x}\right)i=0N(xˉ2xixˉ)\sum_{i=0}^N\left(\bar{x}^2-x_i\bar{x}\right)는 모두 00으로 수식의 유도를 위해 추가된 dummy 항들이다. 결과적으로 회귀 직선의 기울기 β1\beta_1xxyy의 공분산과 xx의 분산으로부터 추정된다.

식의 표현을 보다 간결하게 하기 위하여 분산과 공분산에 자유도를 곱한 값을 아래와 같이 나타내자.

Sxx=i=1N(xixˉ)2Syy=i=1N(yiyˉ)2Sxy=i=1N(xixˉ)(yiyˉ)(7)\tag{7} \begin{aligned} S_{xx} &= \sum_{i=1}^{N} (x_i-\bar{x})^2 \\ S_{yy} &= \sum_{i=1}^{N} (y_i-\bar{y})^2 \\ S_{xy} &= \sum_{i=1}^{N} (x_i-\bar{x})(y_i-\bar{y}) \end{aligned}

식 (7)을 식 (6)에 대입하면

β^1=SxySxx.(8)\tag{8} \hat{\beta}_1 = \frac{S_{xy}}{S_{xx}}.

식 (3)과 식 (8)과 같이 SSE를 최소화하는 회귀계수를 추정하는 방법을 최소제곱추정(least square estimation, LSE)이라고 부르며, LSE를 통해 얻어진 추정치를 최소제곱 추정량(LS estimate)라고 부른다. 본 절의 결론은 단순회귀모델의 회귀계수는 LSE를 통해 구한다는 것이다.

상관계수는 r=Sxy/(SxxSyy)r=S_{xy}/(\sqrt{S_{xx}}\sqrt{S_{yy}})이다(variance와 covariance 계산시 사용되는 자유도는 나누면 없어진다). 따라서 상관계수 rr을 알면 기울기 추정치 β^1\hat{\beta}_1을 아래와 같이 다시 쓸 수 있다.

β^1=rSyySxx.(9)\tag{9} \hat{\beta}_1 = r\sqrt{\frac{S_{yy}}{S_{xx}}}.

Residual의 성질

Residual은 xix_i에서 측정된 yiy_i와 추정된 y^i\hat{y}_i의 차로 정의된다. 즉,

ei=yiy^i(10)\tag{10} e_i = y_i - \hat{y}_i

와 같이 나타낼 수 있으며, 회귀계수가 LSE를 통해 추정되었다면 다음과 같은 흥미로운 성질이 성립한다.

  • Residual의 합은 0이다. 즉,

    iei=0(11)\tag{11} \sum_i e_i=0
  • Residual의 제곱 합, iei2\sum_ie_i^2,은 항상 최소가 된다. 이는 LSE가 최소화하는 목적함수가 SSE이므로 자명하다.

  • iei=iyiiy^i=0\sum_ie_i=\sum_i y_i - \sum_i \hat{y}_i = 0이므로 관찰값 yiy_i와 추정값 y^i\hat{y}_i의 합은 같다. 즉,

    iyi=iy^i(12)\tag{12} \sum_i y_i = \sum_i \hat{y}_i
  • eie_iy^i\hat{y}_i의 가중합은 항상 0이다. 즉,

    ieiy^i=0(13)\tag{13} \sum_ie_i\hat{y}_i=0
  • 위와 같은 성질을 orthogonal priciple이라 한다. Orthgonal principle의 의미는 [그림 2]와 같다. 우리는 벡터 yiy_i를 추정하고 싶지만 y^i\hat{y}_ixix_i의 선형결합으로 이루어지므로 xix_i가 span하는 공간에만 존재할 수 있다. 그러나 yiy_i는 항상 residual에 의해 xix_i가 span하는 공간 외부에 존재하게 되고, 우리가 할 수 있는 최선의 선택은 y^i\hat{y}_i가 최대한 yiy_i와 비슷해지도록 하는 것이다. 그리고 최대한 비슷해지도록 한다는 것은 [그림 2]와 같이 y^i\hat{y}_i가 존재할 수 있는 공간상에서 yiy_i에 최대한 가까운 y^i\hat{y}_i을 결정하는 것이므로 결국 y^i\hat{y}_ieie_i는 항상 직교하게 된다.

[그림 2] Orthogonal Principle

  • Orthogonal principle에 의해 eie_ixix_i의 가중합도 항상 0이다. 즉,

    iy^iei=i(β^0+β^1xi)ei=β^0iei=0+β^1ixiei=0=0(14)\tag{14} \begin{aligned} \sum_i \hat{y}_i e_i &= \sum_i(\hat{\beta}_0 + \hat{\beta}_1x_i)e_i \\ &= \hat{\beta}_0\underbrace{\sum_i e_i}_{=0} + \hat{\beta}_1\underbrace{\sum_ix_ie_i}_{=0} \\ &=0 \end{aligned}
  • 점 (xˉ,yˉ\bar{x}, \bar{y})는 항상 적합된 회귀직선상에 존재한다.
    - 적합된 회귀모델은 아래의 식 (15)와 같이 나타낼 수 있다. 식 (15)에 xi=xˉx_i=\bar{x}를 대입하면, y^i=yˉ\hat{y}_i =\bar{y}가 된다. 따라서 점 (xˉ,yˉ\bar{x}, \bar{y})는 항상 적합된 회귀직선상에 존재한다.

    y^i=β^0+β^1xi=yˉ+β^1(xixˉ)(15)\tag{15} \begin{aligned} \hat{y}_i &= \hat{\beta}_0 + \hat{\beta}_1x_i \\ &= \bar{y} + \hat{\beta}_1(x_i-\bar{x}) \end{aligned}

파이썬 예제

  • 파이썬에서 선형회귀모델을 실습하기 위해서는 sklearn.linear_model 패키지 아래 LinearRegression 클래스를 사용한다.
  • LinearRegression 클래스를 lr로 객체화하고, fit() 메서드로 β^0\hat{\beta}_0β^1\hat{\beta}_1을 추정한다.
  • 추정된 β^0\hat{\beta}_0β^1\hat{\beta}_1 값은 각각 lr객체의 'coef_'와 'intercept_' 속성에 저장되어 있다.
# generage regression dataset
from sklearn.datasets import make_regression
x, y = make_regression(n_samples=100, n_features=1, n_targets=1, bias=2, noise=10, random_state=42)

# train medel (least sqaure estimation)
from sklearn.linear_model import LinearRegression
lr = LinearRegression()
lr.fit(x, y)

# prediction
x_predict = 1.2
y_predict = lr.predict([[x_predict]])

# plot the result
import matplotlib.pyplot as plt
import numpy as np
plt.scatter(x, y, s=10, marker = 'o', c='blue')
plt.plot([np.min(x), np.max(x)], [np.min(x)*lr.coef_+lr.intercept_, np.max(x)*lr.coef_+lr.intercept_], c='red')
plt.scatter(x_predict, y_predict, marker = 's', c='orange')
plt.xlabel('x')
plt.ylabel('y')
plt.show()

[그림 3] 예제 코드 결과 그림


적합도 평가

앞에서 구한 회귀직선이 관측치들을 얼마나 잘 대표하는지 어떻게 정량적으로 평가할 수 있을까?
이에 대한 내용들을 다음 포스트에서 살펴보자.


참고자료

[1] 김성수, 강명욱, 강위창, "회귀모형," 한국방송통신대학교출판문화원, 2016.
[2] 박해선, 혼자 공부하는 머신러닝+딥러닝, 한빛미디어, 2020.

profile
연구와 개발의 중간 어디쯤

0개의 댓글