logo

[통계] 이상점

 

이상점과 레버리지

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

hat 행렬

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

y^=Xb \hat y = X b

XX의 유사역행렬 XX^\daggeryy를 곱하면 bb의 OLS 추정치를 구할 수 있음(식2)

Xy=b X^\dagger y = b

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

y^=XXy=Hy \hat y = X X^\dagger y = H y

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

 

유사 역행렬 pseudo-inverse

아래와 같은 XX^\daggerXX의 유사 역행렬이라고 함

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

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

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

 

레버리지

행렬 HH의 대각원소 hiih_{ii}를 레버리지라고 함

ii번째 종속변수 yiy_iii번째 예측치 y^i\hat y_i에 미치는 영향이기 때문

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

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

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

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

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

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

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

=== "Python"

데이터 열기

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')

=== "R"

데이터 열기

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 이상이면 이상점으로 봄)

ri=eiSD(ei)=eis1hii r_i = \frac {e_i}{\text{SD}(e_i)}= \frac{e_i}{s\sqrt{1-h_{ii}}}

=== "Python"

i.resid_studentized
 

삭제 잔차

deleted residual

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

di=yiy^(i) d_i = y_i - \hat y_{(i)}

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

 

외적 스튜던트화 잔차

externally studentized residual

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

ri=diSD(di)=dis(i)1hii r_i = \frac {d_i}{\text{SD}(d_i)}= \frac{d_i}{s_{(i)} \sqrt{1-h_{ii}}}

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

=== "Python"

i.resid_studentized_external

=== "R"

rstudent(m)
 

Difference in Fits

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

DFFITSi=y^iy^(i)s(i)1hii \text{DFFITS}_i = \frac{\hat y_i - \hat y_{(i)}}{s_{(i)}\sqrt{1-h_{ii}}}

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

2p+1np1 2\sqrt{\frac{p + 1}{n - p - 1}}
  • nn: 관측치의 수
  • pp: 계수의 수(절편 포함)

=== "Python"

i.dffits

=== "R"

dffits(m)
 

Cook's distance

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

Di=(yiy^i)2p×shii(1hii)2 \text{D}_i = \frac{ (y_i - \hat y_i)^2}{p\times s} \frac{h_{ii}}{(1-h_{ii})^2}

=== "Python"

i.cooks_distance[0]

=== "R"

cooks.distance(m)
 

Fox’ Outlier Recommendation

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

Di>4np1 D_i > \frac{4}{n - p - 1}
 

이상점 시각화

=== "Python"

import statsmodels.api as sm

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

sm.graphics.plot_leverage_resid2(m)

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

sm.graphics.influence_plot(m)

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

plot(m, which=5)
 

이상점 다루기

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

이상점을 다룰 때 주의할 점

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