【技術Tips】Googleの新MMMツール「Meridian」のドキュメントを読んで新機能について掘り下げる(その1)

前書き

デジタルテクノロジー統括部アナリストの安藤です。

最近マーケティングに関するプロジェクトに携わることになり、Marketing Mix Modeling(以下MMM)の門を叩くことになりました。

MMMでは、広告メディアがどれだけKPIに貢献したのかを回帰モデルによって推定し、それを元に予算の最適化を行います。

変数の値をそのまま使うのではなく、全体的なトレンドや季節性、繰越効果や飽和効果といった要因を扱っていることが特徴です。

MMMの代表的なOSSとしてGoogleのLightweightMMMやMetaのRobynなどが公表されていますが、2024年3月にGoogleから新たなMMMパッケージとしてMeridianが発表されました。Meridianは現在アーリーアクセス中であり、私もまだ使ったことはないのですが、一般公開とともにLightweightMMMの代替になる予定である、とのことです。

私のプロジェクトでもPython環境での使用の容易さからLightweightMMMを使用しており、Meridianへの移行を見据えて本記事ではLightweightMMMと比べた時のMeridianの新機能について掘り下げていきます。

すでに日本語でのMeridianの解説記事としてデータ分析な日々様の記事があるため、二番煎じにはなってしまいますが、可能な限りこちらで書かれていない部分について書いていきます。

data-everyday.com

全2回を予定しており、前半にあたる今回は時変ベースライン、Reach and Frequency データの取り扱い、ROIに事前分布への組み込みを取り扱います。

さらにMeridianには因果推論の考えが取り入れられており、こちらは次回触れる予定です(1-2ヶ月くらいで出せればいいな......)。


モデルの概要

 \displaystyle y_{g,t} = \mu_t + \tau_g + \sum_{c=1}^C\gamma_{g,c}z_{g,t,c} \\\ +\sum_{m=1}^M \beta_{g,m}HillAdStock (\lbrace x_{g,t-s,m} \rbrace_{s=0}^L;\ \alpha_m,ec_m,slope_m ) \\\ +\sum_{n=1}^N \beta_{g,n}^{(rf)}AdStock ( \lbrace r_{g,t-s,n}\cdot Hill ( f_{g,t-s,m};\ ec_n^{(rf)},slope_n^{(rf)} ) \rbrace_{s=0}^L;\alpha_n^{(rf)} ) \\\ +\epsilon_{g,t}

全てのデータは事前にスケーリングされていることを前提としています。
各変数が指し示すものは以下の通りです。

-  g=1, \ldots ,G:地理単位のインデックス
-  t=1, \ldots ,T:時間単位のインデックス
-  c=1, \ldots ,C:制御変数(メディア変数以外の変数)のインデックス
-  m=1, \ldots ,M:メディア変数(Reach and Frequencyデータ**でないもの**)のインデックス
-  n=1, \ldots ,N:メディア変数(reach and frequencyデータ**であるもの**)のインデックス
-  \mu_t:時変ベースライン。詳細は後述
-  \tau_g:地理単位ごとのベースライン。地理単位を考慮しない場合は \tau_b=0
-  \gamma_{g,t,c}:制御変数に対する係数
-  z_{g,t,c}:制御変数の値
-  \beta_{g,m}:メディア変数(Reach and Frequencyデータ**でないもの**)に対する係数
-  \beta_{g,n}^{(rf)}:メディア変数(Reach and Frequencyデータ**であるもの**)に対する係数
-  \lbrace x_{g, t-s, m}\rbrace _{s=0}^L:変数ベクトル  (x_{g,t,m}, x_{g,t-1,m}, \ldots x_{g,t,m})を表す。 Lは最大何期前までを考慮するかを表す整数パラメータ
-  HillAdStock(): Hill() AdStock()を組み合わせたもの。
  `hill_before_adstock = False`(デフォルト)のとき HillAdStock(q;\alpha ,ec, slope) = Hill(AdStock(q;\ \alpha);\ ec, slope)
  `hill_before_adstock = True`(デフォルト)のとき HillAdStock(q;\alpha ,ec, slope) = AdStock(Hill(q;\ ec, slope);\ \alpha)
-  AdStock():投資効果の幾何的減衰を表す関数。
   AdStock(x_t, x_{t-1}, \cdots x_{t-L};\ \alpha) = \large \dfrac{\sum_{s=0}^L\alpha^sx_{t-s}}{\sum_{s=0}^L\alpha^s}
  ただし \alpha \in [0,1]
-  Hill():投資効果の飽和を表す関数。
   Hill(x;\ ec, slope)=\large \dfrac{1}{1+(\frac{x}{ec})^{-slope}}
  ただし ec \gt 0であり、 Hill(x=ec;\ ec, slope)=0.5
  また、 slope \gt 0であり、 0 \lt slope \leq 1の時凹型の、 1 \lt slopeの時S字の形状をとる
-  r_{g, t, n}は地域 g・時間 t・チャンネル nにおけるスケーリングされたReach数
-  f_{g, t, n}は地域 g・時間 t・チャンネル nにおける平均Frequency数
-  \epsilon_{g,t}:正規分布に従う誤差項

一般的なMMMのモデル構造に馴染んだ人であれば、Reach and Frequencyデータに関する部分が追加されていること、トレンドや季節性の部分が時変ベースラインとしてまとめられていることなどが特徴的だと感じるかもしれません。

以降、これらについてさらに詳しく見ていきます。

Reach and Frequency データの取り扱い

通常のMMMでは、インプレッションに関する変数はインプレッションの総数のみを扱い、広告に接触したユーザーのユニーク数については扱いません。

Meridianでは、インプレッションを

- Reach(各期間における広告に接触したユニークユーザー数)

- Frequency(各期間におけるインプレッションの総数をリーチ数で割ったもの。平均接触回数)

に分けて扱うことが出来ます。

もう少し数式を詳しく見ていきましょう。

ある地域 g、チャンネル nにおけるメディア広告の効果は次のように表されます。

 \displaystyle \beta_{g,n}^{(rf)}\cdot AdStock (\lbrace r_{g,t,n}\cdot Hill ( f_{g,t,m};\ ec_n^{(rf)},slope_n^{(rf)})\rbrace_{s=0}^L;\alpha_n^{(rf)} )

最初に、ヒル関数をFrequency数 f_{g,t,m}に適用しています。ヒル関数ではS字型の飽和効果を表現可能です。広告への平均接触回数には特定の適切な頻度があり、想起の強化のために一定以上の接触が必要であるものの、多すぎても意味のない接触になったりかえって広告疲れを起こしたりするおそれがあるという想定です。

一方、Frequency数を固定したもとでは広告の効果とReach数は概ね線形の関係にあると想定し、

 \displaystyle r_{g,t-s,n} Hill ( f_{g,t,m};\ ec_n^{(rf)},slope_n^{(rf)} )

にアドストック関数を適用して広告の効果を推定します。実際にはReachに関しても飽和効果が見られmROIが減少する可能性があるため、観測されたデータにおけるReach数の範囲外に外挿しないことが推奨されています。

Reach and Frequencyデータを用いて予算最適化を行うケースでは、Frequencyを過去の平均に固定するオプションとFrequencyを最適化しつつ予算の最適化を行うオプションが存在します。

Optimization for media channels with reach and frequency dataのページにある通り、最適なFrequencyの推定は予算の割り当てに依存しないため、最適なFrequencyを推定した後その結果を組み込んで予算の配分を行うことが可能です。

時変ベースライン

LightweightMMMでは、時間によって変動する部分は

- トレンド項 \mu t^k
- 季節項 \sum_{d=1}^2( \gamma_{1,d}\cos(\frac{2\pi dt}{52})+\gamma_{1,d}\sin(\frac{2\pi dt}{52}))

の和で表していました(週次データの場合)。

一方、Meridianでは`knot_values`と呼ばれるパラメータに従って時変ベースライン \mu_Tを決定します。`knot`とは日本語で「結び目」を意味する単語です。
以下はSetting Knotsのページに従って解説していきます。

ドキュメントの記述と平仄を合わせるため、少しわかりにくいですが時変ベースラインパラメータのベクトルを \tauとします。 \tau 1 \times Tです。
ここで

 \displaystyle \tau = W \ast b

という形で \tauを表現します。重み行列 W T \times K行列、`knot_values`のベクトル b=( b_1, b_2,\ldots b_k )^T (と呼ばれます)は K \times 1です。

ベイズ推定の対象になるのは bです。

ここは自分の解釈が入ってきてしまうのですが、`knot`は`knot_values`とは別に位置パラメータを持っていると考えるとわかりやすいです。

ドキュメントにはありませんが、議論をわかりやすくするため、`knot` iの位置を l(i)と書くこととします。

各`knot`の位置は T K等分するように決定されます。

 T=9 K=3であるとすると、 l(1)=1, l(2)= 5, l(3)=9となります。

 W T Kとが定まった時点で各 t l(i)とのL1距離によって自動的に決定されます。

 tごとに t以下の最大の l(i)とのL1距離、そして t以上の最小の l(i+1)とのL1距離を取り、その距離に基づいて b_i b_{i+1}の加重平均を取るようなイメージです。

例えば l(i)=6, l(i+1)=11のような`knot`があり、 t=9に興味がある場合のベースラインは

 \displaystyle b_{(i)}\ast ( 1-\dfrac{(9-6)}{(11-6)}) + b_{(i+1)}\ast ( 1-\dfrac{(11-9)}{(11-6)}) = b_{(i)}\ast 0.4 + b_{(i+1)}\ast 0.6

と表現されます。

`knot`の数はバイアスとバリアンスのトレードオフを見ながら決定するべきである、と述べられています。`knot`の数が増えれば時間効果の推定値のバイアスが減少する一方でバリアンスは増加するという関係にあります。

これを踏まえた上で、

- 地理影響を考慮したモデルでは`knot`の数を`n_times`と一致させたところからスタートし、明らかなオーバーフィッティングや非現実的なメディア効果の推定が見られなくなるまで少しずつ`knot`の数を減らしていく

- 地理影響を考慮しないモデルでは`knot`の数を1からスタートし、明らかなオーバーフィッティングや非現実的なメディア効果が見られるようになるまで少しずつ`knot`の数を増やしていく

- `knot`の数を微増・微減させても(例:`knots=10`と`knots=11`)同様の結果が返ってくる可能性が高いため、`knot`の数は幅を持って試すことが有用である

また、`knot`の位置は必ずしも一定ではなく、ユーザーが自由に設定することが可能であり、例えば例えば祝日やスポーツイベントなどの影響を組み込むことが出来るようです。

ROIに関するドメイン知識や実験結果を事前分布に組み込む

すでに経験的な知識や特定のマーケティングに関する実験により、あるチャンネルの(大まかな)ROIがわかっている場合があります。

これまでのMMMツールではROIそのものに事前分布を設定することは出来ず、推定したROIとドメイン知識や実験によるROIが一致するように各種のパラメータや係数の事前分布を試行錯誤する必要がありました。

MeridianではROIを再パラメータ化すること、すなわちメディア効果の係数 \beta_{g,m}をROIの関数として表すことでROIに事前分布を設定し、設計者の信念をモデルに反映させることが容易になりました。

以下、ROI priors for calibrationのページに従って、 \beta_{g,m}をROIの関数として表すための式変形を追っていきます。

あるチャンネル mによる売り上げの増分を次のように表現します。

 \displaystyle IncrementalSales_m=\sum_{g,t}\beta_{g,m}HillAdstock (  \lbrace x_{g,t-s,m}  \rbrace_{s=0}^L; \ \alpha_m,ec_m,slope_m )

まず、この増分を \beta_{g,m}に関連する部分とそうでない部分に分離します。

増分のうち \beta_{g,m}に関連しない部分を
 \displaystyle M_{g,t,m} = HillAdstock (  \lbrace x_{g,t-s,m}  \rbrace_{s=0}^L; \ \alpha_m,ec_m,slope_m  )
とすると、次のように変形できます。

 \displaystyle \sum_{g,t}\beta_{g,m}M_{g,t,m} = IncrementalSales_m \\\ = ROI_m\cdot Cost_m \\\ = ROI_m \sum_{g,t} \tilde{x}_{g,t,m}

後の変形のため、 \beta_{g,m}に関する総和記号を外しておきましょう。

 \displaystyle \beta_{g,m}\sum_{g,t}M_{g,t,m} = ROI_m\tilde{x}_{g,t,m}

`media_effects_dist = Normal`の場合、 Z_{g,m} \overset{i.i.d.}{\sim} Normal(0,1)を用いて \beta_{g,m}は次のように書くことができます。(`media_effects_dist = Normal`の場合の議論はドキュメントを参照してください)

 \displaystyle \beta_{g,m}=\beta_m+\eta_mZ_{g,m}

従って、 \beta_mを主語にすると

 \displaystyle \beta_m =\beta_{g,m} - \eta_mZ_{g,m} \\\ =\dfrac{ROI_m\tilde{x}_{g,t,m}}{\sum_{g,t}M_{g,t,m}} - \eta_mZ_{g,m} \\\ =\dfrac{ROI_m\tilde{x}_{g,t,m} - \eta_m\sum_{g,t}Z_{g,m}M_{g,t,m}}{\sum_{g,t}M_{g,t,m}} \\\ = F(ROI_m;\ \alpha_m, slope_m, ec_m, \lbrace Z_{g,m}\rbrace _{g=1}^G)

となり、 \beta_mをROIに関する関数として書くことができました。

感想

ReachデータとFrequencyデータの活用について、観測範囲外のReach数の場合にモデルを外挿すべきではないというのは結構大きな制約ですが、それでも適切なFrequenctyを決定するための戦略決定に使えるのは嬉しいです。

また、今までトレンド+季節性で表現していた時変項目がMeridianのように特定の構造を持たないパラメータのベクトルで表現されるようになることでどう変わるのかというのは気になりますね。モデルの構造が複雑になればなるほど、解釈をするアナリストの数理的知識が試されるようになりそうです。

さらに、データ集めにも苦労することになりそうなのは言うまでもないですね......!GoogleとしてはGoogle Marketing Platformを使って欲しいという狙いがあるように見えます。こうしたプラットフォームを使わずにデータを蓄積していくのは大変ではありますが、「理論的にはこういうデータがあるとよい」というのがわかっていればその条件を満たすようにデータを集める仕組みを整えていけばよいわけですから、MMMを知ることでデータ収集やデータモデリング戦略にもプラスになると言えるでしょう。

また、これはLightweightMMMにもRobynにもないのですが、競合のデータを扱うフレームワークがあればさらに嬉しいなと感じます。例えば競合他社のTVCMのGRPや指名検索数などのデータが入手できているケースがあり、当然KPIに大きな影響をもたらしうる項目なのですが、残念ながらこれらをサポートするような機能はなさそうです(もちろんコントロール変数として組み入れることはできるのですが......)。

次回はMeridianがどのような形で因果推論の考え方を取り入れているのかについて解説していきます。

記事執筆者


*

安藤 有瑠聡

パーソルキャリア株式会社
デジタルテクノロジー統括部 デジタルビジネス部 アナリティクスグループ

2022年パーソルキャリア株式会社に入社。現在はアナリストとしてAzure MLを利用した社内アプリケーションのモニタリング、求人推薦アルゴリズムの開発、因果推論を活かした営業支援のための分析、社内データ基盤プロジェクトの横断調査など、幅広い分野の業務を行っている。