ほぼ正規分布のデータの場合、ボックスプロットは、データの中央値と広がり、および異常値の存在をすばやく視覚化する優れた方法です。
ただし、より重い裾の分布では、多くのポイントが外れ値として表示されます。これは、外れ値がIQRの固定因子の外側にあると定義されているためです。
では、この種のデータを視覚化するために人々は何を使用していますか?もっと適応したものはありますか?それが重要な場合は、Rでggplotを使用します。
ほぼ正規分布のデータの場合、ボックスプロットは、データの中央値と広がり、および異常値の存在をすばやく視覚化する優れた方法です。
ただし、より重い裾の分布では、多くのポイントが外れ値として表示されます。これは、外れ値がIQRの固定因子の外側にあると定義されているためです。
では、この種のデータを視覚化するために人々は何を使用していますか?もっと適応したものはありますか?それが重要な場合は、Rでggplotを使用します。
回答:
そして、私は現在の回答のほとんどは、実際にその問題に対処しないと思う- OPを持っているように見え、中央の問題は、彼らは非常に重い尾のデータを持っているということですすべてで、私は答えに私の以前のコメントを推進していますので、。
箱ひげ図を使い続けたい場合は、いくつかのオプションを以下に示します。基本的な問題を示すいくつかのデータをRで作成しました。
set.seed(seed=7513870)
x <- rcauchy(80)
boxplot(x,horizontal=TRUE,boxwex=.7)
データの中央半分は、幅数mmの小さなストリップに縮小されます。同じ問題は、QQプロット、ストリップチャート、蜂の巣/蜂の群れプロット、バイオリンプロットなど、他の提案のほとんどを悩ませています。
今、いくつかの潜在的なソリューション:
1)変換、
対数または逆数が読み取り可能な箱ひげ図を生成する場合、それらは非常に良いアイデアである可能性があり、元のスケールを軸上に表示することができます。
大きな問題は、「直感的な」変換がない場合があることです。クォンタイル自体は単調な変換で十分に変換されますが、フェンスはそうではないという小さな問題があります。変換したデータをボックスプロットするだけの場合(ここで行ったように)、ウィスカーは元のプロットとは異なるx値になります。
ここでは、逆双曲線正弦(asinh)を使用しました。それは尾のログのようなものであり、ゼロに近い線形に似ていますが、一般的には直感的な変換を見つけることはないため、一般的にログのようなかなり直感的な変換が明らかでない限り、このオプションはお勧めしません。そのためのコード:
xlab <- c(-60,-20,-10,-5,-2,-1,0,1,2,5,10,20,40)
boxplot(asinh(x),horizontal=TRUE,boxwex=.7,axes=FALSE,frame.plot=TRUE)
axis(1,at=asinh(xlab),labels=xlab)
2)スケールブレーク-極端な外れ値を取り、中央よりもはるかに圧縮されたスケールで両端で狭いウィンドウに圧縮します。これを行う場合は、スケール全体で完全に休憩することを強くお勧めします。
opar <- par()
layout(matrix(1:3,nr=1,nc=3),heights=c(1,1,1),widths=c(1,6,1))
par(oma = c(5,4,0,0) + 0.1,mar = c(0,0,1,1) + 0.1)
stripchart(x[x< -4],pch=1,cex=1,xlim=c(-80,-5))
boxplot(x[abs(x)<4],horizontal=TRUE,ylim=c(-4,4),at=0,boxwex=.7,cex=1)
stripchart(x[x> 4],pch=1,cex=1,xlim=c(5,80))
par(opar)
3)極端な外れ値のトリミング(これを非常に明確に示すことなく通常はアドバイスしませんが、次のプロットのように見えます。両端に「<5」と「2>」はありません)
4)極端に外れた「矢印」と呼ぶもの-トリミングに似ていますが、トリミングされた値のカウントが両端に示されています
xout <- boxplot(x,range=3,horizontal=TRUE)$out
xin <- x[!(x %in% xout)]
noutl <- sum(xout<median(x))
nouth <- sum(xout>median(x))
boxplot(xin,horizontal=TRUE,ylim=c(min(xin)*1.15,max(xin)*1.15))
text(x=max(xin)*1.17,y=1,labels=paste0(as.character(nouth)," >"))
text(x=min(xin)*1.17,y=1,labels=paste0("< ",as.character(noutl)))
個人的には、少なくともデータの感触をつかむために、ジッタのあるストリッププロットを使用するのが好きです。以下のプロットは、Rの格子を使用しています(ggplot2ではありません)。これらのプロットは、解釈しやすいため気に入っています。あなたが言うように、これの1つの理由は、変換がないことです。
df <- data.frame(y1 = c(rnorm(100),-4:4), y2 = c(rnorm(100),-5:3), y3 = c(rnorm(100),-3:5))
df2 <- stack(df)
library(lattice)
stripplot(df2$values ~ df2$ind, jitter=T)
beeswarmのパッケージは、(提案のため@Januaryのおかげで)大きなstripplotに代わるものを提供しています。
beeswarm(df2$values ~ df2$ind)
データについては、ほぼ正規分布しているので、別の試みとしてqqplot、この場合はqqnormがあります。
par(mfrow=c(1,3))
for(i in 1:3) { qqnorm(df[,i]); abline(c(0,0),1,col="red") }
beeswarm
パッケージからのプロットです。
あなたは箱ひげ図に固執することができます。ウィスカーを定義するにはさまざまな可能性があります。テールの厚さ、サンプル数、および外れ値に対する許容度に応じて、2つの多かれ少なかれ極端な変位値を選択できます。あなたの問題を考えると、IQRで定義されたウィスカを避けます。
もちろん、データを変換したい場合を除き、この場合は理解が難しくなります。