Splunkで相関係数を計算する


はじめに

Splunkを使ってデータ分析する時のメリットの一つに、様々な種類のデータから相関分析できるというのがあります。

たとえば、WebサーバのアクセスログとロードバランサのアクセスログをSplunkに取り込むことで、どちらにボトルネックが発生しているのか分析することができます。
※実際のボトルネック特定には他に原因となる要素がたくさん考えられますが、ここではあくまで例としてお考えください。

ところで、異なる2種類のデータがどの程度相関しているのか?ということを統計学的に表す指標として相関係数というのがあります。
この相関係数は以下の数式で計算することができます。

参考サイト:相関係数の意味と求め方 - 公式と計算例

この相関係数に関してSplunkでは専用のコマンドcorrelate
があるようですが、今回、数式に従って計算してみました。
※今回はサーチ文だけで実現してみます。

Splunkを使った相関係数のサーチ例

以下のサーチ文は、mainインデックスに入っているデータのamountフィールドの月ごとの合計と件数の相関係数を計算する例になります。

相関係数を計算するサーチ文の例
index="main" amount="*" 
| eval i=Case(
    date_month="january","01",
    date_month="february","02",
    date_month="march","03",
    date_month="april","04",
    date_month="may","05",
    date_month="june","06",
    date_month="july","07",
    date_month="august","08",
    date_month="september","09",
    date_month="october","10",
    date_month="november","11",
    date_month="december","12"
    ) ```月を数値に変換する``` 
| stats count(amount) as x, sum(amount) as y by i ```月ごとの合計を計算する``` 
| eventstats 
    avg(x) as avg_x,varp(x) as varp_x,stdevp(x) as stdev_x,
    avg(y) as avg_y,varp(y) as varp_y,stdevp(y) as stdev_y
    ```xとyのそれぞれの平均,母分散,母標準偏差を計算する。avg:平均、varp:母分散、stdevp:⺟標準偏差``` 
| eval 
    avg_x=round(avg_x,2),varp_x=round(varp_x,2),stdev_x=round(stdev_x,2),
    avg_y=round(avg_y,2),varp_y=round(varp_y,2),stdev_y=round(stdev_y,2) ```四捨五入する``` 
| eval dev_x=x-avg_x,dev_y=y-avg_y ```dev:xとyのそれぞれの偏差を計算する```,
    cov_tmp=round(dev_x*dev_y,2) 
| eventstats avg(cov_tmp) as cov ```cov:xとyの共分散を計算する``` 
| eval cov=round(cov,2) ```四捨五入する```,
    cor_r=round(cov/(stdev_x * stdev_y),2) ```cor_r:xとyの相関係数を計算する```

※補足(マクロについて)

※上記サーチ文に書かれているマクロはSplunk8.1.0以上のバージョンでのみ使用できます。

結果の見方

算出された相関係数に応じて、2種類のデータがどの程度相関しているか判断することができます。

他の実現方法について

今回はSplunkの標準機能のみで相関計算の公式に従った形でサーチ文を作ってみました。
numpyなどのライブラリを用いたカスタムコマンドを作ったり、別途外部Add-Onを入れることで計算する方法もあると思います。※
もっと上手い計算方法があればぜひご意見お願いします!

※特にデータ量が多い時eventstatsコマンドの処理に時間がかかりそう。

参考サイト

相関係数の意味と求め方 - 公式と計算例