HOWTO · Seaborn
Seaborn を使ってバイオリンプロットを作成する方法
このチュートリアルでは、Python の Seaborn モジュールを使ってバイオリンプロットを作成する方法を示します
このページの内容
Seabornのバイオリンプロットは、数値変数の分布を推定して表示します。幅は密度を表し、幅の広い部分ほど、その値の近くにデータが集中していると推定されます。内部のマークはデータの要約であり、すべての観測値を表示するものではありません。形状から複数のピークが示唆されることもありますが、サンプル数や元データと合わせて読み取ってください。
バイオリンプロットで分かること
バイオリンプロットは、密度の形状に任意の要約マークを組み合わせたものです。密度は観測値から推定されるため、ヒストグラムや生のデータ点の集まりではなく、滑らかにした表示です。inner の設定に応じて、箱、四分位点、各観測値を示す線、または要約マークなしを選べます。
数値分布の形状や広がりを比較するのに便利ですが、プロットだけでその形状になった理由が分かるわけではありません。また、サンプルが少ないと、推定された密度が実際の観測値から裏付けられる以上に確かなもの、あるいは詳細なものに見える場合があります。
1つの変数をプロットする
数値の並びを violinplot() に渡すと、1つの変数をプロットできます。この例ではPythonのリストをそのまま使うため、配列への変換は不要です。実行前に、Python環境へSeabornとMatplotlibをインストールしてください。コードは分布を描画するAxesを作成し、テキストを出力するものではありません。
import matplotlib.pyplot as plt
import seaborn as sns
values = [4, 5, 5, 6, 6, 7, 8, 8, 9, 10]
ax = sns.violinplot(y=values, inner="quartile", color="skyblue")
ax.set_ylabel("Value")
ax.set_title("Distribution of values")
plt.show()
縦軸は値を表します。バイオリンの幅が広い部分ほど、その値の近くにデータが集中していると推定されます。サンプルが少ない場合は、滑らかな形状だけでなく、個々の観測値も確認してください。
カテゴリごとの分布を比較する
カテゴリを比較するには、数値列を y に、カテゴリ列を x に指定します。この例ではpandasのDataFrameを使い、Price を y に、Product を x に割り当てています。そのため、x軸には製品ごとのカテゴリが並びます。この呼び出しには hue 引数がなく、曜日によるグループ分けも行いません。
import pandas as pd
import seaborn as sns
prices = pd.DataFrame(
{
"Price": [9, 10, 15, 16, 13, 14, 15, 18, 11, 12, 14, 15, 16, 17, 18, 19],
"Product": ["A"] * 4 + ["B"] * 4 + ["A"] * 4 + ["B"] * 4,
}
)
ax = sns.violinplot(data=prices, x="Product", y="Price")
ax.set_title("Price distribution by product")
各バイオリンは、その製品に割り当てられた価格を要約します。2つ目のグループ分けを加えるには、その列を hue に割り当てます。すると、x軸の各カテゴリ内で、hueの各値が区別して表示されます。プロット対象のデータや引数に含まれていない限り、曜日などのグループ分けを説明に加えないでください。
バイオリンプロットをカスタマイズする
観測値が少ないと、密度の推定が誤解を招くことがあります。stripplot() を重ねると、個々の値を表示して滑らかな形状と見比べられます。点はサンプルを確認する助けになりますが、少ないサンプルの信頼性を高めるものではありません。
import matplotlib.pyplot as plt
import seaborn as sns
values = [4, 5, 5, 6, 6, 7, 8, 8, 9, 10]
ax = sns.violinplot(y=values, inner=None, color="skyblue")
sns.stripplot(y=values, color="red", ax=ax)
ax.set_ylabel("Value")
plt.show()
カテゴリの表示順は order で指定できます。たとえば order=["B", "A"] とします。要約マークは inner で設定でき、よく使われる値には "box"、"quartile"、"stick"、None があります。箱ひげ図を重ねると見慣れた要約を加えられますが、同じサンプルを表すため、観測値そのものの確認に代わるものではありません。
戻り値のプロットオブジェクトを使う
violinplot() はMatplotlibの Axes を返します。このオブジェクトを使ってラベル、範囲、タイトルを設定したり、別のマークを追加したりできます。たとえば、1変数の例では戻り値を ax に保存し、ax.set_ylabel() と ax.set_title() を呼び出します。
図全体を扱うカテゴリプロットには catplot(kind="violin", ...) を使い、戻り値として FacetGrid を受け取ります。row や col などのオプションで別々のパネルを作成する場合に便利です。Axes単位のプロットには violinplot() を、図全体を扱うグリッドが必要な場合には catplot() を選んでください。