seabornで変わるデータ可視化
- 2 日前
- 読了時間: 6分
更新日:1 日前

はじめに:Matplotlibの「壁」にぶつかっていませんか?
データ分析を学び始めて、Pythonで可視化に挑戦したところ、最初に出会ったのはMatplotlibだったという方は多いのではないしょうか。「Pythonで可視化といえばMatplotlib!」と意気込んで始めたものの、こんな経験はありませんか?
コードが長すぎて、自分が今、何をやっているのかわからない
グラフの軸ラベルやタイトルの設定だけで10行を超える
グループごとに色分けしたいだけなのに、for文を書かされる
デフォルトの見た目が地味だと感じる
今回お伝えするのは、seaborn(シーボーン)というライブラリです。これを使えば、書くコード量が削減され、見た目も改善できます。
Matplotlib初心者「あるある」挫折ポイント
Matplotlibで可視化を始めた初心者が、ぶつりやすい壁をいくつか挙げてみます。 ここでは例として、レストランでのチップに関する情報を含むサンプルデータであるtipsを使って可視化を実装してみます。
あるある1:「グループごとに色分けしたい」だけなのに...
やりたいこと: 性別ごとに散布図の色を変えたい
Matplotlibでの実装:
import matplotlib.pyplot as plt
import pandas as pd
import seaborn as sns
# データ準備
tips = sns.load_dataset('tips')
# 性別ごとにループで描画
fig, ax = plt.subplots(figsize=(8, 6))
for sex in tips['sex'].unique():
subset = tips[tips['sex'] == sex]
ax.scatter(subset['total_bill'], subset['tip'], label=sex, alpha=0.6)
ax.set_xlabel('Total Bill', fontsize=12)
ax.set_ylabel('Tip', fontsize=12)
ax.set_title('Bill vs Tip by Gender', fontsize=14)
ax.legend()
plt.tight_layout()
plt.show()
コード行数:14行
さらにこちらの実装ではループの中でデータを分割してるので、データが増えるとコードの実行時間が長くなります。
あるある2:「平均値を棒グラフで」の実装が大変
やりたいこと: 曜日ごとの平均請求額を棒グラフで表示する
Matplotlibでの実装:
import matplotlib.pyplot as plt
import pandas as pd
import seaborn as sns
tips = sns.load_dataset('tips')
# 1. まずgroupbyで平均を計算
avg_by_day = tips.groupby('day')['total_bill'].mean()
# 2. プロット
fig, ax = plt.subplots(figsize=(8, 6))
ax.bar(avg_by_day.index, avg_by_day.values)
ax.set_xlabel('Day of Week', fontsize=12)
ax.set_ylabel('Average Total Bill', fontsize=12)
ax.set_title('Average Bill by Day', fontsize=14)
plt.xticks(rotation=45)
plt.tight_layout()
plt.show()
コード行数:13行(しかも信頼区間なし)
さらに、「95%信頼区間も表示したい」となると、標準誤差の計算とエラーバーの追加で5〜7行増えます。
あるある3:見た目が「論文っぽくて難しそう」
Matplotlibのデフォルトはどこか無機質な印象を与え、ビジネスの場では使いづらい見た目です。
太い黒枠
色使いが地味
「もっとオシャレにしたい!」と思ってカスタマイズを始めると、設定項目が膨大で途方に暮れます。
MatplotlibとSeabornのコード比較
では、上記の「あるある」を、seabornでどう書けるのか見ていきましょう。
比較1:グループごとに色分けした散布図(コード量:13行 → 4行)
Matplotlib(13行)
import matplotlib.pyplot as plt
import seaborn as sns
tips = sns.load_dataset('tips')
fig, ax = plt.subplots(figsize=(8, 6))
for sex in tips['sex'].unique():
subset = tips[tips['sex'] == sex]
ax.scatter(subset['total_bill'], subset['tip'], label=sex, alpha=0.6)
ax.set_xlabel('Total Bill', fontsize=12)
ax.set_ylabel('Tip', fontsize=12)
ax.set_title('Bill vs Tip by Gender', fontsize=14)
ax.legend()
plt.tight_layout()
plt.show()
seaborn(4行)
import seaborn as sns
tips = sns.load_dataset('tips')
sns.scatterplot(data=tips, x='total_bill', y='tip', hue='sex')
plt.show()

何が起こったのか?
hue='sex' と書くだけで、自動的に性別ごとに色分け
ループも不要、DataFrameの分割も不要
凡例も自動で追加される
比較2:平均値の棒グラフ(コード量:13行 → 4行)
Matplotlib
import matplotlib.pyplot as plt
import numpy as np
tips = sns.load_dataset('tips')
# 平均と標準誤差を計算
avg_by_day = tips.groupby('day')['total_bill'].agg(['mean', 'sem'])
# 95%信頼区間を計算
ci = 1.96 * avg_by_day['sem']
# プロット
fig, ax = plt.subplots(figsize=(8, 6))
ax.bar(avg_by_day.index, avg_by_day['mean'], yerr=ci, capsize=5, alpha=0.7)
ax.set_xlabel('Day of Week', fontsize=12)
ax.set_ylabel('Average Total Bill', fontsize=12)
ax.set_title('Average Bill by Day (95% CI)', fontsize=14)
plt.xticks(rotation=45)
plt.tight_layout()
plt.show()
コード行数:13行(信頼区間の計算含む)
seaborn(4行)
import seaborn as sns
tips = sns.load_dataset('tips')
sns.barplot(data=tips, x='day', y='total_bill')
plt.show()

何が起こったのか?
seabornの barplot() は、内部で自動的に以下を実行します。
groupby でグループ化
各グループの mean()(平均)を計算
sem()(標準誤差)を計算
95%信頼区間を計算してエラーバーを表示
seabornでは列名を指定するだけで、大幅にコードを削減することができます。
比較3:複数グループの箱ひげ図
Matplotlib(複雑なため、省略)
Matplotlibで「曜日×性別」の2次元の箱ひげ図を描こうとすると、位置調整が非常に大変で複雑になります。
seaborn(4行)
import seaborn as sns
tips = sns.load_dataset('tips')
sns.boxplot(data=tips, x='day', y='total_bill', hue='sex')
plt.show()

何が起こったのか?
hue='sex' で自動的に性別ごとに色分け&並列配置
箱の位置調整も全自動
凡例も自動に設定可能
Matplotlibとseabornのビジュアル比較:デフォルトでオシャレ
コードの短さだけではありません。seabornの本当の魅力は、何も設定しなくても見た目がオシャレという点です。
ビジュアルの違い

実例:同じデータでの見た目の違い
Matplotlibで描いた散布図
import matplotlib.pyplot as plt
import seaborn as sns
tips = sns.load_dataset('tips')
plt.scatter(tips['total_bill'], tips['tip'])
plt.xlabel('Total Bill')
plt.ylabel('Tip')
plt.title('Bill vs Tip')
plt.show()
印象: 青い点が並んでるだけ。正直、レポートに載せるのは躊躇してしまいます。

seabornで描いた散布図
import seaborn as sns
tips = sns.load_dataset('tips')
sns.scatterplot(data=tips, x='total_bill', y='tip', hue='time', style='sex', size='size')
plt.show()
印象: ランチ/ディナーで色分け、性別でマーカー形状変更、人数でサイズ変更が可能です。情報量が圧倒的に多いのに、見やすいという利点があります。

テーマ設定も一瞬で変更可能
「もっとシンプルにしたい」「ダークモードにしたい」といったカスタマイズも、seabornなら少しの修正で実現可能です。
# スタイルを変更
sns.set_style('whitegrid') # または "darkgrid", "white", "dark", "ticks"
# カラーパレットを変更
sns.set_palette('Set2') # または "husl", "coolwarm", "viridis" など
たった2行で、すべてのグラフの見た目が統一されたプロ仕様になります。
seabornで「できること」の幅広さ
ここまでで、「seabornは楽」ということは伝わったと思います。しかし、「楽 = 機能が少ない」わけではありません。seabornでは、統計的に意味のあるグラフが簡単に描けるように設計されています。
実務でよく使うプロット一覧

上記の操作がすべて1行で書ける。これがSeabornの強みです。
まとめ:賢く「楽」をすることが、分析の上達への近道
「でも、Matplotlibの方が細かく制御できるんじゃないの?」その通りです。両者にはそれぞれ得意分野があります。 seabornの強みは、統計的なグラフを素早く、きれいに作れることです。データの傾向を掴みたいときに、コード量を気にせず試行錯誤できます。 もちろん、細かいデザイン調整が必要ならMatplotlibが活躍します。どちらか一方ではなく、状況に応じて使い分けられるのが理想的です。
seabornを使うメリット
コードが短い → バグが減る
見た目が良い → 報告の質が上がる
時間が浮く → データ分析に集中できる
まずseabornで「こんなグラフが描きたい」というイメージを掴んでから、必要に応じてMatplotlibを学ぶと、ずっと効率的かもしれません。
「楽」をすることは、「手抜き」ではない
データ分析において、効率的なツールを使うことで、より本質的な作業に時間を使えるようになります。
Matplotlibの細かい設定に時間をかけるよりも、seabornでサクッとグラフを描いて、「データから何を読み取るか」「どんな施策につなげるか」といった分析そのものに集中できます。
seabornを使えば、統計的に意味のあるグラフを少ないコードで作成できるので、試行錯誤のスピードが上がり、より多くの角度からデータを見られるようになります。大切なのは、グラフの選び方を理解し、実務で使えるようになることです。
seabornを使ってみたいけれど、『業務でどう使い始めればいいか分からない…』という方もいるかもしれませんが実務で使うデータ可視化は、複雑なコードを覚える必要はありません。
iLectでは、初心者の方でも無理なく学べる講座も提供しています。 まずは基礎から始めて、少しずつ実践に取り入れてみましょう。
データ分析基礎 - seabornで体験するデータビジュアライゼーション講座の詳細はこちらから。
iLectでは、データサイエンスはもちろん、AIリテラシーからE資格取得のための講座まで幅広くご提供しております。社員のスキル目標の設定や不足している人材の洗い出しなど、ヒアリングを通して最適なセミナーをご提案させていただきます。人材育成にお悩みの方は、ぜひお気軽にお問い合わせください。


