Linear Regression
Linear Regressio은 연속형 반응 변수와 설명 변수의 선형 관계를 모델링하는 가장 기본적인 통계 모델입니다. 이 글에서는 OLS(Ordinary Least Squares)의 수식적 구조, 가정, 해석을 중심으로 정리하고, 간단한 파이썬 실습을 해보려고 합니다.
1. Model Definition
관측값 $i = 1, \ldots, n$에 대해 $p$개의 설명 변수를 갖는 다중선형회귀 모델은 다음과 같이 표현됩니다.
\[y_i = \beta_0 + \beta_1 x_{i1} + \cdots + \beta_p x_{ip} + \varepsilon_i, \quad \varepsilon_i \sim \mathcal{N}(0, \sigma^2)\]행렬 형태로 작성하면
\[\mathbf{y} = \mathbf{X}\boldsymbol{\beta} + \boldsymbol{\varepsilon},\]여기서
- $\mathbf{y} \in \mathbb{R}^n$ : 반응 벡터
- $\mathbf{X} \in \mathbb{R}^{n \times (p+1)}$ : 설계행렬(design matrix), 첫 번째 열은 1
- $\boldsymbol{\beta} \in \mathbb{R}^{p+1}$ : 회귀계수
- $\boldsymbol{\varepsilon} \in \mathbb{R}^n$ : 오차항
2. OLS Estimator
OLS는 잔차제곱합(Residual Sum of Squares, RSS)을 최소화합니다.
\[\text{RSS}(\boldsymbol{\beta}) = \Vert \mathbf{y} - \mathbf{X}\boldsymbol{\beta} \Vert_2^2\]이를 $\boldsymbol{\beta}$에 대해 미분하여 0으로 놓으면
\[\frac{\partial \text{RSS}}{\partial \boldsymbol{\beta}} = -2\mathbf{X}^\top(\mathbf{y} - \mathbf{X}\boldsymbol{\beta}) = \mathbf{0}\]따라서 정규방정식(normal equation) 은
\[\mathbf{X}^\top \mathbf{X} \hat{\boldsymbol{\beta}} = \mathbf{X}^\top \mathbf{y}\]이고, $\mathbf{X}^\top \mathbf{X}$가 가역(invertible)일 때 OLS 해는
\[\hat{\boldsymbol{\beta}} = (\mathbf{X}^\top \mathbf{X})^{-1}\mathbf{X}^\top \mathbf{y}\]입니다.
3. Geometric Interpretation
OLS는 $\mathbf{y}$를 $\mathbf{X}$의 열공간(column space)에 정사영(project)하는 문제로 이해할 수 있습니다. 즉, 추정된 반응 $\hat{\mathbf{y}} = \mathbf{X}\hat{\boldsymbol{\beta}}$는 $\mathbf{X}$의 열공간에 속하며, 잔차 $\hat{\boldsymbol{\varepsilon}} = \mathbf{y} - \hat{\mathbf{y}}$는 $\mathbf{X}$의 열공간과 직교합니다.
\[\mathbf{X}^\top \hat{\boldsymbol{\varepsilon}} = \mathbf{X}^\top(\mathbf{y} - \mathbf{X}\hat{\boldsymbol{\beta}}) = \mathbf{0}\]이 직교조건이 정규방정식과 동일합니다.
4. Basic Assumption of Linear Regression
-
선형성(linearity): $\mathbb{E}[y \mathbf{x}] = \mathbf{x}^\top \boldsymbol{\beta}$ - 독립성(independence): 관측치 간 오차가 독립
- 등분산성(homoscedasticity): $\operatorname{Var}(\varepsilon_i) = \sigma^2$ 일정
- 비다중공선성(no multicollinearity): $\mathbf{X}^\top \mathbf{X}$는 가역
- 정규성(normality) (추론 목적): $\boldsymbol{\varepsilon} \sim \mathcal{N}(\mathbf{0}, \sigma^2 \mathbf{I})$
가정을 만족하면 OLS 추정량은 Gauss–Markov 정리에 따라 BLUE(Best Linear Unbiased Estimator)가 됩니다.
5. Inference: Variance and Confidence Intervals
OLS 추정량의 분산은
\[\operatorname{Var}(\hat{\boldsymbol{\beta}}) = \sigma^2 (\mathbf{X}^\top \mathbf{X})^{-1}\]이며, $\sigma^2$는 잔차제곱합으로 추정합니다.
\[\hat{\sigma}^2 = \frac{1}{n - p - 1} \Vert \mathbf{y} - \mathbf{X}\hat{\boldsymbol{\beta}} \Vert_2^2\]각 계수의 표준오차는 $\sqrt{\operatorname{diag}(\hat{\sigma}^2 (\mathbf{X}^\top \mathbf{X})^{-1})}$로 계산하고, $t$-통계량을 통해 유의성 검정 및 신뢰구간을 구성합니다.
6. Worked Example: OLS in Python
간단한 2차원 설명 변수 예제를 통해 OLS 절차를 직접 구현해 보겠습니다.
- 모의 데이터를 생성하고
- 정규방정식을 이용해 수작업으로 추정량을 계산한 뒤
statsmodels.OLS와 결과를 비교합니다.
import numpy as np
import statsmodels.api as sm
rs = np.random.default_rng(42)
n = 200
# 데이터 생성
beta_true = np.array([1.5, -2.0, 0.8])
X = rs.normal(size=(n, 2))
X_with_intercept = np.column_stack([np.ones(n), X])
noise = rs.normal(scale=0.5, size=n)
y = X_with_intercept @ beta_true + noise
# OLS 수작업
beta_hat = np.linalg.inv(X_with_intercept.T @ X_with_intercept) @ X_with_intercept.T @ y
residuals = y - X_with_intercept @ beta_hat
sigma2_hat = (residuals @ residuals) / (n - X_with_intercept.shape[1])
print(\"β̂ (manual):\", beta_hat)
print(\"σ̂²:\", sigma2_hat)
# statsmodels 비교
model = sm.OLS(y, X_with_intercept)
result = model.fit()
print(result.summary())
공선성이 존재해 $\mathbf{X}^\top\mathbf{X}$가 역행렬을 갖지 않는다면
np.linalg.pinv(X_with_intercept) @ y처럼 Moore–Penrose 역행렬을 사용하면 최소노름 해를 얻을 수 있습니다.
7. Model Diagnostics
모델 적합 후 다음과 같은 진단 플롯과 통계를 확인해야 합니다.
- 잔차 vs 적합값: 패턴이 있으면 비선형 구조 또는 이분산을 의심
- QQ Plot: 잔차 정규성 판단
- VIF (Variance Inflation Factor): 다중공선성 점검
- Cook’s Distance: 영향력(observation influence) 탐지
References
- Statsmodels Documentation: https://www.statsmodels.org/stable/regression.html
댓글남기기