RAKSUL TechBlog

RAKSULグループのエンジニアが技術トピックを発信するブログです

CausalImpactのアンチパターン

この記事は ノバセル Advent Calendar 6日目です。

こんにちは。ノバセルでデータサイエンティストをしている宮野です。

本記事では、CausalImpactを用いた効果検証および意思決定をする際に、気をつけたほうがいいポイントをアンチパターンとして紹介いたします。

はじめに

数年前に比べて、データサイエンティストやアナリストだけでなく、プロダクトマネージャーやマーケターなど、データ活用が進む中でCausalImpactの概念を理解する人々が増えているように感じます。しかし、その一方でデータを与えるだけで結果を得られるため、誤った結果を導くケースもあります。

CausalImpactの本質は、「もし施策を実施しなかったら、どうなっていたか」という仮想の世界(反実仮想)を作り出し、実際の結果と比較することで、純粋な施策効果を測定する手法です。

本記事では、より良い意思決定を実現するために、CausalImpactを使用する際のアンチパターンをシミュレーションし紹介します。分析者はもちろん、ビジネスサイド側の方々がアンチパターンを知っておくことで、分析結果から議論に発展したり、より良い意思決定を行うための参考になれば幸いです。

なお今回の内容は、以下の記事を参考にしています。 ill-identified.hatenablog.com

アンチパターンを確認するうえで、基準となるものを用意

以降でアンチパターンのシミュレーション結果を確認するために、まずは基準となるデータを用意し、CausalImpactを実行して結果を確認します。

用意したデータをプロットしたものが図 1です。縦の点線は施策が実施された日(介入日)を表します。

  • 上段
    • y(緑の実線):実際に観測された目的変数
    • y.cf_true(青の点線):介入がなかった場合の目的変数 ※本来は観測できない
  • 下段
    • covariate(ピンクの実線):共変量

図 1:利用データのプロット

ycovariateを用いてCausalImpactを実行した結果が図 2です。

図 2:CausalImpactの結果

分析に利用したデータとCausalImpactで得られた推定値、本来は観測できないy.cf_true(介入がなかった場合の目的変数)を用いて、それぞれの関係を可視化します(図 3)。

  1. 左上:outcome
    • 3種類の目的変数
      • 実際に観測された値
      • 本来は観測できない介入がなかった場合の値
      • CausalImpactによって得られた推定値(95%信用区間)
  2. 右上:共変量
    • 共変量
  3. 左下:効果(差分)
    • 介入効果
      • 真の効果:実際に観測された値 - 本来は観測できない介入がなかった場合の値
      • 推定された効果:実際に観測された値 - CausalImpactによって得られた反実仮想の推定値
  4. 右下:累積効果
    • 介入効果の累積
      • 真の効果の累積
      • 推定された効果の累積

図 3:実際には観測できない真の値を用いた推定結果との比較

以降、このデータを改変しながらアンチパターンのシミュレーションをし結果を確認していきます。

アンチパターンのシミュレーション

アンチパターン 1:共変量シフト

CausalImpactは共変量が介入の前後で傾向が変わらないと仮定しています。

介入後に共変量の傾向が変化してしまう現象を共変量シフト呼びます。共変量シフトが発生する例として、以下のようなものがあります。

  • TVCMの非放映エリアを共変量としていたが、競合他社が非放映エリアでキャンペーンを実施し、自社にもその影響があった
  • 類似商品の流入数を共変量にしたが、施策によって類似商品のカニバリゼーションが発生し、傾向が変化してしまった

ここでは共変量に対し、介入日以降のデータを操作(値の加算や減算)し、共変量シフトを発生させます。プラス方向に共変量をシフトさせた結果が図 4、マイナス方向に共変量をシフトさせた結果が図 5です。

図 4:アンチパターン1_1 プラス方向に共変量シフトを発生させた結果

図 5:アンチパターン1_2 マイナス方向に共変量シフトを発生させた結果

プラス方向に共変量シフトを発生させた場合には、推定値が真の値より上振れるため、効果が過小評価されています。逆にマイナス方向に共変量シフトを発生させた場合は、効果が過大評価されていることがわかります。

共変量シフトの解決策として、介入前後の傾向(分布)が変わらないことを確認することや、複数の共変量を用いることがあげられます。

アンチパターン 2:非線形性(獲得できる数が飽和する)

CausalImpactは、介入効果が線形であることを仮定しています。しかし実際のビジネスでは、効果が時間とともに非線形に変化することがよくあります。例えば以下のような場合です。

  • 新規顧客獲得施策では、ターゲット層の規模に上限があるため、時間とともに獲得数が逓減
  • キャンペーンによる売上増加効果が、市場の飽和により徐々に低下
  • 広告効果が露出回数の増加とともに逓減し、一定水準で頭打ち

効果が飽和(サチュレーション)するケースをシミュレーションした結果を図 6に示します。

図 6:アンチパターン2 非線形性(獲得できる数が飽和する)の結果

図ではわかりにくいですが、介入日以降では時間経過とともに獲得できる数がだんだん少なくなっていくことを表現しています。そのため、実際の効果より推定値が過大評価されています。

今回のシミュレーションデータではうまく表現できていませんが、飽和を考慮しないモデリングでは、効果(差分)の推定値が右肩上がりになり、真の値から乖離していきます(イメージ:図 7)。

図 7:非線形性(飽和)を表現できなかった場合の効果のイメージ

シミュレーションのように、CausalImpactでは非線形な介入効果を正確に捉えられない可能性がありますが、介入効果が線形に近似できる場合(そもそもサチュレーションを起こさない)や、介入後の短期的な効果分析に焦点を当てる場合(サチュレーションを起こす手前まで)には依然として有効です。

一方、長期的な効果分析を行う際など、介入効果が明らかに非線形である場合は、CausalImpactのデフォルトモデルではなく、bsts(ベイズ構造時系列モデル)を用いてより柔軟なモデルを構築する方法などがあります。

アンチパターン 3:未観測の外部要因(周期性やトレンドの考慮漏れ)

未観測の外部要因が結果に影響を与える場合があります。今回は簡単な例として季節性を例としてあげます。

CausalImpactは、デフォルトでは季節性が考慮されていません。シミュレーションでは、目的変数に週次の周期性を加えてモデリングを行った結果を図 8に示します。

図 8:アンチパターン 3:未観測の外部要因(周期性の考慮漏れ)の結果

左上の図から、うまく目的変数が推定できていないことがわかります。左下の図からは効果(差分)に周期的な差分が発生していることがわかります。

解決策として以下のような方法があります。

  • CausalImpactには手動で周期性を考慮させるようなパラメータがあるため利用する(結果:図 9)
  • 同じような周期性がある共変量を選択する(結果:図 10)

図 9:アンチパターン 3の解決策 1 - 周期性を指定するパラメータを設定
図 10:アンチパターン 3の解決策 2 - 同じような周期性がある共変量を選択

まとめ

シミュレーションを通してCausalImpactがうまくいかないパターンを確認しました。手軽に利用できるからこそ考慮しないといけない点は多く、誤用されるケースも多いのではないかと思いました。

CausalImpactは非常に便利な手法であることに変わりはありません。実際にモデリングの作業をするしないに関わらず、CausalImpactを活用する方々は、今回のようなことを知っておくことで、信頼性の高い分析と意思決定が行えるようになれば幸いです。

本記事のシミュレーションで利用したコードです。 github.com