隗より始めよ

今後はいろいろ考え始めます。

PythonとPlotlyでオープンデータを可視化する

f:id:mazarimono:20181126224111j:plain

下の記事の続きです。

www.mazarimono.net

一先ず、経緯緯度は取れることが分かりましたが、ここからが、データの前処理の面倒なところです。

しかし、面倒っていっても、お役所仕事なのである程度は型にはまっているため、もうこれ無理って感じではないため、処理の練習には良いなぁという感じです。データセットごと作り替えなくても良いものを選んだというのもありますが、いい感じの面倒さです。

今回選んだデータは、京都市の旅館業法に基づく許可施設一覧というデータです。正直データはなんでもよかったんですが、ちょっとこれが先につながりそうかなぁグフフって感じなこともあり選びました。

data.city.kyoto.lg.jp

データ概要

宿泊所の名前、やっている会社名、提出者名、所在地、申請日がありました。私としてはまずは宿泊所の名前と、所在地をプロットしてみたいなと思いました。あと、データ処理としては申請日が昭和、平成、西暦と混ざって存在するため、全て西暦に統一し、所在地もヤフーのAPIは番地までしか判断できず、それ以上細かいのを渡すと、返信は200で帰ってくるものの、経度と緯度がない状態で帰ってくるという感じだったので、とりあえず、番地までしか表示しない住所を作ることにしました。

これはこれで面倒で、「-」の全角半角、「番地」、「番」、「の」が入り混じっていました。これを削る処理が一番面倒でした。全ての住所を確認していませんが、「番」とかって普通に住所にもありそうだし、「の」も混在してそうです。とりあえず、色々調べていると、後ろから文字列を分割するrsplitなるものがあるようですが、今回はそれを使わず、splitで、分割された文字列が2つ以上だったらくっつけるという作業をしました。

成型後のデータ

f:id:mazarimono:20181127090543p:plain

その後、番地データでも数値が返ってこないケースがあり、結局、経度緯度を見てエラーが出たら一文字削るという荒業で対応することにしました。

始めからそうしていたらと思う反面、再帰的な書き方が分からなかったために、tryとexceptをただひたすらコピペする荒行。再帰的な書き方を取得するべく、明日以降の研究課題に突っ込んでおきました。

可視化する

そんな感じで今日半日かけてデータを処理していました。前処理はかなり勉強になるけど、時間がめちゃかかるので、お金になりそうなケース以外はしたくないなぁ・・・ (今回も期待薄ですがトレーニングです)

というわけで、全てのデータの申請日の西暦化と所在地の経度緯度の取得が完了したので、可視化することにしました。京の町の宿泊諸事情はいかがなものでしょうか。

plotlyを使って可視化できると、dashを使えることになるので、ひとまずplotlyを使ってみることにしました。plotlyで可視化できるときれいですしね。

調べるとすぐにそれっぽいサイトがヒットしました。

plot.ly

ここを読んでいるとMapboxというやつのアクセストークンがいるけど、plotlyでも結構簡単に地図情報を可視化できるみたいです。

続いてmapboxのサイトを見てみます。気になるのはお値段ですが・・・1か月5万のアクセスまで0ドルと、全然大丈夫ですよって感じのレベルでした。ので、とっととアカウントを作成しました。

チャートの複数のプロットもほぼサイトにある通りでいけます。先ほどのscattermapboxの真ん中のやつです。

dataのところのlat = lat1および、lon= lon1のところのlat1, lon1はデータをリストにしたものです。3000ちょっとあります。layoutのところのlatとlonは最初にビューがある場所の設定、pitchは地図を見る角度、zoomは最初に表示される地図の拡大具合の設定となっています。

import plotly.plotly as py
import plotly.graph_objs as go

mapbox_access_token="your_token"  <== 自分が得たトークン

data =[
    go.Scattermapbox(
        lat=lat1,
        lon=lon1,
        mode='markers',
        opacity=0.6,
        marker=dict(
            size=10
        ),
        text = name
    )
]

layout = go.Layout(
        autosize=True,
        hovermode='closest',
        mapbox=dict(
            accesstoken=mapbox_access_token,
            bearing=5,
            center=dict(
                lat=lat2,
                lon=lon2
            ),
            pitch=90,
            zoom=11
        ),
    )

fig = dict(data=data, layout=layout)
py.iplot(fig, filename="Raku-Un-Sou")

今回できたのはこんな感じ

f:id:mazarimono:20181126223133g:plain

初めてにしては良い感じにできました。問題としては画像の大きさをコントロールできないっぽいことです。これはdashでやったらできるかなぁ。あと、申請日でマーカーの色を変えてたり、時期によって色分けしてとか思いますが、また今度。

「無理」の構造 ―この世の理不尽さを可視化する

「無理」の構造 ―この世の理不尽さを可視化する