F@N Ad-Tech Blog

株式会社ファンコミュニケーションズ nend・nex8のエンジニア・技術ブログ

広告のCTR(クリック率)を時系列分析してみた

初めまして、ファンコミュニケーションズさんで5日間のインターンでお世話になった澤祐斗です。データ分析でのインターンということで、ビッグデータに触れられる機会を楽しみにしていました。
まずは簡単な自己紹介

  • 東京の理系大学生(非情報系)
  • データ分析歴は3カ月(プログラミングは半年程度)
  • インターン初

今回自分が行ったのは、広告のCTRが時間経過に伴ってどのような変化をするのか、その予測モデルを立てる分析です。

なぜCTRを時系列モデルで分析するか?

CTRは時間によって周期的かつトレンドを持って変動しており、そこを正確にトレース出来る予測モデルを立てることで異常なCTRが得られた際の早い反応や、何か施策を行った時のABテスト的な評価軸にもなると考えられるからである。

CTRの時系列予測

環境

データベース:Treasure Data
クエリ:hive
データ加工:python 3.6
統計解析:Rstudio 1.2

データ抽出

今回一番頭を悩ませたのがこのデータ抽出だった。データベースにある広告に関するログから一時間当たりのインプレッション数、クリック数をを集計し一時間当たりの平均CTRを算出するのだが、後々の回帰分析で用いる説明変数の取り扱いは難しかった。例えば名義尺度などのカテゴリカルな値は、通常の機械学習で用いる際にはOneHotEncodingなどで特微量抽出するのだろうが、今回は一時間当たりで集計するため分散が小さくなったり意味のある特微量抽出が難しくなったりと、その特微量抽出法に苦戦した。結果として、unique countや横持ち変換によって出来るだけ意味を失わないように特微量を抽出できた。
今回最終的に抽出した特微量は以下の通りである。
・OSの種類
・mediaの種類数
・性別(一部のサードパーティから同意の上で取得した情報)
・通信地域における男女比
・広告の形態
・Wifi環境か?
・広告の素材
・再生された広告
・ビデオの長さ など計17種

これらの特微量はpythonのjupyter notebook上でHiveを使ってTreasureDataから抽出した。
今回は7月1日から7月25日までのデータを一時間ごとにまとめて取得したが、Hiveの特性を活かしきれてなかったからか、一回の抽出に30分ほどかかった。打ち間違い等で実行後に誤りを見つけた時は抽出のし直しが面倒だった。

データ加工(xts型への変換)

jupyter notebook上でdataframe形式で受け取ったデータはそのままpythonでpandasでcsv変換し保存し、それをRstudioで読み込んでR上でのデータ加工をした。
Rでは時系列データを簡単に扱うためのデータ型であるxts型(ts型の改良?版)があり、読み込んだデータをxts型に変換した。プロットしたものが以下である。
f:id:yutosawafancs:20190823181321p:plain

CTRは特徴は?

ggtsdisplay関数によりCTRの自己相関を調べた。
f:id:yutosawafancs:20190823181420p:plain
左の図より24時間の周期性があり、右の図より一次の自己相関が確認できた。
次にCTRがどのような分布になっているか確認した。f:id:yutosawafancs:20190823181437p:plain
少し歪んで見えたので、対数変換することに
f:id:yutosawafancs:20190823181455p:plain
シャピロ・ウィルクテストにより比較すると対数変換後の方が正規分布に近いことが確認できた。


モデリング

モデル作成

Rのbsts packageを使って状態空間モデルでモデリングした。
モデリングには
ローカルレベルモデルorローカル線形トレンドモデル
一次の自己相関ありorなし
回帰成分ありorなし   などの観点から計9つのモデルを作成した

モデル評価

予めデータを約二週間ずつ訓練データとテストデータに分けておいた。
訓練データを用いて作成したモデルで予測系列を作り、それとテストデータとのRMSE(二乗平均平方誤差)により評価した。

モデルの決定

映えある優勝者は、説明変数による回帰成分(事前分布の緩和あり)、24時間周期成分、ローカル線形トレンドモデルから構成されるモデルだった。
その予測結果は以下の図である。(赤色が予測系列)
f:id:yutosawafancs:20190823181515p:plain
まあだいたい追えてるんじゃないかな?
RMSEはCTRがだいたいわかってしまうので書けないが、予測値と実値の比より誤差の絶対値をパーセントで計算すると誤差の平均は5.3%程度だった。
誤差は最大で20%くらい。誤差の標準偏差が4%くらいだったので、95%くらいの確率で誤差比13%以内にはあるとわかった。
とすると、誤差比が15〜20%を超えてくると、異常値として何かCTRに異変が起きているかもしれないと通報を受けデータベースのパトロールに迎うことができる。
他にも、何か施策を行った時もこの水準を超えれば有意な差があると判断できるだろう。

説明変数による回帰

bsts packageでは、説明変数の回帰を含んだモデルに対し各特微量の係数を表示できる。

白帯は正の係数で、黒帯は負の係数である。
wifiでの接続数だったり、広告の形態だったりとまあ予想通りな結果も含みつつ、男女比やiOSでの接続数など意外なものもあった。

まとめとインターンを通しての感想

  • 状態空間モデルは理論やアルゴリズムの難しさの割に簡単に実装できた。
  • 実データを用いた分析は面白かった。
  • 職場の雰囲気は比較的静かで集中できた。


まだまだ勉強の日が浅くわからないことも多かったですが、メンターの片桐さん及び片桐さんが書いた記事(Rについて調べたら結構たどり着く)に助けていただきなんとかやり遂げることが出来ました。
毎日お昼ご飯にも連れて行ってくれ、色んな話も出来て楽しかったです。ありがとうございました。中華多めの渋谷ランチでした。
ファンコミュニケーションズは割と定期的にインターン生を迎えていることもあってインターン生も居心地よく作業できる環境が整っています。
実データに触れて分析がしてみたいなど考えている学生の方にはオススメだと思います。
最後に、5日間という短い間ですが初日にお昼ご飯に連れて行ってくださった皆さん、卓球サークルでお世話になった皆さん、インターン生の全体的なサポートをしてくださった長田さん、内田さん、ありがとうございました。