다중선형회귀(Multiple Linear Regression)는 여러 독립 변수들을 사용하여 종속 변수의 값을 예측하는 통계 기법인데요. 단순 선형회귀는 하나의 독립 변수 (X)를 사용하여 종속 변수(Y)를 예측한다면 다중 선형회귀는 여러 독립변수(X1,X2,…,XnX_1, X_2, …., X_nX1,X2,…,Xn)를 사용하여 종속 변수(Y)를 예측합니다.
실제 사례로는 주택 가격 예측, 학생 성적 예측등 가격이나 성적에 미칠 수 있는 여러 변수들을 통해서 다중선형회귀 분석을 실시할 수 있습니다.
다중회귀분석의 기본 개념 이해
- 회귀분석: 회귀분석은 독립 변수와 종속 변수 사이의 관계를 모델링하는 통계적 기법입니다.
- 다중회귀분석: 다중회귀분석은 두 개 이상의 독립 변수를 사용하여 종속 변수를 예측하는 회귀분석의 한 유형입니다.
- 선형 회귀: 선형 회귀는 독립 변수와 종속 변수 간의 관계가 선형적이라고 가정합니다.
- 계수: 각 독립 변수에 대한 계수는 해당 변수가 종속 변수에 미치는 영향의 정도를 나타냅니다.
- 절편: 절편은 모든 독립 변수가 0일 때 종속 변수의 값을 나타냅니다.
- R-제곱: R-제곱은 모델이 데이터를 얼마나 잘 설명하는지를 나타내는 지표입니다. 1에 가까울수록 모델의 설명력이 높습니다.
- p-값: p-값은 각 계수가 0이 아닐 확률을 나타냅니다. 0.05 미만의 p-값은 계수가 통계적으로 유의미하다는 것을 의미합니다.
다중회귀분석을 어렵게 만드는 장애물
- 다중 공선성 (Multicollinearity): 변수들이 서로 너무 친해져서 문제 발생!
마치 너무 친한 친구들이 서로 비슷한 옷을 입어 누가 누군지 구분하기 어려운 것처럼, 다중 회귀 분석에서 독립 변수들이 서로 강한 상관관계를 가질 때 문제가 발생합니다. 즉, 변수들이 서로 너무 비슷해서 어떤 변수가 종속 변수에 영향을 미치는지 구분하기 어려워지는 것입니다.
문제점: 모델의 계수가 불안정해지고, 해석이 어려워집니다.
해결책:
변수 제거: 상관관계가 높은 변수 중 하나를 제거합니다.
주성분 분석 (PCA): 변수들을 덜 상관된 새로운 변수로 변환합니다.
정규화 (Regularization): 모델의 계수를 제한하여 과적합을 방지합니다. - 과적합 (Overfitting): 너무 잘 맞춰서 일반화가 안 돼!
모델이 훈련 데이터에 너무 잘 맞아서 새로운 데이터에 대한 예측 성능이 떨어지는 현상을 과적합이라고 합니다. 마치 시험 문제를 암기만 한 학생이 실제 시험에서는 문제 유형이 바뀌어 풀지 못하는 것과 같습니다.
문제점: 새로운 데이터에 대한 예측 성능이 떨어집니다.
해결책:
데이터셋 분할: 훈련 데이터와 테스트 데이터로 분할하여 모델의 일반화 성능을 평가합니다.
교차 검증 (Cross-validation): 여러 개의 훈련/테스트 데이터셋으로 모델을 평가하여 일반화 성능을 높입니다.
정규화 (Regularization): 모델의 계수를 제한하여 과적합을 방지합니다. - 비선형성 (Nonlinearity): 직선으로는 설명이 안 돼!
다중 회귀 분석은 독립 변수와 종속 변수 간의 관계가 선형적이라고 가정합니다. 하지만 실제 데이터는 항상 선형적이지 않고 비선형적인 관계를 가질 수 있습니다.
문제점: 모델의 예측 성능이 떨어집니다.
해결책:
비선형 변수 변환: 독립 변수를 비선형적으로 변환하여 선형 모델에 적용합니다. 예를 들어, 로그 변환, 제곱 변환 등을 사용할 수 있습니다.
비선형 모델 사용: 비선형 회귀 모델 (예: 다항 회귀, 결정 트리)을 사용합니다. - 이상치 (Outliers): 이상한 데이터가 결과를 망쳐!
이상치는 데이터셋에서 다른 데이터와 크게 다른 값을 가진 데이터입니다. 이상치는 모델의 계수를 크게 왜곡시켜 예측 성능을 저하시킬 수 있습니다.
문제점: 모델의 계수가 왜곡되고, 예측 성능이 떨어집니다.
해결책:
이상치 제거: 이상치를 제거합니다.
변수 변환: 로그 변환 등을 통해 이상치의 영향을 줄입니다.
강건한 회귀 모델 사용: 이상치에 덜 민감한 강건한 회귀 모델을 사용합니다. - 변수 선택 (Feature Selection): 어떤 변수를 써야 할지 고민!
다중 회귀 분석에서 어떤 독립 변수를 모델에 포함할지 결정하는 것은 중요합니다. 불필요한 변수를 포함하면 모델의 성능이 떨어질 수 있습니다.
문제점: 모델의 설명력이 떨어지고, 해석이 어려워집니다.
해결책:
전문가 지식 활용: 도메인 지식을 활용하여 중요한 변수를 선택합니다.
변수 선택 기법: 다양한 변수 선택 기법 (예: 단계적 선택, LASSO)을 사용하여 최적의 변수 집합을 찾습니다.
파이썬으로 실행하면서 익히는 다중선형회귀분석 (문서 하단에 바로 실행가능한 파일이 있어요)
1. 다중 회귀 분석의 개요
다중 회귀 분석은 두 개 이상의 독립 변수와 종속 변수 간의 선형 관계를 모델링하는 통계적 기법입니다. 예를 들어, 주택 가격을 예측하기 위해 면적, 침실 수, 욕실 수, 위치 등 여러 변수를 고려할 수 있습니다.
다중 회귀 분석의 목표는 독립 변수의 선형 결합을 통해 종속 변수를 가장 잘 예측하는 모델을 찾는 것입니다. 이를 위해 회귀 계수를 추정하고, 이 계수는 각 독립 변수가 종속 변수에 미치는 영향의 크기를 나타냅니다.
2. 파이썬 라이브러리 준비
다중 회귀 분석을 파이썬으로 수행하기 위해 다음과 같은 라이브러리를 사용합니다.
- NumPy: 배열과 행렬 연산을 위한 라이브러리입니다.
- Pandas: 데이터 분석 및 조작을 위한 라이브러리입니다.
- Scikit-learn: 다양한 머신러닝 알고리즘을 제공하는 라이브러리입니다.
import numpy as np
import pandas as pd
from sklearn.linear_model import LinearRegression
from sklearn.model_selection import train_test_split
from sklearn.metrics import mean_squared_error, r2_score
3. 데이터 준비 및 전처리
다중 회귀 분석을 수행하기 위해 먼저 데이터를 준비하고 전처리해야 합니다. 데이터 전처리는 결측값 처리, 범주형 변수 변환, 데이터 스케일링 등을 포함합니다.
# 데이터셋 로드 (예시: 붓꽃 데이터셋)
from sklearn.datasets import load_iris
iris = load_iris()
data = pd.DataFrame(data=iris.data, columns=iris.feature_names)
data['target'] = iris.target
# 결측값 처리 (필요한 경우)
# data.fillna(method='ffill', inplace=True)
# 독립 변수와 종속 변수 분리
X = data[['sepal length (cm)', 'sepal width (cm)', 'petal length (cm)', 'petal width (cm)']]
y = data['target']
# 데이터 스케일링 (필요한 경우)
from sklearn.preprocessing import StandardScaler
scaler = StandardScaler()
X = scaler.fit_transform(X)
4. 데이터셋 분할
데이터셋을 훈련 데이터와 테스트 데이터로 분할하여 모델을 훈련하고 성능을 평가합니다.
# 데이터셋 분할
X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.2, random_state=42)
5. 선형 회귀 모델 생성 및 훈련
Scikit-learn의 LinearRegression 클래스를 사용하여 선형 회귀 모델을 생성하고 훈련 데이터를 사용하여 모델을 학습시킵니다.
# 모델 생성
model = LinearRegression()
# 모델 훈련
model.fit(X_train, y_train)
6. 모델 평가
훈련된 모델을 테스트 데이터로 평가하여 성능을 측정합니다. 일반적으로 평균 제곱 오차 (MSE)와 R-제곱을 사용하여 모델의 성능을 평가합니다.
# 예측
y_pred = model.predict(X_test)
# 평가 지표 계산
mse = mean_squared_error(y_test, y_pred)
r2 = r2_score(y_test, y_pred)
# 결과 출력
print('평균 제곱 오차 (MSE):', mse)
print('R-제곱:', r2)
7. 모델 해석
다중 회귀 분석 모델을 해석하는 것은 매우 중요합니다. 모델의 계수를 분석하여 각 독립 변수가 종속 변수에 미치는 영향을 파악하고, p-값을 통해 계수의 유의성을 확인합니다. 또한, R-제곱을 통해 모델의 설명력을 평가할 수 있습니다.
# 계수 출력
print('계수:', model.coef_)
# 절편 출력
print('절편:', model.intercept_)
# p-값 (statsmodels 라이브러리 사용)
import statsmodels.api as sm
X_train_with_const = sm.add_constant(X_train)
model_sm = sm.OLS(y_train, X_train_with_const)
results = model_sm.fit()
print(results.summary())
8. 예측
훈련된 모델을 사용하여 새로운 데이터에 대한 예측을 수행할 수 있습니다.
# 새 데이터 예측
new_data = [[1, 2, 3, 4]]
prediction = model.predict(new_data)
print('예측:', prediction)
결과와 해설.
평균 제곱 오차 (MSE): 0.03645833333333332
R-제곱: 0.9494864752621297
계수: [ 0.07024107 -0.14241265 0.24105228 0.50918867]
절편: -0.4178628097371178
OLS Regression Results
==============================================================================
Dep. Variable: target R-squared: 0.949
Model: OLS Adj. R-squared: 0.945
Method: Least Squares F-statistic: 210.3
Date: Thu, 09 Nov 2023 Prob (F-statistic): 4.04e-34
Time: 16:27:28 Log-Likelihood: -13.932
No. Observations: 120 AIC: 35.86
Df Residuals: 116 BIC: 47.85
Df Model: 3
Covariance Type: nonrobust
==============================================================================
coef std err t P>|t| [0.025 0.975]
------------------------------------------------------------------------------
const -0.4179 0.102 -4.101 0.000 -0.620 -0.216
x1 0.0702 0.031 2.254 0.026 0.009 0.132
x2 -0.1424 0.033 -4.273 0.000 -0.208 -0.077
x3 0.2411 0.034 7.097 0.000 0.174 0.308
x4 0.5092 0.048 10.591 0.000 0.414 0.604
==============================================================================
Omnibus: 2.754 Durbin-Watson: 2.037
Prob(Omnibus): 0.252 Jarque-Bera (JB): 2.425
Skew: -0.339 Prob(JB): 0.298
Kurtosis: 3.033 Cond. No. 1.21
==============================================================================
1. 모델 성능 평가
- MSE (평균 제곱 오차): 0.036458은 모델의 예측 오차를 나타냅니다. 숫자가 작을수록 예측 정확도가 높다는 의미이며, 이 경우 상당히 낮은 값을 보여줍니다.
- R-제곱 (결정 계수): 0.949486은 모델이 데이터의 94.9%를 설명할 수 있다는 것을 의미합니다. 즉, 붓꽃의 특징을 이용하여 종류를 예측하는 데 매우 효과적인 모델이라는 것을 의미합니다.
2. 계수 해석
- 계수: 각 특징이 붓꽃 종류 예측에 미치는 영향을 나타냅니다.
- 꽃받침 길이 (x1): 0.0702는 꽃받침 길이가 1cm 증가할 때 붓꽃 종류 예측 값이 약 0.07 정도 변한다는 것을 의미합니다. 다른 특징들에 비해 상대적으로 영향력이 작은 편입니다.
- 꽃받침 너비 (x2): -0.1424는 꽃받침 너비가 1cm 증가할 때 예측 값이 약 0.14 감소한다는 것을 의미합니다. 꽃받침 길이와 달리 음의 계수를 가지므로, 꽃받침 너비가 넓어질수록 예측 값은 감소하는 경향이 있습니다.
- 꽃잎 길이 (x3): 0.2411은 꽃잎 길이가 1cm 증가할 때 예측 값이 약 0.24 증가한다는 것을 의미합니다. 꽃받침 길이와 너비보다 훨씬 큰 영향력을 가지며, 붓꽃 종류 예측에 중요한 역할을 하는 특징임을 알 수 있습니다.
- 꽃잎 너비 (x4): 0.5092는 꽃잎 너비가 1cm 증가할 때 예측 값이 약 0.51 증가한다는 것을 의미합니다. 가장 큰 계수 값을 가지므로, 꽃잎 너비가 붓꽃 종류를 예측하는 데 가장 중요한 특징임을 알 수 있습니다.
- 절편: -0.4178은 모든 특징이 0일 때 붓꽃 종류 예측 값을 나타냅니다.
3. 추가 분석 및 개선 방향
- 다른 데이터셋 적용: 다른 종류의 붓꽃 데이터셋을 사용하여 모델 성능을 검증해야 합니다.
- 특징 추가: 꽃의 색깔, 향기, 잎 모양 등 새로운 특징을 추가하여 모델의 정확도를 높일 수 있습니다.
- 다른 회귀 모델: 선형 회귀 외에 다항 회귀, 결정 트리 등 다양한 회귀 모델을 사용하여 모델 성능을 비교해 볼 수 있습니다.
- 데이터 시각화: 붓꽃의 특징을 시각화하여 데이터의 패턴을 분석하고 모델의 성능을 더 잘 이해할 수 있습니다.
거의 단골 수준으로 나오는 붓꽃 데이터 말고 데이터 셋을 생성하고, 해당 데이터 모델을 훈련하는 방식으로 확인해보도록 합니다.
먼저 준비물은 아래 파일링크에 접속하셔야 합니다.
https://colab.research.google.com/drive/1hmUkaq9fuRHUx47oMtMcubZEF1KuLJRv?usp=sharing
실행방법은 좌측에 위치한 실행버튼을 위에서부터 순차적으로 눌러주면 되는데요.
단순 랜덤 데이터를 생성한만큼 다중회귀분석에 적합하지 않은 데이터셋에다가 모델도 부적합에 가깝지만 파이썬으로 아주 쉽게 다중회귀분석을 다루어 볼 수 있어서 한번쯤 도전을 해보시길 권장해드립니다.
** 2024-07-17 추가 수정 **
적합 모델 (면적이 늘어날 수록 가격이 증가하는 경향성을 보이는) 자료 또한 참고 부탁드립니다.