Pythonで考える少子高齢化と詐欺グラフ

## はじめに

少子高齢化が問題とされはや数十年が過ぎようとしていますが、なんとなく**ヤバい**とは思うけれどもそれがどの程度**ヤバい**のかがピンとこないです。

そこで、以前からツイッターで見かける**動くグラフ**を活用して、少子高齢化を可視化するグラフを描いてみようと思い立ちまして起稿しました。

さらっと動くグラフを作るには [Flourish](https://flourish.studio/) で作れるようですが、エンジニアとしてはプログラムで作るべきだろうということで Python で作ることにしました。

ところが、Pythonが優秀すぎて**関数を2つを呼べば動くグラフができてしまった**のであまりプログラマ感はなかったです。ただし、データからうまくグラフに使えるデータを抽出する点ではエンジニアやコンサル感はあったかもしれません。


## 人口ピラミッドのデータを入手

国立社会保障・人口問題研究所[人口ピラミッド](https://www.ipss.go.jp/site-ad/TopPageData/PopPyramid2017_J.html)のページを見ると、平成29年時点での 1965年からの2065年(未来予測)まで人口ピラミッドの画像があります。

![1965.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/136165/68b31474-403b-99d3-56ea-6c1a223a6726.png)
![2020.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/136165/6270b20f-1cd3-0f52-7a71-11f21aff2a55.png)
![2065.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/136165/20ff9b96-7b47-b894-75d2-4d58557f9d79.png)

[出典：「日本の将来推計人口（平成29年推計）」（国立社会保障・人口問題研究所）](https://www.ipss.go.jp/pp-zenkoku/j/zenkoku2017/pp_zenkoku2017.asp)


この画像から、**少子高齢化ヤバいな？** と伝わったでしょうか？
わたしにはあまりピンとこなかったです。

そこで、このサイトで公開されている人口ピラミッド画像の元になった [Excel データ](https://www.ipss.go.jp/site-ad/TopPageData/pyramidDataPP29J.xls) を利用してグラフを作成することにしました。

**グラフで大事なのは、伝えたい事があって、それを伝えられるグラフ**になっているかということかと思います。データから何を抽出してグラフにするかです。やり過ぎると**詐欺グラフ**になりますので注意が必要です。


## まずはそのままのグラフを描画

動くグラフの名前は「バーチャートレース」というそうです。名前を知らずググるところで若干苦労しました。ChatGPT先生ならその場で答えてくれたかもしれないです。

グラフの名前が分かったところで、python のデータ解析の定番 `pandas` と、バーチャートレース描画用 `bar_chart_race` と、日本語化のための `japanize_matplotlib` をインストールします。

```
pip install pandas
pip install bar_chart_race
pip install japanize_matplotlib
```

あとは以下の様なプログラムを書けば、csvデータを読み込んでグラフの描画ができます。
グラフ化する関数の引数がとても多いので行数は多いですが、**呼び出す関数は2つ**でよいので、本当に簡単です。

```graph.py
# -*- coding: utf-8 -*-

import pandas as pd
import bar_chart_race as bcr
import japanize_matplotlib

file = 'population'

df = pd.read_csv(f'data/{file}.csv', index_col=0, parse_dates=[0])

bcr.bar_chart_race(
    df=df, 
    filename=f'./data/{file}.gif', 
    orientation='v', 
    sort='asc',
    fixed_order=False, 
    fixed_max=True,
    steps_per_period=15,
    period_length=900,
    title='出典 : 国立社会保障・人口問題研究所\n人口ピラミッドのデータ（1965～2065年）(単位1,000人)', 
    bar_size=.95, 
    shared_fontdict=None, 
    scale='linear', 
    fig=None,
    figsize=(2.5, 2),
    writer=None, 
    bar_kwargs={'alpha': .7},
    filter_column_colors=False,
    title_size=5,
    bar_label_size=5,
    tick_label_size=5
)
```

csv形式ではないと読み込めないのと、2系統(男性・女性)を扱えなかったので、ダウンロードした Excel を加工して、各年齢ごとの人口数を集計した csv にしました。

(csv抜粋)
```csv
year,0,1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23,24,25,26,27,28,29,30,31,32,33,34,35,36,37,38,39,40,41,42,43,44,45,46,47,48,49,50,51,52,53,54,55,56,57,58,59,60,61,62,63,64,65,66,67,68,69,70,71,72,73,74,75,76,77,78,79,80,81,82,83,84,85,86,87,88,89,90,91,92,93,94,95,96,97,98,99,100+
1965,1743,1659,1614,1567,1551,1568,1600,1560,1515,1607,1696,1693,1813,1927,2054,2224,2453,2423,2295,1457,1553,1890,1841,1904,1881,1730,1523,1650,1717,1744,1684,1635,1667,1649,1622,1558,1536,1502,1464,1439,1364,1255,1171,1117,1054,1117,921,948,958,978,951,966,930,925,886,866,846,808,805,678,699,663,685,665,632,588,526,523,477,448,421,381,345,324,274,275,258,221,191,151,139,122,106,88,74,59,50,39,30,23,16,12,8,6,5,2,1,1,0,0,0
1970,1878,1863,1818,1823,1425,1768,1658,1616,1566,1551,1573,1599,1562,1520,1604,1687,1689,1793,1891,2004,2171,2386,2387,2272,1443,1546,1892,1851,1913,1887,1742,1526,1653,1715,1736,1683,1627,1657,1634,1606,1538,1494,1458,1428,1422,1343,1236,1157,1099,1043,1098,906,924,932,946,896,909,879,891,849,823,798,750,732,623,636,598,611,586,553,514,445,434,387,354,324,285,249,226,184,178,160,128,105,78,68,56,45,34,27,20,15,11,8,6,3,2,1,1,0,0
1975,1915,2030,2065,2021,1975,1916,1885,1845,1852,1443,1796,1680,1642,1592,1574,1591,1628,1583,1537,1613,1683,1673,1790,1898,2031,2199,2420,2416,2310,1455,1580,1930,1883,1944,1913,1759,1540,1662,1721,1744,1698,1632,1659,1633,1605,1539,1512,1473,1431,1410,1332,1215,1133,1078,1027,1073,878,901,905,918,887,894,857,844,803,779,744,692,672,563,567,528,527,496,458,409,353,334,291,255,225,187,158,135,105,95,80,59,45,31,24,18,13,9,7,4,2,2,1,1,1
```

このデータをグラフ化したものは以下となります。
![population.gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/136165/c8a54cef-9e68-d171-13af-aca05a77bc13.gif)

…このままだと元々の人口ピラミッドの方が分かりやすいですね。ここからが本番です。


## 労働人口らしきものに着目する

次に20歳から働きはじめて、およそ10歳毎に役割が変わり、65歳で定年すると仮定してデータを集計して csv を再作成し、グラフを作成することにしました。

![workers1.gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/136165/53752100-5e68-0883-10ba-d40806f6ceea.gif)

いかがでしょうか？**高齢化社会が見えた**でしょうか？
ただ、**数字は嘘をつかないが嘘つきは数字を使う**そうなのでこのグラフは注意して見る必要があるかもしれません。


## 生産年齢人口に着目する

[Wiki : 生産年齢人口](https://ja.wikipedia.org/wiki/%E7%94%9F%E7%94%A3%E5%B9%B4%E9%BD%A2%E4%BA%BA%E5%8F%A3) 

> 生産年齢人口（せいさんねんれいじんこう、working-age population）とは、各国の国内で行われている生産活動に就いている中核の労働力となるような年齢の人口。OECDは15～64歳の人口と定義[1]している。

国際機関の正式な定義だと上記の様になるようです。
そうです、生産年齢を10歳刻みにしてしまったら、**言い知れないヤバさ**は見て取れるかもしれませんが**高齢化社会のヤバさ**を表すグラフにはなっていないのです。

ということで生産年齢人口をグラフにしました。
![workers2.gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/136165/787b2642-260c-7481-a065-0e8e70ea9a6e.gif)


こちらのグラフでは高齢者層1人を2人ぐらい、未来はもっと少ない人数で支えなければいけない、という話が見て取れるグラフになりました。こちらが来るべき未来のようです。β世界線[^1]やまた別の世界線はあるでしょうか。


## おわりに

今回は、Python による動くグラフの描画方法と、データの着目点と詐欺グラフについて書きました。
データの着目の仕方によっては別の未来も見えるかもしれません。

わたし達ひとりひとりにはできる事とできない事がありますが、来るべき未来を予測し、それに向けてどう行動するのかを考えるのは大事なことだと思います。

リスキリングなどバズワードで煽られるのは面倒くさいとか色々ありますが、グラフを見る限りでは65歳定年でもう働かない年金生活というのは難しそうなので進むしかなさそうです。逃げたら一つ、進めば二つです。[^2]


## おまけ

2025年にIT人材が43万人不足するらしいので、学習用の資料をgitで**無料**公開してます(不定期更新)。
よろしければどうぞ。

[エンジニアのためのお仕事問題集](https://github.com/kaku3/workbooks)


[^1]: シュタインズ・ゲートで観測される世界
[^2]: 機動戦士ガンダム水星の魔女の重要なセリフ