MMM(Marketing Mix Modeling)を内製化した話

nardtree
DeNAデータ分析ブログ
14 min readMay 11, 2023

--

はじめに

世界的な個人情報保護の流れが加速しています。AppleのiOSでは明示的にトラッキングの同意取得を行わないとデバイス単位のターゲティング(以下、識別子を用いたターゲティング)がほぼできないということがあります。 このため、識別子を取得しづらくなった広告やSNSのプロモーション施策は、KGI/KPIに対してどの程度の寄与であったか見づらくなるという影響があります。

図1. 社内のプレゼン資料

これらの課題に対する答えとして、MMM(Marketing Mix Modeling)という技術があります。MMMを自社で設計・開発し、業務に利用したので、良かった点・苦労した点など、巷で語られるMMMのメリット以外のデメリットについてもご紹介いたします。

MMMのできるとされていること

  • インプレッション・投資金額・クリック数などの値を変数にして広告の効果を予測する/見積もる
  • cookieやIDFAが取得できない場合の広告評価の代替
  • インフルエンサーマーケティングなど、効果量が分かりづらいものを見積もる
図2. MMMのモデルの一つの例

(実際に体感した)MMMの得意なこと苦手なこと

MMMとはインターネットで検索を行うとあたかも簡単に広告などのマーケティング施策のパフォーマンスが予測できるかのような表現で宣伝されている技術ですが(2023年現在)、得意なことと苦手なことがそれぞれ存在します。

得意なこと

  • 視覚的にわかりやすい因果関係の図の構築
  • クイックな仮説ベースの検証

苦手なこと

  • 正確なパフォーマンスの予測

グラフ状のアウトプットになるので理解しやすいアウトプットになりますが、線形モデルを使用する関係で正確な効果予測に関しては、因果推論のフレームワークより粗い値になりがちです。一方で、因果推論のフレームワークの適用条件は厳しく、反実仮想を計算するために配信をしていた時期と配信をしていなかった時期の双方の十分なデータが必要になりますが、現実的にそのような実験を行うことは難しいことが多くなります。結果として、MMMの精度で妥協することが最適であるケースが多いです。

MMMの実現方法

(頻度主義的な)重回帰分析

  • 目的変数を全体のダウンロード数とする
  • 説明変数をインプレッション数とする
  • 予算に関連する現実的な制約条件を設ける

ベイジアンの重回帰分析

  • 目的変数を全体のダウンロード数とする
  • 予算で初期分布を設定し、フィッティングを行う

頻度主義的なアプローチもベイジアンのアプローチも、制約条件に仮定を入れるか事前分布に仮定を入れるかの差はありますが、各広告に投資した金額 ≒ 人間が期待している効果量 を仮定に用いる点は本質的に同じになります。

キャリーオーバー効果と形状効果

MMMでは広告の効果量は累積し時間に応じて減衰するというキャリーオーバー効果という仮説があります。

また、広告はたくさん見ても限界がありそれ以上は効果がないという仮説を形状効果といいます。

オープンソースのMMM製品の概要と特徴

MaMiMo

  • オープンソースのMMMライブラリ
  • 重回帰分析をベースに、形状効果・キャリーオーバーの推定を行うことができる
  • scikit-learnをベースとしているため、コードに手を入れやすい

これをフォークし、DeNA用のビジネス要件に合致するように機能の拡張・カスタマイズを行いました

Lightweight-MMM

  • Googleの内部プロジェクトのMMM
  • ベイジアンの重回帰
  • 広告メニューの投資金額 = 初期分布を与える

Robyn

  • Meta社のプロジェクトのMMM
  • 主にRでの利用を想定しているようである
  • 新興のプロジェクトのため調査中

一般的なMMMを行う上での課題点

データの完全性

  • 他の資料では内生性と言われることが多いですが、取得したデータに対して誤差や欠損が含まれないということでデータの完全性という言葉で代替しても良いように思われます
  • 相関の強さとその広告の効果の強さが関連しているとの大前提がある以上当然なのですが、本当はすごく効果が高い広告であってもインプレッション、コストの測定結果に誤り・欠損を含むと相関が弱くなり、MMMでの見かけ上のパフォーマンスが悪化します

多重共線性

  • あるパラメータがもう一つのパラメータと相関していると、説明変数として強力な方に効果量が吸収されてしまう・多くの説明変数間の偶然の相関により、誤差が生じる現象のことです
  • 多くの説明変数を扱うので当然起こりうることなのですが、機械学習ではこれらに対して目的変数への精度という意味では、正則化をうまく使う、k-foldを行うなど様々なテクニックが存在しています
  • 今回、モデルに仮説を挿入することでこの影響を小さくしています

見せかけの相関

  • 具体例としては、夏であればアイスが売れるのは必然であるが、夏だけに行っていたキャンペーンとアイスの売上が相関してしまうような事象のことです
  • 変数を入れるときには細心の注意を払う
  • 説明変数をむやみに増やしすぎない

Google社の研究によると、MMMのモデリングでは不偏推定量は得られない

  • これは、最も最適なモデルは存在していないということになります
  • 何らかのアドホックやヒューリスティックで妥協するという戦略も十分とり得えるということになります

作成したMMMの重回帰

一般的に重回帰はこの様になっています

L1正則化をつけると以下の式を最小化することになります

これだと問題があります。

1つ目は、yを推定するために様々なwの付け方が生じてしまいます。今回のデータは人間の行動の結果なので、ある程度のランダムネスを含むので、純粋に最小化しようとすると局所解に陥り、実態とかけ離れてしまいます。

2つ目は、L1正則化の特性により、説明力が弱いwに強いペナルティを与えることで0に近づけます。これにより簡潔で簡単なモデルを得ることができ、オーバフィットしづらいなどのメリットがありますが、MMMのようなユースケースで用いる場合、効果量が小さい広告が0に落ちてしまい、正確な見積もりができにくくなるというデメリットがあります。

そこで以下の最小化関数を用いて最小化を行いました。

  • h ; 予算・実績表から得られる期待するインストール数
  • c ; 予算・実績表から得られる期待するオーガニック数
  • H;影響度をコントロールするハイパーパラメータ

具体的な実装コード

実際に業務に使用したコードの一部をシェアします。なお、ハードコードされた社内の機密等になるような箇所に関しては変更されている点にご注意ください。

scikit-learnのインターフェイスになるように自分たちで回帰クラスを定義しました。 広告の累積効果、その量をランダムなパラメータに行い、最適な値を探索しています。

最適化のアルゴリズムにはL-BFGS-Gを利用し、パラメータの探索範囲を0 < w < ∞としています

import numpy as np
from scipy import optimize

class MMMRegressor():
def __init__(self, use_intercept=False):
self.coef_ = None
self.use_intercept = use_intercept

def fit(self, X: np.ndarray, y: np.ndarray):
if self.use_intercept == True:
X_ = np.hstack([X, np.ones(len(X)).reshape((len(X), 1))])
else:
X_ = X
# 最小化関数
def minimize_func(_x):
tmp = np.zeros(len(X_))
for i in range(len(_x)):
tmp += _x[i] * X_[:, i]
loss = ((y - tmp)**2).sum()
if self.use_intercept:
loss += ((COSTANT - _x[-1] * X_[:, -1])**2).sum() / HC
else:
loss += 0.0
for idx in range(N):
hp0 = 2
loss += (np.abs(EXP[idx] - _x[idx] * X_[:, idx])**hp0).sum() / H[idx]
return loss

# 境界
bounds = [(0, np.inf) for _ in range(X_.shape[1]) ]
w = np.zeros(X_.shape[1]) + 0.1
ret = optimize.minimize(minimize_func, x0=w, method=method, bounds=bounds, options={'eps': 1e-2, } )
r = ret.x

# self.coefのセット
if self.use_intercept:
self.coef_ = r[:-1]
self.intercept_ = r[-1]
else:
self.coef_ = r
self.intercept_ = 0.0
return self

def predict(self, X: np.ndarray):
tmp = np.zeros(len(X))
for i in range(len(self.coef_)):
tmp += self.coef_[i] * X[:, i]
tmp += self.intercept_
return tmp

この独自に実装した回帰クラスを用いて、キャリーオーバー効果がどの程度あったら、形状効果がどの程度あったらを探索するパイプラインを構築し、様々なパターンを検証します。

from mamimo.carryover import Carryover
from mamimo.saturation import Saturation
from sklearn.compose import ColumnTransformer
from sklearn.pipeline import Pipeline

preprocess = ColumnTransformer(
[
('広告1_pipe', Pipeline([
('carryover', Carryover()),
('saturation', Saturation())
]), ['広告1']),
('広告2_pipe', Pipeline([
('carryover', Carryover()),
('saturation', Saturation())
]), ['広告2']),
('広告3_pipe', Pipeline([
('carryover', Carryover()),
('saturation', Saturation())
]), ['広告3']),
]
)

regressor = MMMRegressorWrapper()
model = Pipeline([
('preprocess', preprocess),
('regression', regressor)
])

アウトプット

感覚値に頼っていた部分の検算

DeNAでは正確にパフォーマンスが測定できないところでは、別のデータソースと経験則を組み合わせて、広告パフォーマンス x 定数 という形でそれぞれの広告に対して真のパフォーマンスを見積もっていました。これの確実性がなかったこともあり、MMMでの検算ができました。

図 3. デジタルマーケティングが考える広告パフォーマンスとMMMの推論値の比較

MMMであるからわかるパフォーマンス

一部、人間の把握する広告のパフォーマンスに対して乖離が大きかったものがありました。 主に認知周りの広告である広告6が想定より高いパフォーマンスを持っていると示され、ダウンロードへの道筋が短い広告が想定より低いとされました。 一見すると、KGI/KPIがあまり高くない広告であっても、間接的にユーザの行動に寄与し、より直接的なダウンロードに寄与する効果があるだろう仮説が立ちます。 このように、効果が見えにくいものであっても評価しうる点がMMMの大きな価値の一つです。

MMMを行う上で大変であった点

ベイジアンのMMMも今回実装したMMMも、投資した金額とパフォーマンスが関連するという仮定を挿入したモデルになっています。 そのため、投資した金額に大きく見合わないパフォーマンスを持つ広告・マーケティング施策が存在していると、全体の推定が正しく見積もられません。 MMMは一見するとデータのみから広告効果を予測できる万能のツールに見えますが、実態は様々なビジネス的な仮定を内在したモデルになっています。このため、広告の運用を行っている人の感覚値は重要なシグナルとなるので、分析者は現場との密なコミュニケーションが必要になります。

単純に広告メニューを見積もるだけでないMMM

広告効果に依存しないインストールであるオーガニックの部分は、SNSのバズの影響を受けると考えられてきましたが、その効果量は未知数でした。 今回、オーガニックのうち何割かはSNSの影響だろうと考え、Instagram, TikTok, YouTubeの視聴数の効果の見積もりを行ったところ、影響度の大きさの大小を見積もることができました。 今後、運用が活発化していくであろうSNSでのインフルエンサーマーケティングにおいても、投資対効果が高いSNS・インフルエンサーを狙うことは喫緊の課題であり、この分野にもMMMが使用できる可能性があります。

MMM以外の効果量の推定という意味で適切な手法は?

MMMは説明力を重視し、すべての広告を単一モデルで扱うという特性上、純粋な効果量を推定する意味では適切にワークしないことがあります。 もう一つの代替的な手法として、考えられるのが因果推論のフレームワークで最初に効果量を計算しその結果を用いてMMMの期待値を設定することも考えられます。

最後に

DeNAではマーケティング分析・データサイエンスを行う人材を募集しています。
データ基盤を背景に様々なデータを用いて、様々な仮説検証を日々行っております。旧来からある安定した手法を用いることもありますし、最先端のChatGPTのようなアルゴリズムも使用することがあります。
問題に対して適切な手法と仮説を設定し、周りの人とともに解き明かしていくのは、非常に楽しい作業です。
ご興味を持った方はぜひご応募ください。

著者紹介

この投稿はgimpei.kobayashiとkoki.domaeの共著で執筆されました。

gimpei.kobayashi; データ本部 ネットワーク・マーケティンググループ所属。2020年に育休を取得し、育休後からマーケティング × AIを担当している。最近は2歳になった娘のイヤイヤ期が大変。

koki.domae; マーケティング統括部マーケティングアナリティクスグループ所属。マーケティングを科学したいからスタートし、DSやAI活用し始める。0歳児の子育てに奮闘中。

参考文献

--

--