STEP 32:スモールマルチプル(ファセット)

📊 STEP 32: スモールマルチプル(ファセット)

同じ形式のグラフを並べて、比較を容易にする手法をマスターしよう!

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

  • スモールマルチプルとは何か、なぜ便利なのか
  • 同じ軸・スケールで比較することの重要性
  • 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次元ファセット(行×列)

rowcolを両方指定すると、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_colfacet_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_rowfacet_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行あたりの列数を減らすと、各グラフが大きくなります。
📝

学習メモ

データ可視化マスター - Step 32

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