最も大きい「n丁目」を調べてみた

# はじめに
年の瀬も迫る今日この頃、そろそろ年賀状の宛名書きに追われている方も多いのではないでしょうか。
一年の中で最も住所と向きあうこの時期、自分も年賀状の準備をしようと去年の年賀状を眺めていて、ふと思ったことがあります。
それは
「**全国のn丁目で最も大きい数字の丁目は何丁目なのだろう**」


ちょっと気になったら、夜も眠れなくなったので、安眠を得るために調べてみることにしました。


# 使ったデータ
全国の丁目まで含めた住所はe-statの統計データを拝借しました。
e-statとは「日本の統計が閲覧できる政府統計ポータルサイトです」（サイト説明文ママ）

https://www.e-stat.go.jp/

人口や産業、国土などに関する統計情報を閲覧、ダウンロードすることができます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/61492/ebe9d2ad-2608-ed29-0c94-8d6dcde73bea.png)


今回は、このうち2020年国勢調査統計データの小地域（町丁・字等）データを使用しました。
データの取得の流れは以下の画像を参照
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/61492/ee8630d9-e606-5d74-b98a-65c77588c2f9.png)
- トップのメニュー「統計データを活用する」から「地図」を選択
- 「統計データダウンロード」を選択
- 政府統計名から「国勢調査」を選択
- 「2020年」のメニューを開いて、「小地域（町丁・字等）」の中のデータを選択（今回は統計の数値は使わないので、男女別人口じゃなくても良い）。
- データは都道府県ごとでダウンロードできる。ほしい都道府県の「CSV」ボタンをクリックすると統計データがダウンロードできる。



今回活用した「小地域（町丁・字等）とは」
「札幌市中央区大通西一丁目」や「旭川市字近文五線」といった市区町村よりも小さい単位で集計したデータになります。
今回は地名だけ取得できればいいので、男女別人口である必要はないですが、小地域（町丁・字等）データにはこういった細かい区分の住所名がリストで得られるのでそれを活用しました。

例えば北海道のデータだとこんな感じの中身
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/61492/73e532f6-849a-4e3f-661b-01c67a9a7c9d.png)


# 全国分の小地域データを一括ダウンロード
小地域（町丁・字等）は都道府県ごとにダウンロードできるので、全国分となると47個分ダウンロードする必要があります。手作業でポチポチできなくもない数ですが、せっかくなので、一括ダウンロードしてみます。
言語は特になんでも良いですが、個人的に好きなRを使っています。

ダウンロード先のURLを確認
開発者モードでcsvのダウンロードボタンの要素を確認します。
aタグのhrefがダウンロード先のURLになります。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/61492/6fdc597b-2c0a-b1ec-b5fc-3b23e046fa2c.png)

この画像で言うと
`/gis/statmap-search/data?statsId=T001081&code=01&downloadType=2`
となっている部分です。

このURLのミソの部分としては以下2点
- 相対パスになっているので、コード上でURLを叩いてファイルを取得する時には、このサイトの基底 URLである`https://www.e-stat.go.jp/gis`を頭につけて、絶対パスにしないといけない。
- URL内の`code=●●`部分で都道府県を識別している。
01：北海道、02:青森県、....、47:沖縄県という具合に、ここの数値を変えることでダウンロードしたい都道府県のファイルを取得することができる。


## コード内容
```
#ダウンロードしたファイルの保存ディレクトリの指定
target_dir <- "/Users/Documents"

#都道府県コード分（1~47）繰り返す
for (no in 1:47) {
  #都道府県コードが1や2など、1桁の時「01、02」などに桁調整をする
  codeNo <- formatC(no,width=2,flag="0")
  
  #ダウンロードファイルURL
  abs_url <- paste("https://www.e-stat.go.jp","/gis/statmap-search/data?statsId=T001081&code=", codeNo , "&downloadType=2",sep="")
  #保存ファイル名
  save_name <- paste(target_dir,"/file",codeNo ,".zip",sep="")
  
  #ファイルのダウンロード実行
  download.file(url = abs_url,
                destfile = save_name,
                mode = "wb") 
  # 1ループごとに0.5秒待ってサーバーへの負荷をへらす
  Sys.sleep(0.5) 
  
  #ダウンロードされるファイルはZip形式なので、そのままzip解凍する
  unzip(save_name,exdir = target_dir)
  
}

```
無事、４７都道府県分取得できました。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/61492/3ecb378c-9865-1cdd-92c5-4490496768a1.png)

コードは割愛しますが、これらのファイルをRで読んで、`rbind`で1つのデータフレームに結合することで、全国の小地域住所目録ができました。


![ダウンロード.gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/61492/6b6440af-10f7-4443-ec20-12d274e6a9fb.gif)





# NAMEに「丁目」を含むデータのみに絞り込む
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/61492/34dea259-bf30-b43a-1433-665a8bcf6866.png)

取得したデータのNAME列に市町村以下の住所が記載されているので、この値を活用してまずは「丁目」を含むデータのみに絞り込みたいと思います。

「丁目」を含んでいるかどうかは、`stringr`パッケージの`str_detect`を使用します。
(`str_detect`は指定した文字を含んでいるかどうかをTRUE,FALSEで返す)
さらに`filter()`でTRUEのデータのみに絞り込みます

```
library("stringr")
data$Chome_TF <- str_detect(data$NAME, pattern="丁目") 
data2 <- filter(data,Chome_TF == TRUE)
```

# 「丁目」の前部分の抽出

続いて「丁目」の前についている数値の部分を抽出していきます。
まずNAMEの値から「丁目」と言う文字が何文字目に当たるかを調べます。
例えば「大通西一丁目」と言う地名なら「丁目」と言う文字は5文字目に当たります。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/61492/f98c37dd-e3ee-20e1-4263-806284dbb295.png)

次に丁目の1つ左隣の文字が「一」や「二」、「十」などの数字を示す文字であるかを調べます。
さらにそのもう一つ左隣の文字が同じく数字を示す文字であるかをチェックして、そうでない時はそこまでの文字位置から丁目の前までの文字を抽出。数字を示す場合は、またその1つ隣の文字をチェック・・・・。と言う具合にしていきます

図でイメージするとこんな感じ
- 「大通西一丁目」の例
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/61492/6952acea-c891-46d1-52cf-880b764c7b4a.png)


-  「大通西十二丁目」の例
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/61492/d28da114-c24a-31a8-6afa-382ef5fc1392.png)





- 「丁目」と言う文字が何文字目にあるかを調べるには、同じく`stringr`パッケージの`str_locate`を使用
(`str_locate`は指定した文字にマッチする箇所の文字位置を返す)
```
str_locate(data2[i,]$NAME, "丁目")[1,1]
```

一連の処理をコードで書くとこんな感じ
```
for (i in 1:nrow(chome)){
    #「丁目」の文字位置を取得
  chome_Num <- as.integer(str_locate(data2[i,]$NAME, "丁目")[1,1])
  #フラグ設置
  flg<- TRUE
  #チェックする文字位置（最初は左に1つ目）
  leftNum<-1
  #フラグがTRUEの間は「丁目」の位置から左にn個目の文字を数字かどうかチェック。
  while (flg ==TRUE){
    if (str_sub(data2[i,4],start = chome_Num-leftNum,end=chome_Num-leftNum) %in% searchstr ){
    #検査する文字位置を一つ左にずらす
      leftNum <- leftNum+1
    }else{
        #対象文字が数字を示さない場合はフラグをFALSEにしてwhileループを脱出
      flg <- FALSE
    }
  }
  #丁目の数字部分を新規列に格納
  chome[i,16] <- str_sub(chome[i,4],start = chome_Num-leftNum+1,end=chome_Num-1)
  
}
```

- 処理結果
無事、丁目の番号が取得できていそう。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/61492/48e1adb0-4c0a-1f70-b6bc-2d0181c09a3b.png)


# 漢数字をアラビア数字に
数字は取得できたけど、表記が漢数字であるため、いろいろ扱いやすいようにアラビア数字に変換します。
変換には、[こちら](https://gist.github.com/kos59125/bec05eab7c33072dc008)の方が素晴らしいツールを公開していたので、そのまま利用させていただきました。ありがとうございます。

ちゃんと数字に変換できました。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/61492/d9c2ad23-a45e-0f5e-1a5a-d2439879d2a4.png)

# 結果発表
## 最も大きいn丁目
さて、丁目の数値が出揃ったので、その最大はと言うと・・・
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/61492/cd28822e-0958-d3de-f51d-7abfe05e99f6.png)


42丁目!!!

その場所北海道は帯広市、西一九条南四十二丁目とのこと。
地図で見るとこの辺りだそうです。帯広畜産大の北部。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/61492/a86a0a85-5095-ae4d-9a32-e813c64356e4.png)
（[OpenStreetMap](https://www.openstreetmap.org/#map=17/42.87831/143.17210)）



## それぞれのn丁目の登場回数

せっかくここまでデータ整えたのでいろいろみてみようと思います。
まずはそれぞれのn丁目が全国に何箇所あるのかランキングにしてみました。


| 順位 | n丁目 | 箇所 |
|:-:|:-:|:-:|
|1|1|20,223|
|2|2|20,158|
|3|3|15,096|
|4|4|10,056|
|5|5|6,811|
|6|6|4,208|
|7|7|2,656|
|8|8|1,713|
|9|9|1,067|
|10|10|699|


第3位は3丁目　
第2位は2丁目　
そして栄えある栄光の第1位は・・・・・・
**1丁目**

まぁ当然の結果ですね。。。はい。

ヒストグラムにするとこんな感じ
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/61492/398388b9-24ed-7374-2ff0-c6fa01972c91.png)



## n丁目があるからといってn-1丁目があるとは限らない
ただ、ここで気がついたのが、n丁目があるからといって必ずしもそれより小さい数字の丁目があるとは限らないということです。
例えば最も大きい数値を持つ帯広市西一九条南は42丁目、41丁目はあるけど、40丁目は存在しません。
これは北海道でよくあるn条n丁目といった条丁目制の住所では、1~10丁目は１条、１１〜２０丁目は2条というふうにn丁目と合わせてn条で区画を示しているので、単純にn条で全ての丁目が存在するわけではないのですね。
そのほか、欠番や合併などで今は存在しないn丁目もあるようです。


## 本当に最も大きいn丁目は40万越え!?

「最も大きいn丁目は帯広市西一九条南四十二丁目なんだぁ。」思って、データをざっとみていた時、見つけてしまったのです。
そう、もっと大きいn丁目を。




その数字　**40万6丁目**！！



場所は・・・石川県金沢市。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/61492/b5619b10-60ff-62ff-1bf7-6003959524c9.png)





はい。。。すいません。こちら金沢市の四十万（しじま）という町名で、それの6丁目ということですね。
ちなみに場所で言うとこの辺りだそうです。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/61492/43a24c67-b1c7-237d-f87c-51209df48583.png)
[OpenStreetMap](https://www.openstreetmap.org/#map=16/36.5018/136.6121)


## 最も大きいわけではないが10,000丁目というのも
そのほか、岩手県花巻市**南万丁目**と言うのもありました。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/61492/25c4f13e-24cc-04f1-2992-b89f086a7fd9.png)

こちらは花巻市の「南万丁目(みなみまんちょうめ)」や「上北万丁目(かみきたまんちょうめ)」と言う町名のようです。
地図で言うとこの辺り。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/61492/b3f6c51a-8cfd-6d41-f8fb-134bbe2d462d.png)
[OpenStreetMap](https://www.openstreetmap.org/#map=15/39.3857/141.0883)



# まとめ
- 順当に最も大きい丁目は、42丁目（北海道帯広市西一九条南**四十二丁目**）
- 町名を含む最も大きい丁目は、400,006丁目（石川県金沢市**四十万六丁目**)
- 400,000には及ばないが10,000丁目もある(岩手県花巻市南**万丁目**)



# 終わりに


今回の内容をQiitaで記事にすべく、一通りデータの解析が終わって一息ついた時に、ふと「Google先生は知ってるんやろか」と気になって検索してみると・・・
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/61492/9b071054-374c-3eef-82c6-ef93084e9379.png)

しっかり出てきた〜〜！！

なんかわちゃわちゃコード書かんでも0.37秒で解決できたやんorz


とまぁ結論を得るのにえらい遠回りしてしまいましたが、テキスト処理の練習になったと思っときます。
ともあれ最も大きいn丁目も明らかになったことやし、これでゆっくり眠りにつくことができますZzz...



（はっ！！年賀状・・・）