OLS get_influence 활용 방법
statsmodels는 파이썬에서 회귀 분석을 수행할 때 널리 사용되는 라이브러리다. 특히 OLS(Ordinary Least Squares) 회귀 분석을 수행할 때 get_influence() 메서드를 활용하면 데이터 포인트가 회귀 모델에 미치는 영향을 분석할 수 있다. 이번 포스팅에서는 get_influence()의 사용법과 활용 방법을 정리해본다.
1. get_influence()란?
get_influence()는 statsmodels.regression.linear_model.RegressionResults 객체에서 제공하는 메서드로, 회귀 모델을 학습한 후 각 데이터 포인트가 모델에 얼마나 영향을 주는지 평가하는 데 사용된다. 이 메서드는 잔차 분석, 레버리지 점수, Cook’s Distance 등 다양한 영향 지표를 제공한다.
2. 기본 사용법
먼저 statsmodels를 이용하여 OLS 회귀 분석을 수행한 후, get_influence()를 사용하여 개별 데이터 포인트의 영향을 분석할 수 있다.
import numpy as np
import pandas as pd
import statsmodels.api as sm
# 예제 데이터 생성
np.random.seed(42)
X = np.random.rand(100, 1) * 10 # 독립 변수
y = 3 * X.squeeze() + np.random.randn(100) * 2 # 종속 변수
# 상수항 추가
X = sm.add_constant(X)
# OLS 회귀 모델 적합
model = sm.OLS(y, X).fit()
# 영향 분석
influence = model.get_influence()
3. 주요 영향 지표
3.1. 레버리지 (Hat values)
레버리지는 특정 데이터 포인트가 회귀 모델을 얼마나 강하게 끌어당기는지를 나타내는 지표다. 보통 2p/n(여기서 p는 회귀 계수의 개수, n은 샘플 수)보다 큰 값이면 영향력이 높은 것으로 본다.
leverage = influence.hat_matrix_diag
print(leverage[:10]) # 상위 10개 샘플 출력
3.2. Studentized Residuals
이 값은 표준화된 잔차로, 특정 데이터 포인트가 얼마나 예외적인지를 측정한다. 일반적으로 ±2 이상의 값이면 이상치일 가능성이 크다.
studentized_residuals = influence.resid_studentized_external
print(studentized_residuals[:10])
3.3. Cook’s Distance
Cook’s Distance는 한 개의 데이터 포인트를 제거했을 때 회귀 계수가 얼마나 변화하는지를 나타낸다. 값이 1보다 크면 해당 데이터 포인트가 모델에 큰 영향을 미칠 가능성이 있다.
cooks_d = influence.cooks_distance[0]
print(cooks_d[:10])
4. 시각화 활용
영향력이 높은 데이터를 시각적으로 확인하면 보다 직관적인 분석이 가능하다. Cook’s Distance와 레버리지를 활용하여 영향력 있는 데이터를 탐색해 보자.
import matplotlib.pyplot as plt
# Cook’s Distance 시각화
plt.figure(figsize=(8, 5))
plt.stem(range(len(cooks_d)), cooks_d, markerfmt=",")
plt.xlabel("Index")
plt.ylabel("Cook's Distance")
plt.title("Cook's Distance for Each Data Point")
plt.show()
# 레버리지와 Studentized Residuals의 관계
plt.figure(figsize=(8, 5))
plt.scatter(leverage, studentized_residuals)
plt.axhline(y=2, color='r', linestyle='--')
plt.axhline(y=-2, color='r', linestyle='--')
plt.xlabel("Leverage")
plt.ylabel("Studentized Residuals")
plt.title("Leverage vs Studentized Residuals")
plt.show()
5. 데이터 포인트 제거 및 모델 재적합
영향력이 큰 데이터 포인트를 확인한 후, 해당 포인트를 제거하고 모델을 다시 적합할 수 있다. 예를 들어, Cook’s Distance가 1보다 큰 데이터 포인트를 제거해보자.
# 영향력이 높은 데이터 필터링
influential_points = np.where(cooks_d > 1)[0]
print("Influential points:", influential_points)
# 데이터 제거 후 재적합
X_filtered = np.delete(X, influential_points, axis=0)
y_filtered = np.delete(y, influential_points)
model_filtered = sm.OLS(y_filtered, X_filtered).fit()
print(model_filtered.summary())
6. 결론
statsmodels의 get_influence() 메서드를 활용하면 개별 데이터 포인트가 회귀 분석 결과에 미치는 영향을 효과적으로 분석할 수 있다. 레버리지, Cook’s Distance, Studentized Residuals 등을 활용하여 이상치를 탐색하고, 필요에 따라 모델을 개선하는 과정이 중요하다. 이를 통해 더욱 신뢰성 높은 회귀 분석을 수행할 수 있다.