【Seaborn】pairplotによる変数間の関係の可視化
公開日 2023-08-27
Seabornのpairplot関数は、2変数間の散布図と各変数の分布をまとめてプロットできる機能を持っています。この記事では、pairplot関数の使用方法とオプションについて解説します。
pairplot関数の基本¶
まず、pairplot関数でプロットするデータとして、iris(アヤメ)データセットを取得します。
import seaborn as sns
df = sns.load_dataset("iris")
dfirisデータセットは、sepal(花のガク)の長さと幅、petal(花びら)の長さと幅、species(花の種類)の5つの変数からなります。また、データの数は150です。これをpairplot関数でプロットします。
sns.pairplot(df)<seaborn.axisgrid.PairGrid at 0x165ab027380>
このように数量データをプロットしてくれます。左上から右下までの対角の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 0x165ab4add10>
paletteオプションでは、カテゴリ変数ごとの色を指定できます。指定方法は2つあります。1つは辞書形式で、変数ごとに色の名前を指定します。
sns.pairplot(df, hue="species",
palette={"setosa": "red",
"versicolor": "blue",
"virginica": "green"})<seaborn.axisgrid.PairGrid at 0x165ab007390>
もう1つの方法は、カラーマップの名前を与える方法です。指定可能なカラーマップについては以下のページを参照下さい。
sns.pairplot(df, hue="species", palette="Blues")<seaborn.axisgrid.PairGrid at 0x165aab516e0>
プロットするデータの指定¶
varsオプションでプロットする変数を指定できます。以下のように、変数名をリストで与えます。
sns.pairplot(df, vars=["sepal_length", "petal_length"])<seaborn.axisgrid.PairGrid at 0x165a229f820>
横方向と縦方向でプロットする変数を変えたい場合、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>
カーネル密度推定のグラフ¶
kindオプションにkdeを指定すると、カーネル密度推定のグラフとなります。さらに、hueオプションにカテゴリ変数を指定した場合、カテゴリごとにカーネル密度推定が行われます。
sns.pairplot(df, kind="kde",
vars=["sepal_length", "petal_length"])<seaborn.axisgrid.PairGrid at 0x165a3945940>
sns.pairplot(df, kind="kde", hue="species",
vars=["sepal_length", "petal_length"])<seaborn.axisgrid.PairGrid at 0x165ab4c2060>
ヒストグラム¶
kindオプションにhistを指定すると、ヒストグラムとなります。対角以外のグラフは2次元のヒストグラム、すなわちヒートマップになります。さらに、hueオプションにカテゴリ変数を指定した場合、カテゴリごとに色分けされたヒストグラムとなります。
sns.pairplot(df, kind="hist",
vars=["sepal_length", "petal_length"])<seaborn.axisgrid.PairGrid at 0x165ab4c1f30>
sns.pairplot(df, kind="hist", hue="species",
vars=["sepal_length", "petal_length"])<seaborn.axisgrid.PairGrid at 0x165ab4c3a80>
線形回帰グラフ¶
kindオプションにregを指定すると、対角以外は散布図となり、さらに線形回帰により求めた直線が追加されます。さらに、hueオプションにカテゴリ変数を指定した場合、カテゴリごとに求めた線形回帰の直線がプロットされます。
sns.pairplot(df, kind="reg",
vars=["sepal_length", "petal_length"])<seaborn.axisgrid.PairGrid at 0x165ab4c1e00>
sns.pairplot(df, kind="reg", hue="species",
vars=["sepal_length", "petal_length"])<seaborn.axisgrid.PairGrid at 0x165ab4c3bb0>
マーカーの種類¶
markersオプションで散布図のマーカーの種類を変更できます。文字列で与えると、全て同じ種類のマーカーとなります。またはリストで与えて、カテゴリごとにマーカーの種類を変更することも可能です。
sns.pairplot(df, markers="x", hue="species",
vars=["sepal_length", "petal_length"])<seaborn.axisgrid.PairGrid at 0x165ab4c3ce0>
sns.pairplot(df, hue="species", markers=["o", "v", "s"],
vars=["sepal_length", "petal_length"])<seaborn.axisgrid.PairGrid at 0x165ab4c3e10>
左下側のみグラフ表示¶
cornerオプションをTrueとすると、対角と左下側のグラフのみ表示されます(対角より右上側のグラフは表示されなくなります)。
sns.pairplot(df, corner=True,
vars=["sepal_length", "petal_length"])<seaborn.axisgrid.PairGrid at 0x165ab4c35c0>
グラフの追加¶
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>
グラフの保存¶
pairplot関数で出力したグラフをファイルとして保存するには、pairplot関数の戻り値 (pg) のsavefig()メソッドを使用します。引数に保存するファイル名を与えます。
pg = sns.pairplot(df, vars=["sepal_length", "petal_length"])
pg.savefig("pairplot.png")