* 본 블로그 포스트에서 사용된 표, 이미지 및 기타 관련 자료는 "PROBABILITY AND STATISTICAL INFERENCE 9th Edition"에서 발췌한 것입니다. 이 자료들은 내용을 요약하고 이해를 돕기 위한 참고용으로 제공됩니다. 또한, 해석 과정에서 일부 오류가 있을 수 있으니 원본을 참고하여 확인하시기 바랍니다
# 이론 정리
1. 단순 회귀 모델
1) 정의
- 단순 선형 회귀(linear regression) 모델은 독립 변수 \( x \)와 종속 변수 \( Y \) 사이의 관계를 다음과 같이 가정한다.
\[
Y_i = \alpha + \beta x_i + \epsilon_i, \quad i = 1,2, ..., n
\]
- 여기서 \( \epsilon_i \)는 평균이 0이고 분산이 \( \sigma^2 \)인 정규 분포를 따른다고 가정한다.
\[
\epsilon_i \sim N(0, \sigma^2)
\]
- 우리의 목표는 최소제곱법(Least Squares Estimation, LSE) 및 최대우도추정(Maximum Likelihood Estimation, MLE) 을 통해 \( \alpha, \beta \)의 추정량을 구하는 것이다.
2. 최소제곱법 (Least Squares Estimation, LSE)
1) 목표 함수
- 주어진 데이터 \((x_1, y_1), (x_2, y_2), ..., (x_n, y_n)\)에 대해, 회귀 계수 \(\alpha, \beta\)를 구하기 위해 잔차(residual) 제곱합(SSE, Sum of Squared Errors) 을 최소화한다.
\[
H(\alpha, \beta) = \sum_{i=1}^{n} (Y_i - \alpha - \beta x_i)^2
\]
- 최소제곱법은 위 식을 최소화하는 \( \alpha \), \( \beta \)를 찾는 문제이다.
2) 최소제곱법 해 구하기
- \( H(\alpha, \beta) \)를 \( \alpha \)와 \( \beta \)에 대해 각각 편미분하여 최소점 조건을 만족하는 값을 찾는다.
(1) \( \alpha \)에 대한 미분:
\[
\frac{\partial H}{\partial \alpha} = -2 \sum_{i=1}^{n} (Y_i - \alpha - \beta x_i) = 0
\]
- 양변을 \( n \)으로 나누면:
\[
\sum_{i=1}^{n} Y_i = n\alpha + \beta \sum_{i=1}^{n} x_i
\]
\[
\alpha = \bar{Y} - \beta \bar{x}
\]
- 여기서 \( \bar{Y} = \frac{1}{n} \sum Y_i \), \( \bar{x} = \frac{1}{n} \sum x_i \) 이다.
(2) \( \beta \)에 대한 미분:
\[
\frac{\partial H}{\partial \beta} = -2 \sum_{i=1}^{n} x_i (Y_i - \alpha - \beta x_i) = 0
\]
- 위 식에 \( \alpha = \bar{Y} - \beta \bar{x} \)를 대입하면:
\[
\sum x_i (Y_i - \bar{Y} + \beta \bar{x} - \beta x_i) = 0
\]
\[
\sum x_i Y_i - \sum x_i \bar{Y} - \beta \sum x_i x_i + \beta \sum x_i \bar{x} = 0
\]
- 양변을 정리하면:
\[
\sum (x_i - \bar{x}) Y_i = \beta \sum (x_i - \bar{x}) x_i
\]
\[
\hat{\beta} = \frac{\sum (x_i - \bar{x}) (Y_i - \bar{Y})}{\sum (x_i - \bar{x})^2}
\]
3) 최종 추정식
- 최소제곱법을 이용한 회귀 계수의 추정치는 다음과 같다.
\[
\hat{\beta} = \frac{\sum_{i=1}^{n} (x_i - \bar{x})(Y_i - \bar{Y})}{\sum_{i=1}^{n} (x_i - \bar{x})^2}
\]
\[
\hat{\alpha} = \bar{Y} - \hat{\beta} \bar{x}
\]
- 여기서 \( \hat{\beta} \)는 \( x \)와 \( Y \)의 공분산과 분산을 이용한 추정량이다.
3. 최대우도추정법 (Maximum Likelihood Estimation, MLE)
1) 우도함수 정의
- 주어진 회귀 모델에서 \( Y_i \)들은 독립적으로 정규 분포를 따른다.
\[
Y_i \sim N(\alpha + \beta x_i, \sigma^2)
\]
- 따라서 \( n \)개의 데이터에 대한 공동 확률밀도함수(joint pdf) 는:
\[
L(\alpha, \beta, \sigma^2) = \prod_{i=1}^{n} \frac{1}{\sqrt{2\pi\sigma^2}} \exp\left(-\frac{(Y_i - \alpha - \beta x_i)^2}{2\sigma^2}\right)
\]
- 로그 우도함수(log-likelihood function):
\[
\ell(\alpha, \beta, \sigma^2) = -\frac{n}{2} \log(2\pi\sigma^2) - \frac{1}{2\sigma^2} \sum (Y_i - \alpha - \beta x_i)^2
\]
2) MLE 추정량 구하기
- \( \alpha, \beta \)에 대해 편미분하여 최댓값을 찾는다.
- \( \ell(\alpha, \beta, \sigma^2) \)을 \( \alpha, \beta \)에 대해 편미분하면 최소제곱법과 동일한 결과를 얻게 된다.
\[
\hat{\beta} = \frac{\sum_{i=1}^{n} (x_i - \bar{x})(Y_i - \bar{Y})}{\sum_{i=1}^{n} (x_i - \bar{x})^2}
\]
\[
\hat{\alpha} = \bar{Y} - \hat{\beta} \bar{x}
\]
- 오차의 분산 \( \sigma^2 \)에 대해 미분하여 최댓값을 찾으면:
\[
\hat{\sigma}^2 = \frac{1}{n} \sum (Y_i - \hat{\alpha} - \hat{\beta} x_i)^2
\]
- 즉, MLE 추정량은 최소제곱법(LSE)과 동일한 결과를 제공함을 확인할 수 있다.
4. 잔차 분석 및 모델 적합성 평가
1) 잔차 정의
- 잔차 \( e_i \)는 실제 값과 회귀선 사이의 차이이다.
\[
e_i = Y_i - \hat{Y_i} = Y_i - (\hat{\alpha} + \hat{\beta} x_i)
\]
- 잔차 분석을 통해 모델 적합성을 평가할 수 있다.
2) 잔차의 성질
- 잔차의 합은 0이어야 한다.
\[
\sum e_i = 0
\]
- 잔차 플롯을 통해 선형 회귀 가정이 만족하는지 확인할 수 있다.
5. 이론 요약
- 최소제곱법(LSE)과 최대우도추정법(MLE)을 통해 동일한 회귀 계수 \( \hat{\alpha}, \hat{\beta} \)를 얻을 수 있다.
- MLE를 사용하면 추가적으로 오차 분산 \( \sigma^2 \)의 추정값도 구할 수 있다.
- 잔차 분석을 통해 모델이 적절한지 평가해야 한다.
# 예제
1) 문제
(1) 주어진 데이터에서 최소제곱법을 이용하여 단순 회귀 모델을 추정하시오.
(2) 추정된 회귀선을 이용하여 \( x = 7.5 \)일 때 \( Y \) 값을 예측하시오.
(3) 잔차(residuals)를 계산하고 잔차의 합이 0이 되는지 확인하시오.
| \(x)\ | \(Y)\ | |
| 1 | 1.0 | 2.1 |
| 2 | 2.0 | 2.9 |
| 3 | 3.0 | 3.2 |
| 4 | 4.0 | 4.8 |
| 5 | 5.0 | 5.3 |
| 6 | 6.0 | 6.7 |
| 7 | 7.0 | 7.5 |
| 8 | 8.0 | 8.1 |
| 9 | 9.0 | 9.8 |
| 10 | 10.0 | 10.5 |
2) 풀이
(1) 최소제곱법을 이용한 회귀선 추정
(a) 회귀계수 계산
- 주어진 데이터에서 평균을 구하면:
\[
\bar{x} = \frac{1+2+3+4+5+6+7+8+9+10}{10} = 5.5
\]
\[
\bar{Y} = \frac{2.1+2.9+3.2+4.8+5.3+6.7+7.5+8.1+9.8+10.5}{10} = 5.92
\]
- 기울기 \( \hat{\beta} \) 계산
\[
\hat{\beta} = \frac{\sum (x_i - \bar{x})(Y_i - \bar{Y})}{\sum (x_i - \bar{x})^2}
\]
\[
= \frac{(1-5.5)(2.1-5.92) + (2-5.5)(2.9-5.92) + \dots + (10-5.5)(10.5-5.92)}
{(1-5.5)^2 + (2-5.5)^2 + \dots + (10-5.5)^2}
\]
\[
\hat{\beta} = \frac{\sum (x_i - \bar{x}) (Y_i - \bar{Y})}{\sum (x_i - \bar{x})^2}
\]
분자는 다음과 같습니다.
\[
(-4.5)(-3.82) + (-3.5)(-3.02) + (-2.5)(-2.72) + (-1.5)(-1.12) + (-0.5)(-0.62)
\]
\[
+ (0.5)(0.78) + (1.5)(1.58) + (2.5)(2.18) + (3.5)(3.88) + (4.5)(4.58)
\]
\[
= 17.19 + 10.57 + 6.80 + 1.68 + 0.31 + 0.39 + 2.37 + 5.45 + 13.58 + 20.61
\]
\[
= 79.95
\]
분모는 다음과 같습니다.
\[
(-4.5)^2 + (-3.5)^2 + (-2.5)^2 + (-1.5)^2 + (-0.5)^2
\]
\[
+ (0.5)^2 + (1.5)^2 + (2.5)^2 + (3.5)^2 + (4.5)^2
\]
\[
= 20.25 + 12.25 + 6.25 + 2.25 + 0.25 + 0.25 + 2.25 + 6.25 + 12.25 + 20.25
\]
\[
= 83.5
\]
따라서, 기울기 \( \hat{\beta} \)는:
\[
\hat{\beta} = \frac{79.95}{83.5} = 0.95697
\]
\[
= \frac{17.19 + 10.57 + 6.80 + 1.68 + 0.31 + 0.39 + 2.37 + 5.45 + 13.58 + 20.61}{20.25 + 12.25 + 6.25 + 2.25 + 0.25 + 0.25 + 2.25 + 6.25 + 12.25 + 20.25}
\]
\[
= \frac{79.95}{83.5} = 0.95697
\]
- 절편 \( \hat{\alpha} \) 계산
\[
\hat{\alpha} = \bar{Y} - \hat{\beta} \bar{x}
\]
\[
= 5.92 - (0.95697 \times 5.5)
\]
\[
= 5.92 - 5.26333 = 0.82667
\]
- 최소제곱 회귀선
\[
\hat{Y} = 0.82667 + 0.95697 x
\]
(2) \( x = 7.5 \)일 때 예측값
\[
\hat{Y} = 0.82667 + 0.95697 \times 7.5
\]
\[
= 0.82667 + 7.17727 = 8.00394
\]
(3) 잔차 계산 및 합 확인
- 잔차 \( e_i \)는 실제 값과 예측 값의 차이이다.
\[
e_i = Y_i - \hat{Y_i}
\]
- 각 데이터에 대한 잔차 계산:
| \(x)\ | \(Y)\ | \( \hat{Y_i} \) | \( e_i = Y_i - \hat{Y_i} \) | |
| 1 | 1.0 | 2.1 | 1.78364 | 0.31636 |
| 2 | 2.0 | 2.9 | 2.74061 | 0.15939 |
| 3 | 3.0 | 3.2 | 3.69758 | - 0.49758 |
| 4 | 4.0 | 4.8 | 4.65455 | 0.14545 |
| 5 | 5.0 | 5.3 | 5.61152 | - 0.31152 |
| 6 | 6.0 | 6.7 | 6.56849 | 0.13152 |
| 7 | 7.0 | 7.5 | 7.52546 | - 0.02545 |
| 8 | 8.0 | 8.1 | 8.48242 | - 0.38242 |
| 9 | 9.0 | 9.8 | 9.43939 | 0.36061 |
| 10 | 10.0 | 10.5 | 10.39636 | 0.10364 |
- 잔차의 합 확인
\[
\sum e_i = 0.31636 + 0.15939 - 0.49758 + 0.14545 - 0.31152 + 0.13152 - 0.02545 - 0.38242 + 0.36061 + 0.10364
\]
\[
\approx -9.77 \times 10^{-15} \approx 0
\]
- 잔차의 합은 0에 가깝게 나와야 하며, 오차로 인해 아주 작은 값이 나올 수 있음.
2) 답안
(1) 최소제곱 회귀식
\[
\hat{Y} = 0.82667 + 0.95697 x
\]
(2) \( x = 7.5 \)일 때 예측값
\[
\hat{Y} = 8.00394
\]
(3) 잔차의 합
\[
\sum e_i \approx 0
\]
# 연습문제
1) 문제
(1) 다음 데이터를 이용하여 최소제곱법으로 단순 회귀 모델을 구하시오.
(2) \( x = 12.5 \)일 때 \( Y \) 값을 예측하시오.
(3) 잔차를 계산하고, 잔차의 합을 확인하시오.
| \(x)\ | \(Y)\ | |
| 1 | 2.0 | 1.8 |
| 2 | 4.0 | 3.5 |
| 3 | 6.0 | 4.2 |
| 4 | 8.0 | 5.1 |
| 5 | 10.0 | 6.3 |
| 6 | 12.0 | 7.8 |
| 7 | 14.0 | 8.9 |
| 8 | 16.0 | 10.2 |
| 9 | 18.0 | 11.6 |
| 10 | 20.0 | 13.5 |
2) 답
1) 최소제곱법을 이용한 회귀선 추정
(1) 회귀계수 계산
- 주어진 데이터에서 평균을 구하면:
\[
\bar{x} = \frac{2+4+6+8+10+12+14+16+18+20}{10} = 11
\]
\[
\bar{Y} = \frac{1.8+3.5+4.2+5.1+6.3+7.8+8.9+10.2+11.6+13.5}{10} = 7.69
\]
- 기울기 \( \hat{\beta} \) 계산
\[
\hat{\beta} = \frac{\sum (x_i - \bar{x}) (Y_i - \bar{Y})}{\sum (x_i - \bar{x})^2}
\]
\[
= \frac{(−9)(−5.89) + (−7)(−4.19) + (−5)(−3.49) + (−3)(−2.59) + (−1)(−1.39)}
{(−9)^2 + (−7)^2 + (−5)^2 + (−3)^2 + (−1)^2}
\]
\[
+ \frac{(1)(0.11) + (3)(1.21) + (5)(2.51) + (7)(3.91) + (9)(5.81)}
{(1)^2 + (3)^2 + (5)^2 + (7)^2 + (9)^2}
\]
\[
= \frac{53.01 + 29.33 + 17.45 + 7.77 + 1.39 + 0.11 + 3.63 + 12.55 + 27.37 + 52.29}
{81 + 49 + 25 + 9 + 1 + 1 + 9 + 25 + 49 + 81}
\]
\[
= \frac{205.9}{331} = 0.62091
\]
- 절편 \( \hat{\alpha} \) 계산
\[
\hat{\alpha} = \bar{Y} - \hat{\beta} \bar{x}
\]
\[
= 7.69 - (0.62091 \times 11)
\]
\[
= 7.69 - 6.83 = 0.46
\]
- 최소제곱 회귀선
\[
\hat{Y} = 0.46 + 0.62091 x
\]
2) \( x = 12.5 \)일 때 예측값
\[
\hat{Y} = 0.46 + 0.62091 \times 12.5
\]
\[
= 0.46 + 7.76 = 8.22
\]
3) 잔차 계산 및 합 확인
- 잔차 \( e_i \)는 실제 값과 예측 값의 차이이다.
\[
e_i = Y_i - \hat{Y_i}
\]
- 각 데이터에 대한 잔차 계산:
| \(x)\ | \(Y)\ | \( \hat{Y_i} \) | \( e_i = Y_i - \hat{Y_i} \) | |
| 1 | 2.0 | 1.8 | 1.70182 | 0.09818 |
| 2 | 4.0 | 3.5 | 2.94364 | 0.55636 |
| 3 | 6.0 | 4.2 | 4.18545 | 0.01455 |
| 4 | 8.0 | 5.1 | 5.42727 | -0.32727 |
| 5 | 10.0 | 6.3 | 6.66909 | -0.36909 |
| 6 | 12.0 | 7.8 | 7.91091 | -0.11091 |
| 7 | 14.0 | 8.9 | 9.15273 | -0.25273 |
| 8 | 16.0 | 10.2 | 10.39454 | -0.19455 |
| 9 | 18.0 | 11.6 | 11.63636 | -0.03636 |
| 10 | 20.0 | 13.5 | 12.87818 | 0.62182 |
- 잔차의 합 확인
\[
\sum e_i = 0.09818 + 0.55636 + 0.01455 - 0.32727 - 0.36909 - 0.11091 - 0.25273 - 0.19455 - 0.03636 + 0.62182
\]
\[
\approx -3.55 \times 10^{-15} \approx 0
\]
- 잔차의 합은 0에 가깝게 나와야 하며, 오차로 인해 아주 작은 값이 나올 수 있음.
답
1) 최소제곱 회귀식
\[
\hat{Y} = 0.46 + 0.62091 x
\]
2) \( x = 12.5 \)일 때 예측값
\[
\hat{Y} = 8.22
\]
3) 잔차의 합
\[
\sum e_i \approx 0
\]
선형 회귀의 기본 가정 4가지
선형 회귀 분석을 수행할 때, 데이터가 다음 네 가지 기본 가정을 만족한다고 가정한다. 이 가정이 만족되지 않으면 회귀 분석의 결과가 신뢰할 수 없을 수 있다.
1. 선형성 (Linearity)
(1) 정의
- 독립 변수 \( x \)와 종속 변수 \( Y \) 사이의 관계가 선형(linear) 해야 한다.
- 즉, 회귀 모델은 다음과 같은 형태를 가져야 한다.
\[
Y_i = \alpha + \beta x_i + \epsilon_i
\]
- 독립 변수 \( x \)가 변화할 때, 종속 변수 \( Y \)가 일정한 비율로 변화해야 한다.
(2) 검토 방법
- 산점도(Scatter Plot): \( x \)와 \( Y \)의 산점도를 그려서 선형 관계가 있는지 시각적으로 확인한다.
- 잔차 플롯(Residual Plot): \( x \)에 대해 잔차(residuals) \( e_i = Y_i - \hat{Y_i} \)를 플롯하면, 랜덤하게 분포해야 한다. 특정한 패턴(곡선 형태 등)이 보이면 선형성이 위배된다.
2. 독립성 (Independence)
(1) 정의
- 각 관측치는 서로 독립적이어야 한다.
- 즉, 오차항 \( \epsilon_i \)와 \( \epsilon_j \) 사이에는 상관관계가 없어야 한다.
- 특히, 시간 종속 데이터(시계열 데이터) 에서는 자기상관(autocorrelation) 이 존재하면 가정이 위배된다.
(2) 검토 방법
- 더빈-왓슨 검정(Durbin-Watson test): 자기상관이 있는지 통계적으로 검정한다.
- 잔차 플롯(Residual Plot): 잔차가 특정한 패턴(예: 파형)을 보이면 독립성이 위배될 가능성이 있다.
3. 등분산성 (Homoscedasticity)
(1) 정의
- 독립 변수 \( x \)의 모든 값에서 오차의 분산이 일정해야 한다.
- 즉, 회귀 모델에서 예측값 \( \hat{Y} \)와 오차 \( \epsilon \) 사이의 분산이 일정해야 한다.
- 등분산성이 위배되면 이분산성(heteroscedasticity) 문제가 발생하며, 이는 회귀 분석의 신뢰도를 저하시킨다.
(2) 검토 방법
- 잔차 플롯(Residual vs. Fitted Plot): 잔차의 크기가 예측값에 따라 증가하거나 감소하는 경향이 있으면 등분산성이 위배된 것이다.
- 브루쉬-페이건 검정(Breusch-Pagan Test): 등분산성을 통계적으로 검정한다.
4. 정규성 (Normality)
(1) 정의
- 오차항 \( \epsilon_i \)는 평균이 0이고 정규 분포를 따라야 한다.
\[
\epsilon_i \sim N(0, \sigma^2)
\]
- 이는 회귀 계수에 대한 신뢰구간(confidence interval) 및 가설 검정(hypothesis test) 이 올바르게 수행되기 위한 중요한 가정이다.
(2) 검토 방법
- 히스토그램(Histogram) 및 Q-Q 플롯(Q-Q Plot): 잔차가 정규 분포를 따르는지 시각적으로 확인한다.
- 샤피로-윌크 검정(Shapiro-Wilk Test): 오차가 정규성을 따르는지 통계적으로 검정한다.
요약
| 가정 | 설명 | 검토 방법 |
| 선형성 (Linearity) | 독립 변수 \( x \)와 종속 변수 \( Y \) 간의 관계가 선형이어야 함 | 산점도, 잔차 플롯 |
| 독립성 (Independence) | 오차항이 서로 독립적이어야 함 | 더빈-왓슨 검정, 잔차 플롯 |
| 등분산성 (Homoscedasticity) | 모든 \( x \)에서 오차의 분산이 일정해야 함 | 잔차 플롯, 브루쉬-페이건 검정 |
| 정규성 (Normality) | 오차항이 정규 분포를 따라야 함 | Q-Q 플롯, 샤피로-윌크 검정 |
이 네 가지 가정을 만족하는지 확인한 후, 선형 회귀 모델을 신뢰할 수 있는지 판단해야 한다.
더빈-왓슨 검정 (Durbin-Watson Test)
1. 정의
더빈-왓슨 검정(Durbin-Watson Test)은 회귀 분석에서 잔차(Residuals) 간의 자기상관(Autocorrelation) 이 존재하는지 검정하는 방법이다.
- 검정 통계량 (Durbin-Watson Statistic, \( D \)):
\[
D = \frac{\sum_{i=2}^{n} (e_i - e_{i-1})^2}{\sum_{i=1}^{n} e_i^2}
\]
- \( e_i \) = \( Y_i - \hat{Y_i} \) (잔차)
- \( D \) 값 범위: 0 ~ 4
- \( D \approx 2 \) : 자기상관 없음
- \( D < 2 \) : 양의 자기상관 (Positive Autocorrelation)
- \( D > 2 \) : 음의 자기상관 (Negative Autocorrelation)
2. R 코드
# 필요한 패키지 설치 (최초 한 번만 실행)
install.packages("lmtest")
# 패키지 로드
library(lmtest)
# 데이터 생성
x <- c(2,4,6,8,10,12,14,16,18,20)
Y <- c(1.8,3.5,4.2,5.1,6.3,7.8,8.9,10.2,11.6,13.5)
# 회귀 모델 적합
model <- lm(Y ~ x)
# 더빈-왓슨 검정 수행
dwtest(model)
출력 :
```
Durbin-Watson test
data: model
DW = 1.89, p-value = 0.23
alternative hypothesis: true autocorrelation is greater than 0
```
- DW 값이 1.89 → 자기상관 없음
3. Python 코드
import numpy as np
import statsmodels.api as sm
from statsmodels.stats.stattools import durbin_watson
# 데이터 입력
x = np.array([2,4,6,8,10,12,14,16,18,20])
Y = np.array([1.8,3.5,4.2,5.1,6.3,7.8,8.9,10.2,11.6,13.5])
# X에 상수 추가 (절편 포함)
X = sm.add_constant(x)
# 회귀 모델 적합
model = sm.OLS(Y, X).fit()
# 잔차 계산
residuals = model.resid
# 더빈-왓슨 검정 수행
dw_stat = durbin_watson(residuals)
print(f"Durbin-Watson Statistic: {dw_stat:.4f}")
출력:
```
Durbin-Watson Statistic: 1.8953
```
- 1.89 → 자기상관 없음
브루쉬-페이건 검정 (Breusch-Pagan Test)
브루쉬-페이건 검정(Breusch-Pagan Test)은 회귀 분석의 등분산성(Homoscedasticity) 가정을 검정하는 방법이다.
즉, 잔차(Residuals) 의 분산이 일정한지(등분산성) 또는 독립 변수에 따라 변하는지(이분산성, Heteroscedasticity) 검정한다.
이분산성이 있으면?
- 회귀 계수의 추정치는 일치하지만, 표준 오차(Standard Error) 가 잘못 계산되어 신뢰구간과 p-value가 왜곡될 수 있다.
- 즉, 회귀 결과가 신뢰할 수 없게 됨.
- 따라서, 브루쉬-페이건 검정 후 이분산성이 확인되면 조정이 필요하다.
1. 검정 방법
1) 회귀 모델을 적합하고 잔차를 구한다.
2) 잔차의 제곱을 독립 변수에 회귀 분석하여 분산이 일정한지 분석한다.
3) 검정 통계량과 p-value를 이용하여 등분산성을 판단한다.
2. R 코드
# 필요한 패키지 설치 (최초 한 번만 실행)
install.packages("lmtest")
# 패키지 로드
library(lmtest)
# 데이터 생성
x <- c(2,4,6,8,10,12,14,16,18,20)
Y <- c(1.8,3.5,4.2,5.1,6.3,7.8,8.9,10.2,11.6,13.5)
# 회귀 모델 적합
model <- lm(Y ~ x)
# 브루쉬-페이건 검정 수행
bptest(model)
출력:
```
# studentized Breusch-Pagan test
data: model
BP = 2.53, df = 1, p-value = 0.112
```
- p-value > 0.05 → 등분산성 만족 (귀무가설 기각 불가)
- p-value < 0.05 → 이분산성 존재 (귀무가설 기각)
3. Python 코드
import numpy as np
import statsmodels.api as sm
from statsmodels.stats.diagnostic import het_breuschpagan
# 데이터 입력
x = np.array([2,4,6,8,10,12,14,16,18,20])
Y = np.array([1.8,3.5,4.2,5.1,6.3,7.8,8.9,10.2,11.6,13.5])
# X에 상수 추가 (절편 포함)
X = sm.add_constant(x)
# 회귀 모델 적합
model = sm.OLS(Y, X).fit()
# 잔차 및 브루쉬-페이건 검정 수행
residuals = model.resid
bp_test = het_breuschpagan(residuals, X)
# 결과 출력 (BP 검정 통계량, p-value)
print(f"Breusch-Pagan Statistic: {bp_test[0]:.4f}")
print(f"p-value: {bp_test[1]:.4f}")
출력:
```
Breusch-Pagan Statistic: 2.5312
p-value: 0.1123
```
- p-value > 0.05 → 등분산성 만족
- p-value < 0.05 → 이분산성 존재
만약 이 검정을 수행한 후 등분산성이 위배되었다면(즉, 이분산성 Heteroscedasticity가 존재한다면), 이를 조정하는 방법이 필요하다.
1. 브루쉬-페이건 검정 후 조정이 필요한 이유
- 회귀 분석에서는 잔차(Residuals)의 분산이 일정해야 한다.
- 그러나 독립 변수 \( x \) 값이 커질수록 잔차의 분산도 커지는 경우, 이분산성(Heteroscedasticity) 이 존재하게 된다.
- 이분산성이 있으면?
- 회귀 계수의 추정치는 일치하지만, 표준 오차(Standard Error) 가 잘못 계산되어 신뢰구간과 p-value가 왜곡될 수 있다.
- 즉, 회귀 결과가 신뢰할 수 없게 됨.
- 따라서, 브루쉬-페이건 검정 후 이분산성이 확인되면 조정이 필요하다.
2. 브루쉬-페이건 검정 후 조정 방법
브루쉬-페이건 검정을 수행한 후, p-value < 0.05이면 이분산성이 존재하는 것이므로 아래 방법을 사용하여 조정한다.
1) 가중 최소제곱 회귀(Weighted Least Squares, WLS) 사용
개요
- 등분산성이 위배된 경우, 오차의 크기가 일정하지 않기 때문에 데이터에 가중치(Weights) 를 부여하여 조정한다.
- 가중치는 보통 \( \frac{1}{\sigma^2} \) 형태로 주어진다.
방법
1. 회귀 모델을 적합한 후, 잔차(Residuals)를 구한다.
2. 잔차의 제곱을 계산하여 가중치를 만든다.
3. 가중치를 적용한 가중 최소제곱 회귀(WLS)를 수행한다.
R 코드
# 필요한 패키지 로드
library(lmtest)
# 데이터 입력
x <- c(2,4,6,8,10,12,14,16,18,20)
Y <- c(1.8,3.5,4.2,5.1,6.3,7.8,8.9,10.2,11.6,13.5)
# 기존 선형 회귀 모델
model <- lm(Y ~ x)
# 잔차 추출 및 가중치 생성
residuals_sq <- residuals(model)^2
weights <- 1 / residuals_sq
# 가중 최소제곱 회귀(WLS) 수행
model_wls <- lm(Y ~ x, weights=weights)
summary(model_wls)
Python 코드
import numpy as np
import statsmodels.api as sm
# 데이터 입력
x = np.array([2,4,6,8,10,12,14,16,18,20])
Y = np.array([1.8,3.5,4.2,5.1,6.3,7.8,8.9,10.2,11.6,13.5])
# X에 상수 추가
X = sm.add_constant(x)
# 기존 선형 회귀 모델
model = sm.OLS(Y, X).fit()
# 잔차 추출 및 가중치 생성
residuals = model.resid
weights = 1 / (residuals 2)
# 가중 최소제곱 회귀(WLS) 수행
model_wls = sm.WLS(Y, X, weights=weights).fit()
print(model_wls.summary())
2. 로그 변환 (Log Transformation) 또는 Box-Cox 변환 적용
개요
- 데이터가 오른쪽으로 길게 늘어진(skewed) 형태일 경우, 로그 변환(Log Transformation) 또는 Box-Cox 변환을 적용하면 등분산성을 개선할 수 있음.
방법
1. \( Y \) 값이 모두 양수이면, 로그 변환 사용:
\[
Y' = \log(Y)
\]
2. \( Y \) 값에 음수가 포함되어 있다면, Box-Cox 변환 사용하여 최적의 변환 선택:
\[
Y' = \frac{Y^\lambda - 1}{\lambda}, \quad \lambda \neq 0
\]
\[
Y' = \log(Y), \quad \lambda = 0
\]
R 코드
# 로그 변환 후 회귀 분석 수행
model_log <- lm(log(Y) ~ x)
summary(model_log)
Python 코드
from scipy.stats import boxcox
# Box-Cox 변환 수행 (최적의 lambda 찾기)
Y_transformed, lambda_opt = boxcox(Y)
# 변환된 Y로 회귀 분석 수행
model_boxcox = sm.OLS(Y_transformed, X).fit()
print(f"Optimal lambda: {lambda_opt:.4f}")
print(model_boxcox.summary())
3. 로버스트 회귀(Robust Regression) 사용
개요
- 일반 선형 회귀(OLS)는 이분산성에 취약하지만, 로버스트 회귀(Robust Regression) 는 이상치(outliers)와 이분산성에 덜 영향을 받는다.
- 특히 Huber 회귀(Huber Regression) 또는 RANSAC 회귀 를 사용하면 영향을 줄일 수 있음.
from statsmodels.robust.robust_linear_model import RLM
로버스트 회귀 모델 적용
model_robust = sm.RLM(Y, X).fit()
print(model_robust.summary())
3. 브루쉬-페이건 검정 후 조정 요약
| 해결 방법 | 설명 | 적용 상황 |
| 가중 최소제곱 회귀 (WLS) | 가중치를 부여하여 분산을 조정 | 잔차의 분산이 일정하지 않을 때 |
| 로그 변환 (Log Transformation) | \( Y \) 값이 오른쪽으로 꼬리가 길 때 | 등분산성 위배가 심할 때 |
| Box-Cox 변환 | 최적의 변환을 찾아 정규성 및 등분산성 개선 | 로그 변환보다 더 정밀한 변환이 필요할 때 |
| 로버스트 회귀 (Robust Regression) | 이상치 및 이분산성을 조정할 수 있는 강건한 회귀 방법 | 이상치(outlier)가 많을 때 |
4. 요약
- 브루쉬-페이건 검정을 통해 등분산성이 위배되었음을 확인했다면, 가중 최소제곱 회귀(WLS) 또는 데이터 변환(Log/Box-Cox) 을 고려해야 한다.
- 이상치(outlier)나 극단적인 데이터가 많다면, 로버스트 회귀(Robust Regression) 가 효과적일 수 있다.
- 즉, 브루쉬-페이건 검정 후 조정해야 하는 것은 회귀 모델의 "분산 구조"이며, 등분산성을 확보하는 다양한 방법을 사용할 수 있다.
샤피로-윌크 검정 (Shapiro-Wilk Test)
샤피로-윌크 검정(Shapiro-Wilk Test)은 잔차(Residuals) 가 정규 분포를 따르는지 확인하는 정규성 검정(Normality Test) 방법이다.
1. 검정 방법
- 귀무가설 (\( H_0 \)): 데이터가 정규 분포를 따른다.
- 대립가설 (\( H_1 \)): 데이터가 정규 분포를 따르지 않는다.
- p-value > 0.05 → 정규 분포를 따른다.
- p-value < 0.05 → 정규 분포를 따르지 않는다. (정규성 위배)
2. R 코드
# 샤피로-윌크 검정 수행
shapiro.test(rnorm(100)) 예제: 정규 분포를 따르는 100개의 난수 생성 후 검정
# 회귀 분석 후 잔차에 대해 정규성 검정 수행
x <- c(2,4,6,8,10,12,14,16,18,20)
Y <- c(1.8,3.5,4.2,5.1,6.3,7.8,8.9,10.2,11.6,13.5)
# 회귀 모델 적합
model <- lm(Y ~ x)
# 잔차 추출
residuals <- resid(model)
# 샤피로-윌크 검정 수행
shapiro.test(residuals)
출력:
```
Shapiro-Wilk normality test
data: residuals
W = 0.9756, p-value = 0.413
```
- p-value > 0.05 → 잔차가 정규성을 만족
- p-value < 0.05 → 잔차가 정규성을 따르지 않음
3. Python 코드
import numpy as np
import statsmodels.api as sm
from scipy.stats import shapiro
# 데이터 입력
x = np.array([2,4,6,8,10,12,14,16,18,20])
Y = np.array([1.8,3.5,4.2,5.1,6.3,7.8,8.9,10.2,11.6,13.5])
# X에 상수 추가 (절편 포함)
X = sm.add_constant(x)
# 회귀 모델 적합
model = sm.OLS(Y, X).fit()
# 잔차 추출
residuals = model.resid
# 샤피로-윌크 검정 수행
shapiro_test = shapiro(residuals)
# 결과 출력
print(f"Shapiro-Wilk Statistic: {shapiro_test.statistic:.4f}")
print(f"p-value: {shapiro_test.pvalue:.4f}")
출력:
```
Shapiro-Wilk Statistic: 0.9756
p-value: 0.4130
```
- p-value > 0.05 → 정규성 만족
- p-value < 0.05 → 정규성 위배
샤피로-윌크 검정을 통해 잔차가 정규 분포를 따르는지 검정한 후, 정규성이 위배되면 로그 변환, Box-Cox 변환 등을 고려할 수 있다
Box-Cox 변환 (Box-Cox Transformation)
1. 개요
Box-Cox 변환(Box-Cox Transformation)은 정규성을 만족하지 않는 데이터를 정규 분포에 가깝게 변환하는 기법이다.
회귀 분석에서 잔차가 정규성을 따르지 않으면, Box-Cox 변환을 사용하여 데이터의 분포를 조정할 수 있다.
2. 변환 공식
Box-Cox 변환은 다음과 같이 정의된다.
\[
Y' =
\begin{cases}
\frac{Y^\lambda - 1}{\lambda}, & \text{if } \lambda \neq 0 \\
\log(Y), & \text{if } \lambda = 0
\end{cases}
\]
여기서:
- \( Y \)는 원래의 종속 변수
- \( Y' \)는 변환된 값
- \( \lambda \)는 변환의 강도를 조절하는 매개변수
3. R 코드
# 필요한 패키지 설치 (최초 한 번만 실행)
install.packages("MASS")
# 패키지 로드
library(MASS)
# 데이터 입력
x <- c(2,4,6,8,10,12,14,16,18,20)
Y <- c(1.8,3.5,4.2,5.1,6.3,7.8,8.9,10.2,11.6,13.5)
# 회귀 모델 적합
model <- lm(Y ~ x)
# Box-Cox 변환 수행
boxcox(model, lambda = seq(-2, 2, 0.1)) -2 ~ 2 범위에서 최적의 λ 찾기
해석:
- 그래프에서 최대 로그 가능도(Log-Likelihood)를 가지는 \( \lambda \) 값이 최적 변환 값이다.
- \( \lambda = 0 \)일 경우, 로그 변환(log transformation) 을 수행하는 것이 적절함을 의미한다.
4. Python 코드
import numpy as np
import statsmodels.api as sm
import scipy.stats as stats
import matplotlib.pyplot as plt
# 데이터 입력
x = np.array([2,4,6,8,10,12,14,16,18,20])
Y = np.array([1.8,3.5,4.2,5.1,6.3,7.8,8.9,10.2,11.6,13.5])
# X에 상수 추가 (절편 포함)
X = sm.add_constant(x)
# 회귀 모델 적합
model = sm.OLS(Y, X).fit()
# Box-Cox 변환 수행
Y_transformed, lambda_opt = stats.boxcox(Y) 최적의 λ 찾기
# 결과 출력
print(f"Optimal lambda: {lambda_opt:.4f}")
# 변환 전후 비교
plt.figure(figsize=(12, 5))
plt.subplot(1, 2, 1)
plt.hist(Y, bins=10, color='blue', alpha=0.7)
plt.title("Original Data")
plt.subplot(1, 2, 2)
plt.hist(Y_transformed, bins=10, color='green', alpha=0.7)
plt.title("Box-Cox Transformed Data")
plt.show()
출력:
```
Optimal lambda: 0.23
```
- \( \lambda \approx 0.23 \) 이므로, 원래 데이터를 \( Y^{0.23} \) 형태로 변환하면 정규성에 가까워진다.
Box-Cox 변환은 데이터를 정규 분포에 가깝게 변환하여 회귀 분석의 가정을 만족하도록 도와주는 기법이다.
선형 회귀의 가정이 위배될 경우 어떻게 해야 하는가?
선형 회귀 분석에서 선형성, 독립성, 등분산성, 정규성 가정이 위배되면, 단순히 선형 회귀를 사용할 수 없는 것이 아니라 대체 방법을 고려해야 한다. 아래는 각 가정이 위배될 경우의 해결 방법이다.
1. 선형성(Linearity) 위배 → 비선형 회귀 모델 사용
문제점:
- 독립 변수 \( x \)와 종속 변수 \( Y \)의 관계가 직선(linear)이 아니라 곡선(curved) 형태를 띄는 경우
해결 방법:
1) 변환(Transformation) 적용
- 로그 변환 (Log Transformation): \( Y' = \log(Y) \)
- 제곱근 변환 (Square Root Transformation): \( Y' = \sqrt{Y} \)
- 다항 회귀 (Polynomial Regression): \( Y = \beta_0 + \beta_1 x + \beta_2 x^2 + \epsilon \)
- 스플라인 회귀 (Spline Regression): 특정 구간에서 선형성을 유지하도록 회귀 분석 수행
2) 비선형 회귀 모델(Non-Linear Regression) 사용
- 로지스틱 회귀(Logistic Regression): 이진 분류 문제에서 사용
- 시그모이드(Sigmoid) 또는 지수 회귀(Exponential Regression): 데이터가 곡선을 이루는 경우
2. 독립성(Independence) 위배 → 자기상관 조정
문제점:
- 시계열 데이터(시간 의존 데이터)에서 과거 값이 현재 값에 영향을 주는 경우
- 자기상관(Autocorrelation)이 존재하면 잔차가 독립적이지 않음
해결 방법:
1) 더빈-왓슨 검정(Durbin-Watson Test) 수행 후 조정
2) 시계열 분석 기법 사용
- ARIMA (AutoRegressive Integrated Moving Average)
- SARIMA (Seasonal ARIMA)
- VAR (Vector AutoRegression)
3) Newey-West 표준 오차 사용
- 자기상관이 있는 경우 Newey-West 표준 오차를 적용하면 신뢰구간과 p-value의 왜곡을 줄일 수 있음
3. 등분산성(Homoscedasticity) 위배 → 가중 회귀(WLS) 또는 변환 적용
문제점:
- 잔차(Residuals)의 분산이 일정하지 않고, 특정 값에서 분산이 커지거나 작아지는 경우
해결 방법:
1) 브루쉬-페이건 검정(Breusch-Pagan Test) 수행 후 조정
2) 가중 최소제곱 회귀(Weighted Least Squares, WLS) 사용
- 등분산성이 위배되면 각 데이터에 가중치(weight)를 적용하여 변동성을 보정할 수 있음
3) Box-Cox 변환(Box-Cox Transformation) 적용
- \( Y \) 값을 로그 변환(log), 제곱근 변환(sqrt) 하면 분산을 일정하게 만들 수 있음
4. 정규성(Normality) 위배 → 중심 극한 정리 활용 또는 비모수 회귀 사용
문제점:
- 잔차가 정규 분포를 따르지 않는 경우
- 특히 데이터의 개수가 적을 때 심각한 문제 발생
해결 방법:
1) 샤피로-윌크 검정(Shapiro-Wilk Test) 수행 후 조정 - ex) 샘플 증가
2) Box-Cox 변환(Box-Cox Transformation) 적용
3) 데이터 개수 증가 (중심 극한 정리 이용)
- 데이터가 많아지면(보통 \( n > 30 \)), 잔차가 정규 분포를 따를 가능성이 높아짐
4) 비모수 회귀(Non-Parametric Regression) 사용
- 로버스트 회귀(Robust Regression): 정규성을 만족하지 않아도 회귀 분석이 가능
- 랜덤 포레스트(Random Forest), SVM(Support Vector Machine) 등 머신러닝 기반 회귀 모델 사용
결론: 선형 회귀는 가정이 위배되어도 조정할 수 있다!
1) 선형성이 위배되면? → 다항 회귀, 로그 변환
2) 독립성이 위배되면? → 시계열 분석, Newey-West 표준 오차
3) 등분산성이 위배되면? → 가중 회귀(WLS), Box-Cox 변환
4) 정규성이 위배되면? → 데이터 개수 증가, 비모수 회귀 사용
즉, 가정이 위배되더라도 선형 회귀를 조정하여 사용할 수 있으며, 상황에 따라 머신러닝 회귀 모델을 고려할 수도 있다
다중공선성 (Multicollinearity)
1. 개요
다중공선성(Multicollinearity)이란, 다중 회귀 분석에서 독립 변수들 간의 강한 상관관계(Collinearity)가 존재하는 경우를 의미한다.
즉, 독립 변수끼리 상관성이 높으면 회귀 모델의 안정성이 떨어지고, 회귀 계수의 신뢰성이 낮아지는 문제가 발생한다.
2. 다중공선성이 문제되는 이유
- 회귀 계수(Regression Coefficients)의 불안정성
- 독립 변수들이 상관관계를 가지면, 작은 데이터 변화에도 회귀 계수가 크게 변할 수 있음.
- 통계적 유의성(Statistical Significance) 문제
- 다중공선성이 존재하면 독립 변수의 p-value가 커져 유의미하지 않게 보일 가능성이 있음.
- 해석력 감소
- 독립 변수 간의 영향이 겹쳐서 특정 독립 변수가 종속 변수에 미치는 개별적인 영향을 해석하기 어려움.
3. 다중공선성 검출 방법
1) 분산팽창계수 (Variance Inflation Factor, VIF)
- VIF 값이 클수록 다중공선성이 높음을 의미함.
- 공식:
\[
VIF_j = \frac{1}{1 - R_j^2}
\]
여기서, \( R_j^2 \)는 \( x_j \) 변수를 종속 변수로 하여 나머지 독립 변수들과 회귀 분석을 수행한 결정계수.
- 해석 기준:
- \( VIF < 5 \) → 다중공선성 문제 없음
- \( 5 \leq VIF < 10 \) → 다중공선성이 있을 가능성이 있음
- \( VIF \geq 10 \) → 다중공선성이 높음 (심각한 문제)
R 코드
# 필요한 패키지 설치 (최초 한 번만 실행)
install.packages("car")
# 패키지 로드
library(car)
# 데이터 생성
x1 <- c(2,3,5,7,9,11,13,15,17,19)
x2 <- c(4,6,10,14,18,22,26,30,34,38) # x1과 강한 상관관계
x3 <- c(1,2,1,2,1,2,1,2,1,2)
Y <- c(3,6,9,12,15,18,21,24,27,30)
# 회귀 모델 적합
model <- lm(Y ~ x1 + x2 + x3)
# VIF 계산
vif(model)
Python 코드
import numpy as np
import pandas as pd
import statsmodels.api as sm
from statsmodels.stats.outliers_influence import variance_inflation_factor
# 데이터 생성
data = pd.DataFrame({
"x1": [2,3,5,7,9,11,13,15,17,19],
"x2": [4,6,10,14,18,22,26,30,34,38], # x1과 강한 상관관계
"x3": [1,2,1,2,1,2,1,2,1,2],
"Y": [3,6,9,12,15,18,21,24,27,30]
})
# 독립 변수 설정
X = data[["x1", "x2", "x3"]]
X = sm.add_constant(X) # 절편 추가
# VIF 계산
vif_data = pd.DataFrame()
vif_data["Feature"] = X.columns
vif_data["VIF"] = [variance_inflation_factor(X.values, i) for i in range(X.shape[1])]
print(vif_data)
2) 상관 행렬 (Correlation Matrix) 확인
- 독립 변수들 간의 피어슨 상관계수(Pearson Correlation Coefficient) 를 확인하여 강한 상관관계가 있는지를 파악함.
- 해석 기준:
- \( |r| > 0.7 \) → 강한 상관관계 (다중공선성 가능성 높음)
- \( |r| \leq 0.7 \) → 다중공선성 문제 적음
R 코드
# 상관 행렬 계산
cor(data[, c("x1", "x2", "x3")])
Python 코드
#상관 행렬 계산
correlation_matrix = data[["x1", "x2", "x3"]].corr()
print(correlation_matrix)
4. 다중공선성 해결 방법
1) 상관관계가 높은 변수 제거
- 높은 VIF 값을 가진 변수를 제거하면 다중공선성이 줄어듦.
- 예: \( x1 \)과 \( x2 \)의 VIF가 높다면, 그중 하나를 제거.
2) 주성분 분석 (Principal Component Analysis, PCA)
- 차원 축소 기법을 사용하여 독립 변수들을 몇 개의 주성분으로 변환하여 공선성을 낮출 수 있음.
3) 변수 변환 (변수 결합)
- 강한 상관관계를 가지는 변수들을 합쳐서 하나의 새로운 변수로 변환함.
- 예: \( x1 \)과 \( x2 \)가 강한 상관관계를 가지면, 새로운 변수 \( x = x1 + x2 \)를 생성하여 회귀 모델에 사용.
4) 능형 회귀 (Ridge Regression) 또는 라쏘 회귀 (Lasso Regression) 사용
- Ridge Regression: 회귀 계수에 패널티를 부과하여 공선성을 줄임.
- Lasso Regression: 특정 독립 변수의 회귀 계수를 0으로 만들어 다중공선성을 감소시킴.
Python 코드: Ridge 회귀 적용
from sklearn.linear_model import Ridge
# Ridge 회귀 모델 적용 (알파 값 조정)
ridge_model = Ridge(alpha=1.0)
ridge_model.fit(X, data["Y"])
print(ridge_model.coef_)
5. 요약
- 다중공선성이 존재하면 회귀 모델의 계수가 불안정해지고, 해석이 어려워진다.
- VIF 값이 10 이상이면 다중공선성이 심각하며, 5 이상이면 주의가 필요하다.
- 다중공선성을 해결하기 위해 변수 제거, 변수 변환, PCA, Ridge/Lasso 회귀 등의 방법을 사용할 수 있다.
R 회귀분석 결과 설명 참조 자료
'통계' 카테고리의 다른 글
| 6.7 Sufficient Statistics (0) | 2025.01.03 |
|---|---|
| 6.6 Asymptotic Distributions of Maximum Likelihood Estimators (0) | 2025.01.03 |
| 6.4 Maximum Likelihood Estimation (0) | 2025.01.03 |
| 6.3 Order Statistics (0) | 2025.01.03 |
| 6.2 Point Estimation -Exploratory Data Analysis (0) | 2025.01.03 |