Mímisbrunnr知恵の泉

← マーケティングサイエンス 一覧

🎓 レベル:基礎 | 重要度:A(必須)

📎 関連:マーケティングサイエンスとは | ファネルとコンバージョンの基本指標

要点(BLUF)

1. マーケティングデータの4系統と粒度

マーケティングで扱うデータは、出どころで4系統に整理できます。それぞれ「最小粒度(これ以上分解できない1行の単位)」が違います。

系統代表的な中身最小粒度主なKPI
顧客属性年齢・地域・会員ランク・契約状態顧客会員数・セグメント構成比
行動ログページ閲覧・クリック・滞在・検索顧客 × 時刻 × イベント訪問数・回遊数・直帰率
取引注文・金額・点数・返品顧客 × 注文売上・購入頻度・平均単価
広告配信・表示・クリック・費用広告 × 日 × 媒体インプレッション・CTR・CPA

粒度が命です。最小粒度の行(アトミックなログ)を保持しておけば、後からどんな集計 KPI も組み直せます。逆に「日次の売上合計」しか残っていないと、どのチャネル・どの顧客層が効いたのかを分解して掘り下げられません。データ設計では、まず最も細かい粒度で貯め、集計は後工程に回すのが鉄則です。

flowchart LR
  D1["顧客属性"] --> AGG["集計・結合"]
  D2["行動ログ"] --> AGG
  D3["取引"] --> AGG
  D4["広告"] --> AGG
  AGG --> KPI["KPI(CVR・単価・CPA…)"]
  KPI --> KGI["KGI(売上・利益)"]

2. KPIツリー:KGIの乗法分解と先行・遅行指標

KPIツリーは、最終目標 KGI を頂点に、それを構成する KPI、さらに各 KPI を動かす**操作変数(レバー)**へと枝分かれさせた木構造です。EC の売上をチャネル別に乗法分解すると、こう書けます。

売上(KGI)=c  vc×rc×pcチャネル c の売上\text{売上(KGI)} = \sum_{c}\; \underbrace{v_c \times r_c \times p_c}_{\text{チャネル } c \text{ の売上}}

ここで vcv_c は訪問数、rcr_c は CVR、pcp_c は平均単価です。チャネルごとに「訪問 × CVR × 単価」の積を作り、それを足し上げたものが全体の売上になります。

指標は時間軸でも2種類に分かれます。

顧客ライフサイクルで整理する分類軸が AARRR(海賊指標) です。Acquisition(獲得)→ Activation(活性化)→ Retention(継続)→ Referral(紹介)→ Revenue(収益)の5段階に代表 KPI を割り当てると、KPIツリーを「獲得から継続まで」の流れで俯瞰できます(Retention・Referral の数理は第2章以降で扱います)。

flowchart TD
  KGI["KGI:売上"] --> A["訪問数"]
  KGI --> B["CVR"]
  KGI --> C["単価"]
  A --> A1["広告費"]
  A --> A2["流入チャネル"]
  B --> B1["LP改善"]
  B --> B2["カート離脱対策"]
  C --> C1["クロスセル"]
  C --> C2["価格設定"]

3. 弾力性で見る各レバーの効き(数式)

「どのレバーを動かせば KGI が一番増えるか」を、**弾力性(1% 動かしたときに KGI が何 % 動くか)**で考えます。まず単一チャネルの売上 Sc=vcrcpcS_c = v_c\, r_c\, p_c を片対数にすると、積が和になります。

Sc=vcrcpclnSc=lnvc+lnrc+lnpcS_c = v_c \, r_c \, p_c \quad\Longrightarrow\quad \ln S_c = \ln v_c + \ln r_c + \ln p_c

このとき各レバーの弾力性は、いずれも 1 です。

lnSclnvc=lnSclnrc=lnSclnpc=1\frac{\partial \ln S_c}{\partial \ln v_c} = \frac{\partial \ln S_c}{\partial \ln r_c} = \frac{\partial \ln S_c}{\partial \ln p_c} = 1

つまり単一チャネルの中では、どのレバーを 1% 上げてもチャネル売上は 1% 増える(率では等価)。では複数チャネルの総和ではどうか。S=cScS = \sum_c S_c を1つのレバー(例:vcv_c)で微分します。

Svc=Scvcεvc  =  SvcvcS  =  ScS  =  wc\frac{\partial S}{\partial v_c} = \frac{S_c}{v_c} \quad\Longrightarrow\quad \varepsilon_{v_c} \;=\; \frac{\partial S}{\partial v_c}\cdot\frac{v_c}{S} \;=\; \frac{S_c}{S} \;=\; w_c

rc,pcr_c,\, p_c でも同じ結果です。すなわち——

総売上の、チャネル cc の任意のレバーに対する弾力性は、すべて wcw_c(チャネル cc の売上シェア)に等しい。

そして、あるレバーを改善率 δ\delta(例:+10%)だけ動かしたときの KGI 増分は、

ΔS=Scδ=wcδS\Delta S = S_c \cdot \delta = w_c \, \delta \, S

となります。だから優先順位は、δ\delta(現実的に動かせる改善率)と ScS_c(そのチャネルの規模)の掛け算で決まる、というのが結論です。

4. どのレバーを動かすか(コード)

4チャネルの KPIツリーを pandas で組み、売上シェア(=弾力性)と感度を計算して、最も効くレバーを特定します。

import numpy as np
import pandas as pd

# チャネル別のKPIツリー(合成データ):訪問数 × CVR × 単価 = チャネル売上
tree = pd.DataFrame({
    "チャネル": ["検索広告", "SNS広告", "メール", "オーガニック"],
    "訪問数":   [50_000, 80_000, 20_000, 100_000],
    "CVR":      [0.030,  0.015,  0.050,  0.020],
    "単価":     [8_000,  6_000,  9_000,  7_000],
})
tree["売上"] = tree["訪問数"] * tree["CVR"] * tree["単価"]

KGI = tree["売上"].sum()
tree["売上シェア"] = tree["売上"] / KGI   # 総売上の「そのチャネルのレバー」に対する弾力性

print("=== KPIツリー(チャネル別の乗法分解)===")
print(tree.to_string(index=False, formatters={
    "訪問数": "{:,.0f}".format, "CVR": "{:.3f}".format,
    "単価": "{:,.0f}".format, "売上": "{:,.0f}".format,
    "売上シェア": "{:.3f}".format}))
print(f"\nKGI(総売上)= {KGI:,.0f} 円")

# 各レバーの「現実的に動かせる改善率」(実務的な仮定)
achievable = {"訪問数": 0.15, "CVR": 0.10, "単価": 0.05}

# 各(チャネル × レバー)を改善したときのKGI増分(円)= 改善率 × チャネル売上
rows = []
for _, r in tree.iterrows():
    for lever, rate in achievable.items():
        rows.append({
            "チャネル": r["チャネル"],
            "レバー": lever,
            "改善率": rate,
            "弾力性(売上シェア)": r["売上シェア"],
            "KGI増分": rate * r["売上"],
        })
imp = pd.DataFrame(rows).sort_values("KGI増分", ascending=False)

print("\n=== レバーの感度ランキング(KGI増分が大きい順・上位6)===")
print(imp.head(6).to_string(index=False, formatters={
    "改善率": "{:.2f}".format,
    "弾力性(売上シェア)": "{:.3f}".format,
    "KGI増分": "{:,.0f}".format}))

top = imp.iloc[0]
print(f"\n最も効くレバー:{top['チャネル']}{top['レバー']} を "
      f"+{top['改善率']:.0%} → KGIが {top['KGI増分']:,.0f} 円 増える")

出力:

=== KPIツリー(チャネル別の乗法分解)===
  チャネル     訪問数   CVR    単価         売上 売上シェア
  検索広告  50,000 0.030 8,000 12,000,000 0.284
 SNS広告  80,000 0.015 6,000  7,200,000 0.171
   メール  20,000 0.050 9,000  9,000,000 0.213
オーガニック 100,000 0.020 7,000 14,000,000 0.332

KGI(総売上)= 42,200,000 円

=== レバーの感度ランキング(KGI増分が大きい順・上位6)===
  チャネル レバー  改善率 弾力性(売上シェア)     KGI増分
オーガニック 訪問数 0.15      0.332 2,100,000
  検索広告 訪問数 0.15      0.284 1,800,000
オーガニック CVR 0.10      0.332 1,400,000
   メール 訪問数 0.15      0.213 1,350,000
  検索広告 CVR 0.10      0.284 1,200,000
 SNS広告 訪問数 0.15      0.171 1,080,000

最も効くレバー:オーガニック の 訪問数 を +15% → KGIが 2,100,000 円 増える

出力の意味:まず KPIツリーで各チャネルの売上と売上シェアが出ます。オーガニックが最大シェア 0.332。感度ランキングは「改善率 × チャネル売上」で KGI 増分を比べたもの。弾力性(売上シェア)は同じチャネル内ならレバーによらず一定ですが、現実の増分は改善率で差がつきます。結果、シェア最大のオーガニックで最も動かしやすい訪問数(+15%)が、KGI を +210万円 増やす最強レバーでした。「弾力性が全部 1 だから、何を上げても同じ」ではなく、**規模(シェア)× 実現可能性(改善率)**で優先順位が決まる——これが KPIツリーで意思決定する勘所です。

⚠️ よくある誤解

関連ノート