【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 0x1627cb6a670>
../_images/d0a82f364dfa7cec83e621a588f0ccf7fde02bced806e301ee913b5382f75c27.png

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

データの色分け#

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

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

横向き表示#

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

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

ばらつき幅の変更#

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

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

スワームプロット#

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

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

箱ひげ図#

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

sns.catplot(data=df, x="smoker", y="tip", kind="box")
<seaborn.axisgrid.FacetGrid at 0x16201eba760>
../_images/ecaf57003f103f965bfb4f1db018dd2b8a6d3df7a532863bffde59b95b2f9783.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 0x16201ec4460>
../_images/d951e4ff14d039499c48051f30ec586a73f1e6033831047c105b938d0e340a37.png

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

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

拡張箱ひげ図#

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

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

ヴァイオリンプロット#

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

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

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

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

信頼区間付き棒グラフ#

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

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

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

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

データ数の棒グラフ#

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

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

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

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

ポイントプロット#

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

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

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

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

複数グラフへ分割#

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

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

グラフの保存#

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

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