【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 0x13662bb18b0>
../_images/6d21d2fe05aa01c4e2afc3509d0392fec093c57b48d7e7383b0ba312b987c8d4.png

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

データの色分け#

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

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

横向き表示#

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

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

ばらつき幅の変更#

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

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

スワームプロット#

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

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

箱ひげ図#

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

sns.catplot(data=df, x="smoker", y="tip", kind="box")
<seaborn.axisgrid.FacetGrid at 0x1366329d7f0>
../_images/c6f205a20bdc3f47a2af8d7d752db143d87b5c2d9539abc6fdbdaa1fcee43dc0.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 0x136653c5190>
../_images/59d5ca9b94f462b67619dc6ad00f2ee2f570463cb57f818a3287e821bab40be3.png

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

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

拡張箱ひげ図#

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

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

ヴァイオリンプロット#

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

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

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

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

信頼区間付き棒グラフ#

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

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

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

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

データ数の棒グラフ#

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

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

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

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

ポイントプロット#

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

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

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

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

複数グラフへ分割#

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

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

グラフの保存#

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

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