1950年〜2017年の日本人女性の年代別出産数推移をグラフ化

晩婚化による晩産化が進んでいると言われている日本女性の年齢別出産数の推移が気になったので早速調べてみることにした。晩婚化・晩産化・少子化は先進国と一部の新興国のトレンドになっているが、日本以外の先進国は、国勢調査に載らない子供が相当数いると言われているので、一概に少子化とは言えないようだ。例えば、アメリカなどは、統計に載らない子供が百万単位でいると言われており、一説では3000万人近くいると言われている不法移民を入れると、実際は少子化でも何でもない可能性さえあると指摘されている。

スポンサーリンク

データの下準備

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

import pandas as pd

df = pd.read_excel('birthage.xls',encoding='iso2022_jp_2004',skiprows=1)
df.head(10)
Unnamed: 0 Unnamed: 1 Unnamed: 2 Unnamed: 3 Unnamed: 4 Unnamed: 5 Unnamed: 6 Unnamed: 7 Unnamed: 8 Unnamed: 9 Unnamed: 10
0 年次 NaN NaN 女性の年齢階級 NaN NaN NaN NaN NaN NaN NaN
1 NaN NaN NaN 総数 15~19歳 20~24 25~29 30~34 35~39 40~44 45~49
2 NaN NaN NaN 1) 2) NaN NaN NaN NaN NaN 3)
3 NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN
4 出生数 NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN
5 昭和 45.0 1934239 20177 513172 951246 358375 80581 9860 548
6 NaN 50.0 NaN 1901440 15999 479041 1014624 320060 62663 8727 319
7 NaN 55.0 NaN 1576889 14590 296854 810204 388935 59127 6911 258
8 NaN 60.0 NaN 1431577 17877 247341 682885 381466 93501 8224 245
9 平成 2.0 1221585 17496 191859 550994 356026 92377 12587 224

昭和は1925年をプラスして西暦に変換

df.loc[5:8,'Unnamed: 1']=df.loc[5:8,'Unnamed: 1']+1925

平成は、1988を足して西暦に変換する。つまり、昭和は1926年が元年で、平成は1989が元年ということである。

df.loc[9:17,'Unnamed: 1']=df.loc[9:17,'Unnamed: 1']+1988

列の名前を変更する。

df.rename(columns={'Unnamed: 1':'年','Unnamed: 4':'15~19歳','Unnamed: 5':'20~24歳',\
                   'Unnamed: 6':'25~29歳','Unnamed: 7':'30~34歳','Unnamed: 8':'35~39歳',\
                   'Unnamed: 9':'40~45歳','Unnamed: 10':'46~49歳'}, inplace=True)
a=df[['年','15~19歳','20~24歳','25~29歳','30~34歳','35~39歳','40~45歳','46~49歳']][5:18]
a['年'] = a['年'].astype(int)

この程度の量なら手動でも問題ないが、これが100とかになると手動では無理なので、以下のような方法も覚えておくといいかもしれない。

c=[]
for i in range(4,11):
    a = i
    b = '{} {}'.format("Unnamed:" ,a)
    c.append(b)
c
['Unnamed: 4',
 'Unnamed: 5',
 'Unnamed: 6',
 'Unnamed: 7',
 'Unnamed: 8',
 'Unnamed: 9',
 'Unnamed: 10']
d=[]
for i in range(3,10):
    a=i+i*4
    b=a+4
    c='{}{}歳'.format(a,b)
    d.append(c)
d
['15〜19歳', '20〜24歳', '25〜29歳', '30〜34歳', '35〜39歳', '40〜44歳', '45〜49歳']
f=["'{}': '{}'".format(c_, d_) for c_, d_ in zip(c, d)]
f
["'Unnamed: 4': '15〜19歳'",
 "'Unnamed: 5': '20〜24歳'",
 "'Unnamed: 6': '25〜29歳'",
 "'Unnamed: 7': '30〜34歳'",
 "'Unnamed: 8': '35〜39歳'",
 "'Unnamed: 9': '40〜44歳'",
 "'Unnamed: 10': '45〜49歳'"]
f = ', '.join(f)
print(f)
'Unnamed: 4': '15〜19歳', 'Unnamed: 5': '20〜24歳', 'Unnamed: 6': '25〜29歳', 'Unnamed: 7': '30〜34歳', 'Unnamed: 8': '35〜39歳', 'Unnamed: 9': '40〜44歳', 'Unnamed: 10': '45〜49歳'

上のプリントアウトプットを{ }の中に貼り付ければいい。

スポンサーリンク

年齢別出生数をプロットする

from matplotlib.pyplot import *
from matplotlib.font_manager import FontProperties
from matplotlib import rcParams
style.use('seaborn-bright')

fp = FontProperties(fname='/usr/share/fonts/opentype/ipaexfont-gothic/ipaexg.ttf', size=54)
rcParams['font.family'] = fp.get_name()
rcParams.update({'font.size': 25})
fig, ax = subplots(figsize=(20,10))
a.sort_values(by='年', ascending=False,inplace=True)
a.set_index('年').plot(kind='barh',ax=ax,stacked=True)
ax.legend(loc='upper right', fancybox=True, framealpha=0.5)
xlabel('出生数')
#rc('xtick', labelsize=20)
#rc('ytick', labelsize=25)
xticks(np.arange(0,2.1e6,1e6/10),
   ['{}万'.format(int(x/1e4)) if x > 0 else 0 for x in np.arange(0,2.1e6,1e6/10)])
ax.legend(loc='lower right',fancybox=True,framealpha=0.5,prop={'size': 26});

1975年は15歳〜29歳だけで150万人以上も産んでいたというのは驚きだ。2016年は、1975年の25〜29歳の出生数にすら及ぼないのだから全く話にならない。面白いのは、30歳以上の出生数に関して言えば、1975年時よりも今の方が増えているということである。

スポンサーリンク

1950年〜2017年のデータをグラフ化

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

df1 = pd.read_csv('birthage.csv',encoding='shift_jis')
df1.head(2)
母の年齢(5歳階級) /時間軸(年次) 2017年 2016年 2015年 2014年 2013年 2012年 2010年 2005年 1995年 1990年 1985年 1980年 1975年 1970年 1965年 1960年 1955年 1950年
0 出生数_総数【人】 NaN 946065 976978.0 1005677.0 1003539.0 1029816.0 1037231.0 1071304.0 1062530.0 1187064 1221585 1431577.0 1576889.0 1901440.0 1934239.0 1823697.0 1606041.0 1730692.0 2337507.0
1 出生数_14歳以下【人】 NaN 37 46.0 39.0 43.0 51.0 59.0 51.0 42.0 37 18 23.0 14.0 9.0 12.0 7.0 5.0 8.0 49.0

2 rows × 21 columns

df1 = df1.set_index(['母の年齢(5歳階級)'])
df1.drop(['/時間軸(年次)'],axis=1,inplace=True)
df1 = df1.apply(pd.to_numeric, errors="coerce").astype(float)
df1.reset_index(inplace=True)

今回は年齢層を10代、20代、30代、40歳以上に分ける。

import numpy as np

df2 = df1[1:3].groupby(np.arange(len(df1[1:3]))//2).sum()
df2.index = df1[1:3].loc[1::2, '母の年齢(5歳階級)']
df3 = df1[3:5].groupby(np.arange(len(df1[3:5]))//2).sum()
df3.index = df1[3:5].loc[1::2, '母の年齢(5歳階級)']
df4 = df1[5:7].groupby(np.arange(len(df1[5:7]))//2).sum()
df4.index = df1[5:7].loc[1::2, '母の年齢(5歳階級)']
df5 = df1[7:10].groupby(np.arange(len(df1[7:10]))//3).sum()
df5.index = df1[7:10].loc[1::3, '母の年齢(5歳階級)']
df6 = pd.concat([df2,df3,df4,df5], axis=0)
df6.rename(index={'出生数_14歳以下【人】':'10代','出生数_20〜24歳【人】':'20代',\
  '出生数_30〜34歳【人】':'30代','出生数_40〜44歳【人】':'40歳以上'},inplace=True)
df6.reset_index(inplace=True)
df6
母の年齢(5歳階級) 2017年 2016年 2015年 2014年 2013年 2012年 2010年 2005年 2000年 1995年 1990年 1985年 1980年 1975年 1970年 1965年 1960年 1955年 1950年
0 10代 9898.0 11095.0 11929.0 13011.0 12964.0 12770.0 13546.0 16573.0 19772.0 16112.0 17496.0 17877.0 14590.0 15999.0 20177.0 17719.0 19739.0 25219.0 56365.0
1 20代 320197.0 332808.0 346717.0 354437.0 374044.0 388269.0 417866.0 467463.0 632194.0 686228.0 742853.0 930226.0 1107058.0 1493665.0 1464418.0 1368044.0 1192350.0 1160376.0 1419038.0
2 30代 562357.0 578198.0 593163.0 585212.0 595145.0 593195.0 604486.0 558140.0 523310.0 471826.0 448403.0 474967.0 448062.0 382723.0 438956.0 427624.0 378788.0 510333.0 775021.0
3 40歳以上 53613.0 54875.0 53866.0 50878.0 47662.0 42991.0 35401.0 20348.0 15250.0 12886.0 12811.0 8469.0 7169.0 9046.0 10408.0 10308.0 15159.0 34761.0 86477.0
from matplotlib.pyplot import *
from matplotlib.font_manager import FontProperties
from matplotlib import rcParams

style.use('fivethirtyeight')
fp = FontProperties(fname='/usr/share/fonts/opentype/ipaexfont-gothic/ipaexg.ttf', size=54)
rcParams['font.family'] = fp.get_name()
rcParams["font.size"] = "18"
fig, ax = subplots(figsize=(18,10))
df6.set_index('母の年齢(5歳階級)').T.plot(kind='barh',ax=ax,stacked=True)
ax.legend(loc='lower right',fancybox=True,framealpha=0.5,prop={'size': 26})
xticks(np.arange(0,2.51e6,1e6/5),
   ['{}万'.format(int(x/1e4)) if x > 0 else 0 for x in np.arange(0,2.51e6,1e6/5)]);

戦後間もない1950年は、他の年に比べると30歳以上がメチャクチャ産んでいる。2017年の30代・40歳以上は、1955年の30代・40歳以上よりも多くの子供を産んでいる。晩婚化によって20代の出産が減ったことが少子化の原因であることは一目瞭然である。問題は晩婚化の原因である。女性の高学歴化と社会進出が進んだことが、先進国や新興国の少子化の原因であると言われているが、本当の未婚化・晩婚化の原因は、実際には、高齢者と公務員の国庫略奪による若年層の貧困化である。現在の若者は、45年前とは比べ物にならないほど税負担が増えているにもかかわらず、税収のほぼ全てを公務員と一部の高齢者に強奪されている。バブル崩壊後に増えたのが、国の借金、公務員給与、高齢者の金融資産、税(年金・社会保険)負担、貧富の差であることを考えれば、現在の日本の絶望的な状況も納得がいくはずである。

スポンサーリンク
スポンサーリンク