この教材は、原論文が使ったデータそのものを使えていません。そこで代わりのデータで同じ問いを追いかけ、結論の向き(増える/減る、強い/弱い)が原論文と一致するかを確かめます。「同じ数値が出る」ことは目標にしていません。
| 原論文が使ったデータ | 人口動態統計特殊報告・SSDSE 分析単位:市区町村 中核手法:回帰分析・相関分析・残差分析 |
|---|---|
| この教材が使うデータ |
|
| 原論文(PDF) | 市区町村別でみる合計特殊出生率推移の特徴分析 統計活用奨励賞/村松 波、熊野 翔、川田 瑛貴(武蔵野大学工学部) |
▶ ここに書いてある分析は、ページ下部の「🐍 ブラウザで動かす」でそのまま実行できます(インストール不要)。動かしているのは code/2019_U4_katsuyo.py(199 行)そのものです。
このページの図1(実データ計算)を自分で再現するには、以下の手順でデータを準備してください。コードの編集は不要です。図2〜図4は原論文の報告値をグラフ化するもので、追加データは不要です。
data/raw/ フォルダに入れます。html/figures/ に自動保存されます。
※ 原論文はこのほかに e-Stat 国勢調査(市区町村別の年齢別女性人口・0〜4歳人口、1995〜2015年)、厚生労働省「人口動態保健所・市区町村別統計」のベイズ推定TFR、内閣府・総務省の課税対象所得、国土交通省の地価公示、東京都福祉保健局の区市町村別TFRを独自に収集・結合しています。これらは SSDSE 未収録のため、原論文の中核である市区町村別の近似計算・散布図・地図は再計算できません(詳細は「データと変数」の再現範囲を参照)。
日本の総人口は2011年以来減少を続けており、その根本的な要因である少子化は国の最重要課題の一つである。少子化の指標である合計特殊出生率(Total Fertility Rate、以下 TFR)は2005年に過去最低の1.26を記録し、その後少しずつ上昇したものの、人口安定に必要な人口置換水準の2.07には遠く及ばない。有効な対策を打つには、TFR に効いている要因を明らかにする必要がある。
TFR には大きな地域差がある。原論文はまず提供データ SSDSE の「合計特殊出生率」を都道府県ごとにグラフ化し(原論文 図1・図2)、沖縄が他都道府県に比べて一貫して高い値で推移することを確認するところから出発する。しかし都道府県単位では、市区町村ごとのばらつきが平均化されてしまい特徴が見つけにくい。そこで「市区町村別の、できるだけ長期間の TFR 時系列」を武器に、都道府県別の分析では見えにくい説明要因を探ろう——というのが本研究の問題意識である。
58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 | # ===== ステップ2: 図1 都道府県別 TFR 推移(実データ・沖縄強調) ===== pv = df.pivot_table(index='年度', columns='都道府県', values='TFR') fig, ax = plt.subplots(figsize=(9.5, 5.8)) for pref in pv.columns: if pref not in ('沖縄県', '東京都'): ax.plot(pv.index, pv[pref], color='#B0BEC5', lw=0.8, alpha=0.7, zorder=1) ax.plot(pv.index, pv['沖縄県'], color='#E65100', lw=3.0, zorder=3, marker='o', ms=4, label='沖縄県(一貫して最高水準)') ax.plot(pv.index, pv['東京都'], color='#1565C0', lw=2.2, zorder=2, marker='s', ms=3.5, label='東京都(最低水準で推移)') ax.set_xlabel('年') ax.set_ylabel('合計特殊出生率(TFR)') ax.set_title('都道府県別 合計特殊出生率の推移(SSDSE-B-2026 実データ、2012〜2023年)\n' '原論文 図1・図2(SSDSE-2019B、2005〜2016年)の再表現:沖縄の高さが際立つ', fontsize=11) ax.legend(loc='upper right', fontsize=10) ax.grid(alpha=0.3) fig.tight_layout() fig.savefig(f'{FIG_DIR}/2019_U4_fig1.png', bbox_inches='tight') plt.close(fig) tfr15 = pv.loc[2015].sort_values(ascending=False) tfr23 = pv.loc[2023].sort_values(ascending=False) print('図1 保存: 2019_U4_fig1.png') print(f"2015年 TFR 上位: {'、'.join(f'{k} {v:.2f}' for k, v in tfr15.head(3).items())}") print(f"2015年 TFR 下位: {'、'.join(f'{k} {v:.2f}' for k, v in tfr15.tail(3).items())}") print(f"都道府県単位の TFR 標準偏差(実データ計算): " f"2015年 {tfr15.std(ddof=1):.4f} / 2023年 {tfr23.std(ddof=1):.4f}") print(' ※ 原論文の報告値 0.1327242 は「2010年の都道府県単位 TFR」の標準偏差。') print(' 原論文はこれが市区町村単位の分布幅の約半分だと指摘した(図8・図9)') |
図1 保存: 2019_U4_fig1.png
2015年 TFR 上位: 沖縄県 1.96、島根県 1.78、宮崎県 1.71
2015年 TFR 下位: 京都府 1.35、北海道 1.31、東京都 1.24
都道府県単位の TFR 標準偏差(実データ計算): 2015年 0.1308 / 2023年 0.1332
※ 原論文の報告値 0.1327242 は「2010年の都道府県単位 TFR」の標準偏差。
原論文はこれが市区町村単位の分布幅の約半分だと指摘した(図8・図9)df.pivot_table(index='年度', columns='都道府県', values='TFR') — 縦持ちのデータを「年×都道府県」の表に組み替えると、47本の線が一気に描けます。zorder で前後関係も制御)。そこで原論文は、TFR の代理指標として人口学で使われてきた子ども女性比(5歳未満の子どもの数を「若年女性」数で割ったもの)に着目する。子ども女性比の材料(0〜4歳人口・年齢別女性人口)は国勢調査にあるため、1995〜2015年まで5年ごとに全市区町村で計算できる。これを TFR(ベイズ推定)に回帰させて較正すれば、ベイズ推定が存在しない年まで市区町村別 TFR を拡張できる——という戦略である。
子ども女性比 回帰による較正 9領域分類 変動係数 地図可視化
原論文は SSDSE(独立行政法人統計センターの教育用標準データセット)の2019年版から次の項目を抽出した。市区町村データ(SSDSE-2019A)は後述の「TFR 関連要因」の計算に、都道府県データ(SSDSE-2019B)は合計特殊出生率の推移の確認(図1)に使われる。
| データセット | 抽出した項目 |
|---|---|
| SSDSE-2019A(市区町村) | 総人口、日本人人口(男女別含む)、15歳未満人口、転入者数、転出者数、世帯数、一般世帯数、死亡数、核家族世帯数、単独世帯数、婚姻件数、完全失業者数、就業者数、就業者数(女)、医師数、保育所等数、出生数 |
| SSDSE-2019B(都道府県) | 合計特殊出生率 |
| 変数名 | 期間 | 出典 |
|---|---|---|
| 総人口・年齢別女性人口・0〜4歳男女人口 | 1995〜2015(5年毎) | e-Stat 国勢調査(第1次基本集計・人口等基本集計) |
| 合計特殊出生率(ベイズ推定値) | H15-H19、H20-H24 | 厚生労働省「人口動態保健所・市区町村別統計」 |
| 課税対象所得(納税義務者数一人当たり) | 1975〜2018 | 内閣府「市区町村別 人口・経済関係データ」、総務省「市町村税課税状況等の調」 |
| 市区町村の地価 | 1975〜2019 | 国土交通省 地価公示(変動率及び平均価格の時系列推移表) |
| 東京都の区市町村別 合計特殊出生率 | H5〜H29(毎年) | 東京都福祉保健局「人口動態統計 年次推移(区市町村別)」 |
31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 | import os import numpy as np import pandas as pd import matplotlib matplotlib.use('Agg') import matplotlib.pyplot as plt plt.rcParams['font.family'] = 'Hiragino Sans' plt.rcParams['axes.unicode_minus'] = False plt.rcParams['figure.dpi'] = 150 FIG_DIR = 'html/figures' DATA_B = 'data/raw/SSDSE-B-2026.csv' os.makedirs(FIG_DIR, exist_ok=True) # ===== ステップ1: SSDSE-B(都道府県・時系列)の読み込み ===== df = pd.read_csv(DATA_B, encoding='cp932', header=1) df = df[df['地域コード'].astype(str).str.match(r'^R\d{5}', na=False)].copy() df['年度'] = df['年度'].astype(int) df['TFR'] = df['合計特殊出生率'].astype(float) years = sorted(df['年度'].unique()) print(f"【SSDSE-B-2026】{df['都道府県'].nunique()}都道府県 × " f"{len(years)}年({years[0]}〜{years[-1]}年)") print(' ※ 原論文が使った SSDSE-2019B は 2005〜2016 年収録。現行版とは期間が異なる') print(' ※ 市区町村別 TFR(ベイズ推定)・年齢別女性人口は SSDSE 未収録') print(' → 原論文の子ども女性比による近似計算は再計算不可(報告値で提示)') |
【SSDSE-B-2026】47都道府県 × 12年(2012〜2023年)
※ 原論文が使った SSDSE-2019B は 2005〜2016 年収録。現行版とは期間が異なる
※ 市区町村別 TFR(ベイズ推定)・年齢別女性人口は SSDSE 未収録
→ 原論文の子ども女性比による近似計算は再計算不可(報告値で提示)pd.read_csv(..., encoding='cp932', header=1) — SSDSE-B は1行目が変数コード、2行目が日本語の変数名なので、header=1 で2行目を列名にします。str.match(r'^R\d{5}') — 地域コードが「R+数字5桁」の行(47都道府県)だけを残すフィルタです。f"...{式}..." はf-string。{tfr15.std(ddof=1):.4f} のように「計算式+書式指定」をそのまま文字列に埋め込めます。※ 本節の統計量(決定係数・回帰係数・残差の標準偏差・的中割合・平均・変動係数・領域別自治体数など)はすべて原論文の報告値である。図2〜図4は報告値の可視化であり、再計算ではない。
2010年の1734市区町村について、子ども女性比(0〜4歳人口 ÷ 若年女性人口)と TFR(ベイズ推定)の回帰分析を行う。このとき分母の「若年女性」の年齢範囲を6通りに変化させ、決定係数が最大になる範囲を探した。
得られた最適条件(原論文 表5 の転記)は次のとおり。
| 条件 | 子ども女性比 × TFR(ベイズ推定)〔原論文 図4〕 | TFR(子ども女性比推定)× TFR(ベイズ推定)〔原論文 図5〕 | |||||
|---|---|---|---|---|---|---|---|
| 年齢範囲 | 対象 | 決定係数 | 傾き | y切片 | 決定係数 | 傾き | y切片 |
| 20〜44歳 | 2010年・人口1万人以上の1248市区町村 | 0.8424 | 4.8949 | 0.1704 | 0.8412 | 1.0094 | -0.0145 |
※ 原論文の本文には回帰式が「0.8424×x+0.1704」と記されているが、0.8424 は表5では決定係数として報告されている値であり、表5の傾きは 4.8949 である。本ページは表5の値(傾き4.8949・切片0.1704)を回帰直線のパラメータとして表記した(原論文内の表記の不一致に関する注記)。
この式で計算した値を TFR(子ども女性比推定)と呼ぶ。TFR(ベイズ推定)との相関をとり直すと傾きはほぼ1(1.0094)、決定係数 0.8412 となり(原論文 図5)、さらに残差分析から残差の標準偏差は 0.0798。すなわちこの近似の誤差は 0.08 程度と見積もられた。
89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 | # ===== ステップ3: 図2 原論文 表3 の報告値(年齢範囲別 R²・R)を可視化 ===== # 出典: 原論文 表3(2010年・全1734市区町村、TFR(ベイズ推定)×子ども女性比) t3 = pd.DataFrame({ '年齢範囲': ['15〜44歳', '15〜49歳', '20〜39歳', '20〜44歳', '20〜49歳', '25〜39歳'], '決定係数R2': [0.605, 0.576, 0.645, 0.657, 0.625, 0.623], '相関係数R': [0.777, 0.759, 0.803, 0.810, 0.791, 0.789], }) best = t3.loc[t3['決定係数R2'].idxmax()] fig, ax = plt.subplots(figsize=(8.6, 5.2)) colors = ['#90A4AE' if a != best['年齢範囲'] else '#E65100' for a in t3['年齢範囲']] bars = ax.bar(t3['年齢範囲'], t3['決定係数R2'], color=colors, width=0.6) for b, r2, r in zip(bars, t3['決定係数R2'], t3['相関係数R']): ax.text(b.get_x() + b.get_width() / 2, b.get_height() + 0.008, f'R²={r2:.3f}\nR={r:.3f}', ha='center', fontsize=9) ax.set_ylim(0.5, 0.72) ax.set_ylabel('決定係数 R²') ax.set_xlabel('子ども女性比の分母に用いる「若年女性」の年齢範囲') ax.set_title('子ども女性比と TFR(ベイズ推定)の当てはまり(女性年齢範囲別)\n' '原論文 表3・図3 の報告値の可視化(2010年・全1734市区町村。再計算ではない)', fontsize=11) ax.grid(axis='y', alpha=0.3) fig.tight_layout() fig.savefig(f'{FIG_DIR}/2019_U4_fig2.png', bbox_inches='tight') plt.close(fig) print('図2 保存: 2019_U4_fig2.png') print(t3.to_string(index=False)) print(f"→ 最適な年齢範囲は {best['年齢範囲']}(R²={best['決定係数R2']})") print('→ さらに人口1万人以上の1248市区町村に限定すると R²=0.8424(原論文 図4・表5)') print(' 回帰式: TFR = 4.8949 × 子ども女性比 + 0.1704(原論文 表5 の報告値)') |
図2 保存: 2019_U4_fig2.png 年齢範囲 決定係数R2 相関係数R 15〜44歳 0.605 0.777 15〜49歳 0.576 0.759 20〜39歳 0.645 0.803 20〜44歳 0.657 0.810 20〜49歳 0.625 0.791 25〜39歳 0.623 0.789 → 最適な年齢範囲は 20〜44歳(R²=0.657) → さらに人口1万人以上の1248市区町村に限定すると R²=0.8424(原論文 図4・表5) 回帰式: TFR = 4.8949 × 子ども女性比 + 0.1704(原論文 表5 の報告値)
t3 = pd.DataFrame({...}) — 原論文 表3 の数値を転記しています。計算し直しているわけではありません(材料の市区町村別データが SSDSE にないため)。t3['決定係数R2'].idxmax() — 決定係数が最大の行(=最適な年齢範囲)を取り出して、バーの色を変えています。['A' if cond else 'B' for x in xs] で「条件によって色を変える」リストが1行で作れます。近似値の水準だけでなく年次変化(増えた・減った)が信用できるかを調べるため、原論文は TFR(子ども女性比推定)と TFR(ベイズ推定)それぞれの「2010年−2005年の差」を計算し、散布図を描いた(原論文 図6。グラフは原論文参照)。両者の差は同符号の市区町村が多いことが確認できる。
TFR(子ども女性比推定)と TFR(ベイズ推定)のヒストグラムを比較すると、子ども女性比推定の方が分布の幅がやや小さいものの、よく似た分布であることが確認された(原論文 図8。グラフは原論文参照)。さらに都道府県単位の TFR の分布と比べると、都道府県単位の分布の幅は市区町村単位の約半分(標準偏差 0.1327242、2010年)だった(原論文 図9)。
119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 | # ===== ステップ4: 図3 原論文 表7 の報告値(平均・変動係数の年次推移)を可視化 ===== # 出典: 原論文 表7・図10(TFR(子ども女性比推定)、市区町村単位) t7_year = [1995, 2000, 2005, 2010, 2015] t7_mean = [1.690327, 1.663421, 1.451268, 1.50186, 1.632668] t7_cv = [0.155119, 0.143068, 0.156253, 0.151681, 0.166862] fig, ax1 = plt.subplots(figsize=(8.6, 5.2)) ax1.plot(t7_year, t7_mean, color='#1565C0', marker='o', lw=2.5, label='平均') ax1.set_xlabel('年') ax1.set_ylabel('TFR(子ども女性比推定)の平均', color='#1565C0') ax1.tick_params(axis='y', labelcolor='#1565C0') ax1.set_xticks(t7_year) ax1.set_ylim(1.40, 1.75) ax2 = ax1.twinx() ax2.plot(t7_year, t7_cv, color='#2E7D32', marker='s', lw=2.5, ls='--', label='変動係数') ax2.set_ylabel('変動係数(標準偏差÷平均)', color='#2E7D32') ax2.tick_params(axis='y', labelcolor='#2E7D32') ax2.set_ylim(0.10, 0.20) for y, m in zip(t7_year, t7_mean): ax1.annotate(f'{m:.3f}', (y, m), textcoords='offset points', xytext=(0, 9), ha='center', fontsize=9, color='#1565C0') ax1.set_title('TFR(子ども女性比推定)の平均と変動係数の年次推移\n' '原論文 表7・図10 の報告値の可視化(再計算ではない)', fontsize=11) ax1.grid(alpha=0.3) h1, l1 = ax1.get_legend_handles_labels() h2, l2 = ax2.get_legend_handles_labels() ax1.legend(h1 + h2, l1 + l2, loc='lower right', fontsize=10) fig.tight_layout() fig.savefig(f'{FIG_DIR}/2019_U4_fig3.png', bbox_inches='tight') plt.close(fig) print('図3 保存: 2019_U4_fig3.png') print(pd.DataFrame({'年': t7_year, '平均': t7_mean, '変動係数': t7_cv}).to_string(index=False)) print('→ 平均は 2005 年に最小(1.451)となり 2010 年には約 0.2 上昇。') print(' 変動係数は平均が増減してもあまり変化しない(原論文の指摘)') |
図3 保存: 2019_U4_fig3.png 年 平均 変動係数 1995 1.690327 0.155119 2000 1.663421 0.143068 2005 1.451268 0.156253 2010 1.501860 0.151681 2015 1.632668 0.166862 → 平均は 2005 年に最小(1.451)となり 2010 年には約 0.2 上昇。 変動係数は平均が増減してもあまり変化しない(原論文の指摘)
ax2 = ax1.twinx() — 左右で単位の違う2系列(平均と変動係数)を1枚に重ねる定番テクニックです。ax.annotate(text, (x, y), textcoords='offset points', xytext=(0, 9)) で「点の少し上」にラベルを置けます。x軸に A=2015年の TFR(子ども女性比推定)、y軸に B=その差(2015年−2005年)をとった散布図(原論文 図11。グラフは原論文参照)を、4本の直線(A=1.3、A=1.8、B=0.1、B=0.5)で9つの領域に分割し、人口2000人以上の市区町村を分類した。
| 領域 | 散布図上の定義 | 1995〜2015年の時系列推移の特徴 |
|---|---|---|
| 領域1-1(35自治体) | A≧1.8 かつ B>0.5 | 1995年からV字型に推移し、全体的に値が高い。 |
| 領域2-1(9自治体) | 1.3≦A<1.8 かつ B>0.5 | 領域1-1と同様に上昇するが、伸びは1-1より大きい。 |
| 領域3-3(56自治体) | A<1.3 かつ B<0.1 | 全体的に右肩下がり。2005年に下がってから回復していない。 |
各領域の市区町村の性格を調べるため、原論文は SSDSE-2019A の変数から次の8つの「TFR 関連要因」を算出した(原論文 表9。すべて×100 の百分率)。
| TFR 関連要因(%) | 算出方法 |
|---|---|
| 自然増減率 | (出生数 − 死亡数)÷ 日本人人口 |
| 社会増減率 | (転入者 − 転出者)÷ 日本人人口 |
| 3世代世帯割合推定値 | {一般世帯数 −(核家族世帯数 + 単独世帯数)}÷ 一般世帯数 |
| 婚姻件数割合 | 婚姻件数 ÷ 日本人人口 |
| 完全失業率 | 完全失業者数 ÷(完全失業者数 + 就業者数) |
| 就業率(女) | 就業者数(女)÷ 日本人人口(女) |
| 医師数割合 | 医師数 ÷ 日本人人口 |
| 保育所等割合 | 保育所等数 ÷ 15歳未満人口 |
そのうえで領域1-1・2-1・3-3 の各市区町村について、これらの要因の2015年値を TFR(子ども女性比推定)と並べたリストを作り、標準得点が 0.8 以上の市区町村をハイライト表示して、そのパターンから特徴を読み取った(原論文 表10〜12。リストは原論文参照)。
| 領域 | ハイライトのパターンから読み取れた特徴(原論文の記述) |
|---|---|
| 領域1-1 | 北海道と九州が多い。ハイライトは全市区町村に満遍なく散らばるが、ハイライトされる要因は市区町村ごとに異なる。例:同じ九州でも鹿児島では3世代世帯割合推定値が低く、熊本では高い。 |
| 領域2-1 | 東京3区(千代田・中央・港)のハイライトが多く、TFR は2005年から倍増。自治体は「保育所等割合だけがハイライトされる型」と「保育所等割合以外のほとんどがハイライトされる型」の2つに分かれる。 |
| 領域3-3 | 全体にハイライトが少ない。例外の千葉県浦安市はハイライトが多いのに TFR は2015年に減少しており、浦安市だけ3世代世帯割合推定値が非常に低いこととの関連が推定される。 |
9領域への帰属を日本地図に塗り分けると、地方によって領域の傾向が異なることがわかった。
図13の東京の地図では異なる領域が地理的に分かれて分布し、その中で千代田区・中央区・港区の TFR 増加率が非常に大きい。そこで原論文は東京都が公開する平成5年〜平成29年の毎年の区市町村別 TFR を使い、全区市町村の年次推移を描いた(図14)——東京都内でも市区町村によって推移は大きく異なる。さらに東京都では納税義務者一人当たり所得が急増している地域があるため(図15)、2005年から2015年までの所得の増分と TFR の増分の関係を調べたところ(図16)、非常に高い相関があることがわかった。
153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170 171 172 173 174 175 176 177 178 179 180 181 182 183 184 185 186 187 188 189 190 191 192 193 194 195 196 197 198 | # ===== ステップ5: 図4 原論文 表8 の報告値(9領域の分割と市区町村数)を再表現 ===== # 出典: 原論文 表8(人口2000人以上の1424市区町村) # A = 2015年 TFR(子ども女性比推定)、B = その差(2015年−2005年) # 列: A<1.3(領域3-x)/1.3≦A<1.8(領域2-x)/A≧1.8(領域1-x) # 行: B>0.5(x-1)/0.1<B≦0.5(x-2)/B<0.1(x-3) counts = np.array([[0, 9, 35], # B > 0.5 [35, 725, 217], # 0.1 < B ≦ 0.5 [56, 329, 9]]) # B < 0.1 region = [['領域3-1', '領域2-1', '領域1-1'], ['領域3-2', '領域2-2', '領域1-2'], ['領域3-3', '領域2-3', '領域1-3']] note = [['', '東京3区(千代田・\n中央・港)を含む\nTFRが2005年から倍増', 'V字回復・高水準\n九州・沖縄に多い'], ['', '', ''], ['低水準・回復なし\n関東以北に多い', '', '']] fig, ax = plt.subplots(figsize=(9.2, 6.4)) im = ax.imshow(np.log1p(counts), cmap='Blues', vmin=0, vmax=np.log1p(counts).max() * 1.15) for i in range(3): for j in range(3): c = 'white' if counts[i, j] > 300 else '#0D2B45' ax.text(j, i - 0.24, region[i][j], ha='center', fontsize=12, fontweight='bold', color=c) ax.text(j, i, f'{counts[i, j]} 自治体', ha='center', fontsize=12, color=c) if note[i][j]: ax.text(j, i + 0.28, note[i][j], ha='center', fontsize=8.2, color=c) ax.set_xticks([0, 1, 2]) ax.set_xticklabels(['A < 1.3', '1.3 ≦ A < 1.8', 'A ≧ 1.8']) ax.set_yticks([0, 1, 2]) ax.set_yticklabels(['B > 0.5', '0.1 < B ≦ 0.5', 'B < 0.1']) ax.set_xlabel('A = 2015年 TFR(子ども女性比推定)') ax.set_ylabel('B = TFR(子ども女性比推定)の差\n(2015年 − 2005年)') ax.set_title('散布図平面の9領域分割と各領域の市区町村数(人口2000人以上・計1424自治体)\n' '原論文 表8 の報告値の再表現(散布図そのもの=原論文 図11 は原論文参照)', fontsize=11) fig.tight_layout() fig.savefig(f'{FIG_DIR}/2019_U4_fig4.png', bbox_inches='tight') plt.close(fig) print('図4 保存: 2019_U4_fig4.png') tot = counts.sum() print(f'9領域の市区町村数の単純和: {tot}') print(' ※ 原論文 表8 の「合計」欄は 1424。各領域の値の単純和 1415 とは一致しない') print(' (原論文内の不整合。本ページは各セルの値をそのまま転記している)') print('着目された3領域(原論文 第4章):') print(' 領域1-1(A≧1.8 かつ B>0.5, 35自治体): 高水準かつ伸びも大。九州・沖縄に多い') print(' 領域2-1(1.3≦A<1.8 かつ B>0.5, 9自治体): 伸びが特に大。東京3区は2005年から倍増') print(' 領域3-3(A<1.3 かつ B<0.1, 56自治体): 低水準で回復なし。関東以北に多い') print('done') |
図4 保存: 2019_U4_fig4.png
9領域の市区町村数の単純和: 1415
※ 原論文 表8 の「合計」欄は 1424。各領域の値の単純和 1415 とは一致しない
(原論文内の不整合。本ページは各セルの値をそのまま転記している)
着目された3領域(原論文 第4章):
領域1-1(A≧1.8 かつ B>0.5, 35自治体): 高水準かつ伸びも大。九州・沖縄に多い
領域2-1(1.3≦A<1.8 かつ B>0.5, 9自治体): 伸びが特に大。東京3区は2005年から倍増
領域3-3(A<1.3 かつ B<0.1, 56自治体): 低水準で回復なし。関東以北に多い
donecounts = np.array([...]) — 原論文 表8 の9つの領域の市区町村数を転記し、imshow で3×3のヒートマップとして再表現しています。散布図そのもの(原論文 図11)は市区町村別データが必要なため描けません。np.log1p(counts) — 725(領域2-2)と 0(領域3-1)が同居するので、対数スケールで色の階調をつけています。ax.text(x, y, s, ha='center', color=...) をループで回せば、ヒートマップの各セルに注釈を書き込めます。この論文の統計的な面白さは、高度なモデルではなく「使える指標を自分で作り、その信頼性を自分で検証し、検証済みの範囲で使う」という一連の設計にある。使われている道具を順に見ていこう。
TFR の計算には年齢別出生率が必要で、小地域では公表が限られる。一方、子ども女性比(0〜4歳人口÷若年女性人口)は国勢調査だけで計算できる。両方が揃っている年(2010年)で単回帰を行い、回帰直線のパラメータ(傾き4.8949・切片0.1704)を得れば、子ども女性比しかない年(1995年・2015年など)にも TFR の近似値を計算できる。これは測定機器の「較正(キャリブレーション)」と同じ発想である。
「若年女性」の年齢範囲は先行研究でも 15〜49歳・15〜44歳と揺れがある。原論文は範囲を6通り試し、決定係数が最大になる 20〜44歳を採用した(図2)。さらに外れ値の原因(小規模自治体の偶然変動)を特定し、人口1万人以上に対象を絞ることで R²=0.8424 を達成した。指標の定義そのものをデータで選ぶ、シンプルだが強力な最適化である。
近似値を使う以上、誤差の大きさを言えなければならない。原論文は(i)残差の標準偏差 0.0798 から「水準の誤差は 0.08 程度」、(ii)年次変化について「推定値の増分が 0.1 以上なら実際の TFR も約87%の頻度で増加」という2種類の信頼性指標を用意した。以降の分析(領域分類の境界 B=0.1 など)は、この誤差見積もりと整合するように設計されている。
市区町村単位と都道府県単位の TFR の分布をヒストグラムで比べ、都道府県単位の標準偏差(0.1327242)が市区町村単位の約半分であることを示した。年次比較には平均で割った変動係数を使い、「平均が動いても相対的なばらつきは安定」という性質を取り出した(図3)。
クラスタリングのようなアルゴリズムではなく、解釈しやすい閾値(A=1.3・1.8、B=0.1・0.5)で散布図平面を9分割した(図4)。閾値 B=0.1 は③の的中率評価(0.1以上なら約87%)に対応しており、誤差評価が分類設計に反映されているのがポイント。
8つの TFR 関連要因を標準得点に直し、0.8 以上をハイライトすることで「どの要因が全国平均より突出しているか」を一覧表示した。また領域への帰属を日本地図に塗り分け(コロプレス図)、地理的なまとまり(九州)とモザイク性(北海道)を対比した。
子ども女性比は、出生登録が整備されていない時代・地域の出生力を国勢調査(センサス)だけで測るために人口学で古くから使われてきた指標である。原論文が引用する先行研究(小野ほか、統計データ分析コンペティション2018 特別賞)でも、人口の自然増減の説明に子ども女性比が使われている。「新しいデータを取りに行けないなら、既にあるデータから代理指標を作る」という発想は、行政データ分析全般で役に立つ。
出生数が年間数十人の町村では、通常の方法で計算した TFR は偶然変動で大きくぶれる。厚生労働省の「人口動態保健所・市区町村別統計」は、ベイズ推定によって周辺情報を借りながら小地域の TFR を安定的に推定している(5年分の出生を合算した H15-H19、H20-H24 のような期間表示になっているのもそのため)。小地域統計の「小標本問題」とその対処は、地域分析を行うなら必ず出会うテーマである。
本研究の出発点「都道府県単位では平均化されて特徴が見えない」は、空間分析で MAUP(可変地域単位問題)と呼ばれる現象の一例である。さらに、市区町村単位の相関(例:東京都での所得増分×TFR増分)を個人の因果(所得が増えた世帯ほど子どもを産む)と読み替えるのは生態学的誤謬にあたる。集計データからの結論は「その集計単位における関連」として慎重に述べる必要がある——原論文も「東京都に独自の傾向」と範囲を限定して報告している。
領域ごとの特徴づけに、主成分分析やクラスタリングではなく「標準得点 0.8 以上をハイライトした一覧表」を使ったのは、個々の自治体名を保ったまま多変量パターンを目視できる利点がある。一方で「0.8」という閾値の選択や、パターンの読み取りに主観が入る余地もある。機械的な手法と目視の手法を相互補完的に使うのが実務的である。
第1は TFR 関連要因の種類を増やして自治体特徴の分析精度を上げること。第2は統合データベースへの展開である。文献も含めて多くの情報を統合し、特徴が似ている自治体を検索・比較できるデータベースを誰もが利用可能な形で開発できれば、少子化問題の解決に貢献できる——と原論文は結んでいる。
村松 波・熊野 翔・川田 瑛貴(武蔵野大学 工学部 数理工学科)「市区町村別でみる合計特殊出生率推移の特徴分析」2019年度 統計データ分析コンペティション 統計活用奨励賞(大学生・一般の部)
本論文のような「代理指標+地域分類」の分析を読むとき・自分でやるときに、初心者が陥りやすい誤解をまとめました。
この論文を読むのに必要な用語を初心者向けに解説します。本文中で見慣れない言葉が出てきたら、ここに戻って確認してください。
この論文で使われた手法を、他のテーマにも使える形で整理します。
本論文の分析は(1)欲しい指標(市区町村別TFRの長期時系列)が存在しない、(2)材料(国勢調査)から代理指標を作る、(3)正解がある年で較正・検証する、(4)誤差の見積もりと整合する粒度(領域分類の閾値)で使う、という一直線の設計になっている。高度な手法を使うことよりも、各ステップの根拠が連結されていることが、この論文から学ぶべき最大のポイント。
この研究をさらに発展させるための3つの方向性を示します。「今回わかったこと(X)」から「次に検証すべき仮説(Y)」を立て、「具体的に何をするか(Z)」まで考えてみましょう。
この論文を「読む」から「使う」へ。難易度順の5つの課題です。
python3 code/2019_U4_katsuyo.py を実行し、4つの図を再現してみましょう。実行結果の「実データによる計算」と「原論文の報告値の転記」がコードのどこで区別されているかを確認してください。'沖縄県' を自分の都道府県に変えて描き直し、全国の中での位置と2012〜2023年の動きを説明してみましょう。2015年→2023年で順位が大きく動いた県はどこでしょうか。本論文で学んだ手法は、研究の世界だけでなく、行政・企業・NPO の現場でも様々に活用されています。具体的なシーンを紹介します。
この論文を読んで初心者が抱きやすい疑問に、教育的観点から答えます。
この論文を理解できたか、クリックで確認しましょう。間違えても解説が出ます。
このページの分析は、この画面の中でそのまま実行できます。
Python をインストールする必要も、CSV をダウンロードする必要もありません。
下のセルの 「▶ ブラウザで実行」 を上から順に押すか、
「▶ 最初から全部実行」 で一気に流してください。
表示されるのは、本文の図表とまったく同じ計算の結果です
(動かしているのは再現スクリプト code/2019_U4_katsuyo.py そのもの)。
コードは書き換えられます。「✏️ 書き換える」で数字や変数を変えて ▶ を押すと、 結果がどう変わるかをその場で確かめられます(元に戻すボタンつき)。 ページを開いた時点で裏で実行環境の準備が始まっているので、待ち時間はほとんどありません。 初回だけ実行環境の取得にインターネット接続が必要です。