선형회귀분석
[수업 목표]
- 선형 회귀 기본 개념 이해 단순 회귀와 다중 회귀의 차이를 파악한다.
- 선형 회귀의 가정과 수학적 원리 숙지합니다
- 회귀 분석 절차와 평가 방법 학습합니다
- 선형 회귀에 대한 Python을 활용한 실습 역량 강화합니다.
📕 1. 개요
(1) 기본 개념
선형 회귀는 독립 변수 (X) 가 종속 변수 (Y) 에 미치는 영향을 직선 (혹은 초평면) 형태로 모델링하는 기법입니다. 📈

-
예시:

- 공부 시간 (X) 이 시험 점수 (Y) 에 미치는 영향
- 광고비 (X) 가 판매량 (Y) 에 미치는 영향
- 집 크기 (X1), 방 개수 (X2) 가 집값 (Y) 에 미치는 영향
(2) 단순 회귀 vs 다중 회귀
- 단순 회귀 (Simple Regression): 독립 변수가 1개인 경우
- 다중 회귀 (Multiple Regression): 독립 변수가 2개 이상인 경우
(3) 결과 해석
- βi: 독립 변수 Xi 가 1 단위 증가할 때, 종속 변수 Y 가 평균적으로 얼마나 변하는지 나타냅니다. (다른 변수는 일정하다고 가정)
- β0: X=0 일 때 Y 의 예상값 (절편)
📕
- 주요 가정 (전제 조건)
선형 회귀 분석, 특히 최소 제곱법 (OLS) 을 사용할 때는 다음과 같은 가정이 충족되어야 합니다. 🤔
- 선형성: 독립 변수 (X) 와 종속 변수 (Y) 사이에 선형적인 관계가 있어야 합니다.
- 독립성: 오차 (잔차) 들은 서로 독립적이어야 합니다. (자기 상관 X)
- 등분산성: 모든 X 에 대해 잔차의 분산이 동일해야 합니다.
- 정규성: 잔차 (오차항) 가 정규 분포를 따라야 합니다.
- 다중 공선성: 독립 변수들 간의 상관 관계가 매우 높으면 회귀 계수 추정이 불안정해집니다. ⚠️ 가정 위배 시: 변환 (로그 변환 등), 다른 모형 선택, 이상치 제거, 강건 회귀 (Robust regression) 등을 고려합니다.
📕 3. 수학적 배경
(1) 최소 제곱법 (Ordinary Least Squares, OLS)
- 목표: 실제 종속 변수와 예측값 간 오차 제곱합 (SSE) 을 최소화하는 β 계수를 찾습니다.
(2) 결정 계수 (**) **
- 결정 계수 (): 모델이 종속 변수의 변동을 얼마나 잘 설명하는지 나타냅니다. (0~1 사이 값)
📕 4. 실행 절차
- 데이터 준비: 종속 변수 (Y) 와 독립 변수 (X) 를 정리합니다. 범주형 변수는 더미 변수/원-핫 인코딩 처리합니다.
- 데이터 탐색/시각화: X-Y 산점도, 상관 분석, 이상치 탐색 등을 수행합니다.
- 모형 적합 (회귀 분석 수행): 최소 제곱법 (OLS) 으로 β 를 추정합니다.
- 가정 검토: 잔차 도표 (등분산성, 선형성), 잔차 정규성 (Q-Q plot), Durbin-Watson (독립성), VIF (다중 공선성) 등을 확인합니다.
- 모델 평가: 결정 계수 (), 수정된 >, 유의성 검정 (F-test, t-test), AIC/BIC 등을 사용하여 모델을 평가합니다.
- 해석 & 보고: β 계수의 크기, 방향 (+, -), 유의성, 신뢰 구간 등을 제시합니다. 예측 모델의 경우 RMSE, MAE, 교차 검증 등으로 성능을 평가합니다.
📕 5. Python 예시 코드
(1) 단순 선형 회귀 예시 (statsmodels)
import numpy as np
import pandas as pd
import statsmodels.api as sm
import statsmodels.formula.api as smf
import matplotlib.pyplot as plt
# -------------------------------------------------
# 1) 예시 데이터 생성
# -------------------------------------------------
np.random.seed(42)
N = 50
X = np.linspace(0, 10, N) # 0부터 10까지 고르게 분포
true_beta0 = 5.0 # 실제 절편
true_beta1 = 2.0 # 실제 기울기
noise = np.random.normal(0, 2, N) # 평균=0, 표준편차=2인 오차
Y = true_beta0 + true_beta1 * X + noise
df = pd.DataFrame({'X': X, 'Y': Y})
# -------------------------------------------------
# 2) 단순선형회귀 (StatsModels)
# -------------------------------------------------
model = smf.ols('Y ~ X', data=df).fit() # Y=β0 + β1*X
print(model.summary())
# -------------------------------------------------
# 3) 예측 결과 시각화
# -------------------------------------------------
df['Y_pred'] = model.predict(df[['X']])
plt.scatter(df['X'], df['Y'], label='Observed', color='blue')
plt.plot(df['X'], df['Y_pred'], label='Fitted line', color='red')
plt.xlabel('X')
plt.ylabel('Y')
plt.legend()
plt.show()
(2) 다중 선형 회귀 예시 (statsmodels & scikit-learn)
import numpy as np
import pandas as pd
import statsmodels.formula.api as smf
from sklearn.linear_model import LinearRegression
from sklearn.metrics import mean_squared_error
# -------------------------------------------------
# 1) 예시 데이터 생성 (X1, X2 -> Y)
# -------------------------------------------------
np.random.seed(123)
N = 100
X1 = np.random.normal(10, 5, N) # 평균=10, 표준편차=5
X2 = np.random.normal(50, 10, N) # 평균=50, 표준편차=10
true_beta0 = 3.0
true_beta1 = 1.5
true_beta2 = 0.5
noise = np.random.normal(0, 5, N) # 오차
Y = true_beta0 + true_beta1 * X1 + true_beta2 * X2 + noise
df_multi = pd.DataFrame({'X1': X1, 'X2': X2, 'Y': Y})
# -------------------------------------------------
# 2) StatsModels를 이용한 다중회귀
# -------------------------------------------------
model_multi = smf.ols('Y ~ X1 + X2', data=df_multi).fit()
print(model_multi.summary())
# -------------------------------------------------
# 3) Scikit-Learn을 이용한 다중회귀
# -------------------------------------------------
X_features = df_multi[['X1', 'X2']]
y_target = df_multi['Y']
lin_reg = LinearRegression()
lin_reg.fit(X_features, y_target)
y_pred = lin_reg.predict(X_features)
mse = mean_squared_error(y_target, y_pred)
rmse = np.sqrt(mse)
print("\n[Scikit-Learn 결과]")
print(f"Intercept: {lin_reg.intercept_:.3f}")
print(f"Coef X1, X2: {lin_reg.coef_}")
print(f"RMSE: {rmse:.3f}")
→ 보통 Scikit-Learn을 이용한 다중회귀를 많이 사용합니다! 출력값 예시
OLS Regression Results
==============================================================================
Dep. Variable: MaintenanceCost R-squared: 0.996
Model: OLS Adj. R-squared: 0.996
Method: Least Squares F-statistic: 2.613e+04
Date: Tue, 21 Jan 2025 Prob (F-statistic): 9.12e-121
Time: 15:26:01 Log-Likelihood: -522.35
No. Observations: 100 AIC: 1049.
Df Residuals: 98 BIC: 1054.
Df Model: 1
Covariance Type: nonrobust
==================================================================================
coef std err t P>|t| [0.025 0.975]
----------------------------------------------------------------------------------
Intercept 110.7548 8.514 13.008 0.000 93.858 127.651
OperatingHours 2.4770 0.015 161.635 0.000 2.447 2.507
==============================================================================
Omnibus: 0.900 Durbin-Watson: 2.285
Prob(Omnibus): 0.638 Jarque-Bera (JB): 0.808
Skew: 0.217 Prob(JB): 0.668
Kurtosis: 2.929 Cond. No. 1.04e+03
==============================================================================📕 6. 결과 해석 및 보고
- **회귀 계수: ** 가 양수 (+) 이면 X 가 증가할수록 Y 도 증가 (양의 상관), 음수 (-) 이면 반대입니다.
- p-value: p-value 가 유의 수준 (예: 0.05) 보다 작으면 해당 변수의 효과가 통계적으로 유의합니다.
- F-검정 (모형 유의성): 전체 모델이 유의미한지 확인합니다. p<0.05 이면 “X 들이 Y 를 유의하게 설명한다” 고 해석합니다.
- 결정 계수 (, 수정된 : 모델의 설명력을 나타냅니다. 다중 회귀에서는 변수 개수에 대한 보정이 포함된 수정된 ( (Adjusted ) 를 주로 봅니다.
- 잔차 분석: 잔차 vs 적합값 (혹은 vs 독립 변수) 플롯에서 패턴이 없어야 등분산성/선형성을 확인할 수 있습니다. (잔차 정규성 (히스토그램, Q-Q plot), Durbin-Watson (독립성), VIF (공선성) 등)
📕 7. 한계 및 주의 사항
- 가정 위배: 이상치가 많거나 비선형 관계가 강하면 OLS 추정이 왜곡될 수 있습니다.
- 설명 vs 예측: 통계 분석 (설명) 목적인지, 머신러닝 (예측) 목적인지에 따라 평가 지표, 교차 검증, 정규화 등이 달라집니다.
- 인과 관계: 회귀 분석은 상관 관계를 보여주지만, 인과 관계는 연구 설계 (실험 등) 가 뒷받침되어야 확실히 주장할 수 있습니다.
- 다중 공선성: 독립 변수들 간의 상관 관계가 높으면 회귀 계수 해석이 불안정해집니다.
📕 8. 요약
- 선형 회귀 분석 (Linear Regression) 은 연속형 종속 변수를 독립 변수들의 선형 조합으로 설명/예측하는 가장 기초적인 통계/머신러닝 기법입니다.
- 기본 가정 (선형성, 독립성, 등분산성, 정규성) 이 어느 정도 충족되어야 모델 추정값 (β) 와 해석이 유효합니다.
- 결과 해석 시 회귀 계수 (크기, 방향, 유의성), 결정 계수 (), 잔차 분석 등을 종합적으로 확인해야 합니다.
- Python 에서는
statsmodels와scikit-learn을 사용하여 선형 회귀 분석을 수행할 수 있습니다.
실습 참고자료 : https://colab.research.google.com/drive/1HRDc6P1PsIKumRCsQuJBLy_9q2bfWrS1?usp=sharing