R 이상치 검출 - R isangchi geomchul

급속히 발전하는 과학기술 덕분에 모든 분야에서 편리함과 신속함 그리고 정확성을 성취해가고 있다. 하지만 심각한 문제는 발전하는 과학기술보다 더 빨리 변해가는 것이 현실의 상황이다. 매일 매일 엄청나게 생산되어 쏟아지는 정보들은 과학기술의 발전 속도를 능가한다. 또한 오염되었거나 심지어 올바르지 않은 목적을 위한 가짜 정보와 자료도 상대적으로 늘어가고 있다. 물론 많은 과학자들을 비롯하여 기술자들이 이러한 현상을 연구하고 대응해 왔다. 특히 정보의 홍수 속에서 살아가기 위해, 올바르고 가치 있는 정보를 찾는 좋은 방법과 기술을 개발하였고, 지금도 더 좋고 효율적인 것을 찾기 위한 노력이 지속되고 있다.

정보 분석의 중요성을 인식하고 최근 몇 년 동안 통계학과 확률을 현장에 응용하고 적용하는 데 관심을 가지고 있었다. 대부분의 경우 아직도 아주 초보적인 통계나 기법 몇 가지를 이용하고 있으며, 전문적인 특정 분야에서는 누군가 한 번 사용한 방법과 절차를 계속 반복하여 형식적으로 사용하고 있다. 거기에는 여러 이유가 있지만 정확한 통계학적 지식 혹은 확률적 지식의 결여에서 나타나는 것이라고 본다. 해결 방법으로 공동연구가 좋은 방법이라고 생각하지만 연구자들 및 분석자들 사이에 성숙된 관계가 이루어지지 못해 실제적인 어려움이 있는 것 같다. 또 다른 방법으로는 연구자들을 포함한 사용자들이 좋은 결과를 도출할 수 있도록 그들이 직접 활용할 수 있는 좋은 안내서를 만드는 것이다. 이 경우는 사용자의 모든 가정과 상황을 맞출 수 없다는 문제점을 가지고 있지만 좋은 방법이라고 생각한다.

여러 해 동안 대한 금속?재료학회 회원으로 활동하면서 재료학 분야, 예를 들면 한국기계연구원(KIMM) 그리고 화학분야 특히 한국표준연구원(KRISS)의 측정분야에 종사하시거나 연구하시는 분들과 연구와 토론을 하는 과정에서 실제로 겪는 어려움을 이야기하시는 것들을 들었다. 그것을 요약하면, 산업계와 현장에서 종사하시는 분들과 연구자들이 겪는 어려움 중의 하나는 실험이나 연구과정에서 얻어진 자료에서 원하는 정보를 도출하고자 하는데 종종 마음에 들지 않는 자료라고 생각되는 것들 혹은 예상하지 못한 자료가 나타나고 발생하게 된다는 것이었다.

‘이런 자료들을 어떻게 처리해야 하는가’하는 심각한 상황이 발생하고, 고심하게 된다. 이와 같은 현상은 역사적 문제로 과학연구에 있어서 사회적 갈등을 낳는 윤리 문제와 관련이 있었다. 비용이나 시간을 들여서 얻은 자료와 정보인데 조작하거나 변조하자니 법과 양심에 걸리고, 그냥 버리자니 원하는 결론을 위해 좋은 자료들만 선별하고 선택했다는 오해를 받을 수 있다는 것이다. 실제로 과학계에서 유명한 학자들의 좋지 못한 기록들이 비평의 대상이 되어 왔다.

각종 실험과 관측 및 관찰 등을 통해 얻어진 자료들 전체에서 동떨어져 있거나 특이한 경향을 보이는 자료들이 나타난다. 이러한 자료를 이상치(outlier)라고 한다. 실험자와 연구자들은 이와 같은 자료들이 어떤 원인에 의해 발생한 것인지, 아니면 색다르고 중요한 특성을 가진 자료인지, 그것도 아니면 어쩔 수 없이 드물게 발생하는 오차가 큰 자료인지를 판단해야 할 것이다. 이상치의 검출과 제거 및 원인 파악을 하는 것이 중요한다. 이상치의 검출과 제거에 관한 통계학적인 방법에 대한 이론은 이미 많이 축척되었지만 실제로 정보와 자료 분석에 활용하기 위해서는 컴퓨터와 통계 소프트웨어의 도움이 있어야 한다.

통계 소프트웨어는 R-project(간단히 R)를 사용한다. R은 패키지(package)이며 언어(language)라 할 수 있다. 여러 가지 장점이 있지만 그 중에서 최고는 전 세계의 최고급연구가들이 직접 개발한 알고리즘(algorithm) 및 소스 코드(source code) 그리고 라이브러리(library)를 누구나 자유롭고 쉽게 사용하는 것뿐만 아니라 세계 모든 사람들이 함께 참여하고 얻어진 결과들을 함께 활용할 수 있다는 것이다. 인터넷 시대에 아주 잘 맞는 운영체제를 개발하고 운영하고 있는 것이다. 이 책의 내용을 잘 활용하기 위해서는 Kerns,(2011)의 Introduction to Probability and Statistics Using R. 정도를 다룰 수 있으면 좋을 것 같다.

해결해야 할 문제가 주어지면 먼저 이 문제와 관련된 자료를 인터넷에서 수집하고 분리 저장한다. 다음, 해결하고자 하는 문제와 관련된 이론들을 추출하고 문제에 적용시켜 본다. 얻어진 결과와 다른 사람들이 수행한 관련 연구와 결과들을 비교하여 문제의 정확한 해결책을 찾는다. 그리고 얻어진 결과를 확증하기 위하여 각종 도구를 사용하여, 특히 컴퓨터에 의하여 얻어진 해답의 옳고 그름을 확인한다.

이 책에서는 이러한 절차를 통해 자료에서 이상치를 찾아내는 것을 배우고 처리하는 방법을 연구하고 그 방법을 익히게 적용하는 것을 목표로 삼았다. 또한 자료를 생산하고 이용하는 여러 현장에서 유용하게 사용하여 올바르고 가치 있는 정보를 도출하는 데 도움이 되었으면 한다. 따라서 자료가 생산되는 모든 분야에서 활용하고 이용할 수 있는 이상치의 문제를 다루는 것이 이 책의 주된 목표이다.

(주)알라딘커뮤니케이션

  • 대표이사 : 최우경
  • 고객정보보호 책임자 : 최우경
  • 사업자등록 : 201-81-23094
  • E-mail :
  • 통신판매업신고 : 중구01520호
  • 호스팅 제공자 : 알라딘커뮤니케이션
  • (본사) 서울시 중구 서소문로 89-31 ㅣ (중고매장) 자세히보기
  • (고객센터) 서울시 마포구 백범로 71 숨도빌딩 7층, Fax 02-6926-2600

ⓒ Aladin Communication. All Rights Reserved.

이상치

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

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

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

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

R 이상치 검출 - R isangchi geomchul

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

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

이상치 처리 방법

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

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

① 제거

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

② 치환

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

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

③ 분리

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

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

R 이상치 검출 - R isangchi geomchul

실습

다음의 공지사항에 있는 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)

R 이상치 검출 - R isangchi geomchul

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

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

myboxplot <- boxplot(autoparts3$c_thickness)

myboxplot$out

boxplot

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

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

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

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

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

R 이상치 검출 - R isangchi geomchul

이상치 검출

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

① 사분위수

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

아래에서 사분위편차 = 제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)

R 이상치 검출 - R isangchi geomchul

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

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

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

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

R 이상치 검출 - R isangchi geomchul

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

install.packages("car")

library(car)

outlierTest(m)

R 이상치 검출 - R isangchi geomchul

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

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

③ 쿡의 거리

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

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

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

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

R 이상치 검출 - R isangchi geomchul

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

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

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

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

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

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

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

R 이상치 검출 - R isangchi geomchul

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")

R 이상치 검출 - R isangchi geomchul

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

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

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

outlier

R 이상치 검출 - R isangchi geomchul

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

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

R 이상치 검출 - R isangchi geomchul

④ 평균에서 가장 먼 값

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

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

R 이상치 검출 - R isangchi geomchul

=== 연습문제 ===

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

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

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

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

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

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

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

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

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