Pandasで2021年1月〜6月の出生数をグラフ化して考察する

その買うを、もっとハッピーに。|ハピタス

2021年1月〜6月の最新出生数を載せています。令和2年(2020年)の出生数が84万人だったので、令和3年(2021年)の出生数がどうなるのかは気になるところです。巷では、コロナ禍で在宅勤務が増えたので子供が増えるとか、バラマキ政策で一部の若年層世帯はリッチになっているので子供が増えるとかいろいろ言われていますが、トレンドとしては、出生数は減少の一途なので、今年に限って出生数の減少に歯止めがかかるとは到底思えませんが、史上空前のバラマキ政策が功を奏する可能性もまだ若干残ってはいます。

スポンサーリンク

1947年〜2020年の出生数をグラフ化する

先ず、全体的な流れを見るために、1947年〜2020年の出生数をグラフ化します。

import pandas as pd

df = pd.read_csv('japnumofbirths.csv')
df.head()
Unnamed: 0 Unnamed: 1 Unnamed: 2 (再 掲) Unnamed: 4 Unnamed: 5
0 1) NaN NaN NaN NaN NaN
1 年 次 出 生 数 死 亡 数 NaN NaN 自然増減数
2 NaN NaN NaN 乳児死亡数 新生児死亡数 NaN NaN
3 1947 昭和22年 2 678 792 1 138 238 205 360 84 204 NaN 1 540 554
4 48 23 2 681 624 950 610 165 406 73 855 NaN 1 731 014

不要な部分を消去して、unnamed0を年次、unnamed1を出生数、unnamed2を死亡数に変えます。

df = df.replace(r'[,\"\']','', regex=True).replace(r'\s*([^\s]+)\s*', r'\1', regex=True)
df.rename(columns={'Unnamed: 0':'年 次', 'Unnamed: 1':'出生数', 'Unnamed: 2':'死亡数'}, inplace=True)
df.drop(['(再    掲)', 'Unnamed: 4', 'Unnamed: 5'],axis=1,inplace=True)
df = df.iloc[3:]
df.head()
年 次 出生数 死亡数
3 1947昭和22年 2678792 1138238
4 4823 2681624 950610
5 4924 2696638 945444
6 195025 2337507 904876
7 5126 2137689 838998

indexを振り直します。

df.reset_index(drop=True, inplace=True)
df.head(3)
年 次 出生数 死亡数
0 1947昭和22年 2678792 1138238
1 4823 2681624 950610
2 4924 2696638 945444

年次を西暦に統一します。index0が1947年で最後が2020年になるようにします。

df["年 次"] = range(1947, 2021)
df.tail(3)
年 次 出生数 死亡数
71 2018 918400 1362470
72 2019 865239 1381093
73 2020 840835 1372755
df.dtypes
年 次     int64
出生数    object
死亡数    object
dtype: object

出生数と死亡数が何故かオブジェクトになっているので数値データに変換する必要があります。

df = df.apply(pd.to_numeric, errors="ignore")
df.dtypes
年 次    int64
出生数    int64
死亡数    int64
dtype: object
from matplotlib.pyplot import *
from matplotlib.font_manager import FontProperties
from matplotlib import rcParams
style.use('ggplot')

fp = FontProperties(fname='/usr/share/fonts/opentype/ipaexfont-gothic/ipaexg.ttf', size=54)
rcParams['font.family'] = fp.get_name()
rcParams["font.size"] = "20"
fig, ax = subplots(figsize=(25,25))

df[['年 次','出生数']].set_index('年 次').plot(ax=ax,kind='barh',color='g',alpha=0.5)
xticks(np.arange(0,2.8e6,1e6/4),
   ['{}万'.format(int(x/1e4)) if x > 0 else 0 for x in np.arange(0,2.8e6,1e6/4)]);

グラフが大きいので1997年〜2020年までに限定します。

from matplotlib.pyplot import *
from matplotlib.font_manager import FontProperties
from matplotlib import rcParams
style.use('ggplot')

fp = FontProperties(fname='/usr/share/fonts/opentype/ipaexfont-gothic/ipaexg.ttf', size=54)
rcParams['font.family'] = fp.get_name()
rcParams["font.size"] = "20"
fig, ax = subplots(figsize=(25,15))

df.loc[50:73,['年 次','出生数']].set_index('年 次').plot(ax=ax,kind='barh',color='g',alpha=0.5)
xticks(np.arange(0,1.55e6,1e6/4),
   ['{}万'.format(int(x/1e4)) if x > 0 else 0 for x in np.arange(0,1.55e6,1e6/4)]);
for i in ax.patches:
    ax.text(i.get_width()+5e3,i.get_y()+.45,\
      '{:,}人'.format(int(round((i.get_width()), 2))), fontsize=20, color='k')
ax.invert_yaxis();

2020年の出生数は84万人で、20年前の2000年と比べると35万人も減ってしまっています。35万人という数字は、清瀬市、東村山市、東久留米市の人口を足した数より多いので大変な数字です。それよりも深刻なのは、僅か5年前の2015年に比べて出生数が16万人も減ってしまっているということです。これは明らかに、2014年4月から始まった消費税の大増税の影響だと思われます。消費税前と消費税後では、アベノミクスによる円安効果も重なって、食料品と生活必需品の価格が10%〜100%値上がりしているからです。さらにこの間、光熱費・水道料金も爆上げしているので、子供を産むような環境ではなくなってしまっています。ちなみに、2020年の出生数はコロナの影響は全くないので(コロナが深刻化したのは2020年3月以降)、今年の出生数が気になるところです。

スポンサーリンク

2021年1月〜6月の出生数をグラフ化

2021年1月〜6月の出生数をグラフ化します。

df1 = pd.read_csv('numofbirths2021.csv')
df1
都道府県 出 生 数 死 亡 数 死 産 数 婚姻件数 離婚件数
0 1 全 国 63 742 140 844 1 404 38 851 14 762
1 2 全 国 59 789 118 984 1 399 44 800 15 097
2 3 全 国 69 446 123 579 1 613 62 406 22 530
3 4 全 国 70 582 118 169 1 455 33 554 16 695
4 5 全 国 70 439 118 634 1 434 45 415 14 018
5 6 全 国 71 031 108 734 1 454 40 324 15 432

1月〜6月までの合計出生数を見てみます。

df1 = df1.replace(r'[,\"\']','', regex=True).replace(r'\s*([^\s]+)\s*', r'\1', regex=True)
df1 = df1.apply(pd.to_numeric, errors="ignore")
df1["出 生 数"].sum()
405029

2020年の1月〜6月の出生数(速報値)と比較してみます。

df2 = pd.read_csv('numofbirths2020.csv')
df2
都道府県 出 生 数 死 亡 数 死 産 数 婚姻件数 離婚件数
0 1 全 国 74 672 132 622 1 661 37 668 16 827
1 2 全 国 66 639 117 010 1 510 74 147 16 627
2 3 全 国 71 135 119 161 1 670 43 451 23 514
3 4 全 国 73 286 113 362 1 591 37 913 16 493
4 5 全 国 71 940 108 380 1 577 32 544 11 483
5 6 全 国 73 037 100 423 1 554 44 406 15 178
6 7 全 国 76 785 104 849 1 485 37 479 16 208
7 8 全 国 75 724 111 591 1 289 42 902 15 266
8 9 全 国 75 843 107 468 1 397 33 113 15 616
9 10 全 国 74 846 118 038 1 444 40 720 16 283
10 11 全 国 69 494 118 455 1 238 68 565 15 126
11 12 全 国 69 282 133 185 1 478 44 675 18 020
df2 = df2.replace(r'[,\"\']','', regex=True).replace(r'\s*([^\s]+)\s*', r'\1', regex=True)
df2 = df2.apply(pd.to_numeric, errors="ignore")
df2["出 生 数"].sum()
872683
df2.loc[0:5,"出 生 数"].sum()
430709
430709-405029
25680

速報値では、2021年1〜6月の出生数は、2020年1〜6月と比べて25680人減っています。単純計算をすれば、今年は出生数が80万人割れをするということになります。グラフにしてみます。

from matplotlib.pyplot import *
from matplotlib.font_manager import FontProperties
from matplotlib import rcParams
style.use('ggplot')

fp = FontProperties(fname='/usr/share/fonts/opentype/ipaexfont-gothic/ipaexg.ttf', size=54)
rcParams['font.family'] = fp.get_name()
rcParams["font.size"] = "20"
fig, ax = subplots(figsize=(25,13))

df2.loc[0:5,['月','出 生 数']].set_index('月').plot(ax=ax,kind='barh',color='g',alpha=0.5,  position=1, width=.25)
df1.loc[0:5,['月','出 生 数']].set_index('月').plot(ax=ax,kind='barh',color='r',alpha=0.5, position=0, width=.25)


xticks(np.arange(0,1.1e5,1e4),
   ['{}万'.format(int(x/1e4)) if x > 0 else 0 for x in np.arange(0,1.1e5,1e4)]);
for i in ax.patches:
    ax.text(i.get_width()+2.5e2,i.get_y()+.185,\
      '{:,}人'.format(int(round((i.get_width()), 2))), fontsize=20, color='k')
ax.legend(["出生数(2020)","出生数(2021)"],loc='best', prop={'size': 26});
ax.invert_yaxis();

2021年1月の減り方がやばかったのは、2020年3月のコロナショックが原因だと思われます。休校だとかいろいろあってコロナが深刻化しだした時期だったのでこういう結果になったんでしょう。

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