나는야 데이터사이언티스트/Machine Learning

[ML]선형회귀분석 실습 - 기초버전(1)

우주먼지의하루 2020. 4. 13. 03:26
728x90

 

 

- 선형회귀분석 실습

 

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)

상관분석
heat map

상관계수가 0.99로 두 변수는 매우 높은 관계가 있음을 알 수 있습니다.

 

4. 이제 모델을 만들어 줍니다. 오늘은 sklearn.linear_model.LinearRegrssion()을 써봤습니다. 기초버전(2)에서는 statsmodels의 OLS를 이용해 회귀분석을 진행할 예정입니다.

 

https://scikit-learn.org/stable/modules/generated/sklearn.linear_model.LinearRegression.html

 

sklearn.linear_model.LinearRegression — scikit-learn 0.22.2 documentation

 

scikit-learn.org

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/

반응형