ころがる狸

ころがる狸のデータ解析ブログ

【日本の人口分布】matplotlibで日本の人口分布を可視化

こんにちは。ゴールデンウィーク4日目です。あっという間に残すところあと1日となりました。昨日、総務省が発表した日本の子供(0~14歳)の人口が39年連続で減少というニュースを見ました。恐らく今後も減少に向かうだろうということが予想されますが、将来の人口分布がどうなるのかをネットで調べてみました。
www.jiji.com
先日覚えたばかりの状態空間モデルなど使って予測しようかと思いましたが、総務省のホームページで日本の統計2020なるものを発見しました。ここに日本の人口分布と将来予測値があったので、この数値をもとに人口分布を可視化しました。この、日本の統計2020には日本に関する様々な統計情報がのっており読んでいて非常に面白いです。ゴールデンウイークの昼下がりに日本の統計を読む。あんまりゴールデンな感じはしまんけども(遠い目)。
https://www.stat.go.jp/data/nihon/pdf/20nihon.pdf

では早速見てみましょう。1920年の実測値から2095年までの予測値がありますが、pythonの作図用ライブラリであるmatoplotlibのfill_between関数を使うとこのように色で埋めて可視化することが出来ます。年少人口(つまり子供)は0~14歳、生産年齢人口は15~64歳、老年人口は65歳以上と定義されています。子供の人口は39年連続とのことですが、そもそも子供の人口のピークは今から65年前、1955年の3000万人でありそれ以来更新されていないことに驚きです。また大人の人口も1995年に8700万人を記録して以来頭打ちであり、それ以来単調に減少し続けていることが分かります。一方で老年人口だけは現在に至るまで増加を続けています。この現実はかなり深刻です。

f:id:Dajiro:20200505171723p:plain
日本の統計2020に基づいた日本の人口分布。
人口比率もプロットしてみました。子供、大人が減り老人の比率がどんどん増えてきているのがはっきり見えます。また、将来の人口予測にどのようなモデルを使ったのかは調べていませんが、2035年ころから人口の子供・大人・老人の比率がほとんど変わらなくなるのには違和感があります。私の場合、老人の比率が更に増加するのでは?という直感が働くのですが、明確な根拠はないです。いずれにせよ、労働人口が減る一方で支えるべき高齢者が増え続けることは日本の経済発展に暗い影を落とすはずです。事態は時々刻々と悪くなっています。少子高齢化に歯止めをかける政策を立案できる政治家を、私たち有権者は選び出さなければいけないと思います。
f:id:Dajiro:20200505172930p:plain
日本の統計2020に基づいた日本の人口比率。

今日このような記事を書いた目的としては、単に過去と将来の人口動向を見てみたかったというのもありますが、データ分析を生業としている者としてこのような重要な公的データを分析し積極的に情報発信する責務があるのでは、と感じたからです。出来るだけ多くのデータを分析して人の目に見える形に落とし込むことは、データサイエンティストの社会的責任ではないでしょうか。

最初の図の作図に使ったコードも張っておきます。

import pandas as pd
import matplotlib.pyplot as plt
import japanize_matplotlib

df = pd.read_csv('data//日本の統計_人口の推移と将来人口.csv')

young = df.年少人口
adalt = df.年少人口 + df.生産年齢人口
old = df.年少人口 + df.生産年齢人口 + df.老年人口

plt.figure(figsize = (8, 5))
lower_y = [0 for i in range(len(df))]
plt.fill_between(df.年, lower_y, young.values, color = '#e41a1c', alpha = 0.75, label = '年少人口')
plt.fill_between(df.年, young.values, adalt.values, color = '#377eb8', label = '生産年齢人口')
plt.fill_between(df.年, adalt.values, old.values, color = '#4daf4a', label = '老年人口')
plt.ylabel('日本の総人口(1,000人)', fontsize = 20)
plt.xlabel('西暦', fontsize = 20)
plt.xticks(fontsize = 12)
plt.yticks(fontsize = 12)
plt.grid(alpha = 0.25)
plt.legend(fontsize = 12)
plt.savefig("pop3.png", bbox_inches='tight', dpi=300)