Linear Regression - 선형 회귀분석 완전 정복 - 1부. 기초편

서론

Linear Regression - 선형 회귀 분석 (이하 LR)은 그야말로 통계와 머신러닝의 기본이라고 할 수 있다. 수많은 사람들이 머신러닝 입문시에 배우고 있으며, 숙달된 개발자나 통계학자도 지속적으로 쓸 정도로 잘 정립된 분야라고 할 수 있다.


하지만 LR을 손으로 계산하라고 하면 난색을 표하는 사람들이 필자를 포함해서 많이 있을 것이다. 이번 시리즈는 그야말로 LR의 완전 정복을 지향하는 시리즈로, 대략적인 컨셉부터 수학적인 증명까지, Linear Regression을 완벽하게 파헤쳐 보도록 한다.


이번 시리즈에서 사용될 데이터는 표준편차 포스팅에서도 사용 됬던 인체의 황금비 데이터셋을 활용한다. 해당 포스팅 또는 아래에서 바로 다운 받을 수 있다. 

GoldenRatio.csv


사람 키를 발바닥에서 정수리까지 잰 길이는 두 팔을 가로 벌린 너비와 같기 때문이다 - 레오나르도 다빈치



Linear? Regression?

먼저 선형 회귀 분석의 의의와 목적에 대해 살펴보자. 이름에서 풍기듯이, LR은 말그대로 을 사용해 데이터를 분석 하는 것이다.
아래는 우선 데이터 포인트들을 어떠한 분석 없이 그냥 그려본 것이다.

오른쪽 위로 증가하는 트렌드를 눈치 챘는가?

해당 데이터는, 사람의 지극 (Armspan)[각주:1]와 키를 측정한 것으로, 해당 데이터에 LR을 적용 한다는 것은, 데이터의 X와 Y간에는 선형 적인 상관관계[각주:2]가 존재한다고 가정하고, 수치적으로 어떻게 나타낼 수 있는지를 계산한다고 할 수 있다. 

빨간색, 초록색, 노란색 점선 모두 데이터를 어느 정도 잘 표현한다고 할 수 있다. 근데 어떤게 제일 잘 표현 하는 것일까? 제일이라는 기준은 어떻게 정하는 것일까? 모두 LR을 통해서 구할 수 있다.


수학적 접근

자, 우리는 여태 이라는 것에 집중을 해왔다. 선은 우리가 중학교 1학년때 배운 1차 함수로 다시 표현될 수 있다. 위의 데이터를 완벽하게 설명할 수 있는 미지의 선이 있다고 해보자.
$$ y_i = \alpha + \beta x_i$$


우리 데이터에서 x는 ArmSpan이고 y는 Height라고 할 수 있고, α는 선의 절편 (intercept), β는 선의 기울기 (slope)를 의미 한다. 화자에 따라 절편과 기울기를 다른 기호로 표현하는 사람도 있으니 취향의 차이라고 할 수 있다. 하지만 사람은 로봇이 아니므로 당연히 개개인별로 오차 (ε, error)가 존재하므로, 이것을 식에 반영하면:

$$ y_i = \alpha + \beta x_i + \varepsilon_i$$

으로 나타낼 수 있다. 


물론 이건 미지의 선이므로 α와 β의 참값을 알 수는 없다. 다만 예측만 할 수 있을뿐. 먼저 예측식을 써보도록 하자:

$$\hat{y}_i = a+bx_i$$


어떤것이 좋을까?

위 예측식의 a와 b를 구하는 것이 LR의 최종 목표라고 할 수 있다. 위에서도 말 했듯이 제일 잘 표현하는 a와 b를 구해야 하는데, 기준이 되는 방식은 여러개가 있지만, 대다수의 상황에서 쓰이는 Ordinary Least Square (이하 OLS)를 사용하도록 한다. 물론, 머신러닝에서는 Gradient Descent 나 그 발전형인 Stochastic Gradient Descent를 쓰는 상황도 많지만 가장 기초적인 것은 역시 OLS라고 할 수 있다.


그렇다면 OLS란 무엇인가? 간단하다. 실제로 존재하는 값 Y와, 우리의 예측값 Ŷ의 차이를 제곱한 값을 최소화 하면 된다. 다르게 말하자면, Y와 Ŷ의 차이, 즉 예측에서 발생한 에러들의 제곱의 합이 가장 적을때 제일 잘 표현한 예측 식이라고 부를 수 있다.

$$min\sum{(y_i - \hat{y}_i)^2}$$

이 식을 우리가 여태 정의 했던 식들로 치환하면 드디어 LR의 첫 시작점에 오게 된다!

$$ \begin{align}Find\ min\ Q(a,b),\ where\ Q(a,b)&=\sum{(y_i-\hat{y}_i)^2}\\&=\sum{(y_i-a-bx_i)^2}\end{align} $$

어떻게 해야 하나? (optional)

만약 본인이 수학을 봤을 때 현기증이나 구토가 나온다면 지극히 정상이므로 바로 다음 장으로 넘어가도 좋다. 

$$\begin{align}Q(a,b)&=\sum{(y_i-a-bx_i)^2}\\&=\Sigma{y^2}-2a\Sigma{y}-2b\Sigma{xy}+na^2+2ab\Sigma{x}+b^2\Sigma{x^2}\\\end{align}\\$$

아까도 말 했듯이 위의 2차 방정식 Q(a,b)를 최소화 하는게 우리의 목표라고 할 수 있다. 아마 이번 포스팅에서 가장 고난이도(?)의 풀이가 될 듯 한데, partial derivatives (편미분)이 필요하기 때문이다.


우선 수학적인 정리를 하고 시작해보자.


2차 방정식 Q(a,b)의 두 편미분이 모두 0일때 이 지점 (또는 우리의 경우 변수가 2개이므로 접면)을 stationary point (정류점)이라고 한다. 변수가 2개 있는 2차 방정식에서는 stationary point에서 maximum (최대값)과 minimum (최소값) 외에 saddle point (안장점)[각주:3]이 발생할 수 있으므로, 2차 편미분 또한 살펴봐야 한다.


그럼 위의 Q(a,b)의 편미분과 2차 편미분을 먼저 계산하고 시작하자.

$$\frac{\partial}{\partial a}Q(a,b)=-2\Sigma{y}+2na+2b\Sigma{x}\\\frac{\partial}{\partial b}Q(a,b)=-2\Sigma{xy}+2a\Sigma{x}+2b\Sigma{x^2}\\\frac{\partial^2}{\partial^2a}Q(a,b)=2n\\\frac{\partial^2}{\partial^2b}Q(a,b)=2\Sigma{x^2}$$


두 1차 편미분의 값이 모두 0이 되어야 우리가 원하는 stationary point가 0이 되는 좌표값 (â, )을 계산한다고 할 때, 우선 a는:

$$-2\Sigma{y}+2n\hat{a}+2\hat{b}\Sigma{x}=0$$

이므로,

$$\begin{align}&\rightarrow 2n\hat{a}=2\Sigma{y}-2\hat{b}\Sigma{x}\\&\rightarrow \hat{a}=\frac{\Sigma{y}}{n}-\hat{b}\frac{\Sigma{x}}{n}\\&Since\ \frac{\Sigma{y}}{n}=\bar{y}\ and\ \frac{\Sigma{x}}{n}=\bar{x},\\&\rightarrow \hat{a}=\bar{y}-\hat{b}\bar{x}\end{align}\\$$

라고 나타낼 수 있으며, b는:

$$-2\Sigma{xy}+2\hat{a}\Sigma{x}+2\hat{b}\Sigma{x^2}=0$$

이므로,

$$\begin{align}&\rightarrow 2\hat{b}\Sigma{x^2}=2\Sigma{xy}-2\hat{a}\Sigma{x}\\\end{align}$$

가 되며, 위 식에 종전에 구한 â를 대입하면,

$$\begin{align}&\rightarrow 2\hat{b}\Sigma{x^2}=2\Sigma{xy}-2(\frac{\Sigma{y}}{n}-\hat{b}\frac{\Sigma{x}}{n})\Sigma{x}\\&\rightarrow \hat{b}\Sigma{x^2}=\Sigma{xy}-\frac{\Sigma{x}\Sigma{y}}{n}+\hat{b}\frac{(\Sigma{x})^2}{n}\\&\rightarrow \hat{b}(\Sigma{x^2}-\frac{(\Sigma{x})^2}{n})=\Sigma{xy}-\frac{\Sigma{x}\Sigma{y}}{n}\\\end{align}$$

가 최종적으로 나오고, 모종의(?) 공식을 대입하게 되면!

$$\begin{align}&\rightarrow \hat{b}=\frac{\sum{(x_i-\bar{x})(y_i-\bar{y})}}{\sum(x_i-\bar{x})^2}\end{align}$$

짜잔! 썩 보기 편한 값들은 아니다.

가 된다고 할 수 있다. 이 식은 한번 더 간단하게 쓸 수 있는데,

$$\begin{align}&\rightarrow\hat{b}=\frac{Cov(x,y)}{Var(x)}\\&\rightarrow\hat{b}=r_{xy}\frac{s_y}{s_x}\end{align}$$

이렇게 길고 긴 의 값까지 모두 정리를 완료 했다.


공식은 어떻게 구했는데...

이제 우리 손에 â와 의 공식이 모두 있으므로 아래에 깔끔하게(?) 정리된 공식란에 대입만 하면 그토록 원하던 LR의 수식을 완성하게 된다.
$$\hat{a}=\bar{y}-\hat{b}\bar{x},\ \hat{b}=\frac{\sum{(x_i-\bar{x})(y_i-\bar{y})}}{\sum(x_i-\bar{x})^2}$$


물론 우리는 개발자니까 저걸 손으로 직접 하지말고, 간단하게 함수로 완성 시키자.

import numpy as np
def find_b(x,y):
    mean_x = np.mean(x)
    mean_y = np.mean(y)
    return np.dot((x-mean_x),(y-mean_y))/np.dot((x-mean_x),(x-mean_x))





  1. 서 있는 상태에서 양손을 펼쳤을 때 한쪽 손 끝에서 다른쪽 끝까지의 길이 [본문으로]
  2. 수학적으로 y = ax+b, 즉 직선으로 나타낼 수 있다는 가정 [본문으로]
  3. 극댓값도 극솟값도 아닌 경우가 있는데, 이때 이 임계점을 안장점이라고 한다. [본문으로]