# 人口ピラミッドをシミュレーションしてみよう ![](https://i.imgur.com/XiyEgMV.png) こんにちは。 B4 の生田です。**言い出しっぺが盛大に遅刻してしまいました**が、 [彌冨研 Advent Calendar 2019](https://adventar.org/calendars/4371) も 18 日目に突入し、いやとみ研がどんな人たちで形成されているのか、ボンヤリとわかってきた方もいらっしゃるのではないでじょうか。メイドカフェにハマってるのは1人だけなので安心してください。 ## はじめに 皆さんは「**人口ピラミッド**」という言葉を聞いたことがあるでしょうか。ほとんどの方は、「中学か高校かの社会科の授業で聞いたことあるな…」くらいの印象なのではないかと思いますが、実は、私はこの人口ピラミッドが実は大好きなのです。初めて人口ピラミッドというものを見たのは小学生の頃でしたが、たった1枚の図に、戦争・ベビーブームといった歴史的な出来事や、丙午のような文化的な風習までがギュっと凝縮されており、子供心にたいへん感動した覚えがあります。 この記事は、そんな感動的な出会いから十数年が経ち、*パソコン・パワー*を身に付けたオタクが、人口の増減をモデル化してコンピュータ上でシミュレーションし、人口ピラミッドの形を観察してみようというものになります。 ## 理屈 それでは、人口シミュレーションのモデルを考えていきましょう。数式が嫌いな人は、次の「やってみよう」セクションまで飛ばしてOKです。 まず始めに、 $p^{(t)}_i$ を年 $t$ における $i$ 歳のヒトの数とします。すると、年 $t$ における年齢別の人口分布は $P^{(t)} \overset{\mathrm{def}}{=} \left( p^{(t)}_0 , p^{(t)}_1 , \dotso , p^{(t)}_{99} \right)$ と定義することができます。今回のモデルでは、**ヒトは100歳になった瞬間に死ぬ**という近似を行います[^die-at-100]。 [^die-at-100]: これは、ほとんどの人口統計において 100 歳以上の人物は「100歳以上」という枠でひとまとめにされてしまっているため、計算が煩雑になるからです。 次に、年齢別の死亡率を $\mathrm{M} \overset{\mathrm{def}}{=} \left( m_0 , m_1 , \dotso , m_{99} \right)$ と定義します。ここで $m_i \in \left[ 0, 1000 \right]$ は $i$ 歳のヒト $1000$ 人あたりの死亡数です。 ここまで来ると、以下の式を用いて現在の人口分布から翌年の人口分布を求めることができます。 $$ p^{(t+1)}_i = \left( 1 - \frac{m_{i-1}}{1000} \right) p^{(t)}_{i-1} $$ ただし、この式は $0 \lt i \le 99$ についてしか成り立たないため、年 $t+1$ に産まれる新生児の数 $p^{(t+1)}_0$ を求められません。これを求めるために、出生率について考える必要があります。出生率には、粗出生率(crude birth rate; CBR)や合計特殊出生率(total fertility rate; TFR)、総出生率(general fertility rate; GFR)など様々な計算方法がありますが、今回は計算が容易である粗出生率を用いることにします[^birth-vs-fertility]。 [^birth-vs-fertility]: ところで、なぜ birth と fertility があるのでしょうか。どうやら、出産可能年齢の女性人口に基づいて計算するものには fertility が、そうでないものには birth が使われるようです。 粗出生率は、一般的に「人口 $1000$ 人当たりの出生数」と定義されます。これを数式で書くと、 $$ \mathrm{CBR} \overset{\mathrm{def}}{=} 1000 \cdot \frac{p^{(t+1)}_0}{\sum^{99}_{i=0} p^{(t)}_i} $$ となります。$\mathrm{CBR}$ は粗出生率、分子は新生児の数、分母は総人口です。両辺に総人口を掛け $1000$ で割ると、 $$ p^{(t+1)}_0 = \frac{\mathrm{CBR}}{1000} \sum^{99}_{i=0} p^{(t)}_i $$ 翌年に産まれる新生児の数を求めることができます。 ## やってみよう ということで、上でダラダラ説明した理屈に基づいた[ブラウザで遊べる人口ピラミッドシミュレータ](https://clutter.ikuta.me/pyramid2/)を作ってみました。JavaScript 製[^jigoku]です。 [^jigoku]: 考えなしに生 JS で書きはじめたら地獄を見たので、次からは Vue.js あたりを使おうと思います。 ここから先は、実際にシミュレータを操作しながら読むことをオススメします。基本的に PC 向けのレイアウトですが、がんばればスマホでも見れると思います。 ## 実験1:日本の未来 シミュレータは開けましたか?このシミュレータは、デフォルトで - 日本の出生率 - 日本の年齢別死亡率 - 日本の人口 がロードされているので、画面は以下のようになっていると思います。 ![](https://i.imgur.com/QtBsNM9.png) それでは、さっそく右の Step ボタンを押して、年代を 1 つ進めてみましょう。 ![](https://i.imgur.com/niWcW2P.png) 画面にあまり変化はありませんが、YEAR が 1 増え、人口がちょっと変動したことがわかると思います。Play ボタンを押して、どんどん時間を進めてしまいましょう。 ![](https://i.imgur.com/ViLsfqk.png) 100 年も経つころには、日本の人口は 2000 万人にまで減ってしまいました。悲しいですね。 ## 実験2:ピラミッドの形 人口ピラミッドには、国の発展度合いに応じて「富士山型」や「釣り鐘型」といった形状に分類されるのは、よく知られています。ということで、出生率や死亡率がピラミッドの形にどう影響するのかを見ていきましょう。 今回は絶対的な人口の値ではなく形状に注目するので、「Misc」タブから「Adjust Scale」にチェックを入れておきます。 ![](https://i.imgur.com/zOlrokQ.png) すると、ピラミッドの形状はこんな感じになるはずです。 ![](https://i.imgur.com/SMohVf2.png) これは、いわゆる「壺型」に分類される、少子高齢化が進んだ国家にありがちな形状ですので、日本の現状とピッタリ合致していますね。 続いて、別の国家のパラメータでもシミュレーションしてみましょう。「Reset」ボタンを押して全変数を初期化し、「Birth Rate & Mortality Rates Control」のタブから出生率と死亡率を中国のものに設定します。 ![](https://i.imgur.com/5EuaQLO.png) さらに、「Population Control」のタブから、人口の初期値も中国のものに設定しましょう。すると、ピラミッドはこういう形になるはずです。 ![](https://i.imgur.com/lrs610E.png) さっそく「Play」で時間を 100 年ほど進めてみると、こんな形になります。 ![](https://i.imgur.com/dK9fOrJ.png) 先程の日本のものと似ていますが、もう少し下のほうが広くなっていますね。これは「釣り鐘型」に分類される、成長が安定し、人口の増減が少なくなった国家に見られる形状になります。やはり、中国の現状と合致していますね。 さてさて、今度はもう少し発展途上な国家の様子を見てみたいと思います。先程と同様に「Reset」ボタンを押して全変数を初期化したのち、「Birth Rate & Mortality Rates Control」のタブで出生率と死亡率を南スーダンのものに設定します。 ![](https://i.imgur.com/2QcfK2Q.png) ただし、今回は人口の初期値として(南スーダンのものではなく)中国の人口を用いてみます。「Play」ボタンで 100 年進めましょう。 ![](https://i.imgur.com/jNVICdB.png) 今度は、これまでとは全く異なる形になりました。これは「富士山型」と呼ばれる、発展途上国に多く見られる形状ですから、南スーダンの実情と一致していると言ってよいでしょう。ですが、今回は人口の初期値として(南スーダンのものとは全く異なる)中国の分布を用いました。にも拘らず、実際の南スーダンに近い分布が得られたのは興味深いですね。 このことから「(十分に時間が経てば)人口ピラミッドの形状は出生率・死亡率のみに依存し、人口の初期値には依存しない」という仮説を立てることができます。さらなる検証として、人口の初期値を全くのランダムな値にしてしまいましょう。「Reset」でリセットし、「Population Control」のタブから、人口を「Random between 0 and 20000000」にしてみます。 ![](https://i.imgur.com/jMf9hO9.png) こんな人口の分布はまず有り得ませんが、実験なのでなんでもアリということにしてしまいましょう。「Play」で 100 年後を見てみます。 ![](https://i.imgur.com/KJqX6aY.png) 驚くべきことに、全く同じ形状に収束しました。これは、先程の仮説を支持するものです。興味深いですね。 ## おわりに 中学校の教科書で見るような「釣鐘型」「富士山型」「壺型」のような形状を実際に観測することができ、とても楽しかったですね。また、特筆すべき点として「**人口ピラミッドの(絶対的な値を考慮しない、定性的な)形状は、(十分に時間が経てば)人口の初期値に依存せず、年齢別の死亡率と出生率のみによって変わる**」という傾向もわかり、より深い考察の余地があるように思えました。 本記事におけるシミュレーションはきわめて原始的で、かつ非常に乱暴な近似を各所で行いました。いずれは、もっと人口統計学に基づいた正確な設定をし、いろいろな実験をしてみたいですね。また、今回定義したモデルは多変数の線形力学系と見なすことができるため、力学系の理論に基づいて、初期値への非依存性の説明なんかもできたら楽しいかもしれません。 また、本記事では触れませんでしたが、今回のシミュレータには「人口が一定になるように出生率を調節する」機能も実装しました。 ![](https://i.imgur.com/w9iQSgC.png) これにチェックを入れると、「現在の死亡率の分布で、国家が人口を維持するためにはどのくらい子が産まれる必要があるか?」を知ることができます。お時間のある方は、ぜひ遊んでみてください。 長くなりましたが、ここまで読んでいただきありがとうございました。よいクリスマスをお過ごし下さい。