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 ii 는 i번째 레버리지 값입니다.
공식이 다소 복잡해 보이지만 좋은 소식은 대부분의 통계 소프트웨어가 쉽게 공식을 계산할 수 있다는 것입니다.
본질적으로 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는 단순히 영향 지점을 식별하는 방법일 뿐이라는 점을 명심하세요.
- 영향력 있는 점을 처리하는 방법에는 이러한 점을 제거하거나, 이러한 점을 평균 또는 중앙값과 같은 값으로 대체하거나, 단순히 모델에 점을 유지하되 결과 회귀를 보고할 때 주의 깊게 기록하는 등 여러 가지 방법이 있습니다.