GTM Engineering 陣中帖

記事一覧へ戻る

暗黙的フィードバックによる顧客分析

コンテンツの接触履歴から顧客の興味関心を推定する。暗黙的フィードバックの考え方、コンテンツデータの整備、閲覧スコアの計算まで、実務で使うための基本をまとめます。

  • マーケティング
  • データ分析
  • コンテンツマーケティング

「このお客さまは今、何に興味があるのか」——営業・マーケティングでは、常にこの問いに直面します。商談前のナーチャリング、架電の切り出しなど、どれも、相手が自分からニーズを言い出すのを待っているだけでは遅い場面が多いです。

理想を言えば、全員にアンケートを取って明示的な興味データを集めればよいのですが、現実には無理があります。そこで、暗黙的フィードバックという考え方を使い、定量データに基づく興味関心の推定を試みます。

本稿では、その考え方と、実務で動かすために必要なコンテンツデータの整備、閲覧量の計算モデル等をまとめます。

暗黙的フィードバックとは何か

レコメンデーションや検索の領域では、フィードバックは大きく2つに分かれます。

  • 明示的フィードバック(Explicit):アンケート、興味カテゴリの自己申告、評価星など。顧客が直接「興味がある/ない」を伝える信号。
  • 暗黙的フィードバック(Implicit):閲覧、ダウンロード、視聴、クリックなど。行動そのものを嗜好の代理指標として使う信号。

BtoBのコンテンツ接点に当てはめると、たとえば次のような読み方ができます。

  • 「年末調整の効率化」に関する記事を読んでいる → 年末調整まわりの課題を抱えている可能性が高い
  • 勤怠のホワイトペーパーをフォーム通過してダウンロードしている → 単なる記事PVより、勤怠領域への関心が重い
  • ある商品デモの視聴が進んでいる → その商品への検討温度が高い可能性がある
[diagram:html height=780]
<style>
  :root {
    --ink:#202124; --muted:#667078; --line:#cfd6da; --accent:#078b88; --soft:#e7f5f4;
    --topic:#f08ab0; --topic-bg:#fde8f0; --func:#4a90d9; --func-bg:#e8f1fb;
  }
  * { box-sizing:border-box; }
  h1 { margin:0 0 6px; font-size:18px; line-height:1.35; }
  .lead { margin:0 0 14px; color:var(--muted); font-size:13px; }
  .block-title { margin:0 0 10px; font-size:14px; font-weight:700; }
  .timeline {
    border:1px solid var(--line); padding:14px 12px 12px; margin-bottom:10px;
  }
  .path {
    display:flex; align-items:center; gap:0; margin:0 0 12px; padding:0 4px;
  }
  .person { font-size:18px; margin-right:6px; }
  .rail {
    flex:1; height:4px; background:#d8dee2; border-radius:2px; position:relative;
    display:flex; justify-content:space-between; align-items:center;
  }
  .dot {
    width:12px; height:12px; background:#9aa3a8; border-radius:50%;
    transform:rotate(45deg); border-radius:2px;
  }
  .events {
    display:grid; grid-template-columns:repeat(4,1fr); gap:8px;
  }
  .card {
    border:1px solid var(--line); padding:8px; min-height:118px;
    background:#fff;
  }
  .card .name { font-size:12px; font-weight:700; margin:0 0 8px; line-height:1.35; }
  .tag {
    display:inline-block; font-size:10px; padding:2px 6px; margin:0 4px 4px 0;
    border-radius:3px; line-height:1.3;
  }
  .tag.topic { background:var(--topic-bg); color:#b03060; border:1px solid #f3b8cd; }
  .tag.func { background:var(--func-bg); color:#1f5fa0; border:1px solid #b7d0ef; }
  .legend {
    display:flex; gap:14px; margin-top:10px; font-size:11px; color:var(--muted);
  }
  .legend span::before {
    content:""; display:inline-block; width:10px; height:10px; margin-right:5px;
    vertical-align:-1px; border-radius:2px;
  }
  .legend .l-topic::before { background:var(--topic); }
  .legend .l-func::before { background:var(--func); }
  .arrow {
    text-align:center; color:var(--accent); font-size:28px; line-height:1; margin:4px 0 8px;
  }
  .results {
    display:grid; grid-template-columns:1.1fr 1fr 1fr; gap:8px;
  }
  .panel { border:1px solid var(--line); overflow:hidden; }
  .panel h2 {
    margin:0; padding:8px 8px; background:var(--soft); color:var(--accent);
    font-size:12px; line-height:1.35;
  }
  table { width:100%; border-collapse:collapse; font-size:11px; }
  th, td { padding:5px 6px; border-top:1px solid var(--line); text-align:left; vertical-align:top; }
  th { background:#f7f8f9; font-weight:700; color:var(--muted); }
  td.score { text-align:right; font-weight:700; white-space:nowrap; }
  .note {
    margin-top:10px; font-size:12px; color:var(--muted); line-height:1.45;
  }
  @media (max-width:620px) {
    .events, .results { grid-template-columns:1fr 1fr; }
    .card { min-height:0; }
  }
</style>
<h1>暗黙的フィードバックによる興味の数値化</h1>
<p class="lead">コンテンツ接触をメタデータ経由で集計し、トピック・商品(または機能・モジュール)ごとの閲覧スコアにする</p>
<p class="block-title">顧客のコンテンツ閲覧行動</p>
<div class="timeline">
  <div class="path" aria-hidden="true">
    <span class="person">●</span>
    <div class="rail"><span class="dot"></span><span class="dot"></span><span class="dot"></span><span class="dot"></span></div>
  </div>
  <div class="events">
    <section class="card">
      <p class="name">ホワイトペーパーA</p>
      <span class="tag topic">年末調整</span>
    </section>
    <section class="card">
      <p class="name">オウンドメディア記事B</p>
      <span class="tag topic">リスキリング</span>
      <span class="tag topic">研修</span>
    </section>
    <section class="card">
      <p class="name">事例記事C</p>
      <span class="tag topic">年末調整</span>
      <span class="tag topic">社会保険</span>
      <span class="tag topic">マイナンバー</span>
      <span class="tag func">年末調整</span>
      <span class="tag func">マイナンバー</span>
      <span class="tag func">電子申請</span>
    </section>
    <section class="card">
      <p class="name">商品紹介ページ</p>
      <span class="tag func">年末調整</span>
    </section>
  </div>
  <div class="legend">
    <span class="l-topic">トピックタグ</span>
    <span class="l-func">商品タグ</span>
  </div>
</div>
<div class="arrow" aria-hidden="true">↓</div>
<p class="block-title">興味関心の集計結果(閲覧スコア)</p>
<div class="results">
  <section class="panel">
    <h2>トピック別</h2>
    <table>
      <tr><th>トピック</th><th>カテゴリ</th><th>スコア</th></tr>
      <tr><td>年末調整</td><td>年末調整/源泉徴収</td><td class="score">1.7</td></tr>
      <tr><td>リスキリング</td><td>人材開発</td><td class="score">1.2</td></tr>
      <tr><td>研修</td><td>人材開発</td><td class="score">0.5</td></tr>
      <tr><td>社会保険</td><td>社会保険/年金</td><td class="score">0.2</td></tr>
    </table>
  </section>
  <section class="panel">
    <h2>トピックカテゴリ別</h2>
    <table>
      <tr><th>カテゴリ</th><th>スコア</th></tr>
      <tr><td>年末調整/源泉徴収</td><td class="score">1.7</td></tr>
      <tr><td>人材開発</td><td class="score">1.7</td></tr>
      <tr><td>社会保険/年金</td><td class="score">0.2</td></tr>
    </table>
  </section>
  <section class="panel">
    <h2>商品別</h2>
    <table>
      <tr><th>商品</th><th>スコア</th></tr>
      <tr><td>年末調整</td><td class="score">1.8</td></tr>
      <tr><td>マイナンバー</td><td class="score">0.6</td></tr>
      <tr><td>電子申請</td><td class="score">0.4</td></tr>
    </table>
  </section>
</div>
<p class="note">※数値は説明用の例です。実際の閲覧スコアは時間減衰や行動難度、訴求率などを反映して計算します。</p>
[/diagram]

図1:暗黙的フィードバックによる興味関心の推定

なぜこの考え方が必要か

暗黙的フィードバックが必要な背景は大きく次の3つです。

顧客が多様だと、画一的な提案では届かない

マルチプロダクトで、業種も規模も幅広い顧客を相手にしていると、「全員に同じコンテンツ順」は効きにくくなります。早い段階で興味の軸を推定できれば、ナーチャリングの次の一手も、営業トークの切り口も、顧客ごとに変えられます。問い合わせを待つ受動的な姿勢ではなく、コンテンツ接触から潜在ニーズを拾いにいく必要があります。

属人的な顧客理解は、組織ではスケールしない

優秀な営業・マーケターは、履歴を見て課題仮説を立てます。ただ、組織が大きくなると同じ精度を全員に求めるのは難しい。行動から興味への変換ルールをデータ化しておくと、経験の浅いメンバーでも最低限の仮説を持てます。レコメンドや生成AIは、その上に載せる応用です。土台がなければ、どれも属人知の自動化にはなりません。

明示データだけでは足りない

アンケートやヒアリングは強いですが、全リードに対して行うことはできません。一方、Web・MA・CRMの行動ログはすでに大規模に取れていることが多いので、これを有効的に活用することを考えるべきです。

興味を推定するために、コンテンツデータをどう整備するか

暗黙的フィードバックで興味を推定するには、「誰が・いつ・どのコンテンツに・どう触れたか」に加えて、「そのコンテンツは何について書かれているか」が必要です。後者がメタデータです。

実務では、次の4つを最低限そろえます。ここでは何が揃えば興味推定が動くかに焦点を当てます。

コンテンツの一覧化

ホワイトペーパー、動画、イベント、ウェビナー、事例、オウンドメディア、サービスサイト、プロダクトデモ——顧客が触れる種類を、同じID空間で一覧化します。理想は入口から一元管理することですが、現実には種類ごとのマスタを統一形式へ連結するところから始めることが多いです。

最低限持たせたい項目の例は、コンテンツID、名称、種別、公開日、利用可否、公開URL(PVの紐付け用)、CRM/MAのキャンペーンIDやプログラムID(CVの紐付け用)です。

タグ(興味の軸)の一覧化

タグの目的は、意味のある粒度で集計・推定できるようにすることです。コンテンツ名のままでは細かすぎ、事業領域だけだと粗すぎる、という間を埋めます。

興味関心の推定で特に効くのは、次の2系統です。

  • トピック:課題や話題のキーワード(例:静かな退職、年末調整、組織開発)。細かい軸です。上位にトピックカテゴリを置くと、人が解釈しやすい粗粒度も取れます。
  • 商品:自社が提案できる解決手段の軸です。エクスパンション機会の検知にも直結します。タグ付けだけでなく、訴求率(0〜1、または0〜100%)を持つと、1つのコンテンツが複数商品にまたがるときの按分ができます。

目的・事業領域・部門・役職・業種なども、レコメンドや制作分析では効きます。ただ、興味スコアの本線は、まずトピックと商品からで十分なことが多いです。

タグを設計するときは、次の原則を意識しています。

  • 網羅性:顧客が触れる全種類を対象にする
  • 適切性:「分析用」と「検索用」を混同しない。興味推定なら分析用の定義を優先する
  • 統一性:時期やコンテンツ種類で、タグの意味がブレない
  • 柔軟性:種類やタグ種の追加が、大きな改修なしでできる
  • 保守性:自動収集と人手判定を分け、ゲートキーパーで品質を守る

コンテンツとタグの対応

コンテンツとタグは多対多です。対応関係を1行1紐付けの縦持ち(Toxi法)で持つと、タグ種が増えてもスキーマを壊しにくいです。

  • トピック対応:コンテンツ × トピック
  • 商品対応:コンテンツ × 商品 × 訴求率

判定ルールを文書化し、制作・施策担当が付けたタグをゲートキーパーが確認する運用が、品質の肝になります。ここを雑にすると、どれだけ精緻なスコア式を書いても興味推定は崩れます。タグ付けは、コンテンツデータ基盤の心臓部だと思っています。

名寄せと、行動の取り方

MAの施策名、WebのURL、外部メディアの資料名は、コンテンツマスタの正式名と一致しません。名寄せテーブル(元の名称 → コンテンツID)と、表記揺れ防止、未マッチの検出が必要です。

あわせて、コンテンツ種別ごとにどの行動を興味信号として採るかを決めておきます。たとえば資料はCV(フォーム通過)を主信号にし、オウンドメディア記事はPVを主信号にする、といった具合です。種別マスタに「閲覧スコア判定の行動種別」と「調整係数」を持たせておくと、運用中に直しやすいです。

[diagram:html height=480]
<style>
  :root { --ink:#202124; --muted:#667078; --line:#cfd6da; --accent:#078b88; --soft:#e7f5f4; }
  h1 { margin:0 0 8px; font-size:20px; }
  .lead { margin:0 0 16px; color:var(--muted); font-size:14px; }
  .cols { display:grid; grid-template-columns:1fr 1fr; gap:12px; }
  .col { border:1px solid var(--line); }
  .col h2 { margin:0; padding:10px 12px; background:#f3f5f6; font-size:14px; }
  .col ul { margin:0; padding:12px 12px 12px 28px; font-size:13px; line-height:1.5; }
  .out { margin-top:12px; border:1px solid var(--accent); background:var(--soft); padding:12px 14px; font-size:13px; }
  @media (max-width:620px) { .cols { grid-template-columns:1fr; } }
</style>
<h1>興味推定に必要な最小セット</h1>
<p class="lead">行動ログだけでは足りない。メタデータと名寄せが揃って、はじめてスコアになる</p>
<div class="cols">
  <section class="col">
    <h2>行動側</h2>
    <ul>
      <li>人物ID(取引先責任者など)</li>
      <li>日時</li>
      <li>行動種別(PV / CV など)</li>
      <li>コンテンツID(名寄せ後)</li>
    </ul>
  </section>
  <section class="col">
    <h2>コンテンツ側</h2>
    <ul>
      <li>コンテンツ一覧(種別・係数)</li>
      <li>コンテンツ × トピック</li>
      <li>コンテンツ × 商品 × 訴求率</li>
      <li>名称・URLの名寄せ</li>
    </ul>
  </section>
</div>
<p class="out"><strong>出力の例</strong>:人物 × トピックの閲覧スコア、人物 × 商品の閲覧スコア。日次スナップショットがあると、時点を揃えた比較もできます。</p>
[/diagram]

図2:興味推定に必要な最小データセット

閲覧量の計算モデル(閲覧スコア)

単純な閲覧回数では足りません。1年前のPVと昨日のCVを同じ「1回」として扱うと、いまの興味を見誤ります。そこで、次の3つを組み合わせた閲覧スコアを使います。

  1. 時間的な鮮度(時間減衰)
  2. 行動の重さ(行動難度の係数 θ\theta
  3. 内容の重み(トピックの等分 / 商品の訴求率)

基本式

評価日(基準日)から見て、閲覧日が tt 日前のイベントに対する重みは次です。

w(t)=θeλt,λ=ln2180w(t) = \theta \, e^{-\lambda t}, \quad \lambda = \frac{\ln 2}{180}

半減期は180日です。6ヶ月前の接点は約半分、直近はほぼそのままの重みで評価します。BtoBの検討期間が長い領域では、アトリビューションでよく見る7日半減より長い半減期の方が、現場の感覚に合いやすいと考えています。時間減衰の一般論は、マーケティングの時間減衰モデルにまとめています。

実装イメージは次のとおりです。

coefficient * EXP(-LN(2) * DATE_DIFF(reference_date, view_date, DAY) / 180)

顧客のトピック別・商品別スコアは、該当する全イベントの w(t)w(t)(と後述の按分)を合算して求めます。

[diagram:html height=470]
<style>
  :root { --ink:#202124; --muted:#667078; --line:#cfd6da; --accent:#078b88; --soft:#e7f5f4; }
  h1 { margin:0 0 8px; font-size:20px; }
  .lead { margin:0 0 16px; color:var(--muted); font-size:14px; }
  .stack { display:grid; gap:10px; }
  .row { display:grid; grid-template-columns:140px 1fr; border:1px solid var(--line); }
  .k { background:var(--soft); color:var(--accent); font-weight:700; padding:14px 12px; display:flex; align-items:center; font-size:13px; }
  .v { padding:12px 14px; font-size:13px; line-height:1.5; }
  .formula { margin-top:12px; text-align:center; font-size:16px; font-weight:700; color:var(--accent); }
</style>
<h1>閲覧スコアの3つの要素</h1>
<p class="lead">鮮度 × 行動の重さ × 内容の按分</p>
<div class="stack">
  <div class="row"><div class="k">時間減衰</div><div class="v">半減期180日の指数減衰。古い接点ほど、いまの興味への寄与を落とす。</div></div>
  <div class="row"><div class="k">行動難度 θ</div><div class="v">PVよりCVを重く見る。コンテンツ種別ごとの係数で調整する。</div></div>
  <div class="row"><div class="k">内容按分</div><div class="v">トピックは等分。商品は訴求率を掛ける。</div></div>
</div>
<p class="formula">w(t) = θ · e^(−λt)</p>
[/diagram]

図3:閲覧スコアの構成

行動難度による調整 θ\theta

同じ「見た」でも、心理的ハードルは違います。

  • PV:フォーム不要の閲覧(記事PVなど)
  • CV:フォーム通過を伴う行動(資料ダウンロード、ウェビナー申込など)

CVは入力というハードルを越えている分、興味信号として強く扱います。θ\theta はコンテンツ種別ごとに持ち、「この種別はCVをスコアに使うのか、PVを使うのか」「係数はいくつか」をマスタで切り替えます。ハードコードしない方が、あとから校正しやすいです。

コンテンツ内容に応じた按分

トピック別スコアでは、1コンテンツにトピックが nn 個あるとき、イベントの重みを nn 等分します。

topic score contribution=w(t)n\text{topic score contribution} = \frac{w(t)}{n}

商品別スコアでは、商品訴求率 mm(0〜1)を掛けます。勤怠の訴求率が0.8なら、そのイベント重みの80%が勤怠への興味に加算されます。

function score contribution=w(t)×m\text{function score contribution} = w(t) \times m

訴求率の決め方には、「特定商品に寄せる」「事業領域内で均等に割る」「偏りなしで自動配分する」など複数のモードがあり得ます。コンテンツ側に判定種別を持ち、商品対応を自動生成しておくと、保守しやすくなります。

集計の粒度

実務で使いやすい出力は、次のような形です。

  • 人物 × トピック × 基準日 の閲覧スコア(と順位)
  • 人物 × 商品 × 基準日 の閲覧スコア(と順位)

日次スナップショットにしておくと、「昨日時点の興味」と「商談作成日時点の興味」を揃えられます。営業ツールやLLMへの入力には、最新日の断面を渡せば足ります。

おわりに

本稿で伝えたかったのは、行動を興味の代理指標とみなし、コンテンツのメタデータで軸に投影し、時間と行動の重さでいまの値に直す、という一本の線です。自社のログとマスタに引き直すときの出発点になれば幸いです。

関連記事として、時間減衰の数式バリエーションはマーケティングの時間減衰モデル、コンテンツ基盤の全体像はマーケティングコンテンツデータ基盤、興味の数値化から提案最適化までの一連はデータ×AI駆動コンテンツマーケティング&セールスもあわせてご覧ください。