読者です 読者をやめる 読者になる 読者になる

QuZeeBlog@Hatena

地図屋で働くデータサイエンティストもどき

国土数値情報のデータから都道府県ポリゴンを作る

PostgreSQL GIS

都道府県のポリゴンってWebに落ちてない?」 「国土数値情報から作ればいいじゃん」

という掛け合いがありましたので、国土数値情報の行政界データから都道府県ポリゴンを作る方法について書いておきたいと思います。 使うものはPostgreSQLPostGISです。

まずは国土数値情報から全国分の行政界データをダウンロードします。

国土数値情報 行政区域データの詳細

これをPostgreSQLに取り込みます。取り込むときはPostGIS Shapefile Import/Export Managerを使うと楽ですね。PostGISインストールしてたらプラグインから呼び出しができます。

pgAdminなんかで中身を見るとn03_001フィールドに都道府県名が格納されているのがわかるので、これをキーにしてポリゴンの結合を行います。

CREATE TABLE pref_polygon AS 
SELECT 
n03_001 AS pref_name,
ST_Munti(ST_Union(geom)) AS geom
FROM n03-16_16101 
GROUP BY n03_001

これでいけるはず。

PostGISのST_Multiでマルチポリゴンを生成。ST_Unionで結合。GROUP BYで括れるので、都道府県名(n03_001)をキーにします。

qiita.com

東京以外全部沈没 今後50年地価変遷(予測)の可視化

可視化 PostgreSQL

地図の可視化の勉強をしていたところ、こんなTweetを見つけまして

東京以外は大体死ぬということなんですが、どこがどの程度死ぬのかわからないので地図化してみました。

都道府県を触ると10年後、20年後~50年後の地価変化が吹き出しで表現されます。基準は現在の地価を基準としているようです。

可視化して思ったんですが、福岡の地価より宮崎の地価のほうが減衰率低いって何事やねん。。俺の知らない間に宮崎県超進化してたりするんです??

あとは青森と徳島。現在の地価から90%ディスカウントは異常だ。。

使ったものとか

使ったのはPostgreSQLPostGIS)とQGIS、あとCartoの無償プランです。

データは国土数値情報から行政界ポリゴンを取得してきて、PostGISを使用して都道府県のポリゴンを作成しました。Tweetの数値はQGISの編集モードからコツコツ書き込んでいます。

作ったデータをKMLに加工(これもQGIS)してCartoにデータをアップロードしてみたのですが、約300MBのKMLを上げたらどうしても途中でこけまして、仕方がないので何とかデータを削って50MB程度まで抑えました。

データを削る方法はQGISのポリゴン簡素化、および時系列でのアニメーションを諦めるという2つの手法を用いています。

Cartoでは時間軸を持たせたデータセットを使うことでアニメーションを作れるのですが、都道府県の形状が微妙になるまでポリゴン簡素化しても150MBを切れません。150MBのデータでもアップロードこけるので、今回はアニメーションあきらめました。

もともとのデータがTwitterからの拾い物ですので、問題等ありましたらご連絡をお願いします。

しかしCartoは便利だな。

日本以外全部沈没―パニック短篇集 (角川文庫)

日本以外全部沈没―パニック短篇集 (角川文庫)

Pythonコードの"if __name__=='__main__':"の意味とは

Python

備忘録です。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()

これをどっかのフォルダに入れておいて、コマンドプロンプトやコンソールから実行してみます。すると以下の様な出力が得られるはずです。

f:id:kazutaka83:20160828124747p:plain

スクリプト(トップレベルファイル)として実行するとnameの中身はmainになっています。じゃあモジュールとして読み込んだらどうなってるのかも確認してみましょう。

さっきのやつをちょっと修正して

def WhatIsName():
    print('モジュールとしてインポートしたときの__name__の中身は')
    print(__name__)

コマンドプロンプトからPythonの対話シェルに入ってインポートします。モジュールと関数を呼び出すとこんな感じ。

f:id:kazutaka83:20160828130240p:plain

実行スクリプトが事故を起こさないようにするために、ちゃんと記しておいたほうがいいですね。

シン・ゴジラを楽しむための地図を作りました

雑記

シン・ゴジラを見ていても、土地勘のない人はなかなか場所のイメージが付きにくいです。というわけでゴジラを楽しむための地図を作りました(主に自分がロケ地巡りするときのため)

第一次上陸ルートを作成する際にはからぱたさんのサイトを参考にさせていただいています。

wivern.exblog.jp

第二次上陸ルートは土地勘が無さすぎるため、あいまいな部分が多々あります。ゴジラがそばを通り過ぎた煙突とかどこにあるのだろう。 あとは

  • ゴジラが倒した居住用ビル
  • ゴジラが第二形態→第三形態に変態する場所
  • 放射火炎の被害地区

なんかを地図上に落としたいところです。詳しい方情報をお待ちしております。

Pythonで学ぶ初歩からの統計学(ヒストグラムを作るまで)

Python

Pythonを使って統計学のおさらいをします。手始めに度数分布表とヒストグラムを作ります。 度数分布表の作り方は以下の通り。

  1. データの範囲(最大値と最小値の差)を求める
  2. 階級(Class)の数を定める
  3. 階級の幅(Class Interval)を決める
  4. 度数(Frequency)を集計する
続きを読む

『実践 機械学習システム』の第6章をやってみる

Python

この記事は5月30日のAITCオープンラボにてお話しした感情分類器の作り方の補足記事を兼ねています。積み残しがあるのでまだ未完です。

最近オライリーから発売された『実践機械学習システム』はとても良い本で、機械学習の概要と何をしてどのような結果が得られるのかを一通り学ぶことができます。数学的な補足説明もあり良書の類である一方、教師データが手に入らない、ソースコードが間違っている等初心者を殺す罠が満載です。このエントリは罠を回避しつつ、第6章の感情分析を一通りやってみます。

続きを読む

Pythonを使ってTwitterのタイムラインを収集する

Python

「実践 機械学習システム」の第六章ではTwitterのタイムラインを使った感情分析を行っています。ただし英語のTweetを対象としているので、(たぶん)*1サンプルコードを実行してもあまり面白くはないのです。できることなら日本語でやりたい、というわけで自分のタイムラインからTweetを収集してみましょう。実行環境はPython3系を想定してますが、2系でも動くはずです。

基本的には↓のやり方を踏襲します。

qiita.com

必要なものは以下

  • Twitter APIの認証キー
  • PythonのOauthライブラリ(requests_oauthlib)
  • Pythonのデータ解析ライブラリ(Pandas)

Twitter APIの認証キーを取得する

Twitterのアプリケーションマネジメントサイトに行ってアプリケーションの登録を行います。

apps.twitter.com

"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件まで取れました。教えていただいてありがとうございます!

*1:実際に動かしてないのでホントのところは不明