Successfully reported this slideshow.
We use your LinkedIn profile and activity data to personalize ads and to show you more relevant ads. You can change your ad preferences anytime.

db analytics showcase sapporo 2017 発表資料

2,114 views

Published on

「オープンデータをまぜまぜHackしよう」
2017/6/30~7/1に開催されたdb analytics showcase sapporo 2017における発表資料です。

Published in: Data & Analytics
  • Be the first to comment

db analytics showcase sapporo 2017 発表資料

  1. 1. オープンデータを まぜまぜHackしよう db analytics showcase Sapporo 2017 2017/6/30 株式会社 Preferred Networks エンジニア 三好 邦彦 (@colspan)
  2. 2. 三好 邦彦 ● 経歴 ○ 十勝地方幕別町出身 ○ 2002年4月~2008年3月札幌にて大学生時代を送る ○ 2008年4月~2017年3月 : 精密機器メーカー研究開発 ○ 2016年4月~現在 : 釧路公立大学皆月研究室 学術研究員(遠隔) ○ 2017年4月~現在 : 株式会社 Preferred Networks エンジニア ● 受賞歴 ○ 2015年 北海道オープンデータハッカソン クリプトンフューチャーメディア賞 ○ 2016年 アーバンデータチャレンジ 2015 ファイナル アプリケーション部門 金賞 ○ 2016年 Mashup Awards Civil Tech部門 ファイナリスト ● その他 ○ とかち東京クラブ 代表 ■ 関東在住十勝出身者のゆるいコミュニティ、関東で北海道と十勝を発信中
  3. 3. 私は ● 元組み込み機器ミドルウェアエンジニア ● データエンジニア ● 可視化エンジニア ● Webアプリ開発エンジニア
  4. 4. Seseki アーバンデータチャレンジ2015 アプリ部門金賞 http://colspan.github.io/seseki_viewer/
  5. 5. PFNに興味がある方は 是非お声がけください!
  6. 6. では本題に入ります
  7. 7. オープンデータが身近になった
  8. 8. しかし、すぐに数字の羅列が行く手を阻む
  9. 9. そこで、まぜまぜHackしよう 合成可視化
  10. 10. 事例紹介 北海道観光客統計データ可視化 QuadKeyを活用したメッシュ分析
  11. 11. 事例紹介 北海道観光客統計データ可視化 QuadKeyを活用したメッシュ分析 オープンデータとの全面戦争と 「まぜまぜ」の大切さに 気づくきっかけ
  12. 12. 事例紹介 北海道観光客統計データ可視化 QuadKeyを活用したメッシュ分析 オープンデータとの全面戦争と 「まぜまぜ」の大切さに 気づくきっかけ より細かい「まぜまぜ」
  13. 13. 事例1 : 北海道観光客統計データ可視化 2015年当時の私が全力投球したプロダクト http://bit.ly/hkdtourismstat
  14. 14. なぜオープンデータ解析の趣味を始めたか ● 地元に対する理論武装が必要になったため(とかち東京クラブの幹事) ● タダで手に入るオープンデータを知り、解析に着手 泥臭いクレンジング作業の先にある宝の山を目撃し、やる気MAX http://bit.ly/hkdtourismstat
  15. 15. 作品を具現化する ためにやったこと http://bit.ly/hkdtourismstat
  16. 16. 作業フロー 元データ 収集済 データ 解析可能 データ 抽出 クレンジング 公開 可視化 http://bit.ly/hkdtourismstat
  17. 17. 作業フロー 元データ 収集済 データ 解析可能 データ 抽出 クレンジング 公開 可視化 http://bit.ly/hkdtourismstat 残念ながら、近道はありませんでした。
  18. 18. オープンデータとの全面戦争 http://bit.ly/hkdtourismstat
  19. 19. 年によってファイル名がバラバラ http://bit.ly/hkdtourismstat
  20. 20. Excelファイルのバージョンがバラバラ http://bit.ly/hkdtourismstat
  21. 21. CC BY 北海道 http://bit.ly/hkdtourismstat
  22. 22. 改行による改ページ (しかもズレてる) セル結合 6 メトリクス列挙 うち1行は集計行 キング・オブ・セル結合 CC BY 北海道 http://bit.ly/hkdtourismstat 大量のワークシート 振興局の集計行
  23. 23. 誤植 ここだけ結合拒否 CC BY 北海道 http://bit.ly/hkdtourismstat
  24. 24. まさに神エクセル http://bit.ly/hkdtourismstat 情報が公開されることはとても素晴らしいのですが …
  25. 25. 神によって隠されたデータを掘り出す http://bit.ly/extract_hokkaido_irikomi
  26. 26. 何とか抽出できました http://bit.ly/extract_hokkaido_irikomi
  27. 27. 可視化の闇 ● 地図データを調達 ○ shp?? ○ 北海道の市町村境界を GeoJSONにしたら50MBになった ○ TopoJSONで簡略化・圧縮が必須 (GUNMA GIS GEEKの清水さんに感謝) ● CSVファイルを読み込みたい ○ ファイルサイズ・ファイル差し替え汎用性を考えると非同期読み込み必須 ○ promise必須 ● 地図を可視化したい ○ 地図の座標変換方法でトライアンドエラーを繰り返す ○ 塗り分け方法も手探り ■ 配色 ■ 凡例 ■ イベントハンドラの登録 http://bit.ly/extract_hokkaido_irikomi
  28. 28. shp GeoJSON TopoJSON D3.js 自前コード 3000行 gdal topojson xls / xlsx xls2csv クレンジング コード 700行 生csv 可視化用csv 50MB 3MB
  29. 29. しかし、アプリができても すぐに行き詰った
  30. 30. 何を可視化しても札幌が一等賞
  31. 31. でも、しばらくデータを眺めて閃いた
  32. 32. 割り算すれば良い!
  33. 33. 北海道には牛が人よりも多い 市町村が51もある 順位 市町村名 飼育頭数の人口 比 1 士幌町 10.94 2 別海町 7.00 3 標茶町 6.79 4 上士幌町 6.70 5 鶴居村 5.56 鹿追町, 清水町, 新得町, 大樹町, 豊頃町, 佐呂間町, 天塩町, 標津町, 浜中町, 陸別町, 幌延町, 豊富町, 足寄町, 猿払村, 興部町, 湧別町, 浦幌町, 雄武町, 白糠町, 本別町, 美深町, 更別村, 西興部村, 浜頓別町, 中 札内村, 置戸町, 広尾町, 中標津町, 中頓別町, 弟子屈町, 滝上町, 津別町, 厚岸町, 遠別町, 中川町, 大空町, 芽室町, 枝幸町, 池田町, 下川町, 訓子府町, 小清水町, 新冠町, 初山別村, 愛別町, 紋別市 権利元 : 独立行政法人家畜改良センター
  34. 34. 観光客数 ÷ 人口 観光の基本は温泉とスキー 固有な観光地を有さない市町は ほぼ人口の10~20倍に収束
  35. 35. 全国に汎用化 Seseki
  36. 36. 他の都市を評価できるようにもなった
  37. 37. まぜまぜHack 合成可視化
  38. 38. まぜまぜHack 合成可視化
  39. 39. 事例2 : QuadKeyを活用したメッシュ分析 市町村単位の可視化をやり尽くした末に、もっと細かい粒度でまぜまぜし始めた
  40. 40. オープンデータの特徴 ● 地理情報が多い ● 統計情報が多い ○ 人口 ○ 収穫量 ○ 経済指標 ● 集計単位がバラバラ ○ 点 ○ 市町村単位 ○ メッシュ単位
  41. 41. 発想の転換 単位がバラバラだから、まぜまぜした前例が少ない 究極的には自分の地元に振れば絶対にオリジナル作品 多くの人にとって身近なネタに化けやすい
  42. 42. 作業フロー 元データ 収集済 データ 合成 解析可能 データ 抽出 クレンジング 公開 可視化 New!
  43. 43. 実装方針 ● すべてのデータの集計単位を統一する 具体的には ● 市町村単位よりも細かくしたメッシュ単位 ● メッシュの符号化のためにQuadKeyを活用する
  44. 44. QuadKeyとは ● 緯度経度を2×2で4分割し、Z走査で名前をつけたもの ● 各領域が0〜3の文字列で表現される ● 階層的になっているので、必要な精度で止められる ● 釧路公立大学 (東経144. 396度, 北緯43. 018度)の ハッシュコードは 1312233010103310 出典:https://msdn.microsoft.com/ja-jp/library/bb259689.aspx
  45. 45. QuadKey To ○○ に落とし込む ● 「各市町村の人口」を求めるなら ○ QuadKey to 人口 ○ QuadKey to 市町村 ● 「各市町村の傾斜地に住んでいる人口」を求めるなら ○ QuadKey to 人口 ○ QuadKey to 市町村 ○ QuadKey to 傾斜 JOINで様々な組み合わせの集計ができる!
  46. 46. データの変換 ● 国勢調査・国土数値情報の3次メッシュ統計値をQuadKeyにリサンプリング ○ CSV入手 (クリック面倒くさすぎwwww ) ○ 3次メッシュを2次元のnumpy arrayに展開 ○ scipy.ndimageでQuadKey空間にリサイズ ○ 符号化してSQLiteにレコードを格納 ● 国土数値情報の行政区域データから市町村とQuadKeyの対応表を作成 ○ 国土数値情報の行政区域データ (ベクトル)をQuadKey空間にラスタライズ ○ 市町村名とQuadKeyの対応を総当りで取得し、 SQLiteにレコードを格納
  47. 47. 実例 : 人は傾斜のない場所に住む
  48. 48. 傾斜度ごとの人口 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
  49. 49. 全道の94%の住民が傾斜0~5度に住む
  50. 50. さらなるデータを求めて 各空港の人口カバー率を知りたい!
  51. 51. 処理概要 ● OSMの道路データベースを探索 ○ フリーの探索エンジン OSRMをローカルに立てる ○ 全道各地から全13空港へ総当り計算(ただし直線距離で探索枝切り ) ○ 結果をSQLiteに保存 ● 上記をLuigiのパイプラインとして記述し、並列計算 ○ レベル10の粒度でタイル分割し、 1タイル1タスクに(1571タイル) ■ 1タイルあたり64×64ピクセルで距離計算 ■ 総問い合わせ回数は 8365万 ○ Luigiで並列計算と計算進捗管理 ■ CPUのコアを使い切る! ■ OSRMがたまに落ちるから進捗管理必須 ! ■ 4世代Core i5で2日間、居住区域に限定すると 2時間 ● 可視化・集計
  52. 52. 計算実演
  53. 53. 計算結果の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
  54. 54. 可視化・集計結果 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%
  55. 55. まぜまぜHack 合成可視化
  56. 56. 機械学習を活用した分析を個人的に挑戦中 統計データのクラスタリング モノクロ地図の着色
  57. 57. pix2pixを国土地理院タイルで学習する
  58. 58. 発想と具現化のループ 着想 具現化 新たな応用に気づく FBやTwitterでシェアされ、 キーマンと知り合える キーマンからいろいろ教えてもらえる スキルが増える データを整理する データをまぜまぜする 可視化する 公開する 増えた知識やスキルで 手数が増える 具現化物を想像すると モチベーションが高まる
  59. 59. 機会を下さったすべての皆様に感謝 ● オープンデータ整備に携わった皆様 ● 本日お集まり頂いた皆様
  60. 60. オープンデータを まぜまぜHackしよう db analytics showcase Sapporo 2017 2017/6/30 株式会社 Preferred Networks エンジニア 三好 邦彦

×