[想定している読者像]
施策の適切な検証方法に悩んでいる事業会社のマーケテイング担当者様。データサイエンティストの方。

[コンテンツ属性]
ビジネス:★★★☆☆
データアナリティクス:★★★★★
エンジニアリング:★☆☆☆☆

2023/2/13 一部訂正

広告代理店様からキャンペーンや施策などの成果分析に関するご相談を受けることが増えてきました。これは広告主様自体がマーケティング投資の費用対効果に対して厳しく目を向け始めたことが背景にあると考えられます。

一般的にこのような成果分析は「統計的因果推論」といわれるフレームワークを用いて行われることが最近のトレンドです。一番簡単な手法は「A/Bテスト」であり、マーケティングに関わる仕事をされている方は一度は耳にしたことがあると思います。

本稿では統計的因果推論の最新の手法の一つであるcausal impactについての紹介をします。なお内容十分に調査をしたうえで記述しておりますが、もし間違いなどございましたらご連絡いただければ幸いです。

Causal Impact

因果関係と推論

因果推論とは、ある事象が他の変数に直接与える影響を統計的に推論することです。因果関係と間違えやすい概念に相関関係があります。

因果推論の手法としてのCausal Impact

Causal Impact(Brodersen KH et al. (2015))とは昨今注目されている因果推論のフレームワークです。

キャンペーン効果を測定するには

ある事象(マーケティングならば広告やCP施策)の影響を推定するにはどうしたらよいでしょうか?
例えばCP効果を推定する場合、ある人がCP対象であった場合と、そうでない場合の売上を比較すれば良いとすぐに思いつきます。個人ではばらつくためまとまったグループでその平均を持ってキャンペーンの効果とすると、
(式1) キャンペーン対象であった場合の売上平均 – そうでなかった場合の売上平均
として効果を測定できそうです。
上記の方法で以下の例のCP効果を計算すると平均してキャンペーン効果による増分は40円です。しかしCP対象であった場合とそうでなかった場合の両方を同一人物で計算することは不可能ですよね。SFの世界ならば、Aさんがキャンペーン対象であった世界線と、そうでなかった場合世界線を比較することはできそうですが、現実はこの片方のみしか観測できないはずです。

因果推論の骨子

前項の議論より一般的に得られるデータは以下のようなものになります。「?」に該当するものを何かしらで推定し、(式1)に相当する量を計算することが因果推論の骨子となります。

そこで(式1)に相当する量の候補として「対象者全員の平均売上 – 非対象者全員の平均売上」を考えます。

しかしもともとCP対象者は購買意欲が高い層が選ばれやすいなどのバイアスがある場合、正しくCPの効果を推定できません。

ランダム化実験

このような選択バイアスを回避する方法がランダム化実験(RCT)です。

しかしビジネス上の制約などで、ランダム化実験を行うのは難しいというの実情です。

交絡因子での層別

ランダム化が難しい場合、CP対象かそうでないかに対して影響を与える交絡因子と言われる因子で層別し、比較するというのが因果推論の処方箋です。これが交絡因子に置ける調整法です。

差分の差分法

何らかの理由により重回帰や層別が適さない場合や、交絡因子多すぎて明示できないなどの場合などに適した差分の差分法という手法があります。実務的には介入群とそうでない群があまりにも異なる場合、例えば政策の評価などに用いられるようです。

直感的にはキャンペーン対象群と非対称群の2群を考え、キャンペーン前の2群の(売上などの)差分とキャンペーン後の差分の差分を考えることでキャンペーンの効果を測定します。

[画像参照元 https://towardsdatascience.com/establishing-causality-part-4-5d3b5e917790]

Causal Impact

Causal Impactはより一般的な手法です。差分の差分法では特定の2つ時点の差を対象としていましたが、当然介入の効果は経過時間により変わりうるため、時点の選び方によっては正しく効果を推定できない可能性があります。

効果を測りたい成果変数に対して説明力をもち、介入(CPや広告)の影響を受けない共変量を用いて反実仮想(の時系列)を推定し、その差分を介入効果とします。

[画像参照元 https://google.github.io/CausalImpact/CausalImpact.html]

Causal Impact 実践

以下のような架空のデータを用いてCausal Impactの実践を行います。この実行にはGoogleにより開発されたR用のCausal Impactパッケージを用います。1https://google.github.io/CausalImpact/CausalImpact.htmlこれをpython版に拡張したものものあり。https://github.com/WillianFuks/tfcausalimpact

まずはCausalImpactパッケージをインストールし、読み込みます。これ以降のpgmと使用データは https://github.com/mitsu666/CausalImpact-demo- からダウンロード可能です。

# include
install.packages("CausalImpact")
library(CausalImpact)
# fold確認
getwd()
# fold移動
setwd("dev/CausalImpact")
# 0. read_table
data = read.csv(file = "data.csv")

データの中身を確認します。

# 1. データ確認
# 1.1 時系列index入力
time.points <- seq.Date(as.Date("2022-01-01"), by = 1, length.out = 100)
data <- zoo(data, time.points)
# 1.2 plot
matplot(data, type = "l")

解析を開始します。

# 2. 解析開始
# 2.1 キャンペーン開始と終了時期を入力
pre.period <- as.Date(c("2022-01-01", "2022-03-11"))
post.period <- as.Date(c("2022-03-12", "2022-04-10"))
# 2.2 解析
impact <- CausalImpact(data, pre.period, post.period)
plot(impact)

plotの出力を確認を確認します。

結果を可視化します。

# 2.3 結果可視化
summary(impact)

レポートの詳細を英文で出力します(DeepLで翻訳)。

# レポート詳細
summary(impact, "report")
# テーブルで出力
impact$summary

CPの費用対効果を求めCPを評価します。[マーケティングROI (MROI) := CP累積効果 / CP費用]とします。

# 4. MROIを求める
# キャンペーン投下費用
cost = 400
(impact$summary$AbsEffect[2] / 400) * 100

という感じでキャンペーンの評価ができました。
キャンペーンの効果測定などのお問い合わせは、株式会社Crosstabまでお願い致します。

以下を参考にしました

  • https://google.github.io/CausalImpact/CausalImpact.html
  • https://towardsdatascience.com/establishing-causality-part-4-5d3b5e917790
  • 調査観察データの統計科学―因果推論・選択バイアス・データ融合 星野 崇宏 (著)
  • Kay H. Brodersen et al.[2015] https://arxiv.org/pdf/1506.00356.pdf
  • http://yukiyanai.github.io/jp/classes/econometrics2/contents/slides/metrics2_topic06_slides_pub.pdf 
  • 1
    https://google.github.io/CausalImpact/CausalImpact.htmlこれをpython版に拡張したものものあり。https://github.com/WillianFuks/tfcausalimpact