【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 |
|
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>

このように「喫煙者か否か」と「チップの額」がプロットされます。見た目は散布図に似ていますが、"tip"
が同じ値の場合、点が重ならないように横にずらしてプロットされます。
データの色分け#
hue
オプションに変数名を指定することにより、データの点を色で分けることが可能です。他のグラフの種類の場合も同じです。hue
オプションに"time"
(食事の時間)を与えた例を以下に示します。
sns.catplot(data=df, x="smoker", y="tip", hue="time")
<seaborn.axisgrid.FacetGrid at 0x136631f6690>

横向き表示#
グラフを横向きに表示するには、x
を連続変数、y
をカテゴリ変数とします。他のグラフの種類の場合も同じです。
sns.catplot(data=df, x="tip", y="smoker")
<seaborn.axisgrid.FacetGrid at 0x13662da5400>

ばらつき幅の変更#
ストリッププロットの点の横方向のばらつき(ジッタ)を変更する場合、jitter
オプションで幅の大きさを指定します。jitter=0
とすると、点が一直線上に並びます。
sns.catplot(data=df, x="smoker", y="tip", jitter=0.03)
<seaborn.axisgrid.FacetGrid at 0x1366538f110>

スワームプロット#
kind
オプションを"swarm"
とすると、スワームプロットになります。スワームプロットはストリッププロットと似ていますが、点が重ならないように描画するため、データの密度が分かりやすくなります。
sns.catplot(data=df, x="smoker", y="tip", kind="swarm")
<seaborn.axisgrid.FacetGrid at 0x13665379280>

箱ひげ図#
kind
オプションを"box"
とすると、箱ひげ図になります。
sns.catplot(data=df, x="smoker", y="tip", kind="box")
<seaborn.axisgrid.FacetGrid at 0x1366329d7f0>

箱の中央の横線は中央値を示します。また、箱の上下の横線は、第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>

hue
オプションに変数名を与えた場合、箱ひげ図が横に並んで表示されます。
sns.catplot(data=df, x="smoker", y="tip", kind="box", hue="time")
<seaborn.axisgrid.FacetGrid at 0x136654f6390>

拡張箱ひげ図#
kind
オプションを"boxen"
とすると、拡張箱ひげ図(letter value plotとも呼ばれます)になります。箱ひげ図と比較して、分位点をより細かく描画しています。箱の横幅はデータ点数の多さを示しています。
sns.catplot(data=df, x="smoker", y="tip", kind="boxen")
<seaborn.axisgrid.FacetGrid at 0x136666c6ba0>

ヴァイオリンプロット#
kind
オプションを"violin"
とすると、ヴァイオリンプロットになります。ヴァイオリンプロットではデータの密度を推定し、データの数をグラフの横幅で示します。
sns.catplot(data=df, x="smoker", y="tip", kind="violin")
<seaborn.axisgrid.FacetGrid at 0x13666746de0>

ヴァイオリンプロットでは、グラフを左右で分割することが可能です。hue
オプションに分割する変数名を渡し、split=True
とします。
sns.catplot(data=df, x="smoker", y="tip", kind="violin",
hue="time", split=True)
<seaborn.axisgrid.FacetGrid at 0x136667d7e60>

信頼区間付き棒グラフ#
kind
オプションを"bar"
とすると、信頼区間付き棒グラフになります。棒の長さは平均値を示します。また、黒い線は95%信頼区間を示します。
sns.catplot(data=df, x="day", y="tip", kind="bar")
<seaborn.axisgrid.FacetGrid at 0x136654a47d0>

hue
オプションに変数名を指定すると、データを分割して、棒グラフを並べてプロットします。
sns.catplot(data=df, x="day", y="tip", kind="bar", hue="smoker")
<seaborn.axisgrid.FacetGrid at 0x13666869160>

データ数の棒グラフ#
kind
オプションを"count"
とすると、データ数の棒グラフになります(y
の指定は出来ません)。
sns.catplot(data=df, x="day", kind="count")
<seaborn.axisgrid.FacetGrid at 0x13666772270>

hue
オプションに変数名を指定すると、データを分割して、棒グラフを並べてプロットします。
sns.catplot(data=df, x="day", kind="count", hue="smoker")
<seaborn.axisgrid.FacetGrid at 0x136667735c0>

ポイントプロット#
kind
オプションを"point"
とすると、ポイントプロットになります。点は平均値を示します。また、縦方向の線は95%信頼区間を示します。点同士を繋ぐ線により、平均値の推移が分かりやすくなります。
sns.catplot(data=df, x="day", y="tip", kind="point")
<seaborn.axisgrid.FacetGrid at 0x13666b1a7e0>

hue
オプションに変数名を指定すると、データを分割して並べてプロットします。さらにdodge=True
とすることにより、グラフを若干横にずらして読み取りやすくします。
sns.catplot(data=df, x="day", y="tip", kind="point",
hue="smoker", dodge=True)
<seaborn.axisgrid.FacetGrid at 0x13666b41160>

複数グラフへ分割#
row
, col
オプションに変数名を渡すことにより、その変数の値でデータを分割し、縦・横方向にグラフを並べてプロットします。col
オプションに"time"
(食事の時間)を渡して、グラフを横方向に分割した例を以下に示します。
sns.catplot(data=df, x="smoker", y="tip", col="time")
<seaborn.axisgrid.FacetGrid at 0x13666a94380>

グラフの保存#
catplot
関数で出力したグラフをファイルとして保存するには、catplot
関数の戻り値 (cg
) のsavefig()
メソッドを使用します。引数に保存するファイル名を与えます。
cg = sns.catplot(data=df, x="smoker", y="tip")
cg.savefig("catplot.png")
