Python

Python seaborn チュートリアル プロット機能 カテゴリカルデータを可視化 (2)

原文のドキュメントはこちらから。

カテゴリ内の観測値・記録の分布

データセットのサイズが大きくなるにつれて、カテゴリ別散布図は、各カテゴリ内の値の分布について提供できる情報が限られてくる。この場合、カテゴリ・レベル間の比較を容易にする方法で分布情報を要約するためのいくつかのアプローチがある。

Boxplots

boxplot() を確認する。この種のプロットは、分布の3つの四分位値を極端な値とともに表示する。ひげ(ウィスカー)は、下の四分位と上の四分位の1.5のIQR内にある点まで伸びており、この範囲外にあるオブザベーションは独立して表示される。これは、ボックスプロットの各値が、データ内の実際のオブザベーションに対応することを意味する。

import seaborn as sns
import matplotlib.pyplot as plt
sns.set_theme(style="ticks", color_codes=True)

tips = sns.load_dataset("tips")
sns.catplot(x="day", y="total_bill", kind="box", data=tips)

plt.show()

色相セマンティックを追加する場合、セマンティック変数の各レベルのボックスは、それらが重ならないようにカテゴリ軸に沿って移動する。

import seaborn as sns
import matplotlib.pyplot as plt
sns.set_theme(style="ticks", color_codes=True)

tips = sns.load_dataset("tips")
sns.catplot(x="day", y="total_bill", hue="smoker", kind="box", data=tips)

plt.show()

この動作は”dodging”と呼ばれ、セマンティック変数がメインのカテゴリカル変数の中に入れ子になっていることを前提とするため、デフォルトでオンになっている。そうでない場合は、ダッジングを無効にすることができる。

import seaborn as sns
import matplotlib.pyplot as plt
sns.set_theme(style="ticks", color_codes=True)

tips = sns.load_dataset("tips")
tips["weekend"] = tips["day"].isin(["Sat", "Sun"])
sns.catplot(x="day", y="total_bill", hue="weekend", kind="box", dodge=False, data=tips)
            
plt.show()

boxenplot() は、ボックスプロットに似たプロットを描画するが、分布の形状に関するより多くの情報を表示するために最適化されている。これはより大きなデータセットに最適。

import seaborn as sns
import matplotlib.pyplot as plt
sns.set_theme(style="ticks", color_codes=True)

diamonds = sns.load_dataset("diamonds")
sns.catplot(x="color", y="price", kind="boxen", data=diamonds.sort_values("color"))

plt.show()

ヴァイオリンのプロット

これは、分布のチュートリアルで説明されているカーネル密度推定手順とボックスプロットを組み合わせたもの。

import seaborn as sns
import matplotlib.pyplot as plt
sns.set_theme(style="ticks", color_codes=True)

tips = sns.load_dataset("tips")
sns.catplot(x="total_bill", y="day", hue="sex", kind="violin", data=tips)

plt.show()

このアプローチは、カーネル密度推定を使用して、値の分布のより豊かな記述を提供する。さらに、ボックスプロットからの分位値とウィスカ値がバイオリンの中に表示されるす。欠点は、violinplotがKDEを使用しているため、微調整が必要な他のパラメータがあり、単純なボックスプロットに比べて複雑さが増している点である。

import seaborn as sns
import matplotlib.pyplot as plt
sns.set_theme(style="ticks", color_codes=True)

tips = sns.load_dataset("tips")
sns.catplot(x="total_bill", y="day", hue="sex", kind="violin", bw=.15, cut=0, data=tips)

plt.show()

また、色相パラメータが2段階しかない場合に、バイオリンを「分割」することも可能で、スペースをより効率的に使用することができる。

import seaborn as sns
import matplotlib.pyplot as plt
sns.set_theme(style="ticks", color_codes=True)

tips = sns.load_dataset("tips")
sns.catplot(x="day", y="total_bill", hue="sex", kind="violin", split=True, data=tips)

plt.show()

最後に、バイオリンの内部に描かれるプロットにはいくつかのオプションがあり、要約ボックスプロットの値の代わりに個々の観測値を表示する方法などがある。

import seaborn as sns
import matplotlib.pyplot as plt
sns.set_theme(style="ticks", color_codes=True)

tips = sns.load_dataset("tips")
sns.catplot(x="day", y="total_bill", hue="sex", kind="violin", inner="stick", split=True, palette="pastel", data=tips)

plt.show()

swarmplot() や striplot() と箱形プロットやバイオリンプロットを組み合わせて、各オブザベーションを分布の要約とともに表示するのも便利である。

import seaborn as sns
import matplotlib.pyplot as plt
sns.set_theme(style="ticks", color_codes=True)

tips = sns.load_dataset("tips")
g = sns.catplot(x="day", y="total_bill", kind="violin", inner=None, data=tips)
sns.swarmplot(x="day", y="total_bill", color="k", size=3, data=tips, ax=g.ax)

plt.show()