[続き]つくば市の人口についての分析(全国との比較)

はじめまして。つくばに住む研究者です。

前回は国勢調査のデータを使い、全国の市区町村の人口増加率、子供がいる世帯の割合と若年人口(15歳以下)の構成比についてそれぞれを見ました。

前回は注目したい数字の降順に並び替えました。今回はヒストグラムと2次元散布図を作って全国市区町村の全体的な傾向を確認します。

今回もGoogle Colabを使ってプログラミングを実行します。Google Driveに置いた国勢調査のデータを読み込みます。

import pandas as pd
import matplotlib.pyplot as plt
from google.colab import drive
drive.mount('/content/drive')
dir_path = '/content/drive/MyDrive/Colab Notebooks/Data/2023_05'

df_all = pd.read_excel(dir_path+'major_results_2020.xlsx')
df_all.head(3)

不要なデータを除去し、人口増加率、子供世帯の割合と若年人口構成比の列だけを取り出します。

#全国や県レベルのデータを除去
df_crop = df_all[df_all['市などの別\n(地域識別コード)']!='a']

#政令指定都市下の区を除去
df_crop = df_crop[df_crop['市などの別\n(地域識別コード)']!=0]

#不完全なデータの除去
df_crop = df_crop[df_crop['総世帯']!='-']
df_crop = df_crop[df_crop['夫婦と子供\nから成る世帯']!='-']
df_crop = df_crop[df_crop['男親と子供\nから成る世帯']!='-']
df_crop = df_crop[df_crop['女親と子供\nから成る世帯']!='-']
df_crop = df_crop[df_crop['15歳未満.1']!='-']
df_crop = df_crop[df_crop['5年間の人口増減率']!='-']

#子供のいる世帯数の列を追加
df_crop['子供のいる世帯数'] = df_crop['夫婦と子供\nから成る世帯']+df_crop['男親と子供\nから成る世帯']+df_crop['女親と子供\nから成る世帯']

#子供のいる世帯の割合の列を追加
df_crop['子供のいる世帯の割合'] = (df_crop['子供のいる世帯数']/df_crop['総世帯'])*100

#総数10万人以上の都市に絞り込み
df_crop = df_crop[df_crop['総数'] >= 100000]

#計算できるようにfloat型に変換する
df_crop[['5年間の人口増減率','子供のいる世帯の割合','15歳未満.1']] = df_crop[['5年間の人口増減率','子供のいる世帯の割合','15歳未満.1']].astype(float)

列の名前をわかりやすい名前に変更し、平均値を計算しておきます。

df_crop = df_crop.rename(columns={'15歳未満.1': '15歳未満の人口構成比'})
df_crop[['5年間の人口増減率','子供のいる世帯の割合','15歳未満の人口構成比']].mean()

単位は全て%です。全国での人口増減率は平均で0.6%の減少、子供がいる世帯の割合の割合は35.8%、若年人口の構成比は12.2%程度が平均値のようです。つづいてHistgramを作成します。Histgramはpandasの標準の機能を使って簡単に書くことができます。

df_crop[['5年間の人口増減率','子供のいる世帯の割合','15歳未満の人口構成比']].hist(bins=25, figsize=(12,8), color='#469ff1', zorder=2, rwidth=0.9)

どれもやや左に偏ったヒストグラムになりました。子供世帯の割合は偏っており、30%程度以下になる自治体はかなり少ないようです。

さて、子供がいる世帯の割合と若年人口(15歳以下)の構成比の2つの数字を同時に見てみます。変数が2つなので2次元の散布図を書きます。

#全国や県レベルのデータを除去
df_crop = df_all[df_all['市などの別\n(地域識別コード)']!='a']

#政令指定都市下の区を除去
df_crop = df_crop[df_crop['市などの別\n(地域識別コード)']!=0]

#不完全なデータの除去
df_crop = df_crop[df_crop['総世帯']!='-']
df_crop = df_crop[df_crop['夫婦と子供\nから成る世帯']!='-']
df_crop = df_crop[df_crop['男親と子供\nから成る世帯']!='-']
df_crop = df_crop[df_crop['女親と子供\nから成る世帯']!='-']
df_crop = df_crop[df_crop['15歳未満.1']!='-']

#子供のいる世帯数の列を追加
df_crop['子供のいる世帯数'] = df_crop['夫婦と子供\nから成る世帯']+df_crop['男親と子供\nから成る世帯']+df_crop['女親と子供\nから成る世帯']

#子供のいる世帯の割合の列を追加
df_crop['子供のいる世帯の割合'] = (df_crop['子供のいる世帯数']/df_crop['総世帯'])*100

#総数10万人以上の都市に絞り込み
df_crop = df_crop[df_crop['総数'] >= 100000]

#興味のある列の取り出し
df_crop = df_crop[['都道府県名', '都道府県・市区町村名','総数','総世帯','子供のいる世帯の割合','15歳未満.1']]
df_crop = df_crop.sort_values('15歳未満.1',axis=0,ascending=False).reset_index()

これで人口10万人以上の市区町村について子供のいる世帯の割合と15歳未満の人口比率が揃ったデータフレーム(表)が準備できました。

この2つを散布図にしてプロットします。散布図のそれぞれの点がどの都市かわかるようにアノテーションをつけます。
図表を作る際に最も使われるpythonのライブラリは'matplotlib'は標準のColab環境では日本語のテキストを入れることができないので、日本語に対応したjapanize-matplotlibを使います。jupyter notebookではコードの先頭に!をつけることでLinuxのシェルコマンドを実行できるので、この機能を使ってColabにインストールします。

!pip install japanize-matplotlib --q

無事にインストールに成功したらライブラリをインポートして初期化します。

import japanize_matplotlib
japanize_matplotlib.japanize()

これで準備ができたので、散布図を作ります。
散布図はX軸に注目したい変数の一つを、Y軸にもう一つの変数を入れて作ります。今回は子供のいる世帯の割合と若年人口の構成比です。scatter(x,y)を使って散布図を作成し、その中にannotate機能を使って順番に都市名をいれます。

#実数に変換
df_crop[['子供のいる世帯の割合','15歳未満.1']] = df_crop[['子供のいる世帯の割合','15歳未満.1']].astype(float)

fig = plt.figure(figsize = (10,10),dpi=100)
ax = fig.add_subplot(1, 1, 1)
ax.scatter(df_crop['子供のいる世帯の割合'], df_crop['15歳未満.1'], s = 40, edgecolors='black', marker='o', alpha=0.5)

plt.xlabel('子供世帯の割合', size=16)
plt.ylabel('子供の人口構成比', size=16)
plt.grid()
for i, txt in enumerate(df_crop['都道府県・市区町村名'].to_list()):
  # if i % 50 == 0:
    ax.annotate(txt, (df_crop.loc[i, '子供のいる世帯の割合'], df_crop.loc[i, '15歳未満.1']), fontsize=8)
  # else:
    # pass

plt.show()

無事に散布図をつくれました。図では左に行くほど子供のいる世帯の割合が高く、上に行くほど15歳以下の人口構成比が高い都市になります。左上には沖縄県の都市が目立つ一方、右下には北海道の都市が目立ちます。

アノテーションが多く、つくば市が見つけづらいため、つくば市だけをアノテーションします。

fig = plt.figure(figsize = (10,10),dpi=100)
ax = fig.add_subplot(1, 1, 1)
ax.scatter(df_crop['子供のいる世帯の割合'], df_crop['15歳未満.1'], s = 40, edgecolors='black', marker='o', alpha=0.5)

plt.xlabel('子供世帯の割合', size=16)
plt.ylabel('子供の人口構成比', size=16)
plt.grid()

for i, txt in enumerate(df_crop['都道府県・市区町村名'].to_list()):
  if 'つくば' in df_crop.loc[i, '都道府県・市区町村名']:
    ax.annotate(txt, (df_crop.loc[i, '子供のいる世帯の割合'], df_crop.loc[i, '15歳未満.1']), fontsize=8)
  else:
    pass

plt.show()

つくば市は右上にあります。興味深いことに、つくば市よりも右上には都市が1つもありません。つまり、「つくば市より子供の人口構成比が高い都市のうち、つくば市よりも子供世帯が少ない都市は存在しない」ということになります。

散布図を見ると都市は左下から右上にかけて散らばっているようで、正の相関が伺えます。基本的には子供世帯が多ければ子供の人口は多いはずなので正の相関は妥当です。相関の程度を示す相関係数を計算します。

df_crop[['総数','総世帯','子供のいる世帯の割合','15歳未満.1']].corr()

相関係数は0.47となりました。予想どおり、かなりの相関関係にあるようです。

今回はここまでとして、次回は地図データに重畳するような分析をしてみようと思います。

それでは。

この記事が気に入ったらサポートをしてみませんか?