Skip to article frontmatterSkip to article content
Site not loading correctly?

This may be due to an incorrect BASE_URL configuration. See the MyST Documentation for reference.

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

公開日 2023-08-27

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

pairplot関数の基本

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

import seaborn as sns

df = sns.load_dataset("iris")
df
Loading...

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

sns.pairplot(df)
<seaborn.axisgrid.PairGrid at 0x165ab027380>
<Figure size 1000x1000 with 20 Axes>

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

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

オプション説明
huestr色分けをするカテゴリ変数名
hue_orderlist of strhueの順番
palettedict/strhueの色を指定。カラーマップも指定可能
varsstrプロットする数値データ名。指定しなければ全数値データをプロット
x_vars/y_varslist of str横・縦方向にプロットする数値データ名
kindstr対角以外のグラフのプロット方法。scatter(散布図。デフォルト)、kde(カーネル密度推定)、hist(ヒストグラム)、reg(回帰)
diag_kindstr対角グラフのプロット方法。auto(自動。デフォルト)、hist(ヒストグラム)、kde(カーネル密度推定)
markersstr/list散布図のマーカの種類
heightfloat各グラフの高さ
aspectfloataspect*heightがグラフの横幅になる
cornerboolTrueの場合、対角よりも右上側にグラフをプロットしない
plot_kwsdict対角以外のグラフのオプションを指定する
diag_kwsdict対角のグラフのオプションを指定する

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

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

sns.pairplot(df, hue="species")
<seaborn.axisgrid.PairGrid at 0x165ab4add10>
<Figure size 1117.75x1000 with 20 Axes>

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

sns.pairplot(df, hue="species",
             palette={"setosa": "red",
                      "versicolor": "blue",
                      "virginica": "green"})
<seaborn.axisgrid.PairGrid at 0x165ab007390>
<Figure size 1117.75x1000 with 20 Axes>

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

Matplotlibのカラーマップ

sns.pairplot(df, hue="species", palette="Blues")
<seaborn.axisgrid.PairGrid at 0x165aab516e0>
<Figure size 1117.75x1000 with 20 Axes>

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

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

sns.pairplot(df, vars=["sepal_length", "petal_length"])
<seaborn.axisgrid.PairGrid at 0x165a229f820>
<Figure size 500x500 with 6 Axes>

横方向と縦方向でプロットする変数を変えたい場合、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 0x165aab52c40>
<Figure size 750x500 with 8 Axes>

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

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

sns.pairplot(df, kind="kde",
             vars=["sepal_length", "petal_length"])
<seaborn.axisgrid.PairGrid at 0x165a3945940>
<Figure size 500x500 with 6 Axes>
sns.pairplot(df, kind="kde", hue="species",
             vars=["sepal_length", "petal_length"])
<seaborn.axisgrid.PairGrid at 0x165ab4c2060>
<Figure size 617.75x500 with 6 Axes>

ヒストグラム

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

sns.pairplot(df, kind="hist",
             vars=["sepal_length", "petal_length"])
<seaborn.axisgrid.PairGrid at 0x165ab4c1f30>
<Figure size 500x500 with 6 Axes>
sns.pairplot(df, kind="hist", hue="species",
             vars=["sepal_length", "petal_length"])
<seaborn.axisgrid.PairGrid at 0x165ab4c3a80>
<Figure size 617.75x500 with 6 Axes>

線形回帰グラフ

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

sns.pairplot(df, kind="reg",
             vars=["sepal_length", "petal_length"])
<seaborn.axisgrid.PairGrid at 0x165ab4c1e00>
<Figure size 500x500 with 6 Axes>
sns.pairplot(df, kind="reg", hue="species",
             vars=["sepal_length", "petal_length"])
<seaborn.axisgrid.PairGrid at 0x165ab4c3bb0>
<Figure size 617.75x500 with 6 Axes>

マーカーの種類

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

sns.pairplot(df, markers="x", hue="species",
             vars=["sepal_length", "petal_length"])
<seaborn.axisgrid.PairGrid at 0x165ab4c3ce0>
<Figure size 617.75x500 with 6 Axes>
sns.pairplot(df, hue="species",  markers=["o", "v", "s"],
             vars=["sepal_length", "petal_length"])
<seaborn.axisgrid.PairGrid at 0x165ab4c3e10>
<Figure size 617.75x500 with 6 Axes>

左下側のみグラフ表示

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

sns.pairplot(df, corner=True,
             vars=["sepal_length", "petal_length"])
<seaborn.axisgrid.PairGrid at 0x165ab4c35c0>
<Figure size 500x500 with 5 Axes>

グラフの追加

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 0x165ab4c3820>
<Figure size 617.75x500 with 6 Axes>

グラフの保存

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

pg = sns.pairplot(df, vars=["sepal_length", "petal_length"])
pg.savefig("pairplot.png")
<Figure size 500x500 with 6 Axes>