Python + ELK でJAWS DAYS 2017のツイートを簡単に可視化してみた

Elasticsearch色々試そうと思っていたところ、自分もツイートしていたJAWS DAYS 2017のツイートログを使ってみよう、と手を動かした記録。

# 前提
1. Pythonは2.7系を利用
2. ELKは5.2.2を利用

# Twitterからのログ検索
こちらに作成したソースコードをのせました。アクセスキーを入力することで利用可能です。
（事前準備としてTwitter APIへの登録などは済ませる必要があります。）

https://github.com/kojiisd/TweetsSearch

- ソースコード自体はとても単純です。
- 3000件という数字は適当に決めたものです。（それくらいのツイート数だろうと思って適当に指定した値）
- ちなみにTwitter APIを利用する際には利用回数に制限があるので（リセットされる）注意が必要です。

```py
import twitter
from twitter import Api
import sys
import os
import time
import json

reload(sys)
sys.setdefaultencoding('utf-8')
from collections import defaultdict

maxid = 0
search_word = "#XXXXXX"

api = Api(base_url="https://api.twitter.com/1.1",
          consumer_key='XXXXXXXX',
          consumer_secret='XXXXXXXX',
          access_token_key='XXXXXXXX',
          access_token_secret='XXXXXXXX')


count = 0
file = open(name='../data/result.json', mode='w')
found = api.GetSearch(term=search_word, count=100, lang="ja", result_type='mixed', until="yyyy-mm-dd")
while count < 3000:
    for result in found:

        file.write(str(result) + os.linesep)

        count += 1
        maxid = result.id
    found = api.GetSearch(term=search_word, count=100, result_type='mixed', max_id=maxid - 1)

file.close()
print "TweetsNum: " + str(count)
```

# JAWS DAYS 2017のハッシュタグで検索してみる

- 前述のプログラムで「#jawsdays」で検索してみました。取得できたツイートはこんな感じでした。
- だいたい1900件弱ヒットしました。
- 期間は2017/03/11 00:00:00 - 2017/03/12 09:00:00にしています。JAWS DAYS関連のツイートが本格的に始まってから、落ちつくまでの期間を適当に指定。


```json
{
    "created_at": "Sat Mar 11 04:57:29 +0000 2017", 
    "favorited": false, 
    "hashtags": [
        "jd2017_b", 
        "jawsdays"
    ], 
    "id": XXXXXXXXXXXXXXXXXX, 
    "lang": "ja", 
    "retweeted": false, 
    "source": "<a href="http://twitter.com" rel="nofollow">Twitter Web Client</a>", 
    "text": "満席＋立ち見。すごい。 #jd2017_b #jawsdays", 
    "truncated": false, 
    "user": {
        ：
        ：
        ：
        "name": "Koji, 
        ：
        ：
        ：
        "screen_name": "kojiisd", 
        ：
        ：
        ：
    }
}
```

logstashは、、、とりあえず結果がすぐ見たかったので、JSONとして取り込んだだけで
特に大した処理は設定ファイルに書かず、、、

結果、インデックスが大変なことになっていますが、とりあえず今回はこのままで行きます。

![スクリーンショット 2017-04-06 7.26.23.png](https://qiita-image-store.s3.amazonaws.com/0/102769/9787986f-fe51-a4db-fd0b-19fd41da7584.png)

で、何度使ってもELKは便利ですね。Elasticsearchに流し込んでしまえば、Kibana側でちょちょっと可視化ができてしまうのは嬉しい限り。サクッと今回取得したツイートの中のユーザ毎のツイート数を並べてみました。
ツイートしているユーザ自体は「user.screen_name」で取得できます。

![スクリーンショット 2017-04-04 7.14.22.png](https://qiita-image-store.s3.amazonaws.com/0/102769/f3d187d6-2ea6-ddcb-110b-f4bcac7a1678.png)

うーむ、なかなか善戦した方かもしれませんが、自分は100もツイートしていなかったのか。もう少し頑張るようにしましょう。

最もリツイートされた方は、「nakayama_san」でした。いつも勉強会などでわかりやすい一枚絵を投稿してくれる方ですね。納得。リツイートは「retweeted_status.user.screen_name」で絞ってます。合ってるのかなこのやり方・・・。
![スクリーンショット 2017-04-04 7.26.32.png](https://qiita-image-store.s3.amazonaws.com/0/102769/ecaf9362-8663-6fd0-e3d1-78dd576faf22.png)

ちなみにタグクラウドをとりあえず表示してみたらこんな感じ。全然ダメです（＾＾；当たり前ですが、analyzedの設定など何もしていないからですね。
![スクリーンショット 2017-04-06 7.33.21.png](https://qiita-image-store.s3.amazonaws.com/0/102769/3f8ae708-d6c7-3a9c-edd6-62c926bb6be1.png)

JAWS DAYSだとツイートそのものが少ないので、文字列をきちんとanalyzedしたり、logstashの設定をきちんと考える、対象のインデックスにテンプレートを追加するなど準備が必要そうです。

ただきちんと準備してから分析すると、re:Inventでのトレンドキーワードなどを見ることも可能になりますね。

# まとめ
とりあえず「データ取得」→「可視化」の流れを作ってみました。今回はローカルで実行することを前提として作成しましたが、このままAWS上で分析できるようにした上で、URLを公開できれば、リアルタイムにトレンドキーワードをタグクラウドで表示したりすることも可能かもしれません。気が向いたらre:Invent前に組んでみようかな。