⚖️ STEP 51: 実践プロジェクト3 – 顧客分析ダッシュボード(両ツール比較)
同じデータを両ツールで実装し、違いを体感しよう!
📋 プロジェクト概要
| テーマ | 顧客セグメント分析ダッシュボード |
| ツール | Tableau & Power BI(両方で同じものを作成) |
| データ | 顧客マスタ + 購買履歴データ |
| 目的 | 両ツールの実践的な比較と特性理解 |
| 所要時間 | 6時間(各ツール3時間) |
ゴール:同じダッシュボードを両ツールで作成し、開発体験を通じて最適なツール選択ができるようになる
🎯 1. プロジェクトの目的
なぜ両ツールで同じダッシュボードを作るのか
同じデータで同じダッシュボードを両ツールで作成することで、実践的な違いを体験できます。理論だけでなく、実際の開発体験を通じて、どちらのツールが自分やプロジェクトに合っているかを判断できます。
| 比較項目 | 評価基準 | なぜ重要か |
|---|---|---|
| 開発スピード | 同じ機能を実装するのにかかる時間 | プロジェクトの納期とコストに直結 |
| 操作性 | 直感的に操作できるか | 学習コストと日常の生産性 |
| パフォーマンス | ダッシュボードの表示速度 | ユーザー体験と利用率 |
| ビジュアル品質 | 見た目の美しさ・洗練度 | 経営層への説得力 |
| 機能性 | 計算能力・分析機能の豊富さ | 複雑な分析への対応力 |
| 保守性 | 変更・更新のしやすさ | 長期運用コスト |
📊 2. ダッシュボード要件
共通仕様
両ツールで全く同じ機能を持つダッシュボードを作成します。顧客分析の代表的な手法を網羅した本格的なダッシュボードです。
| ビジュアル | 分析手法 | 目的 | 表示形式 |
|---|---|---|---|
| RFM分析 | Recency, Frequency, Monetary | 顧客をスコアで分類 | ヒートマップ |
| LTV分析 | 顧客生涯価値 | セグメント別の価値比較 | 横棒グラフ |
| 購買パターン | 曜日×時間帯分析 | 購買タイミングの把握 | ヒートマップ |
| コホート分析 | 月次リテンション | 顧客維持率の追跡 | 色分けヒートマップ |
| 顧客推移 | 新規/既存/復帰/離脱 | 顧客基盤の健全性 | 積み上げ面グラフ |
【RFM分析とは】 顧客を3つの指標でスコアリングし、セグメント分類する手法 ┌─────────────┬──────────────────────────────────────────────────┐ │ 指標 │ 説明 │ ├─────────────┼──────────────────────────────────────────────────┤ │ R: Recency │ 最終購買日からの経過日数(最近買ったか) │ │ F: Frequency│ 購買回数(何回買ったか) │ │ M: Monetary │ 購買金額合計(いくら使ったか) │ └─────────────┴──────────────────────────────────────────────────┘ 【スコアリング例(1-3の3段階)】 R_Score: ├─ 3: 30日以内(最近購買) ├─ 2: 31-90日 └─ 1: 91日以上(休眠気味) F_Score: ├─ 3: 10回以上(常連) ├─ 2: 5-9回 └─ 1: 4回以下(新規/非アクティブ) M_Score: ├─ 3: 10万円以上(高額顧客) ├─ 2: 5-10万円 └─ 1: 5万円未満 【セグメント例】 RFMスコア → セグメント名 ├─ 333 → VIP顧客(最重要、特別対応) ├─ 311 → 新規優良(育成候補) ├─ 133 → 休眠優良(呼び戻し対象) ├─ 111 → 離脱リスク(再活性化) └─ その他 → 一般顧客
【顧客テーブル: customers.csv】
┌────────────────────────────────────────────────────────────────┐
│ 顧客ID │ 顧客名 │ 登録日 │ 性別 │ 年代 │ 地域 │
├────────────────────────────────────────────────────────────────┤
│ C001 │ 田中太郎 │ 2022-01-15 │ 男 │ 30代 │ 東京 │
│ C002 │ 鈴木花子 │ 2022-03-20 │ 女 │ 40代 │ 大阪 │
│ C003 │ 佐藤次郎 │ 2023-05-10 │ 男 │ 20代 │ 福岡 │
└────────────────────────────────────────────────────────────────┘
データ量: 約5,000人
【購買テーブル: purchases.csv】
┌────────────────────────────────────────────────────────────────┐
│ 注文ID │ 顧客ID │ 注文日時 │ 商品カテゴリ │ 売上金額 │
├────────────────────────────────────────────────────────────────┤
│ P001 │ C001 │ 2024-01-15 10:30 │ 電化製品 │ 45,000 │
│ P002 │ C001 │ 2024-02-20 14:15 │ 家具 │ 32,000 │
│ P003 │ C002 │ 2024-01-18 09:45 │ 文房具 │ 8,500 │
└────────────────────────────────────────────────────────────────┘
データ量: 約50,000件(2年分)
【リレーションシップ】
┌───────────┐ ┌───────────┐
│ customers │────│ purchases │
│ (顧客) │ 1:n │ (購買) │
└───────────┘ └───────────┘
顧客ID で結合
🔵 3. Tableau実装
Tableauでの開発手順
まずTableauでRFM分析ダッシュボードを作成します。LOD表現を活用して、顧客単位の集計を行います。
【Step 1: Recency(最終購買からの日数)】
名前: Recency
計算式:
DATEDIFF('day',
{ FIXED [顧客ID] : MAX([注文日]) },
TODAY()
)
解説:
├─ { FIXED [顧客ID] : MAX([注文日]) }
│ └─ 各顧客の最終購買日を取得(LOD表現)
├─ DATEDIFF('day', ..., TODAY())
│ └─ 今日との日数差を計算
└─ 結果: 顧客ごとの「最終購買からの経過日数」
─────────────────────────────
【Step 2: Frequency(購買回数)】
名前: Frequency
計算式:
{ FIXED [顧客ID] : COUNTD([注文ID]) }
解説:
├─ COUNTD([注文ID]): 注文IDのユニーク数
├─ FIXED [顧客ID]: 顧客単位で集計
└─ 結果: 顧客ごとの「総購買回数」
─────────────────────────────
【Step 3: Monetary(購買金額合計)】
名前: Monetary
計算式:
{ FIXED [顧客ID] : SUM([売上金額]) }
解説:
├─ SUM([売上金額]): 売上金額の合計
├─ FIXED [顧客ID]: 顧客単位で集計
└─ 結果: 顧客ごとの「累計購買金額」
─────────────────────────────
【Step 4: RFMスコア計算(各1-3)】
名前: R_Score
計算式:
IF [Recency] <= 30 THEN 3
ELSEIF [Recency] <= 90 THEN 2
ELSE 1
END
名前: F_Score
計算式:
IF [Frequency] >= 10 THEN 3
ELSEIF [Frequency] >= 5 THEN 2
ELSE 1
END
名前: M_Score
計算式:
IF [Monetary] >= 100000 THEN 3
ELSEIF [Monetary] >= 50000 THEN 2
ELSE 1
END
─────────────────────────────
【Step 5: RFMセグメント】
名前: RFM_Segment
計算式:
STR([R_Score]) + STR([F_Score]) + STR([M_Score])
結果例: "333", "211", "132" など
─────────────────────────────
【Step 6: セグメント名】
名前: Segment_Name
計算式:
IF [RFM_Segment] = "333" THEN "VIP顧客"
ELSEIF LEFT([RFM_Segment], 1) = "3" AND
RIGHT([RFM_Segment], 1) = "1" THEN "新規優良"
ELSEIF LEFT([RFM_Segment], 1) = "1" AND
RIGHT([RFM_Segment], 1) = "3" THEN "休眠優良"
ELSEIF [RFM_Segment] = "111" THEN "離脱リスク"
ELSE "一般顧客"
END
【Step 1: 新しいワークシート作成】
名前: "RFM_ヒートマップ"
【Step 2: ディメンション・メジャー配置】
行: R_Score(離散に変更)
列: F_Score(離散に変更)
マーク: 四角
設定:
├─ 色: COUNTD([顧客ID])
├─ サイズ: COUNTD([顧客ID])
└─ ラベル: COUNTD([顧客ID])
【Step 3: 色の設定】
色の編集:
├─ パレット: 青から赤(または順次)
├─ ステップカラー: 5段階
└─ 濃い色 = 顧客数が多い
R=3 ┌────┬────┬────┐
(最近)│ 50 │ 80 │120 │
├────┼────┼────┤
R=2 │ 30 │ 45 │ 60 │
├────┼────┼────┤
R=1 │ 15 │ 20 │ 25 │
(休眠)└────┴────┴────┘
F=1 F=2 F=3
(少) (多)
【Step 4: ツールチップ設定】
ツールチップ編集:
┌─────────────────────────────┐
│ RFMセグメント │
│ R_Score: │
│ F_Score: │
│ 顧客数: │
│ 売上合計: │
└─────────────────────────────┘
【Step 5: タイトルと装飾】
タイトル: "RFM分析 - 顧客セグメント分布"
軸ラベル:
├─ 行: "Recency(最近度)"
└─ 列: "Frequency(頻度)"
開発所要時間: 約30分
【コホート分析の計算フィールド】
// 1. 初回購買月(顧客のコホート)
名前: 初回購買月
計算式:
DATETRUNC('month',
{ FIXED [顧客ID] : MIN([注文日]) }
)
// 2. 経過月数
名前: 経過月数
計算式:
DATEDIFF('month', [初回購買月], DATETRUNC('month', [注文日]))
// 3. コホートサイズ(初月の顧客数)
名前: コホートサイズ
計算式:
{ FIXED [初回購買月] : COUNTD([顧客ID]) }
// 4. リテンション率
名前: リテンション率
計算式:
COUNTD([顧客ID]) / [コホートサイズ]
【ヒートマップ設定】
行: 初回購買月(月単位)
列: 経過月数
マーク: 四角
色: AVG(リテンション率)
ラベル: AVG(リテンション率) ※パーセント表示
色設定:
├─ 100%: 濃い緑
├─ 50%: 黄色
└─ 0%: 赤
完成イメージ:
0月 1月 2月 3月 4月
2023/01 100% 45% 38% 32% 28%
2023/02 100% 48% 40% 35% --
2023/03 100% 42% 36% -- --
🟠 4. Power BI実装
Power BIでの開発手順
次にPower BIで同じダッシュボードを作成します。DAXを使って計算列とメジャーを作成します。
【Step 1: 集計テーブルの作成(推奨)】
顧客RFM =
SUMMARIZE(
購買,
顧客[顧客ID],
顧客[顧客名],
"Recency", DATEDIFF(MAX(購買[注文日]), TODAY(), DAY),
"Frequency", DISTINCTCOUNT(購買[注文ID]),
"Monetary", SUM(購買[売上金額])
)
解説:
├─ SUMMARIZE: グループ化してテーブル作成
├─ 顧客IDごとに集計
└─ 新しいテーブルとしてモデルに追加
【Step 2: 計算列の追加(顧客RFMテーブルに)】
// R_Score
R_Score =
SWITCH(
TRUE(),
顧客RFM[Recency] <= 30, 3,
顧客RFM[Recency] <= 90, 2,
1
)
// F_Score
F_Score =
SWITCH(
TRUE(),
顧客RFM[Frequency] >= 10, 3,
顧客RFM[Frequency] >= 5, 2,
1
)
// M_Score
M_Score =
SWITCH(
TRUE(),
顧客RFM[Monetary] >= 100000, 3,
顧客RFM[Monetary] >= 50000, 2,
1
)
─────────────────────────────
【Step 3: RFMセグメントとセグメント名】
// RFMセグメント
RFM_Segment =
顧客RFM[R_Score] & 顧客RFM[F_Score] & 顧客RFM[M_Score]
// セグメント名
Segment_Name =
SWITCH(
TRUE(),
顧客RFM[RFM_Segment] = "333", "VIP顧客",
LEFT(顧客RFM[RFM_Segment], 1) = "3" &&
RIGHT(顧客RFM[RFM_Segment], 1) = "1", "新規優良",
LEFT(顧客RFM[RFM_Segment], 1) = "1" &&
RIGHT(顧客RFM[RFM_Segment], 1) = "3", "休眠優良",
顧客RFM[RFM_Segment] = "111", "離脱リスク",
"一般顧客"
)
【Step 1: マトリックスビジュアル選択】 ビジュアライゼーション > マトリックス 【Step 2: フィールド配置】 行: 顧客RFM[R_Score] 列: 顧客RFM[F_Score] 値: 顧客数メジャー(下記作成) // 顧客数メジャー 顧客数 = COUNTROWS(顧客RFM) 【Step 3: 条件付き書式(背景色)】 1. 値フィールドの「...」をクリック 2. 「条件付き書式」>「背景色」 3. 設定: ├─ 書式設定スタイル: カラースケール ├─ 最小値の色: 白 (#FFFFFF) ├─ 最大値の色: 濃い青 (#1565C0) └─ 中間値: 自動 【Step 4: テーブルデザイン調整】 書式設定: ├─ グリッド線: オフ ├─ 行ヘッダー: 太字、左寄せ ├─ 列ヘッダー: 太字、中央寄せ ├─ 値: 中央寄せ ├─ セルパディング: 10px └─ フォントサイズ: 12pt 【Step 5: タイトル設定】 タイトル: "RFM分析 - 顧客セグメント分布" サブタイトル: "R: 最近度、F: 頻度" 開発所要時間: 約25分
【コホート分析のDAXメジャー】
// 1. 初回購買月(計算列として顧客テーブルに追加)
初回購買月 =
CALCULATE(
MIN(購買[注文日]),
ALLEXCEPT(顧客, 顧客[顧客ID])
)
// 2. コホートサイズ
コホートサイズ =
VAR CurrentCohort = SELECTEDVALUE(顧客[初回購買月])
RETURN
CALCULATE(
DISTINCTCOUNT(顧客[顧客ID]),
ALL(購買),
顧客[初回購買月] = CurrentCohort
)
// 3. リテンション率
リテンション率 =
VAR CurrentCustomers = DISTINCTCOUNT(顧客[顧客ID])
VAR CohortSize = [コホートサイズ]
RETURN
DIVIDE(CurrentCustomers, CohortSize, 0)
【マトリックスビジュアル設定】
行: 顧客[初回購買月](月単位)
列: 購買[経過月数](別途計算列作成)
値: [リテンション率]
条件付き書式:
├─ 100%: 緑 (#4CAF50)
├─ 50%: 黄色 (#FFEB3B)
└─ 0%: 赤 (#F44336)
⚖️ 5. 両ツール比較結果
開発スピード比較
同じダッシュボードを両ツールで作成した結果、以下のような時間差が出ました。
| タスク | Tableau | Power BI | 勝者と理由 |
|---|---|---|---|
| データ接続 | 5分 | 8分 | 🔵 Tableau(UI直感的) |
| 計算フィールド作成 | 30分 | 25分 | 🟠 Power BI(DAX効率的) |
| ビジュアル作成 | 45分 | 50分 | 🔵 Tableau(ドラッグ&ドロップ) |
| ダッシュボード統合 | 20分 | 25分 | 🔵 Tableau(コンテナ直感的) |
| 調整・仕上げ | 30分 | 35分 | 🔵 Tableau(書式設定容易) |
| 合計 | 2時間10分 | 2時間23分 | 🔵 Tableau(13分短縮) |
| 評価項目 | Tableau | Power BI | 総合評価 |
|---|---|---|---|
| 操作性 | ⭐⭐⭐⭐⭐ 直感的、学習しやすい |
⭐⭐⭐⭐ 慣れが必要 |
🔵 Tableau優位 |
| ビジュアル美しさ | ⭐⭐⭐⭐⭐ 洗練されたデザイン |
⭐⭐⭐⭐ 標準的だが実用的 |
🔵 Tableau優位 |
| 計算能力 | ⭐⭐⭐⭐ LOD表現強力 |
⭐⭐⭐⭐⭐ DAX超強力 |
🟠 Power BI優位 |
| パフォーマンス | ⭐⭐⭐⭐ 3.2秒(10万行) |
⭐⭐⭐⭐⭐ 2.8秒(10万行) |
🟠 Power BI優位 |
| 共有・連携 | ⭐⭐⭐⭐ Tableau Server |
⭐⭐⭐⭐⭐ Teams/M365連携 |
🟠 Power BI優位 |
| モバイル対応 | ⭐⭐⭐⭐ 良好 |
⭐⭐⭐⭐⭐ 非常に優秀 |
🟠 Power BI優位 |
| こんな場合は… | おすすめツール | 理由 |
|---|---|---|
| 経営層向けプレゼン | 🔵 Tableau | ビジュアルの美しさが説得力に |
| Microsoft環境が中心 | 🟠 Power BI | Teams/Excel連携がスムーズ |
| 探索的データ分析 | 🔵 Tableau | ドラッグ&ドロップで試行錯誤 |
| 複雑な計算が必要 | 🟠 Power BI | DAXの計算能力が強力 |
| コスト重視 | 🟠 Power BI | M365ライセンスに含まれる場合も |
| 大規模データ分析 | 🟠 Power BI | パフォーマンスが優秀 |
📝 STEP 51 のまとめ
- 実践比較:両ツールの実際の開発体験を通じた違いの理解
- RFM分析:顧客セグメンテーションの実装方法(LOD/DAX)
- コホート分析:リテンション率の計算と可視化
- 開発効率:ツールによる生産性の違い(Tableauがやや優位)
- 強み弱み:Tableauはビジュアル、Power BIは計算・連携
- 選択基準:プロジェクトに応じた使い分け方法
| 観点 | 🔵 Tableau | 🟠 Power BI |
|---|---|---|
| 得意分野 | 探索的分析、ビジュアル重視 | 定型レポート、M365連携 |
| 学習曲線 | 緩やか(直感的) | やや急(DAX習得必要) |
| 向いている組織 | 分析チーム、データドリブン企業 | Microsoft中心の企業 |
「どちらが優れているか」という問いに絶対的な答えはありません。
用途・組織・スキルによって最適なツールは変わります。
– Tableauはビジュアル重視・探索的分析に強い
– Power BIはMicrosoft連携・大規模展開に強い
両方の特性を理解し、プロジェクトに応じて適切に選択・使い分けることが、プロフェッショナルBIアナリストの条件です!
📝 実践演習
RFMスコアの閾値を自社データに合わせてカスタマイズしてください。売上分布を確認し、適切な閾値を設定してください。
Step 1: データ分布の確認
- ヒストグラムでRecency/Frequency/Monetaryの分布を確認
- パーセンタイル(25%, 50%, 75%)を計算
- ビジネス的に意味のある区切りを検討
Step 2: 分布確認の計算(Tableau)
// Recencyの分布確認 Recency_P25 = PERCENTILE([Recency], 0.25) Recency_P50 = PERCENTILE([Recency], 0.50) Recency_P75 = PERCENTILE([Recency], 0.75) 例: ├─ P25: 15日 ├─ P50: 45日 └─ P75: 120日 → 閾値を 15日, 45日 に設定
Step 3: カスタマイズ後のスコア
R_Score_Custom = IF [Recency] <= 15 THEN 3 ELSEIF [Recency] <= 45 THEN 2 ELSE 1 END
ポイント:
- 業界特性を考慮(日用品は短期、高額商品は長期)
- 各スコアの顧客数がバランス良くなるよう調整
- ビジネス部門と閾値を合意しておく
自分が使いやすいと感じたツールで、コホート分析のヒートマップを作成してください。初回購買月をコホートとし、リテンション率を可視化してください。
Step 1: 計算列の追加(顧客テーブル)
// 初回購買月
初回購買月 =
CALCULATE(
EOMONTH(MIN(購買[注文日]), 0),
ALLEXCEPT(顧客, 顧客[顧客ID])
)
Step 2: 経過月数の計算(購買テーブル)
// 経過月数
経過月数 =
VAR 初回月 = RELATED(顧客[初回購買月])
RETURN
DATEDIFF(初回月, EOMONTH(購買[注文日], 0), MONTH)
Step 3: メジャーの作成
// コホートサイズ
コホートサイズ =
VAR CurrentCohort = MAX(顧客[初回購買月])
RETURN
CALCULATE(
DISTINCTCOUNT(顧客[顧客ID]),
ALL(購買),
顧客[初回購買月] = CurrentCohort
)
// リテンション率
リテンション率 =
DIVIDE(
DISTINCTCOUNT(顧客[顧客ID]),
[コホートサイズ],
0
)
Step 4: マトリックス設定
- 行: 顧客[初回購買月]
- 列: 購買[経過月数]
- 値: [リテンション率]
- 条件付き書式: 緑→黄→赤のグラデーション
完成イメージ:
0月 1月 2月 3月 4月
2023/01 100% 45% 38% 32% 28%
2023/02 100% 48% 40% 35% --
2023/03 100% 42% 36% -- --
2023/04 100% 50% -- -- --
両ツールで「購買パターン分析」(曜日×時間帯ヒートマップ)を作成し、どちらが作りやすかったか、どちらの見た目が良いか、比較レポートを作成してください。
🔵 Tableau実装
// 曜日(計算フィールド)
曜日 = DATENAME('weekday', [注文日])
// 時間帯
時間帯 =
IF HOUR([注文日時]) >= 6 AND HOUR([注文日時]) < 12 THEN "朝"
ELSEIF HOUR([注文日時]) >= 12 AND HOUR([注文日時]) < 18 THEN "昼"
ELSEIF HOUR([注文日時]) >= 18 AND HOUR([注文日時]) < 22 THEN "夜"
ELSE "深夜"
END
// ビジュアル設定
行: 時間帯(並べ替え: 朝→昼→夜→深夜)
列: 曜日(並べ替え: 月→日)
マーク: 四角
色: SUM(売上金額)
ラベル: SUM(売上金額)
開発時間: 約15分
🟠 Power BI実装
// 曜日(計算列)
曜日 = FORMAT(購買[注文日], "dddd")
// 時間帯
時間帯 =
VAR Hour = HOUR(購買[注文日時])
RETURN
SWITCH(
TRUE(),
Hour >= 6 && Hour < 12, "朝",
Hour >= 12 && Hour < 18, "昼",
Hour >= 18 && Hour < 22, "夜",
"深夜"
)
// ビジュアル設定
マトリックスビジュアル
行: 時間帯
列: 曜日
値: SUM(売上金額)
条件付き書式: カラースケール
開発時間: 約20分
比較レポート
| 観点 | Tableau | Power BI |
|---|---|---|
| 開発時間 | 15分 ✓ | 20分 |
| 操作性 | 直感的 ✓ | 設定が多い |
| 見た目 | 美しい ✓ | 標準的 |
| 並べ替え | 簡単 | ソート列必要 |
結論:
- このタスクではTableauが優位
- ヒートマップの作成はTableauの得意分野
- Power BIでも同等の結果は得られるが、設定がやや煩雑
❓ よくある質問
推奨アプローチ:
1. 一つのツールを3-6ヶ月集中して学習
2. 実務で使いこなせるレベルに到達
3. もう一方のツールを2-3ヶ月学習
4. 比較しながら理解を深化
両方使えると、プロジェクトに応じた最適選択ができ、市場価値が高まります。転職時にも有利です。
閾値決定のステップ:
1. データのパーセンタイル(25%, 50%, 75%)を確認
2. 業界の標準的な基準を参考
3. ビジネス部門と議論して合意
4. 定期的に見直し(四半期ごと推奨)
業界別の目安:
- ECサイト(日用品): Recency 14日/30日
- 高額商品: Recency 90日/180日
- サブスク: Frequency 毎月/3ヶ月
分析ステップ:
1. どの月で大きく低下しているか確認
2. 離脱顧客の共通点を分析
3. 成功コホート(リテンション高い月)との違いを比較
一般的な改善施策:
- 初月離脱が多い → オンボーディング改善
- 3ヶ月目離脱 → リマインドメール、特典
- 季節変動 → 時期に合わせたキャンペーン
使い分けパターン:
- 経営層向け: Tableau(ビジュアル重視)
- 現場向け: Power BI(Teams配信)
- 分析チーム: Tableau(探索的分析)
- 財務部門: Power BI(Excel連携)
注意点:
- ライセンスコストが二重になる
- スキルセットの分散
- データ整合性の確保が必要
明確な使い分けルールがあれば両立可能です。
LOD表現(Tableau):
- 構文がシンプル(FIXED, INCLUDE, EXCLUDE)
- 概念理解が重要
- 1-2週間で基本習得可能
DAX(Power BI):
- 関数が豊富(数百種類)
- フィルターコンテキストの理解が必須
- 本格習得には1-2ヶ月必要
ただし、DAXを習得するとより複雑な計算が可能になるため、投資価値は高いです。
学習メモ
BIツール入門 - Step 51