📋 このステップで学ぶこと
- スモールマルチプルとは何か、なぜ便利なのか
- 同じ軸・スケールで比較することの重要性
- Matplotlibでスモールマルチプルを作成する方法
- SeabornのFacetGridを使った効率的な作成方法
- Plotlyのfacet_col・facet_rowによるインタラクティブなファセット
- 店舗比較、A/Bテスト、カテゴリ分析などの実務活用例
📊 1. スモールマルチプルとは
スモールマルチプルの概要
スモールマルチプル(Small Multiples)とは、同じ形式の小さなグラフを複数並べて表示する手法です。ファセット(Facet)とも呼ばれます。
たとえば、5店舗の売上推移を比較したいとき、1つのグラフに5本の線を重ねると、線が交差して見づらくなります。スモールマルチプルなら、各店舗を個別のグラフにして並べることで、一目で比較できます。
💡 スモールマルチプルを身近な例で考えると
漫画の「コマ割り」を想像してください。1ページに複数のコマが並んでいて、それぞれが同じキャラクターの異なる場面を描いています。
スモールマルチプルも同じで、「同じ形式のグラフ」を「複数のカテゴリ」に分けて並べることで、全体の流れとそれぞれの特徴を同時に把握できます。
【スモールマルチプルのイメージ】
店舗別の売上推移を比較:
┌──────────┐ ┌──────────┐ ┌──────────┐
│ 東京店 │ │ 大阪店 │ │ 名古屋店 │
│ 📈 │ │ 📈 │ │ 📈 │
│ [グラフ] │ │ [グラフ] │ │ [グラフ] │
│ │ │ │ │ │
└──────────┘ └──────────┘ └──────────┘
ポイント:
✓ すべて同じ軸・スケール
✓ すべて同じグラフ形式(折れ線グラフ)
✓ 並べることで比較が容易
📊 スモールマルチプルの4つの利点
| 利点 |
説明 |
具体例 |
| 比較が容易 |
同じスケールで一目瞭然 |
どの店舗が最も売上が高いかすぐ分かる |
| パターン発見 |
共通点・相違点が見える |
全店舗で12月に売上が上がるパターンを発見 |
| 情報密度 |
多くの情報をコンパクトに |
6店舗×12ヶ月のデータを1画面で表示 |
| 視覚的美しさ |
整然とした配置 |
レポートやプレゼンで見栄えが良い |
💡 1つのグラフに詰め込む vs スモールマルチプル
| 方法 |
メリット |
デメリット |
適した場面 |
| 1つのグラフ |
直接比較しやすい |
線が交差して見づらい |
2〜3カテゴリの比較 |
| スモールマルチプル |
個別に見やすい |
直接の重なりは見えない |
4カテゴリ以上の比較 |
📏 2. 同じ軸・スケールの重要性
なぜスケールを揃えるのか
スモールマルチプルで最も重要なルールは、すべてのグラフのX軸・Y軸を統一することです。これにより、グラフの「見た目の高さ」が「実際の値の大きさ」を正確に反映します。
スケールがバラバラだと、見た目が同じ高さでも実際の値が異なり、誤った比較をしてしまう危険があります。
【悪い例:スケールがバラバラ】
┌──────────┐ ┌──────────┐ ┌──────────┐
│ 東京店 │ │ 大阪店 │ │ 名古屋店 │
│ Y軸: │ │ Y軸: │ │ Y軸: │
│ 0-1000 │ │ 0-500 │ │ 0-300 │
│ ████ │ │ ████ │ │ ████ │
└──────────┘ └──────────┘ └──────────┘
→ 見た目の棒の高さが同じでも、実際の値が異なる!
→ 東京店:800、大阪店:400、名古屋店:240 という意味
→ 誤解を招く
【良い例:スケールが統一】
┌──────────┐ ┌──────────┐ ┌──────────┐
│ 東京店 │ │ 大阪店 │ │ 名古屋店 │
│ Y軸: │ │ Y軸: │ │ Y軸: │
│ 0-1000 │ │ 0-1000 │ │ 0-1000 │
│ ████████ │ │ ████ │ │ ██ │
└──────────┘ └──────────┘ └──────────┘
→ グラフの高さが実際の値の差を正確に表現
→ 一目で「東京店が最も売上が高い」と分かる
Matplotlibでスケールを統一する方法
Matplotlibでスモールマルチプルを作成する基本的な方法を学びましょう。plt.subplots()のsharey=TrueオプションでY軸を統一できます。
# ライブラリを読み込む
import matplotlib.pyplot as plt
import numpy as np
import pandas as pd
📝 インポートの意味
| コード |
意味 |
なぜ必要か |
| import matplotlib.pyplot as plt |
Matplotlibをpltとして読み込み |
グラフ描画の基本ライブラリ |
| import numpy as np |
NumPyをnpとして読み込み |
乱数生成や数値計算に使用 |
| import pandas as pd |
Pandasをpdとして読み込み |
データフレームの操作に使用 |
# サンプルデータを作成
dates = pd.date_range(‘2024-01-01’, ‘2024-12-31′, freq=’M’) # 月次データ
店舗 = [‘東京店’, ‘大阪店’, ‘名古屋店’, ‘福岡店’]
# 各店舗の売上データを生成
data = []
for 店 in 店舗:
売上 = np.random.randint(200, 800, size=len(dates))
for i, d in enumerate(dates):
data.append({‘日付’: d, ‘店舗’: 店, ‘売上’: 売上[i]})
df = pd.DataFrame(data)
print(df.head())
コードが長いので、スマートフォンでは横スクロールして確認してください。
# =========================================
# 【実践】スモールマルチプル(2×2グリッド)
# =========================================
import matplotlib.pyplot as plt
import numpy as np
import pandas as pd
# データ作成
dates = pd.date_range(‘2024-01-01’, ‘2024-12-31′, freq=’M’)
店舗 = [‘東京店’, ‘大阪店’, ‘名古屋店’, ‘福岡店’]
data = []
for 店 in 店舗:
売上 = np.random.randint(200, 800, size=len(dates))
for i, d in enumerate(dates):
data.append({‘日付’: d, ‘店舗’: 店, ‘売上’: 売上[i]})
df = pd.DataFrame(data)
# 2×2のグリッドを作成
fig, axes = plt.subplots(2, 2, figsize=(14, 10), sharey=True)
axes = axes.flatten() # 2次元配列を1次元に変換
# 各店舗のグラフを描画
for i, 店 in enumerate(店舗):
店舗データ = df[df[‘店舗’] == 店]
axes[i].plot(店舗データ[‘日付’], 店舗データ[‘売上’], linewidth=2, color=’steelblue’)
axes[i].set_title(店, fontsize=14, fontweight=’bold’)
axes[i].set_xlabel(‘月’, fontsize=10)
axes[i].grid(True, alpha=0.3)
# Y軸ラベルは左列のみ
if i % 2 == 0:
axes[i].set_ylabel(‘売上(万円)’, fontsize=10)
plt.suptitle(‘店舗別売上推移(2024年)’, fontsize=18, fontweight=’bold’)
plt.tight_layout()
plt.show()
📝 コードの意味
| コード |
意味 |
なぜ必要か |
| plt.subplots(2, 2, …) |
2行×2列のグリッドを作成 |
4つのグラフを並べるため |
| sharey=True |
すべてのグラフでY軸を共有 |
正確な比較のためスケールを統一 |
| axes.flatten() |
2次元配列を1次元に変換 |
forループで簡単にアクセスするため |
| plt.suptitle() |
全体のタイトルを設定 |
グラフ全体の説明を追加 |
🎨 3. SeabornのFacetGrid
FacetGridとは
SeabornのFacetGridは、スモールマルチプルをより簡単に、より美しく作成できるツールです。Matplotlibのsubplotsよりも少ないコードで、洗練されたグラフが作れます。
FacetGridは「データフレームのカテゴリ列」を指定するだけで、自動的にグラフを分割してくれます。
📝 FacetGridの基本的な流れ
| ステップ |
コード |
説明 |
| 1. グリッド作成 |
g = sns.FacetGrid(df, col=’カテゴリ’) |
どの列で分割するか指定 |
| 2. グラフ描画 |
g.map(sns.lineplot, ‘x’, ‘y’) |
どんなグラフをどの列で描くか指定 |
| 3. 装飾 |
g.set_axis_labels(‘X軸’, ‘Y軸’) |
軸ラベルやタイトルを追加 |
コードが長いので、スマートフォンでは横スクロールして確認してください。
# =========================================
# 【実践】SeabornのFacetGrid
# =========================================
import seaborn as sns
import matplotlib.pyplot as plt
import pandas as pd
import numpy as np
# サンプルデータ作成
dates = pd.date_range(‘2024-01-01′, periods=12, freq=’M’)
店舗 = [‘東京店’, ‘大阪店’, ‘名古屋店’, ‘福岡店’, ‘札幌店’, ‘仙台店’]
data = []
for 店 in 店舗:
売上 = np.random.randint(200, 800, size=len(dates)) + np.random.randn(len(dates)) * 50
for i, d in enumerate(dates):
data.append({‘月’: d.month, ‘店舗’: 店, ‘売上’: 売上[i]})
df = pd.DataFrame(data)
# FacetGrid作成
g = sns.FacetGrid(
df,
col=’店舗’, # 「店舗」列で分割
col_wrap=3, # 3列で折り返し
height=3, # 各グラフの高さ
sharey=True # Y軸を統一
)
# グラフを描画
g.map(sns.lineplot, ‘月’, ‘売上’, color=’steelblue’, linewidth=2)
# タイトル追加
g.fig.suptitle(‘店舗別月次売上推移’, fontsize=16, fontweight=’bold’, y=1.02)
# 軸ラベル
g.set_axis_labels(‘月’, ‘売上(万円)’)
plt.tight_layout()
plt.show()
📝 FacetGridの主要パラメータ
| パラメータ |
意味 |
設定例 |
| col |
列方向に分割する列名 |
col=’店舗’ |
| row |
行方向に分割する列名 |
row=’地域’ |
| col_wrap |
何列で折り返すか |
col_wrap=3(3列で折り返し) |
| height |
各グラフの高さ(インチ) |
height=3 |
| aspect |
幅÷高さの比率 |
aspect=1.2(横長) |
| sharey |
Y軸を統一するか |
sharey=True |
2次元ファセット(行×列)
rowとcolを両方指定すると、2次元のグリッドでファセットを作成できます。これにより、2つのカテゴリの組み合わせを同時に比較できます。
コードが長いので、スマートフォンでは横スクロールして確認してください。
# =========================================
# 【実践】2次元ファセット(地域×カテゴリ)
# =========================================
import seaborn as sns
import matplotlib.pyplot as plt
import pandas as pd
import numpy as np
# 商品カテゴリ別・地域別のデータ
カテゴリ = [‘電化製品’, ‘衣料品’, ‘食品’]
地域 = [‘東日本’, ‘西日本’]
data = []
for cat in カテゴリ:
for 地 in 地域:
for month in range(1, 13):
売上 = np.random.randint(100, 500) + (month * 10)
data.append({‘月’: month, ‘カテゴリ’: cat, ‘地域’: 地, ‘売上’: 売上})
df = pd.DataFrame(data)
# 2次元ファセット(行=地域、列=カテゴリ)
g = sns.FacetGrid(
df,
row=’地域’, # 行方向に地域で分割
col=’カテゴリ’, # 列方向にカテゴリで分割
height=3,
aspect=1.2,
sharey=True
)
# 棒グラフを描画
g.map(sns.barplot, ‘月’, ‘売上’, color=’coral’, errorbar=None)
# タイトル
g.fig.suptitle(‘カテゴリ×地域別 月次売上’, fontsize=16, fontweight=’bold’, y=1.02)
# 軸ラベル
g.set_axis_labels(‘月’, ‘売上(万円)’)
plt.tight_layout()
plt.show()
【2次元ファセットの構造】
電化製品 衣料品 食品
┌──────────┐ ┌──────────┐ ┌──────────┐
東日本 │ [グラフ]│ │ [グラフ]│ │ [グラフ]│
└──────────┘ └──────────┘ └──────────┘
┌──────────┐ ┌──────────┐ ┌──────────┐
西日本 │ [グラフ]│ │ [グラフ]│ │ [グラフ]│
└──────────┘ └──────────┘ └──────────┘
→ 行方向(row)で「地域」を分割
→ 列方向(col)で「カテゴリ」を分割
→ 6つのグラフで地域×カテゴリの組み合わせを全て表示
⚡ 4. Plotlyのファセット機能
Plotly Expressのfacet_colとfacet_row
Plotly Expressには、facet_colとfacet_rowというパラメータがあり、1行のコードでファセットを作成できます。さらに、Plotlyならではのインタラクティブ機能(ホバー、ズームなど)も使えます。
📝 Plotlyのファセットパラメータ
| パラメータ |
意味 |
SeabornのFacetGridとの対応 |
| facet_col |
列方向に分割 |
col=’カテゴリ’ |
| facet_row |
行方向に分割 |
row=’地域’ |
| facet_col_wrap |
何列で折り返すか |
col_wrap=3 |
コードが長いので、スマートフォンでは横スクロールして確認してください。
# =========================================
# 【実践】Plotlyのファセットグラフ
# =========================================
import plotly.express as px
import pandas as pd
import numpy as np
# データ作成
dates = pd.date_range(‘2024-01-01′, periods=12, freq=’M’)
店舗 = [‘東京店’, ‘大阪店’, ‘名古屋店’, ‘福岡店’]
data = []
for 店 in 店舗:
売上 = np.random.randint(300, 700, size=len(dates))
for i, d in enumerate(dates):
data.append({‘日付’: d, ‘店舗’: 店, ‘売上’: 売上[i]})
df = pd.DataFrame(data)
# ファセットグラフ作成(1行で完成!)
fig = px.line(
df,
x=’日付’,
y=’売上’,
facet_col=’店舗’, # 「店舗」列で分割
facet_col_wrap=2, # 2列で折り返し
title=’店舗別売上推移’,
labels={‘売上’: ‘売上(万円)’}
)
# Y軸を統一
fig.update_yaxes(matches=’y’)
# レイアウト調整
fig.update_layout(
height=600,
showlegend=False
)
fig.show()
⚠️ 重要:Y軸の統一を忘れずに
Plotlyでは、デフォルトでY軸が統一されません。必ずfig.update_yaxes(matches=’y’)を追加して、すべてのグラフのY軸を揃えてください。
2次元ファセット(Plotly版)
Plotlyでもfacet_rowとfacet_colを同時に指定することで、2次元のファセットを作成できます。
コードが長いので、スマートフォンでは横スクロールして確認してください。
# =========================================
# 【実践】Plotlyの2次元ファセット
# =========================================
import plotly.express as px
import pandas as pd
import numpy as np
# 商品×地域のデータ
商品 = [‘商品A’, ‘商品B’, ‘商品C’]
地域 = [‘東日本’, ‘西日本’]
data = []
for 品 in 商品:
for 地 in 地域:
for month in range(1, 13):
売上 = np.random.randint(100, 500)
data.append({‘月’: month, ‘商品’: 品, ‘地域’: 地, ‘売上’: 売上})
df = pd.DataFrame(data)
# 2次元ファセット
fig = px.bar(
df,
x=’月’,
y=’売上’,
facet_row=’地域’, # 行方向に地域で分割
facet_col=’商品’, # 列方向に商品で分割
title=’商品×地域別 月次売上’,
labels={‘売上’: ‘売上(万円)’, ‘月’: ‘月’},
color_discrete_sequence=[‘coral’]
)
# Y軸統一
fig.update_yaxes(matches=’y’)
fig.update_layout(height=600)
fig.show()
ヒストグラムでファセット(分布の比較)
折れ線グラフや棒グラフだけでなく、ヒストグラムでもファセットを作成できます。これにより、各カテゴリのデータ分布を比較できます。
コードが長いので、スマートフォンでは横スクロールして確認してください。
# =========================================
# 【実践】ヒストグラムでファセット
# =========================================
import plotly.express as px
import pandas as pd
import numpy as np
# 各店舗の日次売上データ(分布の比較用)
店舗 = [‘東京店’, ‘大阪店’, ‘名古屋店’, ‘福岡店’, ‘札幌店’, ‘仙台店’]
data = []
for 店 in 店舗:
日次売上 = np.random.normal(loc=400, scale=100, size=30) # 30日分
for 売上 in 日次売上:
data.append({‘店舗’: 店, ‘日次売上’: 売上})
df = pd.DataFrame(data)
# ヒストグラムでファセット
fig = px.histogram(
df,
x=’日次売上’,
facet_col=’店舗’,
facet_col_wrap=3, # 3列で折り返し
nbins=15,
title=’店舗別 日次売上分布’,
labels={‘日次売上’: ‘売上(万円)’, ‘count’: ‘日数’},
color_discrete_sequence=[‘steelblue’]
)
fig.update_yaxes(matches=’y’)
fig.update_layout(
height=600,
showlegend=False
)
fig.show()
💼 5. 実務での活用例
例1: 店舗別KPI比較ダッシュボード
複数店舗の売上推移を同時に比較することで、どの店舗が好調か、どの店舗に問題があるかを一目で把握できます。
コードが長いので、スマートフォンでは横スクロールして確認してください。
# =========================================
# 【実践】店舗別KPI比較ダッシュボード
# =========================================
import plotly.express as px
import pandas as pd
import numpy as np
# 各店舗の月次KPI
店舗 = [‘東京店’, ‘大阪店’, ‘名古屋店’, ‘福岡店’]
月 = list(range(1, 13))
data = []
for 店 in 店舗:
for m in 月:
売上 = np.random.randint(300, 700)
data.append({‘月’: m, ‘店舗’: 店, ‘売上’: 売上})
df = pd.DataFrame(data)
# 売上のファセット
fig = px.line(
df,
x=’月’,
y=’売上’,
facet_col=’店舗’,
facet_col_wrap=2,
title=’📊 店舗別 月次売上推移’,
labels={‘売上’: ‘売上(万円)’},
markers=True # マーカーを表示
)
fig.update_yaxes(matches=’y’)
fig.update_traces(line=dict(width=3, color=’#3498DB’))
fig.update_layout(
height=500,
showlegend=False,
font=dict(size=12)
)
fig.show()
例2: 商品カテゴリ×時間帯の売上分析
飲食店などでは、「どの商品カテゴリが、どの時間帯に売れるか」を分析することで、効率的な仕入れやスタッフ配置が可能になります。
コードが長いので、スマートフォンでは横スクロールして確認してください。
# =========================================
# 【実践】商品カテゴリ×時間帯の売上分析
# =========================================
import plotly.express as px
import pandas as pd
import numpy as np
# カテゴリ×時間帯のデータ
カテゴリ = [‘朝食’, ‘昼食’, ‘夕食’, ‘デザート’]
時間帯 = list(range(6, 23)) # 6時~22時
data = []
for cat in カテゴリ:
for 時 in 時間帯:
# 時間帯によって売上が変動するリアルなデータ
if cat == ‘朝食’ and 6 <= 時 <= 9:
売上 = np.random.randint(80, 150)
elif cat == '昼食' and 11 <= 時 <= 14:
売上 = np.random.randint(150, 300)
elif cat == '夕食' and 18 <= 時 <= 21:
売上 = np.random.randint(200, 400)
elif cat == 'デザート' and 14 <= 時 <= 20:
売上 = np.random.randint(50, 120)
else:
売上 = np.random.randint(10, 50)
data.append({'時間帯': 時, 'カテゴリ': cat, '売上': 売上})
df = pd.DataFrame(data)
# エリアチャートでファセット
fig = px.area(
df,
x='時間帯',
y='売上',
facet_col='カテゴリ',
facet_col_wrap=2,
title='🍔 商品カテゴリ別 時間帯別売上',
labels={'売上': '売上(万円)', '時間帯': '時刻'},
color_discrete_sequence=['coral']
)
fig.update_yaxes(matches='y')
fig.update_layout(
height=500,
showlegend=False
)
fig.show()
【このグラフから読み取れること】
・朝食: 6〜9時にピーク(通勤・通学時間帯)
・昼食: 11〜14時にピーク(お昼休み)
・夕食: 18〜21時にピーク(退勤後)
・デザート: 14〜20時に分散(午後のおやつ〜夕食後)
→ 時間帯ごとの仕入れ量や人員配置の最適化に活用!
例3: A/Bテスト結果の比較
WebサイトのA/Bテストでは、複数の指標(CVR、クリック率、離脱率など)を同時に比較する必要があります。スモールマルチプルなら、各指標の違いを一目で把握できます。
コードが長いので、スマートフォンでは横スクロールして確認してください。
# =========================================
# 【実践】A/Bテスト結果の比較
# =========================================
import plotly.express as px
import pandas as pd
import numpy as np
# A/Bテストのデータ(複数の指標)
パターン = [‘パターンA’, ‘パターンB’]
指標 = [‘CVR’, ‘クリック率’, ‘離脱率’, ‘滞在時間’]
data = []
for パ in パターン:
for 指 in 指標:
# 30日分のデータ
for day in range(1, 31):
if 指 == ‘CVR’:
値 = np.random.normal(3.0 if パ == ‘パターンB’ else 2.5, 0.5)
elif 指 == ‘クリック率’:
値 = np.random.normal(12.0 if パ == ‘パターンB’ else 10.0, 2.0)
elif 指 == ‘離脱率’:
値 = np.random.normal(25.0 if パ == ‘パターンA’ else 20.0, 3.0)
else: # 滞在時間
値 = np.random.normal(180 if パ == ‘パターンB’ else 150, 20)
data.append({‘日’: day, ‘パターン’: パ, ‘指標’: 指, ‘値’: 値})
df = pd.DataFrame(data)
# パターン別・指標別のファセット
fig = px.box(
df,
x=’パターン’,
y=’値’,
facet_col=’指標’,
facet_col_wrap=2,
title=’📈 A/Bテスト結果比較(30日間)’,
labels={‘値’: ‘値’, ‘パターン’: ”},
color=’パターン’,
color_discrete_sequence=[‘#3498DB’, ‘#E74C3C’]
)
fig.update_layout(
height=600,
showlegend=True
)
fig.show()
【A/Bテスト結果の読み方】
・CVR: パターンBの方が高い → 改善効果あり
・クリック率: パターンBの方が高い → 改善効果あり
・離脱率: パターンBの方が低い → 改善効果あり
・滞在時間: パターンBの方が長い → 改善効果あり
→ すべての指標でパターンBが優れている
→ パターンBを本番採用する判断材料に!
📝 STEP 32 のまとめ
✅ このステップで学んだこと
| トピック |
重要ポイント |
| スモールマルチプル |
同じ形式のグラフを並べて比較を容易に |
| 軸の統一 |
sharey=True、matches=’y’で正確な比較 |
| Matplotlib |
plt.subplots()でグリッドを作成 |
| Seaborn FacetGrid |
col、row、col_wrapで簡単にファセット作成 |
| Plotly facet |
facet_col、facet_rowでインタラクティブに |
| 実務活用 |
店舗比較、A/Bテスト、カテゴリ分析 |
💡 最重要ポイント
スモールマルチプルは、複数のカテゴリや条件を同じスケールで比較するのに最適な手法です。
1つのグラフに詰め込むよりも、個別に分けて並べることで、パターンや相違点が明確になります。
SeabornのFacetGridやPlotlyのfacet_col/rowを使えば、少ないコードで美しいスモールマルチプルが作成できます!
📝 実践演習
演習 1
基礎
3つの店舗(東京店、大阪店、名古屋店)の売上推移をPlotlyのファセットで表示してください。
【解答コード】
import plotly.express as px
import pandas as pd
import numpy as np
# データ作成
dates = pd.date_range(‘2024-01-01′, periods=12, freq=’M’)
店舗 = [‘東京店’, ‘大阪店’, ‘名古屋店’]
data = []
for 店 in 店舗:
売上 = np.random.randint(300, 600, size=12)
for i, d in enumerate(dates):
data.append({‘日付’: d, ‘店舗’: 店, ‘売上’: 売上[i]})
df = pd.DataFrame(data)
# ファセットグラフ
fig = px.line(df, x=’日付’, y=’売上’, facet_col=’店舗’,
title=’店舗別売上推移’)
fig.update_yaxes(matches=’y’)
fig.show()
ポイント:facet_col=’店舗’で店舗ごとに分割し、update_yaxes(matches=’y’)でY軸を統一します。
演習 2
応用
SeabornのFacetGridを使って、4つの商品カテゴリの月次売上をグリッド表示してください(2列で折り返し)。
【解答コード】
import seaborn as sns
import matplotlib.pyplot as plt
import pandas as pd
import numpy as np
カテゴリ = [‘電化製品’, ‘衣料品’, ‘食品’, ‘雑貨’]
data = []
for cat in カテゴリ:
for month in range(1, 13):
売上 = np.random.randint(200, 600)
data.append({‘月’: month, ‘カテゴリ’: cat, ‘売上’: 売上})
df = pd.DataFrame(data)
g = sns.FacetGrid(df, col=’カテゴリ’, col_wrap=2, height=3, sharey=True)
g.map(sns.lineplot, ‘月’, ‘売上’, color=’steelblue’)
g.set_axis_labels(‘月’, ‘売上(万円)’)
plt.show()
ポイント:col_wrap=2で2列に折り返し、sharey=TrueでY軸を統一します。
演習 3
発展
2次元ファセット(地域×商品)で売上を比較してください。行に地域、列に商品を配置し、Plotlyを使用してください。
【解答コード】
import plotly.express as px
import pandas as pd
import numpy as np
地域 = [‘東日本’, ‘西日本’]
商品 = [‘商品A’, ‘商品B’, ‘商品C’]
data = []
for 地 in 地域:
for 品 in 商品:
for month in range(1, 13):
売上 = np.random.randint(150, 500)
data.append({‘月’: month, ‘地域’: 地, ‘商品’: 品, ‘売上’: 売上})
df = pd.DataFrame(data)
fig = px.line(df, x=’月’, y=’売上’,
facet_row=’地域’, facet_col=’商品’,
title=’地域×商品別 売上比較’)
fig.update_yaxes(matches=’y’)
fig.show()
ポイント:facet_row=’地域’で行方向に、facet_col=’商品’で列方向に分割します。
❓ よくある質問
Q1: スモールマルチプルはいくつまで並べられますか?
6〜12個が目安です。それ以上になると、個々のグラフが小さくなりすぎて見づらくなります。多い場合は、ページを分割する、インタラクティブなフィルター機能を追加する、重要なカテゴリのみに絞る、などの工夫が必要です。
Q2: Y軸は必ず統一すべきですか?
基本的には統一すべきです。Y軸を統一することで、グラフの高さが実際の値の差を正確に反映します。ただし、値の範囲が大きく異なる場合(例: 1店舗だけ売上が10倍)は、個別のスケールも検討できます。その場合は「スケールが異なる」ことを必ず明記してください。
Q3: スモールマルチプルと1つのグラフ、どちらを使うべきですか?
比較するカテゴリ数で判断します。2〜3個なら1つのグラフ(色分けで比較)、4個以上ならスモールマルチプルが見やすいです。また、系列が交差する場合やトレンドの形を比較したい場合は、スモールマルチプルが最適です。
Q4: SeabornとPlotly、どちらを使うべきですか?
用途で使い分けましょう。静的なレポートや論文にはSeabornが適しています。インタラクティブなダッシュボードやWebページにはPlotlyが便利です。Plotlyならホバーで値を確認したり、ズームしたりできます。
Q5: ファセットのグラフが小さすぎます。どうすればいいですか?
heightやwidthを調整してください。SeabornのFacetGridならheightパラメータ、Plotlyならheightパラメータを大きくします。また、col_wrapやfacet_col_wrapで1行あたりの列数を減らすと、各グラフが大きくなります。
artnasekai
#artnasekai #学習メモ