elsur.jpn.org >

« 読了:Soukhoroukova, Spann, & Skiera (2001) 新アイデアの仮想市場を社内で開設 | メイン | 読了:Gilbert & Meijer (2005) 時系列因子分析TSFA »

2014年9月16日 (火)

Brodensen, K.H., Gallusser, F., Koehler, J., Remy, N., Scott, S.L. (2014) Inferring Causal Impact Using Bayesian Structual Time-Series Models. Technical Report, Google.
 先日Googleの人がリリースした、RのCausalImpactパッケージの基になっている論文。どこかに投稿中である由。
 本当はパッケージをいじりながら慣れていけばいいんだろうけれど、どうしてもそういう勉強のしかたができなくて... こういうフォーマルな文章を先に読んでおかないと、落ち着かないのである。効率が悪いなあ、とため息。

 えーっと、いまをときめくデータサイエンティスト(っておっしゃるんですかね)の皆様にではなく、私のような哀れな文系ユーザ向けに、このパッケージが持つ意味をどう説明するか ... と考えながら読んでいたのだが、要するにこういうことだと思う。
 いま、あるブランドのためのなにかのマーケティング・アクションが行われたとしましょう。広告とか販促とか。で、なにか結果指標があるとしましょう。売上とかイメージとか。アクションの効果を推定するためにはどうするか。
 一番簡単なのは、そのアクションが行われる前と後との間で、結果指標の変化を調べることである。話を簡単にするために、売上の差を調べる、ということにしましょう。
 たちまち、次のような批判が生じる。アクションの前より後で売上が高くなったとして、それは季節のせいではないのか? アベノミクスのせいではないのか? そのほか、当該のアクションとは無関係なさまざまな要因のせいではないのか?
 こういう批判にこたえるためには、「季節やらアベノミクスやらその他すべての要因において共通しているが、当該のアクションはなされていない」なんらかの比較対象が必要である。たとえば、競合ブランドの売上データだったり、当該ブランドの前年の売上データだったり、当該の広告を出稿していない地域における当該ブランドの売上データだったり。これをコントロールと呼ぶことにする。で、先ほど求めた前-後の売上の差と、コントロールにおける前-後の売上の差とを比べる。いわゆる「差の差を調べる」手法である。
 問題は、都合の良いコントロールはなかなか手に入らないという点である。競合さんだって頑張っている。去年の僕らだって頑張った。広告を出稿しなかった地域があったら、それにはそれなりの事情がある。「差の差」が当該アクションの効果だけを表しているとは限らない。
 ...とお嘆きの皆様に対し、この論文はつぎのように提案する。よろしい、アクションの効果を推定してご覧にいれましょう。大丈夫、コントロールなんて要りません。ただし、「アクションの前の値」と「アクションの後の値」だけではだめ。長めの時系列データをください。特に、「アクションの前」についてはぜひ長めの時系列を。そして、あなたのブランドの結果指標(売上とか)に影響するであろう変数のデータを、片っ端から用意してください。

 えーと、提案モデルは以下の通り。いやー、時系列構造モデルだなんて、生まれながらの文系である私がなんでこんな目に...
 大枠として、以下の状態空間モデルを考える。
 観察方程式: $y_t = Z^T_t \alpha_t + \epsilon_t$
 状態方程式: $\alpha_{t+1}= T_t \alpha_t + R_t \eta_t$
 観察値$y_t$はスカラー(ありがたいことに)。$Z_t$は長さ$d$の係数ベクトル。$\alpha_t$が長さ$d$の状態ベクトル。誤差項$\epsilon_t$は$N(0, \sigma^2_t)$に従う。
 状態方程式のほうは、$T_t $が$d$行$d$列のブロック対角な遷移行列。$R_t$は$d$行$q$列のブロック対角な係数行列、$\eta_t$は長さ$q$のシステムエラーで(季節性とかね)、その拡散行列を$Q_t$とする (ブロック対角)。
 この状態ベクトル$\alpha_t$にいろんな要素を突っ込んでいく。

 ひとつめ、トレンド$\mu_t$。傾き$D$のAR(1) として、
 $\mu_{t+1} = \mu_t + \delta_t + \eta_{\mu, t}$
 $\delta{t+1} = D + \rho(\delta_t - D) + \eta_{\delta, t}$

 ふたつめ、季節性。季節の数を$S$として、
 $\gamma_{t+1} = - \sum_{s=0}^{S-2}\gamma_{t-s} + \eta_{\gamma, t}$
こういう季節性の表現を見るといつも泣きたくなるんだけど、著者様は素人向けに易しくかきなおしてくださっていて、たとえば春から順に1,2,3,4だとすると、$\gamma_{冬} = -1 * (\gamma_{秋}+\gamma_{夏}+\gamma_{春}) + (誤差項)$ だから、これでつじつまが合っているわけです。

 みっつめ、係数が時間変動しない共変量ベクトル$x_t$の効果。これは、$\alpha_t$のほうに 値 1 の要素を突っ込んでおいて、$Z_t$のほうに$\beta^T x_t$を突っ込めばよろしい。ああそうか、なるほど。なお、論文ではラグつき共変量のことは考えてないけど、容易に拡張できる。

 よっつめ、係数が時間変動する共変量ベクトル$x_t$の効果(ベクトルの長さを $J$とする)。ええと、いま効果を$x^T_t \beta_t$としましょう。$\beta_t$は長さ$J$の係数ベクトルで、これがランダムウォークすると考える。つまり各要素について
 $\beta_{j, t+1} = \beta_{j, t} + \eta_{\beta, j, t}$
この$\beta_t$を$\alpha_t$に突っ込み、共変量$x_t$のほうを$Z_t$に突っ込めばよろしい。状態ベクトルの遷移行列$T_t$は$J$行$J$列の単位行列になる。(状態空間モデルの、こういうひっくり返った発想に慣れないんだよな...)。なお、共変量の係数は時間変動させないほうが簡単で、させちゃうにあたってはいろいろ工夫が要る由(動的潜在因子とか潜在閾値回帰とか)。よくわからんので省略。

 このモデルをベイズ推定する。事前分布をいろいろ工夫するんだけど(共変量の係数には少数の変数を使うようにspike-and-slab分布をつかうとか)、省略。なんだかわからんが、とにかく推定できるんだそうです。へー、すごいですね。

 さて、このモデルをどうやって使うかというと...
 t=n の直後になんらかのアクションが行われていたとする。その場合、次の3つのステップを踏む。

  1. 時系列$y_{1:n}$をつかってモデルのパラメータを推定する。
  2. このモデルを使って、反事実的な時系列$\tilde{y}_{n+1:m}$の事後予測分布を求める。
  3. 各時点 $t$ について、この事後予測分布からドローした値と実際の$y_t$との差$\phi^{(\tau)}_t := y_t - \tilde{y}^{(\tau)}_t$を求め (上添字 ($\tau$) は$\tau$回目のドローであることを表す)、その分布を介入の因果効果の事後分布とする。なんだったら、時点$n+1$以降の全時点を通じた $\phi^{(\tau)}_t$の合計なり平均なりを求めてもよい。

 後半は数値例。まず、2つの共変量に動的回帰する人工データの例。
 それから実データ。google adwordsへの出稿がクライアントのwebサイトへのクリック数に及ぼした効果の推定。共変量はそのカテゴリのgoogle trend(なるほど)。出稿されていない地域をコントロールにした効果推定に近い結果が得られた、云々。なるほど、googleがこの研究をする理由がわかろうというものだ。

 私の素人目には意外だったのだが、この提案では、市場に対する介入の効果をモデルのなかでexplicitに表現するつもりはさらさらないのである。なるほどねえ、そんなのモデル化するとなったら、そのたびに頭を使わないといけないもんね。
 しっかし、パラメータ推定にあたっては基本的に介入前の時系列しか使えないわけで、いかにもgoogle的なデータリッチな発想だなあ、と呆然。マーケティング・リサーチの文脈では、ふつうマーケティング・アクションが起きる前の観察データはプアなので、こういうのを聞くとあっけにとられてしまう。

論文:データ解析(-2014) - 読了: Brodensen, et al. (2014) マーケティング・アクション前後の時系列からアクションの因果効果を推定するぜ by Google