非エンジニアが地理空間系ビッグデータと仲良くなる方法

こんにちは！（の時間のうちに投稿できることを目指した書き始め）
[IESHIL CONNECT](https://connect.ieshil.com/) ／ [IESHIL](https://ieshi.com)でディレクターをしている稲垣と申します。
こちらは[Livesense - 関 Advent Calendar 2017](https://qiita.com/advent-calendar/2017/livesense-kan)、17件目のエントリです。

「**関**」で非エンジニアが真っ先に思いつくのはやっぱり**関**数ですが、~~今年覚えた新しい関数が１コしかないので~~ 今年は大量の緯度経度データを扱う新サービスの立ち上げを０から担当させてもらったので、地理空間系のビッグデータと企画骨子を**関**連付けるときに知っておきたかったことを投稿させていただきます。

総務省から[DATA GO JP](http://www.data.go.jp/)というオープンデータのカタログサイトなどが立ち上がるなど、オープンデータ戦略に注目が集まる近年ですが、まだまだ「どうやって向き合っていいか分からない…(´・ω・｀)」という人が大半なのではないでしょうか。
かく言う私も去年まで、地理空間データとは面識はありませんでしたが、今年１年で**「緯度経度って可愛い」**って思うようになりました。（個人の感想です）
そんなこんなで、おおまかにこんな流れでお届けします。

1. サービスの自己紹介
2. 取り扱った地理空間データ
3. ふんわりした企画をデータと詰め切るポイント
4. 緯度経度データにも強い！分析ツール「Tableau」でお手軽ハザードマップをつくろう

# 1. サービスの自己紹介
[IESHIL CONNECT](https://connect.ieshil.com/)は、地震・洪水・液状化などの災害リスクを、マンションごとにまとめて検索・確認することができる不動産営業マン向けの情報ツールです。
イメージとしては、SUUMOやLIFULL(旧HOME'S)などで物件を検索した時に、平米数や築年数などと一緒にハザードマップや、災害リスクの解説文がチェックできるようなサイトを思い浮かべてみていただければと思います。
住まいを探すときに、「永く安心して、心地よく暮らせる環境かどうか」を可視化するサービスになることを目指し、まずは災害リスクの情報提供からスタートしました。
もう少し興味を持っていただけた方は、開発背景などの記事も併せて読んでみてください！
- [難易度の壁を超えて誕生した不動産テック「IESHIL CONNECT」の狙い](https://japan.cnet.com/article/35108982/)
- [約8億点のデータで不動産物件の災害リスクを可視化--「IESHIL CONNECT」開発秘話](https://japan.cnet.com/article/35112041/)

# 2. 取り扱った地理空間データ
今回の開発では、**マンションデータ(27万件) ✕ 災害データ(8億ポイント)**を扱いました。
災害データはオープンデータを編集・活用しています。

- [IESHIL](https://www.ieshil.com/)のマンションデータ
     - 緯度経度、住所、築年数、階建て、構造、査定価格、etc.
- 災害データ
    - 緯度経度、想定震度
    - 緯度経度、PL値（液状化リスクを表す値）
    - 緯度経度、洪水時の想定浸水深
    - 緯度経度、土砂災害警戒エリア判定フラグ

そうです、27万件のマンションと8億ポイントの災害データを緯度経度で紐付けて取り回していきます。
災害ごとにデータの特性も異なってきてしまうので、ここから先は「地震」にフォーカスしてご紹介します。

# 3. ふんわりした企画をデータと詰め切るポイント
さて、勝負はこれから。
データは目の前にありますがその量は手に余り、また緯度経度という特性上、生データを見ても一体どこで何が起こるかサッパリです。

このときに決まっていたことは、大きく３つ。

- マップ上で災害リスクを可視化したい
- 地震が起こったときに、どんな被害や生活影響が起こるかを、文章で解説したい（そしてその文章を自動生成したい）
- 災害リスクをスコアリング（★★★☆☆）で表現したい

ふんわりしてますね。このフンワリ感と、目の前の膨大なデータを紐付けるには、
「ハザードマップ形式で見せたいなら、塗り分ける色数は人の目で判別できないと困るから、最大５色になるようにデータまとめよう！」といったように、**実現したいことをベースに情報を整理し、データに与える制約や、その後の作業をまとめていく**工程が重要でした。
震度のMAX値とMIN値・平均と分散といった特徴、また地図上の空間と紐付けた際のバラつき具合を、ちゃんと肌で理解していないと非常に進めにくい工程です。
なお、この工程は完全にニワトリタマゴです。
例えば、「最初は４色でいきたいと思ったけど数値の分散と地図上のマッピング見てみたら、明らかに同じ色の面積が広すぎるから、もう１色増やしたい」みたいなことがガンガン起こります。
さらに、今は新規サービス開発の真っ只中。いちいち、イメージ確認用のモックなんて用意している場合ではありません。

だからこそ、機能として下記の２つが必要不可欠になってきます。

- 大量のデータを素早く演算できる
- 地図上のマッピングやグラフ化など、目で見て理解できる形に処理する

扱ったデータはTreasure Data上で共有してもらっていたため、前者にはあまり苦戦しませんでした。
元データが8億行あっても1分未満で返してくれるPrestoの威力に、これほど感謝したことはありません。
困ったのは後者です。

# 4. 緯度経度データにも強い！分析ツール「Tableau」でお手軽ハザードマップをつくろう
ということで、マッピングです。
緯度経度データを地図上に表してほしいのです。

できそうなツールは何種類かありますが、
今回は、前者の「大量のデータを素早く演算できる」ことや、「グラフ化」などもセットで叶えてくれる点から
**[Tableau Desktop](https://www.tableau.com/ja-jp/products/desktop)**を導入しました。
「なーんだ、結局有料ツールか」と思った方も、ご安心ください。無料版（[Tableau Public](https://public.tableau.com/ja-jp/s/)）があります。
無料版では「Public」の名の通り、データを保存する際にオンライン公開する必要があります。
公開不可なデータの取り回しには不向きですが、保存不要な一時的な分析や公開しても問題ないデータの処理なら無料版でも活躍してくれるでしょう。

どのくらい簡単かというと、**５ステップで簡易なハザードマップができてしまう**くらいです。
具体的な流れをご紹介しますね。
### 1. 取り込んだデータを地図の形に落とす
いきなりです。まずは、CSVなど取り込みたいデータをTableauで開いたら、
該当する情報列（以下フィールド）に対し、「緯度」「経度」のそれぞれの役割を割り振ります。
<img width="400" alt="map_1_lat.png" src="https://qiita-image-store.s3.amazonaws.com/0/146324/3e5b8bd7-a056-0dcb-cc10-8d0a90b23e0d.png">

役割が割り振れたら、「緯度」「経度」それぞれを「メジャー」から「ディメンション」に移すため、上にぐいっとドラッグ&ドロップします。
ディメンションに移せたら、「緯度」を行、「経度」が列にあたるようにもう一度フィールドをドラッグ＆ドロップします。
<img width="800" alt="map_1.png" src="https://qiita-image-store.s3.amazonaws.com/0/146324/3acfdc47-aea9-e530-814a-b512e526e4cf.png">

はい！地図になりました！

### 2. 不要なデータを削る
ちょっと縮尺が小さすぎるのでスクロールで寄ってみます。…困りました。明らかに変なところ（海）にもポイントがあります。
<img width="800" alt="map_2.png" src="https://qiita-image-store.s3.amazonaws.com/0/146324/fc5937c9-7214-b435-4989-f658783760dc.png">

では、フィルタ機能で不要データを削りましょう。
フィルタリングしたいフィールドを「フィルタ」にドラッグ＆ドロップして、「NULL」からチェックを外して適用→OKします。
<img width="400" alt="map_2_filter.png" src="https://qiita-image-store.s3.amazonaws.com/0/146324/298325e2-ee37-1a72-9bc2-ada9b78810b2.png">

今回はNULLの行を地図から省きますが、この機能なら「震度３未満のポイントを除外する」などの処理ももちろん可能です。

<img width="800" alt="map_3.png" src="https://qiita-image-store.s3.amazonaws.com/0/146324/a68507b3-9a4e-ab26-35b9-e62859790f7c.png">

スッキリキレイになりましたね！

### 3. データの値によって色を塗り分ける
これは本当にカンタン。塗り分けたいフィールドを「色」にドラッグ＆ドロップするだけ！

<img width="1057" alt="map_4.png" src="https://qiita-image-store.s3.amazonaws.com/0/146324/a28c5a6b-98ef-c279-51bd-0c6ddb43297c.png">

（小数点以下が何位にも細かくなっているデータを0.5刻みのグループに均す「ビンの作成」という処理を間に挟んでいますが、こちらは割愛します。）

### 4. 色の変更
ハザードマップなので、危険なところほど危険そうな色にしたいところです。
「色の編集」では、既存のカラーパレットから色のパターンを選択することができます。
<img width="500" alt="map_4_color.png" src="https://qiita-image-store.s3.amazonaws.com/0/146324/812d15da-7160-c19c-43d6-9801d13c1f77.png">

<img width="800" alt="map_5.png" src="https://qiita-image-store.s3.amazonaws.com/0/146324/c53cbd8a-5b76-b260-bcc8-c6f74a52a947.png">

これで、震度の大小がいかにも分かりやすい感じになりましたね。

なんと、データの取り込みからココまで、５分以内でできてしまいます。

さらにさらに、気になる0.5刻みに均した震度データのレコード数分布チェックもあっという間です。
新しいシートを足して、列に作成したビンを、行にレコード数を落とすだけ。
<img width="800" alt="bar.png" src="https://qiita-image-store.s3.amazonaws.com/0/146324/2ecd02ca-dc80-a61f-d742-fea7feb1cdef.png">

こうやって見て初めて、「3.5」のグループと「4.0」のグループをまとめて「4.5未満」のグループにしたいなー、
などのイメージが湧くようになります。

最初「8億行…？27万件…？」と思っていたデータも、こうやって地図に落ちたり、グラフになったりすると一気に把握しやすくなりますね。
Google Mapなどのオンライン地図サービスを背景地図として取り込むなど、カスタマイズ性にも優れているのはもちろん、
とにかく処理が早いので**データ処理作業の時間を削って考える時間を増やしてくれる**のがとても心強い味方でした。

# おわりに

いかがでしたか？
ほんの少しでも、**「緯度経度データって可愛い」**の気持ちが伝わったなら幸いです。

生データは無機質です。
一方、「知っている地名」✕「知っている情報」として**関**連付けられると一気に違う扉が開いて見え、感動することがたくさんありました。この記事を読んでくださった皆さんの地図に、来年少し違う色が加わるといいな、と思います。笑

最後に、初めてづくしのサービス開発に一緒に向き合い、この記事で紹介した感動とワクワクを共有してくれたチームの皆さんに１年分の感謝を！！
来年はもっともっと、新しい扉がたくさん開きますように！

明日は[reprimande](https://qiita.com/reprimande)センパイです。
よろしくお願いしますm(_ _)m