Seabornバイオリンプロット – チュートリアルと実例集

Seaborn は Matplotlib の拡張として、Python で最も広く使われているデータ可視化ライブラリの 1 つです。データ可視化のためのシンプルで直感的、かつ高度にカスタマイズ可能なAPIを提供しています。

このチュートリアルでは、SeabornでViolin Plotをプロットする方法を見ていきます。

Violin Plotとは?
Violin Plotは、データの分布を可視化するために使用され、データの範囲、中央値、分布を表示することができます。

バイオリンプロットは箱ひげ図と同じ要約統計量を表示しますが、データの形状/分布を表現するカーネル密度推定も含まれます。

データのインポート

まず始めに、バイオリンプロットの作成に適したデータセットを選びます。

データセットは連続的で数値的な特徴を持つべきです。これは、バイオリンプロットが連続データの分布を可視化するために使用されるからです。それらは、データの範囲、中央値、および分布を表示します。

バイオリンプロットは、基本的に箱ひげ図と同じ要約統計量を表示するが、さらに追加情報も含まれる。バイオリンプロットの “バイオリン “の形状は、データの形状/分布を表すカーネル密度推定である。

このチュートリアルでは、Gapminder データセットを使用します。

まず、Seaborn、MatplotlibのPyPlotモジュール、Pandasをインポートすることから始めます。

import pandas as pd
import seaborn as sns
import matplotlib.pyplot as plt


次に、データをインポートする必要があります。データセットの先頭を表示して、データが正しく読み込まれたことを確認し、カラムやフィーチャーの名前を見てみます。

また、データの欠落がないことを確認します。

dataframe = pd.read_csv("gapminder_full.csv", error_bad_lines=False, encoding="ISO-8859-1")
print(dataframe.head())
print(dataframe.isnull().values.any())


この結果、以下のようになります。

       country  year  population continent  life_exp     gdp_cap
0  Afghanistan  1952     8425333      Asia    28.801  779.445314
1  Afghanistan  1957     9240934      Asia    30.332  820.853030
2  Afghanistan  1962    10267083      Asia    31.997  853.100710
3  Afghanistan  1967    11537966      Asia    34.020  836.197138
4  Afghanistan  1972    13079460      Asia    36.088  739.981106


連続した特徴を選択して変数として保存し、Seabornの関数に渡します。

country = dataframe.country
continent = dataframe.continent
population = dataframe.population
life_exp = dataframe.life_exp
gdp_cap = dataframe.gdp_cap


Seabornでシンプルなバイオリンプロットを作成する。

さて、データを読み込んで好きな素性を選択したら、バイオリンプロットを作成しましょう。

バイオリンプロットを作成するには、Seabornの violinplot() 関数を使用します。

データフレームを渡すと同時に、可視化したい変数を渡します。X変数だけを渡すと、この関数は自動的にY軸の値を計算します。

sns.violinplot(x=life_exp)


plt.show()


また、事前に特徴量を抽出する必要はありません。引数に data を与えて DataFrame に代入すれば、変数名を参照するだけで、データセットにマッチします。

sns.violinplot(x="life_exp", data = dataframe)


これと全く同じ結果が得られます。

注意:この画像では、変数 life_exp を渡しただけなので、Seaborn はすべての国の平均寿命の分布をプロットしています。たいていの場合、このように countrycontinent などの別の変数に基づいて変数を分離したいと思うことでしょう。

X変数とY変数によるバイオリンプロット

ここでは、種類別に分けられた特定の分布が見たいので、カテゴリーX変数と連続Y変数を渡します。

このデータセットでは、たくさんの国があります。それらをすべてプロットすると、数が多すぎて現実的に表示できず、図が過密になります。データセットをサブセットして、たとえば10カ国だけをプロットすることもできます。

その代わり、大陸別にプロットすることもできます。

sns.violinplot(x=continent, y=life_exp, data=dataframe)


プロットのカスタマイズ

バイオリンのプロットはいくつかの方法でカスタマイズすることができます。

バイオリンのプロットラベルをSeabornで変更する。

例えば、プロットにタイトルやラベルを追加して、他の人がデータを解釈するのに役立てたいとします。SeabornはX軸とY軸に自動的にラベルを付けますが、ラベルを変更したいと思うかもしれません。

これは軸オブジェクトを作成した後、 set_title()set_label() 関数で行うことができます。set_title()` 関数には、プロットに与えたいタイトルを渡します。

軸にラベルを付けるには、 set() 関数を使用して xlabelylabel 引数にラベルを与えるか、ラッパー関数である set_xlabel()/set_ylabel() 関数を使用します。

ax = sns.violinplot(x=continent, y=life_exp)
ax.set_title("Life Expectancy By Country")
ax.set_ylabel("Gapminder Life Expectancy")
ax.set_xlabel("Nations")


plt.show()


バイオリンのプロットカラーをSeabornで変更する

プロットをカスタマイズする方法の1つは、特定の色を割り当てることです。あらかじめ選択された色のリストを作成し、それを palette パラメータに渡すことができます。

colors_list = ['#78C850', '#F08030',  '#6890F0',  '#A8B820',  '#F8D030', '#E0C068', '#C03028', '#F85888', '#98D8D8']


ax = sns.violinplot(x=continent, y=life_exp, palette=colors_list)
ax.set_title("Life Expectancy By Country")
ax.set_ylabel("Gapminder Life Expectancy")
ax.set_xlabel("Nations")


plt.show()


Seabornのバイオリンプロットにスウォームプロットを重ねる

Violin PlotにSwarmplotを重ね、分布とその分布を構成する点の標本を見ることもできます。これを行うには、1つの図オブジェクトを作成し、2つの異なるプロットを作成するだけです。

colors_list = ['#78C850', '#F08030',  '#6890F0',  '#A8B820',  '#F8D030', '#E0C068', '#C03028', '#F85888', '#98D8D8']


plt.figure(figsize=(10,6))
sns.violinplot(x=continent, y=life_exp,palette=colors_list)
sns.swarmplot(x=continent, y=life_exp, color="k", alpha=0.8)
plt.title("Life Expectancy By Country")
plt.ylabel("Gapminder Life Expectancy")
plt.xlabel("Nations")


plt.show()


シーボーンでヴァイオリンのプロットスタイルを変更する

set_style()set_palette()` 関数を使って、プロットのスタイルとカラーパレットをそれぞれ簡単に変更することができます。

Seabornは図のスタイルとパレットを変更するための様々なオプションをサポートしています。

plt.figure(figsize=(10,6))
sns.set_palette("RdBu")
sns.set_style("darkgrid")
sns.violinplot(x=continent, y=life_exp, data=dataframe)
sns.swarmplot(x=continent, y=life_exp, data=dataframe, color="k", alpha=0.8)
plt.title("Life Expectancy By Country")
plt.ylabel("Gapminder Life Expectancy")
plt.xlabel("Nations")


plt.show()


シーボーンとヴァイオリンのサブプロット

最後に、列をそれぞれのサブプロットに分割したい場合、図を作成して add_gridspec() 関数を使ってサブプロットを配置するグリッドを作成することでこれを行うことができます。

それから add_subplot() 関数を使用して、グリッドのどこに現在のサブプロットを配置するかを指定し、軸オブジェクトを使用して通常と同じようにプロットを作成します。

ここでは、 y=variable を設定するか、 data=variable を使用することができます。

fig = plt.figure(figsize=(6, 6))
gs = fig.add_gridspec(1, 3)


ax = fig.add_subplot(gs[0, 0])


sns.violinplot(data=population)
ax.set_xlabel("Population")


ax = fig.add_subplot(gs[0, 1])
sns.violinplot(data=life_exp)
ax.set_xlabel("Life Exp.")


ax = fig.add_subplot(gs[0, 2])
sns.violinplot(data=gdp_cap)
ax.set_xlabel("GDP Capacity")


fig.tight_layout()
plt.show()


バイオリンプロットの色相によるグループ化

Violin Plots で行う本当に便利なことは、色相でグループ化することです。2つの値を持つカテゴリ値(典型的には true/false スタイルの変数)がある場合、色相でプロットをグループ化することができます。

例えば、人々のデータセットがあり、employedunemployed を値として持つ employment カラムがあるとします。そして、Violin Plotsを「色相」によってグループ化することができます – これら2つの雇用のフレーバーです。

Gapminderのデータセットにはこのような列がないので、自分で作ってみましょう。国の部分集合の平均寿命を計算してみよう。例えば、ヨーロッパ諸国の平均寿命を計算する。

そして、それぞれの国について、新しいカラム above_average_life_expYes/No の値を代入することができます。もし平均寿命が大陸全体の平均より高ければ、この値は Yes となり、その逆もまた然りである。

# Separate European countries from the original dataset
europe = dataframe.loc[dataframe["continent"] == "Europe"]


# Calculate mean of the `life_exp` variable
avg_life_exp = dataframe["life_exp"].mean()


# Declare an empty list
above_average_life_exp = []


# Iterate through the rows in the dataset, assigning Yes/No
# Depending on the value of the variable in the iterated row
for index, row in europe.iterrows():
    if row["life_exp"] > avg_life_exp:
        above_average_life_exp.append("Yes")
    else:
        above_average_life_exp.append("No")


# Add new column to dataset
europe["above_average_life_exp"] = above_average_life_exp


さて、このデータセットを印刷すると、次のようなものになる。

             country  year  population continent  life_exp       gdp_cap avle
12           Albania  1952     1282697    Europe    55.230   1601.056136  No
13           Albania  1957     1476505    Europe    59.280   1942.284244  No
14           Albania  1962     1728137    Europe    64.820   2312.888958  Yes
15           Albania  1967     1984060    Europe    66.220   2760.196931  Yes
16           Albania  1972     2263554    Europe    67.690   3313.422188  Yes
...              ...   ...         ...       ...       ...           ...  ...
1603  United Kingdom  1987    56981620    Europe    75.007  21664.787670  Yes
1604  United Kingdom  1992    57866349    Europe    76.420  22705.092540  Yes
1605  United Kingdom  1997    58808266    Europe    77.218  26074.531360  Yes
1606  United Kingdom  2002    59912431    Europe    78.471  29478.999190  Yes
1607  United Kingdom  2007    60776238    Europe    79.425  33203.261280  Yes


変数名は簡潔にするためにavleに切り捨てられています。

では、europe.head() を使ってこれらの国の小さなサブセットを選択し、挿入した新しい列でグループ化してViolinプロットを表示してみましょう。

europe = europe.tail(50)


ax = sns.violinplot(x=europe.country, y=europe.life_exp, hue=europe.above_average_life_exp)
ax.set_title("Life Expectancy By Country")
ax.set_ylabel("Gapminder Life Expectancy")
ax.set_xlabel("Nations")


plt.show()


この結果、次のようになります。

平均寿命が平均より短い国はオレンジ色で、それ以外の国は青色で表示されます。しかし、これでもすべてがわかるわけではありません。では、トルコには平均寿命より短い人が何人いるのでしょうか。

ここで、分割が必要になる。

Splitting Violin Plots by Hue

SeabornのViolin Plotsでは、 split という引数を渡すことができ、この引数には TrueFalse のいずれかを設定することができます。

この引数を trueまたは false に設定すると、 hue 引数が存在する場合に、Violin を hue 値の間に分割します。

今回のケースでは、バイオリンの片側は平均より高い寿命を持つエントリーを表し、右側は平均より低い寿命を持つエントリーをプロットするために使用されます。

結論

このチュートリアルでは、SeabornとPythonを使用してViolin Plotをプロットするいくつかの方法について説明しました。また、ラベルや色のカスタマイズや変更、Swarmplotのオーバーレイ、複数のViolin Plotのサブプロット、そして最後に – 色相によるプロットのグループ化や変数に基づいた分割Violin Plotの作成方法について説明しました。

データ可視化に興味があり、何から始めたらよいかわからない場合は、Pythonによるデータ可視化に関する書籍のバンドル版をぜひご覧ください。

Pythonによるデータ可視化

データビジュアライゼーションで危険な存在になる

30日間無条件返金保証

初級から上級まで

定期的に無料で更新(最新更新は2021年4月)

ボーナスリソースやガイドを更新

Pythonでデータ可視化 MatplotlibとPandasは、Pythonの基礎知識を持つ全くの初心者が、PandasとMatplotlibを使って、単純なプロットからインタラクティブなボタンを持つアニメーションの3Dプロットまで、これらのライブラリで高度な作業をするための強力な基盤を構築できるように設計された書籍です。

本書は、Pythonの基本的な知識を持つ方を対象としています。
PandasとMatplotlibについて知っておく必要
があることすべてを教えてくれる、詳細なガイドです。

Pythonによるデータ可視化」は、Pythonの初級~中級開発者向けの書籍で、Pandasを使った簡単なデータ操作から、MatplotlibやSeabornなどのコアなプロットライブラリを取り上げ、Altairなどの宣言型ライブラリや実験的ライブラリを活用する方法について案内しています。具体的には、11章にわたって、9つのPythonライブラリを取り上げています。Pandas、Matplotlib、Seaborn、Bokeh、Altair、Plotly、GGPlot、GeoPandas、そしてVisPyです。

データビジュアライゼーションのユニークで実用的なガイドとして、あなたがキャリアで使うかもしれない多くのツールを紹介しています。

タイトルとURLをコピーしました