mcpField
C
cja-top-movers-watchlist

cja-top-movers-watchlist

github.com/adobeデータ・データベース316331 回インストール今日更新
リポジトリ

cja-top-movers-watchlist について

Customer Journey Analytics で二つの期間における指標の変化をディメンション別に順位付けするスキルです。新たに現れた項目や消失した項目も特定し、変化を確認するための HTML レポートを作成します。

主な機能

  1. 01二期間のディメンション項目を比較
  2. 02増加・減少の上位項目を順位付け
  3. 03新規・消失項目を特定
  4. 04絶対変化量と変化率を算出
  5. 05HTML レポートとインライン要約を生成

活用シーン

  1. 01週ごとの変化が大きいマーケティングチャネルを確認
  2. 02指標の変化が大きいページや製品を特定
  3. 03新たに現れた、または消失した項目を把握

MCP 対応

Customer Journey Analytics の MCP ツールで指標とディメンションを特定し、ディメンション値を調べて二期間のレポートを取得します。

インストール

コマンドをコピーしてターミナルで実行します。

$npx skills add https://github.com/adobe/skills --skill cja-top-movers-watchlist

インストール後、Claude Code で/cja-top-movers-watchlistを入力して読み込まれたか確認します。

同梱ファイルevals/evals.json

詳細

トップ変動項目ウォッチリスト(カスタマージャーニー分析)

任意のディメンションについて、2つの期間で指標が大きく増加または減少した項目を明らかにします。出力では、何がどれだけ変動したか、また項目が新たに出現したのか、完全に消失したのかをユーザーに正確に伝えます。こうした点が、最も興味深いシグナルとなることもよくあります。

このスキルは、包括的な異常トリアージをより迅速かつ対象を絞って実施する代替手段です。単一の異常を詳しく調べるのではなく、変化の全体像を把握したい場合に使用します。


使用する CJA MCP ツール

  • describeCja(DATAVIEW_CONTEXT_GUIDE) — データビューのカレンダー/タイムゾーンを読み込みます
  • findMetrics — 対象の指標を特定します
  • findCalculatedMetrics — 指標がカスタム KPI の場合に使用します
  • findDimensions — 内訳に使用するディメンションを特定します
  • runReport — 両期間のディメンション別指標データを取得します
  • searchDimensionItems — ユーザーが名前を指定した場合にディメンション値を検証します

フェーズ 0 — セットアップ

  1. 必要に応じて findDataViews と setDefaultSessionDataViewId を呼び出します。
  2. describeCja("DATAVIEW_CONTEXT_GUIDE") を呼び出して、データビューのコンテキストを読み込みます。 週の初日を WEEK_START_DOW、タイムゾーンを TIMEZONE として記録します。コンテキストガイドで週の開始日の値が返されない場合は、 Monday(ISO 8601)をデフォルトにします。フェーズ 1.3 では、この両方を使用します。

フェーズ 1 — 入力内容の確認

1.1 指標

ユーザーが指標を指定した場合は、特定します。

findMetrics(search: "<user's metric name>")

指定されていない場合は、利用状況に基づいて上位 3 つの指標を提案します。

「どの指標を追跡しますか?チームでの利用頻度に基づいて、セッション数、売上、注文数を提案できます。」

1.2 ディメンション(内訳の項目)

一般的なディメンションと、それぞれの典型的な用途は次のとおりです。

ディメンション用途
マーケティングチャネル「どのチャネルが変動しましたか?」
ページ名「どのページが注目されていますか?」
キャンペーン「どのキャンペーンが改善しましたか?」
製品「どの製品の注目度が高まり、または下がりましたか?」
国/地域「どの市場が変動しましたか?」
デバイスタイプ「モバイルとデスクトップのどちらに変化がありましたか?」
参照元ドメイン「どの参照元が変化しましたか?」

ユーザーが指定していない場合は、次のように尋ねます。

「どのディメンションで内訳を表示しますか?たとえば、マーケティングチャネル、ページ、キャンペーン、国、製品などです。」

findDimensions(search: "<dimension keyword>") を呼び出して、ディメンション ID を特定します。

1.3 期間

期間 A(現在)と期間 B(比較対象)を定義します。デフォルトは次のとおりです。

  • 期間 A:今週(または過去 7 日間)
  • 期間 B:先週(またはその前の 7 日間)

ユーザーが「今月と先月を比較」やカスタム期間を指定した場合は、それに合わせて設定します。レポートを実行する前に、必ず期間を確認します。

「**今週(3 月 13~19 日)と先週(3 月 6~12 日)**を比較します。よろしいですか?」

カレンダーのルール(必須):

フェーズ 0 の WEEK_START_DOW を使用して、「週」の定義を決めます。期間 A と期間 B は、必ず同じ週の初日を使用しなければなりません。つまり、両方の期間の startDate が同じ曜日となり、期間の長さが完全に一致し、期間 B の終了日は期間 A の開始日の直前でなければなりません。同じ実行内で、異なる定義(例:月~日を期間 A、日~土を期間 B)を混在させないでください。境界を一度決めたら、それに基づいて両方の期間を算出します。カスタムの日付範囲では、期間 A と同じ長さで、期間 A の開始日の直前に終了する期間を期間 B として算出します。

runReport 呼び出し前の整合性確認: periodA.startDate と periodB.startDate が同じ曜日であり、さらに periodA.startDate - periodB.endDate == 1 day であることを確認します。満たさない場合は、再計算します。


フェーズ 2 — 両方の期間のデータを取得する

同じディメンションの内訳で、期間ごとに 1 つずつ、2 つのレポートを実行します。

runReport(
  dimensionIds: "<dimension id>",
  metricIds: "<metric id>",
  startDate: "<period A start>T00:00:00",
  endDate: "<period A end>T23:59:59",
  page: 0,
  limit: 50
)
runReport(
  dimensionIds: "<dimension id>",
  metricIds: "<metric id>",
  startDate: "<period B start>T00:00:00",
  endDate: "<period B end>T23:59:59",
  page: 0,
  limit: 50
)

意味のある変動項目を見つけられるよう、limit: 50 を使用して十分な項目を取得します。 ユーザーのディメンションに数千の値(例:ページ名)がある場合は、比較の妥当性を保つため、期間 A のボリューム上位 100 件に制限します。

行データは rows 配列にあります。各行には value(ディメンション項目名)と data[0](指標の値)が含まれます。ディメンションのカーディナリティに上限は ありませんが、結果はデフォルトで指標の降順に並ぶため、そのままで問題ありません。

実行前に必ず findDimensions(searchQuery: "<name>") でディメンション ID を確認してください。 ディメンション ID は推測と異なる場合があります(例:variables/marketing_channel であり、 variables/marketingchannel ではありません)。


フェーズ 3 — 順位を計算する

両方の結果セットをディメンション値で結合して、統合テーブルを作成します。

いずれかの期間に存在する各ディメンション値について:

  • valueA = 期間 A の指標値(存在しない場合は 0)
  • valueB = 期間 B の指標値(存在しない場合は 0)
  • delta = valueA − valueB
  • pctChange = valueB > 0 の場合は(delta / valueB)× 100、それ以外は「新規項目」
  • status:
    • A に存在し、B には存在しない → 新規項目(今期に出現)
    • B に存在し、A には存在しない → 消失(今期に表示されなくなった)
    • 両方に存在する → 通常の変動項目

次の順に並べ替えます。

  1. 増加上位:delta の降順(絶対値で最も大きい増加を先頭にする)
  2. 減少上位:delta の昇順(絶対値で最も大きい減少を先頭にする)
  3. 増加率上位:pctChange の降順
  4. 減少率上位:pctChange の昇順

各リストは 上位 10 件に制限します。新規項目と消失項目は、 件数にかかわらず独立したセクションに含めます(いずれも常に注目すべきシグナルです)。


フェーズ 4 — HTML レポートを生成する

変動項目レポートをインラインで生成し、 /tmp/cja_top_movers_report_<YYYY-MM-DD_HHMMSS>.html に書き込みます。

レンダリング規則 — 実行のたびに一貫して適用する

同じデータビュー、指標/ディメンション、期間でこのスキルを 2 回実行した場合、 生成時刻を除き、同じ表示結果にする必要があります。以下の規則により、AI による 書式の揺れを防ぎます。

数値の書式
  • KPI 値(各サマリータイルの大きな数値と、変動項目の各行の値)には、 千位区切り付きの完全な数値を使用します(8,160、77,584、1,250,000)。 大きな値でも、K や M のような SI 接頭辞は使用しないでください。 関係者には省略表記ではなく、正確な数値が必要です。
  • 変化率(ピルと説明文の箇条書き)には、常に小数第 1 位まで表示し、 ゼロから遠ざかる方向に丸めます。たとえば、−23.55% は −23.6% と表示し、 −23.5% とは表示しません。完全精度の値で計算し、表示時にのみ丸めます。
  • パーセントポイントの変化(コンバージョン率や直帰率など、もともとパーセントで 表される指標の場合)も同じ方法で丸め、末尾に pp を付けます。例:+0.40 pp。
  • 通貨 — $ を先頭に付け、千位区切りを使用し、$100 以上の値には小数を付けません ($1,240,000)。値が $100 未満の場合に限り、セントまで表示します($45.20)。
NULL/欠損データの扱い

KPI タイルまたは変動項目の行には、データビューから実際に返されたデータを反映する 必要があります。レポートを見栄えよくするために、AI が別の指標を黙って代用したり、 タイルを非表示にしたりしてはいけません。

  • サマリータイルの対象指標について、両方の期間で 0 または NULL が返された場合: kpi-value を Data unavailable、ピルのクラスを flat、ピルのテキストを ⚠ N/A、prior のテキストを Both periods returned no data — validate instrumentation としてタイルを表示します。タイルはグリッド内に残し、省略しないでください。
  • 一方の期間では有効なデータが返され、もう一方の期間では 0 または NULL が返された場合: 有効な値を kpi-value に設定し、ピルのクラスを flat、ピルのテキストを ⚠ N/A、prior のテキストを Prior {period_noun}: no data としてタイルを表示します。
  • 別の指標で代用することは決してしないでください(例:Revenue が $0 で返されたため、 Orders に切り替えること)。分析対象の指標を必ず表示してください。
HTML テンプレート
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>Top Movers &mdash; {ORG_NAME} &mdash; {METRIC_NAME} by {DIMENSION_NAME}</title>
<link rel="preconnect" href="https://fonts.googleapis.com">
<link rel="preconnect" href="https://fonts.gstatic.com" crossorigin>
<link href="https://fonts.googleapis.com/css2?family=Playfair+Display:wght@700;900&family=Inter:wght@400;500;600;700&display=swap" rel="stylesheet">
<style>
  * { box-sizing: border-box; margin: 0; padding: 0; }
  :root {
    --bg: #f5f4f1;
    --surface: #ffffff;
    --ink: #1a1a1a;
    --ink-muted: #6b6b6b;
    --border: #e5e2dc;
    --header-bg: #0e0e10;
    --header-warm: #3a1010;
    --accent-red: #c8312f;
    --accent-red-bright: #ff6b68;
    --accent-red-soft: #fdecea;
    --accent-green: #1f7a4d;
    --accent-yellow: #d4a017;
  }
  body { font-family: "Inter", -apple-system, BlinkMacSystemFont, "Segoe UI", sans-serif;
         background: var(--bg); color: var(--ink); line-height: 1.5;
         -webkit-font-smoothing: antialiased; }

  /* === Header === */
  header { background: linear-gradient(120deg, var(--header-bg) 0%, #1a0d0d 55%, var(--header-warm) 100%);
           color: #fff; padding: 56px 56px 44px; position: relative; overflow: hidden; }
  header::after { content: ""; position: absolute; right: -140px; top: -140px;
                  width: 460px; height: 460px;
                  background: radial-gradient(circle, rgba(200,49,47,.35) 0%, transparent 70%);
                  pointer-events: none; }
  .header-inner { max-width: 1080px; margin: 0 auto; position: relative; z-index: 1; }
  .eyebrow { display: inline-flex; align-items: center; gap: 8px;
             padding: 6px 14px; border: 1px solid rgba(255,107,104,.55);
             border-radius: 999px; color: var(--accent-red-bright);
             font-size: 11px; font-weight: 600; letter-spacing: 1.2px;
             text-transform: uppercase; margin-bottom: 24px;
             background: rgba(200,49,47,.10); }
  .eyebrow::before { content: ""; width: 6px; height: 6px;
                     background: var(--accent-red-bright); border-radius: 50%; }
  header h1 { font-family: "Playfair Display", Georgia, serif;
              font-size: 56px; font-weight: 700; letter-spacing: -1.5px;
              line-height: 1.05; margin-bottom: 14px; color: #fff; }
  header .lede { font-size: 16px; max-width: 560px;
                 color: rgba(255,255,255,.80); margin-bottom: 24px;
                 line-height: 1.55; }
  header .meta { display: flex; flex-wrap: wrap; gap: 22px;
                 font-size: 13px; color: rgba(255,255,255,.60); }
  header .meta span { display: inline-flex; align-items: center; gap: 6px; }
  header .meta .icon { opacity: .8; }

  /* === Tabs === */
  nav { background: var(--surface); border-bottom: 1px solid var(--border);
        padding: 0 56px; display: flex; gap: 28px;
        position: sticky; top: 0; z-index: 50; }
  nav a { display: block; padding: 16px 0; font-size: 14px;
          color: var(--ink); text-decoration: none;
          border-bottom: 2px solid transparent;
          transition: border-color .15s ease; }
  nav a:hover { border-bottom-color: var(--accent-red); }

  /* === Container === */
  .container { max-width: 1080px; margin: 0 auto; padding: 36px 56px 60px; }

  /* === Section label === */
  .section-label { font-size: 11px; font-weight: 700;
                   text-transform: uppercase; letter-spacing: 1.4px;
                   color: var(--ink-muted); margin-bottom: 14px;
                   padding-bottom: 10px; border-bottom: 1px solid var(--border); }

  /* === KPI grid === */
  .kpi-row { display: grid; grid-template-columns: repeat(auto-fit, minmax(220px, 1fr));
             gap: 14px; margin-bottom: 36px; }
  .kpi-tile { background: var(--surface); border-radius: 8px;
              padding: 22px 22px 20px;
              border-top: 3px solid #b9b6ae;
              box-shadow: 0 1px 3px rgba(0,0,0,.05); }
  .kpi-tile.down { border-top-color: var(--accent-red); }
  .kpi-tile.up   { border-top-color: var(--accent-green); }
  .kpi-tile.flat { border-top-color: #b9b6ae; }
  .kpi-head { display: flex; justify-content: space-between;
              align-items: center; margin-bottom: 10px; }
  .kpi-label { font-size: 11px; font-weight: 700;
               text-transform: uppercase;
               color: var(--ink-muted); letter-spacing: 1px; }
  .kpi-value { font-family: "Playfair Display", Georgia, serif;
               font-weight: 700; font-size: 34px;
               line-height: 1; color: var(--ink);
               margin-bottom: 12px; }
  .pill { display: inline-flex; align-items: center; gap: 4px;
          padding: 3px 9px; border-radius: 4px;
          font-size: 12px; font-weight: 600; line-height: 1.4; }
  .pill.down { background: var(--accent-red-soft); color: var(--accent-red); }
  .pill.up   { background: #ebf5ef; color: var(--accent-green); }
  .pill.flat { background: #f1efea; color: var(--ink-muted); }
  .prior { display: block; margin-top: 10px;
           font-size: 12px; color: var(--ink-muted); }

  /* === Dual risers / fallers panels === */
  .two-col { display: grid; grid-template-columns: 1fr 1fr;
             gap: 20px; margin-bottom: 22px; }
  @media (max-width: 760px) { .two-col { grid-template-columns: 1fr; } }

  /* === Sections (collapsible tables) === */
  .section { background: var(--surface); border-radius: 8px;
             box-shadow: 0 1px 3px rgba(0,0,0,.04);
             margin-bottom: 22px; overflow: hidden; }
  /* Top-border accent on risers/fallers tiles */
  .section.risers  { border-top: 3px solid var(--accent-green); }
  .section.fallers { border-top: 3px solid var(--accent-red); }
  .section-header { padding: 18px 28px; border-bottom: 1px solid var(--border);
                    display: flex; justify-content: space-between;
                    align-items: center; cursor: pointer; }
  .section-header h2 { font-family: "Playfair Display", Georgia, serif;
                       font-size: 18px; font-weight: 700; }
  .section.risers  .section-header h2 { color: var(--accent-green); }
  .section.fallers .section-header h2 { color: var(--accent-red); }

  table { width: 100%; border-collapse: collapse; font-size: 13px; }
  thead th { background: #faf8f4; padding: 12px 22px;
             text-align: left; font-weight: 600;
             text-transform: uppercase; letter-spacing: .6px;
             font-size: 11px; color: var(--ink-muted);
             border-bottom: 1px solid var(--border); }
  tbody td { padding: 12px 22px; border-bottom: 1px solid #f4f1eb; }
  tbody tr:last-child td { border-bottom: none; }

  .delta-up   { color: var(--accent-green); font-weight: 600; }
  .delta-down { color: var(--accent-red);   font-weight: 600; }

  .badge { display: inline-block; padding: 3px 9px; border-radius: 4px;
           font-size: 11px; font-weight: 600; }
  .badge.green  { background: #ebf5ef; color: var(--accent-green); }
  .badge.red    { background: var(--accent-red-soft); color: var(--accent-red); }
  .badge.yellow { background: #fef6e3; color: #b67a08; }
  .badge.blue   { background: #eef2f8; color: #2c4a7a; }
  .badge.grey   { background: #f1efea; color: var(--ink-muted); }

  .back-top { position: fixed; bottom: 24px; right: 24px;
              background: var(--accent-red); color: #fff;
              width: 44px; height: 44px; border-radius: 50%;
              border: none; font-size: 20px; cursor: pointer;
              box-shadow: 0 4px 12px rgba(200,49,47,0.30); }
  footer { text-align: center; padding: 32px 24px;
           font-size: 12px; color: var(--ink-muted); }

  /* === Print === */
  @media print {
    nav { display: none; position: static; }
    header { padding: 36px 32px 28px; }
    header h1 { font-size: 42px; }
    .section-header { cursor: default; }
    .kpi-row { page-break-inside: avoid; }
    .kpi-tile, .section {
      box-shadow: none; border: 1px solid var(--border);
    }
    .back-top { display: none; }
  }
</style>
</head>
<body>

<header>
  <div class="header-inner">
    <div class="eyebrow">Top Movers Report</div>
    <h1>{ORG_NAME} Top Movers</h1>
    <p class="lede">Biggest gainers and decliners for {METRIC_NAME} by {DIMENSION_NAME}, {PERIOD_A_LABEL} vs {PERIOD_B_LABEL}.</p>
    <div class="meta">
      <span><span class="icon">&#128197;</span> {PERIOD_A_LABEL}</span>
      <span><span class="icon">&#128202;</span> {DATA_VIEW}</span>
      <span><span class="icon">&#128340;</span> Prepared {GENERATED_DATE}</span>
    </div>
  </div>
</header>

<nav>
  <a href="#summary">Summary</a>
  <a href="#gainers">Gainers</a>
  <a href="#decliners">Decliners</a>
  <a href="#newdisappeared">New &amp; Gone</a>
  <a href="#fulltable">Full Table</a>
</nav>

<div class="container">

  
  <div class="section-label">Watchlist Summary</div>
  <div id="summary" class="kpi-row">
    <div class="kpi-tile flat">
      <div class="kpi-head"><div class="kpi-label">Total Items Compared</div></div>
      <div class="kpi-value">{TOTAL_ITEMS}</div>
      <span class="prior">Dimension values in scope</span>
    </div>
    <div class="kpi-tile up">
      <div class="kpi-head"><div class="kpi-label">Biggest Gain</div></div>
      <div class="kpi-value">{TOP_GAINER_VALUE}</div>
      <span class="pill up">&#9650; {TOP_GAINER_NAME}</span>
    </div>
    <div class="kpi-tile down">
      <div class="kpi-head"><div class="kpi-label">Biggest Drop</div></div>
      <div class="kpi-value">{TOP_DECLINER_VALUE}</div>
      <span class="pill down">&#9660; {TOP_DECLINER_NAME}</span>
    </div>
    <div class="kpi-tile flat">
      <div class="kpi-head"><div class="kpi-label">New Entries</div></div>
      <div class="kpi-value">{NEW_ENTRIES}</div>
      <span class="prior">Appeared this period</span>
    </div>
    <div class="kpi-tile flat">
      <div class="kpi-head"><div class="kpi-label">Disappeared</div></div>
      <div class="kpi-value">{DISAPPEARED}</div>
      <span class="prior">Dropped out this period</span>
    </div>
  </div>

  
  <div class="two-col">

    <div id="gainers" class="section risers">
      <div class="section-header" onclick="toggle('gain-body')">
        <h2>&#9650; Top 10 Gainers</h2>
        <span id="gain-body-icon">&#9662;</span>
      </div>
      <div id="gain-body">
        <table>
          <thead><tr>
            <th>Item</th>
            <th>{PERIOD_A_LABEL}</th>
            <th>{PERIOD_B_LABEL}</th>
            <th>Delta</th>
            <th>% Change</th>
          </tr></thead>
          <tbody>
            
            
          </tbody>
        </table>
      </div>
    </div>

    <div id="decliners" class="section fallers">
      <div class="section-header" onclick="toggle('dec-body')">
        <h2>&#9660; Top 10 Decliners</h2>
        <span id="dec-body-icon">&#9662;</span>
      </div>
      <div id="dec-body">
        <table>
          <thead><tr>
            <th>Item</th>
            <th>{PERIOD_A_LABEL}</th>
            <th>{PERIOD_B_LABEL}</th>
            <th>Delta</th>
            <th>% Change</th>
          </tr></thead>
          <tbody>
            
            
          </tbody>
        </table>
      </div>
    </div>

  </div>

  
  <div id="newdisappeared" class="section">
    <div class="section-header" onclick="toggle('nd-body')">
      <h2>New Entries &amp; Disappeared Items</h2>
      <span id="nd-body-icon">&#9662;</span>
    </div>
    <div id="nd-body">
      <table>
        <thead><tr>
          <th>Item</th>
          <th>Status</th>
          <th>{PERIOD_A_LABEL}</th>
          <th>{PERIOD_B_LABEL}</th>
          <th>Notes</th>
        </tr></thead>
        <tbody>
          
          
        </tbody>
      </table>
    </div>
  </div>

  
  <div id="fulltable" class="section">
    <div class="section-header" onclick="toggle('full-body')">
      <h2>Full Comparison Table</h2>
      <span id="full-body-icon">&#9662;</span>
    </div>
    <div id="full-body">
      <table>
        <thead><tr>
          <th>Item</th>
          <th>{PERIOD_A_LABEL}</th>
          <th>{PERIOD_B_LABEL}</th>
          <th>Delta</th>
          <th>% Change</th>
          <th>Status</th>
        </tr></thead>
        <tbody>
          
        </tbody>
      </table>
    </div>
  </div>

</div>

<button class="back-top" onclick="window.scrollTo({top:0,behavior:'smooth'})">&uarr;</button>
<footer>Top Movers &mdash; {ORG_NAME} &mdash; Generated {GENERATED_DATE}</footer>

<script>
function toggle(id) {
  var el = document.getElementById(id);
  var ic = document.getElementById(id + '-icon');
  if (el.style.display === 'none') { el.style.display=''; ic.textContent='\u25be'; }
  else { el.style.display='none'; ic.textContent='\u25b8'; }
}
</script>
</body></html>

ワークフローの概要

  1. 指標、ディメンション、両方の期間を確認します。
  2. ディメンション別の内訳を指定して(上限 50)、期間 A の runReport を実行します。
  3. 同じパラメーターで期間 B の runReport を実行します。
  4. ディメンション値をキーに結合し、delta、pctChange、status を計算します。
  5. 「上昇トップ 10」「下落トップ 10」「新規項目」「消失項目」に分類します。
  6. HTML レポートをインラインで生成し、/tmp/cja_top_movers_report_<YYYY-MM-DD_HHMMSS>.html に書き込みます。
  7. open /tmp/cja_top_movers_report_<YYYY-MM-DD_HHMMSS>.html で開きます。
  8. 3 行のインライン要約を提示します:「上昇トップ:X(+Y%)、下落トップ:Z(−W%)。 新たに上位 50 件に入った項目は N 件、消失した項目は M 件です。」

重要なガードレール

  • 読み取り専用のモニタリングです。 セグメント、指標、プロジェクト定義は決して変更しないでください。
  • 実行前に指標とセグメントの範囲を確認します。 「すべてを監視して」のような曖昧な依頼は対象を絞る必要があります。重要なディメンションと指標を尋ねてください。
  • 比較する期間を揃えます。 「上昇・下落トップ」を比較する期間は、同じ長さでなければなりません。期間が異なると誤った兆候が生じます。
  • ノイズとシグナルを区別します。 トラフィックが非常に少ないディメンション値(例:訪問数 5 のセグメント)は 500% の変動を示す場合があります。上昇・下落項目として報告する前に、最低基準(例:セッション数 100 以上)を適用してください。
  • ウォッチリストの規模に上限を設けます。 デフォルトでは上昇・下落項目の上位 10~20 件を提示します。ディメンション項目を 100 件も提示すると、ユーザーの目的を損ないます。
  • 変化を背景情報と関連付けます。 可能であれば、変動の説明につながる既知のビジネスイベント(キャンペーン、リリース、障害)を記載してください。

やり取りの例

「先週とその前の週を比べて、最も変動したマーケティングチャネルはどれですか?」

  1. 指標:セッション数(使用状況のデフォルトで最上位)
  2. ディメンション:マーケティングチャネル
  3. 期間 A:先週、期間 B:その前の週
  4. 両方のレポートを実行し、結果を結合します
  5. 上昇:有料ソーシャル +32%、オーガニック検索 +8%
  6. 下落:メール −18%、ダイレクト −5%
  7. 新規:アフィリエイト(前週の上位 50 件には含まれていません)
  8. レポートを生成して開きます
  9. インライン要約:「最も大きく上昇したのは有料ソーシャル(+32%)です。メールは 最も大きく下落しました(−18%)。アフィリエイトチャネルが 上位ランキングに初めて登場しました。」

コメント