이상점 :: 통계 - mindscale
Skip to content

이상점

이상점과 레버리지

  • 이상점 outlier: 종속변수 $y$가 데이터의 일반적 경향을 따르지 않는 점
  • 레버리지 leverage: 한 점이 회귀분석 결과에 미치는 영향(대체로 독립변수 $x$가 극단적)
  • 영향점 influential point : 레버리지가 큰 이상점
  • 이상점이나 레버리지가 작으면, 잔차만 커짐

hat 행렬

회귀분석을 행렬 형태로(식1)

$$ \hat y = X b $$

$X$의 유사역행렬 $X^\dagger$와 $y$를 곱하면 $b$의 OLS 추정치를 구할 수 있음(식2)

$$ X^\dagger y = b $$

식2를 식1에 대입하면 hat 행렬 $H$

$$ \hat y = X X^\dagger y = H y $$

hat 행렬 $H$는 데이터의 $y$가 예측치 $\hat y$에 미치는 영향을 나타냄

유사 역행렬 pseudo-inverse

아래와 같은 $X^\dagger$를 $X$의 유사 역행렬이라고 함

$$ X^\dagger = (X^\intercal X)^{-1} X^\intercal $$

행렬 $X$의 역행렬 $X^{-1}$이 존재하려면 $X$가 정방행렬 square matrix이어야 함(크기가 $n \times n$)

유사 역행렬은 $X$가 역행렬과 비슷하게 $X^\dagger X = I$이나 $X$가 정방행렬일 필요 없음

레버리지

행렬 $H$의 대각원소 $h_{ii}$를 레버리지라고 함

$i$번째 종속변수 $y_i$가 $i$번째 예측치 $\hat y_i$에 미치는 영향이기 때문

레버리지가 지나치게 크거나 작은 사례는 유의해서 볼 필요

레버리지는 0~1 사이의 실수

$$ 0 \le h_{ii} \le 1 $$

레버리지의 합은 모형의 계수의 개수 $p$와 같다(절편 포함)

$$ \text{tr}(H) = \sum h_{ii} = p $$

예를 들어 독립변수의 개수가 1개인 단순 회귀분석의 경우 레버리지의 합은 2

따라서 데이터가 $n$개이면, 레버리지의 평균은 $p / n$

데이터 열기

df = pd.read_excel('influence1.xlsx')

회귀분석

m = ols('y ~ x', df).fit()

레버리지

i = m.get_influence()
h = i.hat_matrix_diag

Python에서 레버리지가 큰 점 시각화

import seaborn as sns

sns.regplot(x='x', y='y', data=df) # 산점도 및 회귀선

# 레버리지가 큰 점 빨간색 표시
th = 2 / len(df)  # p / n
sns.scatterplot(x='x', y='y', data=df[h > th], color='red') 

데이터 열기

df = readxl::read_excel('influence1.xlsx')

회귀분석

m = lm(y ~ x, df)

레버리지

h = hatvalues(m)

레버리지가 큰 점 시각화

plot(y ~ x, data=df)  # 산점도
abline(m)  # 회귀선

# 레버리지가 큰 점 빨간색 표시
th = 2 / nrow(df)  # p / n
points(y ~ x, data=df[h > th,], pch=16, col='red')  

이상점 지표

내적 스튜던트화 잔차

internally studentized residual

각각의 잔차를, 잔차의 표준편차의 추정치로 나눈 값(보통 ±3 이상이면 이상점으로 봄)

$$ r_i = \frac {e_i}{\text{SD}(e_i)}= \frac{e_i}{s\sqrt{1-h_{ii}}} $$

i.resid_studentized

삭제 잔차

deleted residual

$y_i$를 제거하고 회귀분석을 했을 때, $y_i$와 그 예측치 $\hat y_{(i)}$의 차이

$$ d_i = y_i - \hat y_{(i)} $$

삭제 잔차가 크다면 영향이 크다고 할 수있음

외적 스튜던트화 잔차

externally studentized residual

삭제 잔차를 스튜던트화한 것(보통 ±3 이상이면 이상점으로 봄)

$$ r_i = \frac {d_i}{\text{SD}(d_i)}= \frac{d_i}{s_{(i)} \sqrt{1-h_{ii}}} $$

내적 스튜던트화 잔차보다 이상점 진단에 더 유리

i.resid_studentized_external
rstudent(m)

Difference in Fits

$y_i$를 분석에 포함했을 때와 포함하지 않았을 때 예측치 차이를 스튜던트화

$$ \text{DFFITS}i = \frac{\hat y_i - \hat y{(i)}}{s_{(i)}\sqrt{1-h_{ii}}} $$

아래 값보다 크면 이상점으로 의심

$$ 2\sqrt{\frac{p + 1}{n - p - 1}} $$

  • $n$: 관측치의 수
  • $p$: 계수의 수(절편 포함)
i.dffits
dffits(m)

Cook's distance

잔차의 크기와 레버리지의 크기를 복합적으로 반영한 지수

$$ \text{D}i = \frac{ (y_i - \hat y_i)^2}{p\times s} \frac{h{ii}}{(1-h_{ii})^2} $$

i.cooks_distance[0]
cooks.distance(m)

Fox’ Outlier Recommendation

Cook’s Distance가 다음과 같은 기준값보다 클 때 아웃라이어로 판단

$$ D_i > \frac{4}{n - p - 1} $$

이상점 시각화

import statsmodels.api as sm

레버리지와 스튜던트화 잔차 비교(이상점 가능성이 높은 점에 번호 표시됨)

sm.graphics.plot_leverage_resid2(m)

Cook's distance에 따라 점의 크기 다르게(위의 그래프와 x-y 축이 반대)

sm.graphics.influence_plot(m)

레버리지와 스튜던트화 잔차 비교(이상점 가능성이 높은 점에 번호 표시됨)

plot(m, which=5)

이상점 다루기

  • 수정해야할 경우
    • 데이터 포인트의 원본과 대조하여 입력이 잘못된 경우
  • 삭제해야할 경우
    • 데이터 포인트가 연구의 모집단에 속하지 않을 경우
    • 실험 절차나 측정이 잘못되었을 경우
  • 모형을 수정해야 할 경우
    • 중요한 변수의 누락
    • 상호작용
    • 비선형성

이상점을 다룰 때 주의할 점

  • 진단 지표들을 기계적으로 적용하여 데이터를 삭제하지 말 것
  • 데이터 삭제를 위해서는 객관적 이유가 필요
  • 데이터를 삭제한 경우, 결과 보고에 포함시켜야 함
  • 데이터 삭제 여부를 결정하기 어려울 경우:
    • 삭제한 데이터셋과 그렇지 않은 데이터셋을 따로 분석하고 결과를 비교