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 はすべての国の平均寿命の分布をプロットしています。たいていの場合、このように country
や continent
などの別の変数に基づいて変数を分離したいと思うことでしょう。
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()
関数を使用して xlabel
と ylabel
引数にラベルを与えるか、ラッパー関数である 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
スタイルの変数)がある場合、色相でプロットをグループ化することができます。
例えば、人々のデータセットがあり、employed
と unemployed
を値として持つ employment
カラムがあるとします。そして、Violin Plotsを「色相」によってグループ化することができます – これら2つの雇用のフレーバーです。
Gapminderのデータセットにはこのような列がないので、自分で作ってみましょう。国の部分集合の平均寿命を計算してみよう。例えば、ヨーロッパ諸国の平均寿命を計算する。
そして、それぞれの国について、新しいカラム above_average_life_exp
に Yes
/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
という引数を渡すことができ、この引数には True
と False
のいずれかを設定することができます。
この引数を 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です。
データビジュアライゼーションのユニークで実用的なガイドとして、あなたがキャリアで使うかもしれない多くのツールを紹介しています。