スタディサプリ Product Team Blog

株式会社リクルートが開発するスタディサプリのプロダクトチームのブログです

スタディサプリ中学講座で市区町村データの更新を行いました

こんにちは。教育支援小中高プロダクト開発部の @mtgto です。スタディサプリで小中学生向けサービスのバックエンド開発を担当しています。

今回は業務上で行った市区町村のデータの更新作業でわかった市区町村の再編処理について紹介します。

スタディサプリ中学講座では、利用者が通っている中学校で利用されている教科書を選ぶことで教科書に対応した定期テスト厳選予想問題が利用できるサービスを提供しています。 https://studysapuri.jp/course/junior/

利用者が通っている中学校を都道府県と市区町村で絞り込める情報をデータベースに記録しておくことでスムーズに中学校が選択できるようになっています。

スタディサプリ中学講座での通っている中学校を登録する画面です。後述する浜松市の行政区の再編に対応したため静岡県浜松市中央区浜松市浜名区が選択可能です。

全国地方公共団体コード

さて、市区町村をデータベースで取り扱うためには一元データがあると便利ですよね。日本の場合、幸いなことに総務省全国地方公共団体コードという形で標準化されています。

都道府県コード及び市区町村コードは、情報処理の効率化と円滑化に資するため、コード標準化の一環として、総務省(当時:自治省)が昭和43年に全国の都道府県及び市区町村のコードlを設定したものです。以来、変更が生じた都度、更新を行っています。 https://www.soumu.go.jp/denshijiti/code.html

これにより全国どんな市区町村も標準化されたコードで表すことができます。上記のサイトから都道府県・市区町村とコードの対応表がPDF/Excel形式でダウンロードできます。

ちなみに上記ページにある「全国地方公共団体コード」仕様から引用すると、左から

  • 都道府県を表す2桁。北海道が01、沖縄が47と北から南に向けて数が増えていく
  • (000の場合を除き)、各市区町村、一部事務組合、地方開発事業団及び広域連合を表す3桁
  • 残りの5桁から生成される検査数字1桁 (チェックディジット)

から構成される6桁の数字です。検査数字が用意されているのはマイナンバーと同じですね。

試しに市区町村コードから検査数字を求めてみましょう。リクルート本社がある東京都千代田区の市区町村コードは "131016" です。先頭5桁の 13101 から検査数字 6 が求められればよさそうです。

検査数字を求めるには左から1桁目には6、2桁目には5、3桁目には4、4桁目には3、5桁目には2をかけたものの和を取り、その値を11で割った余りを11から引いたものの下一桁になると仕様が決められています。

# 左から1桁目には6、2桁目には5、、、5桁目には2をかけたものの和を取り11で割った余りを11から引いたものの下一桁が検査数字
def calc_check_digit(code)
  sum = code[...5].each_char.map.with_index{|n,i| n.to_i * (6-i)}.sum
  (11 - sum % 11) % 10
end

東京都千代田区の市区町村コード 131016 から求められる検査数字は

1 * 6 + 3 * 5 + 1 * 4 + 0 * 3 + 1 * 2 = 27
27 % 11 = 5
11 - 5 = 6

となり、たしかに左から6桁目の6と一致します。

余談ですが、日本の住所を正規化するのは非常に大変なことが知られており、スタディサプリ中学講座では標準化された市区町村までの管理で済んでいてよかったなあと思っています。

スタディサプリではこの市区町村コードをGoogle Spreadsheetで管理しているのですが、北海道や青森など一部の都道府県では先頭が0で始まるためセルの値を数値として記録していると先頭の0が抜け落ちて悲しいことになります。気をつけましょう (一敗)。

静岡県浜松市の行政区の再編

2024-01-01付で静岡県浜松市の行政区が7区あったものが3区に再編される変更が実施されました。 https://www.city.hamamatsu.shizuoka.jp/kikaku/kuseido/index.html

この変更で新たに浜松市中央区浜松市浜名区ができました。そのためそれぞれの区には新規の市区町村コードが採番されています (中央区は221384、浜名区は221392)。天竜区は住所はそのままなのですが市区町村コードは変更されています (221376から221406に変更)。

変更前 変更後
中区 (221317) 中央区 (221384)
東区 (221325) 中央区 (221384)
西区 (221333) 中央区 (221384)
南区 (221341) 中央区 (221384)
北区(三方原地区) (221350) 中央区 (221384)
北区(三方原地区以外) (221350) 浜名区 (221392)
浜北区 (221368) 浜名区 (221392)
天竜区 (221376) 天竜区 (221406)

スタディサプリではどの学校がどの市区町村のものであるかを管理しているので、変更後の市区町村をデータベースに登録した上で市区町村コードを更新してあげる必要が生じました。

注意すべき点として、1つの市区町村が別々の区に分かれるパターンがあります。 具体的には、(元) 浜松市北区の一部が中央区にもう一部が浜名区に分かれることになりました。 スタディサプリ中学講座では市区町村の更新をデータベースに反映するバッチには想定されておらず、北区にある (あった) 中学校については一括で中央区もしくは浜名区に変更することはできません。 万全を期すため一校ずつ中央区、浜名区どちらになるのかを住所を調べて確認し、中学校ごとにどの市区町村に付け変えるかを設定できるようにバッチを修正しました。

このような作業をした後に市区町村のデータ更新を実施しました。実施後は上述の画像のように再編後の市区町村が選べるようになりました。1

まとめ

スタディサプリ中学講座では中学校ごとにどの市区町村かどうかを標準化された全国地方公共団体コードを利用して管理しています。この標準化の仕組みはデータベースなどで管理する上でとても役立ちました。

今回の更新実施は実際に変更が適用された2024-01-01から遅れて行ったのですが、今回の更新作業でノウハウも貯まったので、次回からはスムーズに更新を実施しサービス利用者が「自分の住んでいる市区町村がない」ということがないようにしていきたいです。

参考


  1. ※実際の作業は2024-01-01ぴったりには実施せずにだいぶ遅れて先日行いました。