선형회귀분석
목표 : mtcars dataset으로 모델 작성후 변수 간의 상관관계 알아보고,
단순 선형회귀와 다중 선형회귀를 통해 각각의 추정치 얻기
(지도학습, 귀납적추론을 이용)
파일명 : linear_regression6.py
import statsmodels.api
import statsmodels.formula.api as smf
import matplotlib.pyplot as plt
import numpy as np
plt.rc('font', family='malgun gothic') # 한글깨짐 방지
mtcars = statsmodels.api.datasets.get_rdataset('mtcars').data # dataframe 으로 불러오기
print(mtcars)
print(mtcars.describe())
statsmodels.api 를 이용해 mtcars데이터를 dataframe 형태로 불러온다.
print(np.corrcoef(mtcars.hp, mtcars.mpg))
print(mtcars.corr()) # -0.776 : 음의 상관관계가 뚜렷하다
corr() 로 피어슨 상관계수R을 구한다. - 1에 가까울 수록 밀접한관계, 0에 가까울수록 약한 상관관계이다.
np.corrcoef() 로 hp와 mpg 사이의 상관계수만 구할수도 있고, mtcars.corr()로 모든 상관계수를 다 꺼내볼 수도 있다.
결과로 -0.77616837 가 나왔으므로 hp와 mpg는 음의 상관관계가 뚜렷하다.
상관계수R ** 2 = 결정계수R-squared
# 시각화
plt.scatter(mtcars.hp, mtcars.mpg)
plt.xlabel('마력수')
plt.ylabel('연비')
slope, intercept = np.polyfit(mtcars.hp, mtcars.mpg, 1)
plt.plot(mtcars.hp, mtcars.hp * slope + intercept, 'r')
plt.show()
numpy.polyfit 함수는 주어진 데이터에 대해 최소 제곱을 갖는 다항식 피팅 (least squares polynomial fit)을 반환한다.
이 함수를 통해 마력수에 따른 연비를 시각화 해보았다.
print('-----------------단순 선형회귀 mpg ~ hp -----------------')
result = smf.ols('mpg ~ hp', data = mtcars).fit()
print(result.summary()) # .tables[0] 하면 summary중 첫번째 테이블만 보기
# R-squared: 0.602
print(result.conf_int(alpha=0.05)) # 95%신뢰구간(confidence interval) 내 결과
print('마력수 110에 대한 연비 예측 : ', -0.0682 * 110 + 30.0989)
# hp coef * 110 + Intercept coef
ols : 최소승자법 (statsmodels.formula.api)
오차의 제곱의 합이 최소가 되는 가상 이상적인 추세선을 찾는 함수
결정계수 R-squared: 0.602 이므로 60%의 설명력을 가진다고 할 수있다.
( hp coef * 110 )+ Intercept coef 로 마력수 110에 대한 연비 예측해 볼 수 있다. 결과는 22.5969가 나온다.
print('-----------------다중 선형회귀 mpg ~ hp + wt-----------------')
result2 = smf.ols('mpg ~ hp + wt', data = mtcars).fit()
print(result2.summary()) # Adj. R-squared: 0.815
print(result2.conf_int(alpha=0.05)) # 95%신뢰구간
print('마력수 110, 차체무게 5에 대한 연비 예측 : ', (-0.0318 * 110) + (-3.8778 * 5) + 37.2273)
# 14.34
동일한 방식으로 독립변수가 3개인 다중 선형회귀 분석을 진행한다.
독립변수가 2개 이상일때는 Results table에서 수정된 결정계수( Adj. R-squared )를 봐줘야 한다.
( hp coef * 110 ) + ( wt coef * 5 ) + Intercept coef 로 마력수 110, 차체무게 5에 대한 연비 예측해보면 14.34가 나온다.
본격적으로 단순 선형회귀분석 결과를 DataFrame에 담아서 추정치를 구해보자.
print('-------------------추정치 구하기 : 차체무게를 입력해 연비를 추정 ------------------')
result3 = smf.ols('mpg ~ wt', data = mtcars).fit()
print(result3.summary())
print('결정계수 : ', result3.rsquared) # R-squared 0.75 => 설명력이 75%로 우수
pred = result3.predict()
print(pred) #모든 자동차 차체 무게에 대한 연비 추정치 출력
result3.rsquared 로 간단하게 R-squared 를 확인 후 predict()로 모든 자동차 차체 무게에 대한 연비 추정치 출력한다.
print('----------------DataFrame에 실제값과 예측값 담아서 비교---------------')
import pandas as pd
data = {
'mpg': mtcars.mpg, # 실제값
'mpg_pred': pred # 예측값
}
df = pd.DataFrame(data)
print(df)
mpg 에는 실제값을 담고 mpg_pred에는 예측값을 담은 후 전체를 DataFrame에 담는다
print('------------------입력한 차체 무게로 연비 추정하기--------------------')
mtcars.wt = int(input('차체 무게 입력 : ')) # wt 이름 그대로
new_pred = result3.predict(pd.DataFrame(mtcars.wt))
print('무게가 {}일 때 예상연비는 {}이다.'.format(mtcars.wt[0], new_pred[0]))
차체 무게를 입력받아서 predict() 안에 DataFrame 형식으로 다시 담아주면 아래와 같이 나온다.
차체 무게 입력 : 4
무게가 4일 때 예상연비는 15.907239876451332이다.
print('-----------여러개의 차체 무게로 연비 추정하기----------')
new_wt = pd.DataFrame({'wt':[6,3,0.5]})
new_pred2 = result3.predict(new_wt)
print(new_pred2) # list로 보기
print('예상연비 : ',np.round(new_pred2.values,2)) # 반올림해서 보기
dict 타입으로 새로운 무게들을 주고 같은 방식으로 추정치를 구해 볼 수 있다.
0 5.218297
1 21.251711
2 34.612890
dtype: float64
예상연비 : [ 5.22 21.25 34.61]
'Machine Learning' 카테고리의 다른 글
상관 분석 / Correlation Analysis / 피어슨 / 스피어만 / 켄달 상관계수 (0) | 2021.03.30 |
---|---|
머신러닝 / Iris 데이터 분류 / 5가지 모델 작성법 (Logistic Regression/SVM/Random Forest/Naïve Bayes/Tree) (0) | 2021.03.18 |
머신러닝 / Python / Pandas 판다스 / MariaDB 연결 (0) | 2021.03.11 |
머신러닝 / Python / ANOVA(analysis of variance) / 분산분석 (0) | 2021.03.11 |
머신러닝 / 웹크롤링 / 형태소분석 / WordCloud 차트 출력하기 (2) | 2021.03.10 |
댓글