앞서 Z>3인 경우를 이상치로 보고 NA 값으로 대체하는 예제를 이야기했습니다. 표준값을 이용하는 방법은 가장 일반적이고 간단한 접근이긴 하지만, 문제점도 있습니다. 대표적인 것은 관측값/표본의 숫자가 적은데 이상치가 매우 정상에서 벗어난 경우입니다. 예를 들어 20명의 소득을 조사했는데, 그 가운데 빌게이츠가 끼어 있는 경우입니다. 이 경우 소득의 평균값이 수백만 달러로 올라가 5만 달러, 10만 달러 연봉을 받는 사람까지 이상치가 될 수 있습니다.
이렇게 평균을 내면 본래 이상치가 아닌 것도 이상치로 만들 수 있는데, 이를 회피하는 가장 좋은 방법은 평균 대신 중앙값(median)을 이용하는 것입니다. 집단에서 중간 위치에 있는 값을 기준으로 잡으면 평균의 함정에서 벗어날 수 있습니다. 이 역시 outliers 패키지에서 지원합니다.
require(outliers)
set.seed(1234)
x<-rnorm span="">-rnorm>
여러 개의 이상치를 다루기 위해 3000개의 관측치를 지닌 예제를 실행해 보겠습니다. 그리고 Zm이라는 새로운 값에 type="mad"를 지정합니다. 그 다음 역시 which를 써서 3 이상인 값을 알아봅니다. 참고로 median인데 mad 인 이유는 중앙값 절대 편차 median absolute deviation (MAD)라는 단어의 약자이기 때문입니다. 이를 수정된 Z값 (modified Z score)라고 하며 구하는 방식에 대해서는 링크를 참조하시면 됩니다.
Zm<-scores span="" type="mad" x="">-scores>
which(Zm %in% Zm[Zm>3|Zm< -3])
> Zm<-scores span="" type="mad" x="">-scores>
> which(Zm %in% Zm[Zm>3|Zm< -3])
[1] 178 237 392 486 1660 1815 2111 2414
그리고 이전 시간에 설명을 잘못했는데, 표준값의 절대값이 3 이상인 경우이므로 3이상만이 아니라 -3 이하 값도 필요합니다. Zm< -3을 넣어야 하는데 실수했네요. 중요한 점은 <-3 -3="" span="">-3>
아무튼 이번엔 이상치의 갯수가 8개로 늘었습니다. 수정된 Z 값에서는 더 많은 이상치가 나왔는데, 각각의 값을 보기 위해 이번에는 데이터 프레임의 형태로 바꿔보겠습니다. x값을 이용해 DF라는 데이터 프레임을 만들고 다시 수정된 Z값(Zm 변수)로 넣어보겠습니다.
DF<-as .data.frame="" span="" x="">-as>
DF$Zm<-scores span="" type="mad" x="">-scores>
head(DF)
x Zm
1 96.37880 -1.2328145
2 100.83229 0.2683791
3 103.25332 1.0844689
4 92.96291 -2.3842547
5 101.28737 0.4217810
6 101.51817 0.4995776
이제 subset 을 이용해 표준값의 절대값이 3이상인 값을 구해보겠습니다.
DF1=subset(DF,Zm>3|Zm< -3)
DF1
> DF1=subset(DF,Zm>3|Zm< -3)
> DF1
x Zm
178 109.13130 3.065834
237 90.30054 -3.281692
392 89.81181 -3.446436
486 109.58770 3.219680
1660 90.63523 -3.168874
1815 109.50381 3.191402
2111 90.71603 -3.141637
2414 109.06743 3.044304
각각의 값을 확인할 수 있었습니다. 이를 모두 NA 값으로 바꿔보겠습니다.
replace(x,Zm>3,NA)->x
이후 각각의 값이 정상적으로 바뀌었는지 확인할 수도 있지만, 일괄적으로 확인하기 위해 데이터 프레임으로 확인하겠습니다.
replace(DF$x,DF$Zm>3|DF$Zm< -3,NA)->DF$x
DF1=subset(DF,Zm>3|Zm< -3)
DF1
> DF1
x Zm
178 NA 3.065834
237 NA -3.281692
392 NA -3.446436
486 NA 3.219680
1660 NA -3.168874
1815 NA 3.191402
2111 NA -3.141637
2414 NA 3.044304
데이터 프레임에서 값이 모두 NA로 변경된 것을 볼 수 있습니다. 이 코드 그대로 사용하되 Type만 Z로 바꿔주면 Z 값에서 그대로 사용이 가능합니다. 비교해보면 비슷한 결과가 나오는 것을 알 수 있는데, 표준 정규분포를 따르는 예제이기 때문입니다. 물론 이런 경우는 거의 없을 것이기 때문에 실제로 그렇지 않은 예제를 진행해 보겠습니다.
댓글
댓글 쓰기