今回はバブルプロットについてです。バブルプロットは散布図によく似たグラフですが、散布図より多くの情報を含めることができます。
本記事では、バブルプロットの特徴と、Pythonでの描き方を紹介していきます。
特徴
バブルプロットでは、X軸とY軸のほかに、バブルのサイズを含めた3つの変数を表現することができます。さらに、バブルの色を加えると4つの変数を一度に表現することができます。
上図はseabornの公式で紹介されているバブルプロットの例です。X軸がdistance、Y軸がorbital_periodを示しています。さらに、バブルの色でyearを、サイズでmassを表現しています。このように、1つの図に多くの情報を含めることができるのがバブルプロットの特徴です。
一度で多くの情報を示す際には注意も必要です。情報量が多くなりすぎて、見づらい図になりかねないからです。1つの図にあらゆる情報を収める価値がない場合は、見にくくなるようであればグラフを分けることも検討する必要があります。
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)
matplotlibで描く
matplotlibでは、散布図を描画するscatter()のパラメータを指定することでバブルプロットを描画します。
import matplotlib.pyplot as plt
x = df["B"]
y = df["RM"]
size = df["CRIM"] * 20
plt.scatter(x, y, s=size, alpha=0.4, edgecolors="black")
バブルのサイズは引数sで指定します。alpha(透明度)とedgecolors(円の枠の色)はグラフを見やすくするために整えたパラメータです。これの結果は以下のようになります。
さらに色要素にも情報を詰め込んでみます。バブルの色はcで指定します。
import matplotlib.pyplot as plt
x = df["B"]
y = df["RM"]
size = df["CRIM"] * 20
color = df["LSTAT"]
plt.scatter(x, y, s=size, c=color, alpha=0.4, edgecolors="black")
反面教師な話になりますが、バブルプロットはデータ間の重なりが大きいと見にくいです。上図の場合、特に右端のプロットから情報を読み取るのは困難です。データ数やばらつき具合も描画の際に考慮する必要がありそうです。
seabornで描く
次は、seabornを使って描画していきます。まずコードの例を示します。
import seaborn as sns
cmap = sns.cubehelix_palette(rot=-.1, as_cmap=True)
plot = sns.relplot(data=df, x="B", y="RM", size="CRIM", hue="LSTAT", palette=cmap)
cmapでは描画するグラフのカラーパレットを指定しています。バブルプロット自体に関係はしていないのでパスします。
描画部分はplot内です。今回はsns.relplot()を使用しています。データを指定していきますが、バブルのサイズはsize、色はhueで指定します。
seabornではデフォルトで軸ラベルや凡例をつけてくれます。
Pythonでデータサイエンスするなら
Pythonでデータサイエンスをするなら、以下の書籍がおすすめです。Pandas、matplotlib、Numpy、scikit-learnといったデータサイエンスに必要なライブラリを、体系立てて一通り学ぶことができます。
ややお値段高めですが、これ1冊で十分という内容・ボリュームなので、損はしないと思います^^
まとめ
バブルプロットの特徴とPythonでの描き方を紹介しました。
多くの情報を表示できるので便利ですが、見にくい図とならないように注意が必要です。そうはいっても、必要な場面ではインパクトを与えられるグラフなので、知っておくといざというときに使えると思います^^
ではでは👋