読者です 読者をやめる 読者になる 読者になる

広告/統計/アニメ/映画 等に関するブログ

広告/統計/アニメ/映画 等に関するブログ

箱ひげ図とバイオリンプロットの印象の違い

R 統計

データの可視化に於いて重宝されるグラフの一つに「箱ひげ図」というものがあります。

箱ひげ図 - Wikipedia

データの四分位点、中央値、最大値、最小値を記載するのでデータの分布が一覧できるというものです。

しかし箱ひげ図には重大な問題があります。

先ずはプロットしてみる

Rがあれば誰でも持っているアヤメのデータを使います。 ”がく”の長さを取り出して箱ひげ図にしてみます。

f:id:yyhhyy:20160820201652p:plain

当然、最大値と四分位点、最小値と四分位点の間にもデータはあるのですが、箱が四分位点で終わってしまっているため、あたかもそこにはデータが無いような印象ではないでしょうか?

そこでバイオリンプロット

そんな箱ひげ図よりも便利な図としてバイオリンプロットというものが存在します。

f:id:yyhhyy:20160820202436p:plain

ヒストグラムを縦にしたようなもので、これであればデータの凡その分布もわかります

箱ひげ図と比較してみる

こちらのサイトを参考にさせて頂きました。

バイオリンプロットの中にボックスプロットを入れると、より情報量が増えますね。

sugioka.wiki.fc2.com

f:id:yyhhyy:20160820202041p:plain

今回のコード

データの集計まで

ggplotで描けるようにreshapeパッケージでデータを変更

library("reshape2", lib.loc="C:/hogehoge/r/R-3.2.3/library")
iris_m <- melt(iris,id.vars = c("Species"))

こんな感じになります

Species     variable value
1  setosa Sepal.Length   5.1
2  setosa Sepal.Length   4.9
3  setosa Sepal.Length   4.7
4  setosa Sepal.Length   4.6
5  setosa Sepal.Length   5.0
6  setosa Sepal.Length   5.4

そのうち”がく”(=Sepal)のデータだけをdplyrのfilter関数で抜き出します

library("dplyr", lib.loc="C:/hogehoge/r/R-3.2.3/library")
iris_m_sl <- iris_m %>% filter(variable==c("Sepal.Length"))

tailで後半のデータを確認するとSepal.Lengthだけになっているのがわかります

Species     variable value
145 virginica Sepal.Length   6.7
146 virginica Sepal.Length   6.7
147 virginica Sepal.Length   6.3
148 virginica Sepal.Length   6.5
149 virginica Sepal.Length   6.2
150 virginica Sepal.Length   5.9

ボックスプロット

ggplot2のgeom_boxplotを使います。 また先ほどのサイトを参考にして、平均値もサークルでプロットしておきます。

library("ggplot2", lib.loc="C:/hogehoge/r/R-3.2.3/library")
iris_m_sl_g2 <- ggplot(iris_m_sl,aes(x=Species,y=value,color=Species,fill=Species))
iris_m_sl_g2 <- iris_m_sl_g2 + geom_boxplot(color="black")
iris_m_sl_g2 <- iris_m_sl_g2 + stat_summary(fun.y=mean,geom = "point", fill="white",shape=21,size=3) 
iris_m_sl_g2 <- iris_m_sl_g2 + theme(axis.text.x=element_text(angle=0,colour="black",size=12,hjust=1))
iris_m_sl_g2 <- iris_m_sl_g2 + theme(axis.text.y=element_text(angle=0,colour="black",size=16))
plot(iris_m_sl_g2)
ggsave(plot=iris_m_sl_g2,file="iris_m_sl_g_1.png",dpi=300,width=4,height=3,scale=2)

バイオリンプロット

バイオリンプロットはgeom_violinです。

デフォルトでは横幅が調整されてしまうので、データ量も比較したい場合は、scale="count"としておくと良いようです。

library("ggplot2", lib.loc="C:/hogehoge/r/R-3.2.3/library")
iris_m_sl_g <- ggplot(iris_m_sl,aes(x=Species,y=value,color=Species,fill=Species))
iris_m_sl_g <- iris_m_sl_g + geom_violin(scale="count")
iris_m_sl_g <- iris_m_sl_g + theme(axis.text.x=element_text(angle=0,colour="black",size=12,hjust=1))
iris_m_sl_g <- iris_m_sl_g + theme(axis.text.y=element_text(angle=0,colour="black",size=16))
plot(iris_m_sl_g)
ggsave(plot=iris_m_sl_g,file="iris_m_sl_g_2.png",dpi=300,width=4,height=3,scale=2)

みんなのR

バイオリンプロットの方が情報量が多いよ!という話は、

で指摘されていました。

箱ひげ図が先に広がってしまったためにバイオリンプロットは余りメジャーではないようですが(見た目も少し気持ち悪いですし) 誤った印象を与えないという意味ではもっと使って欲しいと思います。