Blazerで異常値検知を試してみる

先日の記事の続きです。

ariarijp.hatenablog.com

Blazerで異常値検知も試してみました。

検証に使用したVagrantfileは以下のものです。

github.com

vagrant up してBlazerを起動し、ブラウザでアクセスできる状態を前提にします。

サンプルを見てみる

Vagrantfileで使用している ankane/blazer-dev では、開発用のリポジトリであるためか、デフォルトで異常値検知が有効になっています。

...省略...
anomaly_checks: true
...省略...

http://localhost:3000/queries/12-check-for-anomalies にアクセスすると、以下のような画面が表示されます。

f:id:ariarijp:20180113143909p:plain

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を保存し、再度クエリを実行してみると、以下のような画面が表示されます。

f:id:ariarijp:20180113144419p:plain

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を保存し、再度クエリを実行してみると、また異常値が検知されます。

f:id:ariarijp:20180113150512p:plain

ちなみに、1週分のデータだけ0にしても異常値としては認識されませんでした。このあたりのチューニングはできるのかもしれませんが、今回はそこまで調べていません。

まとめ

データ分析などを専門にしていないエンジニアでも、Blazer(というよりRのtwitter/AnomalyDetectionパッケージ)によって異常検知が簡単に利用できました。

他のOSSのBIツールではあまり見かけた記憶がないので、異常値検知はBlazerの特徴ひとつになるかもしれません。

Rもちょっとしたパッケージを使えるぐらいには勉強しようかな。

Rではじめるデータサイエンス

Rではじめるデータサイエンス