본문 바로가기
Machine Learning

머신러닝 / 선형회귀분석 / 모델 작성후 추정치 얻기

by with chu 2021. 3. 11.
728x90

선형회귀분석

목표 : 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)
오차의 제곱의 합이 최소가 되는 가상 이상적인 추세선을 찾는 함수

 

result.summary() 콘솔창 결과

결정계수 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 )를 봐줘야 한다.

result.summary() 콘솔창 결과

( 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]

 

 

728x90

댓글