Skip to article frontmatterSkip to article content
Site not loading correctly?

This may be due to an incorrect BASE_URL configuration. See the MyST Documentation for reference.

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

公開日 2023-08-27

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

catplot関数のオプション

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

オプション説明
x/ystrx, y軸の変数
kindstrグラフの種類。表の下を参照
huestr色分けをするカテゴリ変数名
hue_orderlist of strhueの順番
palettedict/strhueの色を指定。カラーマップも指定可能
rowstr複数グラフに分割するときに、縦方向のキーとなる変数名
colstr複数グラフに分割するときに、横方向のキーとなる変数名
row_orderlist of strrowオプションの順序を指定
col_orderlist of strcolオプションの順序を指定
col_wrapintrowを指定したときの1行あたりのグラフの数
heightfloat各グラフの高さ
aspectfloataspect*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
Loading...

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 0x237935d7b60>
<Figure size 511.111x500 with 1 Axes>

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

データの色分け

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

sns.catplot(data=df, x="smoker", y="tip", hue="time")
<seaborn.axisgrid.FacetGrid at 0x23793aabc50>
<Figure size 596.375x500 with 1 Axes>

横向き表示

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

sns.catplot(data=df, x="tip", y="smoker")
<seaborn.axisgrid.FacetGrid at 0x237935b7250>
<Figure size 511.111x500 with 1 Axes>

ばらつき幅の変更

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

sns.catplot(data=df, x="smoker", y="tip", jitter=0.03)
<seaborn.axisgrid.FacetGrid at 0x23793aab890>
<Figure size 511.111x500 with 1 Axes>

スワームプロット

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

sns.catplot(data=df, x="smoker", y="tip", kind="swarm")
<seaborn.axisgrid.FacetGrid at 0x23794c5fb10>
<Figure size 511.111x500 with 1 Axes>

箱ひげ図

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

sns.catplot(data=df, x="smoker", y="tip", kind="box")
<seaborn.axisgrid.FacetGrid at 0x23794d15310>
<Figure size 511.111x500 with 1 Axes>

箱の中央の横線は中央値を示します。また、箱の上下の横線は、第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 0x23794ece990>
<Figure size 511.111x500 with 1 Axes>

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

sns.catplot(data=df, x="smoker", y="tip", kind="box", hue="time")
<seaborn.axisgrid.FacetGrid at 0x23794fbc2d0>
<Figure size 596.375x500 with 1 Axes>

拡張箱ひげ図

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

sns.catplot(data=df, x="smoker", y="tip", kind="boxen")
<seaborn.axisgrid.FacetGrid at 0x2379501f4d0>
<Figure size 511.111x500 with 1 Axes>

ヴァイオリンプロット

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

sns.catplot(data=df, x="smoker", y="tip", kind="violin")
<seaborn.axisgrid.FacetGrid at 0x237950d9810>
<Figure size 511.111x500 with 1 Axes>

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

sns.catplot(data=df, x="smoker", y="tip", kind="violin",
            hue="time", split=True)
<seaborn.axisgrid.FacetGrid at 0x2379513f610>
<Figure size 596.375x500 with 1 Axes>

信頼区間付き棒グラフ

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

sns.catplot(data=df, x="day", y="tip", kind="bar")
<seaborn.axisgrid.FacetGrid at 0x23795216ad0>
<Figure size 511.111x500 with 1 Axes>

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

sns.catplot(data=df, x="day", y="tip", kind="bar", hue="smoker")
<seaborn.axisgrid.FacetGrid at 0x237963f2210>
<Figure size 572.125x500 with 1 Axes>

データ数の棒グラフ

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

sns.catplot(data=df, x="day", kind="count")
<seaborn.axisgrid.FacetGrid at 0x23796611e50>
<Figure size 511.111x500 with 1 Axes>

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

sns.catplot(data=df, x="day", kind="count", hue="smoker")
<seaborn.axisgrid.FacetGrid at 0x2379664bd90>
<Figure size 572.125x500 with 1 Axes>

ポイントプロット

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

sns.catplot(data=df, x="day", y="tip", kind="point")
<seaborn.axisgrid.FacetGrid at 0x237931211d0>
<Figure size 511.111x500 with 1 Axes>

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

sns.catplot(data=df, x="day", y="tip", kind="point",
            hue="smoker", dodge=True)
<seaborn.axisgrid.FacetGrid at 0x2379670c2d0>
<Figure size 572.125x500 with 1 Axes>

複数グラフへ分割

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

sns.catplot(data=df, x="smoker", y="tip", col="time")
<seaborn.axisgrid.FacetGrid at 0x2379675fc50>
<Figure size 1011.11x500 with 2 Axes>

グラフの保存

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

cg = sns.catplot(data=df, x="smoker", y="tip")
cg.savefig("catplot.png")
<Figure size 511.111x500 with 1 Axes>