파이썬에서 다중 선형 회귀 분석: 여러 예측 변수를 활용한 모델링
다중 선형 회귀는 단순 회귀의 확장판으로, 여러 독립 변수를 포함합니다. 이 모델은 다차원 공간에서 초평면을 적합하여 타겟 변수 Y를 X₁부터 Xₙ까지의 예측 변수를 사용해 예측합니다. 각 계수 βᵢ는 다른 모든 변수를 고정한 상태에서 해당 요소의 고유한 영향을 나타냅니다. 광고 데이터셋을 활용해 TV, 라디오, 신문 광고 예산을 기반으로 매출을 예측해보겠습니다.
수학적 공식
모델 방정식은 다음과 같습니다:
Y = β₀ + β₁X₁ + β₂X₂ + ⋯ + βₙXₙ + ε
β₀는 절편이고, βᵢ는 회귀 계수이며, ε은 잔차를 의미합니다. 최적의 β 값은 일반적인 최소제곱법(OLS)을 통해 계산됩니다:
β̂ = (XᵀX)⁻¹Xᵀy
여기서 X는 일항 벡터(1로 채운 열)가 추가된 특징 행렬이고, y는 타겟 벡터입니다. 주요 가정으로는 선형 관계와 잔차의 동분산성(일관된 분산)이 있습니다.
데이터 준비
일반화 성능을 평가하고 과적합을 방지하기 위해 데이터를 학습/테스트 세트로 80:20 비율로 나눕니다. 범주형 변수에는 원-핫 인코딩을 적용하고, 수치형 변수는 StandardScaler를 사용해 표준화합니다. 이는 계수의 해석 가능성을 향상시킵니다.
핵심 준비 단계:
- 결측값과 이상치 확인하기.
- 범주형 변수 인코딩하기.
- 데이터셋 분할:
train_test_split(X, y, test_size=0.2, random_state=42). - 특징 스케일링:
StandardScaler().fit_transform(X_train).
광고 데이터셋을 활용한 구현
데이터셋: 200개 관측치, TV, 라디오, 신문 광고 예산을 기반으로 매출 예측.
모듈 가져오기 및 데이터 로드
import numpy as np
import pandas as pd
import matplotlib.pyplot as plt
import seaborn as sns
from sklearn.model_selection import train_test_split
from sklearn.linear_model import LinearRegression
from sklearn.metrics import mean_squared_error, r2_score, mean_absolute_error
plt.style.use('seaborn-v0_8-whitegrid')
sns.set_palette("husl")
df = pd.read_csv("Advertising.csv")
if 'Unnamed: 0' in df.columns:
df = df.drop('Unnamed: 0', axis=1)
df.columns = ['TV', 'Radio', 'Newspaper', 'Sales']
print(df.head())
print(f"Data size: {df.shape}")
처음 몇 줄:
| TV | Radio | Newspaper | Sales |
|-------|-------|-----------|-------|
| 230.1 | 37.8 | 69.2 | 22.1 |
| 44.5 | 39.3 | 45.1 | 10.4 |
탐색적 자료 분석(EDA) 및 상관관계
요약 통계:
| | TV | Radio | Newspaper | Sales |
|-------|--------|-------|-----------|-------|
| mean | 147.04 | 23.26 | 30.55 | 14.02 |
| std | 85.85 | 14.85 | 21.78 | 5.22 |
매출과의 상관관계: TV (0.78), 라디오 (0.58), 신문 (0.23).
산점도는 TV-매출과 라디오-매출 간 강한 선형 관계를 보여주지만, 신문-매출 간에는 약한 연결성이 있음을 나타냅니다.
모델 학습
X = df[['TV', 'Radio', 'Newspaper']]
y = df['Sales']
X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.2, random_state=42)
model = LinearRegression()
model.fit(X_train, y_train)
print(f"Intercept: {model.intercept_:.4f}")
for name, coef in zip(X.columns, model.coef_):
print(f"{name}: {coef:.4f}")
결과:
- 절편: 2.9791
- TV: 0.0447
- 라디오: 0.1892
- 신문: 0.0028
해석: TV 광고비가 1,000달러 증가할 때마다 매출은 약 44.7단위 증가하며, 라디오는 약 189.2단위의 추가 효과를 납니다. 반면 신문 광고는 거의 영향이 없습니다.
모델 평가
y_pred = model.predict(X_test)
mse = mean_squared_error(y_test, y_pred)
rmse = np.sqrt(mse)
mae = mean_absolute_error(y_test, y_pred)
r2 = r2_score(y_test, y_pred)
print(f"MSE: {mse:.2f}, RMSE: {rmse:.2f}, MAE: {mae:.2f}, R²: {r2:.4f}")
성능 지표:
- MSE: 3.17
- RMSE: 1.78
- MAE: 1.46
- R²: 0.8994
R²가 0.90이라는 것은 모델이 매출 변동의 90%를 설명할 수 있음을 의미합니다. RMSE와 MAE는 실제 매출 단위로 오차 크기를 제공합니다.
잔차 진단
- 잔차 히스토그램: 0 주변에 대칭적입니다.
- 잔차 대 예측값 그래프: 명확한 패턴 없음(동분산성 유지).
- 실제값 대 예측값 산점도는 대각선 주변에 밀집된 점들을 보여줍니다.
핵심 통찰
- 다중 회귀는 혼란 변수를 통제하면서 각 예측 변수의 영향을 분리합니다.
- 신문 광고의 계수가 거의 0에 가까워 예측력이 거의 없다는 점을 시사합니다.
- R² = 0.90은 매우 강력한 설명력을 나타내지만, 항상 다중공선성 여부를 확인하기 위해 VIF를 검토해야 합니다.
- 항상 잔차를 분석하여 선형성과 정규성 가정을 검증하세요.
- OLS에서는 스케일링이 필수는 아니지만, 계수의 해석을 더 명확하게 만듭니다.
— Editorial Team
아직 댓글이 없습니다.