【Seaborn】catplotによる変数間の関係の可視化
公開日 2023-08-27
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")
dftipsデータセットは以下の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>
このように「喫煙者か否か」と「チップの額」がプロットされます。見た目は散布図に似ていますが、"tip"が同じ値の場合、点が重ならないように横にずらしてプロットされます。
データの色分け¶
hueオプションに変数名を指定することにより、データの点を色で分けることが可能です。他のグラフの種類の場合も同じです。hueオプションに"time"(食事の時間)を与えた例を以下に示します。
sns.catplot(data=df, x="smoker", y="tip", hue="time")<seaborn.axisgrid.FacetGrid at 0x23793aabc50>
横向き表示¶
グラフを横向きに表示するには、xを連続変数、yをカテゴリ変数とします。他のグラフの種類の場合も同じです。
sns.catplot(data=df, x="tip", y="smoker")<seaborn.axisgrid.FacetGrid at 0x237935b7250>
ばらつき幅の変更¶
ストリッププロットの点の横方向のばらつき(ジッタ)を変更する場合、jitterオプションで幅の大きさを指定します。jitter=0とすると、点が一直線上に並びます。
sns.catplot(data=df, x="smoker", y="tip", jitter=0.03)<seaborn.axisgrid.FacetGrid at 0x23793aab890>
スワームプロット¶
kindオプションを"swarm"とすると、スワームプロットになります。スワームプロットはストリッププロットと似ていますが、点が重ならないように描画するため、データの密度が分かりやすくなります。
sns.catplot(data=df, x="smoker", y="tip", kind="swarm")<seaborn.axisgrid.FacetGrid at 0x23794c5fb10>
箱ひげ図¶
kindオプションを"box"とすると、箱ひげ図になります。
sns.catplot(data=df, x="smoker", y="tip", kind="box")<seaborn.axisgrid.FacetGrid at 0x23794d15310>
箱の中央の横線は中央値を示します。また、箱の上下の横線は、第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>
hueオプションに変数名を与えた場合、箱ひげ図が横に並んで表示されます。
sns.catplot(data=df, x="smoker", y="tip", kind="box", hue="time")<seaborn.axisgrid.FacetGrid at 0x23794fbc2d0>
拡張箱ひげ図¶
kindオプションを"boxen"とすると、拡張箱ひげ図(letter value plotとも呼ばれます)になります。箱ひげ図と比較して、分位点をより細かく描画しています。箱の横幅はデータ点数の多さを示しています。
sns.catplot(data=df, x="smoker", y="tip", kind="boxen")<seaborn.axisgrid.FacetGrid at 0x2379501f4d0>
ヴァイオリンプロット¶
kindオプションを"violin"とすると、ヴァイオリンプロットになります。ヴァイオリンプロットではデータの密度を推定し、データの数をグラフの横幅で示します。
sns.catplot(data=df, x="smoker", y="tip", kind="violin")<seaborn.axisgrid.FacetGrid at 0x237950d9810>
ヴァイオリンプロットでは、グラフを左右で分割することが可能です。hueオプションに分割する変数名を渡し、split=Trueとします。
sns.catplot(data=df, x="smoker", y="tip", kind="violin",
hue="time", split=True)<seaborn.axisgrid.FacetGrid at 0x2379513f610>
信頼区間付き棒グラフ¶
kindオプションを"bar"とすると、信頼区間付き棒グラフになります。棒の長さは平均値を示します。また、黒い線は95%信頼区間を示します。
sns.catplot(data=df, x="day", y="tip", kind="bar")<seaborn.axisgrid.FacetGrid at 0x23795216ad0>
hueオプションに変数名を指定すると、データを分割して、棒グラフを並べてプロットします。
sns.catplot(data=df, x="day", y="tip", kind="bar", hue="smoker")<seaborn.axisgrid.FacetGrid at 0x237963f2210>
データ数の棒グラフ¶
kindオプションを"count"とすると、データ数の棒グラフになります(yの指定は出来ません)。
sns.catplot(data=df, x="day", kind="count")<seaborn.axisgrid.FacetGrid at 0x23796611e50>
hueオプションに変数名を指定すると、データを分割して、棒グラフを並べてプロットします。
sns.catplot(data=df, x="day", kind="count", hue="smoker")<seaborn.axisgrid.FacetGrid at 0x2379664bd90>
ポイントプロット¶
kindオプションを"point"とすると、ポイントプロットになります。点は平均値を示します。また、縦方向の線は95%信頼区間を示します。点同士を繋ぐ線により、平均値の推移が分かりやすくなります。
sns.catplot(data=df, x="day", y="tip", kind="point")<seaborn.axisgrid.FacetGrid at 0x237931211d0>
hueオプションに変数名を指定すると、データを分割して並べてプロットします。さらにdodge=Trueとすることにより、グラフを若干横にずらして読み取りやすくします。
sns.catplot(data=df, x="day", y="tip", kind="point",
hue="smoker", dodge=True)<seaborn.axisgrid.FacetGrid at 0x2379670c2d0>
複数グラフへ分割¶
row, colオプションに変数名を渡すことにより、その変数の値でデータを分割し、縦・横方向にグラフを並べてプロットします。colオプションに"time"(食事の時間)を渡して、グラフを横方向に分割した例を以下に示します。
sns.catplot(data=df, x="smoker", y="tip", col="time")<seaborn.axisgrid.FacetGrid at 0x2379675fc50>
グラフの保存¶
catplot関数で出力したグラフをファイルとして保存するには、catplot関数の戻り値 (cg) のsavefig()メソッドを使用します。引数に保存するファイル名を与えます。
cg = sns.catplot(data=df, x="smoker", y="tip")
cg.savefig("catplot.png")