国土数値情報のデータから都道府県ポリゴンを作る
「都道府県のポリゴンってWebに落ちてない?」 「国土数値情報から作ればいいじゃん」
という掛け合いがありましたので、国土数値情報の行政界データから都道府県ポリゴンを作る方法について書いておきたいと思います。 使うものはPostgreSQLとPostGISです。
まずは国土数値情報から全国分の行政界データをダウンロードします。
これをPostgreSQLに取り込みます。取り込むときはPostGIS Shapefile Import/Export Managerを使うと楽ですね。PostGISインストールしてたらプラグインから呼び出しができます。
pgAdminなんかで中身を見るとn03_001フィールドに都道府県名が格納されているのがわかるので、これをキーにしてポリゴンの結合を行います。
CREATE TABLE pref_polygon AS SELECT n03_001 AS pref_name, ST_Multi(ST_Union(geom)) AS geom FROM n03-16_16101 GROUP BY n03_001
これでいけるはず。
PostGISのST_Multiでマルチポリゴンを生成。ST_Unionで結合。GROUP BYで括れるので、都道府県名(n03_001)をキーにします。
東京以外全部沈没 今後50年地価変遷(予測)の可視化
地図の可視化の勉強をしていたところ、こんなTweetを見つけまして
日本は東京以外、超速で地価が下がっていくの図 pic.twitter.com/bzoCQnlZqm
— 重村俊雄 Tosha Shigemura (@shigemuratoshio) 2016年8月1日
東京以外は大体死ぬということなんですが、どこがどの程度死ぬのかわからないので地図化してみました。
都道府県を触ると10年後、20年後~50年後の地価変化が吹き出しで表現されます。基準は現在の地価を基準としているようです。
可視化して思ったんですが、福岡の地価より宮崎の地価のほうが減衰率低いって何事やねん。。俺の知らない間に宮崎県超進化してたりするんです??
あとは青森と徳島。現在の地価から90%ディスカウントは異常だ。。
使ったものとか
使ったのはPostgreSQL(PostGIS)とQGIS、あとCartoの無償プランです。
データは国土数値情報から行政界ポリゴンを取得してきて、PostGISを使用して都道府県のポリゴンを作成しました。Tweetの数値はQGISの編集モードからコツコツ書き込んでいます。
作ったデータをKMLに加工(これもQGIS)してCartoにデータをアップロードしてみたのですが、約300MBのKMLを上げたらどうしても途中でこけまして、仕方がないので何とかデータを削って50MB程度まで抑えました。
データを削る方法はQGISのポリゴン簡素化、および時系列でのアニメーションを諦めるという2つの手法を用いています。
Cartoでは時間軸を持たせたデータセットを使うことでアニメーションを作れるのですが、都道府県の形状が微妙になるまでポリゴン簡素化しても150MBを切れません。150MBのデータでもアップロードこけるので、今回はアニメーションあきらめました。
もともとのデータがTwitterからの拾い物ですので、問題等ありましたらご連絡をお願いします。
しかしCartoは便利だな。
- 作者: 筒井康隆,山藤章二
- 出版社/メーカー: 角川書店
- 発売日: 2006/06/24
- メディア: 文庫
- 購入: 9人 クリック: 111回
- この商品を含むブログ (135件) を見る
Pythonコードの"if __name__=='__main__':"の意味に関する個人メモ
備忘録です。
nameの条件分岐の意味をちゃんと理解していなかったので。他人に何かを教えるときにはちゃんと理解した上で説明すべきだし、公開しとくと尚良いです。
Pythonのコードを読んでいると、以下の条件分岐がコードの最終行近くに書いてあるのを見かけるかと思います。
def ConfNameSample(): print('これは__name__確認用のサンプルコードです') if __name__ == '__main__': ConfNameSample()
↑のif以降の部分
これはスクリプトとして実行された場合のみ、関数の中身を実行するという条件を表しています。言い換えると、トップレベルファイルとして実行した場合のみConfNameSampleが実行されます。
トップレベルファイルとして実行された場合、nameにはmainが代入されます。一方で、モジュールとしてインポートされた場合には、nameにはファイル名が代入されます。
分かりにくいので補足
例えば、以下の様なPythonスクリプトを作成します。名前は適当で良いですが、今回はsample.pyとしました。defで定義した関数の二行目でnameに何が入っているか確認できるようになっています。
def WhatIsName(): print('__name__の中身を確認するよ!') print(__name__) if __name__ =='__main__': WhatIsName()
これをどっかのフォルダに入れておいて、コマンドプロンプトやコンソールから実行してみます。すると以下の様な出力が得られるはずです。
スクリプト(トップレベルファイル)として実行するとnameの中身はmainになっています。じゃあモジュールとして読み込んだらどうなってるのかも確認してみましょう。
さっきのやつをちょっと修正して
def WhatIsName(): print('モジュールとしてインポートしたときの__name__の中身は') print(__name__)
コマンドプロンプトからPythonの対話シェルに入ってインポートします。モジュールと関数を呼び出すとこんな感じ。
実行スクリプトが事故を起こさないようにするために、ちゃんと記しておいたほうがいいですね。
Pythonを使ってTwitterのタイムラインを収集する
「実践 機械学習システム」の第六章ではTwitterのタイムラインを使った感情分析を行っています。ただし英語のTweetを対象としているので、(たぶん)*1サンプルコードを実行してもあまり面白くはないのです。できることなら日本語でやりたい、というわけで自分のタイムラインからTweetを収集してみましょう。実行環境はPython3系を想定してますが、2系でも動くはずです。
基本的には↓のやり方を踏襲します。
必要なものは以下
Twitter APIの認証キーを取得する
Twitterのアプリケーションマネジメントサイトに行ってアプリケーションの登録を行います。
"Create New App"から必要事項を入力していくと特に問題なく登録できるはず。最近は電話番号の登録を迫られるみたいです。営業電話でもかかってくるんだろうか。。
登録が完了したら"Consumer Key (API Key)"の欄にある"manage keys and access tokens"のリンクから先に進み、以下の4種類のキーを取得します。
これはコピペでどっかわかるところに保管しておきます。
Pythonライブラリの取得
pip使って導入。
pip3 install requests_oauthlib pip3 install pandas
タイムラインの収集
Twitter APIでタイムラインを取得しますが、一度に取得できるTweet数の上限とAPI制限があるのでその辺と上手く付き合います。取得Tweetの上限が100件、API制限が15分に15回までとのこと。
分類器作る場合には10,000件ほどのTweetが欲しいので、パラメータで100件とってくるよう指定して、数分ごとに再取得を繰り返すようにしておきます。
CK、CS、AT、ASには先ほどコピペしたConsumer Key (API Key)、Consumer Secret (API Secret)、Access Token、Access Token Secretをそれぞれ入れておきます。
from requests_oauthlib import OAuth1Session import json import time CK = 'XXXXXXXXXXXXXXXXXXXXXX' CS = 'XXXXXXXXXXXXXXXXXXXXXX' AT = 'XXXXXXXXXXXXXXXXXXXXXX' AS = 'XXXXXXXXXXXXXXXXXXXXXX' url = "https://api.twitter.com/1.1/statuses/home_timeline.json" params = {'count': 100} TweetList = [] twitter = OAuth1Session(CK, CS, AT, AS) for i in range(100): req = twitter.get(url, params = params) if req.status_code == 200: timeline = json.loads(req.text) for tweet in timeline: TweetList.append(tweet["text"]) else: print ("Error: %d" % req.status_code) time.sleep(240)
4分もあればタイムラインが一巡しそうだったので、timeモジュールを使って240秒ごとに回るように指定をかけています。これを7時間ほど置いとくとTweetListにタイムラインが格納されていきます。
CSVで吐き出す
とってきたタイムラインをテキストデータとして加工したいので、Pandasを使ってデータフレームに落とし込み、それをCSVとして吐き出します。他にもやり方はありますが、型やエンコードで嵌らないのでPandasがおすすめです。
import pandas as pd df = pd.DataFrame(TweetList) df.to_csv('hogehoge.csv')
これで教師用データの収集はできたはず。後は発言にネガティブ/ポジティブ/そのほかのラベル貼りをやらないと。その辺は別枠で。
追記
Tweetは200件まで取れました。教えていただいてありがとうございます!
@Takaki_ Twitterの取得制限について、15分に何回APIが叩けるかはここですね。https://t.co/AEG08RJV2J
— まぽよん@しばらくポケモン勢 (@mapoyon) May 8, 2016
一度に取得出来る量については200件まで取れそうですけどダメでしたか?https://t.co/niDEazahLR
*1:実際に動かしてないのでホントのところは不明