【Python】seabornで散布図とヒストグラムを併せて表示する

seabornはmatplotlibと並ぶPythonにおけるデータ可視化ライブラリです。seabornを使えば、よりオシャレなグラフを描画することができます。

データの可視化方法として散布図とヒストグラムがありますが、seabornを使えばこれらを組合わせた図を描画することができます。

本記事では、その描画方法とサンプルコードを紹介していきます。

散布図とヒストグラムを組み合わせた図とは

散布図とヒストグラムを組み合わせた図とは、以下のような図を指します。

散布図の上部にx軸データのヒストグラムが、散布図の右側にy軸データのヒストグラムが描画されます。これによって、それぞれのデータの分布とそれらの相関を容易に把握することができます。

seabornで描画する

今回使用するデータ

今回はどのデータセットを使用するでもなく、numpyでランダムに生成したデータを使用していきます。

とはいっても適当に乱数を使うのもあれなので、分布に従ったデータを作成します。

import numpy as np

#ランダム値のシード
rs = np.random.RandomState(10)
#ガンマ分布
x = rs.gamma(5, size=1000)
#ガンマ分布 × 正規分布
y = x * rs.normal(size=1000)

x軸のデータにはガンマ分布のデータを、y軸にはx軸の値と正規分布のデータの値を掛け合わせたものを使用します(特別意味はありません)。

図を描画する

図を描画するにはjointplot()を用います。

import seaborn as sns

sns.jointplot(x=x, y=y, color="#D91887")

これを実行すると、以下の図が得られます。

散布図の情報に加えて、y軸に用いたデータは0を中心に正規分布していそうなことなどもわかります。

必須のパラメータはxとyだけです。今回はなんとなく色を変更しています。色はHexで指定します。Adobe Colorを用いれば簡単に好きな色のHexを調べることができます。

https://color.adobe.com/ja/create/color-wheel

図のスタイル

jointplot()では、散布図だけでなく様々な種類の図を描画することができます。パラメータとしてはkindで指定します。

kind内容
scatter散布図(デフォルト)
kdeカーネル密度推定の等高線
hex六角形プロット
reg回帰直線付散布図
resid回帰直線からの残差付散布図
histヒートマップ(0.11.0以降)

それぞれ順に描画してみます。散布図はデフォルトなので省略します。

kde

kind=”kde”にすると、カーネル密度推定を行った値が等高線で表示されます。

sns.jointplot(x=x, y=y, kind="kde", color="#D91887")
kind="kde"

ヒストグラムも連続値として描画されます。

hex

kind=”hex”にすると、密度を六角形で表現したプロットになります。ハチの巣みたいな図です。

sns.jointplot(x=x, y=y, kind="hex", color="#D91887")
 kind="hex"

reg

kind=”hex”にすると、 散布図に回帰直線を追加した図が描画されます。

sns.jointplot(x=x, y=y, kind="reg", color="#D91887")
kind="reg"

resid

kind=”resid”にすると、 回帰直線からの残差が散布図と重ねて表示されます。

sns.jointplot(x=x, y=y, kind="resid", color="#D91887")
kind="resid"

hist

kind=”hist”にすると、 ヒートマップが表示されます。この機能はseabornのバージョンが0.11.0以降の機能です。

sns.jointplot(x=x, y=y, kind="hist", color="#D91887")
kind="hist"

グループ分けして表示したい

散布図やヒストグラムを描画する際、いくつかのグループに分けてそれぞれの特徴を見たい場合もあります。jointplot()ではその機能も提供されています。

これまで使ってきたデータにはグループ分けをする項目がないので、ここからはseabornが提供しているデータセットを使用していきます。

注意) グルーピングはseabornのバージョン0.11.0以降の機能です。お使いのバージョンがそれ以前の場合はアップデートしてください。

使用するデータ

seabornが提供するペンギンのデータセットを使います。

import seaborn as sns

penguins = sns.load_dataset("penguins").dropna()
ペンギンデータセット

グルーピング

グルーピングにはパラメータhueを用い、グルーピングの基準となる列を指定します。

sns.jointplot(data=penguins, x="bill_length_mm", y="bill_depth_mm", hue="species")
sns.jointplot(data=penguins, x="bill_length_mm", y="bill_depth_mm", hue="species")

1行でここまでの図を作成してくれます。

kind=”kde”の場合

sns.jointplot(data=penguins, x="bill_length_mm", y="bill_depth_mm", hue="species", kind="kde")

hueを指定してグルーピングをする場合、kind=”hex”, “reg”, “resid”は使用できません。

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

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

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

まとめ

seabornで散布図とヒストグラムを併せて表示するjointplot()について解説しました。散布図だけでなく様々な形のグラフを使うことができるのでとても便利です。

seabornが0.11.にアップデートされたことで見せ方の幅も広がっています。是非色々試してみてください^^

ではでは👋