회귀분석 특이값 처리 - hoegwibunseog teug-igabs cheoli

이상치

이상치란 다른 데이터보다 아주 작은 값이나 아주 큰 값을 말한다

데이터를 분석할 때 이상치는 의사결정에 영향을 미칠 수 있다

모형 구축에 있어 이상치는 그 빈도에 비해 아주 큰 영향력을 가지므로

정확한 모수(parameter) 추정에 어려움을 준다

회귀분석 특이값 처리 - hoegwibunseog teug-igabs cheoli

그러나 이상치가 항상 의미없는 값이라고는 할 수 없으므로,

그 데이터에 대한 지식을 가지고 있는 전문가가 이상치에 대해 검토하는 것이 바람직하다

이상치 처리 방법

이상치 처리 방법은 결측치와 유사하다

제거와 치환 외에 분리하는 방법이 더 있을 뿐이다

① 제거

오타, 오류, 비상식적 반응과 같은 경우는 단순히 제거한다

② 치환

삭제가 어려운 경우에는 평균, 최빈값, 중앙값, 예측값 등으로 치환한다

단, 결측값의 경우와 같이 신뢰도 문제가 발생한다

③ 분리

독립변수가 충분히 세분되지 않은 경우 이상치가 발생할 수 있다

이러한 경우에는 변수를 세분하여 이상치를 분리한다

회귀분석 특이값 처리 - hoegwibunseog teug-igabs cheoli

실습

다음의 공지사항에 있는 rtest.zip 파일의 내용을 C:/rtest 폴더에 넣는다

https://blog.naver.com/lingua/221849980962

# 자료 준비

path <- "C:/rtest"

setwd(path)

autoparts <- read.csv("autoparts.csv", header = TRUE)

autoparts3 <- autoparts[autoparts$prod_no == "45231-3B610", -1]

# 분포 확인

boxplot(autoparts3$c_thickness)

회귀분석 특이값 처리 - hoegwibunseog teug-igabs cheoli

c_thickness 컬럼에 이상치가 있음을 알 수 있다

다음의 코드로 이상치를 직접 확인할 수 있다

myboxplot <- boxplot(autoparts3$c_thickness)

myboxplot$out

boxplot

boxplot은 사분위수를 포함하여 최소값, 중앙값, 최대값을 잘 보여준다

사분위수란 자료를 크기순으로 나열한 자료값들을 4등분하는 수의 값이다

전체 데이터의 중앙에 해당하는 곳에 중앙값(Q2)을 먼저 결정하고,

아래쪽과 위쪽 각각에서 다시 중앙값을 찾아

1사분위수(Q1)과 3사분위수(Q3)를 결정한다

회귀분석 특이값 처리 - hoegwibunseog teug-igabs cheoli

이상치 검출

이상치 검출 방법은 몇 가지가 있다

① 사분위수

사분위수를 이용하여 이상치를 검출한다

아래에서 사분위편차 = 제3사분위수 – 제1사분위수 이다

낮은 이상치 : 제1사분위수 - 1.5 * 사분위편차 보다 작은 값

높은 이상치 : 제3사분위수 + 1.5 * 사분위편차 보다 높은 값

이를 코드로 옮기면 다음과 같다

아래에서 fivenum(x)[2]는 제1사분위수, fivenum(x)[4]는 제3사분위수

data <- autoparts3$c_thickness

which(data < fivenum(data)[2] - 1.5 * IQR(data))

which(data > fivenum(data)[4] + 1.5 * IQR(data))

② 잔차 계산

회귀분석 후 예측값과 실제값의 차이인 잔차(residual)가 큰 값을 이상치로 삼는다

m <- lm(c_thickness ~ ., data = autoparts3)

rstudent(m)

회귀분석 특이값 처리 - hoegwibunseog teug-igabs cheoli

※ rstudent()는 ‘외면 스튜던트화 잔차’로 불리는 것으로 잔차를 전체 잔차의 표준편차로 나눈 값이다

이 때, i 번째 스튜던트화 잔차를 구할 때 i 번째를 제외하여 표준편차를 구하므로 외면 스튜던트화 잔차라고 부른다

이를 그래프로 그리면 정상적인 데이터와 이상치가 있음이 확인된다

plot(rstudent(m), main = "Studentized Residuals")

회귀분석 특이값 처리 - hoegwibunseog teug-igabs cheoli

car 패키지는 이상치를 자동으로 탐색해주는 함수를 가지고 있다

install.packages("car")

library(car)

outlierTest(m)

회귀분석 특이값 처리 - hoegwibunseog teug-igabs cheoli

여기에 제시된 데이터들은 통계적으로 유의미하게 잔차가 큰 값이다 (Bonferonni p < 0.05)

오른쪽의 Bonferonni p는 수정된 값으로 독립변수가 많아질수록 값이 커지는 현상을 보정한 값이다

③ 쿡의 거리

쿡의 거리는 회귀 직선의 모양에 크게 영향을 끼치는 점을 찾는 방법이다

쿡의 거리는 레버리지(설명 변수가 극단에 치우쳐 있는 정도)와 잔차(예측값과 실제값의 차이)에 비례한다

이상치 : 쿡의 거리 > 4 / 데이터 개수

쿡의 거리는 표준화된 잔차의 합이다

회귀분석 특이값 처리 - hoegwibunseog teug-igabs cheoli

※ 𝑝 는 예측변수의 수. MSE는 Mean Squarred Error

𝑦 ̂_𝑗 는 j번째 회귀분석 결과

𝑦 ̂_(𝑗(𝑖))는 i번째 관측치를 제외한 j번째 회귀분석 결과

분모는 표준화(정규화)를 위한 것이고, 분자에서는 i 번째가 이상치인 경우, 현재의 값(이상치)이 포함된 회귀분석 결과(큰 값)에서 현재의 값(이상치)이 포함되지 않은 회귀분석 결과(작은값)을 빼게 되면 큰 값이 나온다

i 번째가 이상치가 아닌 경우,현재의 값(이상치 아님)이 포함된 회귀분석 결과(큰 값: 이상치가 포함되어 있는 회귀분석 결과)에서 현재의 값(이상치 아님)이 포함되지 않은 회귀분석 결과(큰 값: 이상치가 포함되어 있는 회귀분석 결과)을 빼게 되면 작은 값이 나온다

m <- lm(c_thickness ~ ., data = autoparts3)

plot(m) # Enter를 네 번 누른다

회귀분석 특이값 처리 - hoegwibunseog teug-igabs cheoli

cooks <- cooks.distance(m) # 쿡의 거리 계산

plot(cooks, pch=".", cex=1.5, main = "Plot for Cook's Distance")

text(x=1:length(cooks), y=cooks, labels = ifelse(cooks > 4/nrow(autoparts3), names(cooks), ""), col = "red")

회귀분석 특이값 처리 - hoegwibunseog teug-igabs cheoli

이상치가 있는 데이터만 추출한다

해당 데이터의 이름만 추출한다

outlier <- names(cooks)[(cooks > 4/nrow(autoparts3))]

outlier

회귀분석 특이값 처리 - hoegwibunseog teug-igabs cheoli

해당 데이터 내용을 출력한다

autoparts3[rownames(autoparts3) %in% outlier, ]

회귀분석 특이값 처리 - hoegwibunseog teug-igabs cheoli

④ 평균에서 가장 먼 값

단순히 반응변수만을 이용하여 이상치를 찾을 수도 있다

install.packages("outliers")

library(outliers)

# 평균에서 가장 멀리 떨어진 최대값

outlier(autoparts3$c_thickness)

# 최소값

outlier(autoparts3$c_thickness, opposite = TRUE)

⑤ Local Outlier Factor

밀도를 기반으로 하여 지역적 이상치를 식별하는 알고리즘

관측치의 밀도가 주변 밀도에 비해 훨씬 작다면(LOF 점수가 크다면) 이상치로 판정한다

주변 관측치들이 밀집도에 따라 이상치 여부가 달라진다 (지역성 locality 반영)

install.packages("DMwR")

library(DMwR)

score <- lofactor(autoparts3, k=5) # k는 lof를 구하는 데 사용되는 주변값의 계수

plot(score)

top5 <- order(score, decreasing = TRUE)[1:5] ; top5

회귀분석 특이값 처리 - hoegwibunseog teug-igabs cheoli

=== 연습문제 ===

1. 사분위수를 이용한 방법으로 이상치를 검출하고,

그 결과가 boxplot이 제시한 결과와 같다는 것을 확인하시오

값의 정렬에는 sort() 함수를 이용하시오

2. 타이타닉 데이터에 대한 boxplot을 그리고, 이상치가 존재하는 변수를 탐색하시오

타이타닉 데이터는 앞의 "결측치 처리" 블로그 참조

1) 이상치가 존재한다고 가장 의심할 수 있는 변수는 무엇인가?

2) 이상치 검출 1번에서 사용된 코드를 사용하여 이상치가 몇 개 발견되었는지를 파악하시오

3) 이상치를 제거한 데이터를 생성하시오

4) 이상치를 제거할 수 없게 되었다. 최대/최소값, 평균, 최빈값으로 대체하시오