Download - db analytics showcase sapporo 2017 発表資料
オープンデータをまぜまぜHackしよう
db analytics showcase Sapporo 20172017/6/30
株式会社 Preferred Networks エンジニア三好 邦彦 (@colspan)
三好 邦彦
● 経歴○ 十勝地方幕別町出身
○ 2002年4月~2008年3月札幌にて大学生時代を送る
○ 2008年4月~2017年3月 : 精密機器メーカー研究開発
○ 2016年4月~現在 : 釧路公立大学皆月研究室 学術研究員(遠隔)○ 2017年4月~現在 : 株式会社 Preferred Networks エンジニア
● 受賞歴○ 2015年 北海道オープンデータハッカソン クリプトンフューチャーメディア賞
○ 2016年 アーバンデータチャレンジ 2015 ファイナル アプリケーション部門 金賞
○ 2016年 Mashup Awards Civil Tech部門 ファイナリスト
● その他○ とかち東京クラブ 代表
■ 関東在住十勝出身者のゆるいコミュニティ、関東で北海道と十勝を発信中
Seseki
アーバンデータチャレンジ2015 アプリ部門金賞
http://colspan.github.io/seseki_viewer/
事例紹介
※ Sesekiはただのフロントエンド開発なので今回は触れません
北海道観光客統計データ可視化 QuadKeyを活用したメッシュ分析
オープンデータとの全面戦争と
「まぜまぜ」の大切さに
気づくきっかけ
事例紹介
※ Sesekiはただのフロントエンド開発なので今回は触れません
北海道観光客統計データ可視化 QuadKeyを活用したメッシュ分析
オープンデータとの全面戦争と
「まぜまぜ」の大切さに
気づくきっかけ
より細かい「まぜまぜ」
事例1 : 北海道観光客統計データ可視化
2015年当時の私が全力投球したプロダクト
http://bit.ly/hkdtourismstat
なぜオープンデータ解析の趣味を始めたか
● 地元に対する理論武装が必要になったため(とかち東京クラブの幹事)●
タダで手に入るオープンデータを知り、解析に着手
泥臭いクレンジング作業の先にある宝の山を目撃し、やる気MAX
http://bit.ly/hkdtourismstat
作品を具現化するためにやったこと
http://bit.ly/hkdtourismstat
作業フロー
元データ
収集済
データ解析可能
データ
抽出
クレンジング
公開
可視化
http://bit.ly/hkdtourismstat
作業フロー
元データ
収集済
データ解析可能
データ
抽出
クレンジング
公開
可視化
http://bit.ly/hkdtourismstat
残念ながら、近道はありませんでした。
オープンデータとの全面戦争
http://bit.ly/hkdtourismstat
年によってファイル名がバラバラ
http://bit.ly/hkdtourismstat
Excelファイルのバージョンがバラバラ
http://bit.ly/hkdtourismstat
改行による改ページ(しかもズレてる )
セル結合6 メトリクス列挙うち1行は集計行
キング・オブ・セル結合
CC BY 北海道
http://bit.ly/hkdtourismstat
大量のワークシート
振興局の集計行
神によって隠されたデータを掘り出すhttp://bit.ly/extract_hokkaido_irikomi
何とか抽出できましたhttp://bit.ly/extract_hokkaido_irikomi
可視化の闇
● 地図データを調達○ shp??○ 北海道の市町村境界を GeoJSONにしたら50MBになった
○ TopoJSONで簡略化・圧縮が必須 (GUNMA GIS GEEKの清水さんに感謝 )
● CSVファイルを読み込みたい○ ファイルサイズ・ファイル差し替え汎用性を考えると非同期読み込み必須
○ promise必須
● 地図を可視化したい○ 地図の座標変換方法でトライアンドエラーを繰り返す
○ 塗り分け方法も手探り
■ 配色
■ 凡例
■ イベントハンドラの登録
http://bit.ly/extract_hokkaido_irikomi
shp
GeoJSON
TopoJSOND3.js
自前コード3000行
gdal
topojson
xls / xlsx
xls2csv
クレンジングコード700行
生csv
可視化用csv
50MB
3MB
北海道には牛が人よりも多い
市町村が51もある順位 市町村名 飼育頭数の人口
比
1 士幌町 10.94
2 別海町 7.00
3 標茶町 6.79
4 上士幌町 6.70
5 鶴居村 5.56
鹿追町, 清水町, 新得町, 大樹町, 豊頃町, 佐呂間町, 天塩町, 標津町,浜中町, 陸別町, 幌延町, 豊富町, 足寄町, 猿払村, 興部町, 湧別町, 浦幌町, 雄武町, 白糠町, 本別町, 美深町, 更別村, 西興部村, 浜頓別町, 中札内村, 置戸町, 広尾町, 中標津町, 中頓別町, 弟子屈町, 滝上町, 津別町, 厚岸町, 遠別町, 中川町, 大空町, 芽室町, 枝幸町, 池田町,下川町, 訓子府町, 小清水町, 新冠町, 初山別村, 愛別町, 紋別市
権利元 : 独立行政法人家畜改良センター
QuadKeyとは
● 緯度経度を2×2で4分割し、Z走査で名前をつけたもの
● 各領域が0〜3の文字列で表現される
● 階層的になっているので、必要な精度で止められる
● 釧路公立大学
(東経144. 396度, 北緯43. 018度)のハッシュコードは
1312233010103310
出典:https://msdn.microsoft.com/ja-jp/library/bb259689.aspx
QuadKey To ○○ に落とし込む
● 「各市町村の人口」を求めるなら○ QuadKey to 人口
○ QuadKey to 市町村
● 「各市町村の傾斜地に住んでいる人口」を求めるなら○ QuadKey to 人口
○ QuadKey to 市町村
○ QuadKey to 傾斜
JOINで様々な組み合わせの集計ができる!
データの変換
● 国勢調査・国土数値情報の3次メッシュ統計値をQuadKeyにリサンプリング○ CSV入手 (クリック面倒くさすぎwwww )○ 3次メッシュを2次元のnumpy arrayに展開
○ scipy.ndimageでQuadKey空間にリサイズ
○ 符号化してSQLiteにレコードを格納
● 国土数値情報の行政区域データから市町村とQuadKeyの対応表を作成○ 国土数値情報の行政区域データ (ベクトル)をQuadKey空間にラスタライズ
○ 市町村名とQuadKeyの対応を総当りで取得し、 SQLiteにレコードを格納
傾斜度ごとの人口
select q.commune, sum("0-5"), sum("5-10"), sum("10-15"), sum("15-20"), sum("20-25"), sum("25-30"), sum("30-") from(select * from mesh_population join (select inclination.qkey, case when inclination.value between 0 and 5 then mesh_population.value else 0 end as "0-5", case when inclination.value between 5 and 10 then mesh_population.value else 0 end as "5-10", case when inclination.value between 10 and 15 then mesh_population.value else 0 end as "10-15", case when inclination.value between 15 and 20 then mesh_population.value else 0 end as "15-20", case when inclination.value between 20 and 25 then mesh_population.value else 0 end as "20-25", case when inclination.value between 25 and 30 then mesh_population.value else 0 end as "25-30" , case when inclination.value > 30 then mesh_population.value else 0 end as "30-" from mesh_population join inclination on inclination.qkey = mesh_population.qkey) as inclination on inclination.qkey = mesh_population.qkey) as mp inner join (select * from commune_qkey as cq inner join communes as c on c.commune_id = cq.commune_id) as q on mp.qkey = q.qkey group by q.commune
処理概要
● OSMの道路データベースを探索○ フリーの探索エンジンOSRMをローカルに立てる○ 全道各地から全13空港へ総当り計算 (ただし直線距離で探索枝切り )○ 結果をSQLiteに保存
● 上記をLuigiのパイプラインとして記述し、並列計算○ レベル10の粒度でタイル分割し、 1タイル1タスクに(1571タイル)
■ 1タイルあたり64×64ピクセルで距離計算■ 総問い合わせ回数は 8365万
○ Luigiで並列計算と計算進捗管理■ CPUのコアを使い切る !■ OSRMがたまに落ちるから進捗管理必須 !■ 4世代Core i5で2日間、居住区域に限定すると 2時間
● 可視化・集計
計算結果のDBに対するクエリ
select airport_id, sum(value) from (select a.qkey, p.value, a.hospital_id from airports as a join mesh_population as p on p.qkey = a.qkey and ranking = 0) group by airport_id
可視化・集計結果
http://bit.ly/hokkaido_airport_time_distance空港名 人口 カバー率
新千歳空港 3,226,286 58.4%
旭川空港 697,726 12.6%
函館空港 489,704 8.9%
帯広空港 346,665 6.3%
女満別空港 247,998 4.5%
釧路空港 242,926 4.4%
中標津空港 96,728 1.7%
紋別空港 89,059 1.6%
稚内空港 80,445 1.5%
利尻空港 5,259 0.1%
礼文空港 3,158 0.1%
奥尻空港 2,722 0.0%
発想と具現化のループ
着想 具現化
新たな応用に気づくFBやTwitterでシェアされ、キーマンと知り合えるキーマンからいろいろ教えてもらえるスキルが増える
データを整理するデータをまぜまぜする可視化する公開する
増えた知識やスキルで手数が増える
具現化物を想像するとモチベーションが高まる