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年前とは比べ物にならないほど税負担が増えているにもかかわらず、税収のほぼ全てを公務員と一部の高齢者に収奪されているということです。バブル崩壊後に増えたのが、国と地方の借金、公務員給与、高齢者の金融資産、税(年金・社会保険)負担、ワープア、貧富の差であることを考えれば、現在の日本の絶望的な状況も納得がいくはずです。まさにこんな日本に誰がしたと言いたくなります。

1908年〜2017年の平均婚姻年齢(初婚・全婚姻)をグラフ化
若年・中年・高年・超高年層死亡数推移(1950年〜2017年)
日本の交通事故死亡者数の推移を性別・年齢別に棒グラフ化する
Python:日本人の年齢別死亡者数の推移をプロットして考察する
Python:年齢別交通事故死亡数を死亡割合に変換する
Python:在留外国人比率の高い市町村を条件別に抽出する
Python:日本人の年代別・性別死亡数を視覚化して考察する
Python:結婚適齢期女性が最も余っている都市を探し出す
Python:国籍別に在留外国人数の多い市町村を抽出する
Python:1950年〜2017年の年齢別自殺数推移を棒グラフ化する

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