ZaimのデータをElasticsearchに入れて、無駄遣いをKibanaで分析する


最近、自分の支出をうまくコントロールできていないのが気になりまして、、
普段使ってる家計簿アプリのデータをKibanaで見える化&分析してみようと思います。

## 環境
Windows10 Pro
Docker Compose ver 1.25.5
Elasticsearch ver 7.7.1
Kibana ver 7.7.1

## 概要
Zaimの家計簿データをElasticsearchに投入しKibanaから分析する

## 家計簿データをダウンロード
まずはZaimから家計簿データをCSVでダウンロードしてきます。
APIもありますが、取得できる情報が不十分な場合があるようなので今回は画面から取得してます。

PC版の設定タグからダウンロードできます。
UTF-8でダウンロード。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/594998/8c0ab466-f933-022b-dc50-8ef7b92c6501.png)



## Elasticsearch&Kibanaを起動する

今回はDocker Composeで一気に起動していきます。
https://github.com/sugikeitter/elasticsearch-kibana-docker
↑こちらを利用させて頂きました

```
# リポジトリをcloneして、docker-compose.ymlのディレクトリに移動
$ git clone git@github.com:sugikeitter/elasticsearch-kibana-docker.git
$ cd elasticsearch-kibana-docker

# Dockerイメージをビルド
$ docker-compose build

# ビルドが成功したらコンテナ起動
$ docker-compose up
```



## 起動を確認する
ブラウザからアクセスして起動を確認します。

Kibana
http://localhost:5601/
Elasticsearch
http://localhost:9200/



## Elasticsearchにデータを登録してみる

ひとまずCurlコマンドでデータを1件登録してみます。ダウンロードしたCSVから以下の形式でJSONファイルを作成します。

```zaimdata.json
{
    "日付": "2019-01-03",
    "方法": "payment",
    "カテゴリ": "美容・衣服",
    "カテゴリの内訳": "アクセサリー・小物",
    "支払元": "-",
    "入金先": "-",
    "品目": "",
    "メモ": "",
    "お店": "-",
    "通貨": "JPY",
    "収入": 0,
    "支出": 10800,
    "振替": 0,
    "残高調整": 0,
    "通貨変換前の金額": 10800,
    "集計の設定": "常に集計に含める"
}
```

コマンドラインからJSONファイルのディレクトリに移動して次のコマンドを実行します。

```
$ curl -X POST "http://localhost:9200/zaimindex/my_type/?pretty" -H "Content-Type":"application/json" -d @zaimdata.json
```
zaimindexというインデックス名で、先ほどのJSONファイルをElasticsearchに投入しています。
詳しい内容は自分で調べてください笑


## データが登録できていることを確認

curlコマンドで先ほどのデータを検索してみます。

```
$ curl -X GET "http://localhost:9200/zaimindex/my_type/Wy-Ao3MBbVl3j7ySEdUZ?pretty" -H "Content-Type":"application/json"
{
  "_index" : "zaimindex",
  "_type" : "my_type",
  "_id" : "Wy-Ao3MBbVl3j7ySEdUZ",
  "_version" : 1,
  "_seq_no" : 0,
  "_primary_term" : 1,
  "found" : true,
  "_source" : {
    "日付" : "2019-01-03",
    "方法" : "payment",
    "カテゴリ" : "美容・衣服",
    "カテゴリの内訳" : "アクセサリー・小物",
    "支払元" : "-",
    "入金先" : "-",
    "品目" : "",
    "メモ" : "",
    "お店" : "-",
    "通貨" : "JPY",
    "収入" : 0,
    "支出" : 10800,
    "振替" : 0,
    "残高調整" : 0,
    "通貨変換前の金額" : 10800,
    "集計の設定" : "常に集計に含める"
  }
}
```
ちゃんと登録されていますね！
あとはマッピングを確認してデータ型が正しいかを確認してください。
収入や支出欄がstringになってしまうとあとから集計ができません！ご注意ください



## 残りのデータを登録していく

今回はElasticsearch-loaderというPythonのツールを使って一括登録していきます。
まずはpipでインストールして

```
$ pip install elasticsearch-loader
```

Zaimのcsvファイルを一括で投入します！
Elasticsearchのホストとポート、インデックスを引数で渡してあげます。

```
$ elasticsearch_loader --es-host localhost:9200 --index zaimindex --type my_type csv Zaim.20200802111121.csv
```



## Kibanaで分析する

先ほどのCSVのデータの登録を確認し、無事に検索できるようになりました。
複雑なクエリ―を投げて分析したり、可視化したりできそうです！
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/594998/26a333f5-ab2d-9588-5708-b67611e71a83.png)

## 感想
こうして数字と向き合ってみるといかに無駄な出費が多いか見せつけられる気がして心が痛い、、
コンビニの買い物とスタバは控え目にしようと思いました(T_T)

今後は、
**１．Zaimのページをスクレイプしてデータ取得を自動化、定時実行**
**２．自動でESにデータ投入、LogstashとかFluentdとか**
**３．カテゴリーごとに月の上限額を決めてアラートを出す**
こんなところをやって自分のお金の管理をしたいと思います笑

少し長くなってしまいました！
読んで頂きありがとうございました！

## 参考ページ
https://qiita.com/hassiweb/items/63374089edef63dc35b3
https://qiita.com/sugikeitter/items/f3b2c57bf8bbdc47a8bc
https://qiita.com/mj69/items/c9a50f6e4e425a258612
https://worklog.be/archives/3582