この教材は、原論文が使ったデータそのものを使えていません。そこで代わりのデータで同じ問いを追いかけ、結論の向き(増える/減る、強い/弱い)が原論文と一致するかを確かめます。「同じ数値が出る」ことは目標にしていません。
| 原論文が使ったデータ | SSDSE-B・人口動態統計・人口推計・学校基本調査・住民基本台帳人口移動報告・住民基本台帳に基づく人口、人口動態及び世帯数調査・人口動態保健所・市区町村別統計 分析単位:その他 中核手法:重回帰分析・ランダムフォレスト |
|---|---|
| この教材が使うデータ |
|
| 原論文(PDF) | 社会増減が合計特殊出生率に与える影響 特別賞/堤敬司(京都府政策企画部企画統計課) |
▶ ここに書いてある分析は、ページ下部の「🐍 ブラウザで動かす」でそのまま実行できます(インストール不要)。動かしているのは code/2020_U5_4_shorei.py(213 行)そのものです。
このページの【実再現】部分(図1・図2)は、SSDSE-B だけで再現できます。コードの編集は不要です。なお原論文の中核である年齢階級別女性転入超過率のデータは e-Stat 由来でSSDSEに含まれないため、図3・図4は「原論文の報告値の可視化」にとどめています(詳細はデータの章)。
data/raw/ フォルダに入れます。html/figures/ に自動保存されます。
我が国では、「1.57ショック」を契機に様々な少子化対策が講じられてきた。しかし低下トレンドから抜け出すことはできず、合計特殊出生率(TFR)の全国値は2005年に1.26まで低下、2015年に1.45と一旦回復した後、2019年は再び1.36へ下落した。人口置換水準2.07を下回る状況は1974年以来46年連続で続いている。
原論文の概要(統計センター公式):「都道府県及び市区町村別の年齢別女性人口と出生数を用いて合計特殊出生率(TFR)の推定を行い、女性の年齢階級別転入超過率を特徴量として重回帰モデル及びランダムフォレストによる分析を行って、女性の年齢別転入超過率が出生率に有意に影響していることを示している。また、結婚して出産を迎える女性の出産コア年齢である30-34歳の女性の転入超過が自治体別でみた場合のTFRの向上に資することを指摘している。」
本ページではこの分析の流れを実データでたどりながら、使われた統計手法を一つずつ学んでいく。
重回帰分析 ランダムフォレスト 単回帰 公的統計の再構成
仮説を立てるにあたり、まず期間合計特殊出生率の定義を確認する。これは、ある年の15〜49歳の各歳の女性について「その歳の女性が産んだ子ども数 ÷ その歳の女性人口」を求め、合計したものである。
| 変数名 | 意味 | 出典 |
|---|---|---|
| Children(x) | x歳の女性が出産した子どもの数 | 厚生労働省「人口動態統計」 |
| Mothers(x) | x歳の日本人女性人口(10/1時点) | 総務省「推計人口」または「国勢調査」 |
※通常、都道府県別・市区町村別のTFR算出では、利用できる統計の制約から5歳階級別人口を用い、5を乗じて便宜的に算出される。
期間合計特殊出生率は、ある1年の各年齢の出生率を「仮想の一生」として足し合わせた合成指標である。実際の一人の女性が生涯に産む数(コホートTFR)とは異なり、その年の年齢別女性人口の構成に影響される。だからこそ、分母の人口構成を動かす社会増減が値を歪めうる。
原論文は、都道府県レベルと京都府の市区町村レベルの二段構えで分析する。分母の女性人口を、通常の「推計人口」「国勢調査」ではなく総務省「住民基本台帳に基づく人口、人口動態及び世帯数調査」を用いてTFRを近似する点が方法上の工夫である。
| 記号 | 変数 | 出典 | 本教材での扱い |
|---|---|---|---|
| A | 都道府県別TFR | 厚労省「人口動態統計」(2014-2017) | SSDSE収録→実再現 |
| B | 総人口 | 総務省「人口推計」(2017) | SSDSE収録→実再現 |
| C・D | 短期大学・大学 学生数 | 文科省「学校基本調査」(2017) | SSDSE収録→実再現 |
| E | 女性転入超過数(5歳階級別) | 総務省「住民基本台帳人口移動報告」(2014-2017) | e-Stat→報告値の可視化 |
| F | 女性人口(5歳階級別) | 総務省「住民基本台帳…調査」(2013-2017) | e-Stat→報告値の可視化 |
| G | 出生数(5歳階級別) | 厚労省「人口動態統計」(2013-2017) | e-Stat→報告値の可視化 |
| H | 市区町村別TFR-A | 厚労省「人口動態保健所・市区町村別統計」(2013-2017) | e-Stat→報告値の可視化 |
| 記号 | 変数 | 加工方法 |
|---|---|---|
| I | 人口1000人あたり学生数 | (C+D) / B × 1000 |
| J | 女性転入超過率(5歳階級別) | E / F × 100(%) |
| K | 市区町村別TFR-B | (G1519/F1519×5)+(G2024/F2024×5)+…+(G4549/F4549×5) |
公表される市区町村別TFR-A(厚労省)は5年平均・分母5年固定のため、単年の時系列変化を追いにくい。そこで原論文は分母に住民基本台帳の女性人口を用いたTFR-Bを自作し、公表値TFR-Aとの散布図で決定係数を確認して妥当性を検証した(ベイズ推定値と R²=0.7900、非ベイズ推定値と R²=0.8599、n=1467)。これは「既存指標をそのまま使えないとき、代替指標を作り妥当性を検証する」という実務的な作法の好例である。
まず SSDSE-B-2026 の2017年断面(原論文の分析年に対応)で、都道府県別TFRを地域区分で色分けしてランキング表示する。原論文の図2に対応する実再現である。
30 31 32 33 34 35 36 37 38 39 40 41 42 43 | import os, numpy as np, pandas as pd import matplotlib; matplotlib.use('Agg') import matplotlib.pyplot as plt from matplotlib.patches import Patch import statsmodels.api as sm 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' YEAR = 2017 # 原論文の断面年(SSDSE2020B の 2017 年に対応) os.makedirs(FIG_DIR, exist_ok=True) |
print しません。ライブラリの読み込みと、出力先フォルダ・データパス・分析年(2017年)の設定だけを行います。matplotlib.use('Agg') — 画面表示せず図をファイル保存するための設定。YEAR = 2017 — 原論文の断面年。SSDSE2020Bの2017年に対応させ、忠実性を高めています。FIG_DIR/DATA_B — 図の保存先と入力CSVのパス。YEAR に切り出しておくと、あとで別年に切り替えて再現するのが一行で済みます。45 46 47 48 49 50 51 52 53 54 | # ── SSDSE-B の読み込み(1行目=英字コード, 2行目=日本語列名) ── df = pd.read_csv(DATA_B, encoding='cp932', header=0, skiprows=[1]) df = df.rename(columns={'SSDSE-B-2026': '年度', 'Code': '地域コード', 'Prefecture': '都道府県'}) df = df[df['地域コード'].str.match(r'^R\d{5}', na=False)].copy() # 47都道府県のみ df['年度'] = df['年度'].astype(int) # ── 2017年断面(原論文の分析年) ── d = df[df['年度'] == YEAR].copy().reset_index(drop=True) d['合計特殊出生率'] = d['A4103'] # A4103: TFR d['学生数per1000'] = (d['E6301'] + d['E6302']) / d['A1101'] * 1000 # (短大+大学)/総人口×1000 |
print しません。CSVを読み込み、47都道府県・2017年だけを取り出し、TFRと「人口1000人あたり学生数」を計算しています。header=0, skiprows=[1] — SSDSEは1行目が英字コード(A4103等)、2行目が日本語名。英字コードを列名に使い、日本語名の行だけ飛ばします。rename(...) — 先頭3列の SSDSE-B-2026 / Code / Prefecture を 年度 / 地域コード / 都道府県 に読み替え。str.match(r'^R\d{5}') — 地域コードが「R+5桁」の47都道府県行だけを残します。A4103=合計特殊出生率、E6301+E6302=短大+大学の学生数、A1101=総人口。学生数を人口1000人あたりに換算します。A4103=合計特殊出生率 のようにコードと意味の対応を先に控えておくと迷いません。56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 | # 地域区分マップ(8地方 → 6区分) region_map = { '北海道': '北海道・東北', '青森県': '北海道・東北', '岩手県': '北海道・東北', '宮城県': '北海道・東北', '秋田県': '北海道・東北', '山形県': '北海道・東北', '福島県': '北海道・東北', '茨城県': '関東', '栃木県': '関東', '群馬県': '関東', '埼玉県': '関東', '千葉県': '関東', '東京都': '関東', '神奈川県': '関東', '新潟県': '中部', '富山県': '中部', '石川県': '中部', '福井県': '中部', '山梨県': '中部', '長野県': '中部', '岐阜県': '中部', '静岡県': '中部', '愛知県': '中部', '三重県': '近畿', '滋賀県': '近畿', '京都府': '近畿', '大阪府': '近畿', '兵庫県': '近畿', '奈良県': '近畿', '和歌山県': '近畿', '鳥取県': '中国・四国', '島根県': '中国・四国', '岡山県': '中国・四国', '広島県': '中国・四国', '山口県': '中国・四国', '徳島県': '中国・四国', '香川県': '中国・四国', '愛媛県': '中国・四国', '高知県': '中国・四国', '福岡県': '九州・沖縄', '佐賀県': '九州・沖縄', '長崎県': '九州・沖縄', '熊本県': '九州・沖縄', '大分県': '九州・沖縄', '宮崎県': '九州・沖縄', '鹿児島県': '九州・沖縄', '沖縄県': '九州・沖縄' } |
region_map — 都道府県名→地域名の辞書。d['都道府県'].map(region_map) で一括変換。region_colors — 地域→色コードの辞書。棒や点の色をそろえて、地域傾向を目で追えるようにします。Series.map(辞書) は「変換表を当てる」定番。forループなしで全行に一括適用できます。80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 | r = d.sort_values('合計特殊出生率', ascending=True).reset_index(drop=True) mean_tfr = d['合計特殊出生率'].mean() fig1, ax1 = plt.subplots(figsize=(10, 12)) colors_bar = [region_colors[g] for g in r['地域']] ax1.barh(r['都道府県'], r['合計特殊出生率'], color=colors_bar, edgecolor='white', linewidth=0.5) # 京都府を強調 kyoto_pos = r.index[r['都道府県'] == '京都府'][0] ax1.barh('京都府', r.loc[kyoto_pos, '合計特殊出生率'], color='#1a3e72', edgecolor='white') ax1.axvline(mean_tfr, color='black', linestyle='--', linewidth=1.2, alpha=0.7) ax1.text(mean_tfr + 0.01, 1, f'47都道府県\n単純平均 {mean_tfr:.2f}', fontsize=9, va='bottom', ha='left') ax1.set_xlabel('合計特殊出生率(TFR)', fontsize=12) ax1.set_title('都道府県別 合計特殊出生率ランキング(2017年)\n【実再現:SSDSE-B-2026 の 2017 年断面】', fontsize=13, fontweight='bold', pad=12) ax1.set_xlim(1.0, 2.0) ax1.tick_params(axis='y', labelsize=8.5) legend_elements = [Patch(facecolor=v, label=k) for k, v in region_colors.items()] ax1.legend(handles=legend_elements, loc='lower right', fontsize=9, framealpha=0.8) plt.tight_layout() fig1.savefig(os.path.join(FIG_DIR, '2020_U5_4_fig1.png'), bbox_inches='tight') plt.close(fig1) print('[OK] fig1 saved') |
[OK] fig1 saved
sort_values(...) でTFR昇順に並べ、barh で横棒に。色は地域区分。axvline で47府県の単純平均に点線を引きます。set_xlim(1.0, 2.0) — 横軸を1.0〜2.0に固定し、府県間の差を見やすくします。仮説「学生が多い地域はTFRが低い」を、SSDSE-Bだけで直接検証する。人口1000人あたり学生数を説明変数、TFRを目的変数とする単回帰である。これは原論文の表5に対応する分析で、使用データがSSDSEに収録されているため実再現できる。
107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 | X = sm.add_constant(d['学生数per1000']) model = sm.OLS(d['合計特殊出生率'], X).fit() b0, b1 = model.params['const'], model.params['学生数per1000'] fig2, ax2 = plt.subplots(figsize=(9, 7)) for region, grp in d.groupby('地域'): ax2.scatter(grp['学生数per1000'], grp['合計特殊出生率'], color=region_colors[region], label=region, s=60, zorder=3, alpha=0.85) for name in ['京都府', '東京都', '沖縄県']: row = d[d['都道府県'] == name].iloc[0] ax2.annotate(name, xy=(row['学生数per1000'], row['合計特殊出生率']), fontsize=10, fontweight='bold', ha='center', va='bottom', xytext=(0, 6), textcoords='offset points') xline = np.linspace(d['学生数per1000'].min(), d['学生数per1000'].max(), 100) ax2.plot(xline, b0 + b1 * xline, 'k-', linewidth=1.6, alpha=0.75, label=f'回帰線 (係数={b1:.4f}, R²={model.rsquared:.3f})') ax2.set_xlabel('人口1000人あたり学生数(短大+大学)/千人', fontsize=12) ax2.set_ylabel('合計特殊出生率(TFR)', fontsize=12) ax2.set_title('人口あたり学生数と TFR の関係(2017年, 47都道府県)\n【実再現:SSDSE-B-2026】', fontsize=13, fontweight='bold', pad=10) ax2.legend(fontsize=9, loc='upper right', framealpha=0.85, ncol=2) ax2.grid(True, alpha=0.3) plt.tight_layout() fig2.savefig(os.path.join(FIG_DIR, '2020_U5_4_fig2.png'), bbox_inches='tight') |
[OK] fig2 saved
sm.add_constant+sm.OLS(...).fit() で最小二乗単回帰を推定。b1が学生数の係数。b0 + b1*xline で回帰直線を重ね描き。凡例に係数とR²を表示します。原論文の中核。5歳階級別の女性転入超過率(15〜49歳の7変数)を特徴量として、TFRを重回帰する。使用データ(年齢階級別の転入超過数・女性人口)はe-Stat由来でSSDSEに未収録のため、以下は原論文 表4 の報告値である。
| 変数 | 偏回帰係数 | 標準誤差 | t値 | 95%C.I. | VIF |
|---|---|---|---|---|---|
| 切片 | 1.457 ** | 0.011 | 133.482 | 1.435〜1.479 | — |
| 15-19歳 転入超過率 | −0.039 ** | 0.012 | −3.206 | −0.064〜−0.015 | 4.421 |
| 20-24歳 転入超過率 | −0.012 † | 0.007 | −1.656 | −0.027〜0.002 | 6.503 |
| 25-29歳 転入超過率 | −0.003 | 0.021 | −0.120 | −0.044〜0.039 | 3.160 |
| 30-34歳 転入超過率 | 0.116 * | 0.049 | 2.373 | 0.020〜0.213 | 2.805 |
| 35-39歳 転入超過率 | 0.150 † | 0.078 | 1.911 | −0.005〜0.304 | 2.227 |
| 40-44歳 転入超過率 | −0.065 | 0.118 | −0.557 | −0.297〜0.167 | 2.266 |
| 45-49歳 転入超過率 | 0.088 | 0.132 | 0.670 | −0.172〜0.349 | 2.735 |
サンプルサイズ 188(47都道府県 × 4年分)/ R²=0.408、補正R²=0.385、標準誤差=0.106。 † p<0.1 * p<0.05 ** p<0.01
140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 | ages = ['15-19歳', '20-24歳', '25-29歳', '30-34歳', '35-39歳', '40-44歳', '45-49歳'] coef = [-0.039, -0.012, -0.003, 0.116, 0.150, -0.065, 0.088] # 偏回帰係数(報告値) ci_lo = [-0.064, -0.027, -0.044, 0.020, -0.005, -0.297, -0.172] # 95%C.I.下限(報告値) ci_hi = [-0.015, 0.002, 0.039, 0.213, 0.304, 0.167, 0.349] # 95%C.I.上限(報告値) sig = ['**', '†', 'n.s.', '*', '†', 'n.s.', 'n.s.'] y = np.arange(len(ages))[::-1] bar_col = ['#e05c5c' if s in ('*', '**') else '#aaaaaa' for s in sig] fig3, ax3 = plt.subplots(figsize=(8.5, 5.5)) ax3.barh(y, coef, color=bar_col, height=0.55, zorder=3) ax3.errorbar(coef, y, xerr=[np.array(coef) - np.array(ci_lo), np.array(ci_hi) - np.array(coef)], fmt='none', color='black', capsize=4, linewidth=1.4, zorder=4) ax3.axvline(0, color='black', linewidth=1.0) ax3.set_yticks(y); ax3.set_yticklabels(ages, fontsize=11) for yi, c, s in zip(y, coef, sig): ax3.text(c + (0.01 if c >= 0 else -0.01), yi, s, va='center', ha='left' if c >= 0 else 'right', fontsize=11, fontweight='bold', color='#cc0000' if s in ('*', '**') else '#666') ax3.set_xlabel('偏回帰係数 β(TFR への影響)', fontsize=12) ax3.set_title('都道府県別 TFR に係る重回帰の偏回帰係数\n' '【原論文 表4 の報告値の可視化・再計算ではない/R²=0.408, n=188】', fontsize=12, fontweight='bold', pad=10) ax3.grid(True, axis='x', alpha=0.3) legend_items = [Patch(facecolor='#e05c5c', label='p<0.05(有意)'), Patch(facecolor='#aaaaaa', label='†p<0.1 / n.s.')] ax3.legend(handles=legend_items, loc='lower right', fontsize=9) plt.tight_layout() fig3.savefig(os.path.join(FIG_DIR, '2020_U5_4_fig3.png'), bbox_inches='tight') plt.close(fig3) print('[OK] fig3 saved') |
[OK] fig3 saved
coef / ci_lo / ci_hi は原論文 表4 の報告値をそのまま配列に書き写したもの。ここで新たな回帰は行っていません。barh+errorbar で係数と95%信頼区間を横棒+誤差棒に。0の縦線をまたぐ棒は「有意でない」と読めます。同じ特徴量でランダムフォレストを回し、変数重要度を見る。重回帰(線形・係数の符号あり)とは別の角度から「どの年齢の転入超過が効くか」を確認する狙い。こちらも使用データがSSDSE未収録のため、原論文 図6・図7 の報告値である。
175 176 177 178 179 180 181 182 183 184 185 186 187 188 189 190 | imp_pref = [0.697, 0.489, 0.293, 0.490, 0.275, 0.184, 0.254] # 図6(報告値) imp_kyoto = [0.939, 0.469, 1.504, 0.677, 0.551, 0.496, 0.428] # 図7(報告値) x = np.arange(len(ages)); w = 0.4 fig4, ax4 = plt.subplots(figsize=(9.5, 5.5)) ax4.bar(x - w/2, imp_pref, w, label='都道府県別(図6)', color='#1565C0', zorder=3) ax4.bar(x + w/2, imp_kyoto, w, label='京都府 市区町村別(図7)', color='#E65100', zorder=3) ax4.set_xticks(x); ax4.set_xticklabels(ages, fontsize=10) ax4.set_ylabel('変数重要度(Importance)', fontsize=12) ax4.set_title('ランダムフォレストによる年齢階級別 転入超過率の変数重要度\n' '【原論文 図6・図7 の報告値の可視化・再計算ではない】', fontsize=12, fontweight='bold', pad=10) ax4.legend(fontsize=10); ax4.grid(True, axis='y', alpha=0.3) plt.tight_layout() fig4.savefig(os.path.join(FIG_DIR, '2020_U5_4_fig4.png'), bbox_inches='tight') plt.close(fig4) print('[OK] fig4 saved') |
[OK] fig4 saved
imp_pref / imp_kyoto は原論文 図6・図7 の報告値を書き写した配列。ランダムフォレストの学習はここでは行いません(元データが手元にないため)。京都府内の市区町村について、自作のTFR-Bを目的変数、市区町村別の5歳階級別女性転入超過率を特徴量として重回帰する。市区町村別データはe-Stat由来のため、以下は原論文 表6 の報告値である。
| 変数 | 偏回帰係数 | 標準誤差 | t値 | 95%C.I. | VIF |
|---|---|---|---|---|---|
| 切片 | 1.420 ** | 0.017 | 82.780 | 1.386〜1.454 | — |
| 15-19歳 転入超過率 | −0.021 ** | 0.006 | −3.639 | −0.032〜−0.010 | 1.855 |
| 20-24歳 転入超過率 | −0.007 * | 0.003 | −2.425 | −0.014〜−0.001 | 1.940 |
| 25-29歳 転入超過率 | 0.035 ** | 0.005 | 7.189 | 0.026〜0.045 | 1.665 |
| 30-34歳 転入超過率 | 0.020 * | 0.009 | 2.301 | 0.003〜0.037 | 2.102 |
| 35-39歳 転入超過率 | −0.002 | 0.014 | −0.117 | −0.030〜0.026 | 1.774 |
| 40-44歳 転入超過率 | −0.026 | 0.018 | −1.438 | −0.061〜0.010 | 1.213 |
| 45-49歳 転入超過率 | 0.009 | 0.024 | 0.377 | −0.038〜0.056 | 1.368 |
サンプルサイズ 128(32市区町村 × 4年分)/ R²=0.581、補正R²=0.557、標準誤差=0.152。 * p<0.05 ** p<0.01。 ※TFRの標準誤差が0.1以上の「笠置町」「和束町」「南山城村」「伊根町」は外れ値として除外。
195 196 197 198 199 200 201 202 203 204 205 206 207 208 209 210 211 212 | print('\n=== 図1・図2の基礎統計(2017年, SSDSE-B, 実再現) ===') print(f'47都道府県 単純平均TFR: {mean_tfr:.3f}') low5 = r[['都道府県', '合計特殊出生率']].head(5).to_string(index=False) print('TFRが低い5府県:\n' + low5) kr = r.reset_index(drop=True) kyoto_rank = kr.index[kr['都道府県'] == '京都府'][0] + 1 print(f'京都府: TFR={d.loc[d["都道府県"]=="京都府","合計特殊出生率"].iloc[0]:.2f}, ' f'低い方から {kyoto_rank}/47 位') print(f'最高: 沖縄県 {d["合計特殊出生率"].max():.2f} / 最低: 東京都 {d["合計特殊出生率"].min():.2f}') print('\n=== 図2:人口1000人あたり学生数 → TFR 単回帰(実再現) ===') print(f'切片 : {b0:.3f}') print(f'回帰係数(学生数): {b1:.4f} (t={model.tvalues["学生数per1000"]:.3f}, ' f'p={model.pvalues["学生数per1000"]:.4f})') print(f'決定係数 R² : {model.rsquared:.3f} (補正 R²={model.rsquared_adj:.3f}, n={int(model.nobs)})') print('→ 学生数が多い府県ほど TFR が低い、という原論文の指摘(表5)が符号・有意性・R²の水準で再現された。') print(' (原論文 表5 の報告値: 回帰係数 -0.147**, R²=0.200, n=47。' '係数の絶対値は変数スケール・データ版の違いで異なる。)') |
[OK] fig1 saved [OK] fig2 saved [OK] fig3 saved [OK] fig4 saved === 図1・図2の基礎統計(2017年, SSDSE-B, 実再現) === 47都道府県 単純平均TFR: 1.513 TFRが低い5府県: 都道府県 合計特殊出生率 東京都 1.21 北海道 1.29 宮城県 1.31 京都府 1.31 奈良県 1.33 京都府: TFR=1.31, 低い方から 4/47 位 最高: 沖縄県 1.94 / 最低: 東京都 1.21 === 図2:人口1000人あたり学生数 → TFR 単回帰(実再現) === 切片 : 1.627 回帰係数(学生数): -0.0071 (t=-3.531, p=0.0010) 決定係数 R² : 0.217 (補正 R²=0.200, n=47) → 学生数が多い府県ほど TFR が低い、という原論文の指摘(表5)が符号・有意性・R²の水準で再現された。 (原論文 表5 の報告値: 回帰係数 -0.147**, R²=0.200, n=47。係数の絶対値は変数スケール・データ版の違いで異なる。)
都道府県別・市区町村別の両方で、共通して15-19歳と30-34歳の女性転入超過率が5%水準で有意だった。15-19歳(進学期)の転入超過はTFRを薄め、30-34歳(出産コア年齢)の転入超過はTFRを押し上げる。
本ページの【実再現】部分(図1・図2)は、以下のスクリプトとSSDSE-Bで再現できます。
🐍 再現コード(2020_U5_4_shorei.py) 📊 SSDSE-B-2026.csv
※図3・図4は原論文(表4・図6・図7)の報告値を可視化したもので、再計算ではありません。年齢階級別の転入超過データはe-Statから別途取得が必要です。
この研究を読み解くうえで、つまずきやすいポイントを整理します。
この記事に出てくる主要用語をまとめます。
本研究で使われた手法と、使うときの注意点を手法別に整理します。
この研究をさらに広げる方向性を挙げます。
SSDSE-Bだけでできる練習問題です(【実再現】の範囲)。
YEAR = 2017 を 2023 などに変え、図1を作り直そう。京都府の順位は変わる?skiprows=[1] で日本語名の行を飛ばして読み込みます。この研究の考え方が生きる場面。
読者が抱きやすい疑問に答えます。
この論文を理解できたか、クリックで確認しましょう。間違えても解説が出ます。
このページの分析は、この画面の中でそのまま実行できます。
Python をインストールする必要も、CSV をダウンロードする必要もありません。
下のセルの 「▶ ブラウザで実行」 を上から順に押すか、
「▶ 最初から全部実行」 で一気に流してください。
表示されるのは、本文の図表とまったく同じ計算の結果です
(動かしているのは再現スクリプト code/2020_U5_4_shorei.py そのもの)。
コードは書き換えられます。「✏️ 書き換える」で数字や変数を変えて ▶ を押すと、 結果がどう変わるかをその場で確かめられます(元に戻すボタンつき)。 ページを開いた時点で裏で実行環境の準備が始まっているので、待ち時間はほとんどありません。 初回だけ実行環境の取得にインターネット接続が必要です。