出生性比

プロット

e-Statにある2020年の人口動態調査 / 人口動態統計 確定数 出生から出生性比(出生数の男/女の比)をプロットしてみる:

日本の出生性比の推移

1906年,1966年のピークは「ひのえうま」である。

詳細

e-StatのCSVファイルの先頭部分は次のようになっている。文字コードはShift JIS,行末はCRLFである。

令和2年,人口動態統計,,
上巻 出生  第4.1表 年次別にみた出生数・出生率(人口千対)・出生性比及び合計特殊出生率

注 :1)1944年(昭和19年)〜1946年(昭和21年)は戦災による資料喪失等資料不備のため省略した。1947年(昭和22年)〜1972年(昭和47年)は沖縄県を含まない。
   2)1926年(昭和元年)・1930年(昭和5年)・1935年(昭和10年)の出生数の総数には、男女不詳が各1が含まれている。
   3)率算出に用いた分母人口は日本人人口である。
   4)2004・2006・2009〜2017年(平成16・18・21〜29年)の都道府県からの報告漏れ(2019年3月29日公表)による再集計を行ったことにより、
     2017年(平成29年)以前の報告書とは数値が一致しない箇所がある。
資料:国立社会保障・人口問題研究所「人口統計資料集」、厚生労働省「人口動態統計」
, 出生数,,, 出生率, 出 生,合計特殊
, 総 数,  男,  女,, 性 比,出 生 率
1899,1386981,713442,673539,32.0,105.9,…
1900,1420534,727916,692618,32.4,105.1,…
(中略)
2000,1190547,612148,578399,9.5,105.8,1.36
2001 ,1170662,600918,569744,9.3,105.5,1.33
2002,1153855,592840,561015,9.2,105.7,1.32
(後略)

最初の9行はメタ情報,次の2行は列見出しを2行に分けてスペースで整形したものである。本来のCSVにするためには,メタ情報を削除あるいはコメントアウト(頭に # を付けるなど)して,ヘッダ行を次のようにすればよい:

年,出生数_総数,出生数_男,出生数_女,出生率,出生性比,合計特殊出生率

さらによく見ると2001年に全角空白が紛れ込んでいる。最初これに気づかなかったので「年」がすべて文字列扱いになってしまった(RやExcelはこの全角空白を読み飛ばすようだ)。ここでは下記のように sep="\s*," で読み飛ばすことにした。

結局,元データをそのまま読んで出生性比をプロットするには,次のようにすればよい。「出生性比」という冗長な項目は無視して,「出生数_男」を「出生数_女」で割って正確な出生性比を求めた。

import pandas as pd
import matplotlib.pyplot as plt

df = pd.read_csv("mb010000.csv", encoding="cp932", skiprows=11,
                 na_values="…", keep_default_na=False, sep="\s*,",
                 names=["年", "出生数_総数", "出生数_男", "出生数_女",
                        "出生率", "出生性比", "合計特殊出生率"])

plt.figure(figsize=(14, 4))
plt.plot(df["年"], df["出生数_男"] / df["出生数_女"], "o-")
plt.grid()

ただ,これでは1944〜1946年が欠測値なのに線で結んでしまう。1943年と1947年を結ぶ線を消すには,次のようにすればよい:

df1 = pd.DataFrame({"年": [1944, 1945, 1946]})
df2 = pd.merge(df1, df, how="outer", sort=True)
plt.plot(df2["年"], df2["出生数_男"] / df2["出生数_女"], "o-")

冒頭に掲げた図はこのようにして描いた。


Last modified: