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

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

公開日

Seabornのcatplot関数は、カテゴリ変数を可視化する機能を持っています。この記事では、catplot関数の使用方法とオプションについて解説します。

catplot関数のオプション#

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

オプション

説明

x/y

str

x, y軸の変数

kind

str

グラフの種類。表の下を参照

hue

str

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

hue_order

list of str

hueの順番

palette

dict/str

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

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がグラフの横幅になる

kindオプションで指定可能なグラフの種類を以下に示します。

  • カテゴリ毎の散布図

    • "strip": ストリッププロット(デフォルト)

    • "swarm": スワームプロット

  • カテゴリ毎の分布図

    • "box": 箱ひげ図

    • "boxen": 拡張箱ひげ図 (enhanced box plot)

    • "violin": ヴァイオリンプロット

  • カテゴリ毎の分布推定図

    • "bar": 信頼区間付き棒グラフ

    • "count": データ数の棒グラフ

    • "point": ポイントプロット

ストリッププロット#

catplot関数のデフォルト設定では、ストリッププロットと呼ばれるグラフが出力されます。グラフをプロットするため、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: 人数

catplot関数のdata引数にDataFrameを与え、x, yにそれぞれx, y軸に表示したい変数を与えます。x, yの片方はカテゴリ変数とします。

以下の例では、xをカテゴリ変数の"smoker"(喫煙者か否か), yを連続変数の"tip"(チップの額)としています。

sns.catplot(data=df, x="smoker", y="tip")
<seaborn.axisgrid.FacetGrid at 0x1e9dc7723c0>
../_images/7d3dc83506d03a4b56e786ba8f9aa7f52caf616c121900d14a244adf59f7afd3.png

このように「喫煙者か否か」と「チップの額」がプロットされます。見た目は散布図に似ていますが、"tip"が同じ値の場合、点が重ならないように横にずらしてプロットされます。

データの色分け#

hueオプションに変数名を指定することにより、データの点を色で分けることが可能です。他のグラフの種類の場合も同じです。hueオプションに"time"(食事の時間)を与えた例を以下に示します。

sns.catplot(data=df, x="smoker", y="tip", hue="time")
<seaborn.axisgrid.FacetGrid at 0x1e9dda21590>
../_images/c3f5dec384e7b35fb43df0cb23e9f468134408bf5b784388d666f916faf7bbb6.png

横向き表示#

グラフを横向きに表示するには、xを連続変数、yをカテゴリ変数とします。他のグラフの種類の場合も同じです。

sns.catplot(data=df, x="tip", y="smoker")
<seaborn.axisgrid.FacetGrid at 0x1e9dc840690>
../_images/e7f983b0b82de55d02f87a128342e2dca508d09bf873a1bfa33b34bd50f30fa7.png

ばらつき幅の変更#

ストリッププロットの点の横方向のばらつき(ジッタ)を変更する場合、jitterオプションで幅の大きさを指定します。jitter=0とすると、点が一直線上に並びます。

sns.catplot(data=df, x="smoker", y="tip", jitter=0.03)
<seaborn.axisgrid.FacetGrid at 0x1e9dda20e10>
../_images/fcbd879d74fb74b598afb6c4becd59672351f08bf0fdbeb1e0032fbe08dab7df.png

スワームプロット#

kindオプションを"swarm"とすると、スワームプロットになります。スワームプロットはストリッププロットと似ていますが、点が重ならないように描画するため、データの密度が分かりやすくなります。

sns.catplot(data=df, x="smoker", y="tip", kind="swarm")
<seaborn.axisgrid.FacetGrid at 0x1e9ddddd590>
../_images/5083f1a166dce587248402c550bd97e8039169d6e021253e8f78376710306cdc.png

箱ひげ図#

kindオプションを"box"とすると、箱ひげ図になります。

sns.catplot(data=df, x="smoker", y="tip", kind="box")
<seaborn.axisgrid.FacetGrid at 0x1e9dde32d50>
../_images/358272ad7cf8c3a68aebe4e5a2749b2cc37cbc6a9f64b53a409295b23f636cff.png

箱の中央の横線は中央値を示します。また、箱の上下の横線は、第1, 第3四分位点となります。すなわち、箱の範囲にはデータ点の半数が含まれます。この箱の縦方向の長さをIQR (Interquartile range) と呼びます。さらに、ひげの長さは、IQR×whisとデータが存在する区間の短い方で表示されます。ひげよりも外側に表示される点(上のグラフの菱形マーク)は、外れ値として表示されます。whisのデフォルト値は1.5であり、catplot関数のwhisオプションで変更可能です。

sns.catplot(data=df, x="smoker", y="tip", kind="box", whis=1)
<seaborn.axisgrid.FacetGrid at 0x1e9de040410>
../_images/c6e4e3286eb829f108034de8232123454028a7426507026582df105b82827479.png

hueオプションに変数名を与えた場合、箱ひげ図が横に並んで表示されます。

sns.catplot(data=df, x="smoker", y="tip", kind="box", hue="time")
<seaborn.axisgrid.FacetGrid at 0x1e9de0add10>
../_images/f72f3c5ed6bad70c7274acb9044b35447f30fde6684cff837e289c6ba38c1580.png

拡張箱ひげ図#

kindオプションを"boxen"とすると、拡張箱ひげ図(letter value plotとも呼ばれます)になります。箱ひげ図と比較して、分位点をより細かく描画しています。箱の横幅はデータ点数の多さを示しています。

sns.catplot(data=df, x="smoker", y="tip", kind="boxen")
<seaborn.axisgrid.FacetGrid at 0x1e9de1acf50>
../_images/a6a50f84d7136cc86924cd363635d92e3e2840e05f38b85661525368295d80d1.png

ヴァイオリンプロット#

kindオプションを"violin"とすると、ヴァイオリンプロットになります。ヴァイオリンプロットではデータの密度を推定し、データの数をグラフの横幅で示します。

sns.catplot(data=df, x="smoker", y="tip", kind="violin")
<seaborn.axisgrid.FacetGrid at 0x1e9df1ab250>
../_images/5e646462aeb73e7022aff8bf92a557ba4b2b64b4eed8d59497cf83c252695ff8.png

ヴァイオリンプロットでは、グラフを左右で分割することが可能です。hueオプションに分割する変数名を渡し、split=Trueとします。

sns.catplot(data=df, x="smoker", y="tip", kind="violin",
            hue="time", split=True)
<seaborn.axisgrid.FacetGrid at 0x1e9df26d090>
../_images/6c980f74362d3391bd9a35e21ea34fe671a4c6cecb41a6091c3ac291dcc07625.png

信頼区間付き棒グラフ#

kindオプションを"bar"とすると、信頼区間付き棒グラフになります。棒の長さは平均値を示します。また、黒い線は95%信頼区間を示します。

sns.catplot(data=df, x="day", y="tip", kind="bar")
<seaborn.axisgrid.FacetGrid at 0x1e9df4a4550>
../_images/1e0417d37743e48363852cf2285931ed0c708989ae8edfcd12bfa5f8a9888204.png

hueオプションに変数名を指定すると、データを分割して、棒グラフを並べてプロットします。

sns.catplot(data=df, x="day", y="tip", kind="bar", hue="smoker")
<seaborn.axisgrid.FacetGrid at 0x1e9df4f3c50>
../_images/2d53b2c46acdb4e9b2236b06ae72e1ff955201c143dd264cf6154fb5b19bbbb2.png

データ数の棒グラフ#

kindオプションを"count"とすると、データ数の棒グラフになります(yの指定は出来ません)。

sns.catplot(data=df, x="day", kind="count")
<seaborn.axisgrid.FacetGrid at 0x1e9d4f1e990>
../_images/24c6113200039234b8a7fb06f9525cee9d8916baece5930161cc537887d2926d.png

hueオプションに変数名を指定すると、データを分割して、棒グラフを並べてプロットします。

sns.catplot(data=df, x="day", kind="count", hue="smoker")
<seaborn.axisgrid.FacetGrid at 0x1e9df5d0e10>
../_images/4d9d3013daf5c26a6f4f5cd8a1a396a091a0b2ada0e74248e4b9a607789f6043.png

ポイントプロット#

kindオプションを"point"とすると、ポイントプロットになります。点は平均値を示します。また、縦方向の線は95%信頼区間を示します。点同士を繋ぐ線により、平均値の推移が分かりやすくなります。

sns.catplot(data=df, x="day", y="tip", kind="point")
<seaborn.axisgrid.FacetGrid at 0x1e9df7a8910>
../_images/64c4c26a021ed9e0e749e9cc60ca07a350edb3eafee86fc7002758356011786e.png

hueオプションに変数名を指定すると、データを分割して並べてプロットします。さらにdodge=Trueとすることにより、グラフを若干横にずらして読み取りやすくします。

sns.catplot(data=df, x="day", y="tip", kind="point",
            hue="smoker", dodge=True)
<seaborn.axisgrid.FacetGrid at 0x1e9df7eafd0>
../_images/035e7666efc1c1b246f2deb7e9438aca5954b6c95e821d946fa50cb0ba7372d5.png

複数グラフへ分割#

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

sns.catplot(data=df, x="smoker", y="tip", col="time")
<seaborn.axisgrid.FacetGrid at 0x1e9df9e16d0>
../_images/1036e68d265885792d6cd60473abc306c0db653f81f675143621e40af7e2f433.png

グラフの保存#

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

cg = sns.catplot(data=df, x="smoker", y="tip")
cg.savefig("catplot.png")
../_images/c3970bd954df84e3c21ff6ef33df1c946051d56e6aa23e322f6714cc177c1263.png