【Seaborn】pairplotによる変数間の関係の可視化#

公開日

Seabornのpairplot関数は、2変数間の散布図と各変数の分布をまとめてプロットできる機能を持っています。この記事では、pairplot関数の使用方法とオプションについて解説します。

pairplot関数の基本#

まず、pairplot関数でプロットするデータとして、iris(アヤメ)データセットを取得します。

import seaborn as sns

df = sns.load_dataset("iris")
df
sepal_length sepal_width petal_length petal_width species
0 5.1 3.5 1.4 0.2 setosa
1 4.9 3.0 1.4 0.2 setosa
2 4.7 3.2 1.3 0.2 setosa
3 4.6 3.1 1.5 0.2 setosa
4 5.0 3.6 1.4 0.2 setosa
... ... ... ... ... ...
145 6.7 3.0 5.2 2.3 virginica
146 6.3 2.5 5.0 1.9 virginica
147 6.5 3.0 5.2 2.0 virginica
148 6.2 3.4 5.4 2.3 virginica
149 5.9 3.0 5.1 1.8 virginica

150 rows × 5 columns

irisデータセットは、sepal(花のガク)の長さと幅、petal(花びら)の長さと幅、species(花の種類)の5つの変数からなります。また、データの数は150です。これをpairplot関数でプロットします。

sns.pairplot(df)
<seaborn.axisgrid.PairGrid at 0x23502777830>
../_images/8256294b83ea5b62bc280098f188fc80d35d15c31b7e727c60ae3b2c2bde57af.png

このように数量データをプロットしてくれます。左上から右下までの対角の4つのグラフは、各変数の分布を表すヒストグラムです。対角以外のグラフは、2つの変数間の散布図となります。

pairplot関数の主なオプションを以下に示します。

オプション

説明

hue

str

色分けをするカテゴリ変数名

hue_order

list of str

hueの順番

palette

dict/str

hueの色を指定。カラーマップも指定可能

vars

str

プロットする数値データ名。指定しなければ全数値データをプロット

x_vars/y_vars

list of str

横・縦方向にプロットする数値データ名

kind

str

対角以外のグラフのプロット方法。scatter(散布図。デフォルト)、kde(カーネル密度推定)、hist(ヒストグラム)、reg(回帰)

diag_kind

str

対角グラフのプロット方法。auto(自動。デフォルト)、hist(ヒストグラム)、kde(カーネル密度推定)

markers

str/list

散布図のマーカの種類

height

float

各グラフの高さ

aspect

float

aspect*heightがグラフの横幅になる

corner

bool

Trueの場合、対角よりも右上側にグラフをプロットしない

plot_kws

dict

対角以外のグラフのオプションを指定する

diag_kws

dict

対角のグラフのオプションを指定する

カテゴリ変数による色分け#

hueオプションにカテゴリ変数を指定することにより、カテゴリ変数の値ごとに色分けされたグラフが出力されます。

sns.pairplot(df, hue="species")
<seaborn.axisgrid.PairGrid at 0x23502d97da0>
../_images/396a0d6976a2c4bfa2b37ea8fc8e2ed5676a1fae4ce68eedb988443152717f0e.png

paletteオプションでは、カテゴリ変数ごとの色を指定できます。指定方法は2つあります。1つは辞書形式で、変数ごとに色の名前を指定します。

sns.pairplot(df, hue="species",
             palette={"setosa": "red",
                      "versicolor": "blue",
                      "virginica": "green"})
<seaborn.axisgrid.PairGrid at 0x23505127b60>
../_images/6cf9132190c1d6900b410eb1a327818965b43dbbfcc49f3d9baf978788021698.png

もう1つの方法は、カラーマップの名前を与える方法です。指定可能なカラーマップについては以下のページを参照下さい。

Matplotlibのカラーマップ

sns.pairplot(df, hue="species", palette="Blues")
<seaborn.axisgrid.PairGrid at 0x235028b5820>
../_images/d64a91cc870960437c57d68bc7da388d717912a229919be2fe2c089f9bcf2d98.png

プロットするデータの指定#

varsオプションでプロットする変数を指定できます。以下のように、変数名をリストで与えます。

sns.pairplot(df, vars=["sepal_length", "petal_length"])
<seaborn.axisgrid.PairGrid at 0x235085577a0>
../_images/520e8e5f0afe5254f43c049d80edc3b341042298246b84529671f64c42c530fa.png

横方向と縦方向でプロットする変数を変えたい場合、x_vars, y_varsオプションを使用します。varsオプションと同様に、変数名をリストで与えます。

sns.pairplot(df, x_vars=["sepal_length", "sepal_width","petal_length"],
             y_vars=["sepal_length", "sepal_width"])
<seaborn.axisgrid.PairGrid at 0x235087bca40>
../_images/61e0ecb307b538e53f78cce56b0a1328106371222984f6939e09fec38e76b5f1.png

カーネル密度推定のグラフ#

kindオプションにkdeを指定すると、カーネル密度推定のグラフとなります。さらに、hueオプションにカテゴリ変数を指定した場合、カテゴリごとにカーネル密度推定が行われます。

sns.pairplot(df, kind="kde",
             vars=["sepal_length", "petal_length"])
<seaborn.axisgrid.PairGrid at 0x235086d8440>
../_images/86c7ab757cd27dd7abdb2fbf82d329d5114fc16765fc9bc8708fe08e8e189703.png
sns.pairplot(df, kind="kde", hue="species",
             vars=["sepal_length", "petal_length"])
<seaborn.axisgrid.PairGrid at 0x2350900d370>
../_images/1788e46857e8beb5afc67220e048cdd47b82734932c5df93f28ef80aafb0567c.png

ヒストグラム#

kindオプションにhistを指定すると、ヒストグラムとなります。対角以外のグラフは2次元のヒストグラム、すなわちヒートマップになります。さらに、hueオプションにカテゴリ変数を指定した場合、カテゴリごとに色分けされたヒストグラムとなります。

sns.pairplot(df, kind="hist",
             vars=["sepal_length", "petal_length"])
<seaborn.axisgrid.PairGrid at 0x23509853e30>
../_images/517a93fbc6bf00b427c2a65c4e9349b5c4b2d0bd45cb89b246ca5b7c03e8771d.png
sns.pairplot(df, kind="hist", hue="species",
             vars=["sepal_length", "petal_length"])
<seaborn.axisgrid.PairGrid at 0x2350a399400>
../_images/a94e6cbe4e8afd24fec4cbe9df5240366116029ca95dba1d9bae4c46390138fe.png

線形回帰グラフ#

kindオプションにregを指定すると、対角以外は散布図となり、さらに線形回帰により求めた直線が追加されます。さらに、hueオプションにカテゴリ変数を指定した場合、カテゴリごとに求めた線形回帰の直線がプロットされます。

sns.pairplot(df, kind="reg",
             vars=["sepal_length", "petal_length"])
<seaborn.axisgrid.PairGrid at 0x2350bc22600>
../_images/6991bc7abae4f55cecf08dc97441833a2914a06e2670c085edc2c72944f6e723.png
sns.pairplot(df, kind="reg", hue="species",
             vars=["sepal_length", "petal_length"])
<seaborn.axisgrid.PairGrid at 0x2350892d6d0>
../_images/82c6d459b8ab1f078d4f2d3f3bcfc253052c6d09ba4cbcd8757db2acbd78d29f.png

マーカーの種類#

markersオプションで散布図のマーカーの種類を変更できます。文字列で与えると、全て同じ種類のマーカーとなります。またはリストで与えて、カテゴリごとにマーカーの種類を変更することも可能です。

sns.pairplot(df, markers="x", hue="species",
             vars=["sepal_length", "petal_length"])
<seaborn.axisgrid.PairGrid at 0x2350bba92e0>
../_images/0e6c14d5ad3532ccb3d13652ebef259f746041160c89f60aa61577c43adbd149.png
sns.pairplot(df, hue="species",  markers=["o", "v", "s"],
             vars=["sepal_length", "petal_length"])
<seaborn.axisgrid.PairGrid at 0x2350d182150>
../_images/a35fa1b772f1c9cd2ff0d96ddc499bc604404e06caca4529d07fa423ea8d43c5.png

左下側のみグラフ表示#

cornerオプションをTrueとすると、対角と左下側のグラフのみ表示されます(対角より右上側のグラフは表示されなくなります)。

sns.pairplot(df, corner=True,
             vars=["sepal_length", "petal_length"])
<seaborn.axisgrid.PairGrid at 0x2350d5adfd0>
../_images/8309178f7d6d06f6c25b03789d7a9308656769657b30a89f368e33241ee78933.png

グラフの追加#

pairplot関数で出力したグラフに、さらにグラフを追加する方法を解説します。

pairplot関数の戻り値は、PairGridと呼ばれるクラスのオブジェクトとなります。このPairGridオブジェクトは、グラフを追加して描画するメソッドを持ちます(以下の表を参照)。

メソッド

描画箇所

map

全てのグラフ

map_offdiag

対角以外のグラフ

map_upper

対角より右上側

map_lower

対角より左下側

map_diag

対角のグラフ

以下の例では、pairplot関数で非対角のグラフに散布図をプロットした後、map_lowerメソッドを用いて左下のグラフにカーネル密度推定のグラフを追加しています。

pg = sns.pairplot(df, kind="scatter",
                  hue="species", vars=["sepal_length", "petal_length"])
pg.map_lower(sns.kdeplot)
<seaborn.axisgrid.PairGrid at 0x2350d22aa50>
../_images/00bb18ebbed4a4ee0beb137a1d37058a9aaa1ccb9e26ca4534e81d59974f2e7f.png

グラフの保存#

pairplot関数で出力したグラフをファイルとして保存するには、pairplot関数の戻り値 (pg) のsavefig()メソッドを使用します。引数に保存するファイル名を与えます。

pg = sns.pairplot(df, vars=["sepal_length", "petal_length"])
pg.savefig("pairplot.png")
../_images/520e8e5f0afe5254f43c049d80edc3b341042298246b84529671f64c42c530fa.png