Step 40:Seabornで美しいグラフを作ろう

✨ ステップ40: Seabornで美しいグラフを作ろう

Seabornでプロフェッショナルな統計グラフを簡単に!

ステップ35〜39でMatplotlibを使ったグラフの作成を学びました。今回はSeaborn(シーボーン)というライブラリを使って、より美しく、統計的なグラフを簡単に作成する方法を学びます。

📖 このステップで学ぶこと

・Seabornとは何か

・スタイルとカラーパレットの設定

・箱ひげ図(boxplot)

・バイオリンプロット(violinplot)

・ヒートマップ(heatmap)

🎯 1. Seabornとは?

Seabornは、Matplotlibをベースにしたデータ可視化ライブラリです。Matplotlibで作れるグラフをより美しく、少ないコードで作成できます。

📌 SeabornとMatplotlibの比較

特徴 Matplotlib Seaborn
デフォルトの見た目 シンプル 洗練されている
統計グラフ 自分で計算が必要 関数1つで作成可能
DataFrameとの連携 列を指定 列名で直接指定
カスタマイズ 自由度が高い 簡単にスタイル変更

🔰 Seabornをインポートする

コード:Seabornの準備

# Seabornをインポート
import seaborn as sns
import matplotlib.pyplot as plt
import pandas as pd
import numpy as np

# Seabornのスタイルを設定
sns.set_style("whitegrid")

print("Seabornの準備完了!")

※ 画面が小さい場合は、コードブロックを横にスクロールできます

💡 コードの解説

import seaborn as sns

 ・Seabornをsnsという名前でインポート(慣例)

 ・snsはSeabornの作者が好きなテレビ番組のキャラクター名に由来

sns.set_style(“whitegrid”)

 ・グラフのスタイルを設定

 ・whitegridは白背景にグリッド線があるスタイル

SeabornはMatplotlibと一緒に使うので、両方インポートします。

実行結果

Seabornの準備完了!

🎨 2. スタイルの設定

Seabornには、グラフの見た目を変える5つのスタイルがあらかじめ用意されています。

📌 5つのスタイル

スタイル名 特徴 おすすめの用途
whitegrid 白背景+グリッド線 最も一般的、見やすい
darkgrid グレー背景+グリッド線 プレゼンテーション
white 白背景のみ シンプルなデザイン
dark グレー背景のみ ダークモード風
ticks 白背景+目盛り線 学術的なグラフ

📝 スタイルを比較する

コード:5つのスタイルを表示

import seaborn as sns
import matplotlib.pyplot as plt
import numpy as np

# データの準備
x = np.arange(10)
y = np.random.randn(10)

# 5つのスタイルを比較
styles = ['darkgrid', 'whitegrid', 'dark', 'white', 'ticks']

fig, axes = plt.subplots(1, 5, figsize=(18, 3))

for i, style in enumerate(styles):
    sns.set_style(style)
    axes[i].plot(x, y, marker='o')
    axes[i].set_title(style)

plt.tight_layout()
plt.show()

# 好みのスタイルに戻す
sns.set_style("whitegrid")

※ 画面が小さい場合は、コードブロックを横にスクロールできます

💡 コードの解説

for i, style in enumerate(styles):

 ・stylesリストを順番に処理

 ・iがインデックス(0, 1, 2…)、styleがスタイル名

sns.set_style(style)

 ・ループ内でスタイルを切り替える

 ・その後に描くグラフに適用される

📝 コンテキストの設定

set_context()を使うと、グラフの全体的なサイズを用途に合わせて調整できます。

📌 4つのコンテキスト

コンテキスト名 特徴 用途
paper 最も小さい 論文、印刷物
notebook 標準サイズ(デフォルト) Jupyter Notebook
talk 大きめ プレゼンテーション
poster 最も大きい ポスター発表

コード:コンテキストを設定

import seaborn as sns
import matplotlib.pyplot as plt

# データ
months = ['1月', '2月', '3月', '4月']
sales = [120, 150, 130, 180]

# コンテキストとスタイルを設定
sns.set_context("talk")  # プレゼンテーション用(大きめ)
sns.set_style("whitegrid")

plt.figure(figsize=(10, 6))
plt.plot(months, sales, marker='o', linewidth=3)
plt.title('月別売上推移')
plt.ylabel('売上(万円)')
plt.show()

※ 画面が小さい場合は、コードブロックを横にスクロールできます

💡 コードの解説

sns.set_context(“talk”)

 ・フォントサイズやマーカーサイズが大きくなる

 ・プレゼンテーションで見やすいサイズに

set_style()とset_context()は組み合わせて使えます。

🌈 3. カラーパレット

Seabornには、あらかじめ美しい色の組み合わせ(カラーパレット)が用意されています。

📌 よく使うカラーパレット

パレット名 特徴 用途
deep はっきりした色(デフォルト) 一般的な用途
muted 落ち着いた色 ビジネス文書
pastel 優しいパステル色 柔らかい印象
bright 鮮やかな色 目立たせたい時
colorblind 色覚障害に配慮 アクセシビリティ重視
Set2 バランスの良い色 カテゴリ分け

📝 カラーパレットを使う

コード:パステルカラーの棒グラフ

import seaborn as sns
import matplotlib.pyplot as plt

# データの準備
categories = ['商品A', '商品B', '商品C', '商品D', '商品E']
sales = [120, 150, 90, 180, 110]

# パステルカラーパレットを使用
sns.set_palette("pastel")
sns.set_style("whitegrid")

plt.figure(figsize=(10, 6))
plt.bar(categories, sales)
plt.title('商品別売上', fontsize=16)
plt.ylabel('売上(万円)', fontsize=12)
plt.show()

※ 画面が小さい場合は、コードブロックを横にスクロールできます

💡 コードの解説

sns.set_palette(“pastel”)

 ・パステルカラーパレットを設定

 ・この後に描くすべてのグラフに適用される

plt.bar()などMatplotlibの関数でも、Seabornで設定した色が自動的に使われます。

📝 個別のグラフでパレットを指定

コード:paletteパラメータで指定

import seaborn as sns
import matplotlib.pyplot as plt
import pandas as pd

# データの準備
categories = ['A', 'B', 'C', 'D']
values = [30, 40, 20, 10]
df = pd.DataFrame({'カテゴリ': categories, '値': values})

# Seabornの棒グラフでパレットを指定
sns.set_style("whitegrid")
plt.figure(figsize=(10, 6))
sns.barplot(x='カテゴリ', y='値', data=df, palette='Set2')
plt.title('カテゴリ別の値', fontsize=16)
plt.show()

※ 画面が小さい場合は、コードブロックを横にスクロールできます

💡 コードの解説

sns.barplot()

 ・Seaborn版の棒グラフ

 ・DataFrameの列名で直接指定できる

palette=’Set2′

 ・このグラフだけにSet2パレットを適用

 ・グローバル設定(set_palette)より優先される

📦 4. 箱ひげ図(Box Plot)

箱ひげ図は、データの分布を一目で理解できる便利なグラフです。中央値、四分位数、外れ値などが視覚的にわかります。

📌 箱ひげ図の読み方

部分 意味 説明
箱の中央の線 中央値(50%) データの真ん中の値
箱の下端 第1四分位数(25%) 下から25%の位置
箱の上端 第3四分位数(75%) 下から75%の位置
ひげ(線) データの範囲 外れ値を除いた最小・最大
外れ値 極端に離れた値

🔰 基本的な箱ひげ図

コード:商品別売上の分布

import seaborn as sns
import matplotlib.pyplot as plt
import pandas as pd
import numpy as np

# データの準備
np.random.seed(0)
data = {
    '商品A': np.random.normal(100, 15, 50),
    '商品B': np.random.normal(120, 20, 50),
    '商品C': np.random.normal(90, 10, 50),
}
df = pd.DataFrame(data)

# 箱ひげ図を作成
sns.set_style("whitegrid")
plt.figure(figsize=(10, 6))
sns.boxplot(data=df)
plt.title('商品別売上分布', fontsize=16)
plt.ylabel('売上(万円)', fontsize=12)
plt.show()

※ 画面が小さい場合は、コードブロックを横にスクロールできます

💡 コードの解説

np.random.normal(100, 15, 50)

 ・平均100、標準偏差15の正規分布から50個のデータを生成

 ・商品ごとに異なるパラメータを設定

sns.boxplot(data=df)

 ・DataFrameを渡すと、各列ごとに箱ひげ図を描く

 ・列名が自動的にX軸のラベルになる

実行結果

3つの商品の売上分布が箱ひげ図で表示されます。商品Bが最も高く、ばらつきも大きいことがわかります。

📝 カテゴリ別の箱ひげ図

DataFrameの「縦持ち」形式のデータで、カテゴリ別に比較する方法です。

コード:クラス別テスト得点

import seaborn as sns
import matplotlib.pyplot as plt
import pandas as pd
import numpy as np

# データの準備(縦持ち形式)
np.random.seed(0)
df = pd.DataFrame({
    '得点': np.concatenate([
        np.random.normal(70, 10, 30),  # A組
        np.random.normal(75, 12, 30),  # B組
        np.random.normal(80, 8, 30)    # C組
    ]),
    'クラス': ['A組']*30 + ['B組']*30 + ['C組']*30
})

# 箱ひげ図を作成
plt.figure(figsize=(10, 6))
sns.boxplot(x='クラス', y='得点', data=df, palette='Set2')
plt.title('クラス別テスト得点分布', fontsize=16)
plt.ylabel('得点', fontsize=12)
plt.show()

※ 画面が小さい場合は、コードブロックを横にスクロールできます

💡 コードの解説

np.concatenate([…])

 ・複数の配列を結合して1つの配列に

 ・A組30人、B組30人、C組30人の得点を結合

[‘A組’]*30

 ・’A組’を30回繰り返したリストを作成

 ・得点データとクラス名を対応させる

sns.boxplot(x=’クラス’, y=’得点’, data=df)

 ・x:カテゴリ(横軸)の列名

 ・y:値(縦軸)の列名

 ・data:DataFrameを指定

🎻 5. バイオリンプロット(Violin Plot)

バイオリンプロットは、箱ひげ図に分布の形を加えたグラフです。データがどこに集中しているかがより詳しくわかります。

🔰 基本的なバイオリンプロット

コード:店舗別売上分布

import seaborn as sns
import matplotlib.pyplot as plt
import pandas as pd
import numpy as np

# データの準備
np.random.seed(0)
df = pd.DataFrame({
    '売上': np.concatenate([
        np.random.normal(100, 15, 50),
        np.random.normal(120, 20, 50),
        np.random.normal(90, 10, 50)
    ]),
    '店舗': ['A店']*50 + ['B店']*50 + ['C店']*50
})

# バイオリンプロットを作成
plt.figure(figsize=(10, 6))
sns.violinplot(x='店舗', y='売上', data=df, palette='muted')
plt.title('店舗別売上分布(バイオリンプロット)', fontsize=16)
plt.ylabel('売上(万円)', fontsize=12)
plt.show()

※ 画面が小さい場合は、コードブロックを横にスクロールできます

💡 コードの解説

sns.violinplot()

 ・バイオリンプロットを描く関数

 ・使い方はboxplot()とほぼ同じ

バイオリンの幅が広い部分にデータが多く集中しています。

実行結果

店舗ごとの売上分布がバイオリンの形で表示されます。B店は値が高めで、ばらつきも大きいことがわかります。

📝 箱ひげ図と組み合わせる

コード:内側に箱ひげ図を表示

import seaborn as sns
import matplotlib.pyplot as plt
import pandas as pd
import numpy as np

# データの準備
np.random.seed(0)
df = pd.DataFrame({
    '気温': np.concatenate([
        np.random.normal(28, 3, 50),
        np.random.normal(22, 4, 50),
        np.random.normal(8, 2, 50)
    ]),
    '季節': ['夏']*50 + ['春']*50 + ['冬']*50
})

# バイオリンプロット(内側に箱ひげ図)
plt.figure(figsize=(10, 6))
sns.violinplot(x='季節', y='気温', data=df, 
               palette='Set3', inner='box')
plt.title('季節別気温分布', fontsize=16)
plt.ylabel('気温(℃)', fontsize=12)
plt.show()

※ 画面が小さい場合は、コードブロックを横にスクロールできます

💡 innerパラメータの解説

inner=’box’

 ・バイオリンの内側に箱ひげ図を表示

 ・分布の形と統計量を同時に確認できる

他のオプション:

 ・‘quartile’:四分位数の線を表示

 ・‘point’:各データ点を表示

 ・‘stick’:棒線を表示

 ・None:内側に何も表示しない

📌 箱ひげ図 vs バイオリンプロット

特徴 箱ひげ図 バイオリンプロット
表示内容 中央値、四分位数、外れ値 分布の形まで表示
わかりやすさ シンプルでわかりやすい やや複雑
おすすめ場面 簡潔に比較したい時 分布の詳細を見たい時

🔥 6. ヒートマップ(Heatmap)

ヒートマップは、数値データを色の濃淡で表現するグラフです。特に相関行列の可視化によく使われます。

📝 相関行列とは?

相関行列は、複数の変数間の相関係数をまとめた表です。相関係数は-1から1の値で、変数間の関係の強さを示します。

📌 相関係数の読み方

相関係数 意味
1に近い 強い正の相関 身長↑→体重↑
0に近い 相関なし 身長と成績
-1に近い 強い負の相関 運動↑→体脂肪↓

🔰 相関ヒートマップを作成

コード:科目間の相関を可視化

import seaborn as sns
import matplotlib.pyplot as plt
import pandas as pd
import numpy as np

# データの準備
np.random.seed(0)
df = pd.DataFrame({
    '国語': np.random.normal(70, 15, 100),
    '数学': np.random.normal(75, 12, 100),
    '英語': np.random.normal(72, 10, 100),
    '理科': np.random.normal(77, 13, 100),
    '社会': np.random.normal(73, 11, 100)
})

# 相関行列を計算
corr = df.corr()

# ヒートマップを作成
plt.figure(figsize=(10, 8))
sns.heatmap(corr, annot=True, cmap='coolwarm', 
            vmin=-1, vmax=1, center=0,
            square=True, linewidths=1)
plt.title('科目間の相関係数', fontsize=16)
plt.show()

※ 画面が小さい場合は、コードブロックを横にスクロールできます

💡 コードの解説

corr = df.corr()

 ・DataFrameの全列間の相関係数を計算

 ・結果は5×5の相関行列になる

sns.heatmap()のパラメータ

 ・annot=True:セルに数値を表示

 ・cmap=’coolwarm’:カラーマップ(青→白→赤)

 ・vmin=-1, vmax=1:色の範囲を-1〜1に固定

 ・center=0:0を中央の色(白)にする

 ・square=True:セルを正方形にする

 ・linewidths=1:セル間の線の太さ

実行結果

科目間の相関がカラフルな表で表示されます。赤に近いほど正の相関、青に近いほど負の相関です。対角線は同じ科目同士なので必ず1.0になります。

📝 カラーマップを変更する

📌 よく使うカラーマップ(cmap)

カラーマップ 特徴 おすすめ用途
coolwarm 青→白→赤 相関行列(正負を区別)
RdBu_r 赤→白→青 相関行列(逆配色)
viridis 紫→青→緑→黄 一方向のデータ
YlOrRd 黄→オレンジ→赤 熱量、強度を表現

📝 練習問題

問題1:スタイルとパレットを設定(初級)

📋 問題

Seabornのwhitegridスタイルとpastelパレットを使って、以下のデータの棒グラフを作成してください。

fruits = ['りんご', 'バナナ', 'オレンジ', 'ぶどう', 'いちご']
sales = [120, 150, 100, 80, 110]

※ 画面が小さい場合は、コードブロックを横にスクロールできます

解答例を見る

コード

import seaborn as sns
import matplotlib.pyplot as plt

fruits = ['りんご', 'バナナ', 'オレンジ', 'ぶどう', 'いちご']
sales = [120, 150, 100, 80, 110]

sns.set_style("whitegrid")
sns.set_palette("pastel")

plt.figure(figsize=(10, 6))
plt.bar(fruits, sales)
plt.title('果物別売上', fontsize=16)
plt.ylabel('売上', fontsize=12)
plt.show()

※ 画面が小さい場合は、コードブロックを横にスクロールできます

問題2:箱ひげ図を作成(初級)

📋 問題

3つのクラスのテスト得点を箱ひげ図で比較してください。Set2パレットを使用してください。

import pandas as pd
import numpy as np

np.random.seed(42)
df = pd.DataFrame({
    '得点': np.concatenate([
        np.random.normal(75, 10, 30),
        np.random.normal(80, 12, 30),
        np.random.normal(70, 8, 30)
    ]),
    'クラス': ['A']*30 + ['B']*30 + ['C']*30
})

※ 画面が小さい場合は、コードブロックを横にスクロールできます

解答例を見る

コード

import seaborn as sns
import matplotlib.pyplot as plt
import pandas as pd
import numpy as np

np.random.seed(42)
df = pd.DataFrame({
    '得点': np.concatenate([
        np.random.normal(75, 10, 30),
        np.random.normal(80, 12, 30),
        np.random.normal(70, 8, 30)
    ]),
    'クラス': ['A']*30 + ['B']*30 + ['C']*30
})

sns.set_style("whitegrid")
plt.figure(figsize=(10, 6))
sns.boxplot(x='クラス', y='得点', data=df, palette='Set2')
plt.title('クラス別テスト得点分布', fontsize=16)
plt.show()

※ 画面が小さい場合は、コードブロックを横にスクロールできます

問題3:バイオリンプロットを作成(中級)

📋 問題

問題2と同じデータを使って、内側に箱ひげ図を表示したバイオリンプロットを作成してください。

解答例を見る

コード

import seaborn as sns
import matplotlib.pyplot as plt
import pandas as pd
import numpy as np

np.random.seed(42)
df = pd.DataFrame({
    '得点': np.concatenate([
        np.random.normal(75, 10, 30),
        np.random.normal(80, 12, 30),
        np.random.normal(70, 8, 30)
    ]),
    'クラス': ['A']*30 + ['B']*30 + ['C']*30
})

sns.set_style("whitegrid")
plt.figure(figsize=(10, 6))
sns.violinplot(x='クラス', y='得点', data=df, 
               palette='muted', inner='box')
plt.title('クラス別テスト得点分布(バイオリンプロット)', fontsize=16)
plt.show()

※ 画面が小さい場合は、コードブロックを横にスクロールできます

問題4:相関ヒートマップを作成(中級)

📋 問題

5科目のテストデータを作成し、科目間の相関係数をヒートマップで表示してください。数値も表示してください。

解答例を見る

コード

import seaborn as sns
import matplotlib.pyplot as plt
import pandas as pd
import numpy as np

# データ作成
np.random.seed(0)
n = 100
df = pd.DataFrame({
    '国語': np.random.normal(70, 15, n),
    '数学': np.random.normal(75, 12, n),
    '英語': np.random.normal(72, 10, n),
    '理科': np.random.normal(77, 13, n),
    '社会': np.random.normal(73, 11, n)
})

# 相関行列を計算
corr = df.corr()

# ヒートマップ作成
plt.figure(figsize=(10, 8))
sns.heatmap(corr, annot=True, cmap='coolwarm',
            vmin=-1, vmax=1, center=0,
            square=True, linewidths=1, 
            fmt='.2f')
plt.title('科目間の相関分析', fontsize=16)
plt.tight_layout()
plt.show()

※ 画面が小さい場合は、コードブロックを横にスクロールできます

問題5:箱ひげ図とバイオリンプロットの比較(上級)

📋 問題

同じデータを箱ひげ図とバイオリンプロットで並べて表示し、両者を比較できるようにしてください。

解答例を見る

コード

import seaborn as sns
import matplotlib.pyplot as plt
import pandas as pd
import numpy as np

# データ作成
np.random.seed(0)
df = pd.DataFrame({
    '得点': np.concatenate([
        np.random.normal(75, 10, 40),
        np.random.normal(80, 12, 40),
        np.random.normal(70, 8, 40),
        np.random.normal(85, 9, 40)
    ]),
    'クラス': ['A組']*40 + ['B組']*40 + ['C組']*40 + ['D組']*40
})

# 2つのグラフを並べる
sns.set_style("whitegrid")
fig, axes = plt.subplots(1, 2, figsize=(15, 6))

# 左:箱ひげ図
sns.boxplot(x='クラス', y='得点', data=df, ax=axes[0], palette='Set2')
axes[0].set_title('箱ひげ図', fontsize=14)
axes[0].grid(axis='y', alpha=0.3)

# 右:バイオリンプロット
sns.violinplot(x='クラス', y='得点', data=df, ax=axes[1], 
               palette='muted', inner='box')
axes[1].set_title('バイオリンプロット', fontsize=14)

plt.suptitle('クラス別得点分布の比較', fontsize=16, fontweight='bold')
plt.tight_layout()
plt.show()

※ 画面が小さい場合は、コードブロックを横にスクロールできます

🎯 このステップのまとめ

✅ 学んだこと

SeabornでMatplotlibより美しいグラフを簡単に作成

set_style()で5つのスタイルから選択

set_context()で用途に合わせたサイズに調整

set_palette()で美しいカラーパレットを設定

boxplot()で箱ひげ図を作成

violinplot()でバイオリンプロットを作成

heatmap()で相関行列を可視化

💡 次のステップに進む前に確認

以下のことができるようになったか確認しましょう:

□ Seabornのスタイルとパレットを設定できる

□ 箱ひげ図でデータの分布を可視化できる

□ バイオリンプロットを使い分けられる

□ ヒートマップで相関を表現できる

これらができたら、次のステップに進みましょう!

❓ よくある質問

Q1: SeabornとMatplotlibの違いは何ですか?

A: SeabornはMatplotlibをベースにしており、より美しく、簡単にグラフを作れます。統計的なグラフ(箱ひげ図など)が関数1つで作れるのが特徴です。

Q2: 箱ひげ図とバイオリンプロットはどちらを使えばいいですか?

A: 箱ひげ図はシンプルでわかりやすく、一般的な場面に適しています。バイオリンプロットは分布の形まで見たい場合に使います。

Q3: Seabornで日本語は使えますか?

A: はい、ステップ37で学んだ日本語フォント設定をすれば使えます。Seabornのスタイル設定と併用できます。

Q4: カラーパレットの選び方のコツは?

A: pastelは優しい印象、deepははっきりした印象、colorblindはアクセシビリティに配慮したい場合に使います。

Q5: ヒートマップの色が見づらいのですが?

A: cmapパラメータを変更してみてください。‘coolwarm’‘RdBu_r’‘viridis’などが見やすいです。

📝

学習メモ

Pythonデータ分析入門 - Step 40

📋 過去のメモ一覧
#artnasekai #学習メモ
LINE