- 선형회귀분석 실습
1. 먼저 필요한 모듈을 불러오고 데이터를 만들어줬습니다.
from sklearn import linear_model
from scipy import stats
import numpy as np
import pandas as pd
import matplotlib.pyplot as plt
import matplotlib
%matplotlib inline
matplotlib.style.use('ggplot')
import seaborn as sns
data = {'x': [13, 19, 16, 14, 15, 14],
'y': [40, 83, 62, 48, 58, 43]}
data = pd.DataFrame(data)
data
2. scatter plot을 그려봅니다.
sns.scatterplot(data['x'],data['y'])
plt.show()
데이터가 직선 형태로 보입니다.
3. 두 변수 간에 상관관계가 있는지 상관분석도 해봅니다.
data.corr()
sns.heatmap(data.corr(),annot=True)
상관계수가 0.99로 두 변수는 매우 높은 관계가 있음을 알 수 있습니다.
4. 이제 모델을 만들어 줍니다. 오늘은 sklearn.linear_model.LinearRegrssion()을 써봤습니다. 기초버전(2)에서는 statsmodels의 OLS를 이용해 회귀분석을 진행할 예정입니다.
https://scikit-learn.org/stable/modules/generated/sklearn.linear_model.LinearRegression.html
linear_regression = linear_model.LinearRegression()
linear_regression.fit(X=pd.DataFrame(data["x"]), y= data["y"]) #X는 2차원 배열을 써야함
prediction = linear_regression.predict(X=pd.DataFrame(data["x"]))
LinearRegrssion을 이용하여 모델을 만들어주었습니다. 이때 주의해야할 점은 fitting 할 때 X는 2차원 배열을 사용해야합니다. 다중회귀일 때도 사용해야하니까요.
print("a value: ", linear_regression.intercept_) #추정된 상수항
print("b value: ", linear_regression.coef_) #추정된 가중치 벡터(계수)
a value: -55.48175182481753
b value: [7.32846715]
결과 값을 토대로 회귀식은 y=7.32846715x -55.48175182481753 가 됩니다.
5. 이제 회귀식이 얼마나 적합한지 알기 위해 결정계수와 수정결정계수를 확인해봅니다.
#잔차 확인
residuals = data["y"] - prediction
residuals.describe()
#잔차 제곱 합
SSE = (residuals**2).sum()
SST = ((data["y"]-data["y"].mean())**2).sum()
#결정계수
R_squared = 1-(SSE/SST)
print("R_squared: ", R_squared)
R_squared: 0.9753156179610034
n=len(data)
p = 1
#수정된 결정계수
adj_R_squared = 1-(n-1)/(n-p-1)*(1-R_squared)
print("adj_R_squared: ", adj_R_squared)
adj_R_squared: 0.9691445224512543
두 값 모두 1에 가깝게 나왔네요.
6. 다음은 잔차를 확인해봅니다.
#y축을 기준으로 랜덤하게 산포되어 있음. 즉, 등분산성과 독립성을 만족
sns.residplot(data['x'],data['y'])
y축을 기준으로 랜덤하게 분포되어 있습니다.
#정규분포 직선을 중심으로 분포하므로 정규분포를 따름
obs=(data['y']-prediction).values
z=(obs-obs.mean())/obs.std()
stats.probplot(z,dist="norm",plot=plt)
정규분포 직선을 중심으로 분포되어 있습니다.
7. 최종 회귀 그래프를 그려봅니다.
#회귀 그래프
sns.scatterplot(data['x'],data['y'])
plt.plot(data['x'], prediction, color='blue')
plt.show()
8. 모델 성능도 평가해줍니다.
#성능평가하기
from sklearn.metrics import mean_squared_error
print('score: ', linear_regression.score(X=pd.DataFrame(data["x"]), y=data["y"]))
print('Mean Squared Error: ', mean_squared_error(prediction, data["y"]))
print("RMSE: ", mean_squared_error(prediction, data["y"])**0.5)
score: 0.9753156179610034
Mean Squared Error: 5.172749391727503
RMSE: 2.2743679103714736
참고 : https://can-do.tistory.com/102
https://datascienceschool.net/view-notebook/58269d7f52bd49879965cdc4721da42d/
'나는야 데이터사이언티스트 > Machine Learning' 카테고리의 다른 글
의사결정나무(Decision Tree) 쉽게 이해하기 (1) | 2021.04.15 |
---|---|
[ML]K-NN 알고리즘 실습 - 기초 버전 (0) | 2020.04.22 |
지도학습, 비지도학습, 강화학습 - 머신러닝 개요 (0) | 2020.04.20 |
[ML]선형회귀분석 실습 - 기초버전(2) (0) | 2020.04.14 |