ggplot2 boxplot에서 특이 값 무시


132

ggplot2 boxplot에서 특이 치를 어떻게 무시합니까? 나는 단순히 그것들이 사라지기를 원하지 않지만 (즉, outlier.size = 0) y 축 스케일이 1/3 백분위 수를 나타내도록 무시하기를 원합니다. 내 특이 치 때문에 "상자"가 너무 작아서 실제 선이 줄어 듭니다. 이것을 다루는 기술이 있습니까?

편집 예는 다음과 같습니다.

y = c(.01, .02, .03, .04, .05, .06, .07, .08, .09, .5, -.6)
qplot(1, y, geom="boxplot")

여기에 이미지 설명을 입력하십시오


일부 샘플 데이터와 재현 가능한 예제를 통해보다 쉽게 ​​도움을받을 수 있습니다.
Andrie

3
내 파일은 200 메가입니다! 1 번째와 3 번째 Quantile과 몇 개의 특이 치 사이에 많은 데이터 포인트가있는 데이터 세트 만 가져 오십시오 (1 개만 필요). 만약 특이
치가 1/3

예, 그것이 제가 생각한 것입니다. 이러한 데이터 세트를 구성하고 dput ()을 사용하여 ggplot () 문과 함께 여기에 게시하십시오. 도와 드리겠습니다.
Andrie

관심있는 y 축 부분에서 y 축 제한을 "확대"로 변경할 수 없습니까?
개빈 심슨

2
내가 보자 .... 아, 죄송합니다. fivenum()IIRC scale_y_continuous()가 박스 플롯 의 상단 및 하단 힌지에 사용되는 것을 추출하기 위해 데이터를 수행 하고 @Ritchie가 보여준 호출 에서 해당 출력을 사용하십시오 . R 및 ggplot이 제공하는 도구를 사용하여 매우 쉽게 자동화 할 수 있습니다. 수염도 포함해야하는 경우 수염 boxplot.stats()의 상한 및 하한을 구하여로 사용하십시오 scale_y_continuous().
개빈 심슨

답변:


141

boxplot.stats를 사용하는 솔루션은 다음과 같습니다.

# create a dummy data frame with outliers
df = data.frame(y = c(-100, rnorm(100), 100))

# create boxplot that includes outliers
p0 = ggplot(df, aes(y = y)) + geom_boxplot(aes(x = factor(1)))


# compute lower and upper whiskers
ylim1 = boxplot.stats(df$y)$stats[c(1, 5)]

# scale y limits based on ylim1
p1 = p0 + coord_cartesian(ylim = ylim1*1.05)

15
자동 계산의 경우 +1, 데이터를 제외하지 않고 확대 / 축소하기 위해 coord_cartesian을 사용하는 경우 +1
Ben Bolker

2
@ 벤-두 개의 계정이 있습니까? =) @Ramnath-이것은 정말 우아한 솔루션입니다
SFun28

7
위의 방법을 사용하면 한계가 한쪽에서는 작은 극단으로, 다른 쪽에서는 큰 극단으로 치우칠 ylim <- c(-0.1, 1000) * 1.05[1] 0.105 1050있습니다 ( 예 : gives) . 당신이 사용할 수있는 평균 주위에 동등한 한계를 얻으려면 ylim + c(-0.05, 0.05) * diff(ylim) / 2. 내 의견으로는 예뻐.
Bram Visser

2
@Ramnath $ stats [c (1,5)]는 무엇을합니까?
lukeg

3
를 사용하면이 작동하지 않습니다 facet_grid(). 그런 다음 하나 대신 여러 개의 상자 그림이 있습니다. 따라서 당신은 올바른 한계를 얻지 못합니다.
WitheShadow

204

사용 geom_boxplot(outlier.shape = NA)이상치를 표시하지하고 scale_y_continuous(limits = c(lower, upper))축 제한을 변경할 수 있습니다.

예입니다.

n <- 1e4L
dfr <- data.frame(
  y = exp(rlnorm(n)),  #really right-skewed variable
  f = gl(2, n / 2)
)

p <- ggplot(dfr, aes(f, y)) + 
  geom_boxplot()
p   # big outlier causes quartiles to look too slim

p2 <- ggplot(dfr, aes(f, y)) + 
  geom_boxplot(outlier.shape = NA) +
  scale_y_continuous(limits = quantile(dfr$y, c(0.1, 0.9)))
p2  # no outliers plotted, range shifted

실제로 Ramnath가 자신의 답변 (및 의견에서 Andrie도)에서 알 수 있듯이 통계를 계산 한 후을 통해 척도를 자르는 것이 더 합리적 coord_cartesian입니다.

coord_cartesian(ylim = quantile(dfr$y, c(0.1, 0.9)))

(아직 scale_y_continuous축 중단 문제를 해결하는 데 사용해야 할 수도 있습니다 .)


1
따라서 1 / 3 백분위 수를 계산하여 하한 / 상한을 계산해야합니까? gg-plot2에게 이상 치를 무시하고 지능적으로 확장하도록 지시하는 자동 마술 방법이 없다는 것을 의미합니까?
SFun28

38
scale_y_continuous (limits = ...)에주의하십시오. 이렇게하면 한계를 벗어난 데이터가 제거되고 통계 계산이 수행됩니다. 즉, 평균 및 기타 요약에 영향을 미칩니다. 이것이 당신이 원하는 것이라면 좋습니다. 대안은 coord_cartesian (limits = ...)-데이터를 제거하거나 요약에 영향을주지 않고이 '확대'를 사용하는 것입니다.
Andrie

@ 앤드리-감사합니다! 평균 및 기타 요약에 영향을 미치지 않기를 바랍니다.
SFun28

1
coord_cartesian()coord_flip()내 경험상, 와 잘 어울리지 않으므로 선호합니다 scale_y_continuous().
PatrickT

1
이것이 가장 좋은 해결책입니다. 특이 치를 숨기려는 이유는 geom_jitter로 지터 포인트를 플로팅하기 때문입니다. 이 경우 특이 치가 방해가되어 예상보다 많은 포인트가있는 것처럼 보이게합니다.
williamsurles

14

나는 같은 문제가 있었고 Q1, Q2, median, ymin, ymax의 값을 다음과 같이 사전 계산했다 boxplot.stats.

# Load package and generate data
library(ggplot2)
data <- rnorm(100)

# Compute boxplot statistics
stats <- boxplot.stats(data)$stats
df <- data.frame(x="label1", ymin=stats[1], lower=stats[2], middle=stats[3], 
                 upper=stats[4], ymax=stats[5])

# Create plot
p <- ggplot(df, aes(x=x, lower=lower, upper=upper, middle=middle, ymin=ymin, 
                    ymax=ymax)) + 
    geom_boxplot(stat="identity")
p

결과는 특이 치가없는 상자 그림입니다. 여기에 이미지 설명을 입력하십시오


9

한 가지 아이디어는 두 단계로 데이터 를 winsorize 하는 것입니다 .

  1. 주어진 첫 번째 백분위 수에서의 컷 또는 평균 이상의 N 표준 편차 또는

  2. 두 번째 단계에서 주어진 경계를 넘어서 그 경계의 값으로 값을 설정하십시오

나는 이것이 더 현대적인 강력한 기술에 의해 지배되어야하는 구식 방법 이라고 강조 해야 하지만 여전히 많은 방법을 접하게됩니다.


1
조용히 공감 한 사람 : 이유 를 설명하기 위해 의견을 남기십시오 .
Dirk Eddelbuettel

내가 아니 었어 백분위 수 (보통 10 일과 90 일)에 멈추는 수염이 환경 데이터와 매우 흔하게 보인다고 덧붙이고 싶었습니다.
Richie Cotton

나는 침묵 +1 였고 다른 것을 제공하기를 바랍니다. Winsorizing은 거의 항상 econ + finance에서 수행됩니다. SFun에 데이터 시각화를 망치는 이상 치가있는 경우 데이터 분석에 어떤 영향을 미치는지 궁금합니다.
Richard Herron

이 게시물을 다시 읽고 있었을 때, 당신은 windsorizing이 더 오래된 기술이라고 언급했습니다 .... 더 현대적인 기술은 무엇입니까?
SFun28

1
일반적으로 지난 30 년 이상 개발 된 강력한 방법.
Dirk Eddelbuettel

2

geom_boxplot 함수의 "coef"옵션을 사용하면 사 분위수 범위에서 특이 치 컷오프를 변경할 수 있습니다. 이 옵션은 stat_boxplot 기능에 대해 설명되어 있습니다. 특이 치를 비활성화하기 위해 (즉, 정규 데이터로 처리됨) 기본값 1.5를 사용하는 대신 매우 높은 컷오프 값을 지정할 수 있습니다.

library(ggplot2)
# generate data with outliers:
df = data.frame(x=1, y = c(-10, rnorm(100), 10)) 
# generate plot with increased cutoff for outliers:
ggplot(df, aes(x, y)) + geom_boxplot(coef=1e30)

3
그것은 수염을 확장하고 차트의 크기를 조정하지 않습니다
Moody_Mudskipper

2

수염을 최대 및 최소 값으로 확장하려면 coef인수를 조정할 수 있습니다 . 의 기본값 coef은 1.5입니다 (즉, 수염의 기본 길이는 IQR의 1.5 배입니다).

# Load package and create a dummy data frame with outliers 
#(using example from Ramnath's answer above)
library(ggplot2)
df = data.frame(y = c(-100, rnorm(100), 100))

# create boxplot that includes outliers
p0 = ggplot(df, aes(y = y)) + geom_boxplot(aes(x = factor(1)))

# create boxplot where whiskers extend to max and min values
p1 = ggplot(df, aes(y = y)) + geom_boxplot(aes(x = factor(1)), coef = 500)

p0의 이미지

p1의 이미지


2

Ipaper :: geom_boxplot2는 원하는 것입니다.

# devtools::install_github('kongdd/Ipaper')
library(Ipaper)
library(ggplot2)
p <- ggplot(mpg, aes(class, hwy))
p + geom_boxplot2(width = 0.8, width.errorbar = 0.5)

여기에 이미지 설명을 입력하십시오


감사!! 내 데이터로 테스트하여 완벽하게 작동합니다! 나는 github 사물의 안정성 / 오랜 시간 지원에 대해 확실하지 않지만이 솔루션을 권장합니다.
Gildas
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.