【Matplotlib入門 第5回】Matplotlibの最高の相棒!Seabornでデータ可視化を次のレベルへ 🎨
「Matplotlibって高機能だけど、もっと手軽に綺麗なグラフを作りたいな…」
「データグループごとの分布を比較する、もっと洗練されたグラフはないの?」
「PandasのDataFrameから、もっと直感的にグラフを作りたい!」
こんにちは! Pythonデータ可視化探検隊、隊長のPythonistaです! 前回の第4回までで、私たちはMatplotlibを使いこなし、基本的なグラフから注釈付きの応用的なグラフまで、様々なデータ可視化のテクニックを学んできました。もう、あなたは立派な「グラフ職人」の仲間入りです!
シリーズ最終回(あるいは次へのステップ編)となる今回は、そのMatplotlibの能力をさらに引き出し、より少ないコードで、より美しく、より情報量の多い統計グラフを簡単に作成するための強力なライブラリ、Seaborn (シーボーン) をご紹介します。Seabornは、Matplotlibを基盤として作られており、特にデータ分析や統計的な可視化に特化しています。MatplotlibとSeaborn、この二つのライブラリを使いこなすことで、あなたのデータ可視化スキルはプロフェッショナルなレベルへと飛躍します!
1. Seabornとは? Matplotlibとの関係と使うメリット
Seabornは、MatplotlibをベースにしたPythonのデータ可視化ライブラリです。Matplotlibの強力な描画機能を活かしつつ、より高水準な(つまり、より少ないコードで多くのことができる)インターフェースを提供します。
Matplotlibとの関係とSeabornのメリット:
- Matplotlibが土台: SeabornはMatplotlibの上で動作します。そのため、Seabornで描画したグラフも、最終的にはMatplotlibのオブジェクトです。これは、Seabornで大枠を描き、細かな調整(タイトル、ラベル、注釈など)はこれまで学んだ
plt
やax
のメソッドで行える、ということを意味します。 - 美しいデフォルトスタイル: Seabornをインポートして簡単な設定をするだけで、グラフの見た目が洗練された美しいものに変わります。
- 統計的グラフの簡便化: Matplotlibだけでは少し手間がかかるような統計的なグラフ(例: 回帰直線付きの散布図、複数のカテゴリごとの分布比較など)を、1行または数行のコードで簡単に描画できます。
- Pandas DataFrameとの強力な連携: Seabornは、PandasのDataFrame形式のデータを扱うのに最適化されています。列名を指定するだけで、複雑なグラフを直感的に作成できます。
要するに、Seabornは「Matplotlibの機能を統計的データ分析向けに使いやすくし、見た目も良くしてくれる最高の相棒」なのです。
2. インストールと準備:Seabornの世界へ
Seabornも外部ライブラリなので、pipでインストールします。
pip install seaborn
そして、Pythonスクリプトでは以下のようにインポートするのが一般的です。
import seaborn as sns
import matplotlib.pyplot as plt
import pandas as pd # SeabornはPandasと連携することが多い
import numpy as np
# Seabornのデフォルトスタイルとカラーパレットを設定
sns.set_theme(style="whitegrid", palette="pastel")
sns.set_theme()
を実行するだけで、これ以降にMatplotlibで描画されるグラフも、Seabornの洗練されたスタイルになります。
3. 関係性を可視化する:relplot()
と scatterplot()
relplot()
(relational plot) は、2つの変数間の関係性を示すための高水準なインターフェースです。まずは基本的な散布図から見ていきましょう。
Seabornには、有名な「tips(チップ)」データセットが内蔵されているので、これを使ってみます。
# Seabornに内蔵されているサンプルデータセットをロード
tips = sns.load_dataset("tips")
print("--- tipsデータセットの先頭5行 ---")
print(tips.head())
実行結果 (例):
--- tipsデータセットの先頭5行 ---
total_bill tip sex smoker day time size
0 16.99 1.01 Female No Sun Dinner 2
1 10.34 1.66 Male No Sun Dinner 3
2 21.01 3.50 Male No Sun Dinner 3
3 23.68 3.31 Male No Sun Dinner 2
4 24.59 3.61 Female No Sun Dinner 4
このデータを使って、「会計総額(total_bill)」と「チップ額(tip)」の関係を散布図にしてみましょう。
# total_billとtipの関係を散布図で表示
# hue引数で、さらに「喫煙者(smoker)」かどうかで色分け
plt.figure(figsize=(8, 6))
sns.scatterplot(data=tips, x="total_bill", y="tip", hue="smoker", style="time", size="size")
plt.title('会計総額とチップ額の関係')
plt.xlabel('会計総額 ($)')
plt.ylabel('チップ額 ($)')
plt.show()
どうでしょうか? data
にDataFrameを、x
とy
に列名を指定するだけで、基本的な散布図が描けます。さらに、hue
(色)、style
(マーカーの形)、size
(マーカーのサイズ)といった引数に別の列名を指定するだけで、グラフに3次元、4次元、5次元の情報を簡単に追加できてしまいます。これがMatplotlib単体よりも優れている点です。
4. カテゴリデータを可視化する:catplot()
の仲間たち
Seabornが特に得意とするのが、カテゴリデータ(性別、曜日、喫煙の有無など)を含むデータの可視化です。catplot()
(categorical plot) という高水準なインターフェースや、それに対応する個別の関数(boxplot
, violinplot
, barplot
など)があります。
4.1. 箱ひげ図 (boxplot
) とバイオリンプロット (violinplot
)
前回Matplotlibで作成した箱ひげ図も、SeabornならDataFrameからより簡単に作成でき、さらに分布の密度も同時に表現できるバイオリンプロットも描けます。
# 曜日(day)ごとの会計総額(total_bill)の分布を比較
fig, axes = plt.subplots(1, 2, figsize=(14, 6))
# 左側:箱ひげ図
sns.boxplot(data=tips, x="day", y="total_bill", ax=axes[0])
axes[0].set_title('曜日ごとの会計総額 (箱ひげ図)')
# 右側:バイオリンプロット (箱ひげ図と分布の密度を組み合わせたもの)
sns.violinplot(data=tips, x="day", y="total_bill", hue='sex', split=True, ax=axes[1])
axes[1].set_title('曜日・性別ごとの会計総額 (バイオリンプロット)')
plt.tight_layout()
plt.show()
バイオリンプロットでは、hue='sex'
と指定するだけで男女別の分布を色分けし、split=True
でそれを左右に並べて表示してくれます。このような複雑なグラフが驚くほど簡単に描けますね。
4.2. 棒グラフ (barplot
)
Seabornの棒グラフは、単に値を表示するだけでなく、デフォルトでそのカテゴリの平均値と、信頼区間(エラーバー)を自動で計算して描画してくれます。
# 曜日ごとのチップ額の平均値を棒グラフで表示
plt.figure(figsize=(8, 6))
sns.barplot(data=tips, x="day", y="tip", hue='time')
plt.title('曜日と時間帯ごとの平均チップ額')
plt.ylabel('平均チップ額 ($)')
plt.show()
5. SeabornとMatplotlibの連携
最後に、SeabornはMatplotlibの「ラッパー(包むもの)」であることを思い出しましょう。Seabornで大枠のグラフを作成した後、これまで学んだMatplotlibの関数を使って細かなカスタマイズが可能です。
# Seabornで回帰直線付きの散布図を作成
sns.lmplot(data=tips, x="total_bill", y="tip", hue='smoker', aspect=1.5)
# ここからMatplotlibの関数でカスタマイズ
plt.title('会計総額とチップ額の回帰分析', fontsize=16)
plt.xlabel('会計総額 ($)', fontsize=12)
plt.ylabel('チップ額 ($)', fontsize=12)
plt.grid(True)
# 特定の点に注釈を追加
plt.annotate('High Tip!', xy=(50, 10), xytext=(35, 10.5),
arrowprops=dict(facecolor='black', shrink=0.05))
plt.show()
このように、Seabornで複雑なグラフを簡単に描き、Matplotlibで細部を仕上げる、という使い分けが非常に強力です。
まとめ:Seabornでデータ可視化は新たなステージへ!
今回は、Matplotlib入門シリーズの締めくくりとして、その最高の相棒であるSeabornの基本的な使い方をご紹介しました。
- SeabornがMatplotlibを基盤とした、より美しく、より情報量の多い統計グラフを簡単に作成するためのライブラリであること。
sns.set_theme()
で簡単にプロフェッショナルな見た目にできること。- PandasのDataFrameと非常に相性が良く、列名を指定するだけで複雑なグラフが描けること。
relplot
やcatplot
といった高水準なインターフェースや、scatterplot
,boxplot
,barplot
などの便利な関数。- Seabornで描いたグラフも、Matplotlibの関数で細かくカスタマイズできること。
Matplotlibで描画の基礎を固め、Seabornでその表現力を一気に高める。これがPythonでのデータ可視化をマスターするための王道ルートと言えるでしょう。Seabornには、今回紹介しきれなかったjointplot
(2変数の分布と関係性を同時に表示)やpairplot
(複数変数の関係性を一覧表示)など、データ分析をさらに加速させる強力なグラフがたくさんあります。
これにてMatplotlib入門シリーズは一区切りです。皆さんの手元には、データを自在に可視化するための強力なツールが揃いました。ぜひ、ご自身のデータを使って様々なグラフを描き、データから面白いストーリーを読み解いてみてください!
これまでのシリーズをお読みいただき、ありがとうございました! Happy Plotting! 📈
次回からはPandasモジュールについて連載を始める予定です!
コメント
コメントを投稿