Blazerで異常値検知を試してみる
先日の記事の続きです。
Blazerで異常値検知も試してみました。
検証に使用したVagrantfileは以下のものです。
vagrant up
してBlazerを起動し、ブラウザでアクセスできる状態を前提にします。
サンプルを見てみる
Vagrantfileで使用している ankane/blazer-dev
では、開発用のリポジトリであるためか、デフォルトで異常値検知が有効になっています。
...省略... anomaly_checks: true ...省略...
http://localhost:3000/queries/12-check-for-anomalies にアクセスすると、以下のような画面が表示されます。
FAILING · Anomaly detected in new_ratings
というメッセージが表示されており、 new_ratings
の値の推移にAnomalyな値が検出されたことがわかります。
このクエリで実行されているSQLを見てみます。
http://localhost:3000/queries/12-check-for-anomalies/edit にアクセスすると、SQLの編集画面が表示され、以下のようなSQLが実行されていることがわかります。
SELECT date_trunc('week', rated_at)::date AS week, COUNT(*) AS new_ratings FROM ratings GROUP BY week ORDER BY week
SQLをいじってみる
先程は異常検知されていたので、このクエリを少し変えて、異常値が検出されないようにしてみます。
SELECT date_trunc('week', rated_at)::date AS week, COUNT(*) AS new_ratings FROM ratings GROUP BY week HAVING COUNT(*) < 5000 ORDER BY week
HAVING
句で5000件以上の行をフィルタしています。このSQLを保存し、再度クエリを実行してみると、以下のような画面が表示されます。
PASSING · No anomalies detected
というメッセージが表示されており、異常値が検出されていないことがわかります。
さらにSQLを変更し、再度異常検知されるようにしてみます。
SELECT date_trunc('week', rated_at)::date AS week, CASE WHEN date_trunc('week', rated_at)::date = to_date('1998-03-09', 'YYYY-MM-DD') THEN CAST (0 AS BIGINT) WHEN date_trunc('week', rated_at)::date = to_date('1998-03-16', 'YYYY-MM-DD') THEN CAST(0 AS BIGINT) WHEN date_trunc('week', rated_at)::date = to_date('1998-03-23', 'YYYY-MM-DD') THEN CAST(0 AS BIGINT) ELSE COUNT(*) END AS new_ratings FROM ratings GROUP BY week HAVING COUNT(*) < 5000 ORDER BY week
少し長くなりましたが、もとのSQLが週単位でデータを取っているので、1998-03-09-1998-03-23週のデータを無理やり0にしてみました。 このSQLを保存し、再度クエリを実行してみると、また異常値が検知されます。
ちなみに、1週分のデータだけ0にしても異常値としては認識されませんでした。このあたりのチューニングはできるのかもしれませんが、今回はそこまで調べていません。
まとめ
データ分析などを専門にしていないエンジニアでも、Blazer(というよりRのtwitter/AnomalyDetectionパッケージ)によって異常検知が簡単に利用できました。
他のOSSのBIツールではあまり見かけた記憶がないので、異常値検知はBlazerの特徴ひとつになるかもしれません。
Rもちょっとしたパッケージを使えるぐらいには勉強しようかな。
- 作者: Hadley Wickham,Garrett Grolemund,大橋真也,黒川利明
- 出版社/メーカー: オライリージャパン
- 発売日: 2017/10/25
- メディア: 単行本(ソフトカバー)
- この商品を含むブログ (1件) を見る