Seaborn は Matplotlib の拡張として、Python で最も広く使われているデータ可視化ライブラリの 1 つです。データ可視化のためのシンプルで直感的、かつ高度にカスタマイズ可能なAPIを提供しています。
このチュートリアルでは、Seabornで最も基本的なプロットの1つであるラインプロットを作成する方法を見ていきます。
線グラフ
線グラフは、一方の軸に数値、もう一方の軸にカテゴリを表示します。
棒グラフと同じような使い方ができますが、経時的な変化を把握するために使われることが多いようです。
Seabornで折れ線グラフを描く
まず、折れ線グラフを描くための最も基本的な方法として、X軸とY軸のリストを lineplot()
関数に渡すことから始めましょう。
import matplotlib.pyplot as plt
import seaborn as sns
sns.set_theme(style="darkgrid")
x = [1, 2, 3, 4, 5]
y = [1, 5, 4, 7, 4]
sns.lineplot(x, y)
plt.show()
ここでは、 x
と y
という2つのリストを用意しています。xリストはカテゴリ変数のリストとして、
y` リストは数値変数のリストとして動作します。
このコードの結果は
そのため、カテゴリ軸には文字列のような他のデータ型を使用することができます。
import matplotlib.pyplot as plt
import seaborn as sns
sns.set_theme(style="darkgrid")
x = ['day 1', 'day 2', 'day 3']
y = [1, 5, 4]
sns.lineplot(x, y)
plt.show()
そして、これは次のような結果になります。
注:カテゴリーリストとして整数を使う場合、例えば [1, 2, 3, 4, 5]
のように、その後 100
まで進むと、 5..100
の間の値はすべて null となります。
import seaborn as sns
sns.set_theme(style="darkgrid")
x = [1, 2, 3, 4, 5, 10, 100]
y = [1, 5, 4, 7, 4, 5, 6]
sns.lineplot(x, y)
plt.show()
これは、データセットが単にX軸の数値を欠落させているだけかもしれないからです。そのような場合、Seabornは単にそれらの値が欠落していると仮定してプロットします。しかし、文字列を扱う場合はそうではありません。
import matplotlib.pyplot as plt
import seaborn as sns
sns.set_theme(style="darkgrid")
x = ['day 1', 'day 2', 'day 3', 'day 100']
y = [1, 5, 4, 5]
sns.lineplot(x, y)
plt.show()
しかし、通常、私たちはこのような単純な手作りのリストを扱うことはない。より大きなデータセットからインポートしたデータや、データベースから直接取り出したデータを扱うことがあります。では、データセットをインポートして、それを使ってみましょう。
インポートデータ
Hotel Bookingsのデータセットを使って、そこからデータを使ってみましょう。
import pandas as pd
df = pd.read_csv('hotel_bookings.csv')
print(df.head())
このデータセットのカラムを見てみよう。
hotel is_canceled reservation_status ... arrival_date_month stays_in_week_nights
0 Resort Hotel 0 Check-Out ... July 0
1 Resort Hotel 0 Check-Out ... July 0
2 Resort Hotel 0 Check-Out ... July 1
3 Resort Hotel 0 Check-Out ... July 1
4 Resort Hotel 0 Check-Out ... July 2
このデータセットにはたくさんのカラムがあるので、これは切り詰めた表示です。例えば、arrival_date_month
をカテゴリー別のX軸として、stays_in_week_nights
を数値のY軸として、このデータセットを見てみましょう。
import matplotlib.pyplot as plt
import seaborn as sns
import pandas as pd
sns.set_theme(style="darkgrid")
df = pd.read_csv('hotel_bookings.csv')
sns.lineplot(x = "arrival_date_month", y = "stays_in_week_nights", data = df)
plt.show()
Pandasを使ってCSVデータを読み込み、DataFrame
に格納します。そして、 lineplot()
関数の引数 x
と y
をそのデータフレームのカラムの名前として代入することができます。もちろん、 data
引数にデータフレームを代入することで、どのデータセットを扱うかを指定する必要があります。
さて、この結果は
6月、7月、8月(夏休み)は平日の宿泊が長くなる傾向があり、1月、2月(新年までの連休の直後)は最も低くなることがよくわかります。
また、信頼区間は、線そのものの周りの領域として見ることができ、これはデータの推定中心傾向を示しています。各x値(各月の宿泊者数)に対して複数のy値があるので、Seabornはこれらの記録の中心傾向を計算し、その線とその傾向に対する信頼区間をプロットする。
一般に、7月の平日夜間の宿泊日数は2.8日であるが、信頼区間は2.78-2.84に及ぶ。
ワイドフォルムのデータをプロットする
さて、これまでやってきたような整頓された形式ではなく、広い範囲のデータをプロットする方法を見てみましょう。変数 stays_in_week_nights
を月ごとに視覚化したいと思いますが、到着した年も考慮に入れたいと思います。これは、各年、各月を1つの図に表した線グラフになります。
このデータセットはデフォルトではこの処理に適していないので、データの前処理をする必要があります。
import matplotlib.pyplot as plt
import seaborn as sns
import pandas as pd
df = pd.read_csv('hotel_bookings.csv')
# Truncate
df = df[['arrival_date_year', 'arrival_date_month', 'stays_in_week_nights']]
# Save the order of the arrival months
order = df['arrival_date_month']
# Pivot the table to turn it into wide-form
df_wide = df.pivot_table(index='arrival_date_month', columns='arrival_date_year', values='stays_in_week_nights')
# Reindex the DataFrame with the `order` variable to keep the same order of months as before
df_wide = df_wide.reindex(order, axis=0)
print(df_wide)
ここでは、まずデータセットをいくつかの関連する列に切り詰めた。そして、到着日月の順番を保存しておき、後々のために保存しておくのです。ここでは、どのような順番でも構いませんが。
次に、狭い形式のデータを広い形式にするために、arrival_date_month
の特徴を中心にテーブルをピボット化し、arrival_date_year
を列に、stays_in_week_nights
を値に変えています。最後に、 reindex()
を使用して、以前と同じ到着月の順序を強制しています。
それでは、データセットがどのようになったか見てみましょう。
arrival_date_year 2015 2016 2017
arrival_date_month
July 2.789625 2.836177 2.787502
July 2.789625 2.836177 2.787502
July 2.789625 2.836177 2.787502
July 2.789625 2.836177 2.787502
July 2.789625 2.836177 2.787502
... ... ... ...
August 2.654153 2.859964 2.956142
August 2.654153 2.859964 2.956142
August 2.654153 2.859964 2.956142
August 2.654153 2.859964 2.956142
August 2.654153 2.859964 2.956142
素晴らしい! このデータセットは、広い範囲での可視化のために正しくフォーマットされ、 stays_in_week_nights
の中心傾向も計算されました。これでワイドフォームのデータセットが扱えるようになったので、あとはプロットするだけです。
sns.lineplot(data=df_wide)
plt.show()
lineplot()` 関数はワイドフォームのデータセットをネイティブに認識し、それに応じてプロットします。この結果
Seabornで折れ線グラフをカスタマイズする
手動で挿入したデータをプロットする方法、簡単なデータセットの特徴をプロットする方法、そして異なるタイプの可視化に適合するようにデータセットを操作する方法を探ったので、より消化しやすい情報を提供するために折れ線グラフをカスタマイズする方法について見てみましょう。
色相を使った線グラフの作図
色相を使用すると、データセットをグループ化したい特徴に基づいて、複数の個別の折れ線グラフに分離することができます。例えば、stays_in_week_nights
の中心傾向を月ごとに可視化することができますが、arrival_date_year
も考慮に入れて、その特徴に基づいて個々の折れ線グラフをグループ化することができます。
これはまさに、前の例でやったことを手動でやったものです。データセットをワイドフォームのデータフレームに変換し、プロットしました。しかし、年を色相にグループ化することもでき、全く同じ結果になります。
import matplotlib.pyplot as plt
import seaborn as sns
import pandas as pd
df = pd.read_csv('hotel_bookings.csv')
sns.lineplot(x = "arrival_date_month", y = "stays_in_week_nights", hue='arrival_date_year', data = df)
plt.show()
色相の引数として arrival_date_year
特徴を指定することで、Seabornに各X-Yマッピングを arrival_date_year
特徴で分離するように指示したので、最終的には3種類のラインプロットになります。
今回は、中心的な傾向の周りに信頼区間をマークしています。
Seabornで線グラフの信頼区間をカスタマイズする
いくつかの引数を使って、信頼区間の有効化/無効化、および種類の変更を簡単に行うことができます。ci引数は信頼区間のサイズを指定するもので、整数、
‘sd’(標準偏差)、またはオフにしたい場合は
None` を設定することができます。
err_styleは、信頼区間のスタイルを指定するために使用します。バンドがどのように機能するかはこれまで見てきましたので、代わりに
bars` を使用した信頼区間を試してみましょう。
import matplotlib.pyplot as plt
import seaborn as sns
import pandas as pd
df = pd.read_csv('hotel_bookings.csv')
sns.lineplot(x = "arrival_date_month", y = "stays_in_week_nights", err_style='bars', data = df)
plt.show()
この結果は
そして、デフォルトで95
に設定されている信頼区間を変更して、代わりに標準偏差を表示するようにしましょう。
import matplotlib.pyplot as plt
import seaborn as sns
import pandas as pd
df = pd.read_csv('hotel_bookings.csv')
sns.lineplot(x = "arrival_date_month", y = "stays_in_week_nights", err_style='bars', ci='sd', data = df)
plt.show()
結論
このチュートリアルでは、Seabornで折れ線グラフを描くためのいくつかの方法について説明しました。数値やカテゴリーをX軸とするシンプルなプロットの作成方法を説明した後、データセットをインポートして可視化しました。
データセットを操作して、複数の特徴を可視化するためのフォームを変更する方法と、折れ線グラフをカスタマイズする方法を検討しました。
もしあなたがデータ可視化に興味があり、何から始めたらいいかわからないなら、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です。
データビジュアライゼーションのユニークで実用的なガイドとして、あなたがキャリアで使うかもしれない多くのツールを紹介しています。