MMM(マーケティングミックスモデル)をRobynでやってみた

この記事は?

マーケティングミックスモデル(MMM)を、facebookが開発しているRライブラリ(Robyn)でやってみた記事です。

MMMとは?

MMMを何のために使うか?

広告を出している企業にとって、チャネルごとの適切なコスト配分は最も気にするポイントですよね。であれば、過去の実績からその問いに答えられるのではないでしょうか。

MMMは何を行うのか

一般的には、売上データと各種チャネルの投資額、その他売り上げに影響を及ぼすさまざまな要因の時系列データの間の関係を仮定し、その仮定のもとで売り上げを各チャネルの貢献量に分解するアルゴリズムです。
たとえば、ある企業が、Web広告、交通広告、TV広告を出していて、売り上げにそれぞれどれだけ貢献しているかを把握したがっているとします。これらのデータだけでも売り上げへの貢献量を各チャネルに分解できるでしょう。 f:id:wata101wata:20210124235832j:plain しかし、この企業がアイスクリーム屋だとすると、夏場に売り上げが上がることになりますが、このままだとこの売り上げの向上量も各広告の効果であると解釈されてしまいます。であれば、気温データを追加して、この気温による効果による売り上げ貢献もあると仮定することが良いでしょう。 f:id:wata101wata:20210125000335j:plain このように様々な時系列データを追加して、売り上げを様々な効果に分解していくことがMMMの行っていることです。*1

RobynでMMMやってみた

チュートリアルでの問題設定

Robynのチュートリアルでは、次の仮定を置いて問いに答えようとしています。 f:id:wata101wata:20210125012611j:plain 例えば、Facebookへの投資額は、インプレッション数に影響を与え、インプレッション数がさらに売り上げへ影響を及ぼすと考えます。このように、広告の投資額から売り上げへ直接の効果を考えるのではなく、中間の指標を用いることによってモデルの精度が上がる場合があります。
実際に分析していくデータは次のようなものです。

f:id:wata101wata:20210125011442p:plain
時系列データ
f:id:wata101wata:20210125011517p:plain
休日データ
時系列データのカラム定義を次にまとめます。

カラム名 説明
DATE 日付
revenue 売り上げ
tv_S TV広告への投資量
ooh_S OOH広告への投資量
print_S 印刷媒体広告への投資量
search_S 検索エンジン広告への投資量
facebook_S Facebook広告への投資量
search_clicks_P 検索エンジンでの広告のクリック数
facebook_I  Facebook広告のインプレッション数
competitor_sales_B ある同分野競合他社の売り上げ

ほとんど上記で置いた仮定と対応したカラムです。competitor_sales_Bは業界全体に影響を及ぼす効果をこれで測定できるとします。

プログラムの実行

ここはRobynのドキュメントに従って実行しただけです。

アウトプットの解釈

Robynは様々なプロットを出してくれます。これらを見ていけば売り上げの各要因の寄与と、モデルの妥当を確かめていくことができます。

問いに答えるためのアウトプット(クライアントに見せる系)

各要因の売り上げへの寄与割合

全期間で平均したときの各要因の売り上げへの寄与割合です。 f:id:wata101wata:20210125153304p:plain 図からわかることは、

  • 広告全体による売り上げの寄与割合は約20%でした。つまり、広告を出さなかったらおそらく売り上げは8割になります。
  • 検索エンジンの寄与は0%でした。このチャネルには投資しなくてよさそうです。

などがわかります。

時系列での各要因の売り上げへの寄与量

時系列で各要因の売り上げへの寄与量を確かめてみます。 f:id:wata101wata:20210125154203p:plain 時系列でみて特徴的な部分がわかります。

  • 12,1月が売上のピークで、4,5月が谷のようです。(なんの企業なんでしょうね?)
  • ときどき絶大な効果を持つ休日があります。なぜ売り上げが上がっているかを深堀すれば、広告の施策に生かせるかもしれません。

各チャネルのROI

各チャネルの効率性を表す図です。全期間での投資量の合計に対して、売り上げへの寄与量が上回っていれば1より大きくなります。 f:id:wata101wata:20210125155802p:plain

  • 印刷媒体は投資量は最も少なかったですが、効率性は最も高いです。ここには投資額を増やしてもよさそうですね。
  • 逆にOOH広告、Facebook広告、検索エンジン広告は効率性が1より小さいので投資額を減らすべきでしょう。

ここでの注意点は、この図だけでは最適な投資配分が決められないということです。広告の投資額とリターンの関係は、diminidhing returnであると仮定されることが一般的です。つまり、投資額が小さいうちは効率が良く、投資額が大きくなると効率が悪くなります。 f:id:wata101wata:20210125160758p:plain よって、最適な投資配分を求めるためには、このグラフを各チャネルに対してプロットする必要があります。

各チャネルの反応曲線

各チャネルの反応曲線をプロットしました。*2 f:id:wata101wata:20210126231127p:plain f:id:wata101wata:20210126231137p:plain 列が各チャネル、上段のピンク色の線が反応曲線、上段の青線が利益、下段がROIです。よって、最適な投資額は青線が最も上に来たときの横軸となります。印刷媒体は21290であると読み取れますね。(他はプロットの仕方が悪く、つぶれてしまってよくわかりません。。。)
反応曲線を描ければ、残りの2つも描けます。投資額が x であるときの利益は、反応曲線を0から x まで積分した値から x を引けば求められます。また、ROIは反応曲線の微分です。

最適コスト配分

最適な投資配分です。注意点としては検索エンジンチャンネルは効果0なのでうまく計算できず、それを取り除いた前提でのプロットです。 f:id:wata101wata:20210126233042p:plain 上でROIを確認し、TVとFacebookチャネルは効率が低く、ほかの2つが高いことがわかっていたので、それと整合している結果になっています。トータルのコストを変えることなく、1.3%の売上額向上が見込めそうです。

分析の妥当性を確かめるためのアウトプット(分析者が裏で確かめておく系)

売り上げデータの当てはまり

一般的な時系列モデルの性能の確かめ方は、ある時点までのデータからモデリングして、その時点以降のデータにどれだけ当てはまっているかで評価します。まずはモデルが出力する売り上げデータと実績を比べてみましょう。 f:id:wata101wata:20210125162741p:plain テストデータに対するMAPEは約10%でした。売り上げが数千万単位の10%なので、十分な性能といえるでしょう。

残差プロット

予測と実績の差を残差といいます。この残差を3つの観点でプロットしてくれます。 f:id:wata101wata:20210125184232p:plain 残差分析では、さらにモデルの性能を上げるためのアイデアが得られることがあります。例えば、今回は観測値が極端な部分で予測精度が悪くなる傾向がみられます。これを予測できるような要因を思いつけば、それを観測してモデルに組み込むことによりモデルの性能が上がることがあります。

感想とまとめ

Robynを使用すれば、各種時系列データをインプットすることにより、MMMに必要なアウトプットが一通り得られました。
便利だと思う一方、まだドキュメントが充実してなかったり、プロットがすごくみにくいのが難点かなと思いました。中身のアルゴリズムに関してはこれから勉強して聞こうと思います。

*1:数式で理解できてないです。。。良い参考書があれば教えてください。

*2:正直めっちゃ見づらいです。この辺改善希望ですね。