【Python】バイオリンプロットとは?特徴と書き方を解説

今回は、バイオリンプロットについてです。

バイオリンプロットはグラフの1種ですが、聞き馴染みの無い方が多いのではないでしょうか?

今回は、バイオリンプロットの特徴の紹介と、Pythonでのグラフの書き方を紹介していきたいと思います^^

バイオリンプロットとは?

バイオリンプロットは箱ひげ図によく似たグラフです。

wikipediaより引用

箱ひげ図同様、中央値や四分位範囲を読み取ることができます

箱ひげ図や四分位範囲については、以下の記事を参考にしてみてください。

メリット

バイオリンプロットのメリットとして、確率密度がわかるという点が挙げられます。確率密度はヒストグラムをイメージするといいと思いますが、ざっくりデータの分布にことだと思ってください。

この特徴から、バイオリンプロットは箱ひげ図とヒストグラムの特徴を組みあわせたようなグラフと言えます。

確率密度がわかることで、データの分布に複数の山があるときには特に有用です。箱ひげ図では、データの分布の山が複数あってもわかりません。

デメリット

デメリットはなんといってもその認知度の低さです。

街でバイオリンプロットを知っているかアンケートをとれば、95人は知らないと答えるのではないでしょうか(あくまで偏見)。

せっかくデータの内容がわかりやすくなるようにグラフを描いても、読み手が図の意味を知らなければ内容を把握することができません。

Pythonでバイオリンプロットを描く

バイオリンプロットの特徴を理解したところで、Pythonで実際にグラフを描いてみましょう。

使用するデータ

今回も、ボストンの住宅価格データを使います。

import pandas as pd
from sklearn.datasets import load_boston


data = load_boston()
name = pd.DataFrame(data.target).rename(columns={0:"name"})
df = pd.DataFrame(data.data, columns=data.feature_names).merge(name, left_index=True, right_index=True)

df = pd.DataFrame(data.data, columns=data.feature_names)

グラフを描く

Pythonでは、matplotlibまたはseabornを使ってバイオリンプロットを描画することができます。

今回は、seabornで描いてみます。

なお、グラフを描くことがメインなので、見やすくなるようにもとのデータ(df)を少しいじっています。

X軸に”RAD”を、Y軸に”AGE”を取ったバイオリンプロットを描きます。

#"RAD"が5以下のデータのみに絞る
df = df.loc[df["RAD"]<5]

import seaborn as sns
sns.violinplot(x=df["RAD"], y=df["AGE"])

このように、2軸でデータの分布がわかるのがヒストグラムの特徴です。”RAD”が4のプロットを見ると、分布の山が2つになっています。この特徴は、箱ひげ図では把握できません。

グルーピング

X軸について、グルーピングしてグラフを描くこともできます。

今回使用しているデータには、「性別」などのフラグとして表せるデータがありません。なので、少しデータに細工をしてから書いてみます。

“SMOKER”列を新たに作成し、”TAX”が250未満ならNo、以上ならYesとします。

df["SMOKER"] = "YES"
df.loc[df["TAX"]< 250, "SMOKER"]= "NO"

グルーピングする列は、引数hueで指定します。

sns.violinplot(x=df["RAD"], y=df["AGE"], hue=df["SMOKER"])

このように、各値でグルーピングしてグラフを描画できます。

Pythonでデータサイエンスするなら

Pythonでデータサイエンスをするなら、以下の書籍がおすすめです。Pandas、matplotlib、Numpy、scikit-learnといったデータサイエンスに必要なライブラリを、体系立てて一通り学ぶことができます。

ややお値段高めですが、これ1冊で十分という内容・ボリュームなので、損はしないと思います^^

まとめ

バイオリンプロットとは?というところから、Pythonでのグラフの書き方までを紹介しました。

滅多にお目にかからないグラフかもしれませんが、ヒストグラムと箱ひげ図の特徴をハイブリッドした可視化方法として優秀なグラフだと思います。

使う機会があることを祈ります^^

ではでは👋