お問い合わせTOPレポートエンジニアリングpyDAMSパッケージを使って無制限にジオコーディング00000ENGINEERINGpyDAMSパッケージを使って無制限にジオコーディング2018.11.10システムデザイン部のTです。住所から座標を調べたいってシチュエーション、エリア別マーケティングなどでよくありますよね?これ、簡単なようで意外と厄介で、特に量がたくさんある場合やリアルタイム処理をしたい場合は以下のことに気を付けなくてはいけません。MapsのAPIを叩けば一発じゃないか、と思われる方も多いかもしれませんが、商用利用は有料なうえ、利用規約で地図画像の表示も求められます。(そうだ!ダミーサイト作ってそっちに表示させればいい!)https://cloud.google.com/maps-platform/terms/?hl=ja#section_10_12そうでなくともAPIの利用の際は、サーバーへのアクセス集中による負荷を避けるために、アクセス間隔や回数に制限がかかっていることが一般的です。いって、国土交通省HPからインストールできる位置参照データ(http://nlftp.mlit.go.jp/isj/)を参照しようとしても、まずは与えられた住所のどこまでが都道府県名、どこまでが市区町村...といった具合で分割をしなくてはなりません。今回はこうした困難を回避した無料で速く柔軟に対応できるジオコーディング方法として、フリーのpythonパッケージであるpyDAMSをご紹介しようと思います。pyDAMSとは?pyDAMSの前に、まずはDAMSについてお話しします。センターが開発・提供する位置情報変換パッケージです。http://newspat.csis.u-tokyo.ac.jp/geocode/modules/dams/index.php?content_id=1このパッケージは無料で配布されており、商用利用も基本的には自由です。C++で書かれており、今となっては少々使い勝手の悪い面があります。この点を克服し、pythonで読み込めるようにしたものが、株式会社ホットリンクのR&D部門の開発したpyDAMSです。https://www.hottolink.co.jp/blog/20180823-2ライセンスは本家DAMSに従うので、こちらも自由に商用利用できます。パッケージなので予測システム等に組み込んで使用でき、APIのようなアクセス制限を受けることもありません。インストールは上記二つのサイトに従い、以下の順で行えます。dams-4.3.4)。・githubからpyDAMSをcloneして使用環境に置く・ビルドしたDAMSに含まれる.soファイルを、cloneしてきたpydamsフォルダに入れる・pyDAMS開発者ブログではdams.soと書かれていますが、実際はlibdams-4.3.4.soです。・/dams-4.3.4/lib/.lib/libdams-4.3.4.soにあります。・pyDAMSをビルドする・一部cythonで書かれているため、必要に応じてcythonやlibgccなどのインストールが必要になります。ややこしいのですが、cloneしたpydamsフォルダの中にもう一個同名のpydamsフォルダが存在していて、pythonからimportするのは内側の方のpydamsフォルダ(パッケージ)です。notebookファイル(.ipynb)と同じ階層に、内側のpydamsパッケージとlibdams-4.3.4.soファイルを置いておきましょう。`で内側のパッケージをコピーしてから、同階層のpythonファイルでimportしてもよいです。pydamsフォルダ内がカオスになりますが...)インストールしたら以下のように試してみましょう。例として、弊社の住所をジオコーディングしてみます。‘3番’}]]}このように、辞書型とリストが入れ子になったオブジェクトが返ってきます。‘candidates’キーで該当する住所の候補がリスト得られ、さらにその中に辞書型で住所の詳細levelに応じた経度(x)と緯度(y)が格納されています。今回は住所候補が一通りに絞られているので、以下のようにして最も詳細な番地までの座標情報を取得します。geocoded_here[‘candidates’][0][-1][‘y’]特徴まずは速さ。(GCP)上で処理してみたところ、12秒程度で座標を取得することができました。超速爆速とまでは行きませんが、1リクエストにつき数秒間を空けないといけないAPIに比べればその差は歴然です。どれくらい正確に位置情報を取得できているのでしょうか?冒頭でも触れた国土交通省が配布する位置情報データを使って試してみたいと思います。群馬県を例に、ダウンロードサービスページhttp://nlftp.mlit.go.jp/cgi-bin/isj/dls/_choose_method.cgiから県内全域の「大字・町丁目レベル」までの位置情報を.csvファイルで取得してきます。群馬県であることに特に深い意味はありません。・pyDAMSでは読み込めない地区が存在しないか・pyDAMSによって得られた座標が、国土交通省のものからどれだけずれるかの2点を調べました。1点目ですが、テストデータに掲載された県内の全住所をpyDAMSで読み込むことができました。実用の最低ラインはクリア、というところです。2点目の精度はどうでしょうか?今回は単純にpyDAMS出力値とテストデータ緯度、経度の平方距離で評価しました。しますと、平均的には0.02度程度の誤差でした。1度のずれを100kmとして換算すると、およそ2km、どれくらい正確な情報が欲しいかによりますが、まあまあといったとこでしょうか。中には0.1度を越える誤差を示す地区もありました。10kmもずれてしまうことになります。10kmというと、だいたい東京タワーから羽田空港くらいの距離です。そのような誤差の大きかった地区を以下に示します。いずれも、市までしかpyDAMSでは絞り込めておらず、町以下が認識されていませんでした。Wikipedia等で調べてみたところ、これらの町は2005年前後に市町村合併に伴い村から町へと改称していました。2005~6年ごろで住所の更新が止まっているらしく、それより新しい情報は含まれていないようです。最後に表記ゆれへの吸収力を見てみます。同様の位置情報をAPIの中では利用規約がやや緩いHeartRails(http://geoapi.heartrails.com/)と比較してみたところ、こちらでは読み込めない地域がいくつか存在しました。調べてみたところ、HearRailsでは「角渕」ではなく「角淵」として登録されていました。正式名称はどうやら「角渕」の方らしいのですが、一方のpyDAMSでは両方とも認識することができました。網羅的には調べられておりませんが、HeartRailsは丁目以下を漢数字でないと読み取ってくれないのに対し、pyDAMSはアラビア文字全角半角でも読み取れたりもするので、pyDAMSは表記の揺らぎには比較的柔軟に対応してくれるようです。まとめpyDAMSは、住所情報がやや古い代わり、無制限に使えて自動で住所分割もしてくれて、おまけに表記ゆれもある程度吸収してくれます。リアルタイムで届く顧客情報と座標データとの対応付けを低コストで行いたい、などといったケースでは役に立つかと思います。※余談ですが、以前とある案件で関西地区のデータを都道府県指定で抽出したところ、なぜか東京のデータが紛れ込んでいました。「京都府」と見事マッチングして釣り上げられていた、なんてこともありました。手法をつないだベストセラー、待望の3訂版。(13)オススメの本たち。USお仕事のご依頼やご相談はこちらからお問い合わせください。