matplotlibとseabornの使い分け
matplotlibは軸・凡例・レイアウトなどを細かく制御でき、seabornはmatplotlibをベースに、統計データの可視化を少ないコードで行えるライブラリです。たとえばbarplotでは、列名を指定するだけで平均値などを集計して棒グラフにできます。
以下では、商品カテゴリ別の平均売上を棒グラフにするといった同じタスクを、2本のコードで比較します。まずmatplotlibで書いてみます。
import matplotlib.pyplot as plt
df = xl("A1:E19", headers=True)
summary = df.groupby(
"商品カテゴリ", sort=False)["売上"].mean() # (1)
fig, ax = plt.subplots()
ax.bar(summary.index, summary.values,
color="steelblue", label="平均売上")
ax.set_xlabel("商品カテゴリ")
ax.set_ylabel("平均売上(千円)")
ax.set_title("商品カテゴリ別 平均売上")
ax.legend()
fig
プレビューには、複合機1366.7・プリンター1300.0・シュレッダー663.3(千円)の棒が左からこの順に並び、軸ラベル・タイトル・凡例も表示されます。(1)groupbyは既定ではグループのキーをソートするため、sort=Falseを指定して元の表での出現順(複合機・プリンター・シュレッダー)を保っています。
seabornで描くと、次のように短くなります。
import seaborn as sns
df = xl("A1:E19", headers=True)
sns.barplot(data=df, x="商品カテゴリ", y="売上") # 平均売上の棒グラフを描画
sns.barplotは、指定した列をもとに平均値を集計して棒グラフを描きます。そのため、groupbyによる集計を自分で書かなくても、列名を指定するだけで平均値を可視化できます。
各棒に重なる縦線は、seabornが既定で表示するエラーバーで、平均値について推定した95%信頼区間を表します。これは6か月分のデータの「ばらつきそのもの」ではなく、標本から推定した平均値の不確かさを表すものなので、箱ひげ図とは意味が異なります。複合機の平均売上が最も高く、シュレッダーが最も低くなります。
2本のコードの違いを観点ごとに比較すると、次のとおりです。
| 観点 | matplotlib | seaborn |
| 集計処理 | groupby(...)["売上"].mean()を自分で書く |
sns.barplotが列名指定だけで平均値を自動計算 |
| ばらつきの表示 | 平均値の棒のみ。必要なら自分で描き足す | 95%信頼区間のエラーバーを既定で自動表示 |
| 向いている場面 | 軸・配色・注釈など細部を1つずつ制御したいとき | 統計的な集計とプロットを素早く済ませたいとき |
このように、matplotlibは細部を自分で制御でき、seabornは列名指定だけで素早く形にできます。次節からは、主にseabornを用います。
