Kibana(Elasticsearch)＋Logstashでオタクの出費を可視化してみる


## はじめに

まとめると趣味の出費を可視化して分析してみよう、という話です。

なぜそんなことをしようとしたかは長くなるので省略します。

アプリケーションにはKibana, Elasticsearch, Logstashを使用することにします。
いろいろあって複雑そうに見えますが、これらは、セットで扱うことが多いようです。（ー＞ ELK Stack）

### Kibanaとは

ビジュアライゼーションツール。Elasticsearchのデータを可視化することができる。
Webサーバとして起動する。

### Elasticsearchとは

全文検索エンジン・データベース。

### Logstashとは

ログ収集ツール。コマンドラインから実行可能。


## インストール

公式サイトからダウンロードして展開します。

[Elastic · Revealing Insights from Data (Formerly Elasticsearch) | Elastic](http://www.elastic.co/jp/)

今回は以下の環境で試しました。

1. Windows7 64bit
2. Elasticsearch 6.0.0
3. Kibana 6.0.0
4. Logstash 6.0.0

## ElasticsearchとKibanaの起動と確認

### Elasticsearchの起動

```
> elasticsearch\bin\elasticsearch.bat
```

デフォルトで9200,9300ポートで起動します。

### Kibanaの起動

```
>kibana\bin\kibana.bat
```

デフォルトでポート5601で起動します。

### 確認する

5601ポートでKibanaにアクセスします。

http://localhost:5601

![image](https://qiita-image-store.s3.amazonaws.com/0/197945/3d0030b3-8d41-9f7a-b95d-b2463a6a7b09.png)

画面が表示できればOKです。

## 入力データ

入力データはcsvで用意しました。
例えば、「12月12日にSphereのチケットを1,000で購入した」という場合は、以下のようなcsvとしました。

1,2017/12/12,1000,チケット,Sphere

先頭の数値はシーケンス的なユニークのIDです。

## Logstashを設定する

次はLogstashの設定を行います。

Logstashは[入力]-[変換]-[出力]といった、ストリーミング的な設定をyamlですることができます。
ここではCSVデータを入力、Elasticsearchに出力にします。

○inputのブロック

指定のディレクトリ内のファイルを対象にします。
sincedb_pathはどこまで読み込んだかを管理するファイルが保存されるパスです。
csvファイルはExcelで作成しているため、Shift-JISとしました。

```yaml
input {
	file {
		path => ["H:/01_daily/20171202/data/*"]
		sincedb_path => "H:/01_daily/20171202/sincedb"
		start_position => "beginning"
		codec => plain { 
			charset => "SJIS"
		}
	}
}
```

○filterのブロック

読み込んだcsvを処理します。
columnsでcsvの各カラムに名づけをします。
変換処理として、日付と金額の型変換を行っています。

```yaml
filter {
	csv {
		columns => ["id", "date", "value", "category1", "category2"]
		convert => {
			"value" => "integer"
		}
	}
	date {
		match => ["date" , "yyyy/MM/dd"]
	}
}
```

○outputのブロック

elasticsearchに出力します。
indexはいわゆるRDBにおけるテーブル名、document_idはPKとなります。
接続ホストはデフォルトでlocalhost:9200となるため、省略しています。

```yaml
output {
	elasticsearch {
		index => "expenses"
		document_id => "%{id}"
	}
}
```

まとめると以下のようになります。
ファイル名をwotaku.confとしました。

```yaml
input {
	file {
		path => ["H:/01_daily/20171202/data/*"]
		sincedb_path => "H:/01_daily/20171202/sincedb"
		start_position => "beginning"
		codec => plain { 
			charset => "SJIS"
		}
	}
}

filter {
	csv {
		columns => ["id", "date", "value", "category1", "category2"]
		convert => {
			"value" => "integer"
		}
	}
	date {
		match => ["date" , "yyyy/MM/dd"]
	}
}

output {
	elasticsearch {
		index => "expenses"
		document_id => "%{id}"
	}
}
```

## データを投入する

Logstashを起動してelasticsearchにデータを投入します。
以下のコマンドを実行すると、設定ファイルで設定したディレクトリを監視してデータを投入します。

```shell-session
≫ \bin\logstash.bat -f .\wotaku.conf
```

ディレクトリのファイルに追記したり、ファイルを作成したら数秒で反映されます。これは便利ですね！


## kibanaで可視化する

まずはkibanaにindexの設定をします。

http://localhost:5601 から、左側のメニューの「Management」-「Kibana」-「Index Pattern」を選択し、indexを追加します。

![image](https://qiita-image-store.s3.amazonaws.com/0/197945/ea43ded6-6ef8-a48e-9056-3129de926003.png)

Index patternに設定ファイルで指定した「expenses」を選択して、「Create」します。

「Time Filter field name」はデフォルトの&#64;timestampとします。
これはメタデータの時刻となるフィールドを指定しておきます。デフォルトではデータ投入時刻になります。
今回は明示的に&#64;timestampというフィールドは作成していませんが、データ投入時刻ではなく、csvのdateカラムとなります。
filterでdate変換した場合、その値が&#64;timestampに設定されるためです。

![image](https://qiita-image-store.s3.amazonaws.com/0/197945/f483af7a-3713-7ff6-7d34-1c6d7cb30ac2.png)

次はパーツを作成します。
左側のメニューから「Visualize」-「＋」アイコンを選択します。

![image](https://qiita-image-store.s3.amazonaws.com/0/197945/c245c57a-fd2a-e810-cad2-056191b63eff.png)

様々なパーツが選択できます。
ここでは、以下の4つのパーツを作成することにします。

1. Metric - データ件数
2. Metric - 金額合計
3. Tag Cloud - カテゴリ1のタグクラウド
4.  Tag Cloud - カテゴリ1のタグクラウド

![image](https://qiita-image-store.s3.amazonaws.com/0/197945/195d1ac1-2aa4-120c-2e02-cd427ec0adb3.png)

この辺はGUIなので、いろいろ試してプレビューしてみるのが良いかと思います。

続いて作成したパーツをまとめて表示するダッシュボードを作成します。
左のメニューから「Dashboard」を選択して同様にAddしていきます。
これもGUIで配置できます。

![image](https://qiita-image-store.s3.amazonaws.com/0/197945/b519f6b4-967d-be59-38cd-acee55463afd.png)

ここで注意するのが画面右上の時間の部分です。
これは対象とする&#64;timestampの範囲を示しています。
これを目的の範囲が含まれるように変更しないと、データが表示されず、データの投入に失敗している？など悩むことになります。

## 結果

金額は伏せてみました。

![image](https://qiita-image-store.s3.amazonaws.com/0/197945/06c8b3a7-9b5e-cdf2-4976-20dd43c35370.png)

ひぇぇ。

今年の出費はどうやらシンデレラガールズに一番使ったようです。
Sphereだと予想してたのですが。

しかし、シンデレラガールズとcategory1の写真集はイメージできませんね。そこで「シンデレラガールズ」の文字をクリックしてみます。

![image](https://qiita-image-store.s3.amazonaws.com/0/197945/886cacf6-85bc-417c-5ecc-f04cd58a2609.png)

ライブ、グッズ、フィギュアあたり。心当たりありますね。
ゲームが出てきていないので気づいてしまいましたが、google playの出費は入力データに含めるのを忘れました。

写真集はいろいろな人で分散されるので、category2には出てきてないということでしょう。
わりと技術書にもお金を使っていますね。

などなど中々面白いです。
まあでも、頭痛いです。


## おわりに

というわけで、ELK Stackを使用してオタクの出費を可視化してみました。

Kibanaのビジュアライゼーションは便利です。
とはいえ、設定のUIの操作感はあまり良くないように思いました。慣れが必要です。

あと、全体としてELK Stack自体の管理ツールがあるとよいですね。
有償verならできるのでしょうか。

Logstashはちょっと難しいです。
今回は入力データを扱いやすいように作ってしまいましたが、実際は好き勝手に作られたフォーマットのデータの加工をすることになると思います。
そのときにかなり大変になることが予想できます。

ウィザードによるスケルトン作成などが欲しいところです。


おわりだよ~

## 参考

[Elastic Stack and Product Documentation | Elastic](https://www.elastic.co/guide/index.html)