Upgrade to Pro — share decks privately, control downloads, hide ads and more …

190713_FOSS4G_TORIMAKU.pdf

 190713_FOSS4G_TORIMAKU.pdf

One compath

July 13, 2019
Tweet

More Decks by One compath

Other Decks in Technology

Transcript

  1. ONE COMPATH
    位置情報 × マーケティングはじめました

    View Slide

  2. ONE COMPATH
    って何者

    View Slide

  3. 2019年4月1日に生まれた新会社

    View Slide

  4. ONE COMPATHとは
    COM⇒共に
    ひとつの組織、ひとつの指針
    一歩一歩のイノベーション
    COMPASS?
    PATH⇒道を作る

    View Slide

  5. 会社概要
    所在地 港区芝浦
    社員数 116名(2019年4月時点/出向者含む)
    資本金 600百万円
    代表取締役社長CEO 早川 礼
    事業内容 インターネットメディア事業

    View Slide

  6. 家族が増えました

    View Slide

  7. ONE COMPATHのサービス
    1,100万人/月
    11万店舗/20万枚
    3,000万人のデータ
    利用率No.1電子チラシサービス※
    ※マクロミル・翔泳社共同インターネット調査 2018年12月
    1,200万人/月
    POI 700万件
    250企業
    日本初のインターネット地図サービス
    お出かけが楽しくなる
    位置情報活用型戦国
    スタンプラリーゲーム
    ふたり専用コミュニケーションアプリ あなたの一歩が、宝にかわる。
    プラットフォーム型ウォーキングアプリ

    View Slide

  8. View Slide

  9. エリアデータマートTORIMAKUとは
    DMP
    興味関心
    属性情報
    生活エリア
    CRM施策 商圏分析 顧客管理
    集客・プロモーション
    天気・気温
    エリア特性
    周辺施設
    気象状況や周辺の生活環境などのエリアに紐づく
    環境データを集約し、提供するデータサービス

    View Slide

  10. 性別 年代 嗜好 特定行動..
    ターゲティング精度向上

    View Slide

  11. ターゲティング精度の限界
    課題1
    リーチボリュームの低下
    課題2
    パーソナル特性
    以外の要因
    ターゲティング
    精度上げ止まり
    収益インパクト
    縮小
    予算消化が
    進まない
    ターゲティング精度向上
    性別 年代 嗜好 特定行動..

    View Slide

  12. パーソナル特性による行動決定要因
    外部環境による行動決定要因
    母数の補完
    効率化の加速
    ・クリエイティブ
    ・キャッチコピー
    DMP的アプローチ
    ココロ
    コミュニケーション
    リーチ母数低下
    効率化の限界
    TORIMAKU的アプローチ

    View Slide

  13. TORIMAKU概要
    データ種別 データの粒度
    データ加工 提供形式
    気象データ ジオデモデータ
    API バルク
    1kmメッシュ 都道府県~町丁字
    正規化 偏差化

    View Slide

  14. TORIMAKUの強み
    マーケティング
    利用に特化した
    メニューが少ない
    データフォーマットが
    統一されていない
    利用するために
    初期投資が必要
    価格面・利用範囲面などの
    調整が個別に必要
    マーケティング活用には
    複雑なデータの正規化が必要
    サーバ構築・API開発など
    一定の初期投資が必要
    位置情報加工が得意なONE COMPATHが吸収

    View Slide

  15. 東京のあるエリアに住んでいる名無しのAさん
    TORIMAKUがない世界
    位置情報しか分からない…

    View Slide

  16. TORIMAKUのある世界
    中華麺の消費支出が高いトリ
    付近に中華料理屋があるトリ
    外食の消費支出が高いトリ
    昨日より5度暑いトリ











    Click!!
    東京のあるエリアに住んでいる名無しのAさん

    View Slide

  17. TORIMAKUでできること
    クライアント:旅行代理店A社
    与件:北海道旅行者を獲得したい

    View Slide

  18. 特徴をTORIMAKUで分析すると…
    TORIMAKU 分析
    北海道に来た名無しさん達
    平均年収が高い
    北海道に来がちな人
    国内パック旅行費が高い
    航空運賃が高い
    麺類外食が多い
    スポーツ用品費が多い

    View Slide

  19. TORIMAKU API
    「北海道に来がちな人」ですか?
    YESトリ
    Click!!

    View Slide

  20. TORIMAKU API
    YESトリ
    YESトリ
    Noトリ
    39.729429,140.1092876に住んでいる人は北海道に来がちですか?
    〒108-0023のエリアに住んでいる人は北海道に来がちですか?
    大阪府大阪市西区に住んでいる人は北海道に来がちですか?

    View Slide

  21. ターゲティング条件に活用することが可能
    北海道に来がちな条件を備えている
    北海道に来がちな条件を備えていない
    北海道に来がちな条件を備えている
    性別 年齢 旅行履歴 郵便番号
    男性 30代 静岡に1度行った 108-0023
    性別 年齢 旅行履歴 住所
    女性 40代 岩手に1度行った 大阪府大阪市西区
    Tさん
    Mさん
    性別 年齢 旅行履歴 緯度経度
    ?? ?? ???? 39.729429,140.1092876
    Kさん
    旅行代理店A社
    TORIMAKU API

    View Slide

  22. 保有している位置情報は様々
    北海道に来がちな条件を備えている
    北海道に来がちな条件を備えていない
    北海道に来がちな条件を備えている
    性別 年齢 旅行履歴 郵便番号
    男性 30代 静岡に1度行った 108-0023
    性別 年齢 旅行履歴 住所
    女性 40代 岩手に1度行った 大阪府大阪市西区
    Tさん
    Mさん
    性別 年齢 旅行履歴 緯度経度
    ?? ?? ???? 39.729429,140.1092876
    Kさん
    旅行代理店A社
    TORIMAKU API

    View Slide

  23. 保有している位置情報に合わせて
    柔軟にデータを提供したい

    View Slide

  24. 位置の指定
    座標(緯度経度)
    都道府県
    メッシュコード
    リクエスト
    人口は100万人トリ
    郵便番号
    小地域コード(11桁) 人口 世帯数 ビール消費量
    13203002001 ~ ~ ~
    13203002002 ~ ~ ~
    都道府県コード(2桁) 人口 世帯数 ビール消費量
    13 ~ ~ ~
    14 ~ ~ ~
    レスポンス
    つまり、なにがしたいのか

    View Slide

  25. 座標(緯度経度)
    都道府県
    メッシュコード
    リクエスト
    郵便番号
    変換が必要でした
    変換
    都道府県コード(11桁) 人口 世帯数 ビール消費量
    13 ~ ~ ~
    14 ~ ~ ~
    座標(緯度経度)
    都道府県コード(2桁)
    市区町村コード(5桁)
    小地域コード(11桁)
    メッシュコード
    小地域コード(11桁) 人口 世帯数 ビール消費量
    13203002001 ~ ~ ~
    13203002002 ~ ~ ~
    位置の指定

    View Slide

  26. 緯度経度から小地域コードが取得できない
    座標(緯度経度)
    都道府県コード(2桁)
    市区町村コード(5桁)
    小地域コード(11桁)
    メッシュコード
    既にあるデータセットと互換性があった
    計算式で解決
    国勢調査独自のコード体系のため
    互換性がない
    既にあるデータセットと互換性があった

    View Slide

  27. 今日話すこと
    座標(緯度経度) 小地域コード(11桁)
    これを解決するまでの道のりをご紹介します
    国勢調査独自のコード体系のため
    互換性がない

    View Slide

  28. そのまえに...小地域コードとは
    北海道/札幌市白石区/東札幌5条1丁目1-1
    都道府県コード 01(JIS 2桁)
    市区町村コード 104(JIS 2桁)
    小地域コード 260501(独自定義 6桁)
    GISで利用可能な境界域のオープンデータが提供されています。
    市区町村を町丁・字等によって
    細分した地域を表すコードです
    おおむね市区町村内の
    「△△町」「〇〇2丁目」「字□□」
    などの区域に対応しています。

    View Slide

  29. QGISでデータを見るとこんな感じ
    01104260501

    View Slide

  30. つまり逆ジオコーディング
    地名や住所から地理座標を付与することをジオコーディングといいます。
    北海道札幌市白石区東札幌5条1丁目1-1
    →緯度:43.056194 経度141.385690
    緯度経度から都道府県名や市区町村名を付与することを逆ジオコーディ
    ングといいます。
    緯度:43.056194 経度141.385690
    → 北海道札幌市白石区東札幌5条1丁目1-1
    緯度経度から小地域コードを付与するのは逆ジオコーディング
    緯度:43.056194 経度141.385690
    → 01104260501

    View Slide

  31. 元データについて
    e-Stat (政府統計の総合窓口)が提供している
    小地域境界データ(町丁・字等)を元に作成しています。

    View Slide

  32. 話をもどしまして
    座標(緯度経度) 小地域コード(11桁)
    これを解決するまでの道のりをご紹介します
    国勢調査独自のコード体系のため
    互換性がない

    View Slide

  33. 作り方の検討がつきません!
    タスケテクダサイ
    シェープファイルからメッシュ単位に区切って
    GeoTIFF作ってるんですよ、
    ソースはこれです! URL
    …ありがとうございます(GeoTIFF?なんだろう)
    …みてみます(全然わかんないですが)
    社内でのやり取り


    先輩

    View Slide

  34. 地理参照情報が埋め込まれたビットマップ画像
    画像の左上の座標が埋め込まれていたり
    測地系が埋め込まれていたり
    1pxあたりの座標の
    増分、減分が埋め込まれていたり
    そもそもGeoTIFFとは

    View Slide

  35. .tif
    ②ST_Intersects,
    ST_MakeEnvelopeを利用して
    メッシュ単位にデータ分割
    ③gdal_rasterizeを利用して
    GeoTIFF形式でファイル出力
    Shape形式からGeoTIFF形式への変換
    .Shape
    ①shp2pgsqlを利用して
    Postgresにデータ格納
    .tif
    .tif

    View Slide

  36. gdal_rasterizeコマンド
    gdal_rasterize -a_nodata 0 -ot UInt32 -te 139 35.3333 140 36
    -tr 0.00011111111111 0.00011111111111
    -a address_code -of Gtiff -sql "~~~" sample.tif
    実行したコマンド

    View Slide

  37. あれ?なにかおかしい
    UINT32は符号なし2ビット=0~4,294,967,295
    4294967295
    13203002001

    View Slide

  38. UINT32以上の型がない…おわったかも…orz

    View Slide

  39. こうなったら!!
    UINT64指定してやる!
    ドキュメントに載ってないけど!

    View Slide

  40. gdal_rasterizeコマンド
    gdal_rasterize -a_nodata 0 -ot UInt64 -te 139 35.3333 140 36
    -tr 0.00011111111111 0.00011111111111
    -a address_code -of Gtiff -sql "~~~" sample.tif
    実行したコマンド

    View Slide

  41. できてるー!

    View Slide

  42. 13203002001
    で確認してみると

    View Slide

  43. GeoTIFFは作れた!
    次は読み込んでみよう
    社内のリバースジオコーダーは
    Java Advanced Imaging API (JAI)
    で実装してあったのでソースコードを拝借して…
    実行!
    Exception:~~~~
    ~~~~
    ~~~~
    ~~~~
    ~~~~

    View Slide

  44. UINT64に対応していない

    View Slide

  45. GDAL Python API 試してみた。
    import os, errno
    from osgeo import gdal, gdalconst
    from affine import Affine
    ds = gdal.Open(ファイルパス, gdalconst.GA_ReadOnly)
    if ds is None:
    raise FileNotFoundError(errno.ENOENT, None,ファイルパス)
    geotransform = ds.GetGeoTransform()
    affine = Affine.from_gdal(*geotransform)
    original_image = ds.GetRasterBand(1).ReadAsArray()
    col, row = ~affine * (float(経度), float(緯度))
    original_image[int(row)][int(col)]

    View Slide

  46. できてるー!

    View Slide

  47. すごいぞGDAL Python API

    View Slide

  48. 問題発生

    View Slide

  49. それぞれ試してみたが、求めるパフォーマンスに到底及ばず…
    数十秒...かかる
    1次メッシュコードで分けて169ファイル。容量70G
    2次メッシュコードで分けて4735ファイル。容量30GB
    生成したGeoTIFFファイル重すぎる

    View Slide

  50. もうキャッシュするしかない!
    キャッシュしようと思うので
    メモリ32GBのサーバーをください。
    16GBでがんばって
    うそー!


    上司

    View Slide

  51. キャッシュ軽量化
    ここって同じ小地域コード(11桁)が
    1px毎に入ってるから、
    軽量化できそう。

    View Slide

  52. キャッシュ軽量化
    1 2 2 2 2 2 3 3 3 3
    1 2 2 2 2 2 3 3 3 3
    2 2 2 2 2 2 3 3 3 3
    2 2 2 2 2 2 3 3 3 3
    2 2 2 2 2 3 3 3 3 3
    2 2 2 2 2 3 3 3 3 3
    2 2 2 2 3 3 3 3 3 3
    2 2 2 2 3 3 3 3 3 3
    2 2 2 3 3 3 3 3 3 3
    2 2 2 3 3 3 3 3 3 3
    1 12345678901
    2 12345678902
    3 12345678903
    12345678901 12345678902 12345678902 12345678902 12345678902 12345678902 12345678903 12345678903 12345678903 12345678903
    12345678901 12345678902 12345678902 12345678902 12345678902 12345678902 12345678903 12345678903 12345678903 12345678903
    12345678902 12345678902 12345678902 12345678902 12345678902 12345678902 12345678903 12345678903 12345678903 12345678903
    12345678902 12345678902 12345678902 12345678902 12345678902 12345678902 12345678903 12345678903 12345678903 12345678903
    12345678902 12345678902 12345678902 12345678902 12345678902 12345678903 12345678903 12345678903 12345678903 12345678903
    12345678902 12345678902 12345678902 12345678902 12345678902 12345678903 12345678903 12345678903 12345678903 12345678903
    12345678902 12345678902 12345678902 12345678902 12345678903 12345678903 12345678903 12345678903 12345678903 12345678903
    12345678902 12345678902 12345678902 12345678902 12345678903 12345678903 12345678903 12345678903 12345678903 12345678903
    12345678902 12345678902 12345678902 12345678903 12345678903 12345678903 12345678903 12345678903 12345678903 12345678903
    12345678902 12345678902 12345678902 12345678903 12345678903 12345678903 12345678903 12345678903 12345678903 12345678903

    View Slide

  53. まだいける。軽量化
    1 2 2 2 2 2 3 3 3 3
    1 2 2 2 2 2 3 3 3 3
    2 2 2 2 2 2 3 3 3 3
    2 2 2 2 2 2 3 3 3 3
    2 2 2 2 2 3 3 3 3 3
    2 2 2 2 2 3 3 3 3 3
    2 2 2 2 3 3 3 3 3 3
    2 2 2 2 3 3 3 3 3 3
    2 2 2 3 3 3 3 3 3 3
    2 2 2 3 3 3 3 3 3 3
    1 12345678901
    2 12345678902
    3 12345678903
    もっと圧縮
    numpy.savez_compressed
    13GBまで小さくなり、ぎりぎりセーフ

    View Slide

  54. 緯度経度から小地域コードが取得できる!
    座標(緯度経度)
    都道府県コード(2桁)
    市区町村コード(5桁)
    小地域コード(11桁)
    メッシュコード
    既にあるデータセットと互換性があった
    計算式で解決
    新規作成して解決
    既にあるデータセットと互換性があった

    View Slide

  55. 座標(緯度経度)
    都道府県
    メッシュコード
    リクエスト
    郵便番号
    変換ができるようになりました
    変換
    都道府県コード(11桁) 人口 世帯数 ビール消費量
    13 ~ ~ ~
    14 ~ ~ ~
    小地域コード(11桁) 人口 世帯数 ビール消費量
    13203002001 ~ ~ ~
    13203002002 ~ ~ ~
    位置の指定
    人口は100万人トリ
    レスポンス

    View Slide

  56. まとめ
    FOSS4Gを利用することで
    比較的簡単に
    リバースジオコーダーを作成することが出来る。
    UINT64に対応していてくれて
    本当に本当に助かった
    データの形式がシンプルに行列なので、
    Numpyとも相性がよく、助かった!
    6/26(水)無事リリース完了

    View Slide

  57. でも...
    じつはまだ問題が残ってます
    まとめておきながら...

    View Slide

  58. あれ?なんだ?この隙間
    NoData
    13122028004
    11237042005
    出来上がったGeoTIFFを確認すると隙間が…

    View Slide

  59. 隙間できてる
    重なってる
    元データのシェープファイルで
    既に県境がしっかりとしていなかった

    View Slide

  60. 行政区画データで補完しようと思ったが、
    余計にずれが発生する場合もあるため保留になっています
    なんとかしようと思ったが

    View Slide

  61. 良い案ご存知の方、懇親会でお待ちしてます。

    View Slide

  62. View Slide