본문 바로가기

Theory/Statistics

Regression - 다중 선형 회귀 in Python

반응형

이번 포스트에서는 지난 포스트에서 다룬 다중 선형 회귀 모델을 파이썬으로 실험해보려 합니다. 지난번 보스톤 주택 가격 데이터로부터 $X, y$를 설정하고 훈련/테스트 데이터를 sklearn.model_selection 모듈의 train_test_split 함수를 통해 구성합니다.

import pandas as pd

df = pd.read_csv('/content/drive/MyDrive/Posco/Regression/Data/housing_data.txt', sep='\s+')

df.columns = ['CRIM', 'ZN', 'INDUS', 'CHAS', 
              'NOX', 'RM', 'AGE', 'DIS', 'RAD', 
              'TAX', 'PTRATIO', 'B', 'LSTAT', 'MEDV']
df.head()

# 속성(변수) 선택
X=df.iloc[:, :-1].values  
y=df['MEDV'].values   

# train data 와 test data로 구분(7:3 비율)
from sklearn.model_selection import train_test_split
X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.3, random_state=10) 

이후에 sklearn.linear_model 모듈의 LinearRegression 함수로 다중 선형 회귀 분석을 수행합니다. 먼저 모델 객체를 생성하고 fit 함수로 계수를 추정한 이후 score로 $R^2$ 계수를 얻을 수 있습니다.

from sklearn.linear_model import LinearRegression

# 단순회귀분석 모형 객체 생성
lr = LinearRegression()   

# train data를 가지고 모형 학습
lr.fit(X_train, y_train)

# 학습을 마친 모형에 test data를 적용하여 결정계수(R-제곱) 계산
r_square = lr.score(X_test, y_test)
print('R-square: ', r_square)
print('\n')

# 회귀식의 기울기
print('X 변수의 기울기: ', lr.coef_)
print('\n')

# 회귀식의 y절편
print('절편: ', lr.intercept_)
print('\n')

최종적으로 훈련한 모델을 통해 테스트 데이터에 대해 예측을 수행할 수 있습니다.

y_hat = lr.predict(X_test)

plt.figure(figsize=(10, 5))

plt.plot(y_test, label='y_test')
plt.plot(y_hat, label='y_hat')
plt.legend(loc='upper center')
plt.show()

 

Statsmodels

scikit-learn 패키지 이외에도 다양한 통계 함수를 지원하는 statsmodels 패키지를 통해서도 다중 선형 회귀를 수행할 수 있습니다. statsmodels.formula.api 모듈의 ols 함수에서 ols(formula='종속변수 ~ 독립변수 + 독립변수, data=데이터프레임).fit() 을 호출해서 다중 선형 회귀를 수행합니다. 

이번에는 학생의 점수를 예측하는 다음의 데이터를 통해 수행할 것이며 지난 포스트에서 살펴봤던 F-통계량, 회귀계수에 대한 t-검정 통계량 등을 확인할 수 있습니다.

score.csv
0.00MB

import pandas as pd
import statsmodels.formula.api as sm
df = pd.read_csv("/content/drive/MyDrive/Posco/Regression/Data/score.csv", encoding="ms949")

result = sm.ols(formula = 'score ~ iq + academy + game + tv', data = df).fit()

print('절편과 기울기')
print(result.params)
print()
print('유의확률:' , result.pvalues)
print()

print('결정계수:' , result.rsquared)

print('각 학생의 예측 점수:', result.predict())

result.summary() 함수를 호출해서 전체 결과를 빠르게 확인할 수 있습니다.

반응형