【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 0x29a683af4d0>
../_images/d6032ed2089a3d67d053d3ed3fbe74b7942a2c3d1244b3e6c6f1f541fc39f69b.png

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

データの色分け#

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

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

横向き表示#

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

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

ばらつき幅の変更#

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

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

スワームプロット#

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

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

箱ひげ図#

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

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

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

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

拡張箱ひげ図#

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

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

ヴァイオリンプロット#

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

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

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

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

信頼区間付き棒グラフ#

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

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

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

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

データ数の棒グラフ#

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

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

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

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

ポイントプロット#

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

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

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

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

複数グラフへ分割#

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

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

グラフの保存#

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

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