バイオリンプロットの紹介と実装

Takahira です。今回は、データの分布を表すときに使えるバイオリンプロット(Violin Plot)の紹介をしようとおもいます。最後に Python を用いた実装例も入れています。

バイオリンプロットとは

バイオリンプロット(Violin Plot)は、データの分布を可視化するためのグラフです。

データの分布はヒストグラムで表すことが多いかと思いますが、バイオリンプロットの場合は、カーネル密度推定(KDE)という手法を用いて得た曲線を用いて分布を表します。

以下はあるデータに対する、ヒストグラムとカーネル密度推定の比較画像です。

ヒストグラムの形をなぞるように書かれている線がカーネル密度推定による推定結果の曲線になります。

カーネル密度推定自体は数式的には少しややこしいですが、ヒストグラムをなめらかにしたものという解釈で大丈夫かと思います。

kde

そして、このなめらかな曲線を 90 度横向きにして、左右対称になるように張り合わせたものがバイオリンプロットになります。

以下のようなものです。

violin

一般的には、このバイオリンプロットですが、データのカテゴリに応じて、複数のバイオリンプロットを並べて表示することが多いです。

例えば、以下のような形です。

violin2

バイオリンプロットの特徴

バイオリンプロットのまず良いところは、コンパクトなスペースで、複数の分布を一度に見ることができるという点です。

例えば、複数のカテゴリのデータをすべてヒストグラムで可視化して並べた場合、大きなスペースを取る上、一度に比較することも難しいと思います。

また、データの分布をより詳細に観察できるという点も利点です。

例えば、これは似たグラフである箱ひげ図と比べるとよく分かると思います。以下は上記のデータを箱ひげ図で可視化した場合です。

box plot

箱ひげ図だと、四分位数(25%点や中央値など)や最小値および最大値は確認できるものの、データの詳細なばらつきを見ることはできません。

たとえば、箱ひげ図だと、75%値と最大値の間にどのようにデータがばらついているかわかりません。一方で、バイオリンプロットだと、その部分も細かくみることができます。

バイオリンプロットの実装例

バイオリンプロットは Python のライブラリ Seaborn を用いれば簡単に実装できます。以下のようなコードがミニマルなものかと思います。

python
import seaborn as sns
df = sns.load_dataset('iris')
sns.violinplot(x=df["species"], y=df["sepal_length"], inner=None)

今回は、データの分布を表すときに有用なバイオリンプロットを紹介しました。

分布を表すグラフは他にも色々とあるので、それらもまた紹介したいと思います。

投稿一覧

©2022 All rights reserved.