Python

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

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

カテゴリー別散布図

関係プロットのチュートリアルでは、データセット内の複数の変数間の関係を示すために、多くの視覚化の表現を確認した。例では、主な関係が2つの数値の変数の間にある場合に焦点を当てた。主な変数の1つが「カテゴリカル」(離散的なグループに分割されている)である場合は、より専門的なアプローチを使用すると良い可能性がある。

seabornでは、カテゴリカルなデータを含む関係を可視化する方法がある。relplot()とscatterplot()またはlineplot()と同様に、これらのプロットを作成する方法が2つあります。様々な方法でカテゴリデータをプロットするための多くの軸レベルの関数と、それらへの統一された高次レベルのアクセスを提供する図レベルのインターフェースであるcatplot()がある。

異なるカテゴリプロットの種類は、3つの異なる親に属すると考えると良い。

カテゴリー別散布図
  • stripplot() (kind=”strip”; デフォルト)
  • swarmplot() (with kind=”swarm”)
カテゴリ分布のプロット
  • boxplot() (with kind=”box”)
  • violinplot() (with kind=”violin”)
  • boxenplot() (with kind=”boxen”)
カテゴリ推定値のプロット
  • pointplot() (with kind=”point”)
  • barplot() (with kind=”bar”)
  • countplot() (with kind=”count”)

これらの親は、異なるレベルの粒度を使用してデータを表現する。どれを使用するか決めるには、タスクについて考える必要がある。統一された API を使用すると、異なる種類のデータを切り替えて、複数の視点からデータを観察できる。

このチュートリアルでは、主に図レベルのインターフェイスであるcatplot()に焦点を当てる。この関数は、上記の各関数の上位レベルのインターフェースである。

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

カテゴリー別散布図

catplot()のデフォルトの表現は散布図を使用する。seabornには、実際には2つの異なるカテゴリの散布図がある。それは、あるカテゴリに属するすべてのポイントが、カテゴリ変数に対応する軸に沿って同じ位置に落ちてしまう。catplot()のデフォルトの”種類”である stripplot()によって使用されるアプローチは、カテゴリ軸上の点の位置を少量のランダムな”ジッター”で調整することである。

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", 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", jitter=False, data=tips)

plt.show()

2番目のアプローチは、重複を防ぐアルゴリズムを用いて、カテゴリ軸に沿った点を調整する。これは、オブザベーションの分布をよく表現することができるが、比較的小さなデータセットでうまく機能する。この種のプロットは、”蜂の群れ”と呼ばれることもあり、seabornでは、catplot()で kind=”swarm”を設定することで有効になるswarmplot()で描画される。

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="swarm", 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="swarm", data=tips)

plt.show()

数値データとは異なり、カテゴリ変数のレベルを軸に沿ってどのように順序付けるかは必ずしも明らかではない。一般的に、seabornのカテゴリプロット関数は、データからカテゴリの順序を推測する。データがpandasのCategoricalデータ型を持っている場合、カテゴリのデフォルトの順序はそこで設定できる。カテゴリ軸に渡された変数が数値のように見える場合、レベルはソートされる。しかし、データはまだカテゴリとして扱われ、数値がラベル付けに使用されている場合でも、カテゴリ軸上の順序位置(0, 1, …)に描画される。

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="size", y="total_bill", data=tips)

plt.show()

デフォルトの順序を選択するもう1つのオプションは、データセットに現れるカテゴリのレベルを取ることである。順序はorderパラメータを使用してプロットごとに制御できる。これは同じ図の中に複数のカテゴリプロットを描くときに重要である。

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="smoker", y="tip", order=["No", "Yes"], 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="total_bill", y="day", hue="time", kind="swarm", data=tips)

plt.show()