레버리지(Leverage)
레버리지가 높은 관측치는 설명(예측) 변수의 다른 샘플들에 비해 모델에 높은 영향을 미칠 수 있는 값으로 이상값이 될 수 있습니다. hat 행렬의 대각요소가 각 샘플의 레버리지를 나타내므로 높은 레버리지를 가진 관찰은 hat 통계량을 기준으로 결정할 수 있습니다. 일반적으로 주어진 데이터 세트에 대해 평균 레버리지를 기준으로 2 또는 3배보다 큰 레버리지를 갖는 관찰을 이상치의 대상으로 고려합니다.
이상적으로 hat 행렬이 대각요소가 모두 1이고 나머지 요소들이 모두 0인 경우 추정치와 관측치는 일치하게 될 것입니다. 그러나 실제 상황에서의 레버리지의 특성은 식 1과 같습니다.
$$\text{tr(H)}=\sum^n_{i=1}h_{ii}=k$$ | (식 1) |
식 1에서 hii는 다음의 범위내에서 존재합니다.
0 < hii < 1 |
H: hat 행렬 |
k: 모형에 사용된 모수의 개수(편차항 포함) |
N: 자료의 크기 |
위 get_influence()의 결과인 hat 행렬의 대각요소들을 사용하여 식 1을 확인합니다. 이 대각요소들은 메소드 get_influence()의 hat_matrix_diag
속성(attribute)를 사용하여 호출할 수 있습니다. 또는 get_influence().summary_frame()의 속성(attribute) hat_diag
로 hat 행렬의 대각요소를 확인할 수 있습니다.
import numpy as np import pandas as pd from sklearn.preprocessing import StandardScaler import matplotlib.pyplot as plt import FinanceDataReader as fdr import statsmodels.api as sm from scipy import stats
st=pd.Timestamp(2021,1, 1) et=pd.Timestamp(2024, 5, 10) kos=fdr.DataReader('KS11',st, et)[["Open","Close"]] kos.index=range(len(kos)) X=kos.values[:,0].reshape(-1,1) y=kos.values[:,1].reshape(-1,1) #독립변수 정규화(표준화) xScaler=StandardScaler().fit(X) X_n=xScaler.transform(X) #반응변수 정규화(표준화) yScaler=StandardScaler().fit(y) y_n=yScaler.transform(y) X_n0=sm.add_constant(X_n) X_n0.shape, y_n.shape reg=sm.OLS(y_n, X_n0).fit()
influence=reg.get_influence() infSummary=influence.summary_frame() hat=infSummary["hat_diag"] hat.sum()
2.0
그림 1은 hat 행렬의 대각요소의 레버리지 정도를 나타낸 것입니다. 일반적으로 평균의 2배 이상이 되는 값을 이상치로 간주합니다.
plt.figure(figsize=(5, 2)) plt.stem(hat) plt.axhline(np.mean(hat), c='g', ls="--") plt.axhline(np.mean(hat)*2, c='brown', ls="--") plt.title("leverage") plt.show()
위의 hat 행렬의 대각 요소의 합(hat)은 모형의 매개변수의 수와 같습니다. 이상치로 간주할 수 있는 부분을 제외한 상태에서의 정규성 평가 결과는 원시 자료에 비해 변화가 없습니다.
out1id=np.where(hat>2*hat.mean())[0] print(out1id)
[87 104 105 106 …]
위 결과의 영향력 있는 샘플들을 제외한 새로운 자료로부터 모델을 구현하고 잔차에 대한 정규성 검정을 합니다.
X_n0Hat=np.delete(X_n0, out1id, axis=0) y_nHat=np.delete(y_n, out1id, axis=0) reg_hat=sm.OLS(y_nHat, X_n0Hat).fit() print(f"회귀계수: {reg_hat.params.round(3)}") print(f"R2: {reg_hat.rsquared.round(3)}")
회귀계수: [0. 0.998] R2: 0.993
위 결과는 원시 자료에 의한 결과와 거의 동일하므로 다음의 정규성 검정 결과 차이를 보이지 않습니다.
reSha=stats.shapiro(reg.resid) print("통계량: %.3f, p-value: %.3f" %(reSha[0], reSha[1])) reSha2=stats.shapiro(reg_hat.resid) print("이상치 고려; 통계량: %.3f, p-value: %.3f" %(reSha2[0], reSha2[1]))
통계량: 0.972, p-value: 0.000 이상치 고려; 통계량: 0.972, p-value: 0.000
그림2는 위 결과에 대한 QQ plot으로 거의 변화가 없음을 나타냅니다. 두 그래프를 비교하면 여전히 이상치를 포함하고 있으며 양쪽 꼬리의 정규성에 큰 이탈을 보입니다. 즉, 높은 레버리지의 기준으로 이상치의 적절한 조절은 되지 않음을 알 수 있습니다.
plt.figure(figsize=(6, 2)) plt.subplots_adjust(wspace=0.5) plt.subplot(1,2,1) stats.probplot(reg.resid, plot=plt) plt.title("a) Probability plot") plt.subplot(1,2,2) stats.probplot(reg_hat.resid, plot=plt) plt.title("b) Probability plot") plt.show()
위 결과들은 높은 레버리지가 이상치임을 결정할 충분한 근거를 제공하지 못함을 의미합니다. 대신에 레버리지 값들을 사용하여 계산된 rstudent, DFFITS, Cook’s distance를 이상치 진단의 결정지표 값들로 사용합니다.
댓글
댓글 쓰기