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 full-size slide

  2. ONE COMPATH
    って何者

    View full-size slide

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

    View full-size slide

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

    View full-size slide

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

    View full-size slide

  6. 家族が増えました

    View full-size slide

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

    View full-size slide

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

    View full-size slide

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

    View full-size slide

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

    View full-size slide

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

    View full-size slide

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

    View full-size slide

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

    View full-size slide

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

    View full-size slide

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











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

    View full-size slide

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

    View full-size slide

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

    View full-size slide

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

    View full-size slide

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

    View full-size slide

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

    View full-size slide

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

    View full-size slide

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

    View full-size slide

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

    View full-size slide

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

    View full-size slide

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

    View full-size slide

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

    View full-size slide

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

    View full-size slide

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

    View full-size slide

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

    View full-size slide

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

    View full-size slide

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

    View full-size slide

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


    先輩

    View full-size slide

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

    View full-size slide

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

    View full-size slide

  35. 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 full-size slide

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

    View full-size slide

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

    View full-size slide

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

    View full-size slide

  39. 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 full-size slide

  40. できてるー!

    View full-size slide

  41. 13203002001
    で確認してみると

    View full-size slide

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

    View full-size slide

  43. UINT64に対応していない

    View full-size slide

  44. 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 full-size slide

  45. できてるー!

    View full-size slide

  46. すごいぞGDAL Python API

    View full-size slide

  47. 問題発生

    View full-size slide

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

    View full-size slide

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


    上司

    View full-size slide

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

    View full-size slide

  51. キャッシュ軽量化
    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 full-size 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
    もっと圧縮
    numpy.savez_compressed
    13GBまで小さくなり、ぎりぎりセーフ

    View full-size slide

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

    View full-size slide

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

    View full-size slide

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

    View full-size slide

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

    View full-size slide

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

    View full-size slide

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

    View full-size slide

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

    View full-size slide

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

    View full-size slide