Splunkで自分のタイムラインをサクッと分析。

# はじめに
[前回](http://qiita.com/t_nakayama0714/items/2ac1ac4c1c58270b96f7)でめでたく自分のタイムラインに流れるツイートを取得できるようになったと思うので、今回はそのデータを分析してみたいと思います。

# データを確認
前回の投稿から1週間、ひたすらデータを食わせ続けたのでまずはどれくらい溜まっているか確認しましょう。

ホーム画面の`Search & Reporting`からサーチを開きましょう。

![WS000019.JPG](https://qiita-image-store.s3.amazonaws.com/0/45253/29fe60c6-40d5-2a92-edc1-4ea6d13100d6.jpeg)

赤で囲んだところを見ると、現在Splunkで何件のデータを保持しているのかが分かります。
さらにすぐ下のデータサマリを開くと、

![WS000020.JPG](https://qiita-image-store.s3.amazonaws.com/0/45253/3392b342-9152-508d-4b5c-0be11b07ea44.jpeg)

ホスト、ソース、ソースタイプの観点で件数を確認することができます。

- **ホスト**

    データの受信元。
    現在登録しているデータ入力では全てホストを`localhost.localdomain`にしてあるので1個だけ。
    Splunkでサーバクラスタのログ管理などをしている場合、ここに色々なホストが並ぶことになります。

- **ソース**

    実際に`データ入力`で管理されるうち、どこから入力されたかで分類されます。
    画像を見ると分かるようにRESTで3件のソースを持っていますが、登録名が違うので同じREST入力でも区別されます。

- **ソースタイプ**

    データの種別を表します。データ入力時に指定できます。
    前回はソースタイプ`Twitter`で設定しましたね。

このように3つの観点で大まかに分類されますが、クラスタなどを対象とする場合上記3つを上手く設定しておくとログの管理がしやすくなるかと思います。

では今回サーチするTwitterのタイムラインデータを見ていきます。
一番件数の多い`rest://Twitter HomeTL API`をクリックします。ポチッ。

![WS000021.JPG](https://qiita-image-store.s3.amazonaws.com/0/45253/aa2e27e7-c405-1274-8b28-2393cdb4f526.jpeg)

と、こんな感じでずらりと見ることができます。
サーチバーを見ると`source="rest://Twitter HomeTL API"`となっていますね。
こんな感じでどんどん絞込をかけていくことになります。

# 分析してみる
では早速分析してみましょう。
とはいえ、まだ件数が6000件くらいしかないのでいい結果が得られるとは思えませんが。。。

今回は下記3点の分析を行います。

- **時間帯別つぶやき数**
- **曜日別つぶやき数**
- **クライアント別つぶやき数**

クエリに関して詳しい仕様等が知りたい方は

- [**Splunkを使ってみよう**](http://ja.splunk.com/web_assets/v5/book/Exploring_Splunk_ja.pdf)
- [**Search Reference (JP)**](http://docs.splunk.com/images/7/78/SearchReference_JA_502.pdf)
- [**Search Manual (JP)**](http://docs.splunk.com/images/9/9f/Search_JA_502.pdf)

をご覧ください。
1つ目はv5系で少し古いですが、よく出来てていい感じです。
下2つは機械翻訳感丸出しで読んでて不愉快なレベルなのでおすすめしません。古いし。
無理に日本語読むくらいなら最初から[英語版](http://docs.splunk.com/Documentation/Splunk)を読んだほうが楽かもしれません。最新ですし。

## 時間別つぶやき数
ではまず時間帯別に区切ってどれくらい分析されているのかを見て行きたいと思います。
使用するクエリはこちら。

```
source="rest://Twitter HomeTL API" | stats count by date_hour | sort by date_hour
```

上記クエリですが、`source="rest://Twitter HomeTL API"`のデータを元に統計を行っています。
SplunkのクエリではLinuxのようにパイプによる結果受け渡しが可能で、今回はタイムラインのツイートに統計を行っています。

```
stats count by date_hour
```

書いてあるとおりですが、時間ごとのデータ数をカウントしています。
データ群にたいして統計処理を行うときは`stats`コマンドを使いますが、今回はその中の`count`を使っています。
で、カウントと言っても何別にカウントするかというのを`by`で指定しています。ここで指定されている`date_hour`というのはSplunkがデフォルトで持っているフィールドで、データの日時を認識して勝手に振り分けてくれる便利なやつです。
今回の例でデータの日時はというと、ツイートに含まれる`created_at`フィールドの値が日時にあたりますね。
`date_***`系で他にあるものをまとめてみます。

|フィールド名|説明|値|
|:--|:--|:--|
|date_second|データの秒|00~59|
|date_minute|データの分|00~59|
|date_hour|データの時|00~23|
|date_wday|データの曜日|monday,tuesday,...,sunday|
|date_mday|データの日|1~31|
|date_month|データの月|1~12|
|date_year|データの年|****|
|date_zone|データのタイムゾーン|-12~+14|

統計を取る場合に時間を基準にすることはよくあるかと思うのでこのフィールドは非常に役立ちますね。
さて、最後に`sort by date_hour`ですが、当然時間帯の値で並び替えるので効果としては問題無いと思うのですが、statsで統計処理を行うと結果はデータの一覧ではなく処理の結果で返ります。
今回の例で行けば、

|date_hour|count|
|:--|:--|
|23|1000|
|11|500|

というような調子になるかと思います。
で、欲しいのは当然時間でソートされた結果ですから`sort by date_hour`を行うわけです。
`stats` → `sort`の流れは定番っちゃ定番なので感覚的に使ってもいいかもしれませんが、パイプでの受け渡しがどうなっているかきちんと考えておくと難しいクエリも迷うこと無く書けるようになるかもしれません。

さて、それではクエリの結果を確認しましょう。

![WS000022.JPG](https://qiita-image-store.s3.amazonaws.com/0/45253/cb6b40f3-2477-3da8-6745-b66ae1949aa3.jpeg)

と、こんな感じの面白くない結果が出たと思います。
現在サーチバーの下にあるように、統計情報タブの情報を見ているわけですが隣の視覚エフェクトタブを見てみましょう。

![WS000024.JPG](https://qiita-image-store.s3.amazonaws.com/0/45253/b49405c6-ffce-63c8-5cec-d1618d326ae0.jpeg)

なんということでしょう。
何もしていないのにきれいなグラフが現れました。
赤で囲んだ部分から他の視覚エフェクトも選べますが、時間別統計であれば縦棒が最適でしょう。

このグラフを見るとわかりますが、18-19時台が一番ツイートが少なかったんですね。意外です。
逆に3時でも結構なツイート数があるのにも驚きます。

## 曜日別つぶやき数
それでは続いて曜日別つぶやき数を見てみましょう。


```
source="rest://Twitter HomeTL API" | stats count by date_wday | eval sort_field=case(date_wday=="monday",1, date_wday=="tuesday",2, date_wday=="wednesday",3,date_wday=="thursday",4, date_wday=="friday",5, date_wday=="saturday",6,date_wday=="sunday",7) | sort sort_field | fields - sort_field
```

ずいぶん長いですが、これで曜日別のツイート数を取得することができます。
`stats count by date_wday`まではさっきの時間帯別のものと変わりないので説明を省きます。

```
eval sort_field=case(date_wday=="monday",1, date_wday=="tuesday",2, date_wday=="wednesday",3,date_wday=="thursday",4, date_wday=="friday",5, date_wday=="saturday",6,date_wday=="sunday",7)
```

ここで何をやっているかというと、ソート用のため各日付にソートが簡単なラベルを与えています。
先ほどSplunkは自分で`date_wday`を持っていると言いましたが、その曜日をソートする機能を標準では提供していません。
(マニュアルにあるのもこの方法です...)
そこで、このクエリでは何をしているかというと`eval`コマンドで値を評価し、レコードに新たなフィールド`sort_field`を生成しています。
`date_wday`の値がmondayなら`sort_field`の値を1、というように曜日に対応して7までの値を振るようにしました。
もちろんソートできることが必要なだけなので、値はA~GなんかでもOKです。

そして、`sort_field`が与えられた各レコードを`sort_field`でソートします。
この時点では下記のような出力となります。

|date_wday|count|sort_field|
|:--|:--|:--|
|monday|1300|1|
|tuesday|700|2|

で、当然ソートしてしまえば`sort_field`は不要なので

```
fields - sort_field
```

で削除します。`fields + date_wday, count`でも同じことができます。`fields`コマンドではカラムの選択、除外にも使えますし、表示の順序を変えることもできます。

では同じように視覚エフェクトで結果を見てみましょう。

![WS000025.JPG](https://qiita-image-store.s3.amazonaws.com/0/45253/430d0169-8097-324f-96ff-931389f54329.jpeg)

ただ1週間しかデータを収集してないのでこちらの統計には一切信頼性がありませんね。。。
第一、金曜日はエラーでツイートの大半が取れていませんでしたし。
(ちなみにSplunkは自分自身のシステムログもモニタリングしていたりするので、エラーが多数上がる様子がしっかり収集されていました。優秀なんだか情けないんだか。)

## クライアント別つぶやき数
では最後にクライアント別つぶやき数を集計したいと思います。

```
source="rest://Twitter HomeTL API" | spath source | fields source | rex field=source "(<[^>]*>)?(?<rex_source>[^<]*)" | top 10 rex_source
```

まずは`spath`ですが、これはJSONまたはXMLのようなネスト構造を持つデータからフィールドを抜き出す場合に使います。これを指定しないと、クエリ先頭にある`source`と解釈されてしまい、求める結果が得られませんので注意が必要です。
`spath`はデフォルトでデータの先頭5000文字までしか見ないため、大きなデータの場合`path`で予め位置を指定してやる必要がありますが、Twitter程度なら大丈夫でしょう多分。

```
rex field=source "(<[^>]*>)?(?<rex_source>[^<]*)"
```

ですが、ここは[正規表現](http://ja.wikipedia.org/wiki/%E6%AD%A3%E8%A6%8F%E8%A1%A8%E7%8F%BE)を使って`source`フィールドから`rex_source`の値を抜き出します。
Splunkに限らず大量のテキスト処理をする場合に正規表現は非常に強力なので覚えておいて損はないですね。
正規表現の解釈について解説はしませんが、元々`source`フィールドの値は

```html:
 <a href="http://twicca.r246.jp/" rel="nofollow">twicca</a> 
```

みたいな形をしていますから、上のような`<a href>`タグに囲まれたtwiccaというようなクライアント名を`rex_source`として取得するわけなので上のような正規表現になります。
最後に`top 10 rex_source`ですが、指定フィールドの出現割合を集計し、そのTop10を出力します。
これまでの`stats count`でも同じようなことができますが、こちらは上位を絞って表示できたり、絶対数ではなく全体に対する **割合** で結果が出るなど違いがあります。

では結果を見てみましょう。これは円の視覚エフェクト見るのがいいでしょう。

![WS000026.JPG](https://qiita-image-store.s3.amazonaws.com/0/45253/e4321398-bc38-fbac-165a-6c9def32851d.jpeg)

さて、これを見てみると1位がtwittbot.netということで、BOTのツイートがタイムラインの多くを占められていることがわかります。
あまり気づいていませんでしたが、確かにBOTの垂れ流しが多かったのでフォロワー整理をしてBOTをいくつか外しました。。。

# 雑感 #
今回はとりあえず思いつくような分析を3つやってみましたが、クエリに対する反応も速く、非常に使いやすい印象です。
まだデータが十分じゃないにせよフォロワー整理などもできたので、分析も無駄ではなかったかなと思ったりしています。

今回で3回目のSplunk記事ですけど、インストール、データ入力、分析とやってきたのでとりあえずは一段落です。
レポートのスケジューリングやダッシュボード作成には触れていませんが、どちらもGUIでポチポチやるだけなんで特に身構えることもないでしょう。
Splunkでのデータ収集は引き続き続けますが、やはり1日500MBの制限から大規模な分析ができないので次からはOSSを使った分析に手を出していこうかなと思います。