Multiple Linear Regression

다중 선형 회귀 — 행렬 OLS, Gauss-Markov, F-검정, 다중공선성

단순 선형 회귀를 여러 예측변수로 확장한다. 행렬 표기로 OLS를 유도하고, Gauss-Markov 정리로 BLUE 성질을 증명하며, t·F 검정과 R², 다중공선성, 변수 선택까지 MLR의 전체 이론 체계를 전개한다.

Statistics
저자

Kwangmin Kim

공개

2026년 04월 07일

1 개요 — SLR의 한계와 MLR의 필요성

단순 선형 회귀(SLR)는 반응변수 \(Y\) 와 예측변수 \(x\) 사이의 선형 관계를 모형화한다. 그러나 현실의 데이터에서 반응변수는 하나의 예측변수만으로 충분히 설명되지 않는다.

예시: 주택 가격

주택 가격(Y)은 면적(x₁) 하나로만 결정되지 않는다. 방 개수(x₂), 학군(x₃), 건축 연도(x₄), 인근 상업시설 접근성(x₅) 등이 동시에 영향을 미친다. 면적만으로 회귀하면 방 개수 효과가 잔차에 흡수되어 면적 계수가 왜곡된다.

MLR이 SLR보다 중요한 이유는 두 가지다.

혼란변수 통제(confounding control): 관심 변수 \(x_1\) 의 효과를 추정할 때, 다른 예측변수 \(x_2, \ldots, x_p\) 를 모형에 포함하면 이들의 효과를 통제한 상태에서 \(x_1\) 의 순수 효과를 분리할 수 있다. SLR은 이 통제가 불가능하여 편향된 계수 추정량이 나온다.

편회귀계수의 해석(ceteris paribus): MLR의 계수 \(\beta_j\) 는 “다른 모든 예측변수를 고정한 채 \(x_j\) 가 한 단위 증가할 때 \(Y\) 의 기대값 변화”를 의미한다. 이 해석은 SLR에서는 얻을 수 없다.

SLR과 MLR의 공식적 차이는 예측변수의 수뿐이지만, 행렬 표기를 도입하면 SLR을 포함한 MLR이 하나의 통합된 대수 체계로 표현된다.


2 모형 설정

2.1 개별 표기

\(n\) 개의 관측값 \((y_i, x_{i1}, \ldots, x_{ip})\) 에 대해 MLR은 다음과 같이 정의된다.

정의: 다중 선형 회귀 모형 (Multiple Linear Regression Model)

\[ Y_i = \beta_0 + \beta_1 x_{i1} + \beta_2 x_{i2} + \cdots + \beta_p x_{ip} + \varepsilon_i, \quad i = 1, \ldots, n \]

여기서 \(Y_i\) 는 반응변수, \(x_{ij}\)\(i\) 번째 관측의 \(j\) 번째 예측변수, \(\beta_0\) 는 절편, \(\beta_1, \ldots, \beta_p\) 는 편회귀계수(partial regression coefficients), \(\varepsilon_i\) 는 확률 오차이다.

모수는 총 \(p+1\) 개: \(\boldsymbol{\beta} = (\beta_0, \beta_1, \ldots, \beta_p)^{\top}\).

2.2 행렬 표기

\(n\) 개 방정식을 동시에 표현하면 다음과 같다.

정의: 행렬 형태의 MLR

\[ \mathbf{Y} = \mathbf{X}\boldsymbol{\beta} + \boldsymbol{\varepsilon} \]

여기서

\[ \mathbf{Y} = \begin{pmatrix} Y_1 \\ Y_2 \\ \vdots \\ Y_n \end{pmatrix}, \quad \mathbf{X} = \begin{pmatrix} 1 & x_{11} & \cdots & x_{1p} \\ 1 & x_{21} & \cdots & x_{2p} \\ \vdots & \vdots & \ddots & \vdots \\ 1 & x_{n1} & \cdots & x_{np} \end{pmatrix}, \quad \boldsymbol{\beta} = \begin{pmatrix} \beta_0 \\ \beta_1 \\ \vdots \\ \beta_p \end{pmatrix}, \quad \boldsymbol{\varepsilon} = \begin{pmatrix} \varepsilon_1 \\ \varepsilon_2 \\ \vdots \\ \varepsilon_n \end{pmatrix} \]

\(\mathbf{X}\)\(n \times (p+1)\) 설계행렬(design matrix), 첫 열은 모두 1이다.

설계행렬의 첫 열 \(\mathbf{1}_n\) 이 절편 \(\beta_0\) 에 대응한다.

2.3 Gauss-Markov 가정

OLS의 최적성을 보장하는 네 가지 가정이다.

번호 가정 수식
A1 선형성 \(\mathbf{Y} = \mathbf{X}\boldsymbol{\beta} + \boldsymbol{\varepsilon}\)
A2 완전 열랭크(full column rank) \(\mathrm{rank}(\mathbf{X}) = p+1\)
A3 오차의 기대값 \(\mathrm{E}[\boldsymbol{\varepsilon}] = \mathbf{0}\)
A4 등분산·비상관 오차 \(\mathrm{Var}(\boldsymbol{\varepsilon}) = \sigma^2 \mathbf{I}_n\)

A2는 \(\mathbf{X}^{\top}\mathbf{X}\) 가 가역임을 보장한다. A2를 위반하면 다중공선성 문제가 발생한다.

정규 오차 가정을 추가하면 정확한 분포 이론이 성립한다.

조건부 정규 모형

\[ \boldsymbol{\varepsilon} \sim N(\mathbf{0}, \sigma^2 \mathbf{I}_n) \quad \Longleftrightarrow \quad \mathbf{Y} \mid \mathbf{X} \sim N(\mathbf{X}\boldsymbol{\beta},\, \sigma^2 \mathbf{I}_n) \]

Gauss-Markov 정리(A1-A4)만으로도 OLS의 BLUE 성질이 성립한다. 정규성 가정은 검정과 신뢰구간에 필요하다.


3 OLS 추정 — 행렬 정규방정식

3.1 잔차 제곱합 최소화

OLS는 잔차 제곱합(RSS, Residual Sum of Squares)을 최소화하는 \(\boldsymbol{\beta}\) 를 구한다.

\[ \mathrm{RSS}(\boldsymbol{\beta}) = (\mathbf{Y} - \mathbf{X}\boldsymbol{\beta})^{\top}(\mathbf{Y} - \mathbf{X}\boldsymbol{\beta}) = \|\mathbf{Y} - \mathbf{X}\boldsymbol{\beta}\|^2 \]

\(\boldsymbol{\beta}\) 에 대해 미분하여 0으로 놓으면 정규방정식(normal equations)이 얻어진다.

\[ \frac{\partial}{\partial \boldsymbol{\beta}} \mathrm{RSS} = -2\mathbf{X}^{\top}(\mathbf{Y} - \mathbf{X}\boldsymbol{\beta}) = \mathbf{0} \]

\[ \mathbf{X}^{\top}\mathbf{X}\hat{\boldsymbol{\beta}} = \mathbf{X}^{\top}\mathbf{Y} \]

A2( \(\mathbf{X}\) 완전 열랭크)에 의해 \(\mathbf{X}^{\top}\mathbf{X}\) 가 가역이므로

정리: OLS 추정량

\[ \hat{\boldsymbol{\beta}} = (\mathbf{X}^{\top}\mathbf{X})^{-1}\mathbf{X}^{\top}\mathbf{Y} \]

이는 RSS를 유일하게 최소화하는 추정량이다.

SLR에서 \(b = S_{xY}/S_{xx}\)\(a = \bar{Y} - b\bar{x}\) 는 위 공식의 특수 사례이다.

3.2 기하적 해석 — 사영

\(\hat{\mathbf{Y}} = \mathbf{X}\hat{\boldsymbol{\beta}}\)\(\mathbf{Y}\)\(\mathbf{X}\) 의 열공간(column space) \(\mathcal{C}(\mathbf{X})\) 에 사영(orthogonal projection)한 것이다.

\[ \hat{\mathbf{Y}} = \mathbf{H}\mathbf{Y}, \quad \mathbf{H} = \mathbf{X}(\mathbf{X}^{\top}\mathbf{X})^{-1}\mathbf{X}^{\top} \]

\(\mathbf{H}\)사영행렬(hat matrix) 또는 leverage matrix이다. 주요 성질:

\[ \mathbf{H}^2 = \mathbf{H}, \quad \mathbf{H}^{\top} = \mathbf{H}, \quad \mathrm{tr}(\mathbf{H}) = p+1 \]

잔차 벡터는 사영의 여공간(complement)으로 떨어진다.

\[ \hat{\boldsymbol{\varepsilon}} = \mathbf{Y} - \hat{\mathbf{Y}} = (\mathbf{I}_n - \mathbf{H})\mathbf{Y} \]

그리고 \(\hat{\mathbf{Y}} \perp \hat{\boldsymbol{\varepsilon}}\) 이므로 피타고라스 분해가 성립한다.

\[ \|\mathbf{Y} - \bar{Y}\mathbf{1}\|^2 = \|\hat{\mathbf{Y}} - \bar{Y}\mathbf{1}\|^2 + \|\hat{\boldsymbol{\varepsilon}}\|^2 \quad \Longleftrightarrow \quad \mathrm{SST} = \mathrm{SSR} + \mathrm{SSE} \]

이 사영 기하가 F-검정과 R²의 이론적 토대이다.


4 OLS 추정량의 통계적 성질

4.1 비편향성

\[ \mathrm{E}[\hat{\boldsymbol{\beta}}] = \mathrm{E}[(\mathbf{X}^{\top}\mathbf{X})^{-1}\mathbf{X}^{\top}\mathbf{Y}] = (\mathbf{X}^{\top}\mathbf{X})^{-1}\mathbf{X}^{\top}\mathbf{X}\boldsymbol{\beta} = \boldsymbol{\beta} \]

A3( \(\mathrm{E}[\boldsymbol{\varepsilon}]=\mathbf{0}\) )에 의해 OLS 추정량은 비편향이다.

4.2 공분산 행렬

\[ \mathrm{Var}(\hat{\boldsymbol{\beta}}) = (\mathbf{X}^{\top}\mathbf{X})^{-1}\mathbf{X}^{\top} \cdot \sigma^2 \mathbf{I}_n \cdot \mathbf{X}(\mathbf{X}^{\top}\mathbf{X})^{-1} = \sigma^2 (\mathbf{X}^{\top}\mathbf{X})^{-1} \]

각 계수 \(\hat{\beta}_j\) 의 분산은 이 행렬의 \((j,j)\) 원소이다.

\[ \mathrm{Var}(\hat{\beta}_j) = \sigma^2 \left[(\mathbf{X}^{\top}\mathbf{X})^{-1}\right]_{jj} \]

4.3 Gauss-Markov 정리

정리: Gauss-Markov (BLUE)

가정 A1-A4 하에서, OLS 추정량 \(\hat{\boldsymbol{\beta}}\) 는 모든 선형 비편향 추정량 중 분산(공분산 행렬의 대각원소)이 가장 작다. 즉, OLS는 BLUE(Best Linear Unbiased Estimator)이다.

증명: \(\tilde{\boldsymbol{\beta}} = \mathbf{A}\mathbf{Y}\) 가 임의의 선형 비편향 추정량이면 비편향 조건 \(\mathbf{A}\mathbf{X} = \mathbf{I}\) 가 성립해야 한다. \(\mathbf{D} = \mathbf{A} - (\mathbf{X}^{\top}\mathbf{X})^{-1}\mathbf{X}^{\top}\) 로 놓으면 \(\mathbf{D}\mathbf{X} = \mathbf{0}\) 이고

\[ \mathrm{Var}(\tilde{\boldsymbol{\beta}}) = \sigma^2 \mathbf{A}\mathbf{A}^{\top} = \sigma^2 \left[(\mathbf{X}^{\top}\mathbf{X})^{-1} + \mathbf{D}\mathbf{D}^{\top}\right] \geq \sigma^2 (\mathbf{X}^{\top}\mathbf{X})^{-1} = \mathrm{Var}(\hat{\boldsymbol{\beta}}) \]

반양정치 행렬 \(\mathbf{D}\mathbf{D}^{\top} \geq 0\) 이므로 부등호가 성립한다.

Gauss-Markov 정리는 정규성 없이도 성립한다는 점이 핵심이다.

4.4 \(\sigma^2\) 추정

오차 분산 \(\sigma^2\) 의 비편향 추정량은 다음과 같다.

\[ s^2 = \frac{\mathrm{SSE}}{n-p-1} = \frac{\hat{\boldsymbol{\varepsilon}}^{\top}\hat{\boldsymbol{\varepsilon}}}{n-p-1} \]

\(n-p-1\) 은 자유도이다. \(p+1\) 개의 모수를 추정했으므로 잔차의 자유도가 줄어든다.

왜 비편향인가?

\[ \mathrm{E}[\mathrm{SSE}] = \mathrm{E}[\hat{\boldsymbol{\varepsilon}}^{\top}\hat{\boldsymbol{\varepsilon}}] = \mathrm{E}[\boldsymbol{\varepsilon}^{\top}(\mathbf{I}-\mathbf{H})\boldsymbol{\varepsilon}] = \sigma^2 \mathrm{tr}(\mathbf{I}-\mathbf{H}) = \sigma^2 (n - p - 1) \]

\(\mathrm{tr}(\mathbf{H}) = p+1\) 임을 이용하면 \(\mathrm{E}[s^2] = \sigma^2\) 이 된다.


5 분포 이론 — 정규 오차 가정

\(\boldsymbol{\varepsilon} \sim N(\mathbf{0}, \sigma^2 \mathbf{I}_n)\) 을 추가하면 정확한 분포가 얻어진다.

정리: 정규 오차 하의 분포

\[ \hat{\boldsymbol{\beta}} \sim N\!\left(\boldsymbol{\beta},\; \sigma^2 (\mathbf{X}^{\top}\mathbf{X})^{-1}\right) \]

\[ \frac{(n-p-1)s^2}{\sigma^2} \sim \chi^2_{n-p-1} \]

\(\hat{\boldsymbol{\beta}}\)\(s^2\) 는 독립이다.

이 세 결과가 t-검정과 F-검정의 토대가 된다.

증명 요약:

\(\hat{\boldsymbol{\beta}} = (\mathbf{X}^{\top}\mathbf{X})^{-1}\mathbf{X}^{\top}\mathbf{Y}\)\(\mathbf{Y}\) 의 선형변환이고 \(\mathbf{Y} \sim N(\mathbf{X}\boldsymbol{\beta}, \sigma^2 \mathbf{I})\) 이므로 정규 분포를 따른다.

\(\hat{\boldsymbol{\varepsilon}} = (\mathbf{I} - \mathbf{H})\mathbf{Y}\) 이고 \(\mathbf{H}(\mathbf{I}-\mathbf{H}) = \mathbf{0}\) 이므로 \(\hat{\boldsymbol{\beta}}\)\(\hat{\boldsymbol{\varepsilon}}\) 이 결합 정규 분포에서 비상관이 되어 독립이다. 따라서 \(\hat{\boldsymbol{\beta}} \perp s^2\) 이다.


6 가설검정과 구간 추정

6.1 개별 계수 검정 — t-검정

\(H_0: \beta_j = 0\)\(H_1: \beta_j \neq 0\) 을 검정한다.

검정통계량은

\[ t_j = \frac{\hat{\beta}_j}{s \sqrt{[(\mathbf{X}^{\top}\mathbf{X})^{-1}]_{jj}}} = \frac{\hat{\beta}_j}{\mathrm{SE}(\hat{\beta}_j)} \sim t_{n-p-1} \]

\(H_0\) 하에서 \(t_j \sim t_{n-p-1}\) 이다.

\(\beta_j\) 에 대한 \(1-\alpha\) 신뢰구간은

\[ \hat{\beta}_j \pm t_{n-p-1,\,\alpha/2} \cdot \mathrm{SE}(\hat{\beta}_j) \]

직관: 이 t-검정은 “다른 모든 변수가 모형에 있을 때 \(x_j\) 가 추가적으로 유의한가?”를 검정한다. 따라서 어떤 변수가 모형에 포함되느냐에 따라 동일 변수의 p-값이 달라진다.

6.2 전체 유의성 검정 — F-검정

\(H_0: \beta_1 = \beta_2 = \cdots = \beta_p = 0\) (절편만 있는 귀무모형)를 검정한다.

변동의 분해:

변동 원인 제곱합 자유도 평균제곱
회귀 (SSR) \(\|\hat{\mathbf{Y}} - \bar{Y}\mathbf{1}\|^2\) \(p\) \(\mathrm{MSR} = \mathrm{SSR}/p\)
잔차 (SSE) \(\|\mathbf{Y} - \hat{\mathbf{Y}}\|^2\) \(n-p-1\) \(\mathrm{MSE} = \mathrm{SSE}/(n-p-1)\)
전체 (SST) \(\|\mathbf{Y} - \bar{Y}\mathbf{1}\|^2\) \(n-1\)

F-통계량은

\[ F = \frac{\mathrm{MSR}}{\mathrm{MSE}} = \frac{\mathrm{SSR}/p}{\mathrm{SSE}/(n-p-1)} \sim F_{p,\; n-p-1} \]

\(H_0\) 하에서 \(F \sim F(p, n-p-1)\) 이다. F 값이 크면 \(H_0\) 를 기각한다.

해석: \(H_0\) 가 사실이면 MSR ≈ MSE, 즉 \(F \approx 1\) 이 기대된다. 회귀가 의미 있으면 MSR이 MSE보다 훨씬 커지므로 \(F \gg 1\) 이 된다.

6.3 부분 F-검정 (Partial F-test)

변수 그룹 \(x_{q+1}, \ldots, x_p\) 의 유의성을 검정할 때 사용한다.

  • 완전 모형(Full): 모든 \(p\) 개 예측변수 포함 → \(\mathrm{SSE}_F\), 자유도 \(n-p-1\)
  • 축소 모형(Reduced): 처음 \(q\) 개 예측변수만 포함 → \(\mathrm{SSE}_R\), 자유도 \(n-q-1\)

\[ F = \frac{(\mathrm{SSE}_R - \mathrm{SSE}_F)/(p-q)}{\mathrm{SSE}_F/(n-p-1)} \sim F_{p-q,\; n-p-1} \]

\(H_0: \beta_{q+1} = \cdots = \beta_p = 0\) 하에서 \(F \sim F(p-q, n-p-1)\) 이다. 전체 F-검정은 \(q=0\) 인 부분 F-검정의 특수 사례이다.

개별 t-검정 \(t_j^2\) 는 “제 \(j\) 변수 하나만 제거했을 때의 부분 F-검정”과 동치이다.


7 모형 적합도 — \(R^2\) 와 수정 \(R^2\)

7.1 결정계수 \(R^2\)

\[ R^2 = \frac{\mathrm{SSR}}{\mathrm{SST}} = 1 - \frac{\mathrm{SSE}}{\mathrm{SST}} \in [0, 1] \]

\(R^2\) 는 반응변수의 총 변동 중 회귀가 설명하는 비율이다.

경고: 변수를 추가하면 \(R^2\) 는 반드시 증가하거나 같다(절대 감소하지 않는다). 쓸모없는 변수를 추가해도 \(R^2\) 가 조금씩 올라가므로, \(R^2\) 만으로 변수 선택을 하면 과적합이 발생한다.

7.2 수정 결정계수 (Adjusted \(R^2\))

자유도를 보정하여 변수 추가에 패널티를 부과한다.

\[ R^2_{\mathrm{adj}} = 1 - \frac{\mathrm{SSE}/(n-p-1)}{\mathrm{SST}/(n-1)} = 1 - (1-R^2) \cdot \frac{n-1}{n-p-1} \]

쓸모없는 변수를 추가하면 \(\mathrm{MSE} = \mathrm{SSE}/(n-p-1)\) 가 오히려 증가하므로 \(R^2_{\mathrm{adj}}\) 가 감소한다. 따라서 변수 선택 기준으로 쓸 수 있다.

7.3 AIC와 BIC

정보 기준은 우도에 모수 수에 대한 패널티를 더한다.

\[ \mathrm{AIC} = n\log(\mathrm{SSE}/n) + 2(p+2) \]

\[ \mathrm{BIC} = n\log(\mathrm{SSE}/n) + (p+2)\log n \]

BIC는 AIC보다 더 큰 패널티를 부과하여 더 작은 모형을 선호한다.


8 다중공선성 (Multicollinearity)

8.1 문제의 본질

다중공선성은 예측변수들 사이에 강한 선형 관계가 있을 때 발생한다. \(x_j\) 가 다른 예측변수들의 선형결합에 가까우면 \(\mathbf{X}^{\top}\mathbf{X}\) 가 거의 특이행렬이 되어

\[ \mathrm{Var}(\hat{\beta}_j) = \sigma^2 [(\mathbf{X}^{\top}\mathbf{X})^{-1}]_{jj} \]

이 매우 커진다. 추정량은 여전히 비편향이지만 분산이 폭발하여 표준오차가 커지고 t-검정 p-값이 커진다.

직관적 설명: \(x_1\)\(x_2\) 가 거의 같은 정보를 담고 있다면, “\(x_2\) 를 고정하고 \(x_1\) 만 한 단위 변화할 때”라는 상황 자체가 데이터에서 거의 관측되지 않는다. 편회귀계수를 추정할 정보가 없는 것이다.

8.2 분산팽창인수 (VIF)

\(x_j\) 를 나머지 예측변수들로 회귀했을 때의 결정계수를 \(R^2_j\) 라 하면

정의: 분산팽창인수 (Variance Inflation Factor)

\[ \mathrm{VIF}_j = \frac{1}{1 - R^2_j} \]

\(R^2_j \to 1\) 이면 \(\mathrm{VIF}_j \to \infty\) 이다.

VIF 해석:

VIF 범위 판단
1 다중공선성 없음
1 ~ 5 허용 수준
5 ~ 10 주의 필요
10 이상 심각한 다중공선성

\(\mathrm{VIF}_j > 10\) 이면 \(R^2_j > 0.9\) 이므로, \(x_j\) 의 90% 이상이 다른 예측변수로 설명된다는 뜻이다.

8.3 조건수 (Condition Number)

\(\mathbf{X}^{\top}\mathbf{X}\) 의 최대·최소 고유값 비율의 제곱근으로 정의된다.

\[ \kappa = \sqrt{\frac{\lambda_{\max}}{\lambda_{\min}}} \]

\(\kappa > 30\) 이면 다중공선성이 의심된다.

8.4 대처 방법

방법 설명
변수 제거 높은 VIF 변수를 제거한다
주성분 회귀(PCR) \(\mathbf{X}\) 를 PCA로 직교화 후 회귀한다
능형 회귀(Ridge) \(\hat{\boldsymbol{\beta}}_{\mathrm{Ridge}} = (\mathbf{X}^{\top}\mathbf{X} + \lambda \mathbf{I})^{-1}\mathbf{X}^{\top}\mathbf{Y}\)
LASSO L1 페널티로 계수를 0으로 수축한다

Ridge는 작은 \(\lambda > 0\) 을 더해 \(\mathbf{X}^{\top}\mathbf{X}\) 의 역변환을 안정화한다. 편향을 도입하지만 분산을 크게 줄여 MSE를 개선한다.


9 변수 선택 (Variable Selection)

9.1 왜 필요한가

불필요한 변수를 포함하면 추정량의 분산이 증가한다. 반대로 필요한 변수를 빠뜨리면 편향이 발생한다(과소 적합, underfitting). 이 편향-분산 트레이드오프를 최적화하는 것이 변수 선택의 목표이다.

9.2 단계적 방법

전진 선택법(Forward Selection):

  1. 절편만 있는 모형에서 시작
  2. AIC를 가장 많이 줄이는 변수를 순차 추가
  3. 어떤 변수를 추가해도 AIC가 줄지 않으면 정지

후진 제거법(Backward Elimination):

  1. 모든 변수가 있는 완전 모형에서 시작
  2. AIC를 가장 적게 높이는 변수를 순차 제거
  3. 어떤 변수를 제거해도 AIC가 오르면 정지

단계적 선택법(Stepwise): 전진 선택과 후진 제거를 번갈아 반복한다.

9.3 AIC 기반 비교

\[ \mathrm{AIC}_{\mathrm{reduced}} < \mathrm{AIC}_{\mathrm{full}} \Rightarrow \text{축소 모형 선호} \]

AIC 차이 \(\Delta \mathrm{AIC} < 2\) 이면 두 모형이 동등하다고 본다.

주의: 단계적 방법은 p-값 다중비교 문제가 있고 지역 최적에 빠질 수 있다. 최적 부분집합 선택(All Subsets Regression, \(2^p\) 모형 비교)이 이론적으로 완전하지만 \(p\) 가 크면 비현실적이다.


10 응용 분야

분야 활용 구체적 예시
경제학 임금 결정 요인 교육년수, 경력, 성별, 산업이 임금에 미치는 효과 추정
의학 혈압 예측 나이, BMI, 운동량, 염분 섭취를 통한 수축기 혈압 모형화
금융 주가 팩터 모형 시장, 규모, 가치 팩터가 주식 수익률에 미치는 영향
마케팅 매출 예측 TV, 라디오, 소셜 광고 예산이 매출에 미치는 기여도 분리
기계공학 품질 관리 온도, 압력, 속도가 제품 결함률에 미치는 영향

11 예시 — 광고 예산과 매출

광고 데이터셋: 200개 시장, TV/라디오/신문 광고 예산(단위: 1000달러)과 매출(단위: 1000개) 가정.

11.1 단순 회귀 vs. 다중 회귀

모형 TV 계수 라디오 계수 신문 계수 \(R^2\)
SLR (TV만) 0.048 0.61
SLR (라디오만) 0.203 0.33
MLR (전체) 0.046 0.189 −0.001 0.90

신문 계수가 SLR에서는 양수였다가 MLR에서 유의하지 않게 된다. 이유: 신문과 라디오 광고 예산의 상관 때문에 신문의 효과가 라디오에 귀속된 것이다.

MLR에서 각 계수의 해석: - TV 계수 0.046: 라디오·신문 예산을 고정할 때, TV 예산 1단위 증가 시 매출 0.046 증가 - 라디오 계수 0.189: TV·신문 예산을 고정할 때, 라디오 예산 1단위 증가 시 매출 0.189 증가


12 코드 예시

12.1 Step 1: 순수 NumPy 구현 (원리 이해)

import numpy as np

# 광고 데이터 시뮬레이션
np.random.seed(42)
n = 200
TV     = np.random.uniform(0, 300, n)
radio  = np.random.uniform(0, 50, n)
# 진짜 관계: sales = 3 + 0.046*TV + 0.189*radio + noise
sales  = 3.0 + 0.046 * TV + 0.189 * radio + np.random.normal(0, 1.5, n)

# 설계행렬 구성 (절편 열 포함)
X = np.column_stack([np.ones(n), TV, radio])   # (200, 3)
y = sales.reshape(-1, 1)                        # (200, 1)

# OLS: beta_hat = (X'X)^{-1} X'y
XtX  = X.T @ X                                  # (3, 3)
Xty  = X.T @ y                                  # (3, 1)
beta_hat = np.linalg.solve(XtX, Xty)            # 역행렬 대신 선형 시스템 풀기

print("OLS 계수 추정량:")
print(f"  beta_0 (절편)   = {beta_hat[0, 0]:.4f}")
print(f"  beta_1 (TV)     = {beta_hat[1, 0]:.4f}")
print(f"  beta_2 (radio)  = {beta_hat[2, 0]:.4f}")

# 적합값과 잔차
y_hat    = X @ beta_hat
residuals = y - y_hat

# 잔차 제곱합과 sigma^2 추정
p   = 2          # 절편 제외 예측변수 수
SSE = float(residuals.T @ residuals)
s2  = SSE / (n - p - 1)      # 비편향 추정량

print(f"\ns^2 (MSE) = {s2:.4f}")
print(f"s (RMSE)  = {np.sqrt(s2):.4f}")

# 표준오차: SE(beta_j) = sqrt(s^2 * [(X'X)^{-1}]_jj)
cov_beta = s2 * np.linalg.inv(XtX)    # (3, 3)
se = np.sqrt(np.diag(cov_beta))

# t-통계량과 p-값
from scipy.stats import t as t_dist
df = n - p - 1
t_stats = beta_hat.flatten() / se
p_values = 2 * t_dist.sf(np.abs(t_stats), df=df)

print("\n계수 추론표:")
print(f"{'변수':^12} {'계수':^10} {'SE':^10} {'t':^8} {'p-값':^10}")
names = ['절편', 'TV', '라디오']
for name, b, s_e, t_s, pv in zip(names, beta_hat.flatten(), se, t_stats, p_values):
    print(f"{name:^12} {b:>10.4f} {s_e:>10.4f} {t_s:>8.3f} {pv:>10.4f}")

# F-검정
SST = float(((y - y.mean())**2).sum())
SSR = SST - SSE
F_stat = (SSR / p) / (SSE / (n - p - 1))
from scipy.stats import f as f_dist
F_pval = f_dist.sf(F_stat, dfn=p, dfd=n-p-1)

print(f"\nF-통계량 = {F_stat:.2f}, p-값 = {F_pval:.4e}")
print(f"R^2          = {SSR/SST:.4f}")
print(f"Adjusted R^2 = {1 - (SSE/(n-p-1)) / (SST/(n-1)):.4f}")

# VIF 계산
def compute_vif(X_no_intercept):
    """X에서 절편 열을 제외한 행렬을 입력"""
    k = X_no_intercept.shape[1]
    vifs = []
    for j in range(k):
        # x_j 를 나머지로 회귀
        x_j = X_no_intercept[:, j]
        others = np.delete(X_no_intercept, j, axis=1)
        X_oth = np.column_stack([np.ones(n), others])
        b = np.linalg.solve(X_oth.T @ X_oth, X_oth.T @ x_j)
        x_j_hat = X_oth @ b
        sst_j = ((x_j - x_j.mean())**2).sum()
        sse_j = ((x_j - x_j_hat)**2).sum()
        r2_j  = 1 - sse_j / sst_j
        vifs.append(1 / (1 - r2_j))
    return vifs

vifs = compute_vif(X[:, 1:])   # 절편 열 제외
print(f"\nVIF(TV) = {vifs[0]:.3f}, VIF(라디오) = {vifs[1]:.3f}")

12.2 Step 2: statsmodels 구현 (실무 활용)

import numpy as np
import pandas as pd
import statsmodels.api as sm
from statsmodels.stats.outliers_influence import variance_inflation_factor

# 데이터 준비 (Step 1과 동일 seed)
np.random.seed(42)
n = 200
TV     = np.random.uniform(0, 300, n)
radio  = np.random.uniform(0, 50, n)
sales  = 3.0 + 0.046 * TV + 0.189 * radio + np.random.normal(0, 1.5, n)

df = pd.DataFrame({'TV': TV, 'radio': radio, 'sales': sales})

# statsmodels OLS
X = sm.add_constant(df[['TV', 'radio']])    # 절편 추가
model = sm.OLS(df['sales'], X).fit()

print(model.summary())

# VIF
vif_data = pd.DataFrame()
vif_data['변수'] = X.columns
vif_data['VIF'] = [variance_inflation_factor(X.values, i) for i in range(X.shape[1])]
print("\nVIF:")
print(vif_data.to_string(index=False))

# 변수 선택 — AIC 비교
# 모든 변수 포함
m_full = sm.OLS(df['sales'], sm.add_constant(df[['TV', 'radio']])).fit()
# TV만
m_tv   = sm.OLS(df['sales'], sm.add_constant(df[['TV']])).fit()
# 라디오만
m_rad  = sm.OLS(df['sales'], sm.add_constant(df[['radio']])).fit()

print(f"\nAIC 비교:")
print(f"  Full (TV + radio): {m_full.aic:.2f}")
print(f"  TV only:           {m_tv.aic:.2f}")
print(f"  Radio only:        {m_rad.aic:.2f}")

결과 해석:

  • model.summary() 에서 각 계수의 t-통계량, p-값, 95% 신뢰구간을 직접 확인한다.
  • VIF 값이 모두 5 미만이면 다중공선성이 없다고 판단한다.
  • AIC가 가장 낮은 모형이 최적 모형이다 — 여기서는 Full 모형이다.

13 관련 주제

선행 지식

후속 주제

관련 개념

  • MANOVA — 반응변수가 여러 개일 때 (\(\mathbf{Y}\) 가 행렬)
  • Ridge, LASSO — 다중공선성·고차원 대응
  • EIV Regression — 예측변수에도 측정오차가 있는 경우

Subscribe

Enjoy this blog? Get notified of new posts by email: