Ruby
CSV
GovTech

日本の自治体の一覧が欲しい

政府が公開しているデータがいくらかある。

全国地方公共団体コード

利点

  • データ構成はシンプル
  • 「市」と「区 (東京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かなんかで正規化してほしかったな…