テレビCMの効果をウェブ検索データで推定する

こんにちは、データアナリティクスチームのHuangです。

今日の記事はこの論文を参考して、Google TrendsのデータでテレビCMの(ウェブ検索数への貢献の)効果を推定するアプローチを一から紹介した。

アプローチ自体の複雑さもあって、ライブラリーとコードなどを混ぜて説明しようとしたらキリがないので、書いているうちに、チュートリアルよりも、骨組みの展示という感じの文章になってしまった。

テレビCMの効果の推定をしたい方や他に似たような課題を解決しようとしている方は、骨に肉をつけたり、自分の骨組みの参考になったり、何らかの形で役に立てればと思います。

背景

広告などの宣伝で広く使われるメディアの中で、テレビはデジタルより長い歴史を持っている。しかも実際に広告の効果で言うと、印象に残すという意味では、テレビCMはいろんな調査から費用対効果が一番低いという結論が出ている。しかし過去の結論の多くは小さなサンプルから導き出したことや、アンケート調査の限界もあったということで、デジタルデータが多く手に入る現代において、説得力が昔より薄くなっていくのもしかたがない。デジタルの媒体となるスマホなどのデバイス自体はいろんなデータを収集できて、そしてその膨大なデータのおかげで、デジタルはテレビよりもっと細かく施策や分析ができる。

一方、テレビCMはデータの量が比較的に少ないため、デジタルと違う分析方法を探すしかなくなっている。

仮にテレビとデジタル自体の効果が昔と変わらなくても、データの運用でデジタルCMは間違いなく一歩先を歩いている。

テレビの視聴行動は弊社のセンサーでとれるようになってはいるが、横断的に顧客の行動を分析することはテレビではまだできない。それため、接テレビCMと購買などの顧客行動の関係性や、その効果を量的に推定するのは難しい。

この記事では上の課題に挑む答えのひとつとして、テレビCMの効果を限られたリソース(データ)で推定するアプローチの一種を紹介する。

大まかな流れとしては、まずテレビCMの効果をウェブ検索数への貢献として定義し、貢献した検索量の数値を推定するために必要なパーツ(データ)を集めて、そして組み立てる(モデリング)。最後に結果の解釈や議論でしめる。

データ

データの紹介

テレビCMの効果を検索数で評価したいので、Google Trendsから対象商品などの時系列検索数データを手に入れる。

f:id:yhhuang:20211101135924p:plain

*東京で過去一週間任意のキーワード「A」と「B」の検索量。「A」と「B」の内容は隠されている

簡単に言えば、上記の例のように、ワード(5つまで)、地域、期間を指定すれば、検索量が時系列で出てくるようなウェブサイト。しかし、分析の要件に合うようなデータが欲しければ、細かいパラメータの調整が必要なので、実際に使ってみて調整のときに工夫した点や注意すべき点を書き記す。

検索数のデータはいろんなパラメータを指定できる、以下はよく使うもの

  • 地域

    • 国、県まで指定できる
    • 一部の機能は市や区も指定可能
  • 期間

    • APIはサイトより制限が少ない
    • APIの場合、分粒度のデータは過去4時間、それ以外の粒度は全期間アクセス可能
  • 粒度

    • 集計期間で決まる。直接指定できない。
      • 過去4時間 -> 分
      • 一週間 -> 時間
      • などなど
    • カテゴリー
      • 時間
      • 週(UTC時間の日曜 - 土曜)
      • ...

しかしGoogle側は実数を出したくないようで、以下の処理が行われている。

  • 正規化
    • 一回のリクエストで取得したデータは最大値が100になるようにしている
    • 違うリクエストで取得したデータは比較できない
    • 人気がない検索ワードの場合、サーバー側でdivided by zeroのエラーが起きて、データが返ってこないケースが多々ある
  • サンプリング
    • データ集計時にサンプリングが行われる
    • サプリングのシードは定期的に変わる(期間不明が、1時間かも)

実際の分析ではモデルによって相対値でも使えるが、複数回のリクエストの結果を再度正規化する必要がある。

検索数のボリュームがある程度あれば、サンプリング自体は気にしなくても良いが、シードが変わって同じ期間をリクエストして、(正規化してから)平均をとればある程度サンプリングの影響を除けると考えている。

データの取得

分析するに当たって、少なくとも三ヶ月以上のデータが必要になる。特に分粒度のデータは過去4時間でしか手に入らないので、プログラムで自動的にデータを溜めていかないと。ここがAPIの出番です。

公式のAPIが存在してないが、非公式のものはある。どの言語もrequest類のライブラリーで実装しているので、有名な言語は概ね実装がされている。

以下二つはそれぞれpythonRのAPI。

  • pytrends
    • 実装の欠陥で、違う地域の検索数を同時に取れない
  • gtrendsR
    • 今のところ明らかな欠陥がない

APIのリクエストの一日の上限は公式から発表されてないが、一日で1200回とされている。

データの処理

長期間の細かい粒度のデータは複数回のリクエストの結果をまとめて正規化する必要がある。

特に分粒度のデータは一回のリクエストで最長4時間分しかないため、数ヶ月分のデータを正規化するのはちゃんとしたアルゴリズムがないといけない。

一番わかりやすいやり方は2回のリクエストの期間をかぶらせて、被っている部分の検索ボリュームをベースに正規化する。同じやり方が再帰的にn回のリクエストでも適応できる。

理論上は問題なくても、被っている期間の検索量が0になっていたらこのアルゴリズムは破綻する。深夜などでは検索量が0になることがよく起きるため、この問題は無視できない。また、分粒度のデータは遡って取得不能なので、一度でもミスがあれば後から修復することが不可能となっている。

また、サンプリングの影響で、被っている期間のデータポイントもある程度の数がないといけないため、このアプローチでは必要以上にリクエストをすることになる。

上記のアプローチの問題を解決するために、よりrobustなアルゴリズムを簡単に紹介する。

まず同じ検索ワードのデータを3種類用意する。それぞれ集計期間を全部カバーする必要がある

  • 1分粒度のデータ、一回のリクエストで4時間分以内(3時間を推奨)
  • 1時間粒度のデータ、一回のリクエストで1週間分(1週間分を指定すると、粒度が1時間と決まる)
  • 1週間粒度のデータ、一回のリクエストで1年分(半年以上、一年以下指定すると粒度が1週間になる)

次は1時間粒度のデータをリクエスト別(週別)で足して、1週間粒度のデータ(1回りクエストのため、相対的に比較可能)を足した後の値で割れば、週別の1時間粒度のデータの1単位(one unit)がわかる。1時間粒度のローデータに1単位をかければ、すべての1時間粒度のデータの正規化が終わる。

1分粒度のデータでも正規化後の1時間粒度のデータと同じ作業を繰り返せば可能となる。

このアプローチのメリットは:

  • リアルタイムでしかとれない1分粒度のデータがあるリクエストで問題が起きても(データが返ってこないか、あるいは検索量が少なくて0が返ってきたか)、被害は他のデータの正規化には影響しない
  • 1時間、1週間粒度のデータは遡っていつでも取得可能なので、違うタイミングでデータを取得して平均を取れば、サンプリングの影響も小さくなる

モデル

データではGoogle Trendsで分粒度の時系列データを長期間取得する方法を紹介した。ここからはそのデータを使って分析の流れを紹介する。

テレビCMの効果の推定方法とモデルはこの論文を参考にしている。

流れは

  1. 検索量の時系列データ(original)とテレビCMのデータ(放送時間、視聴率など)
  2. テレビCM放送直後(文献によると8分ぐらいが適切)の検索量のデータを欠損させる
  3. 時系列モデル(BSTSARIMAなど)で欠損値を補填する(counterfactual)
  4. 3で得たデータと元の時系列データの差分はテレビCM(各放送回)の効果になる
  5. (Optional)、CM効果を目標変数にして、さらに深掘りすることもできる(視聴率 -> CM効果の関係とか)

f:id:yhhuang:20210825085443p:plain

*Google Trendsのデータ(original)とCM放送直後の数分を欠損させてから、モデルの予測値(counterfactual)。この論文から

このグラフは上記の流れの結果を可視化したものとなっている。横軸は時間、縦軸は検索量。灰色のところはCM放送直後の数分間で、その間に検索量の増加が目でも確認できる(全てのCM放送回においてここまで明らかな増加が見られるわけではないが)。

議論

最後にこのポストに紹介したアプローチについて、主に2点について議論したい。

データの扱いづらいところ

Googleから実数のデータがないため、遠回りにデータの取得と処理をしてなんとか分析に使えるようにしたが、同時に扱いづらいところも生じた。

  1. 人気の高い検索ワードしか扱えない

    人気が低い検索ワードはゼロ近くの値になることが多い。

    • データの取得が難しい(サーバー側でエラーしがち)
    • データの分散が小さいと分析自体はできない
  2. 過去を遡って分析できない

    テレビCMの短期効果は10分以内にあるので、分粒度のデータでないと分析は非常に難しくなる。しかし上記にもあるように、分粒度のデータはリクエスト時点から過去4時間しかとれない。ゆえに過去のデータを分析したくてもできないのが現状となっている。

    ということは分析は前もって必要なデータを決めないといけないため、後になって足りないデータがあると気づいても、追加に取得することはできない。

    初めに曖昧な課題ほど、この欠点は致命的になりがち。

  3. データの取得や処理でミスは起きやすい

    • サーバー側に予想外の挙動はある

      非公式のAPIを使っている以上、予想外のリクエストの失敗は覚悟の上のはずだが...いざエラーになった時に、できることはデータを0にするか、NAにするかの二択でしかない。

    • こだわり多い(一部リストアップすると...)

      • 週の定義とタイムゾーンの変換
      • 地域別を比較可能にしたいと、正規化がさらにややこしくなる(実際にやったことあるが、紹介すると長くなるだけで割愛する)
      • 一回のリクエストで最大5つのワードの検索量がわかるので、それ以上のワードが分析対象となると、正規化がさらにさらにややこしくなる

効果の解釈

このアプローチはテレビCMの因果的効果(causal effect)を推定しようとしている。

一般的な機械学習の予測モデルと違って、因果推論では、実験をするか、あるいは実験に似た設定がないと、ものごとの因果関係を推定することはできない。

f:id:yhhuang:20210825085439p:plain

*実験データとGoogle Trendsのデータの想像図。この論文から

このグラフのパネル(a)はもしテレビCMを見た・見てない人をランダムに分けて、検索量を測る実験をする時の状況で、パネル(b)はテレビCMを見た・見てない人を意図的にランダムに分けてないときの実測データです。

本来なら実験に似たランダム性がないと、テレビCMの効果を正確に測れないはずだが、論文の中はテレビCMの打つタイミングと検索量の多寡は独立であることを仮定し(少なくとも広告主や放送局はウェブの検索量などを意識してCM放送のタイミングを決めているわけではない)、実験に似た設定を作り上げた。この仮定が成り立ってはじめて、CM放送後の検索量の増加はCM放送のタイミングに他に検索量に影響があることが原因ではなくて、テレビCMの効果として捉えるべき。

そのため、推定したテレビCMの効果を因果的効果として解釈する時に、上記の仮定が正しそうであるか否かを常に考えるべき(ほんとに正しいかどうかを判別するのは難しい。そもそも検証できてたら仮定をする必要性もない)。

最後に

はじめに書いたように、この記事はこの論文を参考して、Google TrendsのデータでテレビCMの(ウェブ検索数への貢献の)効果を推定するアプローチを紹介した。

ほかにもアプローチが存在していると思いますが、少しでもこの記事を読んだ方の役に立てれば良いと思います。

参考

  1. 参考になったGoogleの論文

  2. Google Trends API: python

  3. Google Trends API: R