「住所」── 顧客マスタ・配送ラベル・店舗マスタ・営業エリア・ハザードマップ重ね合わせ ── どこにでも出てくるデータです。ところがいざ業務に組み込もうとすると 郵便番号・住所・緯度経度・建物名・部屋番号・法人住所 が独立して存在し、それぞれ別の ・別のデータソース・別の表記ゆれを相手にすることになります。
本記事では、日本の住所データを業務で扱う際に登場する主要なID・座標体系の全体像を整理し、それぞれの 正引き・逆引きの実装パターン と 業務での使い分け方 を一望します。最後にふくふくでよく構築する顧客マスタ住所エンリッチ・パイプラインの設計まで踏み込みます。
本記事の全コードを実行可能なノートブックを `/notebooks/od-17-address-master.ipynb` で配布。郵便番号→住所→緯度経度→Plus Code → what3words までを 1 セルずつ動かせます。ダウンロード後、Google Colab の「ファイル → ノートブックをアップロード」から開いてください。
1. 登場人物の全体像
まず、住所まわりで出てくる主なIDと座標を整理します。それぞれターゲットが違うことが大事。
| コード/座標 | 桁数 | 示すもの | 発行元 | コスト |
|---|---|---|---|---|
| 郵便番号 | 7桁数字 | 町・大字レベルの住所 | 日本郵便 | DL/API無料 |
| 住所文字列 | 可変 | 建物・部屋まで | ── | ── |
| 緯度経度(WGS84) | 小数2つ | 地球上のピンポイント | 国際標準 | 無料(実装は要API) |
| 7桁英数 | 住所(ゆうID登録のもの) | 日本郵便(2025/5〜) | 無料(要ゆうID) | |
| what3words | 3単語 | 3m × 3m の正方形 | what3words 社 | 無料枠あり/有料 |
| Plus Codes | 4〜12文字 | 緯度経度を符号化 | Google(オープン仕様) | 完全無料・オフライン可 |
| 可変英数 | 緯度経度を Base32 符号化 | オープン仕様 | 完全無料 | |
| H3 Index | 15桁16進 | 六角形タイル | Uber() | 完全無料 |
| 法人番号 | 13桁数字 | 法人ID(住所も連動) | 国税庁 | API無料 |
郵便番号 → 住所 は「町まで」、住所 → 緯度経度 で建物が特定でき、緯度経度 → Plus Code / what3words / H3 で別表現に変換できます。これらを連結すると「郵便番号→住所→緯度経度→Plus Code」のような 正引きパイプライン が組めます。
2. 郵便番号 ⇄ 住所
データソース:KEN_ALL.
日本郵便が公開する `KEN_ALL.CSV` が事実上の正本。毎月更新、完全無料、`https://www.post.japanpost.jp/zipcode/dl/kogaki-zip.html` から CSV/Lzh で取得できます。約12万行、CP932 エンコーディング、10列以上。生で扱うのは苦行なので、ライブラリかAPI経由が現実的。
ローカル処理:posuto
!pip install -q posutoimport posuto
p = posuto.get('100-0001')print(p.prefecture) # 東京都print(p.city) # 千代田区print(p.neighborhood) # 千代田# 住所文字列として整形print(str(p)) # 〒100-0001 東京都千代田区千代田API:認証不要で叩けるサービス
| サービス | URL | 認証 | レート |
|---|---|---|---|
| zipcloud | zipcloud.ibsnet.co.jp/api/search | 不要 | 緩い |
| HeartRails Express | geoapi.heartrails.com | 不要 | 緩い |
| 国土地理院 検索 API | msearch.gsi.go.jp/address-search/AddressSearch | 不要 | アクセス頻度を抑える |
import requests
r = requests.get("https://zipcloud.ibsnet.co.jp/api/search", params={"zipcode": "1000001"})data = r.json()for r in data["results"]: print(r["address1"], r["address2"], r["address3"])# → 東京都 千代田区 千代田逆引き:住所 → 郵便番号
posuto は逆引き(住所→郵便番号)を直接サポートしないため、KEN_ALL を pandas で読み込んで町名レベルの正規化マッチをかけます。前処理 EP.07「住所の正規化」 が必要に。
3. 住所 ⇄ 緯度経度()
公的サービス
| サービス | 用途 | 認証 | コスト | 精度 |
|---|---|---|---|---|
| 国土地理院ジオコーダ | 住所→緯度経度 | 不要 | 無料(頻度抑制) | 町・字レベル中心 |
| 国土地理院 逆ジオ | 緯度経度→町丁目 | 不要 | 無料(頻度抑制) | 町丁目 |
| 国土数値情報(位置参照情報) | 全国住所×緯度経度の正本DL | 不要 | 無料 | 番地・街区レベル |
import requests
def gsi_geocode(address: str): r = requests.get( "https://msearch.gsi.go.jp/address-search/AddressSearch", params={"q": address}, timeout=10, ) r.raise_for_status() arr = r.json() if not arr: return None # 先頭結果の coordinates: [lon, lat] lon, lat = arr[0]["geometry"]["coordinates"] return {"lat": lat, "lon": lon, "title": arr[0]["properties"]["title"]}
print(gsi_geocode("東京都千代田区千代田1-1"))# → {'lat': 35.685..., 'lon': 139.752..., 'title': '東京都千代田区千代田1-1'}def gsi_reverse_geocode(lat: float, lon: float): r = requests.get( "https://mreversegeocoder.gsi.go.jp/reverse-geocoder/LonLatToAddress", params={"lat": lat, "lon": lon}, timeout=10, ) return r.json().get("results")
print(gsi_reverse_geocode(35.6862, 139.7528))# → {'muniCd': '13101', 'lv01Nm': '千代田一丁目'} (千代田区千代田一丁目)商用サービス(高精度・有料)
| サービス | 強み | 料金 |
|---|---|---|
| Google Geocoding API | 番地・建物まで網羅、最も正確 | 1000リクエスト/$5前後(要キー) |
| MapBox | 地図とセットで使いやすい | 無料枠あり、超過は従量 |
| Yahoo!ジオコーダ | 国内住所に強い | 無料・要アプリID(商用注意) |
| ArcGIS | GIS統合プラットフォーム | サブスク |
| Geocoding 系 (geocoder.io 等) | シンプルAPI | 従量 |
OSS:Nominatim / 自前ホスティング
OpenStreetMap データを使った Nominatim を で立ち上げれば、完全オンプレで無制限のジオコーディングが可能。GDPR/個人情報保護法上、住所を外部APIに送れないケースで重宝します。日本の住所精度は商用に劣る(番地まで取れないことも)が、バッチ処理+整合性確認用途に十分。
4. 緯度経度 → 別表現(位置エンコーディング各種)
緯度経度をそのまま扱うと精度桁数が冗長で、口頭伝達もしづらい。これを短いコードや人間が記憶しやすい単語に置き換える仕様が複数提案されています。
what3words
3m × 3m のグリッドを 3つの単語で表す商用サービス。例: `cake.found.tribes`。世界中をカバーし、緊急通報や宅配で使われる事例あり。有料API(無料枠あり、エンタープライズ要相談)。
!pip install -q what3wordsimport what3words
api = what3words.Geocoder("YOUR_API_KEY") # accounts.what3words.com で取得res = api.convert_to_3wa(what3words.Coordinates(35.6862, 139.7528))print(res["words"]) # → 例: 'cake.found.tribes'
# 逆も可能back = api.convert_to_coordinates("cake.found.tribes")print(back["coordinates"]) # → {'lat': 35.6862, 'lng': 139.7528}Plus Codes(Google製・オープン仕様)
Google が 完全オープンで公開している位置コード仕様。4〜12文字で精度を選べる。`8Q7XMP9P+39` のような形式。`pluscodes` Python ライブラリで完全オフライン計算可能、APIキー不要・無料。エチオピアやインドの住所が無い地域で公的に採用された実績あり。
!pip install -q pluscodesfrom pluscodes import encode, decode
# 緯度経度 → Plus Code(精度10桁=14m四方、11桁=3.5m)code = encode(35.6862, 139.7528, length=10)print(code) # → '8Q7XMP9P+39'
# Plus Code → 緯度経度area = decode("8Q7XMP9P+39")print(area.center_lat, area.center_lon) # → 35.6862... 139.7528...Geohash(オープン仕様、空間検索向き)
Base32 で緯度経度を階層的にエンコード。`xn76vehmpq8h` のような形式。「先頭文字が同じ = 近い」という性質から、DBインデックスで近傍検索を実現するのに使われます(Redis GEO や Elasticsearch がサポート)。完全無料・オフライン計算可。
!pip install -q python-geohashimport geohash
# 緯度経度 → Geohash(精度=桁数: 7桁≈153m, 9桁≈4.8m)gh = geohash.encode(35.6862, 139.7528, precision=9)print(gh) # → 'xn76vehmp'
# 近隣セルを取得(空間検索用途)print(geohash.neighbors(gh)) # → 周囲8方向のGeohashH3 Index(Uber発、六角形タイル)
Uber が乗車需要分析のために開発したオープンソースの六角形階層タイルシステム。15階層の解像度、近隣セル計算が高速。配車・配送ゾーン・需要密度マップといった集計用途で強い。
!pip install -q h3import h3
# 緯度経度 → H3 Cell(解像度9 ≈ 174m辺の六角形)cell = h3.geo_to_h3(35.6862, 139.7528, resolution=9)print(cell) # → '892f5aa6cc7ffff'
# Cell → 中心の緯度経度print(h3.h3_to_geo(cell)) # → (35.6862..., 139.7528...)
# 周囲のセル(半径2セル分)print(len(h3.k_ring(cell, 2))) # → 19 (中心+周辺18)Maidenhead Locator(アマチュア無線)
世界をブロック分けする最古の位置コードの一つ。`PM95ho` のような形式。アマチュア無線の交信記録で長年使われてきました。汎用業務で使うことは少ないですが、地球全体を一望できる粗い地図グリッドとして教育用途・ハム業務系SaaSなどで現役。
比較表:いつどれを使う?
| 仕様 | オフライン計算 | コスト | 得意な用途 |
|---|---|---|---|
| what3words | ❌(API必要) | 有料(無料枠) | 口頭伝達・緊急通報・物流ピンポイント |
| Plus Codes | ✅ | 無料 | 住所が無い地域の代替・公開リンク |
| Geohash | ✅ | 無料 | DB空間インデックス・近傍検索 |
| H3 | ✅ | 無料 | 需要密度マップ・配送ゾーン・空間集計 |
| Maidenhead | ✅ | 無料 | アマチュア無線・粗い地球グリッド |
5. デジタルアドレス(日本郵便、2025/5〜)
日本郵便が 2025年5月26日に開始し、2026年3月19日に「for Biz」v2.0 に拡張されたサービス。7桁の英数字(例: `A7E2FK2`)で住所を表します。アドレス空間は約 2³⁵ ≈ 340 億通り。
重要な制限を最初に整理
デジタルアドレス単体では荷物は届きません。配送ラベルには引き続き郵便番号・住所・氏名の記載が必要。「住所入力の時短ツール」 であって 住所の代替ではないことを最初に押さえてください。
個人向けの仕組み
- ゆうID に登録した住所に対して、ランダムな7桁英数字が発行される
- 取得は 郵便局アプリ または Web版、料金は 無料
- 対応サービス側が住所入力欄でこれを受け取り、API経由で実住所に展開する
- 現在の主な対応先:楽天市場、複数のクラウドEC・CRM
ビジネスデジタルアドレス(for Biz v2.0)
法人・個人事業主向け。法人の 住所・電話番号・法人番号・その他ビジネス情報まで返却される拡張版。1法人につき1組織 の登録ルール。
API 概要(公開部分)
- OAuth 2.0 / OpenID Connect 認証、HTTPS(TLS 1.2+)必須
- 提供スコープ: `searchcode`(コード→住所/ビジネス情報)、`addresszip`(住所→郵便番号)、`token`
- 料金は無料。ただし利用には 法人/個人事業主としてのビジネスアカウント登録 が必須
- 詳細仕様(エンドポイント・リクエスト形式)は ログイン後のダッシュボードで公開
- 送信元IP制限あり、現状 IPv4のみ対応
Pros: 入力UX改善、引越時の住所変更を一元管理、法人情報を信頼性ある経路で取得。Cons: 配送には使えない、対応サービス数がまだ限定的(鶏卵問題)、API利用に法人登録が必要、IPv4限定。「将来の選択肢として注目しつつ、現時点では対応EC側の実装をサポートする」程度の温度感が現実的。
6. 法人番号 → 法人住所
国税庁が運用する 法人番号公表サイト は 完全無料・APIキー不要で、13桁の法人番号から会社名・住所・登記情報を返してくれます。顧客マスタ・取引先マスタの法人住所を信頼性ある経路で埋める鉄板APIです。
import requests
API_BASE = "https://api.houjin-bangou.nta.go.jp/4"
def fetch_corporation(houjin_no: str, app_id: str): r = requests.get( f"{API_BASE}/num", params={ "id": app_id, "number": houjin_no, "type": "12", # JSON "history": "0", }, ) r.raise_for_status() return r.json()["corporations"][0]
corp = fetch_corporation("XXXXXXXXXXXXX", app_id="YOUR_APP_ID")print(corp["name"], corp["prefectureName"], corp["cityName"], corp["streetNumber"])より高度に 業界・売上規模・従業員数 などのオープンデータも欲しい場合は gBizINFO API(経産省)も併用。前処理シリーズ EP.08「会社名の名寄せ:法人番号 API を活用する」 で詳しく扱っています。
7. 正引き/逆引き 全パターン早見表
| From → To | 推奨手段 | コスト |
|---|---|---|
| 郵便番号 → 住所(町まで) | posuto / zipcloud / KEN_ALL | 無料 |
| 住所 → 郵便番号 | KEN_ALL を読み込んで正規化マッチ | 無料 |
| 住所 → 緯度経度 | 国土地理院ジオコーダ / Google Geocoding | 無料 / 有料 |
| 緯度経度 → 住所 | 国土地理院 逆ジオ / Google | 無料 / 有料 |
| 緯度経度 → Plus Code | `pluscodes` (オフライン) | 無料 |
| 緯度経度 → Geohash | `python-geohash` (オフライン) | 無料 |
| 緯度経度 → H3 | `h3` (オフライン) | 無料 |
| 緯度経度 → what3words | what3words API | 無料枠/有料 |
| デジタルアドレス → 住所 | for Biz API(要法人登録) | 無料 |
| 法人番号 → 法人情報 | 法人番号API(要アプリID) | 無料 |
| 住所 → 法人番号 | 法人番号API のあいまい検索 | 無料 |
8. 業務適用パターン6選
① 顧客マスタの自動エンリッチ
顧客テーブルに郵便番号と住所しか無い → 緯度経度を埋め、H3 / Geohash も付与してエリア集計に使う。これが最頻出。
import pandas as pdimport h3, time
def enrich(row): geo = gsi_geocode(row["address"]) if not geo: return pd.Series([None, None, None]) cell = h3.geo_to_h3(geo["lat"], geo["lon"], resolution=8) time.sleep(0.2) # 国土地理院API への礼儀 return pd.Series([geo["lat"], geo["lon"], cell])
df = pd.read_csv("customers.csv")df[["lat", "lon", "h3"]] = df.apply(enrich, axis=1)
# 同じ H3 セル内の顧客数を集計print(df.groupby("h3").size().sort_values(ascending=False).head())② 配送ゾーン判定
出荷時に住所→緯度経度に変換し、H3 セルや Geohash プレフィックスで配送センター割り当てや料金ゾーンを決定する。検索が O(1) で速く、ゾーン境界の管理が楽。
③ ハザードマップ重ね合わせ
顧客住所を緯度経度化 → 国土数値情報の 浸水想定区域・土砂災害警戒区域 ポリゴンと空間結合(GeoPandas)。BCP・防災施策のベースになる。
④ 営業エリア最適化
顧客緯度経度を()して 担当エリアを自動分割。属人的な「俺のテリトリー」配分を脱却。
⑤ 法人マスタの正規化+名寄せ
取引先マスタの会社名揺れを 正規化 → 法人番号API で同定 → 法人住所で二重照合。前処理シリーズ EP.06 / EP.08 と組み合わせるのが王道。
⑥ 緊急通報・物流のピンポイント伝達
「住所が無い・伝えにくい」現場では what3words / Plus Codes が威力を発揮。建設現場・キャンプ場・災害現場・配送ドライバーへの最終地点指示など。
9. 設計上の落とし穴
「東京都新宿区西新宿1-2-3」「東京都新宿区西新宿1丁目2-3」「東京都新宿区西新宿1丁目2番3号」── 同じ場所でジオコーダの結果が変わります。前処理 EP.07「住所の正規化」 を必ず通すこと。
ジオコーディングAPIは外部依存。同じ住所を毎回叩くのは無駄&迷惑。SQLite/Redis にキャッシュを敷き、TTL は1ヶ月程度(住所側が変わることは稀)。
緯度経度は単独では個人情報に該当しないが、容易照合性 で個人情報扱いになることが多い(個人情報保護委員会の解釈)。社外API(Google等)に送る前に 委託先管理・利用目的の明示 を整える。秘匿性が高い案件は OSS の Nominatim を自社環境で。
国土地理院・zipcloud は無料で使わせてもらってる立場。並列度を抑える(最大1〜2並列)、0.2秒以上のスリープ、User- 設定は基本マナー。バッチ処理は夜間に。
10. ライブラリ・APIの推し早見表
| やりたい事 | 推し | 代替 |
|---|---|---|
| 郵便番号→住所(オフライン) | `posuto` | KEN_ALL を pandas で |
| 郵便番号→住所(API) | zipcloud(無料・認証なし) | HeartRails / 国土地理院 |
| 住所→緯度経度(無料) | 国土地理院ジオコーダ | Yahoo!ジオコーダ |
| 住所→緯度経度(高精度有料) | Google Geocoding | MapBox / ArcGIS |
| 住所→緯度経度(オンプレ) | Nominatim(Docker) | 自前 KEN_ALL+位置参照情報 |
| 緯度経度→Plus Code | `pluscodes` | (公式 OLC 仕様) |
| 緯度経度→空間インデックス | `h3` または `python-geohash` | S2 (`s2sphere`) |
| 3単語コード | `what3words`(API) | Plus Codes で代替検討 |
| 法人番号→法人住所 | 法人番号API(無料) | gBizINFO(追加情報) |
| 住所表記の正規化 | 前処理シリーズ EP.07 のレシピ | ── |
11. ふくふくの提案:住所マスタ・パイプラインの典型構成
顧客マスタ・取引先マスタの住所まわりを整える案件で、ふくふくがよく構築する 典型パイプライン をご紹介します。
- Step 1: 入力正規化 — 全角/半角・丁目/番地・旧字体を吸収(前処理シリーズ EP.07)
- Step 2: 郵便番号で粗ジオコード — 町レベルの緯度経度をまず付与(`posuto` + 国土地理院)
- Step 3: 番地レベルでジオコーディング — Google or Nominatim(コスト/秘匿性で選択)
- Step 4: 空間インデックス付与 — H3 解像度 8〜9 を主に、Geohash も併用
- Step 5: 法人住所は法人番号で二重照合 — 揺れの吸収+経年変化の検出
- Step 6: キャッシュ層 — SQLite で結果保存、TTL 30日、住所変更時は invalidate
- Step 7: 監視 — API 失敗率・キャッシュヒット率・住所変更検出件数を Slack に日次配信
1〜1.5ヶ月で MVP(数千件規模・主要 API 1本)、3〜4ヶ月で本番運用(数十万件規模・複数 API・キャッシュ・監視)が目安です。
12. まとめ
- 住所まわりは 郵便番号・住所文字列・緯度経度・各種位置コード が独立して存在し、それぞれ別の手段で行き来する
- 国土地理院・posuto・法人番号API といった無料・公的サービスで大半の業務がまかなえる
- 緯度経度の別表現は用途で選ぶ:Plus Codes(無料・オフライン)、Geohash/H3(空間検索/集計)、what3words(口頭伝達・緊急用途)
- 日本郵便デジタルアドレスは注目に値するインフラだが、現時点では「入力時短」用途。配送には使えない、対応EC側の対応を待つ温度感
- 実装上は 正規化・キャッシュ・公的API への礼儀 が長期運用の決め手
次の話
EP.18 では、 (金融庁の有価証券報告書 API) で上場企業の財務データ を扱います。同業他社の決算をスクリプト1本で集めて、自社の利益率・ROE が業界平均と比べてどうかを可視化。
住所・会社名の正規化と名寄せの実装詳細 → 前処理 EP.06「名寄せの基礎」 / EP.07「住所の正規化」 / EP.08「会社名の名寄せ:法人番号API活用」。緯度経度のクラスタリング応用 → Basics EP.13「K近傍とクラスタリング」。
この記事の感想を教えてください
あなたの 1 クリックで、本当にこの記事は更新されます。「もっと詳しく」「続編希望」が一定数集まった記事は、 ふくふくが 実際に内容を拡充したり続編記事を公開 します。 送信したリアクションはお使いのブラウザに記録され、再カウントされません。