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

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

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



답변

좋습니다. 이와 같은 것을 데이터 세트에 적용해야합니다. 교체 및 저장하지 마십시오. 그렇지 않으면 데이터가 파괴됩니다! 그리고 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 기능 제거 , 첨자 추가, 따라서 기능이 더 빨라졌습니다! =)

여기에 이미지 설명 입력


답변

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

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

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


답변

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

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

여기에 이미지 설명 입력


답변

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

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


답변

나는 이상 치를 제거와 관련된 패키지를 보았다,이 패키지 발견 (놀랍게도 소위 “이상 치를!”) : 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로 설정하면 반대, 반대 값을 제공합니다 (가장 큰 값이 평균과 최대 차이가있는 경우 가장 작은 값을 제공하고 그 반대의 경우도 마찬가지). “


답변

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

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


답변

하지 않을 것 :

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

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