Cook's distance를 사용하여 영향력 있는 데이터 포인트를 식별하는 방법


Di로 표시되는 Cook의 거리(Cook’s distance)는 회귀 분석 에서 회귀 모델에 부정적인 영향을 줄 수 있는 영향력 있는 데이터 포인트를 식별하는 데 사용됩니다.

Cook의 거리 공식은 다음과 같습니다.

d i = (ri 2 / p*MSE) * (h ii / (1-h ii ) 2 )

금:

  • r i 는 i 번째 잔기이다
  • p 는 회귀 모델의 계수 수입니다.
  • MSE 는 평균 제곱 오차입니다.
  • h iii번째 레버리지 값입니다.

공식이 다소 복잡해 보이지만 좋은 소식은 대부분의 통계 소프트웨어가 쉽게 공식을 계산할 수 있다는 것입니다.

본질적으로 Cook의 거리는 한 가지 일을 합니다. i 번째 데이터 점이 제거될 때 모델의 모든 적합치가 얼마나 변경되는지 측정합니다.

Cook의 거리 값이 높은 데이터 점은 적합치에 큰 영향을 미친다는 것을 나타냅니다. 일반적인 규칙은 Cook 거리가 4/n( 여기서 n은 데이터 포인트의 총 개수 )보다 큰 모든 포인트를 이상값으로 간주한다는 것입니다.

Cook의 거리가 영향력 있는 데이터 포인트를 식별하는 데 종종 사용된다는 점에 유의하는 것이 중요합니다. 데이터 포인트가 영향력이 있다고 해서 반드시 제거해야 한다는 의미는 아닙니다. 먼저 데이터 포인트가 단순히 잘못 기록되었는지 또는 흥미로운 결과를 나타낼 수 있는 데이터 포인트에 이상한 점이 있는지 확인해야 합니다.

R에서 Cook의 거리를 계산하는 방법

다음 예에서는 R에서 Cook의 거리를 계산하는 방법을 보여줍니다.

먼저 이 예제에 필요한 두 개의 라이브러리를 로드합니다.

 library(ggplot2)
library(gridExtra)

다음으로 두 개의 데이터 프레임을 정의합니다. 하나는 두 개의 이상값이 있고 다른 하나는 이상값이 없습니다.

 #create data frame with no outliers
no_outliers <- data.frame(x = c(1, 2, 2, 3, 4, 5, 7, 3, 2, 12, 11, 15, 14, 17, 22),
                          y = c(22, 23, 24, 23, 19, 34, 35, 36, 36, 34, 32, 38, 41,
                                42, 44))

#create data frame with two outliers
outliers <- data.frame(x = c(1, 2, 2, 3, 4, 5, 7, 3, 2, 12, 11, 15, 14, 17, 22),
                       y = c( 190 , 23, 24, 23, 19, 34, 35, 36, 36, 34, 32, 38, 41,
                             42, 180 ))

다음으로 두 개의 데이터 프레임을 나란히 표시하는 분산형 차트를 만듭니다.

 #create scatterplot for data frame with no outliers
no_outliers_plot <- ggplot(data = no_outliers, aes(x = x, y = y)) +
  geom_point() +
  geom_smooth(method = lm) +
  ylim(0, 200) +
  ggtitle("No Outliers")

#create scatterplot for data frame with outliers
outliers_plot <- ggplot(data = outliers, aes(x = x, y = y)) +
  geom_point() +
  geom_smooth(method = lm) +
  ylim(0, 200) +
  ggtitle("With Outliers")

#plot the two scatterplots side by side
gridExtra::grid.arrange(no_outliers_plot, outliers_plot, ncol=2)

두 번째 그래프에서 이상값이 회귀선의 적합성에 어떻게 부정적인 영향을 미치는지 확인할 수 있습니다.

두 번째 데이터세트에서 영향력 있는 지점을 식별하기 위해 데이터세트의 각 관측값에 대한 Cook 거리를 계산한 다음 이 거리를 표시하여 어떤 관측값이 기존 임계값인 4/n보다 높은지 확인할 수 있습니다.

 #fit the linear regression model to the dataset with outliers
model <- lm(y ~ x, data = outliers)

#find Cook's distance for each observation in the dataset
cooksD <- cooks.distance(model)

# Plot Cook's Distance with a horizontal line at 4/n to see which observations
#exceed this threshold
n <- nrow(outliers)
plot(cooksD, main = "Cooks Distance for Influential Obs")
abline(h = 4/n, lty = 2, col = "steelblue") # add cutoff line

데이터세트의 첫 번째와 마지막 관측치가 4/n 임계값을 초과한다는 것을 분명히 알 수 있습니다. 따라서 우리는 이 두 가지 관찰을 회귀 모델에 부정적인 영향을 미치는 영향력 있는 데이터 포인트로 식별합니다.

4/n 임계값을 초과하는 모든 관측값을 제거하려면 다음 코드를 사용하면 됩니다.

 #identify influential points
influential_obs <- as.numeric(names(cooksD)[(cooksD > (4/n))])

#define new data frame with influential points removed
outliers_removed <- outliers[-influential_obs, ]

그런 다음 두 개의 산점도를 비교할 수 있습니다. 하나는 영향 점이 존재하는 회귀선을 표시하고 다른 하나는 영향 점이 제거된 회귀선을 표시합니다.

 #create scatterplot with outliers present
outliers_present <- ggplot(data = outliers, aes(x = x, y = y)) +
  geom_point() +
  geom_smooth(method = lm) +
  ylim(0, 200) +
  ggtitle("Outliers Present")

#create scatterplot with outliers removed
outliers_removed <- ggplot(data = outliers_removed, aes(x = x, y = y)) +
  geom_point() +
  geom_smooth(method = lm) +
  ylim(0, 200) +
  ggtitle("Outliers Removed")

#plot both scatterplots side by side
gridExtra::grid.arrange(outliers_present, outliers_removed, ncol = 2)

두 개의 영향력 있는 데이터 포인트가 제거되면 회귀선이 데이터에 얼마나 더 잘 맞는지 명확하게 확인할 수 있습니다.

기술 노트

  • 대부분의 통계 소프트웨어에는 데이터 세트의 각 관찰에 대한 Cook의 거리를 쉽게 계산하는 기능이 있습니다.
  • Cook’s Distance는 단순히 영향 지점을 식별하는 방법일 뿐이라는 점을 명심하세요.
  • 영향력 있는 점을 처리하는 방법에는 이러한 점을 제거하거나, 이러한 점을 평균 또는 중앙값과 같은 값으로 대체하거나, 단순히 모델에 점을 유지하되 결과 회귀를 보고할 때 주의 깊게 기록하는 등 여러 가지 방법이 있습니다.

의견을 추가하다

이메일 주소는 공개되지 않습니다. 필수 필드는 *로 표시됩니다