파이썬) 단순선형회귀 그래프 그리기 (+추세선, 회귀식 구하기 with polyfit, poly1d, ols)
#1. 단순선형회귀 그래프는 무엇인가?
단순선형회귀 그래프는 독립변수 1개, 종속변수 1개를 가진 데이터를 시각화한 그래프이다. 먼저, 독립변수의 값과 종속변수 값을 각각 x, y로 두고 전체 데이터의 (x, y) 좌표들을 만들어서 좌표 평면 상에 그 점들을 찍으면 그것은 산점도라고 한다. 그리고 해당 점들이 회귀하는 것으로 보이는(모이는 것으로 보이는) 직선을 찾아내어 그은 선을 회귀선이라고 한다. 단순선형회귀 그래프는 일반적으로 이 두 가지를 동시에 시각화하여 나타낸다.
#2. 단순선형회귀 그래프 그리기
1) 단순선형회귀 그래프를 그리기 위해 필요한 패키지들을 설치하고 필요한 함수들을 불러온다.
회귀선(추세선)을 그리기 위해 추세식을 계산하는 함수 polyfit, poly1d를 사용하기 위해 numpy를 호출하고, 그래프 작업을 위해 matplotlib와 seaborn을 불러온다. 마지막으로 numpy의 polyfit, poly1d로 만든 추세식과 비교하기 위해 statsmodels의 ols를 불러와서 회귀분석 결과를 출력해 볼 것이다. 전체 코드는 아래와 같다.
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
|
import numpy as np
from matplotlib import pyplot as plt
import seaborn as sns
from statsmodels.formula.api import ols
#pyplot과 seaborn으로 회귀그래프
plt.rcParams["figure.figsize"] = (12, 6)
sns.regplot(x='speed', y='dist', data=df)
plt.xlim(df['speed'].min()-1, df['speed'].max()+1)
plt.grid()
plt.show()
z=np.polyfit(df['speed'], df['dist'], 1) # 기울기와 절편 확인
f=np.poly1d(z) # f(x): f함수에 x값을 넣으면 y값을 계산해 줌
print(z[0], z[1])
print(f(1))
#statsmodel을 통해 회귀식의 회귀계수(기울기, 절편) 확인
ols('dist ~ speed', data=df).fit().summary()
|
cs |
2) matplotlib과 seaborn으로 단순선형회귀 그래프를 그린다.
rcParams로 그래프 크기 옵션을 정해주고나서 sns.regplot(x='독립변수열이름', y='종속변수열이름', data=데이터프레임객체)를 실행하면 아래와 같이 단선순형회귀 그래프를 손쉽게 그릴 수 있다. 여기서 사용한 데이터프레임 객체는 df인데 자동차의 속도(speed)와 그에 따른 제동거리(dist)의 값을 가지고 있는 데이터셋을 사용했다.
3) numpy의 polyfit과 poly1d로 회귀식을 계산한다.
단순선형회귀모델이라고도 할 수 있는 회귀식을 계산하기 위해서 numpy를 사용했다. np.polyfit(독립변수열, 종속변수열, 1)을 실행하면 2개의 값을 반환하는데 첫번째 값이 해당 회귀식의 기울기이고, 두번째 값이 절편이다. 일차 방정식처럼 y = 3.9324...* x -17.579... 식으로 정리하고 x값에 speed값을 넣어서 계산하면 y값 dist를 예측할 수 있다.
np.poly1d의 경우 앞에서 구한 polyfit의 결과값의 객체 z를 입력해서 함수 f로 만들 수 있다. f(x)의 형식으로 사용할 수 있는데 이 x에 값을 넣으면 y가 계산되어 나오는 식이다. 아래 f(1)을 계산하면 -13.646686..이 나오는데 이는 위의 방정식 X에 1을 대입하여 구한 값과 같다.
4) statsmodel의 회귀분석 결과와 numpy의 회귀분석 모델링을 비교해 본다.
statsmodel의 ols함수를 사용하면 한번에 회귀분석 결과를 요약하여 보여준다. ols('종속변수명 ~ 독립변수명', data=데이터프레임객체).fit().summary()를 실행하면 된다. 아래 표에서 두번째 블럭의 coef 값들을 보면 되는데 Intercept coef가 y절편이고 Speed coef가 독립변수 Speed의 기울기를 의미한다. 앞서 만든 회귀식의 회귀계수들과 비교하면 동일한 것을 확인할 수 있다.
상기 표에 대한 상세한 해석은 별도 포스팅을 통해 기록한 바 있다. (https://lovelydiary.tistory.com/348)
5) 단순선형회귀 그래프에 회귀식 출력을 추가하였다.
마지막으로 단순선형회귀 그래프에 회귀식을 출력해서 완성도를 좀 더 높여보았다. 추가해야 하는 코드는 아래에 블록을 잡아 놓았다.
#3. 결과해석하기
위에서 출력된 단순선형회귀 그래프의 형태를 살펴 보면 점들과 이들의 추세를 직선으로 나타낸 회귀선을 보면 우상향 하는 경향을 보이고 있는 것을 알 수 있다. 따라서 speed와 dist 두 변수는 양의 인과관계가 있음을 확인할 수 있다.