Kepler.glで時空間データの可視化がよかった

こんばんは。

 

新型コロナウィルス(COVID-19)流行で外出自粛が続く中、いかがお過ごしでしょうか?
ボクはもともとインドア派なのであまり苦痛を感じてませんが、そろそろ友達とカラオケや飲み会に行きたいなと思ってます。
まさか自分が生きている時代に歴史の教科書に載るレベルの疫病が流行するとは思いませんでした。

 

さて、インドア生活が続く中、Kepler.glという非常に興味深いモノを見つけました。
Uber社がオープンソースで公開している時空間データを可視化するフレームワークです。

自前のサーバで稼働させるにはMapboxのアカウントが必要になりますが、データを容易に地図に可視化してくれる凄いツールでした。

 


早速ですが、ボクが試した事例を紹介します。
Twitter APIで位置情報付きツイートを2020年4月25日~5月2日で取得し、
位置情報付きツイート間をアーチ(弧)で結んで地図に可視化したのが以下です。

Twitter APIで取得した2020年4月25日~5月2日の位置情報付きツイート

Twitter APIで取得した2020年4月25日~5月2日の位置情報付きツイート

 

Kepler.glには以下のフォーマットのCSVを喰わせて描画してます。

特定のアカウントがつぶやいた位置情報付きツイートの2点(地点A、B)を結ぶようにして

41,949レコードのデータをサクッと可視化できました。

こうやって見ると日本政府や各自治体が控えるよう呼び掛けている県またぎの移動は0にはできないことが分かります。

物資の物流が止まったわけでは無いし医療・金融・インフラ業の人たちの移動を制限するわけにはいかないので、県またぎの移動が悪というわけでは無いです。

(記事の最後に書きますが去年の位置情報付きツイートの量と比較すると少ないです)

 

時刻情報でフィルタするとKepler.glでアニメーションができました。

f:id:hikiniku11029:20200504111842g:plain

 

同じデータでもレイヤーの種類を変えれば、以下の様に積み上げグラフやヒートマップも描画できました。

f:id:hikiniku11029:20200504192948p:plain

f:id:hikiniku11029:20200504193416p:plain

 

以下の様に県別でプロットするデータのカラーセットも変えることができました。

f:id:hikiniku11029:20200504194304p:plain

上は都道府県内だけを移動したレコードだけを抽出して描画したものです。

東京都:オレンジ

神奈川県:赤

千葉県:緑

埼玉県:青


現時点で頭一つ抜けて洗練された時空間データ可視化ツールだと思います。

 

最後に去年の同じ時期(2019年4月25日~5月2日)のデータが手元に残っていたので描画してみたもの以下に挙げます。

f:id:hikiniku11029:20200504195422p:plain

f:id:hikiniku11029:20200504195446p:plain

f:id:hikiniku11029:20200504195509p:plain


149,095レコードあり、去年は今年の4倍近くの位置情報付きツイートがTwitter APIで取得できてました。


今年は海外旅行客がいなくなったことが明らかで、かつ日本国内の移動量が激減していることがわかります。

政府・自治体の呼びかけに応じて日本国民が行動変容した結果ですね。

 

 

未曾有の疫病で、ワクチンや治療薬など病理学的な対策ができるまで今の大変な状態が続くのかと思いますが、変な情報に惑わされたりせずにボクは楽しみを見つけて頑張っていこうと思います。

 

 

 ここまでご読了いただき、ありがとうございました。

コミックマーケット96の位置情報分析

おはようございます。

今日はお台場の東京ビックサイトで開催されているコミックマーケット96の最終日ですね。

オリンピックの影響で東展示棟が使用できず4日間の開催となったり、入場に有料のリストバンドが必要となったりしたみたいです。

 

C96の動員総数はまだ発表されてないですが、Twitter APIで会場付近の位置情報付きツイートを取得してみました。

赤枠の範囲で位置情報付きツイートを取得してみます。

f:id:hikiniku11029:20190812075643p:plain

定期的に位置情報付きツイートを取得するスクリプトを組んで、データ収集したところ一日目の8月9日(金)から昨日の三日目8月10日(日)の期間で1,362アカウント分取得できました。

位置情報付きツイートする人が全体の何パーセントか知りたいので動員数が発表されるのが楽しみです。

 

さて、データ取得した1,362個のアカウントについて、Twitter APIでコミケ開催前日の8月7日(木)から8月10日(日)までの過去のツイートを取得したら19,295件もの位置情報付きツイートが得られました。

早速、foliumで地図にプロットしてみました。

f:id:hikiniku11029:20190812080744j:plain

 

各地から沢山の人が会場に集まっていることが分かりそうです。

しかし、foliumでマーカーを大量にプロットするのはブラウザに負荷がかかるようで地図を動かしたらブラウザがクラッシュしてこの絵以外は描画できませんでした。。。

どうやらマーカーの画像を沢山描画する処理が重いようです。

 

そのため、処理が軽いヒートマップで取得した19,295件の位置情報付きツイートを地図にプロットしてみました。会場付近からズームアウトしてゆきます。

f:id:hikiniku11029:20190812081630p:plain

f:id:hikiniku11029:20190812081651p:plain

f:id:hikiniku11029:20190812081716p:plain

f:id:hikiniku11029:20190812081738p:plain

f:id:hikiniku11029:20190812081757p:plain

f:id:hikiniku11029:20190812081815p:plain

 

日本の各地から人が集まっていることが分かる絵だと思います。

あとコミケに行った帰りに秋葉原に立ち寄る人が多いこともわかりました。

f:id:hikiniku11029:20190812082335p:plain

特定のスポットから次のスポットへ移動した人の遷移を表現するのにサンキー・ダイアグラムを使えば良さそうですが、いいライブラリが見つからないので今回は作れませんでした。

 

その代わり、最近注目しているglobal.jsというD3.jsを使ったライブラリで位置情報付きツイートをプロットした絵がこちらになります。

f:id:hikiniku11029:20190812083413p:plain

f:id:hikiniku11029:20190812083443p:plain

始点と終点の緯度・経度を指定すると地球に線を描いてくれるライブラリです。

コミケに来るまでの空港で位置情報付きツイートをしていた人が居たので、東南アジアとヨーロッパから来ている人もいるのが分かりやすく絵にできました。

 

はてなブログは動画を張り付けることがお見せできませんが、global.jsで作った絵はグリグリ動かせて結構楽しいです。

 

 

会場周辺のコンビニや各携帯キャリアのコミケ対策とかも凄そうですが、コミケは鉄道や宿泊設備など旅行業界の経済を動かしているのが分かるので地図を作ってて面白いイベントだと思いました。

 

ここまで読了ありがとうございます。

趣味でエリア分析(6)牛丼屋さんの商圏分析~後編~

前回(↓)の牛丼屋さんの商圏分析の続きをやっていきます。

hikiniku11029.hatenablog.com

 

店舗数や出店している地域を地図化しただけでは、Google検索して出てくるサイトと代り映えがないので、独自性のある分析をしたいと思いました。

 

でも、独自性をどうやって出すか悩みました。

 

独自性を出すアプローチとして、新規性・誰もやっていない深堀・新しい価値の創出etcがあると思います。でも、才能があるわけではないのですぐに思いつかず、自分が何ができるか手探りで模索するしかありませんでした。

 

難しく考えても答えがでなかったので、今までやってきたことを棚卸することにしました。

これまでは、データをプロット・ヒートマップを地図に描いていました。

じゃあ、逆の発想で描いたデータの繫がりを見て何かをインサイトを得られないか? という考えに至りました。

 

 

んで、今回は牛丼屋さんの店舗周辺の位置情報付きツイートとの関連を見る分析を立案しました。

 

具体的なアプローチは、

店舗の周囲20m以内で位置情報付きツイートをしたユニークユーザ数

を牛丼チェーン店で比較分析します。

f:id:hikiniku11029:20190627211535p:plain

一人のユーザが同じ場所で沢山ツイートする場合もあると思うので、ツイート数じゃなくユニークユーザ数で比較することにしました。

なぜ20mにしたかというと、目視で店舗を見つけられる範囲は20mくらいかと考えて値を決めました。

 

1m当たりの緯度経度の変化量の目安はググるとすぐ出てきました。

【1mあたり緯度の変化量】0.000008983148616
【1mあたり経度の変化量】0.000010966382364

 

目安を20倍して以下の値でデータを絞り込むことにしました。

【20mあたり緯度の変化量】 0.00017966297232
【20mあたり経度の変化量】0.00021932764728

 ※地球は横に長い球体として極座標計算しないと厳密な緯度経度の変化量は出ませんが、ミサイルなどの航空宇宙のシミュレーションするわけではないので安直な計算値を使って分析します。

 

 

ここからデータ分析をどうやって処理したか説明します。

 

まず、自作ツールで収集したデータをMicrosoftのAccessでデータベース化しました。

(Gyudon.accdbというファイル名で保存)

f:id:hikiniku11029:20190627213252p:plain

 

ここからpyodbcというモジュールを使ってpythonで店舗ごとに周囲20m以内のユニークユーザ数をはじき出しました。

コードは以下となります。

import pyodbc
# 分析する店舗の位置情報を[緯度,経度]でリストで格納
list = [

]

def main():
conn_str = (
r'DRIVER={Microsoft Access Driver (*.mdb, *.accdb)};'
r'DBQ=C:\Gyudon.accdb;'
)
conn = pyodbc.connect(conn_str)
cur = conn.cursor()
for tenpo in list:
lat = float(tenpo[0])
lon = float(tenpo[1])
lat1 = lat - 0.00017966297232
lat2 = lat + 0.00017966297232
lon1 = lon - 0.00021932764728
lon2 = lon + 0.00021932764728

sql = "select count(*) from (select distinct(screen_name) from tweet where latitude between " + str(lat1) + " and " + str(lat2) + " and longitude between " + str(lon1) + " and " + str(lon2) + " )"

print(tenpo[0], tenpo[1], " ", end="")
cur.execute(sql)

for c in cur.fetchall():
print(c[0])

cur.close()
conn.close()

if __name__ == '__main__':
main()

pythonでAccessのデータベースからデータ参照するのは初めてやりましたが便利ですね。

(私の環境はWindows10(64bit)) 

 

上記のコードを実行すると、

緯度 経度 ユニーク数

で集計結果が出力されます。

 

これで各牛丼屋さんの店舗ごとの周囲20m以内のユニークユーザ数を出すことができました。

 

 

では、集計結果です。

全部乗せることはできないので、牛丼チェーンごと周囲のユニーク数が多いTop10の店舗ランキングを載せます。

吉野家

f:id:hikiniku11029:20190627220941p:plain

 

すき家

f:id:hikiniku11029:20190627221055p:plain

 

松屋

f:id:hikiniku11029:20190627221238p:plain

 

インサイトが得られました。

吉野家は他のチェーンと違い人の流量が多いスポットに集中して出店できているようです。

位置情報付きツイートした人が実際にその店舗にはいって牛丼を食べたかは判断できませんが、人の流量が多いことは確実にわかります。

 

位置情報付きツイートした人 < Twitterやっている人 < 人々 

 

店舗数と各店舗の周囲で位置情報付きツイートしたユニーク数のサマリーは以下となります。

f:id:hikiniku11029:20190627221929p:plain

※店舗数は各社HPからスクレイピングできて位置情報が特定できた数です

 (本当の店舗数とは若干の誤差があると見込まれます)

 

 散布図にしてみます。 ※横軸は店舗数

f:id:hikiniku11029:20190627222604p:plain

 

熾烈な販売競争を繰り広げている、牛丼チェーン各社の出店戦略を可視化できました。

分析を工夫した甲斐がありましたヾ(o´∀`o)ノ

 

 

ちなみに私はすき家の牛丼が大好きです。

牛肉が抜群に多い中盛りが大好きなんです!

 

 

ここまで読了ありがとうございます。

趣味でエリア分析(5)牛丼屋さんの商圏分析~前編~

今回は、牛丼チェーンの商圏分析を趣味でしてみようと思います。

 

すき家・松屋・吉野家を分析のターゲットとします。

なか卯は分析しません。あそこは牛丼よりも親子丼が美味しいと思います。

 

早速、牛丼チェーン3社のHPから店舗の住所をスクレイピングします。

住所の一覧ができたら、逆ジオコーディングで緯度・経度に変換します。

逆ジオコーディングはこちらの埼玉大学のサイトを使わせて頂きました。

 

店舗の位置情報の一覧ができたらfoliumで地図にプロットします。

結果は以下となりました。

f:id:hikiniku11029:20190625212204p:plain

マーカーの色が牛丼チェーン3社に対応してます。

 赤:すき家

 青:松屋

 オレンジ:吉野家

 

東京23区にみっしり牛丼屋が詰まっていることが分かりました。

まあ、想定どおりです。

 

ここから地図をズームアウトしてゆきます。

f:id:hikiniku11029:20190625213925p:plain

f:id:hikiniku11029:20190625214559p:plain

f:id:hikiniku11029:20190625214644p:plain

f:id:hikiniku11029:20190625214706p:plain

青色のマーカーでプロットした松屋は政令指定都市にしか出店してないようです。
逆に、すき家は地方・都市部を問わずまんべんなく出店しているように見えます。

この時点でチェーンごとの特徴が見えました。

 

 スクレイピングできた店舗数を比較しても圧倒的にすき家が多いことが分かります。

f:id:hikiniku11029:20190625220455p:plain

※2019年6月に各社のHPからスクレイピングできた店舗数のため実際の値と異なる場合があると思います。 

 

 

出店戦略が見えたところで、ツイッターの位置情報付きツイートのヒートマップをオーバーレイして地図を作り直した結果が以下となります。

2019年4月1日~6月23日までに自作ツールで収集した位置情報付きツイートのデータ、約100万レコードで作ったヒートマップをオーバーレイしてます。

f:id:hikiniku11029:20190625221641p:plain

f:id:hikiniku11029:20190625221709p:plain

f:id:hikiniku11029:20190625221733p:plain

f:id:hikiniku11029:20190625221936p:plain

f:id:hikiniku11029:20190625222211p:plain

f:id:hikiniku11029:20190625222255p:plain

f:id:hikiniku11029:20190625222415p:plain

f:id:hikiniku11029:20190625222624p:plain

f:id:hikiniku11029:20190625222642p:plain


位置情報付きツイートが多いところ ≒ 人が集まるところに各牛丼チェーンは出店していることが分かりました。


この分析は長くなるので、今回は一旦ここまでとします。

次回は各店舗の周囲の流量を数値を使って比較・分析します。

  

ここまで読了ありがとうございます。

趣味でエリア分析(4)タピオカが熱いスポットを探す

こんばんは。

夜中なのに今話題の「タピオカ」ドリンクを飲んでみたくなりました。

 

どこで売っているんでしょうか?

タピオカが熱いエリアが知りたいです。

なので、「タピオカ」という単語を含むTwitterの位置情報付きツイートを自作ツールで収集し、foliumで地図にヒートマップでプロットしてみました。

 

結果です。

f:id:hikiniku11029:20190625004527p:plain

f:id:hikiniku11029:20190625004753p:plain

f:id:hikiniku11029:20190625004810p:plain

f:id:hikiniku11029:20190625005116p:plain

東京都内では、池袋、新宿、表参道、渋谷、秋葉原が「タピオカ」が熱いようです。

2019年4月1日~6月22日の期間で、「タピオカ」という単語を含むツイートは10,522件も収集できたんですが、位置情報付きツイートは453件しか収集できませんでした。

でも、熱いエリアをあぶり出せたのでokです。

 

エリアを個別にズームインしてゆきます。


池袋エリア

f:id:hikiniku11029:20190625005547p:plain

 

新宿エリア

f:id:hikiniku11029:20190625005720p:plain

 

表参道エリア

f:id:hikiniku11029:20190625005837p:plain

 

渋谷エリア

f:id:hikiniku11029:20190625010041p:plain

 

秋葉原エリア

f:id:hikiniku11029:20190625010226p:plain


なんとなく「タピオカ」ドリンクを売ってそうな場所は特定できたので仕事終わりに探しに行ってみようと思います。

 

 

ここまで読了ありがとうございます。

 

 

 

趣味のエリア分析シリーズを書いてます。

hikiniku11029.hatenablog.com

hikiniku11029.hatenablog.com

hikiniku11029.hatenablog.com

hikiniku11029.hatenablog.com

 

 

 

 

 

趣味でエリア分析(3)港区女子の生息地を調査したら

今回は特定のエリアの流量を調べてみます。

 

仕事ではなく趣味でやっているので、自分の興味に任せて「港区女子」が棲息しているであろうエリアを見てみようと思います。

 

ネットを検索すると港区女子とは以下の表現がありました。

麻布や六本木に出没し、毎晩のように飲み歩く。
東京都港区に夜な夜な集い、豪華なホームパーティに出席し、
おしゃれなバーや高級レストランに通い、六本木でお買い物をする。

なるほど。分析したいターゲットが行動する時空間(場所と時間帯)が分かりました。

では、その表現に基づきTwitterの位置情報付きツイートを自作ツールで収集して分析しようと思います。

 

まず、データを収集するエリアは以下の赤枠のエリアA~Dとします。

f:id:hikiniku11029:20190622123411p:plain

 

Aは恵比寿を含むので厳密には渋谷区にはみ出ているのですが、恵比寿も港区女子の狩場らしいという情報をTwitterで見たので含めました。

 

私の自作ツールはTwitter APIを使って取得したデータを、ローカルのDB(MySQL)に保存します。データを格納するテーブルの構造はこんな感じです。

f:id:hikiniku11029:20190622124337p:plain

 

自作ツールで収集した位置情報付きツイートをfoliumを使って地図にヒートマップを描いた結果は次の様になりました。

f:id:hikiniku11029:20190622124519p:plain

ねらったエリアでデータがちゃんと取れたっぽいです。

ヒートマップに青色をつかったら、なんかエネルギーを感じるグラデーションになりました。

ちなみに赤い枠線が港区です。国土交通省が公開しているGeoJSONの最新データで描いてます。

取得できたデータの緒元は以下となります。

【取得期間】2019年4月1日 ~ 6月20日

【データ件数】24,933件

【ユニークユーザー】1,892件 ※位置情報付きツイートした人(アカウント)の数

 

データ量としてはまあまあ収集できたと思います。

(本音はもう少し収集したかった)

 

ここから分析を次のステップに進めます。

ビジネス・アワーにつぶやかれたツイートと、観光か何かでエリア内にたまたま訪れた人のツイートを除外するために、収集したデータを以下の条件でフィルタします。

・土日・祝日もしくは18:00~23:59の時間帯でつぶやかれたツイート

・エリア内でツイートした日が期間中(4/1~6/20)に4日以上あること

 

 

作業はExcelのピボットを使って行いました。

フィルタ処理の結果、ヒットしたデータのユニークユーザー数は370件となりました。

 ※あきらかにbotっぽいアカウントのデータはここで手作業で除外してます。

 

この絞り込みで見つけた370個のアカウントについて、Twitter APIの仕様限界までツイートをさかのぼってデータ取得すると以下のデータ量が得られました。

【ユニークユーザー】370件

【データ件数】76,226件

【取得できた期間】2014年8月13日~2019年6月20日 ※全部のユーザでとれたわけではない

 

InstagramやFoursquereをTwitterとアプリ連携している人が多いようで毎日たくさんツイートする傾向がみられました。

 

 

さて、このデータをfoliumで地図にヒートマップでプロットしたお楽しみの結果は次の様になりました。(赤い枠線は港区)

f:id:hikiniku11029:20190622133216p:plain

(。´・ω・)ん?

 

 

ちょっとずつズームアウトしてゆきます。。。

f:id:hikiniku11029:20190622133407p:plain

f:id:hikiniku11029:20190622133552p:plain

f:id:hikiniku11029:20190622133704p:plain

(;´・ω・)あれれ..?

 

f:id:hikiniku11029:20190622133901p:plain

f:id:hikiniku11029:20190622134033p:plain

 

 _人人人人人人人人人人_
> 行動範囲が広い! <
 ̄Y^Y^Y^Y^Y^Y^Y^Y^Y ̄

 

 

絞り込んだアカウントの行動範囲がかなり広いことが分かりました。

さすが港区女子が棲息するエリアですな。

世界各国を飛び回る高収入のエリートや成功者が、今回調べたエリアに多く集まってそうな気がします。

 

なかなか興味深い地図がかけてよかったです。

作ったあとズームイン・アウトを繰り返して楽しめました。

 

ここまで読了ありがとうございます。

趣味でエリア分析(2)(時間帯で比較する)

今回は位置情報付きツイートの分布を時間帯で比較しようと思います。

 

時間帯を細かく区切って分析すると時間がかかるので、データを以下の表のように大雑把に4つに分類しました。

f:id:hikiniku11029:20190620100631p:plain

位置情報付きツイートの取得期間は前回の記事と同じく、2019年4月1日から6月14日です。

 

④の休日の夕方~夜(17:30~23:00)の時間帯は、私は居酒屋なりグルメなりを楽しむ時間帯なので、この時間帯の人の特性を知りたいと思いました。

全部の時間帯と対比すると、混乱しそうでしたので①と④を比較することにしました。

①の時間帯、私は仕事でひーこら労働してます。様々な職種があると思いますが、労働者が一番多い時間帯だと思ってます。

 

さて、単純に①と④のデータをfoliumでヒートマップとして地図にプロットした結果を載せます。

※今回は私が住んでいる首都圏を見てゆきます

f:id:hikiniku11029:20190620101635p:plain

 

データの密度的に十分インサイトを得られそうですね。

ここから、①のデータを青色、④のデータを黄色で プロットしなおした結果が以下です。

f:id:hikiniku11029:20190620101947p:plain

 

もう少し色を工夫すれば、見栄えが良くなりそうな気がしますが、カラーコーディネートが難しいので今回はこれで分析します。

さてさて、お楽しみの縮尺を狭めて①と④の差を見てゆきます。

 

新宿周辺

f:id:hikiniku11029:20190620103540p:plain

前回の記事でわかっていた通り西口方面のオフィス街は青色ばかりで、④の時間帯は人が少なそうです。

大ガード下から歌舞伎町・ゴールデン街方面をズームします。

f:id:hikiniku11029:20190620103828p:plain

ほほーう。私がよく飲みに行くあたり以外でも賑わっている場所を見つけました。

こんど探検しに行こうと思います。
 

 

渋谷エリア

f:id:hikiniku11029:20190620104953p:plain

④の時間帯は西口方面にツイートが集中してます。

ズームします。

f:id:hikiniku11029:20190620105505p:plain

センター街近くの交番付近にツイートが集中してますね。

(あそこらへんに美味しいお店あったっけな?)

私が思っていた以外の場所にツイートが集中しているスポットがあったので、これも探検しに行こうと思います。

 

 

もう一つくらい街を見ようと思いズームアウトします。

f:id:hikiniku11029:20190620110613p:plain

赤枠で囲った新宿・渋谷エリア以外でどこを分析しようか考えます。。 

 

ココにしました。

 

新橋駅周辺

f:id:hikiniku11029:20190620111207p:plain

サラリーマンの街、新橋。さすが①の時間帯の位置情報付きツイートを示す青色が多いです。

平日の夕方に一杯ひっかける居酒屋や立ち飲み屋が多くありますが、近くの銀座に引けをとならい、合コンで使える料理店があるので、私は休日でも行くことがあります。

魚金が好きです、いいよ魚金。

ズームします。

f:id:hikiniku11029:20190620111610p:plain

①の青色と④の黄色が両方とも集中しているスポットもありますが、④の分布は飲食店がある区画に集中してますね。自分の土地勘とも合います。

青色しかない区画は、ランチメニューが美味しいお寿司屋さんとか定食屋があった覚えがありあります。
こういったデータと自分の思い出を突き合わせて地図を眺めるのは悪くないです。
 

 

前回、力を入れすぎたので、今回はここまでにします。

新たなグルメスポットを開拓すべきインサイトを得られたので満足です。

 

 

 読了ありがとうございました。