政府が公開しているデータがいくらかある。
全国地方公共団体コード
利点
- データ構成はシンプル
- 「市」と「区 (東京23区)」と「町」「村」が同じ階層
欠点
-
Microsoft Excel 97-2003 形式
- MacならNumbers使えばCSVに変換できるが
- 政令指定都市の「区」は別のシート
- NumbersでCSVに変換すると、別のCSVファイルとして書き出される
- (「区」を持つ) 政令指定都市とその他の市の区別がデータ上ない
- 「郡」の情報がない
- 都道府県も同じ列に並んでいる
- 市区町村と都道府県の結びつきが弱い
統計に用いる標準地域コード
利点
- 最初からCSV形式で用意されている
- 地方公共団体コードが 仕様 (PDF) に従って分割されている。可読性は下がるが、
- 都道府県と結びつけやすい
- (相変わらず都道府県と市区町村が同列に並んでいるが) プログラムで分類しやすい
- 「郡」の情報がある (ただし…)
- 政令指定都市の区が同一ファイルに記載されている (ただし…)
欠点
- 文字コードが Shift_JIS なので文字化け注意
- 変換すればいいんだけどさ…
- データ階層がめちゃくちゃ
- 政令指定都市と「郡」と「総合振興局」(北海道限定) が同じ階層
- 北海道の自治体で「総合振興局」がある場合、「郡」の情報はない
- 東京都の島嶼部の「支庁」の情報が混ざる (現在、正式な地名ではない)
対策
上記の地方公共団体コード仕様から、各行がどのデータに当てはまるか分類することができる。
-
sityouson-code
が- 0: 都道府県
- 100以上199以下:
- 10の倍数: 政令指定都市または「東京都特別区部」
- それ以外: 「区」
- 201以上299以下: 市
- 300以上:「郡」または「総合振興局」または「支庁」または「町村」
- 北海道の場合
- 30の倍数: 総合振興局
- それ以外: 町村
- 沖縄県の場合 (※)
- 300, 320, 340, 370, 380: 郡
- それ以外: 町村
- その他の都府県の場合:
- 20の倍数: 郡
- それ以外: 町村
- 北海道の場合
※沖縄県島尻郡の例外
沖縄県島尻郡は 341 からなので本来なら 341~359 が割り当てだが、町村数が多く 362 まで使用しており、341~369 が割り当てられている。次の宮古郡の割り当てはその分減らされ 371~379 である。
参考: Wikipediaによる解説と上記の仕様書
これらに気をつければ、標準地域コードから充分正規化された市町村データが取得できそう。
市区町村の一覧を取得
今回はそんなに細かい分類は求められていなかったので、以下の方針とした。
- 政令指定都市は市名と区名を結合する (ex. 「札幌市中央区」)
- その他の市および東京特別区は市名そのまま (ex. 「鹿児島市」「千代田区」)
- 町村については
- 北海道の
/.*総合振興局/
は無視し町村名のみ (ex. 「西興部村」) - 東京都の離島地域の「支庁」は無視し町村名のみ (ex. 「小笠原村」)
- その他の町村は郡名と町村名を結合する (ex. 「夷隅郡大多喜町」)
- 北海道の
入力は上記のCSV, 出力はYML形式とする。
cities.yml
- :prefecture_id: 1
:name: 札幌市中央区
- :prefecture_id: 1
:name: 札幌市北区
- :prefecture_id: 1
:name: 札幌市東区
# ...以下省略
で、できたコードがこちら
GitHub Gist - strviola / convert_prefecture_cities.rb
結論
「市町村コードの値」じゃなくてYAMLかなんかで正規化してほしかったな…