# 다변수 회귀(다중선형회귀)와 상관 분석

단순선형회귀는 독립변수가 하나뿐인 경우를 다룬다. 그러나 실제 문제에서는 여러 개의 독립변수와 하나의 종속변수가 관계를 맺고 있는 상황이 많다. 이를 다중선형회귀(multiple linear regression) 또는 다변수 회귀라고 한다. 다중선형회귀에서 각 독립변수는 종속변수에 서로 다른 가중치(회귀계수)를 갖고 영향을 미치며, 전체적으로는 종속변수를 최대한 정확하게 예측하기 위한 최적의 회귀계수를 찾는 데 목적이 있다.

회귀계수 추정 과정은 최소제곱법을 이용해 잔차 제곱합을 최소화하도록 설계된다. 모델을 적합하고 나면 그 결과로써 회귀식과 추정된 계수들이 주어지며, 이들이 통계적으로 유의한지 평가하거나 예측력을 진단하기 위해 상관 분석 및 다양한 지표가 활용된다.

#### 다변수 회귀 모델의 기본 형태

독립변수를 여러 개 포함하는 경우 종속변수는 다음과 같은 형태로 표현된다. 독립변수 개수를 p라 할 때

$$
\begin{align} y = \beta\_0 + \beta\_1 x\_1 + \beta\_2 x\_2 + \dots + \beta\_p x\_p + \epsilon \end{align}
$$

에서 $y$는 종속변수, $x\_j$는 j번째 독립변수, $\beta\_j$는 j번째 회귀계수, $\epsilon$는 오차항이다. 이를 벡터 및 행렬 형태로 재정리하면

$$
\begin{align} \mathbf{y} = \mathbf{X}\boldsymbol{\beta} + \boldsymbol{\epsilon} \end{align}
$$

에서 $\mathbf{y}$는 크기 n인 종속변수 관측치 벡터, $\mathbf{X}$는 크기 $n \times (p+1)$인 설계행렬(design matrix), $\boldsymbol{\beta}$는 크기 $(p+1)$인 미지의 회귀계수 벡터, $\boldsymbol{\epsilon}$는 오차항 벡터다. 설계행렬 $\mathbf{X}$의 첫 열은 모든 원소가 1인 열로 구성하여 $\beta\_0$를 포함시킨다.

#### 최소제곱해(정규방정식)

최소제곱법에서는 오차항의 제곱합

$$
\begin{align} S(\boldsymbol{\beta}) = \sum\_{i=1}^{n} \bigl(y\_i - \beta\_0 - \beta\_1 x\_{i1} - \dots - \beta\_p x\_{ip}\bigr)^2 \end{align}
$$

을 최소화하는 $\boldsymbol{\beta}$를 찾는다. 행렬로 표현하면

$$
\begin{align} S(\boldsymbol{\beta}) = (\mathbf{y} - \mathbf{X}\boldsymbol{\beta})^T (\mathbf{y} - \mathbf{X}\boldsymbol{\beta}) \end{align}
$$

이 되고, 이를 $\boldsymbol{\beta}$에 대해 편미분하여 0이 되게 하는 정상 방정식을 세우면

$$
\begin{align} \frac{\partial S}{\partial \boldsymbol{\beta}} = -2\mathbf{X}^T(\mathbf{y} - \mathbf{X}\boldsymbol{\beta}) = \mathbf{0} \end{align}
$$

에서 이를 정리하면

$$
\begin{align} \mathbf{X}^T \mathbf{X} \boldsymbol{\beta} = \mathbf{X}^T \mathbf{y} \end{align}
$$

로 나타난다. 이 식을 정규방정식(normal equation)이라고 하며, $\mathbf{X}^T \mathbf{X}$가 가역(invertible)하다고 가정하면

$$
\begin{align} \hat{\boldsymbol{\beta}} = (\mathbf{X}^T \mathbf{X})^{-1} \mathbf{X}^T \mathbf{y} \end{align}
$$

에서 $\hat{\boldsymbol{\beta}}$는 최소제곱해가 된다. 만약 $\mathbf{X}^T \mathbf{X}$가 가역이 아니면(또는 수치적으로 매우 작은 행렬식 등으로 계산이 불안정할 때) 정규방정식을 직접 푸는 것보다 다른 방법(예: QR 분해, SVD 분해 등)을 사용하는 편이 안정적이다.

#### 예측과 해석

회귀계수가 추정된 후 주어진 독립변수 벡터 $\mathbf{x}\_{new}$에 대해 새로운 종속변수 값을 예측하려면

$$
\begin{align} \hat{y}*{new} = \mathbf{x}*{new}^T \hat{\boldsymbol{\beta}} \end{align}
$$

를 사용한다. 여기서 $\mathbf{x}\_{new}$는 첫 번째 원소가 1이고, 나머지는 실제 독립변수 값으로 구성된다.

다중선형회귀에서 각 독립변수 $x\_j$는 다른 변수들과 상호작용 없이 선형적으로 종속변수에 기여하는 것으로 가정한다. 그러나 실제 자료에서 변수들이 서로 상관관계를 갖는다면, 해석에 주의가 필요하다. 독립변수들 간에 강한 다중공선성(multicollinearity)이 존재하면 $\mathbf{X}^T \mathbf{X}$가 거의 특이(singular)에 가까워 추정 오차가 커지거나 예측이 불안정해질 수 있다.

#### 상관 분석의 개요

상관분석에서는 독립변수들끼리 혹은 독립변수와 종속변수 사이에 선형적 관계가 어느 정도 있는지를 나타내는 척도로써 상관계수(correlation coefficient)를 이용한다. 예를 들어 피어슨 상관계수는 다음과 같이 정의된다.

두 변수 $X$와 $Y$의 관측값이 주어졌을 때 표본 상관계수 $r$는

$$
\begin{align} r = \frac{\sum\_{i=1}^{n}(x\_i - \bar{x})(y\_i - \bar{y})}{\sqrt{\sum\_{i=1}^{n}(x\_i - \bar{x})^2}\sqrt{\sum\_{i=1}^{n}(y\_i - \bar{y})^2}} \end{align}
$$

으로 계산된다. 여기서 $\bar{x}$, $\bar{y}$는 각각 $x\_i$, $y\_i$의 표본평균이다. 상관계수는 -1부터 1 사이 값을 가지며, -1은 완전 음의 상관, 1은 완전 양의 상관, 0은 선형적 독립을 의미한다.

다중선형회귀에서 통상적으로 살펴보는 상관 측도는 결정계수(coefficient of determination) $R^2$로서, 이는 회귀모형이 종속변수 변동을 얼마나 설명하는지를 나타낸다. $R^2$가 1에 가까울수록 모형이 종속변수를 잘 설명한다. 하지만 독립변수의 개수가 늘어나면 $R^2$가 증가하기 쉬우므로, 자유도 조정된 $R\_{\text{adj}}^2$ 등을 함께 살펴보는 편이 좋다.

#### 다중공선성과 부분 상관계수

독립변수들 사이의 상관관계가 높으면 다중공선성(multicollinearity) 문제가 발생한다. 이는 $\mathbf{X}^T\mathbf{X}$가 거의 특이행렬에 가까워지게 만들어 회귀계수 추정에 불안정성이 생긴다. 이런 상황을 진단하기 위해 분산팽창지수(Variance Inflation Factor, VIF)를 살펴보는 방법이 많이 쓰인다. $x\_j$에 대해 다른 모든 변수들로 만든 회귀모형에서 $R\_j^2$를 계산한다면

$$
\begin{align} \text{VIF}(x\_j) = \frac{1}{1 - R\_j^2} \end{align}
$$

로 정의한다. VIF가 클수록 다중공선성이 심하다고 할 수 있다.

또한 부분 상관(partial correlation) 계수를 통해 한 변수를 제외하고 다른 변수들이 고정되어 있을 때의 상관도를 측정하기도 한다. 예를 들어 $x\_1$과 $y$ 사이의 부분 상관계수를 구하려면 다른 변수 $x\_2, x\_3, \dots, x\_p$가 미치는 선형효과를 제거한 뒤 남는 잔차들의 상관관계를 계산한다. 이는 단순상관계수와 달리 다른 변수들의 영향을 통제한다는 점에서 다중회귀 해석에 도움이 된다.

#### 예시(Python)

```python
import numpy as np

X = np.array([
    [1,  1.0, 2.0],
    [1,  2.0, 3.0],
    [1,  3.0, 5.0],
    [1,  4.0, 7.0],
    [1,  5.0, 8.0]
])
y = np.array([2.3, 3.1, 4.9, 6.2, 7.7])

# Normal Equation
XTX = X.T @ X
XTy = X.T @ y
beta_hat = np.linalg.inv(XTX) @ XTy

print("회귀계수 추정값:", beta_hat)
```

에서 첫 번째 열이 1로만 구성된 이유는 상수항 $\beta\_0$를 포함하기 위해서다. 위 코드를 실행해 보면 실제 회귀계수가 어떻게 추정되는지 확인할 수 있다.

#### 다중선형회귀 모델의 가정

다중선형회귀 모형이 타당하게 적용되려면 몇 가지 전제 조건(가정)이 충족되어야 한다. 이 가정들이 크게 어긋나면 추정된 계수나 예측 결과의 신뢰도가 떨어질 수 있다.

먼저 선형성(linearity) 가정이 있다. 종속변수와 독립변수들 사이의 실제 관계가 선형관계라고 가정한다. 선형관계가 아니면 잔차(residual) 분석에서 계통적 패턴이 발견될 수 있으며, 이를 보정하기 위해 비선형 항을 추가하거나, 데이터를 변환하는 등 후속 조정이 필요하다.

오차항의 독립성(autocorrelation 없음)도 중요하다. 이는 관측값들이 서로 독립적이라고 보는 가정이다. 시계열 자료나 공간적 의존성이 강한 자료의 경우 이 가정이 깨질 수 있으므로, 별도의 모형 혹은 방법론을 적용해야 한다.

등분산성(homoscedasticity) 가정은 독립변수의 값에 따라 잔차의 분산이 일정하게 유지된다는 것이다. 만약 분산이 일정하지 않다면 이분산(heteroscedasticity) 문제가 발생하며, 추정된 분산에 대한 신뢰도가 떨어진다. 잔차의 패턴을 플롯하여 검토하거나, 적절한 변환(예: 로그 변환)을 적용하기도 한다.

정규성(normality) 가정은 오차항이 정규분포를 따른다고 가정하는 것이다. 표본 크기가 매우 크면 중심극한정리에 의해 어느 정도 완화되지만, 표본이 작을 때는 정규성 위배가 심하면 통계적 검정의 타당도가 낮아진다. Q-Q 플롯 등으로 정규성을 확인할 수 있다.

마지막으로 다중공선성(multicollinearity) 문제가 있다면 회귀계수 추정의 분산이 커져서 신뢰구간이 넓어지거나 계수의 부호가 예측과 달리 뒤바뀌는 등의 문제가 생긴다. 이를 진단하기 위해서는 앞서 언급한 VIF, 부분상관계수, 조건수(condition number) 등을 활용한다.

#### 모델 적합성과 진단

회귀모형을 적합한 뒤에는 적절한 검증과 진단을 해야 한다. 일반적으로 잔차분석이 널리 쓰이며, 잔차 대 적합값(residual vs. fitted) 그래프 등을 확인하여 모형이 오차항 가정을 얼마나 잘 충족하는지 평가한다.

모델이 변수를 많이 포함할수록 $R^2$는 통상 증가하지만, 오히려 불필요한 변수가 포함되어 과적합(overfitting)이 발생할 수 있다. 이 때문에 변수 선택(variable selection)을 위한 방법을 적용하기도 한다. 예를 들어 전진선택법(forward selection)이나 후진제거법(backward elimination), 단계적 방법(stepwise) 등이 있다. 이 방법들은 다양한 기준(예: AIC, BIC, Mallows’ Cp 등)을 활용하여 변수 집합을 탐색한다.

#### 모형의 통계적 유의성 검정

모델의 성능뿐 아니라 추정된 회귀계수들이 통계적으로 유의한지 살펴보는 것도 중요하다. 각 회귀계수에 대해 귀무가설 $H\_0: \beta\_j = 0$를 세우고, t-검정(t-test)을 수행한다. 회귀계수가 실제로는 0이 아닌데도 표본에서 우연히 0 근처로 추정되었을 확률, 즉 p-값(p-value)이 작으면 귀무가설을 기각하고 해당 계수가 유의하다고 말한다.

계수 전체가 동시에 0인지(즉 모형에 유의미한 예측력이 있는지)를 검정할 때는 F-검정(F-test)을 사용한다. 귀무가설 $H\_0: \beta\_1 = \beta\_2 = \dots = \beta\_p = 0$를 세우고, 이를 기각할 수 있다면 전체 회귀모형이 유의하다고 해석할 수 있다.

#### 변수 변환과 상호작용

선형관계가 아닌 경우에 대비해, 독립변수 변환이나 상호작용항(interaction term)을 추가해 확장된 선형모델을 구상하기도 한다. 예를 들어 $x\_1$과 $x\_2$가 곱으로 상호작용하여 종속변수에 영향을 줄 수 있다면, 기존의 $\beta\_1 x\_1 + \beta\_2 x\_2$ 항 외에 $\beta\_{12} x\_1 x\_2$ 항을 추가하여 모델에 반영한다. 이러한 상호작용이 실제로 유의하면, 단순한 선형적 합으로는 설명되지 않는 구조를 좀 더 세밀하게 파악할 수 있게 된다.

비선형 구조가 의심될 경우엔 $x\_1^2$, $x\_2^3$ 등 다항(polynomial) 항을 추가하는 것이 대표적인 방법이다. 예컨대 2차 회귀모델을 고려한다면

$$
\begin{align} y = \beta\_0 + \beta\_1 x + \beta\_2 x^2 + \epsilon \end{align}
$$

과 같이 확장하여, 회귀계수를 적합한 뒤 유의성을 검토한다. 이로써 단순선형모형에서 놓칠 수 있는 곡선 형태의 관계를 반영할 수 있다.

#### 예시(Octave)

```octave
X = [1,1.0,2.0;
     1,2.0,3.0;
     1,3.0,5.0;
     1,4.0,7.0;
     1,5.0,8.0];
y = [2.3; 3.1; 4.9; 6.2; 7.7];

% Normal Equation
XTX = X'*X;
XTy = X'*y;
beta_hat = inv(XTX)*XTy;

disp("회귀계수 추정값:");
disp(beta_hat);
```

에서 Python 예시와 마찬가지로 첫 열에 상수항 처리를 위해 1을 넣고, 그다음 열들에 실제 독립변수를 할당한다. 계산 방식도 동일하며, 결과 회귀계수를 비교해볼 수 있다.

#### 고차원 상황과 정규화 기법

독립변수의 차원(개수)이 많아질수록, 다중공선성 문제나 과적합 문제가 더욱 빈번하게 발생한다. 이러한 상황에서 모형의 일반화 성능을 높이기 위해 정규화(regularization) 기법이 자주 활용된다. 대표적으로 Ridge 회귀(Ridge Regression)와 Lasso 회귀(Lasso Regression)가 있다. 이들은 최소제곱법에 페널티항(penalty term)을 추가해 계수 벡터의 크기를 제한함으로써, 분산을 줄이고 예측 오차를 개선하려 한다.

Ridge 회귀는 계수 크기의 제곱합(norm-2)을 페널티 항으로 추가한다. 즉 목적함수는

$$
\begin{align} S\_{\text{ridge}}(\boldsymbol{\beta})  &= \sum\_{i=1}^n \bigl(y\_i - \beta\_0 - \beta\_1 x\_{i1} - \dots - \beta\_p x\_{ip}\bigr)^2 + \lambda \sum\_{j=1}^p \beta\_j^2. \end{align}
$$

에서 $\lambda$는 정규화 파라미터로, $\lambda > 0$가 클수록 모델이 계수의 크기를 더 많이 제한한다. 벡터·행렬로 표현하면

$$
\begin{align} S\_{\text{ridge}}(\boldsymbol{\beta})  &= (\mathbf{y} - \mathbf{X}\boldsymbol{\beta})^T(\mathbf{y} - \mathbf{X}\boldsymbol{\beta}) + \lambda |\boldsymbol{\beta}|^2, \end{align}
$$

에서 상수항 $\beta\_0$는 보통 페널티에 포함하지 않는다(중심화/표준화 과정에서 자동으로 처리가 되기도 함). Ridge 회귀의 닫힌형 해(closed-form solution)는 정규방정식에 $\lambda \mathbf{I}$를 추가한 형태

$$
\begin{align} \hat{\boldsymbol{\beta}}\_{\text{ridge}}  = (\mathbf{X}^T \mathbf{X} + \lambda \mathbf{I})^{-1} \mathbf{X}^T \mathbf{y} \end{align}
$$

로 주어진다.

반면 Lasso 회귀는 절댓값(norm-1)을 페널티 항으로 추가한다.

$$
\begin{align} S\_{\text{lasso}}(\boldsymbol{\beta}) &= \sum\_{i=1}^n \bigl(y\_i - \beta\_0 - \beta\_1 x\_{i1} - \dots - \beta\_p x\_{ip}\bigr)^2  + \lambda \sum\_{j=1}^p |\beta\_j|. \end{align}
$$

페널티 항이 절댓값이므로 모형 해석상 중요한 특징인 변수 선택(variable selection) 효과가 나타날 수 있다. 어떤 계수들은 0이 되어 해당 변수들이 완전히 제외되는 결과가 나온다. Lasso 해는 일반적으로 닫힌형 해가 없어서 좌표강하법(coordinate descent) 등으로 수치 최적화를 수행한다.

정규화 기법을 적용할 때는 적절한 $\lambda$ 값 선정이 중요하다. 이를 위해 교차검증(cross-validation)을 활용하는 경우가 많다.

#### 차원 축소 기반 회귀

다중공선성이 심하거나 독립변수의 차원이 매우 큰 경우, 차원 축소 기법이 병행되기도 한다. 대표적으로 주성분회귀(PCR: Principal Component Regression)와 부분최소제곱(PLS: Partial Least Squares)이 있다.

주성분회귀(PCR)는 먼저 독립변수들에 대해 주성분분석(PCA)을 수행한 뒤, 주성분 스코어(주성분 축으로 투영된 값) 몇 개를 회귀에 사용하는 방식이다. $p$차원 독립변수를 $k(\<p)$차원으로 축소함으로써 다중공선성을 완화하고 계산 부담도 줄일 수 있다.

부분최소제곱(PLS)은 종속변수와 독립변수의 공분산 관계를 직접 고려하여, 그 연관성이 큰 방향으로 차원을 축소한다. PCR과 달리 종속변수 정보를 반영해 주성분 축을 찾기 때문에, 예측력 측면에서 더 유리할 수 있다.

#### 상관 행렬과 주성분분석

상관 행렬(correlation matrix)은 변수가 여러 개 있을 때, 이들 간의 상관계수를 한눈에 볼 수 있도록 정리한 행렬이다. 독립변수가 많을수록, 이 행렬을 살펴보아 서로 강한 상관을 지니는 쌍(즉, 공선성이 의심되는 쌍)을 찾아내는 데 활용할 수 있다. 나아가 상관 행렬을 기반으로 주성분분석을 수행하면, 각 변수의 분산 기여와 주성분 축들을 이해해볼 수 있다.

예컨대 $p$개의 독립변수에 대해 $p \times p$ 상관 행렬 $\mathbf{R}$을 만든 뒤 고유분해(eigen decomposition)을 하면

$$
\begin{align} \mathbf{R} = \mathbf{V} \mathbf{\Lambda} \mathbf{V}^T \end{align}
$$

에서 $\mathbf{\Lambda}$는 고윳값(eigenvalue) 대각행렬이고, $\mathbf{V}$는 고유벡터(eigenvector)를 열벡터로 갖는 정규직교 행렬이다. 주성분분석에서는 $\mathbf{V}$의 열들을 주성분축이라 하고, $\mathbf{\Lambda}$의 대각원소가 주성분분산의 크기를 나타낸다.

#### 로버스트 회귀

최소제곱법은 이상치(outlier)에 민감하다는 단점이 있다. 소수의 이상치가 존재해도 잔차 제곱합이 크게 증가하여 계수 추정이 왜곡될 수 있다. 이를 보완하기 위해 로버스트(robust) 회귀기법을 사용하기도 한다. 대표적인 예로 Huber 손실, RANSAC(Random Sample Consensus) 등이 있다. Huber 손실은 잔차가 작은 구간에서는 제곱오차로, 잔차가 큰 구간에서는 절댓값 오차로 처리하여 이상치를 완화한다.

#### 예시(C++)

```cpp
#include <iostream>
#include <vector>
#include <Eigen/Dense>  // Requires Eigen library

using namespace std;
using namespace Eigen;

int main() {
    // X: n x (p+1) matrix
    MatrixXd X(5,3);
    X << 1, 1.0, 2.0,
         1, 2.0, 3.0,
         1, 3.0, 5.0,
         1, 4.0, 7.0,
         1, 5.0, 8.0;
    // y: n-dimensional vector
    VectorXd y(5);
    y << 2.3, 3.1, 4.9, 6.2, 7.7;

    // Normal Equation
    MatrixXd XTX = X.transpose() * X;
    MatrixXd XTy = X.transpose() * y;

    // Solve for beta_hat
    VectorXd beta_hat = XTX.inverse() * XTy;

    cout << "회귀계수 추정값:\n" << beta_hat << endl;

    return 0;
}
```

에서 Eigen 라이브러리를 이용해 행렬 연산을 수행한다. Python이나 Octave 예시와 동일한 연산 과정을 확인할 수 있다.

#### 가중 최소제곱(Weighted Least Squares)

관측값들의 분산이 일정하지 않은 상황(이분산, heteroscedasticity) 또는 각 관측값에 대한 신뢰도가 서로 다를 때는 단순한 최소제곱법 대신 가중 최소제곱법(Weighted Least Squares, WLS)을 적용할 수 있다. 가중 최소제곱법에서는 관측치마다 가중치 $w\_i>0$를 부여해, 잔차의 제곱합을 단순히 합산하지 않고 가중치로 보정한다. 즉 다음과 같은 목적함수를 최소화한다.

$$
\begin{align} S\_{\text{WLS}}(\boldsymbol{\beta})  = \sum\_{i=1}^n w\_i \bigl(y\_i - \beta\_0 - \beta\_1 x\_{i1} - \dots - \beta\_p x\_{ip}\bigr)^2. \end{align}
$$

행렬 표현으로는 대각 성분이 $w\_i$인 대각행렬 $\mathbf{W}$를 정의하여,

$$
\begin{align} S\_{\text{WLS}}(\boldsymbol{\beta})  = (\mathbf{y} - \mathbf{X}\boldsymbol{\beta})^T \mathbf{W} (\mathbf{y} - \mathbf{X}\boldsymbol{\beta}). \end{align}
$$

이때 정규방정식은

$$
\begin{align} \mathbf{X}^T \mathbf{W} \mathbf{X} \boldsymbol{\beta}  = \mathbf{X}^T \mathbf{W} \mathbf{y} \end{align}
$$

이 되고, 최소제곱해는 (가역성 가정 하에)

$$
\begin{align} \hat{\boldsymbol{\beta}}\_{\text{WLS}} = (\mathbf{X}^T \mathbf{W} \mathbf{X})^{-1} \mathbf{X}^T \mathbf{W} \mathbf{y}. \end{align}
$$

을 통해 구한다. 이러한 가중치 $w\_i$는 통상 관측값의 분산의 역수인 경우가 많다. 예컨대 어떤 모형에서 $y\_i$의 분산이 $\sigma\_i^2$라면 $w\_i = 1/\sigma\_i^2$로 두는 식이다. 실제로는 $\sigma\_i^2$ 값을 모르는 경우가 많으므로 반복적 추정 기법(iterative procedure)을 사용하여 근사적으로 적절한 가중치를 찾는다.

#### 일반화선형모델(Generalized Linear Model, GLM)

종속변수가 연속형이라는 가정 하에 선형회귀를 적용해왔으나, 때로는 종속변수가 범주형(이항, 다항)이나 포아송 분포 등 다양한 형태를 취한다. 이를 처리하기 위해 지수분포족(exponential family)에 포함되는 확률분포를 가정하고, 링크함수(link function)를 사용하여 예측변수들과 종속변수를 연결하는 일반화선형모델(GLM)이 도입되었다.

예를 들어 로지스틱 회귀(logistic regression)는 종속변수가 0 또는 1인 이항형태를 취할 때 쓰이며, 연결함수로 로짓(logit)을 사용한다. 포아송 회귀(Poisson regression)는 종속변수가 0 이상의 정수 데이터를 받을 때 적합하며, 지수링크(exponential link)를 쓴다. 최소제곱법 대신 최대우도추정(MLE)을 통해 파라미터를 추정하는 방식이 일반적이다.

#### 베이지안 선형회귀(Bayesian Linear Regression)

베이지안 관점에서는 회귀계수 $\boldsymbol{\beta}$를 확률변수로 간주하고, 사전분포(prior distribution)를 부여한 뒤 사후분포(posterior distribution)를 업데이트한다. 정규 사전분포를 가정하면, 선형회귀에서의 사후분포도 정규분포 형태를 유지한다는 점이 알려져 있다(정규-정규 공액관계).

데이터 $\mathbf{y}$가 주어진 후 베이지안 기법에서는 사후분포

$$
\begin{align} p(\boldsymbol{\beta}|\mathbf{y}) \propto p(\mathbf{y}|\boldsymbol{\beta}) p(\boldsymbol{\beta}) \end{align}
$$

를 구하고, 이를 통해 $\boldsymbol{\beta}$의 기대값이나 분위수 등 다양한 추정치를 얻는다. 정규 사전분포(평균 $\mathbf{m}\_0$, 공분산 $\mathbf{C}\_0$)를 가정하면, 정규오차를 갖는 선형회귀의 우도함수와 곱해져 사후분포 역시 정규분포가 된다. 이때 직교 분해 또는 마르코프 연쇄 몬테카를로(MCMC) 기법을 통해 수치적으로 추정하는 방법이 자주 쓰인다.

베이지안 접근은 계수를 확률적으로 해석할 수 있으며, 예측 구간이나 신뢰구간도 사후분포의 분산을 통해 자연스럽게 표현한다. 또 사전분포 설정에 따라 정규화(reguralization)와 유사한 효과가 나타나기도 한다.

#### 부분회귀(Partial Regression)

다중선형회귀에서 한 독립변수가 종속변수에 어떻게 기여하는지, 다른 변수들의 영향은 통제한 상태로 살펴보려면 부분회귀(Partial Regression) 플롯을 그리는 방법이 있다. 예를 들어 $x\_1$이 새로 추가되는 변수가 될 때, 기존 변수들( $x\_2, x\_3, \dots, x\_p$ )로부터 각각 $y$와 $x\_1$에서 얻은 잔차를 구하고, 이 둘의 산점도를 그려서 회귀선을 적합한다. 이때 기울기는 다른 변수들의 효과를 제거한 상태에서 $x\_1$가 $y$에 미치는 순수 영향력과 관련이 있다.

부분회귀 플롯을 통해 특정 변수가 실제로 유의미한지, 혹은 다중공선성이나 곡선성 등 어떤 문제점이 있는지 시각적으로 판단하는 근거가 될 수 있다.

#### 예시(Python, 가중 최소제곱)

```python
import numpy as np

# 예시 데이터: 분산이 서로 다르다고 가정
X = np.array([
    [1, 1.0],
    [1, 2.0],
    [1, 3.0],
    [1, 4.0],
    [1, 5.0]
])
y = np.array([2.1, 2.9, 4.0, 5.2, 6.8])
w = np.array([1, 2, 3, 2, 1])  # 가중치 예시

# WLS 정규방정식
W = np.diag(w)           # w를 대각에 두는 대각행렬
XTX = X.T @ W @ X
XTy = X.T @ W @ y
beta_hat_wls = np.linalg.inv(XTX) @ XTy

print("WLS 회귀계수 추정값:", beta_hat_wls)
```

에서 $w$는 인위적으로 설정한 가중치다. 예제에서는 $w = \[1, 2, 3, 2, 1]$로 두었지만, 실제로는 데이터를 통해 추정된 분산의 역수를 사용하거나, 다른 기준으로 $w\_i$를 부여할 수 있다.

#### 회귀 진단과 영향력 분석

다중선형회귀를 포함한 회귀분석에서는 단순히 계수를 추정하고 적합도를 평가하는 것만으로 충분하지 않다. 잔차 분석, 영향력(Influence) 측정, 레버리지(Leverage) 판단 등 모형 진단 절차를 통해 이상치나 오차 가정을 위배하는 부분이 있는지를 면밀히 살펴보아야 한다.

**잔차 분석(Residual Analysis)**

회귀모형을 적합한 뒤에 얻는 잔차(residual)는 실제 관측값 $y\_i$와 모형 예측값 $\hat{y}\_i$ 간의 차이

$$
\begin{align} e\_i = y\_i - \hat{y}\_i \end{align}
$$

로 정의한다. 잔차가 모형의 가정(선형성, 등분산성, 독립성, 정규성 등)에 부합하는지를 확인하는 것이 잔차 분석의 핵심이다. 잔차 대 적합값 그래프(residual vs. fitted plot)를 통해 모형이 선형 가정을 만족하는지, 잔차 분산이 일정한지 등을 직관적으로 파악할 수 있다.

또한 Q-Q 플롯(Quantile-Quantile plot)을 통해 잔차분포가 정규분포에 근접하는지 시각화하거나, 잔차에 대한 자기상관(autocorrelation)이 있는지를 분석하기도 한다. 만약 잔차 플롯에서 계통적인 패턴이 보이거나, 고분산 구간이 편중되어 있다면, 모델이나 자료에 문제가 있음을 의심해볼 수 있다.

**레버리지(Leverage)와 Hat 행렬**

회귀분석에서 레버리지(Leverage)는 관측값이 회귀계수 추정에 얼마나 큰 영향을 주는지를 나타낸 척도다. 행렬 계산 관점에서 레버리지는 다음과 같이 정의된다.

최소제곱법에서 적합값 $\hat{\mathbf{y}}$는

$$
\begin{align} \hat{\mathbf{y}} = \mathbf{H} \mathbf{y} \end{align}
$$

로 나타나는데, 여기서 $\mathbf{H}$는 Hat 행렬(Hat matrix)이라 불리며

$$
\begin{align} \mathbf{H} = \mathbf{X}(\mathbf{X}^T \mathbf{X})^{-1} \mathbf{X}^T. \end{align}
$$

이 행렬의 대각원소 $h\_{ii}$가 i번째 관측값의 레버리지이다. $h\_{ii}$ 값이 큰 관측값은 모형 적합에 큰 영향을 미치며, 흔히 “고레버리지(high leverage)” 점이라 한다. 고레버리지 점은 예측값을 많이 끌어당길 수 있기 때문에, 잔차만 보고서는 그 점의 영향력을 제대로 파악하기 어려울 수 있다.

**잔차 vs. 레버리지 플롯**

잔차와 레버리지를 함께 시각화하면, 단순히 잔차가 큰지 여부와 별개로, 관측값이 모형에 얼마나 강한 영향력을 가지는지를 동시에 파악할 수 있다. 잔차는 작아도 레버리지가 매우 큰 점이 존재할 수 있고, 그러한 점은 모형에 큰 변화(왜곡)를 일으킬 수 있다.

**영향력 측정: Cook’s Distance 등**

어떤 관측값 $(x\_i, y\_i)$를 제거했을 때, 회귀계수나 예측값이 얼마나 변하는지를 측정하는 지표가 영향력(Influence) 지표이다. 대표적으로 Cook’s Distance가 많이 사용된다.

i번째 관측값의 Cook’s Distance $D\_i$는

$$
\begin{align} D\_i = \frac{\sum\_{j=1}^n (\hat{y}*j - \hat{y}*{j(-i)})^2}{(p+1),\hat{\sigma}^2} \end{align}
$$

형태로 정의되며, $\hat{y}\_{j(-i)}$는 i번째 점을 제외하고 모형을 적합했을 때의 j번째 예측값, $p$는 독립변수의 수(상수항 포함 시 $p+1$으로 볼 수 있음), $\hat{\sigma}^2$는 잔차제곱평균 등으로 추정한 오차분산이다. $D\_i$가 커질수록 i번째 관측값이 전체 회귀모형에 미치는 영향이 크다고 해석한다.

영향력이 지나치게 큰 점은 이상치(outlier)이거나, 고레버리지이면서 잔차까지 큰 경우가 많다. 이런 점을 제거하거나 보정(로버스트 회귀, 가중치 조정, 자료 수정 등)할 필요성을 판단하는 근거로 Cook’s Distance가 쓰인다.

**DFFITS, DFBetas 등**

Cook’s Distance 외에도 모형 진단에 자주 등장하는 지표로 DFFITS와 DFBetas가 있다.

* DFFITS는 i번째 관측값을 제외하고 적합한 모형에서 i번째 예측값과, 원래 모형에서의 예측값 차이를 표준화한 것이다.
* DFBetas는 i번째 관측값을 제거했을 때 특정 회귀계수(예: $\beta\_j$)가 얼마나 변하는지, 그 차이를 표준화한 것이다.

이러한 지표들은 어느 특정 관측값이 모델 파라미터 추정에 얼마나 큰 변화를 유발하는지 보다 구체적으로 보여준다.

**변환(Transformation)과 회귀모형 보정**

잔차 분석과 영향력 분석에서 문제를 발견했을 때, 적절한 데이터 변환이나 모형 변경을 고려할 수 있다. 예컨대 종속변수를 로그 변환하면 등분산성이 개선되거나, 비선형성을 완화할 수 있다. 또한 독립변수에 대한 적절한 변환(루트, 제곱, 로그 등)을 추가하여 선형 관계로 근사할 수도 있다. 더 나아가 회귀 스플라인(regression spline), GAM(Generalized Additive Model) 등 비선형 추세를 반영하는 방법론도 존재한다.

**회귀 진단 예시(Python, Cook’s Distance)**

```python
import numpy as np
import statsmodels.api as sm

X = np.array([
    [1, 1.0],
    [1, 2.0],
    [1, 3.0],
    [1, 4.0],
    [1, 5.0],
    [1, 9.0]    # 일부러 한 점을 멀리 배치 (이상점 가능성)
])
y = np.array([2.1, 2.9, 4.0, 5.2, 6.8, 12.0])

model = sm.OLS(y, X).fit()
influence = model.get_influence()
cooks_d = influence.cooks_distance[0]  # 각 관측값의 Cook's Distance

print("회귀계수 추정값:", model.params)
print("각 관측값 Cook's Distance:", cooks_d)
```

에서 statsmodels 라이브러리를 이용하여 회귀적합과 Cook’s Distance를 계산해볼 수 있다. 마지막 점(9.0, 12.0)이 다른 점들에 비해 멀리 떨어져 있을 경우, Cook’s Distance가 상대적으로 크게 나타나 영향력이 큰 점임을 시사할 수 있다.

#### 교차검증(Cross-Validation)과 과적합 진단

회귀모형을 구축할 때, 주어진 데이터에 대해서는 잔차제곱합(RSS)이나 결정계수(R2R^2)가 높더라도, 새로운 데이터에 대한 예측 성능이 낮아질 수 있다. 이를 과적합(overfitting)이라 한다. 과적합은 특히 독립변수의 수가 많아지거나 복잡한 모형(다항식, 상호작용 등이 포함된 모형)을 도입하는 경우 쉽게 발생한다. 이를 진단하고 방지하기 위한 대표적 방법이 교차검증(cross-validation)이다.

가장 널리 쓰이는 방식 중 하나는 $k$-겹 교차검증(kk-fold cross-validation)이다. 전체 데이터를 무작위로 $k$개의 구간(폴드, fold)으로 나눈 뒤, 그 중 11개의 폴드를 검증(validation) 집합으로, 나머지 $k-1$개의 폴드를 학습(training) 집합으로 사용하여 회귀계수를 적합한다. 이어서 검증 집합에 대한 예측오차를 측정하고, 이 과정을 $k$번 반복한다. 각 폴드에서의 예측오차를 평균 내면, 새로운 데이터에 대한 모형의 일반화(generalization) 성능을 추정할 수 있다.

Leave-One-Out 교차검증(LOOCV)은 $k = n$인 특별한 경우로, 각 관측값을 검증 집합으로 두고 나머지 $n-1$개의 관측값으로 모형을 적합한다. 샘플 수가 충분히 클 경우 계산 비용이 커지지만, 데이터를 최대한 활용한다는 장점이 있다.

교차검증 과정을 여러 번 반복(Repeated CV)하거나, 훈련/검증/테스트 집합으로 나누는 방식도 있다. 중요한 점은 단순히 학습데이터에 대한 적합도 지표만 확인하지 않고, 교차검증 오차나 별도의 테스트 집합에서의 예측오차를 모형 평가와 선택 기준으로 삼는 것이다.

#### 단계적 변수 선택(Stepwise Variable Selection)

다중회귀 분석에서는 독립변수 후보가 매우 많을 때 어떤 변수들을 최종적으로 포함해야 할지 결정하는 문제가 생긴다. 이때 단계적 변수 선택(stepwise selection) 기법을 사용해볼 수 있다. 전진 선택법(forward selection)은 아무 변수도 없는(상수항만 있는) 모형에서 시작하여, 통계적으로 가장 유의미한 변수를 하나씩 추가해 나간다. 후진 제거법(backward elimination)은 전체 변수들을 포함한 모형에서 시작해, 가장 유의하지 않은 변수를 하나씩 제거해 나간다. 단계적 방법(stepwise)은 이 둘을 혼합하여, 필요하다면 추가된 변수를 다시 제거할 수도 있도록 유연성을 부여한다.

변수를 추가하거나 제거할 때의 기준은 F-검정, t-검정의 유의확률(p-값), 혹은 정보량 기준(AIC, BIC, Mallows’ $C\_p$) 등이 쓰인다. 변수 선택 과정을 교차검증과 결합함으로써 일반화 성능이 높은 변수 조합을 탐색할 수도 있다. 다만, 자동화된 변수 선택은 국소 최적해(local optimum)에 갇히거나, 임의의 순서에 따라 결과가 달라질 수 있다는 한계를 가진다.

#### 부분상관(Partial Correlation)과 편상관계수

다중회귀에서 종속변수와 특정 독립변수 사이의 상관관계를 살펴볼 때, 다른 모든 변수의 영향이 제거된 상태로 두 변수만의 순수한 관계 정도를 알고 싶다면, 부분상관 또는 편상관(partial correlation)을 활용한다. 단순상관계수는 모든 변수 간의 상호영향을 구분 없이 합쳐 계산하지만, 부분상관계수는 나머지 변수들이 설명하는 효과를 제거한 뒤 남은 잔차들 간의 상관을 구한다.

예컨대 독립변수 $x\_1$과 종속변수 $y$ 사이의 부분상관계수를 구하려면, 먼저 $x\_2, x\_3, \dots, x\_p$를 사용해 $y$를 회귀분석한 잔차와, $x\_2, x\_3, \dots, x\_p$를 사용해 $x\_1$을 회귀분석한 잔차를 각각 구한 뒤, 이 두 잔차 벡터 간 상관계수를 계산한다. 이는 “$x\_1$과 $y$ 간에 다른 변수들이 설명하고 난 뒤에 남는 잔여 변동끼리는 얼마나 관련이 있는가”를 보여준다.

부분상관 분석을 통해 어떤 변수의 고유한 기여도를 판단하거나 다중공선성을 진단할 수 있다. 예를 들어, $x\_1$이 다른 변수들과 함께 회귀모형에 들어갔을 때 유의미하지 않은 것으로 나타났다면, $x\_1$과 $y$ 사이에 단순상관이 있더라도 다른 변수들로 설명된 부분을 제외하면 추가적인 설명력이 없다는 뜻일 수 있다.

#### 부분상관 예시(Python)

```python
import numpy as np
import statsmodels.api as sm
from scipy.stats import pearsonr

# 부분상관 함수 정의
def partial_correlation(X, y, target_idx):
    # X: 독립변수 행렬(n x p), y: 종속변수 벡터(n), target_idx: 부분상관 확인할 독립변수 인덱스
    # 반환: target_idx번째 독립변수와 y 사이의 부분상관계수
    p = X.shape[1]
    idx_others = [i for i in range(p) if i != target_idx]
    
    # 1) y를 다른 변수들에 대해 회귀적합한 잔차
    X_others = sm.add_constant(X[:, idx_others])
    model_y = sm.OLS(y, X_others).fit()
    resid_y = model_y.resid
    
    # 2) x_target을 다른 변수들에 대해 회귀적합한 잔차
    x_target = X[:, target_idx]
    model_x = sm.OLS(x_target, X_others).fit()
    resid_x = model_x.resid
    
    # 3) 두 잔차의 피어슨 상관계수 계산
    r, _ = pearsonr(resid_x, resid_y)
    return r

# 예시 데이터
X_data = np.array([
    [1.0, 2.0, 3.0],
    [2.0, 3.0, 4.5],
    [3.0, 5.0, 7.2],
    [4.0, 7.0, 9.1],
    [5.0, 8.0, 10.5],
    [5.5, 9.2, 11.0]
])
y_data = np.array([2.3, 3.1, 4.9, 6.2, 7.7, 8.4])

# target_idx=0 -> X_data의 첫 번째 열과 y_data 사이의 부분상관계수 구하기
r_partial = partial_correlation(X_data, y_data, 0)
print("부분상관계수 (x_1, y | x_2, x_3):", r_partial)
```

위 코드에서 `partial_correlation` 함수는 특정 독립변수 $\mathbf{x}*{\text{target}}$과 종속변수 $\mathbf{y}$ 사이의 부분상관을 계산한다. 나머지 변수들 $\mathbf{x}*{\text{others}}$를 이용해 각각 $\mathbf{y}$와 $\mathbf{x}*{\text{target}}$을 회귀적합한 뒤, 얻어진 잔차들 간의 피어슨 상관계수를 구한다. 이 값을 통해 “$\mathbf{x}*{\text{others}}$가 이미 설명하고 난 뒤에 $\mathbf{x}\_{\text{target}}$과 $\mathbf{y}$가 얼마나 추가적으로 선형적 관계를 맺는가”를 볼 수 있다.

#### 단순회귀와 다중회귀에서의 상관 비교

어떤 독립변수 $x\_j$가 종속변수 $y$와 상당히 높은 단순상관을 보이더라도, 다중회귀 모형에 여러 변수가 함께 들어가면 $x\_j$의 기여가 희석되거나 제거될 수 있다. 그 반대의 경우도 가능하며, 단순상관은 낮아 보여도 다른 변수들과의 상호작용이나 결합 효과를 통해 다중회귀에서 중요한 변수가 되기도 한다. 따라서 회귀모형에서 각 변수가 갖는 실제 영향력을 정확히 해석하기 위해서는 부분상관이나 회귀계수의 통계적 유의성 검정 등을 종합적으로 고려해야 한다.

#### 회귀 모델 적합도와 오차 측도

회귀모형을 평가할 때는 추정된 회귀계수를 통해 얻는 예측값이 실제 관측값과 얼마나 가까운지를 측정해야 한다. 이를 위해 여러 가지 오차(Error) 척도가 쓰인다. 가장 기본적이고 널리 쓰이는 척도는 평균제곱오차(MSE, Mean Squared Error)다. 잔차 $e\_i = y\_i - \hat{y}\_i$로부터

$$
\begin{align} \text{MSE}  = \frac{1}{n}\sum\_{i=1}^n (y\_i - \hat{y}\_i)^2 \end{align}
$$

로 계산하며, 제곱근 평균제곱오차(RMSE, Root Mean Squared Error)는

$$
\begin{align} \text{RMSE}  = \sqrt{\frac{1}{n}\sum\_{i=1}^n (y\_i - \hat{y}\_i)^2}. \end{align}
$$

MSE보다 직관적으로 해석하기 쉽다는 장점이 있다. 이외에도 평균절댓값오차(MAE, Mean Absolute Error)

$$
\begin{align} \text{MAE} = \frac{1}{n}\sum\_{i=1}^n \bigl| y\_i - \hat{y}\_i \bigr| \end{align}
$$

나 평균절대퍼센트오차(MAPE, Mean Absolute Percentage Error) 등이 쓰인다. MAPE는 종속변수 값이 0에 가깝지 않은 상황에서 상대적 오차를 측정하는 데 유용하다.

결정계수($R^2$)는 잔차제곱합을 전체변동으로 나눈 뒤 1에서 빼는 형태로,

$$
\begin{align} R^2  = 1 - \frac{\sum\_{i=1}^n (y\_i - \hat{y}*i)^2}{\sum*{i=1}^n (y\_i - \bar{y})^2} \end{align}
$$

로 정의된다. 1에 가까울수록 모델이 종속변수 변동을 잘 설명한다. 하지만 독립변수를 많이 넣으면 $R^2$가 자연히 증가하기 때문에, 자유도 등을 고려한 수정결정계수($R\_{\text{adj}}^2$)로 모델 성능을 평가하기도 한다.

#### QR 분해(QR Decomposition)를 통한 회귀해

정규방정식을 직접 풀어서 회귀계수를 구하면, $\mathbf{X}^T \mathbf{X}$가 커질수록 수치적 불안정성이 커질 수 있다. 대안으로 QR 분해를 사용하면 수치 안정성을 높이는 동시에, 행렬이 어느 정도로 근사적인 (반)직교 구조를 갖는지 살펴볼 수 있다. 예컨대 설계행렬 $\mathbf{X}$를

$$
\begin{align} \mathbf{X} = \mathbf{Q}\mathbf{R} \end{align}
$$

로 분해한다고 할 때, $\mathbf{Q}$는 직교(또는 직교에 가까운) 행렬, $\mathbf{R}$은 상삼각행렬이 된다. 최소제곱 문제

$$
\begin{align} \min\_{\boldsymbol{\beta}} |\mathbf{y} - \mathbf{X}\boldsymbol{\beta}|^2 \end{align}
$$

는

$$
\begin{align} \min\_{\boldsymbol{\beta}} |\mathbf{y} - \mathbf{Q}\mathbf{R}\boldsymbol{\beta}|^2 \end{align}
$$

로 바뀐다. $\mathbf{Q}$가 직교행렬이면 $\mathbf{Q}^T\mathbf{Q} = \mathbf{I}$이므로, $\mathbf{Q}^T(\mathbf{y} - \mathbf{Q}\mathbf{R}\boldsymbol{\beta})$로 간단히 만들 수 있고,

$$
\begin{align} \boldsymbol{\beta}  = \mathbf{R}^{-1}\mathbf{Q}^T\mathbf{y}. \end{align}
$$

를 통해 해석할 수 있다. 이는 $\mathbf{X}^T \mathbf{X}$의 역을 구하는 것보다 수치적으로 훨씬 안정적이며, 큰 규모의 문제에서도 효과적이다.

#### 특잇값분해(SVD) 기반 회귀

대규모(또는 결측이 많은) 문제나 강한 다중공선성이 있는 문제에 대해서는 특잇값분해(SVD, Singular Value Decomposition)가 더욱 유용하다. 설계행렬 $\mathbf{X}$를

$$
\begin{align} \mathbf{X} = \mathbf{U}\mathbf{\Sigma}\mathbf{V}^T \end{align}
$$

로 분해한다고 할 때, $\mathbf{U}$는 직교행렬(크기 $n \times n$), $\mathbf{\Sigma}$는 대각요소가 특잇값(singular value)인 대각행렬(크기 $n \times p$), $\mathbf{V}$는 직교행렬(크기 $p \times p$)이다. 최소제곱 해는

$$
\begin{align} \hat{\boldsymbol{\beta}} = \mathbf{V} \mathbf{\Sigma}^+ \mathbf{U}^T \mathbf{y} \end{align}
$$

가 되며, 여기서 $\mathbf{\Sigma}^+$는 $\mathbf{\Sigma}$의 무어-펜로즈(Moore–Penrose) 유사역행렬(pseudoinverse)이다. 특잇값이 매우 작은 경우가 있으면 이를 잘라내거나(Truncated SVD), Ridge나 Lasso와 결합하여 정규화 효과를 낼 수도 있다. SVD는 수학적으로 안정적이고, 다중공선성이 심할 때(또는 $\mathbf{X}^T\mathbf{X}$가 거의 특이행렬에 가까울 때) 유리한 접근이다.

#### 대규모 데이터 회귀

빅데이터나 고차원 데이터에서 전통적인 OLS(Ordinary Least Squares) 계산이 매우 부담스러워지는 경우가 많다. 이때는 미니배치 확률적 경사하강법(SGD)이나, 좌표강하법(coordinate descent), 온라인 학습 기법 등을 적용할 수 있다. 모든 데이터를 메모리에 올리지 않고도 부분적으로 업데이트하며 회귀계수를 학습한다. 여기에 L1/L2 정규화를 더해 Lasso 또는 Ridge 형태를 채택해도 된다.

대규모 데이터에서는 정교한 수치기법뿐만 아니라, 효율적인 분산처리(예: MapReduce)나 병렬 계산 방식도 고려하여 회귀모형을 훈련한다. 분산환경(스파크, 하둡 등)에서 동작하는 라이브러리가 이미 구현되어 있으므로, 적절히 활용하는 편이 좋다.

#### 추가 예시(Octave, QR 분해를 통한 회귀)

```octave
X = [1,1; 1,2; 1,3; 1,4; 1,5];
y = [2.3; 3.1; 4.9; 6.2; 7.7];

[Q,R] = qr(X,0);  % 얇은 QR 분해
% 최소제곱해: beta = R \ (Q' * y)
beta_hat_qr = R \ (Q' * y);

disp("QR 분해로 구한 회귀계수 추정값:");
disp(beta_hat_qr);
```

에서 `qr(X,0)`는 X를 (m×n)에서 (n×n)으로 이어지는 전체가 아닌, 얇은 QR(thin QR) 분해를 수행한다. 이후 적합값 $\hat{\boldsymbol{\beta}}$를 구하면 일반적인 정규방정식 결과와 동일하지만, 수치 안정성 면에서 이점이 있을 수 있다.

#### 고차원·희소 데이터와 회귀

다중선형회귀에서 독립변수 개수 $p$가 관측 수 $n$보다 훨씬 많아지는 고차원(high-dimensional) 상황이 발생할 수 있다. 예컨대 유전자 데이터를 이용한 질병 예측, 이미지·자연어 처리 등에서 수십만, 수백만 개의 특성이 취합되는 사례가 존재한다. 이때 전통적인 OLS 방식은 $\mathbf{X}^T \mathbf{X}$의 차원이 너무 커서 계산이 어렵거나, 극심한 다중공선성으로 모형이 제대로 작동하지 않게 된다.

이를 극복하기 위해 정규화(Regularization)나 차원 축소(Dimension Reduction) 기법을 필수적으로 고려해야 한다. 특히 Lasso는 변수 선택 효과를 통해 계수 중 상당수를 0으로 만들어 ‘희소(sparse) 해’를 제공하므로, 해석과 예측 양면에서 큰 도움이 된다. 예를 들어 유전자 마이크로어레이(microarray) 연구에서 천문학적으로 많은 후보 유전자의 영향력을 동시에 평가해야 할 때, Lasso가 핵심 유전자 집합을 찾아내는 좋은 도구로 쓰일 수 있다.

차원 축소를 위한 PCA, PLS, SVD 등도 고차원 문제에서 널리 활용된다. 많은 특성들이 서로 강한 상관관계를 보이는 상황에서, 실제로 유의미한 주성분을 몇 개만 추출해 회귀를 수행함으로써 성능을 높이고 계산 부담을 줄일 수 있다.

#### 범주형 독립변수와 더미변수

회귀모형에서 독립변수가 범주형(categorical) 변수인 경우를 자주 볼 수 있다. 예컨대 제품의 종류(“A” “B” “C”), 교육 수준(“고졸” “대졸” “석사 이상”) 등은 숫자가 아닌 텍스트·범주 형태다. 이런 변수를 그대로 회귀식에 넣을 수 없으므로, 더미변수(dummy variable) 혹은 가변수(indicator variable) 처리를 통해 0 또는 1 값으로 인코딩한다.

예컨대 범주가 3가지( “A” “B” “C”)라면, 2개의 더미변수를 만들어

* $D\_1 = 1$ if 범주=“A”, else 0
* $D2=1D\_2$ = 1 if 범주=“B”, else 0

로 코딩하면, “C”는 두 더미값이 모두 0인 상태로 표현된다. 이를 기저(baseline) 범주라고 하며, 회귀식에선 기저 범주 대비 “A”/“B”가 각각 얼마나 종속변수에 영향을 미치는지 분석하는 형태가 된다. 더미변수의 해석에 유의해야 하며, 범주가 $k$개라면 일반적으로 $k-1$개의 더미만 사용하는 것이 보통이다(완전다중공선성 방지를 위해).

범주형 변수가 단순명목(nominal) 변수가 아니라 순서가 있는 범주(ordinal) 변수를 나타낼 때는, 순서를 숫자로 매겨서 대체해볼 수도 있지만, 그 순서 자체가 선형적 영향을 나타내는지 미리 살펴야 한다.

#### 변수가 많은 경우의 범주형 처리: One-Hot Encoding

범주가 매우 많은 문자열 변수가 있을 때(예: 수백 개의 도시, 수천 개의 상품ID 등)는 One-Hot Encoding을 통해 범주의 개수만큼 더미변수를 생성해야 하고, 그 수가 폭발적으로 늘어날 수 있다. 이럴 때 L1 정규화(Lasso)나 트리 기반 모델(랜덤 포레스트, 그래디언트 부스팅 등)을 사용하는 것이 대안이 되기도 한다.

또 다른 기법으로는 범주를 적절히 통합(bin)하거나, 타깃 인코딩(target encoding)처럼 범주의 평균 응답값으로 치환하는 방법 등이 있으나, 그 과정에서 추가적인 편향(bias)이 발생하지 않도록 신중해야 한다.

#### 상호작용항(Interaction Term) 해석

다중선형회귀는 독립변수들이 선형 가중으로만 종속변수에 기여한다고 가정한다. 하지만 실제 현상에서는 “두 변수의 곱”이 종속변수에 큰 영향을 미치는 경우가 흔하다. 이를 반영하기 위해 상호작용(interaction) 항을 추가할 수 있다. 예컨대

$$
\begin{align} y = \beta\_0 + \beta\_1 x\_1 + \beta\_2 x\_2 + \beta\_{12} x\_1 x\_2 + \epsilon \end{align}
$$

같은 모형은 x1x\_1과 x2x\_2가 동시에 클 때 추가적으로 yy에 영향을 미치는 효과(β12x1x2\beta\_{12} x\_1 x\_2 항)를 고려한다. 특히 범주형 변수와 연속형 변수가 상호작용할 때, “특정 범주”에 대해만 기울기가 달라지는 구조를 표현할 수 있다.

다만 상호작용항을 과도하게 추가하면 모형이 복잡해지고 다중공선성 문제가 더 심해질 수 있다. 따라서 변수 선정과 마찬가지로, 상호작용항의 필요성을 도메인 지식이나 교차검증을 통해 신중히 판단해야 한다.

#### 예시(Python, 범주형 변수 처리)

```python
import numpy as np
import pandas as pd
import statsmodels.api as sm

# 예시 데이터: 범주형 변수 "color" (red, green, blue)
data = pd.DataFrame({
    'weight': [1.2, 2.0, 1.8, 3.2, 2.5, 3.1],
    'size':   [10, 15, 12, 18, 20, 25],
    'color':  ['red', 'red', 'blue', 'green', 'blue', 'red'],
    'price':  [5.1, 6.3, 7.0, 8.2, 7.5, 9.0]  # 종속변수
})

# 범주형 -> 더미변수 변환 (drop_first=True이면 baseline 범주를 자동으로 제거)
df_dummy = pd.get_dummies(data, columns=['color'], drop_first=True)
# df_dummy columns: weight, size, price, color_green, color_red
# (color_blue가 baseline 이 됨)

X = df_dummy[['weight', 'size', 'color_green', 'color_red']]
y = df_dummy['price']

X_const = sm.add_constant(X)
model = sm.OLS(y, X_const).fit()
print(model.summary())
```

위 코드는 ‘color’라는 범주형 변수를 더미 변환하고, 이를 포함하여 다중회귀를 적합한다. `drop_first=True`로 설정했으므로, 원래 범주 \[‘red’, ‘green’, ‘blue’] 중 ‘blue’가 baseline 범주가 되고, ‘color\_green’, ‘color\_red’가 더미변수로 생성된다. 결과 해석 시 $\beta\_{\text{color\_red}}$ 계수는 “blue 대비 red일 때의 평균적 영향 차이”를 나타낸다.
