このページの分析を自分で再現するには、以下の手順でデータを準備してください。コードの編集は不要です。
data/raw/ フォルダに入れます。html/figures/ に自動保存されます。
日本の合計特殊出生率(TFR)は、人口を維持するために必要な「人口置換水準」2.07を大きく下回り続けている。2022年の全国平均TFRは 1.358、東京都は 1.04 という記録的な低水準に達している。少子化は単なる人口問題にとどまらず、労働力不足・社会保障制度の持続性・地域経済の衰退など、日本社会全体に多面的な影響を及ぼしている。
まず「少子化と女性就業・育児支援の関係都道府県パネルデータ分析」を統計的にとらえることが有効だと考えられる。 その理由は感覚や経験則だけでは、複雑な社会要因の中で「何が本当に効いているか」を見極めにくいからである。 本研究では公開データと統計手法を組み合わせ、この問いに定量的な答えを出すことを目指す。
都道府県パネル SSDSE-B 相関分析 重回帰分析 時系列比較
統計数理研究所が公開する SSDSE-B-2026(都道府県データ)を使用。47都道府県 × 12年度(2012〜2023年)= 最大564件のパネルデータから、断面分析には2022年度データ(N=47)を使用する。
| 種類 | 変数名 | 計算方法 | 理論的予測 |
|---|---|---|---|
| 目的変数 | 合計特殊出生率(TFR) | SSDSE-B収録値 | — |
| 育児支援 | 保育定員率 | 保育所等定員数 ÷ 15歳未満人口 × 100 | 正(+): 保育が充実するほど子育てしやすい |
| 保育所数 / 千人 | 保育所等数 ÷ 15歳未満人口 × 1000 | 正(+): 施設数が多いほど利便性が高い | |
| 就業環境 | 就職率(一般) | 就職件数(一般)÷ 総人口 × 10000 | 正(+): 就職機会が多い地域は定住しやすい |
| 高齢化 | 高齢化率 | 65歳以上人口 ÷ 総人口 × 100 | 負(−): 高齢化が進んだ地域は若い世代が少ない |
| 所得・生活水準 | 消費支出(万円) | 二人以上の世帯の消費支出(月額) | 負(−): 生活コストが高い都市部でTFRが低い |
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 | print('\n===== 分析結果サマリー =====') print(f'2022年 TFR 平均: {df22["合計特殊出生率"].mean():.3f}') print(f'2022年 TFR 最小: {df22["合計特殊出生率"].min():.2f}' f' ({df22.loc[df22["合計特殊出生率"].idxmin(), "都道府県"]})') print(f'2022年 TFR 最大: {df22["合計特殊出生率"].max():.2f}' f' ({df22.loc[df22["合計特殊出生率"].idxmax(), "都道府県"]})') print(f'\n保育定員率 vs TFR: r={r_val2:.3f}, p={p_val2:.4f}') sub_c = df22[['保育所数_千人','合計特殊出生率']].dropna() r_n, p_n = stats.pearsonr(sub_c['保育所数_千人'], sub_c['合計特殊出生率']) print(f'保育所数/千人 vs TFR: r={r_n:.3f}, p={p_n:.4f}') sub_e = df22[['就職率','合計特殊出生率']].dropna() r_e, p_e = stats.pearsonr(sub_e['就職率'], sub_e['合計特殊出生率']) print(f'就職率 vs TFR: r={r_e:.3f}, p={p_e:.4f}') print() print('--- 重回帰分析 (標準化) ---') print(f'R-squared: {model.rsquared:.4f}') print(f'Adjusted R-squared: {model.rsquared_adj:.4f}') for var, coef, pv in zip(X_vars, model.params[1:], model.pvalues[1:]): star = '***' if pv < 0.001 else ('**' if pv < 0.01 else ('*' if pv < 0.05 else 'n.s.')) print(f' {var}: beta={coef:.3f}, p={pv:.4f} {star}') print() print('--- 地域別TFR 2022 ---') for reg in region_order: sub = df22[df22['地域区分'] == reg] print(f' {reg}: {sub["合計特殊出生率"].mean():.3f}') tfr2012 = df_b[df_b['年度'] == 2012]['合計特殊出生率'].mean() tfr2022 = df_b[df_b['年度'] == 2022]['合計特殊出生率'].mean() print(f'\n全国平均 TFR 2012: {tfr2012:.3f}') print(f'全国平均 TFR 2022: {tfr2022:.3f}') print(f'変化: {tfr2022 - tfr2012:+.3f}') print() print('--- 上位・下位5都道府県 保育定員率 ---') top5 = df22.nlargest(5, '保育定員率')[['都道府県','保育定員率','合計特殊出生率']] bot5 = df22.nsmallest(5, '保育定員率')[['都道府県','保育定員率','合計特殊出生率']] print('保育定員率 高い:') print(top5.to_string(index=False)) print('保育定員率 低い:') print(bot5.to_string(index=False)) |
===== 分析結果サマリー ===== 2022年 TFR 平均: 1.358 2022年 TFR 最小: 1.04 (東京都) 2022年 TFR 最大: 1.70 (沖縄県) 保育定員率 vs TFR: r=0.415, p=0.0037 保育所数/千人 vs TFR: r=0.378, p=0.0089 就職率 vs TFR: r=0.470, p=0.0009 --- 重回帰分析 (標準化) --- R-squared: 0.3215 Adjusted R-squared: 0.2388 保育定員率: beta=0.365, p=0.1015 n.s. 保育所数/千人: beta=-0.322, p=0.2442 n.s. 就職率: beta=0.712, p=0.0183 * 高齢化率: beta=-0.367, p=0.0845 n.s. 消費支出(万円): beta=-0.120, p=0.4425 n.s. --- 地域別TFR 2022 --- 北海道・東北: 1.204 関東: 1.199 中部: 1.387 近畿: 1.311 中国・四国: 1.450 九州・沖縄: 1.539 全国平均 TFR 2012: 1.460 全国平均 TFR 2022: 1.358 変化: -0.102 --- 上位・下位5都道府県 保育定員率 --- 保育定員率 高い: 都道府県 保育定員率 合計特殊出生率 高知県 35.926389 1.36 福井県 31.592391 1.50 新潟県 30.645957 1.27 秋田県 29.770930 1.18 鳥取県 29.710606 1.60 保育定員率 低い: 都道府県 保育定員率 合計特殊出生率 埼玉県 15.497285 1.17 神奈川県 16.158025 1.17 北海道 16.654340 1.12 千葉県 16.716457 1.18 兵庫県 16.908851 1.31
stats.pearsonr(x, y) — Pearson相関係数 r と p値を同時に返します。r, p = stats.pearsonr(...) — Pythonは複数戻り値を同時に受け取れる(タプルアンパック)。6地域ブロック別に合計特殊出生率の平均値を計算し、2012〜2023年の推移を比較した。すべての地域で人口置換水準(2.07)を大幅に下回っており、2015〜2016年頃の局所的な上昇後、2020年以降は再び下降傾向が顕著である。
| 地域 | 平均TFR(2022年) | 特徴 |
|---|---|---|
| 九州・沖縄 | 1.539 | 全国最高。沖縄(1.70)が突出して高い |
| 中国・四国 | 1.450 | 地方部の農村・漁村地域が多く比較的高い |
| 中部 | 1.387 | 製造業中心の雇用基盤が安定 |
| 近畿 | 1.311 | 大阪(1.22)・京都(1.18)の大都市が引き下げ |
| 北海道・東北 | 1.204 | 農村型だが北海道(1.12)・宮城(1.09)が低水準 |
| 関東 | 1.199 | 全国最低。東京(1.04)が全国最低値 |
複数の都道府県を地域ブロックに分類し、グループ別の平均を時系列で可視化することで、個別の変動ノイズを除去してトレンドが読み取りやすくなる。
45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 | import os import numpy as np import pandas as pd import matplotlib matplotlib.use('Agg') import matplotlib.pyplot as plt import statsmodels.api as sm from scipy import stats 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) |
print はしません。データや図が裏で更新されただけ。次のステップへ進みましょう。import pandas as pd など — 必要なライブラリをまとめて呼び出します。as pd は短い別名(alias)。matplotlib.use('Agg') — グラフを画面表示せずファイルに保存するためのおまじない。plt.rcParams['font.family'] — グラフの日本語表示用フォント指定(Macは Hiragino Sans、Windowsなら Yu Gothic 等)。os.makedirs('html/figures', exist_ok=True) — 図の保存先フォルダを作る(既にあってもOK)。f"...{x}..." はf-string。文字列の中に {変数} と書くだけで埋め込めて、{x:.2f} のように書式も指定できます。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 | # ── データ読み込み ────────────────────────────────────────────────────────── df_b = pd.read_csv(DATA_B, encoding='cp932', header=1) df_b = df_b[df_b['地域コード'].str.match(r'^R\d{5}', na=False)].copy() df_b['年度'] = df_b['年度'].astype(int) # ── 地域マップ ─────────────────────────────────────────────────────────────── region_map = { '北海道': '北海道・東北', '青森県': '北海道・東北', '岩手県': '北海道・東北', '宮城県': '北海道・東北', '秋田県': '北海道・東北', '山形県': '北海道・東北', '福島県': '北海道・東北', '茨城県': '関東', '栃木県': '関東', '群馬県': '関東', '埼玉県': '関東', '千葉県': '関東', '東京都': '関東', '神奈川県': '関東', '新潟県': '中部', '富山県': '中部', '石川県': '中部', '福井県': '中部', '山梨県': '中部', '長野県': '中部', '岐阜県': '中部', '静岡県': '中部', '愛知県': '中部', '三重県': '近畿', '滋賀県': '近畿', '京都府': '近畿', '大阪府': '近畿', '兵庫県': '近畿', '奈良県': '近畿', '和歌山県': '近畿', '鳥取県': '中国・四国', '島根県': '中国・四国', '岡山県': '中国・四国', '広島県': '中国・四国', '山口県': '中国・四国', '徳島県': '中国・四国', '香川県': '中国・四国', '愛媛県': '中国・四国', '高知県': '中国・四国', '福岡県': '九州・沖縄', '佐賀県': '九州・沖縄', '長崎県': '九州・沖縄', '熊本県': '九州・沖縄', '大分県': '九州・沖縄', '宮崎県': '九州・沖縄', '鹿児島県': '九州・沖縄', '沖縄県': '九州・沖縄' } region_colors = { '北海道・東北': '#4e9af1', '関東': '#e05c5c', '中部': '#f0a500', '近畿': '#5cb85c', '中国・四国': '#9b59b6', '九州・沖縄': '#f39c12' } region_order = ['北海道・東北', '関東', '中部', '近畿', '中国・四国', '九州・沖縄'] |
print はしません。データや図が裏で更新されただけ。次のステップへ進みましょう。pd.read_csv(...) でCSVを読み込みます。encoding='cp932' は日本語Windows由来の文字コード、header=1 は「2行目を列名として使う」。df['地域コード'].str.match(r'^R\d{5}', ...) — 正規表現で「R+数字5桁」の行(47都道府県)だけTrueにし、真偽値で行をフィルタ。.astype(int) — 列を整数に変換(年度などを数値比較するため)。df['A'] / df['B'] — pandasの列同士の四則演算は要素ごと(element-wise)。forループ不要なのが強み。88 89 90 91 92 93 94 | # ── 派生変数作成(全年度)─────────────────────────────────────────────────── df_b['地域区分'] = df_b['都道府県'].map(region_map) df_b['婚姻率'] = df_b['婚姻件数'] / df_b['総人口'] * 1000 df_b['保育所数_千人'] = df_b['保育所等数'] / df_b['15歳未満人口'] * 1000 df_b['保育定員率'] = df_b['保育所等定員数'] / df_b['15歳未満人口'] * 100 df_b['高齢化率'] = df_b['65歳以上人口'] / df_b['総人口'] * 100 df_b['就職率'] = df_b['就職件数(一般)'] / df_b['総人口'] * 10000 |
print はしません。データや図が裏で更新されただけ。次のステップへ進みましょう。.map() は「1対1の置き換え」、.apply() は「関数を当てる」。辞書なら .map()、ロジックなら .apply()。95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 | # ── 2022年断面データ ───────────────────────────────────────────────────────── df22 = df_b[df_b['年度'] == 2022].copy() fig1, ax1 = plt.subplots(figsize=(10, 6)) for reg in region_order: sub = df_b[df_b['地域区分'] == reg].groupby('年度')['合計特殊出生率'].mean() ax1.plot(sub.index, sub.values, color=region_colors[reg], marker='o', markersize=4, linewidth=2, label=reg) ax1.axhline(2.07, color='gray', linestyle='--', linewidth=1.2, label='人口置換水準(2.07)') ax1.set_xlabel('年度', fontsize=12) ax1.set_ylabel('合計特殊出生率(TFR)', fontsize=12) ax1.set_title('地域別 合計特殊出生率の推移(2012〜2023年)', fontsize=14, fontweight='bold') ax1.set_xticks(range(2012, 2024)) ax1.tick_params(axis='x', rotation=45) ax1.legend(fontsize=10, loc='upper right') ax1.set_ylim(0.9, 2.3) ax1.grid(axis='y', alpha=0.3) fig1.tight_layout() fig1.savefig(os.path.join(FIG_DIR, '2021_H5_2_fig1.png')) plt.close(fig1) print('fig1 saved') |
fig1 saved
df.groupby('列').apply(関数) — グループごとに関数を適用。時系列や地域別の集計でよく使います。fig, ax = plt.subplots(...) — 図全体(fig)と軸(ax)を作る定番。以降は ax.bar(...) 等で操作。ax.axhline / ax.axvline — 水平/垂直の点線。平均線や基準線として定番。[式 for x in リスト] はリスト内包表記。forループでappendする代わりに1行でリストを作れます。2022年断面データ(N=47都道府県)を用いて、合計特殊出生率(TFR)を目的変数とする重回帰分析を実施した。説明変数を標準化(平均0・標準偏差1)して標準化偏回帰係数(β係数)を比較することで、各変数の相対的な影響力を評価できる。
| 変数 | β係数 | p値 | 有意性 | 解釈 |
|---|---|---|---|---|
| 就職率(一般) | 0.712 | 0.018 | * | 就職機会が多いほどTFRが高い傾向(最大の効果) |
| 保育定員率 | 0.365 | 0.101 | n.s. | 正の関連。単変量では有意(r=0.415**) |
| 高齢化率 | −0.367 | 0.085 | n.s. | 高齢化とTFRの負の関係(多重共線性の影響あり) |
| 保育所数/千人 | −0.322 | 0.244 | n.s. | 保育定員率との相関が高く(多重共線性)係数が不安定 |
| 消費支出(万円) | −0.120 | 0.443 | n.s. | 大都市の高コストが出生率低下と関連 |
| R² = 0.322 | 自由度調整済みR² = 0.239 | |||
説明変数の単位が異なる場合(率・件数・万円など)、そのままの回帰係数(b)では「どの変数が最も影響力が強いか」を比較できない。全変数を標準化(z スコア変換)してから回帰を実施すると、β係数の絶対値が大きいほど相対的な影響力が大きいと解釈できる。
120 121 122 123 124 125 126 127 128 129 130 131 | fig2, ax2 = plt.subplots(figsize=(10, 8)) for reg in region_order: sub = df22[df22['地域区分'] == reg] ax2.scatter(sub['保育定員率'], sub['合計特殊出生率'], color=region_colors[reg], s=65, zorder=3, label=reg, alpha=0.85) for _, row in sub.iterrows(): pref = row['都道府県'].replace('県', '').replace('府', '').replace('都', '').replace('道', '') ax2.annotate(pref, (row['保育定員率'], row['合計特殊出生率']), fontsize=7.5, ha='left', va='bottom', xytext=(2, 2), textcoords='offset points', color='#444') |
print はしません。データや図が裏で更新されただけ。次のステップへ進みましょう。fig, ax = plt.subplots(...) — 図全体(fig)と軸(ax)を作る定番。以降は ax.bar(...) 等で操作。for _, row in df.iterrows() — DataFrameを1行ずつ取り出すループ。1点ずつ描画したいときに使用。df['A'] / df['B'] — pandasの列同士の四則演算は要素ごと(element-wise)。forループ不要なのが強み。132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 | # 回帰直線 sub_clean = df22[['保育定員率', '合計特殊出生率']].dropna() x_vals = sub_clean['保育定員率'].values y_vals = sub_clean['合計特殊出生率'].values slope, intercept, r_val2, p_val2, _ = stats.linregress(x_vals, y_vals) x_range = np.linspace(x_vals.min(), x_vals.max(), 100) label_r = f'回帰線 (r={r_val2:.3f}, p<0.01)' if p_val2 < 0.01 else f'回帰線 (r={r_val2:.3f}, p={p_val2:.3f})' ax2.plot(x_range, intercept + slope * x_range, color='#333', linewidth=1.5, linestyle='-', zorder=2, label=label_r) ax2.set_xlabel('保育定員率(保育所等定員数 / 15歳未満人口 × 100)', fontsize=11) ax2.set_ylabel('合計特殊出生率(TFR)', fontsize=12) ax2.set_title('保育定員率と合計特殊出生率の関係(2022年、47都道府県)', fontsize=13, fontweight='bold') ax2.legend(fontsize=9, loc='upper left') ax2.grid(alpha=0.25) fig2.tight_layout() fig2.savefig(os.path.join(FIG_DIR, '2021_H5_2_fig2.png')) plt.close(fig2) print('fig2 saved') |
fig2 saved
stats.linregress(x, y) — 単回帰の傾き・切片・r値・p値・標準誤差を返します。使わない値は _ で受け取り。.map() は「1対1の置き換え」、.apply() は「関数を当てる」。辞書なら .map()、ロジックなら .apply()。単変量の相関分析では、保育定員率(r=0.415、p=0.004)・保育所数/千人(r=0.378、p=0.009)・就職率(r=0.470、p=0.001)のいずれもTFRと有意な正の相関を示した。育児支援の充実と就業機会の豊富さが、少子化に対してプラスに働いていることが示唆される。
| 変数 | r(相関係数) | p値 | 有意性 |
|---|---|---|---|
| 就職率(一般) | 0.470 | 0.0009 | *** |
| 保育定員率 | 0.415 | 0.0037 | ** |
| 保育所数/千人 | 0.378 | 0.0089 | ** |
| 消費支出(万円) | −0.336 | 0.0211 | * |
| 高齢化率 | 0.227 | 0.1252 | n.s. |
| 都道府県 | 保育定員率(%) | TFR(2022年) | 区分 |
|---|---|---|---|
| 高知県 | 35.9 | 1.36 | 高い(1位) |
| 福井県 | 31.6 | 1.50 | 高い(2位) |
| 鳥取県 | 29.7 | 1.60 | 高い(5位) |
| 埼玉県 | 15.5 | 1.17 | 低い(43位) |
| 神奈川県 | 16.2 | 1.17 | 低い(44位) |
| 北海道 | 16.7 | 1.12 | 低い(45位) |
N=47では、|r|≥0.29程度でp<0.05となる。相関係数の大きさはCohenの基準(小:0.1、中:0.3、大:0.5)で解釈する。統計的有意性だけでなく効果量(effect size)も報告することが重要。
152 153 154 155 156 157 158 159 160 161 162 | vars_corr = { '合計特殊出生率': df22['合計特殊出生率'], '保育定員率': df22['保育定員率'], '保育所数/千人': df22['保育所数_千人'], '就職率': df22['就職率'], '高齢化率': df22['高齢化率'], '消費支出(万円)': df22['消費支出(二人以上の世帯)'] / 10000, } df_corr = pd.DataFrame(vars_corr).dropna() corr_mat = df_corr.corr() n_var = len(corr_mat) |
print はしません。データや図が裏で更新されただけ。次のステップへ進みましょう。.map() は「1対1の置き換え」、.apply() は「関数を当てる」。辞書なら .map()、ロジックなら .apply()。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 | # p値行列 pval_mat = pd.DataFrame(np.ones((n_var, n_var)), index=corr_mat.index, columns=corr_mat.columns) for i, c1 in enumerate(df_corr.columns): for j, c2 in enumerate(df_corr.columns): if i != j: _, p = stats.pearsonr(df_corr[c1], df_corr[c2]) pval_mat.iloc[i, j] = p fig3, ax3 = plt.subplots(figsize=(8, 7)) cmap = plt.cm.RdBu_r im = ax3.imshow(corr_mat.values, cmap=cmap, vmin=-1, vmax=1, aspect='auto') plt.colorbar(im, ax=ax3, shrink=0.8, label='Pearson r') ax3.set_xticks(range(n_var)) ax3.set_yticks(range(n_var)) ax3.set_xticklabels(corr_mat.columns, rotation=30, ha='right', fontsize=10) ax3.set_yticklabels(corr_mat.index, fontsize=10) for i in range(n_var): for j in range(n_var): r = corr_mat.iloc[i, j] p = pval_mat.iloc[i, j] star = '***' if p < 0.001 else ('**' if p < 0.01 else ('*' if p < 0.05 else '')) txt = f'{r:.2f}{star}' color = 'white' if abs(r) > 0.5 else 'black' ax3.text(j, i, txt, ha='center', va='center', fontsize=9, color=color) ax3.set_title('相関行列(2022年断面、N=47)\n*** p<0.001 ** p<0.01 * p<0.05', fontsize=12, fontweight='bold') fig3.tight_layout() fig3.savefig(os.path.join(FIG_DIR, '2021_H5_2_fig3.png')) plt.close(fig3) print('fig3 saved') |
fig3 saved
fig, ax = plt.subplots(...) — 図全体(fig)と軸(ax)を作る定番。以降は ax.bar(...) 等で操作。stats.pearsonr(x, y) — Pearson相関係数 r と p値を同時に返します。[式 for x in リスト] はリスト内包表記。forループでappendする代わりに1行でリストを作れます。本分析の結果を踏まえ、少子化対策として以下の3点が統計的に支持される。
本分析で示されたのは「相関関係」であり、「因果関係」ではない。保育所が多い地域でTFRが高いのは、「保育所が出生率を上げた」のか「もともと子育て世代が多い地域に保育所が整備された」のか(逆因果)、あるいは「地域の豊かさ」という第三変数が両者に影響しているのか(交絡変数)の区別が必要。
より強い因果推論には、固定効果モデル(パネルデータ分析)や操作変数法などの手法が用いられる。本分析はあくまで「関連の確認」と「仮説形成」の段階にある。
197 198 199 200 201 202 203 204 205 206 207 208 209 210 | X_vars = ['保育定員率', '保育所数/千人', '就職率', '高齢化率', '消費支出(万円)'] df_ols = df_corr[['合計特殊出生率'] + X_vars].dropna().copy() df_std = (df_ols - df_ols.mean()) / df_ols.std() y_std = df_std['合計特殊出生率'].values X_std = sm.add_constant(df_std[X_vars].values) model = sm.OLS(y_std, X_std).fit() coefs = np.array(model.params[1:]) # 定数除く pvals = np.array(model.pvalues[1:]) conf_arr = model.conf_int() if hasattr(conf_arr, 'values'): conf_arr = conf_arr.values conf = conf_arr[1:] # shape (n_var, 2) |
print はしません。データや図が裏で更新されただけ。次のステップへ進みましょう。sm.add_constant(X) — 切片項(定数1の列)を先頭に追加。statsmodelsで必須。sm.OLS(y, X).fit() — 最小二乗法でモデルを推定。model.params, model.pvalues, model.conf_int() で結果取得。[式 for x in リスト] はリスト内包表記。forループでappendする代わりに1行でリストを作れます。211 212 213 214 215 216 217 218 219 220 221 | # ソート(係数の絶対値で昇順) order = np.argsort(np.abs(coefs)) coefs_s = coefs[order] pvals_s = pvals[order] conf_s = conf[order] labels_s = [X_vars[i] for i in order] colors_s = ['#e05c5c' if p < 0.05 else '#aaaaaa' for p in pvals_s] fig4, ax4 = plt.subplots(figsize=(8, 5)) y_pos = np.arange(len(labels_s)) ax4.barh(y_pos, coefs_s, color=colors_s, edgecolor='white', height=0.55) |
print はしません。データや図が裏で更新されただけ。次のステップへ進みましょう。fig, ax = plt.subplots(...) — 図全体(fig)と軸(ax)を作る定番。以降は ax.bar(...) 等で操作。r, p = stats.pearsonr(...) — Pythonは複数戻り値を同時に受け取れる(タプルアンパック)。222 223 224 225 226 227 228 229 230 231 232 233 | # 信頼区間(エラーバー) for i, (ci_lo, ci_hi) in enumerate(zip(conf_s[:, 0], conf_s[:, 1])): ax4.plot([ci_lo, ci_hi], [i, i], color='#555', linewidth=2.5) ax4.plot([ci_lo], [i], marker='|', color='#555', markersize=8) ax4.plot([ci_hi], [i], marker='|', color='#555', markersize=8) ax4.axvline(0, color='black', linewidth=0.8) ax4.set_yticks(y_pos) ax4.set_yticklabels(labels_s, fontsize=11) ax4.set_xlabel('標準化偏回帰係数 (beta)', fontsize=12) ax4.set_title('重回帰分析:標準化偏回帰係数(2022年断面、N=47)\n' '赤=p<0.05(有意)、灰色=p>=0.05(非有意)', fontsize=11, fontweight='bold') |
print はしません。データや図が裏で更新されただけ。次のステップへ進みましょう。ax.axhline / ax.axvline — 水平/垂直の点線。平均線や基準線として定番。x if cond else y は三項演算子。リスト内包表記と組み合わせると、forとifを1行で書けます。234 235 236 237 238 239 240 241 242 243 244 245 | # p値テキスト for i, (c, p) in enumerate(zip(coefs_s, pvals_s)): star = '***' if p < 0.001 else ('**' if p < 0.01 else ('*' if p < 0.05 else 'n.s.')) offset = 0.015 if c >= 0 else -0.015 ha = 'left' if c >= 0 else 'right' ax4.text(c + offset, i, star, ha=ha, va='center', fontsize=10) ax4.grid(axis='x', alpha=0.25) fig4.tight_layout() fig4.savefig(os.path.join(FIG_DIR, '2021_H5_2_fig4.png')) plt.close(fig4) print('fig4 saved') |
fig4 saved
df[col](1列)と df[[col1, col2]](複数列)でカッコの数が違います。リストを渡していると覚えるとミスを減らせます。SSDSE-B(47都道府県・2012〜2023年)を用いた統計分析の結果、以下が明らかになった:
| データ | 出典 | 備考 |
|---|---|---|
| SSDSE-B-2026(都道府県データ) | 統計数理研究所 SSDSE(社会・人口統計体系) | 47都道府県 × 2012〜2023年度 |
| 合計特殊出生率 | 厚生労働省 人口動態統計(SSDSE-B収録) | 都道府県別 |
| 保育所等数・定員 | 厚生労働省 保育所等関連状況取りまとめ(SSDSE-B収録) | 各年4月1日時点 |
本教育用コードは実公的データ(SSDSE-B-2026.csv)のみを使用。合成データ・乱数は一切使用していません。
統計分析の解釈で初心者がやりがちな勘違いをまとめます。特に「相関と因果の混同」「p値の過信」は研究現場でもよく起きる落とし穴です。本文を読む前にも、読んだ後にも、目を通してみてください。
統計の基本用語を初心者向けに解説します。本文中で見慣れない言葉が出てきたら、ここに戻って確認してください。
統計手法について「何のためか」「結果をどう読むか」を初心者向けに解説します。
この研究をさらに発展させるための3つの方向性を示します。「今回わかったこと(X)」から「次に検証すべき仮説(Y)」を立て、「具体的に何をするか(Z)」まで考えてみましょう。
学んだだけでは身につきません。実際に手を動かすのが最強の学習方法です。本論文のスクリプトをベースに、以下のチャレンジに挑戦してみてください。難易度別に5つ用意しました。
本論文で学んだ手法は、研究の世界だけでなく、行政・企業・NPO の現場でも様々に活用されています。具体的なシーンを紹介します。
この論文を読んで初心者が抱きやすい疑問に、教育的観点から答えます。