Skip to Content

선형회귀분석

[수업 목표]

  1. 선형 회귀 기본 개념 이해 단순 회귀와 다중 회귀의 차이를 파악한다.
  2. 선형 회귀의 가정과 수학적 원리 숙지합니다
  3. 회귀 분석 절차와 평가 방법 학습합니다
  4. 선형 회귀에 대한 Python을 활용한 실습 역량 강화합니다.

📕 1. 개요

(1) 기본 개념 선형 회귀는 독립 변수 (X) 가 종속 변수 (Y) 에 미치는 영향을 직선 (혹은 초평면) 형태로 모델링하는 기법입니다. 📈

  • 예시:

    • 공부 시간 (X) 이 시험 점수 (Y) 에 미치는 영향
    • 광고비 (X) 가 판매량 (Y) 에 미치는 영향
    • 집 크기 (X1), 방 개수 (X2) 가 집값 (Y) 에 미치는 영향

(2) 단순 회귀 vs 다중 회귀

  • 단순 회귀 (Simple Regression): 독립 변수가 1개인 경우
Y=β0+β1X1+εY = \beta_0 + \beta_1 X_1 + \varepsilon
  • 다중 회귀 (Multiple Regression): 독립 변수가 2개 이상인 경우
Y=β0+β1X1+β2X2++βkXk+εY = \beta_0 + \beta_1 X_1 + \beta_2 X_2 + \cdots + \beta_k X_k + \varepsilon

(3) 결과 해석

  • βi: 독립 변수 Xi 가 1 단위 증가할 때, 종속 변수 Y 가 평균적으로 얼마나 변하는지 나타냅니다. (다른 변수는 일정하다고 가정)
  • β0: X=0 일 때 Y 의 예상값 (절편)

📕

  1. 주요 가정 (전제 조건)

선형 회귀 분석, 특히 최소 제곱법 (OLS) 을 사용할 때는 다음과 같은 가정이 충족되어야 합니다. 🤔

  • 선형성: 독립 변수 (X) 와 종속 변수 (Y) 사이에 선형적인 관계가 있어야 합니다.
  • 독립성: 오차 (잔차) 들은 서로 독립적이어야 합니다. (자기 상관 X)
  • 등분산성: 모든 X 에 대해 잔차의 분산이 동일해야 합니다.
  • 정규성: 잔차 (오차항) 가 정규 분포를 따라야 합니다.
  • 다중 공선성: 독립 변수들 간의 상관 관계가 매우 높으면 회귀 계수 추정이 불안정해집니다. ⚠️ 가정 위배 시: 변환 (로그 변환 등), 다른 모형 선택, 이상치 제거, 강건 회귀 (Robust regression) 등을 고려합니다.

📕 3. 수학적 배경

(1) 최소 제곱법 (Ordinary Least Squares, OLS)

  • 목표: 실제 종속 변수yiyi와 예측값 yˉ\bar{y}간 오차 제곱합 (SSE) 을 최소화하는 β 계수를 찾습니다.

(2) 결정 계수 (R2R^2**) **

SSE=i=1n(yiy^i)2,y^i=β0+β1xi1+...+βkxikSSE = \sum_{i=1}^{n}(y_i - \hat{y}_i)^2 , \hat{y}_i = \beta_0 + \beta_1 x_{i1} + ... + \beta_k x_{ik}
  • 결정 계수 (R2R^2): 모델이 종속 변수의 변동을 얼마나 잘 설명하는지 나타냅니다. (0~1 사이 값)
R2=1SSESST,SST=i=1n(yiyˉ)2R^2 = 1 - \frac{SSE}{SST} , SST = \sum_{i=1}^{n} (y_i - \bar{y})^2

📕 4. 실행 절차

  1. 데이터 준비: 종속 변수 (Y) 와 독립 변수 (X) 를 정리합니다. 범주형 변수는 더미 변수/원-핫 인코딩 처리합니다.
  2. 데이터 탐색/시각화: X-Y 산점도, 상관 분석, 이상치 탐색 등을 수행합니다.
  3. 모형 적합 (회귀 분석 수행): 최소 제곱법 (OLS) 으로 β 를 추정합니다.
  4. 가정 검토: 잔차 도표 (등분산성, 선형성), 잔차 정규성 (Q-Q plot), Durbin-Watson (독립성), VIF (다중 공선성) 등을 확인합니다.
  5. 모델 평가: 결정 계수 (R2R^2), 수정된 R2R^2>, 유의성 검정 (F-test, t-test), AIC/BIC 등을 사용하여 모델을 평가합니다.
  6. 해석 & 보고: β 계수의 크기, 방향 (+, -), 유의성, 신뢰 구간 등을 제시합니다. 예측 모델의 경우 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. 결과 해석 및 보고

  • **회귀 계수: ** βiβ_i 가 양수 (+) 이면 X 가 증가할수록 Y 도 증가 (양의 상관), 음수 (-) 이면 반대입니다.
  • p-value: p-value 가 유의 수준 (예: 0.05) 보다 작으면 해당 변수의 효과가 통계적으로 유의합니다.
  • F-검정 (모형 유의성): 전체 모델이 유의미한지 확인합니다. p<0.05 이면 “X 들이 Y 를 유의하게 설명한다” 고 해석합니다.
  • 결정 계수 (R2)R^2), 수정된 R2R^2: 모델의 설명력을 나타냅니다. 다중 회귀에서는 변수 개수에 대한 보정이 포함된 수정된 (R2)R^2) (Adjusted R2R^2) 를 주로 봅니다.
  • 잔차 분석: 잔차 vs 적합값 (혹은 vs 독립 변수) 플롯에서 패턴이 없어야 등분산성/선형성을 확인할 수 있습니다. (잔차 정규성 (히스토그램, Q-Q plot), Durbin-Watson (독립성), VIF (공선성) 등)

📕 7. 한계 및 주의 사항

  • 가정 위배: 이상치가 많거나 비선형 관계가 강하면 OLS 추정이 왜곡될 수 있습니다.
  • 설명 vs 예측: 통계 분석 (설명) 목적인지, 머신러닝 (예측) 목적인지에 따라 평가 지표, 교차 검증, 정규화 등이 달라집니다.
  • 인과 관계: 회귀 분석은 상관 관계를 보여주지만, 인과 관계는 연구 설계 (실험 등) 가 뒷받침되어야 확실히 주장할 수 있습니다.
  • 다중 공선성: 독립 변수들 간의 상관 관계가 높으면 회귀 계수 해석이 불안정해집니다.

📕 8. 요약

  • 선형 회귀 분석 (Linear Regression) 은 연속형 종속 변수를 독립 변수들의 선형 조합으로 설명/예측하는 가장 기초적인 통계/머신러닝 기법입니다.
  • 기본 가정 (선형성, 독립성, 등분산성, 정규성) 이 어느 정도 충족되어야 모델 추정값 (β) 와 해석이 유효합니다.
  • 결과 해석 시 회귀 계수 (크기, 방향, 유의성), 결정 계수 (R2R^2), 잔차 분석 등을 종합적으로 확인해야 합니다.
  • Python 에서는 statsmodelsscikit-learn 을 사용하여 선형 회귀 분석을 수행할 수 있습니다.

실습 참고자료 : https://colab.research.google.com/drive/1HRDc6P1PsIKumRCsQuJBLy_9q2bfWrS1?usp=sharing