---
name: resolve-address
description: 低解像度住所（muni_centroid / oaza_chome）をWebで調査し、番地レベル（gaiku）の詳細住所を特定して address_overrides.yaml に登録する。出力CSVに muni_centroid や oaza_chome が残っている場合や、住所精度を改善したい場合に使用する。
argument-hint: "[証券コード] [パッチファイルパス（例: config/address_patches/1234.yaml）]"
---

<!-- !!SYNC!! このファイルは以下の2箇所で同一内容を維持すること:
     - .claude/skills/resolve-address/SKILL.md  (Claude Code用)
     - .agents/skills/resolve-address/SKILL.md  (Codex CLI用)
     編集時は必ず両方を同時に更新する。 -->

# 低解像度住所（muni_centroid / oaza_chome）のWeb調査・解決手順

パイプライン実行後に `muni_centroid` や `oaza_chome` レベルでしかジオコーディングできなかった事業所について、Webで詳細住所を調査し `address_overrides.yaml` に登録することで精度を向上させる。

## 0. 事前準備

`data/output/ranking_market_cap_ratio.html` が無い場合は、先に生成する：

```bash
python rank_market_cap_ratio.py
```

## デフォルト対象の選定

引数 `$ARGUMENTS` が**指定されていない場合**、以下の手順で対象1銘柄を自動選定する：

1. `data/output/ranking_market_cap_ratio.html` を読み込む（未生成なら `python rank_market_cap_ratio.py` を先に実行）
2. 「住所解決タグ」列に `muni_centroid` または `oaza_chome` を含む行をフィルタする
3. フィルタ結果の中で**最も順位が高い（時価総額比が大きい）1銘柄**を対象とする
4. 該当なしの場合はその旨を報告して終了する

引数として証券コードが指定された場合はその企業のみを対象とする。

## パッチモード（並行実行時）

`$ARGUMENTS` に `config/address_patches/` で始まるファイルパスが含まれている場合、**パッチモード**で動作する。これは `parallel_research.py` による並行実行時に使用される。

**パッチモードの動作:**

- **`address_overrides.yaml` を直接編集しない**
- 調査結果を指定されたパッチファイル（例: `config/address_patches/1234.yaml`）に同じYAML形式で書き出す
- 対象証券コードのエントリのみを含める
- セクション5（反映と検証）はスキップする（呼び出し元が `merge_address_patches.py` で一括処理する）

**パッチモードでないとき（通常モード）:**

- 従来通り `config/address_overrides.yaml` に直接追記する

> **重要**: パッチモードでは、調査結果を**必ず**パッチファイルに書き出すこと。ファイルが書き出されなければリサーチ結果が失われる。

---

## 1. 目的

住所解決レベルが低い（`muni_centroid` = 市区町村重心、`oaza_chome` = 町丁目）事業所は、地価推定の精度が低く補正係数（0.85 / 0.95）が適用される。番地レベル（`gaiku`、補正係数 1.00）まで特定できれば、推定精度が大幅に向上する。

## 2. 対象の特定

### 2.1 対象企業の決定

**引数なし（デフォルト）の場合:**

`data/output/ranking_market_cap_ratio.html` のHTMLテーブルを読み込み、「住所解決タグ」列に `muni_centroid` または `oaza_chome` を含む最上位1銘柄の証券コードを取得する。

テーブルの列順:
```
順位 | 証券コード | 企業名 | 有報XBRL | 時価総額比 | ... | 住所解決タグ | CODEX_CHECK | タグ件数 | ...
```

**引数ありの場合:**

`$ARGUMENTS` を証券コードとして使用する。

### 2.2 対象事業所の抽出

`data/output/{証券コード}_output.csv` はプロンプトに注入済み。「住所解決レベル」列が `muni_centroid` または `oaza_chome` の行を抽出する。

### 2.3 優先度の判断（複数事業所がある場合）

以下の条件に当てはまるものを優先的に調査する：

| 優先度 | 条件 | 理由 |
|--------|------|------|
| 最高 | `muni_centroid` かつ 土地面積 ≥ 10,000m² | 異常値警告が出ており推定精度への影響大 |
| 高 | `muni_centroid` かつ 評価倍率が極端に高い/低い | 地価単価が区の重心基準で実態と乖離 |
| 中 | `oaza_chome` かつ 土地面積 ≥ 50,000m² | 異常値警告が出ている |
| 低 | `oaza_chome` で面積が小さい | 補正係数0.95で影響が限定的 |

## 3. Web調査の手順

### 3.1 調査に使う情報

出力CSVから以下を確認する：

- **証券コード** — 企業識別
- **企業名** — 検索キーワード
- **事業所名** — 「本社」「東京支店」「○○工場」など
- **住所**（現在値）— 「東京都○○区」のみなど
- **住所取得元** — `securities_report`（有報そのまま）/ `web`（自動取得済み）/ `override`（手動設定済み）

### 3.2 検索戦略

以下の検索クエリを順に試す。目標は「東京都○○区○○町○丁目○番○号」レベルの番地付き住所を特定すること。

#### ステップ1: 企業公式サイト

```
検索クエリ: "{企業名} {事業所名} 所在地"
検索クエリ: "{企業名} {事業所名} アクセス"
検索クエリ: "{企業名} 会社概要 拠点"
```

- 会社概要ページ、拠点一覧、アクセスマップを確認
- IR情報ページに有価証券報告書の補足資料がある場合もある

#### ステップ2: 登記・法人情報

```
検索クエリ: "{企業名} 本店所在地"
検索クエリ: "{企業名} 法人番号"
```

- 国税庁法人番号公表サイトで法人番号から本店所在地を確認可能
- ただし本店以外の事業所は掲載されない

#### ステップ3: 地図サービス・不動産情報

```
検索クエリ: "{企業名} {事業所名} 地図"
検索クエリ: "{企業名} "{現在の住所}" 番地"
```

- Google Maps で企業名を直接検索し、表示される住所を確認
- 不動産登記情報や物件情報サイトに詳細住所が載っている場合もある

#### ステップ4: 有報「設備の状況」の確認

有報XBRLから抽出した全拠点データが `land.db` の拠点抽出データとしてプロンプトに注入済み。
また、有報「設備の状況」セクションのページテキスト全文（注記・面積内訳を含む）が `land.db` の設備状況テキストとして注入済み。
各事業所の `location_short` と出力CSVの住所を照合し、不一致があれば他のステップで番地を特定する。

### 3.3 住所の検証

取得した住所が正しいか、以下の観点で検証する：

1. **区市町村の一致** — 有報の `location_short` と同じ区市町村か
2. **事業所名との整合性** — 工場なら工業地帯、本社なら商業地域にあるか
3. **番地の具体性** — 「○丁目○番○号」または「○-○-○」まで特定できているか
4. **複数ソースでの裏付け** — 2つ以上の情報源で同じ住所が確認できるか
5. **住所の新しさ** — 移転していないか（有報の事業年度と比較）

### 3.4 住所の正規化

`address_overrides.yaml` に登録する前に、住所を以下の形式に正規化する：

```
東京都{区市町村}{町名}{丁目}{番}{号}
```

- 全角数字 → 半角数字（例：「３丁目」→「3丁目」）
- 漢数字 → アラビア数字（例：「三丁目」→「3丁目」）
- ハイフン形式も可（例：「東京都港区六本木3-4-33」）
- 郵便番号は含めない
- ビル名・階数は含めない（土地のジオコーディングには不要）
- 「東京都」から始めること

**良い例:**
```
東京都中央区日本橋1丁目15番3号
東京都港区六本木3-4-33
東京都足立区千住橋戸町31番
```

**悪い例:**
```
中央区日本橋1-15-3          # 「東京都」が無い
東京都中央区日本橋           # 番地が無い（oaza_chomeにしかならない）
〒100-0001 東京都千代田区... # 郵便番号が含まれている
東京都港区六本木ヒルズ       # ビル名で番地が無い
```

## 4. 調査結果の保存

### 4.0 出力先の決定

| モード | 条件 | 出力先 |
|--------|------|--------|
| 通常モード | パッチファイルパスの指定なし | `config/address_overrides.yaml` に直接追記 |
| パッチモード | 引数に `config/address_patches/*.yaml` を含む | 指定されたパッチファイルに出力 |

**パッチモードの場合**: 以下の4.1〜4.3の手順に従うが、出力先を指定されたパッチファイルに置き換えること。パッチファイルには対象証券コードのエントリのみを記載する。

### 4.1 ファイル構造

出力先ファイルに以下の形式で追記（パッチモードでは新規作成）する：

```yaml
# 証券コード:
#   事業所名: 東京都...（フルアドレス）

1945:
  本社他: 東京都中央区八丁堀2丁目7番1号
4116:
  東京製造事業所: 東京都足立区宮城1丁目35番18号
4619:
  本社 他: 東京都北区王子5丁目2番1号
```

### 4.2 登録ルール

- **事業所名は出力CSVの値と完全一致させる**（スペース含む）
  - 例: 出力が「本社 他」なら、YAMLのキーも「本社 他」にする
  - 例: 出力が「本社他」なら「本社他」にする
- **証券コードは文字列として記載**（先頭ゼロがある場合に備えて）
- **1企業あたり複数事業所の登録可能**
- **既存のオーバーライドを上書きしない**（意図的な修正の場合を除く）

### 4.3 登録前の確認

登録前に、その住所が実際に `gaiku` レベルでジオコーディングできるか確認する：

```python
from src.geocode_tokyo import TokyoGeocoder

geocoder = TokyoGeocoder(
    oaza_csv="data/geocoding/geocode_ref_oaza_chome_tokyo_2024/13_2024.csv",
    gaiku_csv="data/geocoding/geocode_ref_gaiku_tokyo_2024/13_2024.csv",
)

addr = "東京都足立区宮城1丁目35番18号"
lat, lon, level = geocoder.geocode(addr)
print(f"{addr} → {level} ({lat}, {lon})")
# 期待: "gaiku" と表示されること
# "oaza_chome" の場合は番地データが参照CSVに存在しない → 丁目まででも改善
```

- `gaiku` が得られればベスト（補正係数 1.00）
- `oaza_chome` でも `muni_centroid` からの改善になる（補正係数 0.85 → 0.95）
- `muni_centroid` のままなら住所が不正確な可能性 → 再調査

## 5. 反映と検証

### 5.1 パイプライン再実行

オーバーライド登録後、対象企業のキャッシュと出力を削除してパイプラインを再実行する：

```powershell
# 対象企業の出力CSVを削除（例: 証券コード 4116）
Remove-Item data/output/4116_output.csv -ErrorAction SilentlyContinue

# ジオコードの再評価が必要でも、通常は override が優先されるため
# land.db を手動で消す必要はない

# 再実行
python run.py

# ランキング再生成
python rank_market_cap_ratio.py
```

### 5.2 結果の確認

再実行後、出力CSVで以下を確認する：

1. **住所解決レベル** — `gaiku` または `oaza_chome` に改善されたか
2. **住所取得元** — `override` になっているか
3. **住所解像度補正係数** — 1.000000（gaiku）または 0.950000（oaza_chome）に変わったか
4. **異常値警告** — 「muni_centroidかつ土地面積10000m2以上」等の警告が消えたか
5. **推定土地時価** — 合理的な範囲に収まっているか

### 5.3 コミット

> **パッチモードの場合**: このセクションはスキップする。パッチファイルのマージとコミットは呼び出し元の `merge_address_patches.py` が行う。

変更を確認したら、`address_overrides.yaml` の変更をコミットする：

```bash
git add config/address_overrides.yaml
git commit -m "Add address overrides for improved geocoding accuracy

- Added detailed addresses for companies previously at muni_centroid level
- Addresses verified via corporate websites and public records
- Improves geocoding from muni_centroid (0.85) to gaiku (1.00)"
```

## 6. 注意事項

- **集約名の事業所**（「本社他」「本社・○○」「○○等」）は、複数の土地が1行に集約されている。代表的な住所（通常は本社住所）を設定する。ただしこの場合、集約されている他の土地とは異なる場所の地価が適用される点に留意する。
- **移転情報に注意** — 検索で見つかる住所が最新でない場合がある。有報の事業年度末時点の住所であることを確認する。
- **Web自動取得のスコアが低かった理由** — `住所取得元` が `securities_report` の場合、Web自動取得（`web_address_research.py`）が試行されたがスコア40未満で不採用になった可能性がある。必要なら `land.db` の `web_address_resolve` を確認する。
- **ジオコーディング参照データの範囲** — `data/geocoding/` の参照CSVは東京都2024年版。参照データに存在しない新しい街区番号の場合、番地付きでも `oaza_chome` にフォールバックする。この場合は改善の余地がない。

## 7. 一括調査のワークフロー例

大量の低解像度住所を効率的に解決するワークフロー：

```
1. 対象リスト作成
   → muni_centroid/oaza_chome の全行をCSVに抽出

2. 優先度付け
   → 面積の大きい順、評価倍率の異常な順にソート

3. バッチ調査
   → 上位N件について Web検索で住所を特定
   → 特定できた住所を address_overrides.yaml に追記

4. ジオコード事前検証
   → Python スクリプトで gaiku 解決可否を一括確認

5. パイプライン再実行
   → 対象企業の output CSV を削除して再実行

6. 差分確認
   → 改善前後の住所解決レベル・推定時価を比較

7. コミット＆プッシュ
```
