# 잔차(Residual) 분석과 오차 분포 확인

#### 잔차의 정의

최소제곱법을 적용하여 어떤 모델을 추정하고 나면 관측값과 모델이 예측하는 값 사이의 차이가 생긴다. 이 차이를 잔차라고 부른다. 일반적으로 종속변수 관측값을 모아 놓은 벡터를 $\mathbf{y}$라 하고, 회귀 모델을 통해 예측된 값을 $\mathbf{\hat{y}}$라 할 때 잔차 벡터 $\mathbf{r}$은 다음과 같이 표현한다.

$$
\begin{align} \mathbf{r} &= \mathbf{y} - \mathbf{\hat{y}} \\
&= \mathbf{y} - \mathbf{X}\hat{\mathbf{b}} \end{align}
$$

여기에서 $\mathbf{X}$는 독립변수(설명변수)들의 정보를 행렬 형태로 정리한 것이며, $\hat{\mathbf{b}}$는 최소제곱법으로 추정한 계수 벡터다. 즉, 각 관측값 $y\_i$와 예측값 $\hat{y}\_i$의 차이 $r\_i = y\_i - \hat{y}\_i$를 모아 놓은 것이 $\mathbf{r}$이 된다.

#### 잔차와 오차(error)의 차이점

이론적으로 회귀분석에서 말하는 "오차(error)"는 모델에서 가정하는 확률적 오차항으로, 실제 모형에서 측정되지 않는 불확실성을 나타낸다. 반면 "잔차(residual)"는 실제 자료에서 관측된 값과 모델이 추정한 예측값의 실현된 차이이므로 유한 개의 샘플에 대해 직접 계산이 가능하다. 오차는 확률적 개념이고 잔차는 데이터로부터 직접 구해지는 구체적 값이라는 차이가 있다.

#### 잔차 분석의 필요성

최소제곱법으로 추정된 회귀 계수들은 모델에 설정된 몇 가지 가정, 예를 들어 오차의 정규성, 분산의 동일성(등분산성), 독립성 등을 만족한다는 전제하에서 통계적 추론의 유효성을 확보한다. 잔차 분석은 다음과 같은 측면에서 중요하다. 모델이 실제 자료를 잘 반영하고 있는지 점검할 수 있다. 정상성이나 등분산성, 독립성 같은 모형 가정에 대한 이상 여부를 확인할 수 있다. 자료 내 이상점(outlier)이나 영향점(influential point)을 파악하여 모델의 적합성을 재검토할 수 있다.

#### 잔차 그림(Residual Plot)을 통한 모델 적합도 점검

잔차를 시각화하여 모델이 데이터를 어떻게 설명하고 있는지 여부를 빠르게 확인할 수 있다. 잔차를 종속변수나 예측값 혹은 독립변수에 대해 플롯을 그려 보면 특정 패턴이 있는지 없는지를 판단하게 된다. 만약 잔차들이 무작위로 분포되어 있다면(즉, 아무런 패턴이 없다면) 기본적인 모델 가정에 부합할 가능성이 높다고 해석한다. 반면 잔차가 특정 곡선을 형성하거나, 특정 구간에서만 크게 편향되거나, 독립변수 값에 따라 잔차의 분산이 달라지는 현상이 나타나면 모델에 문제가 있을 수 있다.

#### 잔차의 정규성 가정

회귀분석(특히 선형 회귀)은 잔차가 정규분포를 따른다는 가정에 크게 의존한다. 실제로는 오차항이 정규분포를 갖는다고 가정하지만, 유한 표본에서 이를 직접 볼 수 있는 지표는 잔차이므로 잔차가 정규성을 어느 정도 만족하는지 살펴본다. 잔차가 정규분포를 따른다면 다음과 같은 성질을 기대할 수 있다.

$$
\begin{align} \mathbf{r} \sim \mathcal{N}\bigl(\mathbf{0},, \sigma^2\mathbf{I}\bigr) \end{align}
$$

일반적으로 $\sigma^2\mathbf{I}$의 형태로 표현되는 것은 잔차 벡터가 등분산을 가진 독립정규분포를 따른다는 모델 가정이다. 이를 시각적으로 검사하기 위해 잔차의 히스토그램, Q-Q(Quantile-Quantile) 플롯 등을 활용한다. Q-Q 플롯에서 잔차가 이상적으로 직선 형태에 가까우면 정규성을 만족할 가능성이 높다고 말한다.

#### 오차 분포 확인과 가정 위배 탐지

잔차 분석의 주요 목적 가운데 하나는 오차가 정규성을 가지지 않거나, 등분산성이 깨지거나, 독립적이지 않을 경우를 빠르게 탐지하는 것이다. 예를 들어 잔차가 이분산(heteroscedasticity) 현상을 보이면 독립변수의 어떤 구간에서 잔차가 크게 퍼지고 다른 구간에서 잔차가 작게 퍼지는 패턴이 나타나게 된다. 이때 단순 회귀 계수 추정은 여전히 불편추정량이 될 수 있어도 추정량의 분산이 불필요하게 커지거나 통계적 가설 검정 결과가 왜곡될 수 있으므로 모형 수정을 고려한다.

잔차가 독립적이지 않은 경우는 시계열 자료나 공간적 상관관계가 있는 데이터에서 자주 나타난다. 예측값이 시간에 따라 연속적으로 변하거나 지역적으로 가까운 데이터끼리 상관관계를 가지면, 잔차도 서로 상관관계를 가질 가능성이 생긴다. 이러한 오차 구조를 무시하고 단순 선형 회귀 모형을 적용하면, 유효성 있는 추론이 어려워진다.

#### 편차-분산 트레이드오프와 잔차 해석

최소제곱법은 잔차 제곱합을 최소화함으로써 편차(bias)와 분산(variance)의 균형을 추구한다. 이때 편차는 모델이 데이터의 평균적 특성을 얼마나 잘 설명하는지를 나타내고, 분산은 모델이 작은 변화에 얼마나 민감하게 반응하는지를 뜻한다. 잔차가 비정상적으로 크면 모델의 편차가 커지며, 반대로 잔차가 지나치게 데이터에 맞춰 "휘어져" 버리면(=과적합) 편차는 작아지나 분산이 커져 일반화 능력이 떨어진다.

#### 잔차 정규성 검정

시각적 방법(Q-Q 플롯)으로 대략적인 정규성 여부를 확인한 후, 좀 더 엄밀히 잔차의 정규성을 검정하기 위해서는 통계적 가설검정 기법을 사용할 수 있다. 일반적으로 샤피로-윌크(Shapiro-Wilk) 검정, 콜모고로프-스미르노프(Kolmogorov-Smirnov) 검정 등을 적용한다. 예컨대 샤피로-윌크 검정은 귀무가설을 "표본이 정규분포로부터 나왔다"로 설정하고, p-value가 매우 작다면 "표본이 정규분포가 아닐 가능성"이 높다는 결론을 내리게 된다. 이러한 검정은 표본 크기에 따라 민감도가 달라질 수 있으며, 정규성 가정이 위배되어도 많은 경우에 선형 회귀계수 추정 자체는 큰 문제가 없으나, 모형 해석과 추론(가령 신뢰구간, 가설검정 등)에서 왜곡이 발생할 가능성이 커진다.

#### 잔차의 등분산성 확인

등분산성 여부를 확인하는 데에는 여러 방법이 있지만, 간단하게는 잔차 대 예측값(또는 독립변수) 플롯을 관찰한다. 잔차가 예측값에 따라 패턴 없이 고르게 분포하면 등분산성을 가정해도 비교적 무리가 없다. 브레슐-파간(Breusch-Pagan) 검정이나 화이트(White) 검정 같은 통계적 접근으로도 등분산성 가정 위배 여부를 좀 더 정량적으로 확인할 수 있다.

#### 잔차의 독립성

시계열이나 공간 데이터에서 잔차의 독립성이 중요하다. 잔차가 서로 상관되어 있다면, 표준 회귀모형으로는 오차항이 독립임을 전제하는 Gauss-Markov 정리를 온전히 활용하기 어렵다. 자기상관을 포착하기 위해 듀빈-왓슨(Durbin-Watson) 검정을 사용하기도 한다. 자기상관이 나타나면 일반화된 선형모형이나 AR(오토리그레스) 항을 도입하여 종속성 구조를 고려해야 한다.

#### 이상점(Outlier)과 영향점(Influential Point)

선형 회귀분석에서 잔차를 살펴보면 특정 관측값이 다른 관측값들에 비해 지나치게 큰 잔차를 갖는 경우가 있다. 이를 이상점(outlier)이라고 한다. 이상점이 반드시 관측 오류나 노이즈만을 의미하는 것은 아니며, 종종 중요한 정보를 내포하고 있을 수도 있으므로 단순히 제거하거나 무시하기 전에 그 발생 원인을 충분히 탐색해야 한다.

한편 영향점(influential point)은 회귀계수 추정치 전체에 상당한 영향을 미치는 점을 말한다. 잔차가 크지 않아도 독립변수 공간에서 극단적인 위치에 있거나(=레버리지(leverage)가 큰 점), 응답값이 일반적인 경향과 크게 다르지 않아도 모델의 회귀 계수를 크게 바꾸어 놓을 수 있다. 이런 영향점을 파악하기 위해서는 잔차만 보는 것으로는 한계가 있으며, 레버리지, 쿠크의 거리(Cook’s distance) 등 다양한 진단 통계를 활용한다.

#### 잔차를 이용한 이상점 탐색

일반적으로 이상점을 판별하기 위해서는 다음과 같은 접근을 취할 수 있다(개념적으로 소개). 먼저 잔차 벡터 $\mathbf{r}$를 구한 뒤, 그 크기가 일정 기준(예: 평균 잔차의 표준편차를 몇 배 이상)보다 훨씬 큰 점이 있는지 살핀다. 또한 예측값 $\mathbf{\hat{y}}$와의 관계에서 극도로 벗어나는 점이 있는지, 독립변수 공간에서 다른 점과 멀리 떨어져 있는 점이 있는지를 확인한다. 모델 진단 결과 이상점이 모델 전체를 왜곡한다고 판단되면, 불량 데이터인지(관측 오류, 측정 오류, 데이터 입력 오류 등) 우선 진단하고, 필요하다면 제거하거나 다른 회귀 기법(예: Robust regression)으로 수정 보완할 수 있다.

#### 레버리지(Leverage)와 쿠크의 거리(Cook’s Distance)

이상점은 단순히 잔차만으로 파악하기 어렵고, 독립변수값이 극단적인 위치에 있는지도 함께 확인해야 한다. 레버리지(Leverage)는 독립변수 행렬 $\mathbf{X}$와 관련하여 관측값이 다른 점들의 평균적 패턴으로부터 얼마나 멀리 떨어져 있는지를 나타내는 개념이다. 레버리지가 큰 관측값은 모델에 큰 영향을 미칠 잠재력이 있다.

쿠크의 거리(Cook’s distance)는 특정 관측값을 제거했을 때 회귀계수 벡터 $\hat{\mathbf{b}}$가 얼마나 변하는가를 요약한 통계량이다. 만약 쿠크의 거리가 너무 크다면 그 관측값은 모델에 상당한 영향을 미친다는 의미이므로, 이를 영향점으로 의심하고 추가 점검을 해야 한다.

#### 변환(Transformation)을 통한 오차 분포 개선

잔차 분석을 통해 오차의 분산이 일정하지 않거나(이분산), 분포가 심각하게 비정규성에 기울어져 있다면 자료에 대한 적절한 변환을 고려할 수 있다. 대표적으로 응답값(종속변수)을 로그 변환, 제곱근 변환, 역변환 등으로 바꾸어 분산이 어느 정도 균일해질 수 있도록 유도한다. 예컨대 양의 값만 존재하는 종속변수인 경우 $\log(y)$ 변환이나 $\sqrt{y}$ 변환을 적용하여 잔차가 좀 더 정규 분포에 가까워지도록 할 수 있다.

혹은 독립변수에 대한 변환(예: 범위가 크게 다른 변수를 스케일링)으로도 모델 적합성이 개선될 때가 있다. 변환 자체가 이론적으로 정당화될 필요가 있으며, 단순히 정규성 가정을 만족하기 위해 기계적으로 변환만을 시도하면 모델 해석이 복잡해질 수 있으므로 주의한다.

#### 이상값에 대한 처리 - Robust Regression

이상점에 의해 최소제곱법이 심각하게 왜곡될 가능성이 크다면, 가중을 달리 주거나(가중 최소제곱법) 예측오차의 절댓값 합을 최소화하는 절대 편차 최소화(LAD: Least Absolute Deviations) 방법 등을 고려할 수 있다. 이러한 기법을 흔히 로버스트 회귀(Robust Regression)라 부른다. 예를 들어 Huber 손실함수, Tukey의 Bisquare 함수 등을 이용해 잔차가 일정 범위를 넘으면 오차에 대한 가중을 줄여서 추정값이 극단값에 덜 민감하도록 만든다. 이때 잔차 분석 역시 달라진 기준으로 해석해야 하며, 추정된 회귀계수의 통계적 성질도 일반 선형회귀와 다를 수 있다.

#### Python 예시 (잔차 분석 및 진단 통계)

아래는 Python에서 간단한 선형회귀 모델을 적합한 후 잔차를 시각화하고 Q-Q 플롯을 확인하며, 쿠크의 거리까지 계산하는 예시다. 예제 데이터는 임의로 생성된 것이므로, 실행 시마다 조금씩 달라질 수 있다.

```python
import numpy as np
import statsmodels.api as sm
import matplotlib.pyplot as plt

# 예제 데이터 생성 (임의로 설정)
np.random.seed(0)
x = np.linspace(0, 10, 30)
# 실제 모델 y = 2.0*x + 1.0 + 정규 오차
y_true = 2.0 * x + 1.0
noise = np.random.normal(loc=0, scale=2.0, size=len(x))
y_obs = y_true + noise

# 일부 이상점 추가
y_obs[5] += 15  # 인위적으로 이상값 부여
y_obs[25] -= 10

# 회귀분석
X = sm.add_constant(x)         # 절편항 추가
model = sm.OLS(y_obs, X).fit() # 최소제곱법으로 추정
print(model.summary())

# 잔차 계산
residuals = model.resid
fitted = model.fittedvalues

# 잔차 플롯
plt.figure(figsize=(6, 4))
plt.scatter(fitted, residuals)
plt.axhline(y=0, color='r', linestyle='--')
plt.xlabel('Fitted values')
plt.ylabel('Residuals')
plt.title('Residual Plot')
plt.show()

# Q-Q 플롯
fig = sm.qqplot(residuals, line='45', fit=True)
plt.title('Q-Q Plot of Residuals')
plt.show()

# 쿠크의 거리 계산
influence = model.get_influence()
cooks_d = influence.cooks_distance[0]

plt.figure(figsize=(6, 4))
plt.stem(np.arange(len(cooks_d)), cooks_d, markerfmt=",")
plt.title("Cook's Distance")
plt.xlabel('Index')
plt.ylabel("Cook's Distance")
plt.show()
```

위 코드에서는 statsmodels 라이브러리의 OLS(최소제곱법) 함수를 사용하여 선형회귀 모델을 적합한 뒤, 잔차와 예측값의 관계를 확인하고, Q-Q 플롯을 통해 정규성 가정이 어느 정도 들어맞는지를 시각적으로 살펴본다. 또한 `model.get_influence()` 메서드를 통해 쿠크의 거리를 계산하고, 이를 stem 그래프로 나타내 영향점 여부를 간단히 판단할 수 있다.

#### 표준화 잔차(Standardized Residual)와 학생화 잔차(Studentized Residual)

잔차 분석을 좀 더 정교하게 하기 위해서, 단순히 $r\_i = y\_i - \hat{y}\_i$만 사용하는 대신 표준화된 형태의 잔차를 사용하기도 한다. 표준화 잔차는 잔차에 대한 공분산 구조를 고려하여 서로 다른 관측값들 간의 상대적 크기를 비교하기 쉽게 만든 것이다. 회귀분석에서 추정된 잔차 공분산 행렬을 $\sigma^2(\mathbf{I} - \mathbf{H})$로 표현할 수 있는데, 여기서 $\mathbf{H}$는 Hat 행렬(또는 프로젝션 행렬)이라 불리는 $\mathbf{X}(\mathbf{X}^\top\mathbf{X})^{-1}\mathbf{X}^\top$이다. 잔차 벡터 $\mathbf{r}$에서 각 성분 $r\_i$를 다음과 같이 표준화하면 표준화 잔차(혹은 내부 학생화 잔차)라고 부른다.

$$
\begin{align} r\_i^\text{std} &= \frac{r\_i}{\sqrt{\hat{\sigma}^2, (1 - h\_i)}} \\
\hat{\sigma}^2 &= \frac{\mathbf{r}^\top\mathbf{r}}{n - p} \end{align}
$$

여기서 $h\_i$는 Hat 행렬 $\mathbf{H}$의 대각원소이며(즉, $h\_i = H\_{ii}$), $n$은 표본 개수, $p$는 추정 계수의 개수(절편 포함)다. 표준화 잔차를 사용하면 단순 잔차보다 관측값별로 공분산 구조가 반영되어 잔차가 얼마나 "이상치"인지 좀 더 공정하게 판단할 수 있다.

학생화 잔차는 어떤 관측값 $i$를 제거하고 나머지 $n-1$개의 관측값만으로 추정한 잔차 분산으로 표준화한 것으로, 외부 학생화 잔차(externally studentized residual)라 부르기도 한다. 이는 관측값 $i$ 자체가 추정 과정에 영향을 주는 효과까지 제거하여 좀 더 보수적으로 "이상함"을 판별한다.

#### Hat 행렬과 레버리지

Hat 행렬 $\mathbf{H}$는 예측값 벡터를 잔차 벡터로부터 “투영”해 내는 데 사용되는 행렬이다. 직관적으로는 각 관측값을 예측값으로 투영할 때 얼마나 “영향력”을 행사하는지를 나타내는 지표다. 각 관측값에 대한 레버리지 $h\_i$가 큰 관측값은 독립변수 공간에서 극단적인 위치에 있다고 볼 수 있으며, 이런 점은 잔차가 다소 작아도 모델 전체에 큰 영향을 미치는 영향점이 될 가능성이 있다.

#### 부분잔차 플롯(Partial Residual Plot)과 구성요소+잔차 플롯(Component+Residual Plot)

다중회귀에서 특정 독립변수가 응답값에 미치는 관계를 시각적으로 확인하기 위해 부분잔차 플롯(혹은 구성요소+잔차 플롯)을 활용할 수 있다. 예를 들어 $y$를 종속변수, $x\_1, x\_2, \ldots, x\_k$를 독립변수라 하자. 그중 $x\_1$이 $y$에 미치는 효과를 단변량 그림처럼 보고 싶다면, 나머지 변수에 해당하는 부분을 회귀로 제거한 뒤 $x\_1$과 “잔차+보정항”을 함께 플롯한다.

구체적으로 $x\_1$을 제외한 모든 독립변수로 $y$를 설명한 후의 잔차에, $x\_1$에 대한 추정회귀선 항($\hat{\beta}\_1 x\_1$)을 다시 더해 주어, 마치 $x\_1$만으로 예측했을 때의 응답과 오차를 한눈에 볼 수 있도록 변환한 것이 부분잔차 플롯의 개념이다. 이를 통해 $x\_1$과 $y$의 관계가 비선형 형태인지, 혹은 특정 구간에서만 달라지는 패턴이 있는지 등을 파악하기 쉽다.

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

잔차 분석 과정에서 발견된 이분산성(heteroscedasticity)을 해결하기 위한 한 가지 방법은 오차의 분산이 서로 다른 관측값에게 가중치를 달리 부여하는 가중 최소제곱법(Weighted LS)을 적용하는 것이다. 오차항이 관측값 $i$에서 분산 $\sigma\_i^2$를 가진다고 가정하면, 다음과 같은 목적함수를 최소화한다.

$$
\begin{align} Q(\mathbf{b}) &= \sum\_{i=1}^n w\_i \bigl(y\_i - \mathbf{x}\_i^\top \mathbf{b} \bigr)^2 \end{align}
$$

여기서 $w\_i = \frac{1}{\sigma\_i^2}$가 된다. 즉, 분산이 큰 관측값은 그만큼 정확도가 낮다고 보고 적은 가중을 부여하며, 분산이 작은 관측값은 신뢰도가 높으므로 큰 가중을 부여한다. 이를 행렬 형태로 쓰면 다음과 같다.

$$
\begin{align} \hat{\mathbf{b}} &= \bigl(\mathbf{X}^\top \mathbf{W} \mathbf{X}\bigr)^{-1} \mathbf{X}^\top \mathbf{W} \mathbf{y} \end{align}
$$

여기서 $\mathbf{W}$는 대각성분이 $w\_i$인 $n \times n$ 대각행렬이다. 가중치가 주어지면 잔차도 당연히 $\mathbf{W}$에 의해 재조정되어야 하므로, 잔차 분석 시에도 이 가중 정보를 고려한다.

#### 견고 회귀(Robust Regression)과 M-추정(M-estimation)

가중 최소제곱법이 분산의 구조적 차이를 해결한다면, 로버스트 회귀는 이상치나 비정상 분포로 인해 최소제곱법이 취약해지는 상황을 완화하기 위한 기법이다.

로버스트 회귀는 “제곱” 오차를 최소화하는 대신, 잔차가 큰 지점에 덜 민감한 손실함수를 사용하여 추정한다. 예를 들어 Huber 손실함수 $\rho\_H(r)$는 잔차가 작을 때는 제곱오차 형태로, 일정 수준을 넘어가면 절댓값 형태로 전환함으로써 극단값의 영향을 제한한다. 이런 방식의 추정 방식을 M-추정(M-estimation)이라 부르며, 결과적으로 최솟값을 구할 때(=회귀계수를 추정할 때) 이상점의 영향이 줄어든다.

잔차 분석 역시 M-추정 기반으로 구한 잔차를 기준으로 이루어져야 하므로, 해석 시 최소제곱법과는 다른 지표나 기준을 참조하기도 한다.

#### 이상현상에 대한 종합적인 대처

잔차 분석으로부터 다음과 같은 이상현상을 발견할 수 있다. (1) 잔차가 심한 비정규 분포를 보인다. (2) 잔차의 분산이 일정하지 않아 이분산성을 띤다. (3) 잔차가 자기상관 등을 일으키며 독립성이 위배된다. (4) 이상점 혹은 영향점이 존재한다. (5) 다중공선성으로 인해 잔차가 특정 방향으로 왜곡된다.

이런 문제에 대응하여 변수를 변환하거나, 가중 최소제곱법 또는 로버스트 회귀로 대체하거나, ARIMA 계열 모형(시계열 분석)이나 공간 통계모형 등을 적용한다. 다중공선성은 잔차 분석만으로는 바로 확인하기 어려우므로 분산팽창계수(VIF) 등의 추가 진단이 필요하다.

잔차 분석은 최소제곱 추정이 기본적으로 요구하는 모델 가정을 검토하기 위한 중요한 도구다. 그러나 모형 수립 과정에서 가정 위배나 이상치를 모두 제거하기보다는 문제의 원인을 파악하고 더 타당한 모형을 구축하기 위한 디딤돌로 삼는 것이 바람직하다.
