はじめに
今回は、通常の回帰分析では見過ごしがちな「効果の時間的な変化」を捉えることができる、時変係数モデルをRとStanで実装したので、その紹介です。
時変係数モデルとは
通常の回帰モデル(売上 = a + b * 広告費)では、切片aや係数bは期間を通じて一定であると仮定します。これは「広告の効果はいつでも同じ」と考えるのと同じです。
しかし、現実のビジネスではどうでしょうか?
「新発売のころは広告がよく効いたけど、最近は飽きられて効果が薄れてきた…」なんてことはよくありますよね。
時変係数モデルは、まさにそういった状況をモデル化するための手法です。
売上[t] = a[t] + b[t] × 広告費[t] のように、切片aや係数bが時間tとともに変化すると仮定します。
これにより、
・広告効果の時間的な変遷
・季節によるベース売上の変動
・競合の参入による効果の低下
といった、より現実に即した動的な関係性をデータから抽出することができます。これは、マーケティング戦略の見直しや効果測定において非常に強力な武器になります。
コードについて
今回は、ベイズ統計モデリング言語であるStanを使ってモデルを定義し、Rから実行します。
簡単な流れ
分析は、役割ごとに分割された以下のスクリプトで実行します。
・config.R: 分析に使うファイル名や、MCMCのイテレーション数などを設定します。
・run_model.R: config.Rの設定を読み込み、Stanでモデル推定(MCMCサンプリング)を実行します。この処理は時間がかかります。
・plot_results.R: run_model.Rが保存した推定結果を読み込み、グラフを生成します。
このようにプロセスを分離することで、重い計算は一度だけ行い、グラフの見た目の調整などは手軽に試行錯誤できるようにしています。
ソースコード
今回使用したすべてのコードは、以下のGitHubリポジトリで公開しています。
GitHubリポジトリ: https://github.com/Sorao-high/TVCM-Analysis-R.git
リポジトリには、コマンドラインで実行するスクリプト一式に加え、おまけとしてこれらの分析をWebブラウザ上でインタラクティブに実行できるShinyアプリのコードも同梱しています。
(※Shinyアプリは、お使いのPC環境によっては動作が不安定になる場合があります)
使用するデータについて
今回の分析では、モデルの動作を確認するために、以下のような特徴を持つ架空のサンプルデータ(週次データ、3年分)を生成して使用しました。
・sales(目的変数 y): 商品の週間販売数。
・promotion(説明変数 ex): その週に投下した広告費。
・date(時間軸): データの観測日。
このデータには、意図的に以下のような「隠れた構造」を仕込んであります。
ベース売上のトレンドと季節性:
広告を打たない状態での基本的な売上(切片 mu)が、緩やかに上昇するトレンドと、夏・冬にピークを迎える周期的な変動(季節性)を持つように設定しました。
広告費の変動:
通常は低い広告費で推移しつつ、年に数回、大規模なキャンペーンとして突出して高い広告費が投下されるようにしました。
広告効果の時間的変化:
これが最も重要なポイントです。広告費が売上に与える影響の大きさ(係数 b)が、分析期間の初期は効果が高い状態から始まり、時間とともに徐々に効果が薄れていくように設定しました。
モデルがこれらの「隠れた構造」、特に「3. 広告効果の時間的変化」をデータから正しく学習し、可視化できるかどうかを検証することが、今回の分析の目的となります。
このサンプルデータを生成するRスクリプト (generate_test_data.R) も、GitHubリポジトリに同梱しています。
結果の見かた
今回は、架空の「商品の販売数」と「広告費」の時系列データを使って分析を行いました。
以下が出力された結果のグラフです。
このグラフは3つのパートに分かれています。
・上段: Overall State (alpha) vs Observations
灰色の点が実際の売上データ、青い線がモデルによる予測値です。モデルがデータ全体の動き(特に広告キャンペーンによる売上の急上昇)をうまく捉えられていることがわかります。
・中段: Time-Varying Intercept (mu)
これは、広告の効果を除いたベースの売上の推移を示しています。グラフを見ると、年ごとに周期的な変動(季節性)があり、全体として緩やかな上昇トレンドがあることが読み取れます。商品の基本的な人気や季節需要の動きと解釈できます。
・下段: Time-Varying Coefficient (b)
これがこのモデルの最も重要なアウトプットです。広告費が売上に与える影響(係数)が、時間とともにどう変化したかを示しています。
グラフを見ると、分析期間の初めには2.0近かった係数が、時間とともに徐々に低下し、後半には1.0を下回っています。
これは、「広告の効果が徐々に薄れてきている」ということを示唆します。
おわりに
このように、時変係数モデルを使うことで、「広告効果の逓減」というビジネス上非常に重要なインサイトをデータから客観的に示すことができました。
「最近、広告の費用対効果が悪くなっている気がする…」といった現場の肌感覚を、データで裏付け、次のアクション(広告クリエイティブの変更、新しいチャネルの開拓など)に繋げるための判断材料となり得ます。
固定的な関係性しか見れないモデルから一歩進んで、動的な変化を捉えるモデリングに挑戦してみると、ビジネスの世界がまた少し違って見えてくるかもしれません。