데이터 세트에서 특이 치를 제거하는 방법


98

나는 아름다움과 나이에 대한 다 변수 데이터를 가지고 있습니다. 연령은 2 (20, 22, 24 .... 40) 간격으로 20 ~ 40 세이며, 데이터 기록마다 1 ~ 5 세의 연령과 미용 등급이 부여됩니다. 이 데이터의 상자 그림 (X 축의 연령, Y 축의 아름다움 등급)을 수행 할 때 각 상자의 수염 외부에 몇 가지 특이 치가 표시됩니다.

데이터 프레임 자체에서 이러한 이상 치를 제거하고 싶지만 R이 상자 플롯에 대한 이상 치를 어떻게 계산하는지 잘 모르겠습니다. 아래는 내 데이터가 어떻게 보일지에 대한 예입니다. 여기에 이미지 설명 입력


2
boxplot함수는 (다른 통계 중에서) 이상 값을 보이지 않게 반환합니다. 시도 foo <- boxplot(...); foo읽고 ?boxplot출력을 이해합니다.
Joshua Ulrich 2011 년

@Prasad의 답변에 대한 의견에 따라 질문을 수정해야합니다!
aL3xa

@ aL3xa : 두 번째 문단의 첫 번째 문장에 있습니다.
Joshua Ulrich


데이터에 대한 링크를 보낼 수 있습니까?
wordsforthewise

답변:


119

좋습니다. 이와 같은 것을 데이터 세트에 적용해야합니다. 교체 및 저장하지 마십시오. 그렇지 않으면 데이터가 파괴됩니다! 그리고 btw, 데이터에서 이상 값을 제거해서는 안됩니다.

remove_outliers <- function(x, na.rm = TRUE, ...) {
  qnt <- quantile(x, probs=c(.25, .75), na.rm = na.rm, ...)
  H <- 1.5 * IQR(x, na.rm = na.rm)
  y <- x
  y[x < (qnt[1] - H)] <- NA
  y[x > (qnt[2] + H)] <- NA
  y
}

실제로 확인하려면 :

set.seed(1)
x <- rnorm(100)
x <- c(-10, x, 10)
y <- remove_outliers(x)
## png()
par(mfrow = c(1, 2))
boxplot(x)
boxplot(y)
## dev.off()

그리고 다시 한번, 당신은 절대로 이것을 혼자서하지 말아야합니다. =)

편집 :na.rm = TRUE 기본으로 추가 했습니다.

EDIT2 :quantile 기능 제거 , 첨자 추가, 따라서 기능이 더 빨라졌습니다! =)

여기에 이미지 설명 입력


도와 주셔서 감사합니다! R이 상자 그림에서 이상 값을 출력 할 수 있다면 이러한 중간 계산을 수행 할 필요가 없다고 생각합니다. 이상 값 삭제는 할당에만 해당됩니다.
Dan Q

3
좋아요, 여기에 뭔가 빠졌습니다. 데이터에서 특이 치를 제거하여 boxplot. 그것은 관리 가능하며 귀하의 질문에 답변했기 때문에 @Prasad의 답변을 표시해야합니다. "outlier rule"을 사용하여 특이 치를 제외하고 q +/- (1.5 * H)일부 분석을 실행하려면이 함수를 사용하십시오. BTW, 인터넷 검색없이 처음부터이 작업을 수행 했으므로이 기능을 사용하여 휠을 다시 만들 가능성이 있습니다 ...
aL3xa 2011 년

10
stackoverflow에 할당 질문을해서는 안됩니다!
hadley

7
그 말은 우리도 대답하지 말아야한다는 뜻입니까? =)
aL3xa

5
"이상 값은 그저 존재하는 것입니다"? 반드시 그런 것은 아닙니다. 측정 오류로 인해 발생할 수 있으므로 철저히 검토해야합니다. 이상 값이 너무 크면 의미가 있거나 너무 크지 않을 수 있습니다. 그렇기 때문에 (적어도 생물학에서는) 중앙값이 보통 평균보다 인구에 대해 더 많이 말합니다.
Rodrigo

133

아무도 가장 간단한 답변을 게시하지 않았습니다.

x[!x %in% boxplot.stats(x)$out]

또한 다음을 참조하십시오 : http://www.r-statistics.com/2011/01/how-to-label-all-the-outliers-in-a-boxplot/


4
정말 우아합니다. 감사. 그러나 분포에 둘 이상의 모드가 있고 이상 값이 실제로 적고 흩어져있는 경우주의해야합니다.
KarthikS

데이터 세트에서 색인을 얻을 수 있다면 좋았을 것입니다. 수행하는 방식은 데이터 값을 기준으로 필터링됩니다. 상자 그림도 그룹화를 수행하는 경우 각 그룹에서 반드시 동일한 데이터 값이 이상 치가되는 것은 아닙니다.
adam

2
데이터 세트를 변경하지 않는다는 점도 언급하는 것이 중요합니다. 이것은 단지 필터링 방법입니다. 따라서 이상 값없이 데이터 세트를 사용하려면 변수에 할당하십시오. 예result = x[!x %in% boxplot.stats(x)$out]
Victor Augusto

한 줄의 코드 만 있다고해서 반드시 간단한 것은 아닙니다! 특히 초보자를 위해 주석이없는 한 줄 코드를 이해하는 것이 항상 쉬운 것은 아닙니다.
PeyM87

29

상자 그림 outline = FALSE을 수행 할 때 옵션으로 사용 합니다 (도움말 읽기!).

> m <- c(rnorm(10),5,10)
> bp <- boxplot(m, outline = FALSE)

여기에 이미지 설명 입력


4
실제로 이것은 상자 그림 자체에서 특이 치를 제거하지만 데이터 프레임에서 특이 치를 제거하고 싶습니다.
Dan Q

2
@Joshua가 말했듯이 boxplot 함수 (특히 목록 의 outgroup항목)에서 반환 된 데이터를 살펴 봐야 합니다.
Prasad Chalasani 2011 년

16

boxplot 함수는 플로팅을 수행하는 데 사용되는 값을 반환합니다 (실제로는 bxp ()에 의해 수행됨).

bstats <- boxplot(count ~ spray, data = InsectSprays, col = "lightgray") 
#need to "waste" this plot
bstats$out <- NULL
bstats$group <- NULL
bxp(bstats)  # this will plot without any outlier points

나는 "이상 값"을 제거하는 것이 통계적 과실이라고 생각하기 때문에 의도적으로 특정 질문에 대답하지 않았습니다. 나는 그것들을 상자 그림에 그리지 않는 것이 허용 가능한 관행이라고 생각하지만, 단지 표준 편차 나 사 분위수 간 폭을 초과하기 때문에 그것들을 제거하는 것은 관찰 기록을 체계적이고 비 과학적으로 망가 뜨리는 것입니다.


4
글쎄요, 왜 질문을했는지 모른 채 질문을 회피하는 것도 좋은 습관이 아닙니다. 예, 데이터에서 '이상 값'을 제거하는 것은 좋지 않지만 때로는 특정 작업에 대해 이상 값이없는 데이터가 필요합니다. 최근에받은 통계 할당에서 데이터에 사용할 최적의 회귀 모델을 결정하기 위해 특이 치없이 집합을 시각화해야했습니다. 그래서 거기!
Alex Essilfie 2012-06-25

4
"최상의 회귀 모델 결정"과 관련하여 귀하가 받았을 수있는 조언을 특히 설득력있는 것으로 고려하지 않습니다. 대신 애매하게 언급 된 목적을 위해 이상 값을 제거해야한다면 제 입장이 잘못되었다는 증거가 아니라이를 조언 한 사람에게 제대로 반영되지 않은 것 같습니다.
IRTFM 2012-06-25

나는 당신이 "노이즈"를 제거하고 있다는 것을 알 때 그것이 합법적이라고 생각한다. 특히 생리 학적 데이터에서.
roscoe1895

예. 별도의 프로세스가 신호를 생성한다고 믿을만한 타당한 이유가 있다면 데이터에서 제거하는 것이 정당합니다.
IRTFM

9

나는 이상 치를 제거와 관련된 패키지를 보았다,이 패키지 발견 (놀랍게도 소위 "이상 치를!") : https://cran.r-project.org/web/packages/outliers/outliers.pdf를
당신이 그것을 통과하는 경우 이상 값을 제거하는 다양한 방법을 확인하고 그중 rm.outlier가장 사용하기 편리한 방법을 찾았 으며 위 링크에서 "통계 테스트를 통해 이상 값이 감지되고 확인되면이 함수는 제거하거나 샘플 평균 또는 중앙값으로 대체 할 수 있습니다." 또한 다음은 동일한 소스의 사용법 부분입니다.
" 사용법

rm.outlier(x, fill = FALSE, median = FALSE, opposite = FALSE)

인수
x 데이터 세트, 가장 자주는 벡터. 인수가 데이터 프레임이면 sapply에 의해 각 열에서 이상 값이 제거됩니다. 행렬이 주어질 때 apply에 의해 동일한 동작이 적용됩니다.
채우기 TRUE로 설정하면 이상 값 대신 중앙값 또는 평균이 배치됩니다. 그렇지 않으면 이상 값이 제거됩니다.
중앙값 TRUE로 설정하면 이상 값 대체에서 평균 대신 중앙값이 사용됩니다. TRUE로 설정하면 반대, 반대 값을 제공합니다 (가장 큰 값이 평균과 최대 차이가있는 경우 가장 작은 값을 제공하고 그 반대의 경우도 마찬가지). "


이것은 훌륭해 보이지만 데이터 프레임에 시계열 열이 있으면 시계열이 변경됩니다.
PeyM87

7
x<-quantile(retentiondata$sum_dec_incr,c(0.01,0.99))
data_clean <- data[data$attribute >=x[1] & data$attribute<=x[2],]

이상 값을 제거하기가 매우 쉽습니다. 위의 예에서는 속성 값의 2 백분위 수에서 98 백분위 수로 추출합니다.


5

하지 않을 것 :

z <- df[df$x > quantile(df$x, .25) - 1.5*IQR(df$x) & 
        df$x < quantile(df$x, .75) + 1.5*IQR(df$x), ] #rows

이 작업을 아주 쉽게 수행 할 수 있습니까?


4

@sefarkas의 제안에 추가하고 분위수를 컷오프로 사용하면 다음 옵션을 탐색 할 수 있습니다.

newdata <- subset(mydata,!(mydata$var > quantile(mydata$var, probs=c(.01, .99))[2] | mydata$var < quantile(mydata$var, probs=c(.01, .99))[1]) ) 

이렇게하면 99 번째 분위수를 초과하는 포인트가 제거됩니다. aL3Xa가 이상 값 유지에 대해 말한 것처럼주의해야합니다. 데이터에 대한 보수적 인 대안보기를 얻기 위해서만 제거해야합니다.


그 것이다 0.910.99? 에서 mydata$var < quantile(mydata$var, probs=c(.01, .91))[1])또는mydata$var < quantile(mydata$var, probs=c(.01, .99))[1])
Komal Rathi

99 번째 백분위 수 대신 91 번째 백분위 수를 사용해야하는 특별한 이유가있는 경우 사용할 수 있습니다. 그것은 휴리스틱
일뿐입니다

1

한 가지 방법은

my.NEW.data.frame <- my.data.frame[-boxplot.stats(my.data.frame$my.column)$out, ]

또는

my.high.value <- which(my.data.frame$age > 200 | my.data.frame$age < 0) 
my.NEW.data.frame <- my.data.frame[-my.high.value, ]

0

이상 값은 피크와 매우 유사하므로 피크 감지기는 이상 값을 식별하는 데 유용 할 수 있습니다. 여기에 설명 된 방법 z- 점수를 사용하여 상당히 좋은 성능을 제공합니다. 페이지 아래의 애니메이션은 이상 값 또는 피크에 대한 방법 신호를 보여줍니다.

피크가 항상 이상 값과 같지는 않지만 자주 비슷합니다.

여기에 예가 나와 있습니다.이 데이터 세트는 직렬 통신을 통해 센서에서 읽습니다. 간헐적 인 직렬 통신 오류, 센서 오류 또는 둘 다 반복적이고 명확하게 잘못된 데이터 포인트로 이어집니다. 이 지점에는 통계적 가치가 없습니다. 그들은 틀림없이 이상 치가 아니라 오류입니다. z-score 피크 감지기는 스퓨리어스 데이터 포인트에서 신호를 보낼 수 있었고 깨끗한 결과 데이터 세트를 생성했습니다.여기에 이미지 설명 입력


-1

이 시도. 함수에 변수를 입력하고 제거 된 특이 치를 포함 할 변수에 o / p를 저장합니다.

outliers<-function(variable){
    iqr<-IQR(variable)
    q1<-as.numeric(quantile(variable,0.25))
    q3<-as.numeric(quantile(variable,0.75))
    mild_low<-q1-(1.5*iqr)
    mild_high<-q3+(1.5*iqr)
    new_variable<-variable[variable>mild_low & variable<mild_high]
    return(new_variable)
}

답변에 대한 설명을 추가하십시오. 답변 방법을 참조하십시오 .
ejderuby
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.