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

※記事内に商品プロモーションを含むことがあります。

公開日

Seabornのrelplot関数は、散布図または折れ線グラフによって、2変数間の関係を可視化する機能を持っています。この記事では、relplot関数の使用方法とオプションについて解説します。

relplot関数の基本#

まず、relplot関数でプロットするデータとして、tipsデータセットを取得します。

import seaborn as sns

df = sns.load_dataset("tips")
df
total_bill tip sex smoker day time size
0 16.99 1.01 Female No Sun Dinner 2
1 10.34 1.66 Male No Sun Dinner 3
2 21.01 3.50 Male No Sun Dinner 3
3 23.68 3.31 Male No Sun Dinner 2
4 24.59 3.61 Female No Sun Dinner 4
... ... ... ... ... ... ... ...
239 29.03 5.92 Male No Sat Dinner 3
240 27.18 2.00 Female Yes Sat Dinner 2
241 22.67 2.00 Male Yes Sat Dinner 2
242 17.82 1.75 Male No Sat Dinner 2
243 18.78 3.00 Female No Thur Dinner 2

244 rows × 7 columns

tipsデータセットは以下の7変数を持ち、データ数は244個です。

  • total_bill: 食事の代金(USドル)

  • tip: チップの額(USドル)

  • sex: 性別

  • smoker: 喫煙者か否か

  • day: 曜日(木曜~日曜のいずれか)

  • time: 食事の時間(昼食または夕食)

  • size: 人数

これをrelplot関数でプロットします。引数dataにDataFrameを与え、x, yにそれぞれx, y軸に表示したい変数を与えます。

sns.relplot(data=df, x="total_bill", y="tip")
<seaborn.axisgrid.FacetGrid at 0x13ef2378e90>
../_images/3998f2fe1a853014b0819947e30733cd262f53b55782f3e213762a44fe414e8a.png

このように2変数の関係が散布図としてプロットされます。

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

オプション

説明

x/y

str

x, y軸の変数

kind

str

グラフの種類。scatrer: 散布図(デフォルト)、line: 折れ線グラフ

hue

str

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

hue_order

list of str

hueの順番

palette

dict/str

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

size

str

散布図のマーカーサイズに対応させる変数名

style

str

散布図のマーカー種類や、折れ線グラフの線の種類を変更する変数名

row

str

複数グラフに分割するときに、縦方向のキーとなる変数名

col

str

複数グラフに分割するときに、横方向のキーとなる変数名

row_order

list of str

rowオプションの順序を指定

col_order

list of str

colオプションの順序を指定

col_wrap

int

rowを指定したときの1行あたりのグラフの数

height

float

各グラフの高さ

aspect

float

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

変数による色分け#

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

sns.relplot(data=df, x="total_bill", y="tip", hue="day")
<seaborn.axisgrid.FacetGrid at 0x13ef28c0470>
../_images/badb8d6872a43800daa1d19b4a830d12f2be98e0689d2c52cc7ed0025f823db3.png

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

sns.relplot(data=df, x="total_bill", y="tip", hue="day",
            palette={"Thur": "red",
                     "Fri": "blue",
                     "Sat": "green",
                     "Sun": "orange"})
<seaborn.axisgrid.FacetGrid at 0x13ef49540b0>
../_images/26c4a1040871f9696aaaac36b18f910d0149de2c7c928329aeed16451ef58cb7.png

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

Matplotlibのカラーマップ

sns.relplot(data=df, x="total_bill", y="tip", hue="day",
            palette="Blues")
<seaborn.axisgrid.FacetGrid at 0x13ef2887d70>
../_images/ea898c498209994176ae7da650f16fe33ee04bdfb8ef761a12cb264223daacea.png

また、hueオプションには、カテゴリ変数だけでなく数値変数を与えることも可能です。size(人数)で色分けした例を示します。

sns.relplot(data=df, x="total_bill", y="tip", hue="size")
<seaborn.axisgrid.FacetGrid at 0x13ef4a7f470>
../_images/dd73b3b3e5407637989592219fa20c298af5cb30498be8dd68ab51e83a75ec20.png

マーカーのサイズ#

sizeオプションに数値データ名を与えると、数値の大きさに応じてマーカーのサイズが変化します(※以下の例では、sizeオプションに与えた"size"はDataFrameの列名の"size"(人数 )のことです)。

sns.relplot(data=df, x="total_bill", y="tip", size="size")
<seaborn.axisgrid.FacetGrid at 0x13ef4ac04d0>
../_images/e3b0826873395f773a4d58e549d5254c9e5dcda23dbfebe7ccc0302c88dc687f.png

マーカーの種類#

styleオプションに変数を指定することにより、変数の値ごとにマーカーの種類が異なるグラフが出力されます。styleオプションとhueオプションを併用することも可能です。

sns.relplot(data=df, x="total_bill", y="tip", style="day")
<seaborn.axisgrid.FacetGrid at 0x13ef4aab5f0>
../_images/9d7839ea7678cd94ff6eee80b0b9a632b08080821155451d216d7e57a0145529.png
sns.relplot(data=df, x="total_bill", y="tip",
            style="time", hue="day")
<seaborn.axisgrid.FacetGrid at 0x13ef4ca84d0>
../_images/5efa6bf18db7b229aa8bf2dab494763e65cf6a8ad8d3ea6003ed95e02c79d9f9.png

複数グラフへ分割#

row, colオプションに変数名を渡すことにより、その変数の値でデータを分割し、縦・横方向にグラフを並べてプロットします。rowオプションに"time"(食事の時間)を渡して、グラフを縦方向に分割した例を以下に示します。

sns.relplot(data=df, x="total_bill", y="tip", row="time")
<seaborn.axisgrid.FacetGrid at 0x13ef50a3860>
../_images/74d5e4298a91195c0d3af1cfb4c781b99fdd492c26be79f71855071c4962c368.png

colオプションに"smoker"(喫煙者か否か)を渡して、グラフを横方向に分割した例を以下に示します。

sns.relplot(data=df, x="total_bill", y="tip", col="smoker")
<seaborn.axisgrid.FacetGrid at 0x13ef63a0740>
../_images/ce4b4d0cc7cb6a338c3c17179aba9795e8b4c5e785c7e172d0feac084a52560e.png

row, colオプションを同時に使用することも可能です。その場合、グラフは縦・横の両方向に分割されます。

sns.relplot(data=df, x="total_bill", y="tip",
            row="time", col="smoker")
<seaborn.axisgrid.FacetGrid at 0x13ef4a1ecc0>
../_images/9d946d50b245e8e94da64d77ed654b8658b598db914e33f72ab0b832116cf0fb.png

折れ線グラフ#

relplot関数のkindオプションを"line"とすることにより、折れ線グラフとしてプロットできます。ここでは、fmriというデータセットを用います。

fmri = sns.load_dataset("fmri")
fmri
subject timepoint event region signal
0 s13 18 stim parietal -0.017552
1 s5 14 stim parietal -0.080883
2 s12 18 stim parietal -0.081033
3 s11 18 stim parietal -0.046134
4 s10 18 stim parietal -0.037970
... ... ... ... ... ...
1059 s0 8 cue frontal 0.018165
1060 s13 7 cue frontal -0.029130
1061 s12 7 cue frontal -0.004939
1062 s11 7 cue frontal -0.025367
1063 s0 0 cue parietal -0.006899

1064 rows × 5 columns

timepointというラベルには、同じ値のデータが複数個含まれています。fmriを折れ線グラフとしてプロットします。

sns.relplot(data=fmri, x="timepoint", y="signal", kind="line")
<seaborn.axisgrid.FacetGrid at 0x13ef6fd95e0>
../_images/b10a9cdd094cb6ba518095583ff9e6036ee00c574a88dc6401db115aefe66d02.png

薄い水色の区間は、95%信頼区間 (Confidence interval, CI) を示します。

散布図の場合と同様に、折れ線グラフでもhue, style, col, rowオプションなどにより、データを分割してプロットすることが可能です。

sns.relplot(data=fmri, x="timepoint", y="signal",
            kind="line", hue="event")
<seaborn.axisgrid.FacetGrid at 0x13ef745a150>
../_images/c4dbf61d3a6b0e1b7d424aaaeb0ef069c0ebce5fdc5543f8a9f438c0fc8e37f9.png
sns.relplot(data=fmri, x="timepoint", y="signal",
            kind="line", style="event")
<seaborn.axisgrid.FacetGrid at 0x13ef74f31a0>
../_images/2b764940d6c96bae9085b54f77249580938452b10f190bc4da5d7c58b181d766.png

グラフの保存#

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

rg = sns.relplot(data=fmri, x="timepoint", y="signal", kind="line")
rg.savefig("relplot.png")
../_images/83c6c55c5d1d95552d1c9ade053b4e87f6d4115740c9316d2cd3c8a2b43c67be.png