FANCOMI Ad-Tech Blog

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

クリック数の異常検知

こんにちは、株式会社ファンコミュニケーションズで8月6日から8月10日までインターンをしていた桐畑です。
クリック数の異常からシステムなどの異常を検知できないかというインターンをやったので、それについてとインターンの感想などを書いていこうと思います。
ブログはほとんど書いたことがないので、読みづらいかもしれませんが、ご了承ください。

1. 異常検知とは

基本的に3つあり、それぞれ外れ値検知、異常部位検知、変化点検知のことを異常検知と言います。
・外れ値検知
突発的なおかしい値を検知するもの
例) 一瞬だけサーバーのネットーワークが切れたなど
・異常部位検知
異常な値がある程度の長さ連続して起こっているのを検知するもの
例) アップデートをしたがミスがあり、再び修正したなど
・変化点検知
ある時点以降時系列の特徴が変わってしまう時点を検知するもの
例) テレビに出て、知名度が急激に上がったなど

今回はあまりそれぞれを区別せずに異常なものをなんでも検知しようという試みでした。
アプローチとしては、機械学習的なアプローチと統計学的なアプローチがあり、今回は統計学的アプローチを用いました。
細かい手法は以下を参考にしました。
異常検知と変化検知 9章 部分空間法による変化点検知

2. 結果

0時の日付が変わるタイミングでのスパイクを除けば、検知したい4つの異常のうち3つを見つけることが出来ました。
4つ異常でないものも検知してしまっていたので、適合率= 3/7、再現率= 3/4ということになります。

スパイクは以下のようなもので、これと異常値を区別するのが物凄く大変でした。
正直、最終的にもあまり出来ていないです。
0時にクリック数が急激に多くなるのは、漫画アプリとか色々なアプリのポイントなどの更新が0時だからなのかなと思ってます。

f:id:fan_m_kirihata:20180810174742p:plain

3. 実際にやったこと

FacebookのProphetというライブラリを使ってモデルを組んで、残差が大きいところを異常とみなしました。
なので、より良くデータにfitしているモデルを組むことが重要です。
Prophetでは、
 y(t) = g(t) + h(t) + s(t) + \epsilon_t
という式でモデルを推定します。
g(t):トレンドを表す関数
h(t):周期性を表す関数,
s(t):イベントの効果を表す関数
 \epsilon_t:誤差項

クロスバリデーションなんかで変数選択をして誤差を見てみるとこんな感じになりました。
yが実際の値(Box-Cox変換はしている)、yhatが推定値、residualが残差です。
f:id:fan_m_kirihata:20180810182142p:plain

異常なところで誤差が大きくなりました。
ただ、スパイクのときと区別がつきにくいです。
f:id:fan_m_kirihata:20180810182147p:plain

1次の自己相関を入れていたせいで、異常な値をすぐに補正してしまっているのだと思い、
1次の自己相関の項のみ移動平均で平滑化してみました。
すると、スパイクと異常部で残差の連続度に違いが出ました。
f:id:fan_m_kirihata:20180810182410p:plain
f:id:fan_m_kirihata:20180810182413p:plain

なので、残差が大きいところが連続するかどうかで異常を判定するとそこそこ上手くいきました。

ただ、スパイクの影響はまだまだ出ているので、その辺は今後の課題かなと思います。
あと、長い期間の異常も見つけられなかったので、それはどうしたらいいか時間がある時にでも考えてみようと思います。

4. 感想

インターンをするのは初めてなので、他のところとは比べられないですが、全体的に来てよかったなと思います。
良かったなと思ったところを2つ紹介したいと思います。
1つ目は、会社がすごく自由だったところです。僕は結構縛られるのが嫌なので、好き勝手やらして欲しいタイプなのですが、本当に好き勝手やらせてくれたので、すごくやりやすかったです。時系列の研究をしているので、それに関係する内容をやらせてもらえたし、やり方も特に指定されずにやらせてもらえたので、色々知識がついて良かったです。
2つ目は、データサイエンティストの仕事がどんなものか知れたことです。データサイエンティストという名前は良く聞くのですが、業務としてどのようなことをやっているのか謎だったので、それが一部でも知れたことは良かったなと思います。データをひたすら眺めて、おかしなところを探すのは凄く大変でしたが、いい経験でした。

スパイクに苦しめられた時は大変だなと思いましたが、全体的には楽しくて、色々な経験が出来たインターンだったなと思います。
ありがとうございました。