선형 회귀(Linear Regression Model)

선형 회귀가 뭐지?

통계학에서, 선형 회귀(線型回歸, 영어: linear regression)는 종속 변수 y와 한 개 이상의 독립 변수 (또는 설명 변수) X와의 선형 상관 관계를 모델링하는 회귀분석 기법이다. 한 개의 설명 변수에 기반한 경우에는 단순 선형 회귀(simple linear regression), 둘 이상의 설명 변수에 기반한 경우에는 다중 선형 회귀라고 한다.

선형 회귀는 선형 예측 함수를 사용해 회귀식을 모델링하며, 알려지지 않은 파라미터는 데이터로부터 추정한다. 이렇게 만들어진 회귀식을 선형 모델이라고 한다.

일반적으로 최소제곱법(least square method)을 사용해 선형 회귀 모델을 세운다. 최소제곱법 외에 다른 기법으로도 선형 회귀 모델을 세울 수 있다. 손실 함수(loss fuction)를 최소화 하는 방식으로 선형 회귀 모델을 세울 수도 있다. 최소제곱법은 선형 회귀 모델 뿐 아니라, 비선형 회귀 모델에도 적용할 수 있다. 최소제곱법과 선형 회귀는 가깝게 연관되어 있지만, 그렇다고 해서 동의어는 아니다.
- 위키백과

선형 회귀란 쉽게 생각하면 어떠한 현상 A와 이와 관련되어 보이는 한 개 이상의 현상 B가 있을 때, B가 변화함에 따라 A가 어떻게 변하는지 도형(직선, 평면 등) 하나를 통해 나타낸 것이다. 여기서 B가 1개라면 단순 선형 회귀(Simple Linear Regression), 2개 이상이면 다중 선형 회귀(Multiple Linear Regression)라고 한다.


선형 회귀에서의 가정(Assumptions of Linear Regression)

선형 회귀가 성립되기 위한 가정에는 다음 4가지가 있다.

  1. 선형성(Linearity) : 독립 변수와 종속 변수의 관계는 선형적이어야 한다. 즉, 그래프로 표현했을 때 끊어지지 않고 쭈욱 이어지는 선으로 표현 가능해야 한다.
  2. 정규성(Normality) : 잔차(종속 변수에 대한 예측 값과 실제 값의 차이)$^*$$^1$가 정규 분포여야 한다.
  3. 등분산성(Homoscedasticity, Constant Variance) : 독립 변수의 모든 값에 대하여 잔차의 분산이 같아야 한다.
  4. 독립성(Independence) : 잔차는 서로 독립적이어야 한다.

단순 선형 회귀(Simple Linear Regression)

위에서 간단하게 언급한 바와 같이 단순 선형 회귀는 독립 변수 1개와 종속 변수 1개의 관계를 직선으로 나타낸 것이다.
이를 통해 독립 변수의 값에 따라 이에 해당하는 종속 변수의 값을 구할 수 있다. 즉, 기존의 데이터를 바탕으로 실제 데이터에는 존재하지 않는 값을 예측할 수 있다.

예를 들면 어느 중학교 학생들의 공부 시간과 시험 성적을 조사한 결과가 아래와 같다고 해보자.

학생 공부 시간 시험 성적
A 3 30
B 5 50
C 2 20
D 6 60
E 4 40

이를 그래프로 나타내면 아래처럼 보일 것이다.

그리고 이 그래프 위의 점들에 최대한 가깝게 지나가는 직선을 그리면 아래와 같다.

실제 데이터에는 공부 시간이 2, 3, 4, 5, 6 뿐이다. 여기서 만약 8시간 공부한 학생의 시험 성적이 궁금하다면 x값(공부 시간)이 8일 때 직선 상의 y값(시험 성적)이 무엇인지 알아보면 된다.

굳이 별도의 계산이나 그래프가 필요할 만한 예시는 아니었지만, 단순 선형 회귀를 통해 예측 값을 얻는 과정이 이와 같다.

그렇다면 실제로 저 직선은 어떻게 구하는 것일까?


최소제곱법(Least Squares Method = Ordinary Least Squares, OLS)

최소제곱법이란 예측 값과 실제 값의 차이인 잔차들의 제곱의 합을 최소화하는 직선을 찾아내는 방법이다. 이 직선을 최소 제곱 직선이라고 한다.

※ 왜 제곱을 하지?

제곱하는 이유는 실제 값이 예측 값보다 클 수도, 작을 수도 있기 때문이다.
제곱을 안 하고서 그냥 합하면 양수와 음수가 서로 상쇄되어 결과가 왜곡될 수 있다(분산 구할 때 제곱해주던 것과 마찬가지).

<예시>
아래와 같이 x와 y가 있다고 해보자.

x y
1 2
2 4
3 5
4 4
5 5
평균 3 평균 4

이를 그래프로 나타내면 아래와 같다.

여기서 직선 $\hat{y} = \beta_0 + \beta_1x$ 가 예측 값을 얻는데 쓰일 최소 제곱 직선(다른 말로는 선형 회귀선)이다.

직선 $\hat{y} = \beta_0 + \beta_1x$는 $x$와 $y$의 관계를 나타낸다($\hat{y}$는 $y$의 예측값(추정치)라는 의미).
$x$와 $y$의 관계를 최대한 잘 나타내려면 각각의 $x$값에 대하여 실제 $y$값에 최대한 가까운 예측 값을 가져야 한다.
즉, 직선 상의 $y$값(= $\hat{y}$, 예측 값)과 점으로 표시된 $y$값(실제 값)의 차이(잔차)를 최소화해야 한다.

그럼 잔차를 최소화하는 직선 $\hat{y} = \beta_0 + \beta_1x$의 기울기와 $y$ 절편을 구해보자.


1) 기울기($\beta_1$) 구하기

직선의 기울기를 구하는 식은 다음과 같다.
$$\beta_1 = \frac{\sum_{i=1}^{n} (x_i - \bar{x})(y_i - \bar{y})} {\sum_{i=1}^{n} (x_i - \bar{x})^2}$$
아래 테이블에 계산되어 있는 값을 식에 그대로 넣으면 $\beta_1 = \frac{6}{10} = 0.6$ 이다.

$x$ $y$ $x - \bar{x}$ $y - \bar{y}$ $(x - \bar{x})^2$ $(x - \bar{x})(y - \bar{y})$
1 2 -2 -2 4 4
2 4 -1 0 1 0
3 5 0 1 0 0
4 4 1 0 1 0
5 5 2 1 4 2
평균 3 평균 4     합계 10 합계 6

2) $y$ 절편($\beta_0$) 구하기

이제 기울기를 알고 있으니 $y$ 절편을 구하는건 간단하다.
직선 $\hat{y} = \beta_0 + 0.6x$에 ($\bar{x}, \bar{y}$)를 넣어주면 된다.
$∴ \beta_0 = \bar{y} - 0.6\bar{x} = 4 - 0.6*3 = 2.2$

※ $\beta_1$을 구하는 식은 왜 저렇게 되고, $\beta_0$는 왜 저렇게 구할까? (참고 자료)
최소제곱법 - 네이버캐스트 수학 산책
최소 제곱법 (Least Square Method = OLS)
#선형회귀 의 기초인 #최소제곱법 ? 공식 유도를 해보자~! (영상)


기준 모델(Baseline Model)

위처럼 예측 값을 잘 뽑아줄 직선을 구했으니 무언가 할 일은 다 한 것 같다.
그러나 사실 그 전에 해야 할 일이 있었으니, 바로 기준 모델을 세우는 것이다.

기준 모델이란 예측 모델(위에서 만든 직선 식)을 구체적으로 만들기 전에 가장 간단하면서도 직관적이면서 최소한의 성능을 나타내는 기준이 되는 모델이다.
쉽게 말하면 예측 모델을 뚝딱 만들고 봤을 때 최소한 이 기준 모델이라는 친구보다는 일을 잘 해야 한다는 것이다.

기준 모델은 문제의 유형에 따라 보통 다음과 같이 설정한다.

  • 분류 문제: 타겟의 최빈 클래스
  • 회귀 문제: 타겟의 평균값 -> 평균 절대 오차(MAE, Mean Absolute Error)로 평가
  • 시계열 회귀 문제: 이전 타임 스탬프의 값

 


scikit-learn 활용하여 단순 선형 회귀 모델 만들기

  1. 데이터 불러오기
# 예시 데이터 불러오기 (House Sales in King County, USA)
import pandas as pd
df = pd.read_csv('https://ds-lecture-data.s3.ap-northeast-2.amazonaws.com/kc_house_data/kc_house_data.csv')

  1. 타겟과 이와 관련된 특성 찾아서 정하기
# 여기서는 타겟(price)과 가장 상관 관계가 높은 특성을 찾겠습니다
df.corr().price.sort_values(ascending=False)

price 1.000000
sqft_living 0.702035
grade 0.667434
sqft_above 0.605567
sqft_living15 0.585379
bathrooms 0.525138
view 0.397293
sqft_basement 0.323816
bedrooms 0.308350
lat 0.307003
waterfront 0.266369
floors 0.256794
yr_renovated 0.126434
sqft_lot 0.089661
sqft_lot15 0.082447
yr_built 0.054012
condition 0.036362
long 0.021626
id -0.016762
zipcode -0.053203
Name: price, dtype: float64

∴ 타겟과 상관 관계가 가장 높은 특성의 이름 : sqft_living


  1. 기준 모델 만들기 및 평가
predict = df.price.mean() # 기준 모델 : 타겟(price)의 평균값
print(int(predict))

sns.scatterplot(x=df.sqft_living, y=df.price)
sns.lineplot(x=df.sqft_living, y=predict, color='red'); # 기준 모델 시각화

 

# 평균값으로 예측할 때 샘플 별 평균값과의 차이(error)를 저장
errors = predict - df.price
errors

0 318188.141767
1 2088.141767
2 360088.141767
3 -63911.858233
4 30088.141767
...
21608 180088.141767
21609 140088.141767
21610 137987.141767
21611 140088.141767
21612 215088.141767
Name: price, Length: 21613, dtype: float64

# mean_absolute_error(MAE), error에 절대값을 취한 후 평균을 계산
mean_absolute_error = errors.abs().mean()
print(f'예측한 주택 가격이 ${predict:,.0f}이며 절대 평균 에러가 ${mean_absolute_error:,.0f}임을 확인할 수 있습니다.')

예측한 주택 가격이 $540,088이며 절대 평균 에러가 $233,942임을 확인할 수 있습니다.


  1. 예측 모델(선형 회귀 모델) 만들기
from sklearn.linear_model import LinearRegression

model = LinearRegression()
feature = ['sqft_living']
target = ['price']
X_train = df[feature]
y_train = df[target]
model.fit(X_train, y_train)

LinearRegression(copy_X=True, fit_intercept=True, n_jobs=None, normalize=False)

# 예측을 잘 하는지 값 하나 던져서 테스트 해보기
X_test = [[15000]]
y_pred = model.predict(X_test)

print(f'{X_test[0][0]} sqft GrLivArea를 가지는 주택의 예상 가격은 ${round(float(y_pred))} 입니다.')

15000 sqft GrLivArea를 가지는 주택의 예상 가격은 $4165773 입니다.


  1. 예측 값과 실제 값을 그래프로 표현
X_test  =  [[x]  for  x  in  df['sqft_living']]  
y_pred  =  model.predict(X_test)

y_pred

array([[287555.06702451],
[677621.82640197],
[172499.40418656],
...,
[242655.29616092],
[405416.96554144],
[242655.29616092]])

plt.scatter(X_train, y_train, color='black', linewidth=1)
plt.scatter(X_test, y_pred, color='blue', linewidth=1);

 


  1. 예측 모델의 회귀 계수(직선의 기울기)와 y 절편 확인
print(model.coef_) # 회귀 계수
print(model.intercept_) # y 절편

[[280.6235679]]
[-43580.74309447]

$*1$ 오차(error)와 잔차(residual)의 차이가 뭐지?
오차 : 모집단이 기준
잔차 : 표본 집단이 기준
실제 데이터를 토대로 선형 회귀 등의 방식으로 회귀식을 구하면 예측 값을 얻을 수 있다. 여기서 실제 데이터가 모집단인지, 표본 집단인지에 따라 실제 값과 예측 값의 차이를 각각 오차와 잔차라고 한다.

 

<참고 자료>

● 선형 회귀

● 선형 회귀에서의 가정

● 최소제곱법

● 기준 모델

● 오차와 잔차

● 시각화

+ Recent posts