箱ひげ図は要約統計量(五数要約)を利用してるため頑健ではありますが、データの分布形状を見るにはあまり適していません。そこで、箱ひげ図の特徴を利用しながらデータ分布も見ることができるいくつかのプロットを紹介します。
Packages and Datasets
本ページではR version 3.4.4 (2018-03-15)の標準パッケージ以外に以下の追加パッケージを用いています。
Package | Version | Description |
---|---|---|
tidyverse | 1.2.1 | Easily Install and Load the ‘Tidyverse’ |
また、本ページでは以下のデータセットを用いています。
Dataset | Package | Version | Description |
---|---|---|---|
iris | datasets | 3.4.4 | Edgar Anderson’s Iris Data |
バイオリンプロット
バイオリンプロット(バイオリン図)は箱ひげ図の箱に代わりにデータ分布の確率密度を中心線を挟んで対象にプロットしたものです。ggplot2::geom_violin
関数を用いて描くことができます。密度の推定方法はデフォルトで“gaussian”注4が適用されます。
iris %>%
ggplot2::ggplot(ggplot2::aes(x = Species, y = Sepal.Length)) +
ggplot2::geom_violin()
注4 密度推定にはdensity
関数が利用され推定方法はデフォルトを含めて7種類から選択することができます
一般的なバイオリンプロットは確率密度に加えて四分位値が描かれることが多いです。四分位値を描く場合はdraw_quantiles
オプションを用いて描きたい四分位を指定してください。
iris %>%
ggplot2::ggplot(ggplot2::aes(x = Species, y = Sepal.Length)) +
ggplot2::geom_violin(draw_quantiles = c(0.25, 0.5, 0.75))
バイオリンプロットと平均値
四分位に加えて平均値をプロットしたい場合は、箱ひげ図の場合と同様にggplot2::stat_summary
関数を用いてください。
iris %>%
ggplot2::ggplot(ggplot2::aes(x = Species, y = Sepal.Length)) +
ggplot2::geom_violin(draw_quantiles = c(0.25, 0.5, 0.75)) +
ggplot2::stat_summary(fun.y = mean, geom = "point", colour = "red")
バイオリンプロットと箱ひげ図
見慣れた箱ひげ図の方がいいという場合はggplot2::geom_boxplot
関数に引数width
を指定してください。加えてggplot2::stat_summary
関数で平均値を描画することもできます。
iris %>%
ggplot2::ggplot(ggplot2::aes(x = Species, y = Sepal.Length)) +
ggplot2::geom_violin() +
ggplot2::geom_boxplot(width = 0.1) +
ggplot2::stat_summary(fun.y = mean, geom = "point", colour = "red")
バイオリンプロットと頻度分布
やっぱり実際の頻度分布も見たいという場合は箱ひげ図の場合と同様にggplot2::geom_dotplot
関数を用いてください。この時にposition
オプションで描画をオフセットさせると複数の描画を重ねても見やすいグラフにすることができます。
iris %>%
ggplot2::ggplot(ggplot2::aes(x = Species, y = Sepal.Length)) +
ggplot2::geom_violin(draw_quantiles = c(0.25, 0.5, 0.75)) +
ggplot2::stat_summary(fun.y = mean, geom = "point", colour = "red",
position = position_nudge(0.025)) +
ggplot2::geom_dotplot(binaxis = "y", dotsize = 0.5, stackdir = "down",
binwidth = 0.1, position = position_nudge(-0.025))
レインドロップ・プロット
GitHubで geom_flat_violin
という関数のコード が公開されています。geom_flat_violine
関数はバイオリンプロットを半分だけ描く関数です。このプロットとドットプロットを組み合わせることで雨雲のようなプロットを描くことができます。
iris %>%
ggplot2::ggplot(ggplot2::aes(x = Species, y = Sepal.Length)) +
geom_flat_violin() +
ggplot2::stat_summary(fun.y = mean, geom = "point", colour = "red",
position = position_nudge(0.025)) +
ggplot2::geom_dotplot(binaxis = "y", dotsize = 0.5, stackdir = "down",
binwidth = 0.1, position = position_nudge(-0.05)) +
ggplot2::coord_flip()
ビーン・プロット
ビーン・プロットはヴァイオリン・プロットとストリップチャートを組み合わせたようなグラフでbeanplot
パッケージを用いて描くことができます。デフォルトでは密度推定のカーネル関数に“gaussian”が用いられています。同じく“gaussian”を用いているggplot2::geom_violin
関数と若干形状が異なるのはバンド幅など他のデフォルト値が異なっていることに起因しているようです。
iris %>%
beanplot::beanplot(Sepal.Length ~ Species, data = ., method = "jitter")
ビー・スウォーム・プロット
ビー・スウォーム(Bee Swarm)プロットはデータの分布を実際の点として点同士が重ならないようにプロットするグラフで、beeswarm
パッケージを用いて描くことができます。
iris %>%
beeswarm::beeswarm(Sepal.Length ~ Species, data = ., method = "swarm")
ggplot2用
ggplot2
パッケージでビー・スウォーム・プロットを描きたい場合はggbeeswarm
パッケージを用います。
iris %>%
ggplot2::ggplot(ggplot2::aes(x = Species, y = Sepal.Length, colour = Species)) +
ggbeeswarm::geom_beeswarm()