Taste of Tech Topics

Acroquest Technology株式会社のエンジニアが書く技術ブログ

位置情報付きツイートをElasticsearch,Kibanaで可視化して、ポケモンGOを攻略!

こんにちは@です

世間に一大ブームを起こしたポケモンGOですが、みなさんやってますか?
新機能が追加されたり、第二世代のポケモンが登場するという噂もあり、
さらに流行るかもしれないですね。

さて、今回は位置情報付きのツイートを地図上にマッピングして可視化してみます。
キーワードで絞り込むことで、そのキーワードを含むツイートが「どこで」「どのくらい」つぶやかれているかを知ることができます。
例えば「ピカチュウ」と検索すればポケモンGOピカチュウが出現する場所が簡単に特定できるかもしれません。

今回行うのは、logstashで取得したツイートをelasticsearchに入れて、それをkibanaで可視化するという流れです。

それでは実際にやってみます。

1.logstashでツイートを取得する

logstashのinputプラグインとして用意されているtwitterプラグインを用いて、ツイートの情報を収集します。
locations(ツイートした位置情報を表すパラメータ)またはkeywords(この文字列を含むツイートを検索する)が必須パラメータとなっています。
keywordに関してはkibana上でフィルタリングすれば良いので、locationsを指定してざっくり日本国内のツイートを集めます。
(twitterプラグインの詳しい使い方についてはhttps://www.elastic.co/guide/en/logstash/5.0/plugins-inputs-twitter.html参照)

locationsは経度と緯度をカンマ区切りのペアとして指定することができます。
下記の設定をすることで経度123〜154、緯度20〜46という範囲が設定されます。
また、keywordsを使えば指定したキーワードを含むツイートを集めることができます。

locationsでは、経度と緯度のペアをカンマ区切りで書くことでbounding boxを定義できます。
例えば
locations => 123,20,154,46
と設定すれば
経度123度、緯度20度の点と、経度154度、緯度46度の点によって作られる矩形
内の位置情報をもつツイートを検索できます。

TwitterAPIの使い方については次のURLを見てください
参考(https://dev.twitter.com/streaming/overview/request-parameters#locations)


以下に示すのが今回使用するlogstashの設定ファイルになります。
inputにtwitterプラグインで、locations => "123,20,154,46"と指定しています。
この設定で日本全国のツイートをカバーできるはずです(朝鮮半島なども一部入りますが)

 input { 
   twitter {
     consumer_key => "XXX"
     consumer_secret => " XXX"
     oauth_token => "XXX"
     oauth_token_secret => "XXX"
     locations => "123,20,154,46"
    #keywords => ""
     full_tweet => true
   }
 }
 filter{
 }
 output{
   elasticsearch{
     hosts => localhost
     index => twitter
   }
 }

この設定ファイルを使ってデータ投入!...と行きたいのですが、
この設定のみだと、ツイートの位置情報がnumber型となるのでKibanaの地図上で可視化することができません。
Kibanaの地図上でデータを可視化するためには、geo_pointという型でデータを保持する必要があります。

2.マッピングの設定をする

位置情報をgeo_point型として扱うためのマッピング定義を行います。
下記の内容をKibanaのConsoleを使って設定します。
参考(https://www.elastic.co/guide/en/elasticsearch/reference/current/geo-point.html)

 PUT _template/twitter_template
 {
   "template" : "twitter",
   "mappings" : {
     "_default_" : {
       "_all" : {"enabled" : true, "omit_norms" : true},
       "dynamic_templates" : [ {
         "message_field" : {
           "match" : "message",
           "match_mapping_type" : "string",
           "mapping" : {
             "type" : "string", "index" : "analyzed","omit_norms" : true
            }
         }
       }, {
         "string_fields" : {
           "match" : "*",
           "match_mapping_type" : "string",
           "mapping" : {
             "type" : "string", "index" : "analyzed", "omit_norms" : true,
           "fields" : {
             "raw" : {"type": "string", "index" : "not_analyzed",  "ignore_above" : 256}
           }
         }
       }
     } ],
     "properties" : {
     "@version": { "type": "string", "index": "not_analyzed"         },
       "coordinates" : {
         "type" : "object",
         "dynamic" : true,
         "properties" : {
           "coordinates" : { "type" : "geo_point" }
         }
       }
     }
   }
  }
 }

3.Kibana上で可視化する

まず初めに画面左にあるメニューからvisualizeをクリックして、
visualizeの種類としてtile map を選択します。
f:id:acro-engineer:20160830094038p:plain

index patternとして "twitter"を選択します。
f:id:acro-engineer:20160830094109p:plain

Optionsをクリックして以下のパラメータを設定します。

f:id:acro-engineer:20160830094114p:plain

Dataをクリックして位置情報を表すfieldとしてcoordinates.coordinatesを選択します。

f:id:acro-engineer:20160831173912p:plain
地図上にデータが表示されました!
いまの状態だと、キーワードによる絞り込みは行わずに、収集した全データが表示されていることになります。
やはり東京近辺のツイート数が多そうですね。

それでは幾つかキーワードで絞り込みを行ってみましょう。

例1:金閣寺
f:id:acro-engineer:20160831173947p:plain

例2:大阪
f:id:acro-engineer:20160831174001p:plain

例3:富士山
f:id:acro-engineer:20160831174052p:plain

特徴的なワードだと分布がはっきりしてわかりやすいですね。

この機能を使ってポケモンの名前を調べれば出現場所がわかるかもしれません。
早速"ピカチュウ"で絞り込んでみましょう!
f:id:acro-engineer:20160831174140p:plain
ある程度場所がわかりますね。さらに拡大してみましょう。
f:id:acro-engineer:20160906103310p:plain
対応する地名をGoogleMapで見てみると、、、
f:id:acro-engineer:20160831174228p:plain
出ました!ピカチュウはみなとみらい近辺の赤レンガ倉庫やワールドポーターズのあたりにいる可能性が高いですね!


今回はツイートの位置情報をKibanaで可視化しました。
Twitterデータを常に収集し続けておけば、リアルタイムに色々な情報を得られそうですね。

それじゃあちょっとピカチュウ捕まえてきます!


(※実際にピカチュウが出現する場所を保証するものではありません)

Acroquest Technologyでは、キャリア採用を行っています。


  • 日頃勉強している成果を、AWSHadoop、Storm、NoSQL、Elasticsearch、SpringBoot、HTML5/CSS3/JavaScriptといった最新の技術を使ったプロジェクトで発揮したい。
  • 社会貢献性の高いプロジェクトに提案からリリースまで携わりたい。
  • 書籍・雑誌等の執筆や対外的な勉強会の開催を通した技術の発信や、社内勉強会での技術情報共有により、技術的に成長したい。
  • OSSの開発に携わりたい。

 
少しでも上記に興味を持たれた方は、是非以下のページをご覧ください。
 
データ分析で国内に新規市場を生み出す新サービス開発者WANTED! - Acroquest Technology株式会社の新卒・インターンシップ - Wantedlywww.wantedly.com