Python:日本一人口が少ない村と少子化が進んだ村を探す

都道府県・市町村別人口データから、例えば、乳幼児人口が最も少ない村、100歳以上人口が最も多い市といった条件によって市町村を抽出する。人口が最も少ない村、人口が最も多い市を即答できる日本人はほとんどいないのではないだろうか。

スポンサーリンク

データの下準備

先ず、このサイトから必要なデータを拾ってくる。

import pandas as pd

df = pd.read_excel('jappopage.xls',encoding='cp932',skiprows=1)
df.head(3)
団体コード 都道府県名 市区町村名 性別 総数 0~4歳 5~9 10~14 15~19 20~24 55~59 60~64 65~69 70~74 75~79 80~84 85~89 90~94 95~99 100歳以上
0 NaN 合計 NaN 127707259 5024936 5387161 5538141 6004284 6359291 7621589 7714169 9727763 7788090 6658215 5231303 3356963 1545490 418962 66959
1 NaN 合計 NaN 62298889 2576059 2761895 2838085 3076958 3262515 3808343 3814894 4715129 3648372 2970975 2131085 1156847 407334 71414 8148
2 NaN 合計 NaN 65408370 2448877 2625266 2700056 2927326 3096776 3813246 3899275 5012634 4139718 3687240 3100218 2200116 1138156 347548 58811

3 rows × 26 columns

邪魔臭そうなcolumn(団体コード)を削除しておく。

df.drop(['団体コード'],axis=1,inplace=True)
df.head(2)
都道府県名 市区町村名 性別 総数 0~4歳 5~9 10~14 15~19 20~24 25~29 55~59 60~64 65~69 70~74 75~79 80~84 85~89 90~94 95~99 100歳以上
0 合計 NaN 127707259 5024936 5387161 5538141 6004284 6359291 6524487 7621589 7714169 9727763 7788090 6658215 5231303 3356963 1545490 418962 66959
1 合計 NaN 62298889 2576059 2761895 2838085 3076958 3262515 3352604 3808343 3814894 4715129 3648372 2970975 2131085 1156847 407334 71414 8148

2 rows × 25 columns

1億2770万7259人という人口は2018年1月1日のものらしい。

色々な条件で市町村を抽出する

先ずは100万(1e6)でふるい分けして日本の100万人都市を探し出す。

large_city = df['総数']>1e6
print(df[large_city]['市区町村名'].dropna().unique())
['札幌市' '仙台市' 'さいたま市' '横浜市' '川崎市' '名古屋市' '京都市' '大阪市' '神戸市' '広島市' '福岡市']

今度は人口500人未満の市町村を探し出す。

small_city = df['総数']<5e2
df[small_city]['市区町村名'].dropna().unique()
print(df[small_city]['市区町村名'].dropna().unique())
['古宇郡神恵内村*' '中川郡音威子府村*' '色丹郡色丹村' '国後郡泊村' '国後郡留夜別村' '択捉郡留別村' '紗那郡紗那村'
 '蘂取郡蘂取村' '南会津郡檜枝岐村*' '利島村*' '御蔵島村*' '青ヶ島村' '岩船郡粟島浦村' '北都留郡小菅村*'
 '北都留郡丹波山村*' '南佐久郡北相木村*' '下伊那郡平谷村*' '下伊那郡根羽村*' '下伊那郡売木村*' '木曽郡王滝村*'
 '吉野郡黒滝村*' '吉野郡野迫川村*' '吉野郡下北山村*' '吉野郡上北山村*' '東牟婁郡北山村' '隠岐郡知夫村*' '真庭郡*'
 '真庭郡新庄村*' '安芸郡馬路村*' '土佐郡大川村*' '鹿児島郡三島村*' '鹿児島郡十島村*' '島尻郡渡嘉敷村*' '島尻郡座間味村*'
 '島尻郡粟国村*' '島尻郡渡名喜村*' '島尻郡北大東村*']
df[small_city].sort_values(by='総数',ascending=True).head()
都道府県名 市区町村名 性別 総数 0~4歳 5~9 10~14 15~19 20~24 25~29 55~59 60~64 65~69 70~74 75~79 80~84 85~89 90~94 95~99 100歳以上
587 北海道 紗那郡紗那村 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
590 北海道 蘂取郡蘂取村 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
589 北海道 蘂取郡蘂取村 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
588 北海道 蘂取郡蘂取村 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
586 北海道 紗那郡紗那村 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0

5 rows × 25 columns

人口ゼロとか訳分からんのが混じってるので、取り敢えずゼロを省く

small_city1 = df[(df['総数'] > 0) & (df['総数'] < 501) & (df['性別']=='計')]
small_city1.sort_values(by='総数',ascending=True).head()
都道府県名 市区町村名 性別 総数 0~4歳 5~9 10~14 15~19 20~24 25~29 55~59 60~64 65~69 70~74 75~79 80~84 85~89 90~94 95~99 100歳以上
2484 東京都 青ヶ島村 166 6 6 10 3 1 10 19 19 11 7 2 3 3 0 0 0
2478 東京都 御蔵島村* 320 30 23 10 3 14 19 17 16 16 20 8 4 5 4 0 0
2466 東京都 利島村* 321 24 20 15 2 6 19 21 20 23 16 11 9 12 4 3 0
2835 新潟県 岩船郡粟島浦村 355 9 10 16 13 12 23 25 31 30 15 38 32 27 12 4 0
6801 沖縄県 島尻郡渡名喜村* 378 10 14 12 10 7 11 39 30 39 19 33 23 24 15 3 0

5 rows × 25 columns

東京都の青ヶ島村、御蔵島村、利島村がトップ3に名を連ねているのが面白い。次に、0〜4歳人口が最も少ない村と最も多い市を抽出する。

small_village = df[(df['0~4歳'] > 0) & (df['0~4歳'] < 100) & (df['性別']=='計')]
small_village.sort_values(by='0~4歳',ascending=True).head()
都道府県名 市区町村名 性別 総数 0~4歳 5~9 10~14 15~19 20~24 25~29 55~59 60~64 65~69 70~74 75~79 80~84 85~89 90~94 95~99 100歳以上
4821 奈良県 吉野郡上北山村* 520 5 4 4 21 13 32 34 38 53 45 53 45 38 18 4 1
2484 東京都 青ヶ島村 166 6 6 10 3 1 10 19 19 11 7 2 3 3 0 0 0
4812 奈良県 吉野郡野迫川村* 418 7 6 12 12 14 15 22 37 30 24 40 46 37 9 4 2
5727 高知県 土佐郡大川村* 400 8 10 18 9 11 25 26 35 37 20 24 34 30 29 5 0
2835 新潟県 岩船郡粟島浦村 355 9 10 16 13 12 23 25 31 30 15 38 32 27 12 4 0

5 rows × 25 columns

吉野郡上北山村が青ヶ島村を押さえてトップ。面白いのは、1位〜5位までが5人〜9人と連番になっていることと、奈良県の村が1位と3位に名を連ねていることだ。

large_city1=df[(df['0~4歳'] > 5e4) & (df['性別']=='計')]
large_city1.sort_values(by='0~4歳',ascending=False).dropna().head()
都道府県名 市区町村名 性別 総数 0~4歳 5~9 10~14 15~19 20~24 25~29 55~59 60~64 65~69 70~74 75~79 80~84 85~89 90~94 95~99 100歳以上
2493 神奈川県 横浜市 3737845 149081 157181 160446 173632 194545 200782 225141 198410 247659 210591 181041 136198 79330 33713 8863 1443
4275 大阪府 大阪市 2702432 104660 100922 98781 111592 149434 179546 152362 139995 186366 153795 139080 108383 62459 25820 6757 1057
3729 愛知県 名古屋市 2288240 97559 96908 94121 101020 124435 138394 133625 120545 153393 128062 112766 86879 51466 22176 5681 837
5802 福岡県 福岡市 1529040 71785 70676 66158 70089 93708 100807 85887 83787 99336 72292 58775 45561 29217 13531 3781 574
6 北海道 札幌市 1952348 71281 75025 76342 82644 97519 104601 124078 126873 155363 114478 92117 71824 47764 21378 5755 909

5 rows × 25 columns

札幌市の0~4歳人口が多いことに驚かされた。横浜市が圧倒的に多いのは、浜っ子に憧れる世代の親が、自分の子供を浜っ子にしたいためだと思われる。

最後に、100歳以上人口の最大・最小を抜き出す。

small_village = df[(df['100歳以上'] > 0) & (df['100歳以上'] < 100) & (df['性別']=='計')]
small_village.sort_values(by='100歳以上',ascending=True).head()
都道府県名 市区町村名 性別 総数 0~4歳 5~9 10~14 15~19 20~24 25~29 55~59 60~64 65~69 70~74 75~79 80~84 85~89 90~94 95~99 100歳以上
6363 熊本県 球磨郡球磨村* 3839 113 133 157 140 98 128 289 346 396 238 292 317 237 125 29 1
3135 山梨県 北都留郡小菅村* 729 11 30 32 19 24 27 34 64 84 54 60 54 48 25 1 1
2487 東京都 小笠原村* 2641 158 161 131 76 66 163 161 130 149 98 67 33 21 18 5 1
6606 鹿児島県 鹿児島郡十島村* 709 47 45 49 10 21 21 53 58 56 35 39 40 27 13 4 1
6600 鹿児島県 鹿児島郡* 1093 63 79 89 13 34 33 73 77 80 52 59 61 43 24 8 1

5 rows × 25 columns

山梨県北都留郡小菅村は、奥多摩湖の側にある村で、東京都と勘違いされやすい。小笠原村に100歳以上が住んでいることに驚かされた。

large_city1=df[(df['100歳以上'] > 5e2) & (df['性別']=='計')]
large_city1.sort_values(by='100歳以上',ascending=False).dropna().head()
都道府県名 市区町村名 性別 総数 0~4歳 5~9 10~14 15~19 20~24 25~29 55~59 60~64 65~69 70~74 75~79 80~84 85~89 90~94 95~99 100歳以上
2493 神奈川県 横浜市 3737845 149081 157181 160446 173632 194545 200782 225141 198410 247659 210591 181041 136198 79330 33713 8863 1443
4275 大阪府 大阪市 2702432 104660 100922 98781 111592 149434 179546 152362 139995 186366 153795 139080 108383 62459 25820 6757 1057
6 北海道 札幌市 1952348 71281 75025 76342 82644 97519 104601 124078 126873 155363 114478 92117 71824 47764 21378 5755 909
4143 京都府 京都市 1415775 53518 54789 56112 63722 81408 79732 80669 75568 105628 88809 76967 60193 37118 16815 4897 892
3729 愛知県 名古屋市 2288240 97559 96908 94121 101020 124435 138394 133625 120545 153393 128062 112766 86879 51466 22176 5681 837

5 rows × 25 columns

人口の多い都市に100歳以上に人々が集うのは至極当然であろう。今度は30未満人口が多くて70歳以上人口が少ない都市を抽出する。

df['30歳未満'] = df['Male']

人口50万人以上都市をプロットする

largest_city = df[(df['総数'] >= 5e5) & (df['性別']=='計')]
largest_city.sort_values(by='総数',ascending=False).dropna().head()
都道府県名 市区町村名 性別 総数 0~4歳 5~9 10~14 15~19 20~24 25~29 55~59 60~64 65~69 70~74 75~79 80~84 85~89 90~94 95~99 100歳以上
2493 神奈川県 横浜市 3737845 149081 157181 160446 173632 194545 200782 225141 198410 247659 210591 181041 136198 79330 33713 8863 1443
4275 大阪府 大阪市 2702432 104660 100922 98781 111592 149434 179546 152362 139995 186366 153795 139080 108383 62459 25820 6757 1057
3729 愛知県 名古屋市 2288240 97559 96908 94121 101020 124435 138394 133625 120545 153393 128062 112766 86879 51466 22176 5681 837
6 北海道 札幌市 1952348 71281 75025 76342 82644 97519 104601 124078 126873 155363 114478 92117 71824 47764 21378 5755 909
4515 兵庫県 神戸市 1542935 59685 64902 66455 71588 78195 78215 93515 90719 117370 95788 81799 64246 40072 17246 4650 739

5 rows × 25 columns

a = largest_city.sort_values(by='総数',ascending=False).dropna()
from matplotlib.pyplot import *
from matplotlib.font_manager import FontProperties
from matplotlib import rcParams
style.use('dark_background')

fp = FontProperties(fname='/usr/share/fonts/opentype/ipaexfont-gothic/ipaexg.ttf', size=54)
rcParams['font.family'] = fp.get_name()
rcParams["font.size"] = "20"
fig, ax = subplots(figsize=(20,15))
a[['市区町村名','総数']].sort_values(by='総数',ascending=True).set_index('市区町村名').plot(ax=ax,kind='barh')
xticks(np.arange(0,4.1e6,1e6/4),
   ['{}万'.format(int(x/1e4)) if x > 0 else 0 for x in np.arange(0,4.1e6,1e6/4)])
ax.set_xlabel('人口(人)',fontsize=24)
ax.legend(["人口総数"],loc='lower right',fancybox=True,framealpha=0.5,prop={'size': 26});

宇都宮市が50万人都市で千葉市が100万人都市ではないのは意外だった。というより、船橋市が相模原市に人口で負けているというのが納得いかない。船橋市は、平成の大合併の時に市川市と鎌ヶ谷市と合併しておくべきだった(松戸市はいらん)。