Channi Studies

Linear Regression (선형 회귀) - 2 | Simple Linear Regression (단순 선형 회귀) 본문

Data Science/Python

Linear Regression (선형 회귀) - 2 | Simple Linear Regression (단순 선형 회귀)

Chan Lee 2024. 6. 2. 15:34

저번 포스트에서는 선형 회귀에서 주로 사용되는 패키지들에 대해서 간략하게 알아보았습니다.

 

Linear Regression (선형 회귀) - 1 | 패키지 알아보기

이번 포스트에서는 파이썬을 사용해서 기초적 선형 회귀 모델을 만들어 보겠습니다.선형 회귀의 기초적 개념에 대해서는 다음 포스트에 정리되어 있습니다. Regression Analysis - Linear Regression | 회

code-studies.tistory.com

 

이번 포스트에서는 우선 간단한 단순 선형 회귀 모델을 디자인 해 보도록 하겠습니다.

 

 

우선, 이번 포스트에서 필요한 패키지들을 import 하겠습니다.

import pandas as pd
import numpy as np
import matplotlib.pyplot as plt
import statsmodels.api as sm

pandas, numpy, matplotlib은 매우 흔하게 사용되고, numpys는 이번 포스트에서 필요가 없을 수도 있지만 우선 추가해두겠습니다.

그리고 회귀 모델을 실행할 때 사용할 statsmodels.api 라이브러리도 추가하겠습니다.

 

그리고, 분석 데이터로 활용할 csv 파일입니다.

이 데이터는 미국의 수능 SAT의 성적과, 대학교 졸업 시의 학점 GPA 정보를 담고 있습니다.

Simple_Linear_Regression.csv
0.00MB

 

위 파일을 python 또는 ipynb 파일과 동일한 폴더에 위치해주시고, 

pandas를 활용하여 다음과 같은 코드로 읽어줍니다.

data = pd.read_csv('Simple_Linear_Regression.csv')

 

pd.read_csv([file name])으로 csv 파일을 읽으면,

pandas는 자동으로 이를 다루기 쉬운 형태로 formatting 해줍니다.

출력해서 확인해보면 다음과 같이 보입니다.

data 출력 결과

 

 

한번 이 데이터에 대한 정보를 알아볼까요?

data.describe()

 

출력 결과

우리가 pandas로 포멧팅한 data에 describe 메소드를 활용하면,

데이터의 수, 평균, 표준편차, 최솟값, Q1, Q2 (median), Q3, 최대값을 차례로 보여줍니다.

처음 데이터를 이해할 때 도움이 되겠네요

 

총 84개의 점수가 존재하고, 평균을 비롯한 여러 샘플 데이터의 값들을 알 수 있습니다.

 

 

이제 우리는 위 데이터를 활용해서 우리의 첫 회귀 모델을 디자인할 것 입니다.

우리의 모델에서는 수능 성적, SAT Score를 기반으로 대학교 졸업시의 학점, GPA를 예측할 것 입니다.

 

수능 성적과 GPA에는 인과관계가 존재할 확률이 높겠죠?

이러한 부분 역시 회귀 모델을 디자인할 때 매우 중요합니다.

당연하지만, 말이 되지 않는 회귀 모델을 의미가 없습니다.

 

초등학교 1학년때 받아쓰기 점수로 대학교 졸업시의 학점을 예측하는 것은 조금 말이 되지 않을 확률이 높습니다.

하지만, 수능 성적과 대학 성적 사이에는 인과관계가 있는게 좀 더 말이 되겠죠?

이러한 점을 잘 고려해서 모델을 디자인하도록 해봅시다.

 

 

기존의 포스트에서 설명했듯, 단순 선형 회귀의 공식은 다음과 같습니다.

ŷ = b0 + b1*x1

우리의 모델에서는 SAT로 GPA를 예측하므로, 우선 예측값 y와 독립 변수 x에 대한 변수들을 선언하겠습니다.

y = data['GPA']
x1 = data['SAT']

 

이로써 우리는 data에서 'GPA'를 열로 가지는 값들을 y에, 'SAT'를 열로 가지는 값들을 x에 저장했습니다.

이를 matplotlib으로 한번 한번 확인해볼까요?

plt.scatter(x1, y)
plt.xlabel("SAT", fontsize=20)
plt.ylabel("GPA", fontsize=20)
plt.show()

 

x 축에 SAT, y 축에 GPA를 나타내어 각 데이터들이 아주 잘 scatter plot으로 시각화 되었습니다.

우리는 얼추 이 값들이 우상향하는 직선의 경향성을 보인다는 점을 인지할 수 있습니다.

그렇다면, 해당 그래프의 시작 상수, b0 값은 무엇일까요?

 

x = sm.add_constant(x1)
results = sm.OLS(y, x).fit()
results.summary()

statsmodels 패키지에서는 add_constant() 함수를 통해서 상수 b0의 값을 근사합니다.

sm.OLS(y, x)를 통해서, 우리는 results에 Orindary Least Squares Regression, 즉 최소 제곱법 회귀의 결과를 저장합니다.

해당 값에 .fit() 메소드를 적용하면 특정한 근사 테크닉 (우리의 경우 OLS)을 활용하여 우리의 데이터에 맞는 모델을 얻습니다.

최소 제곱법에 대해서는 나중에 더 자세히 살피기로 하고, 우선 그런게 있구나 라고만 이해하면 좋겠습니다.

 

이어서 results.summary()는 결과를 요약하는 3개의 표를 출력합니다.

자세한건 나중에 더 알아보도록 하고, 이번에는 const, SAT와 coef 이 만나는 지점의 값만 알아보겠습니다.

우리가 찾던 상수 b0은 const와 coef이 만나는 지점의 값인 0.2750이 되겠고, 

x1에 곱해지는 계수인 b1은 그 밑의 0.0017이 되겠습니다.

 

그렇다면 식이 대충 ŷ = 0.275 + 0.0017x1 이 되겠네요.

한번 matplotlib으로 확인해볼까요?

 

 

plt.scatter(x1, y)
yhat = 0.0017*x1 + 0.275
fig = plt.plot(x1, yhat, lw=2, c='orange', label='regression line')
plt.xlabel('SAT', fontsize=20)
plt.ylabel('GPA', fontsize=20)
plt.show()

 

 

어떤가요?

우리의 첫 선형 회귀 모델은 주어진 샘플 데이터를 기반으로 나름 정확하게 SAT 성적 대비 GPA 성적을 예측하는 것 같습니다.

그래프에서의 노란 선, 회귀선은 각 데이터에 대해서 평균적인 거리가 가장 짧은 직선입니다.

다시 말하자면, 모든 관측된 값들에 대해서 가장 짧은 거리를 가지는 선 입니다.

 

다음 포스트에서는 sm.OLS().fit()으로 피팅된 모델에 대해서 

results.summary()를 사용했을 때 나오는 3개의 표에 대해서 더 자세히 알아보겠습니다.