データの可視化に於いて重宝されるグラフの一つに「箱ひげ図」というものがあります。
データの四分位点、中央値、最大値、最小値を記載するのでデータの分布が一覧できるというものです。
しかし箱ひげ図には重大な問題があります。
先ずはプロットしてみる
Rがあれば誰でも持っているアヤメのデータを使います。 ”がく”の長さを取り出して箱ひげ図にしてみます。
当然、最大値と四分位点、最小値と四分位点の間にもデータはあるのですが、箱が四分位点で終わってしまっているため、あたかもそこにはデータが無いような印象ではないでしょうか?
そこでバイオリンプロット
そんな箱ひげ図よりも便利な図としてバイオリンプロットというものが存在します。
ヒストグラムを縦にしたようなもので、これであればデータの凡その分布もわかります
箱ひげ図と比較してみる
こちらのサイトを参考にさせて頂きました。
バイオリンプロットの中にボックスプロットを入れると、より情報量が増えますね。
今回のコード
データの集計まで
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
バイオリンプロットの方が情報量が多いよ!という話は、
で指摘されていました。
箱ひげ図が先に広がってしまったためにバイオリンプロットは余りメジャーではないようですが(見た目も少し気持ち悪いですし) 誤った印象を与えないという意味ではもっと使って欲しいと思います。