このページの分析を自分で再現するには、以下の手順でデータを準備してください。コードの編集は不要です。
data/raw/ フォルダに入れます。html/figures/ に自動保存されます。
日本では長年にわたり、地方から大都市圏への人口流出が続いており、農山村部を中心に「過疎化」が深刻な問題となっている。2020年の国勢調査でも東京圏への一極集中は継続しており、地方の活力低下・コミュニティ崩壊が懸念されている。
まず「過疎化・人口流出の要因と地域活性化策の分析」を統計的にとらえることが有効だと考えられる。 その理由は感覚や経験則だけでは、複雑な社会要因の中で「何が本当に効いているか」を見極めにくいからである。 本研究では公開データと統計手法を組み合わせ、この問いに定量的な答えを出すことを目指す。
SSDSE-B 時系列分析 重回帰分析 相関分析 地域比較
SSDSE(社会・人口統計体系データセット)-B(2026年版)を使用した。都道府県レベルの統計データが2012〜2023年の12年間分収録されており、地域コードが R&#x...ÿ のパターンに合致する47都道府県を分析対象とした。
| 項目 | 内容 |
|---|---|
| データソース | SSDSE-B-2026.csv(統計数理研究所) |
| 分析対象 | 47都道府県 |
| 対象期間 | 2012〜2023年(12年間) |
| 断面分析年 | 2022年(重回帰分析) |
| 変数の種類 | 変数名 | 計算方法 | 役割 |
|---|---|---|---|
| 目的変数 (人口移動指標) |
純移動率 | (転入者数 − 転出者数)÷ 総人口 × 100 | 主要目的変数 |
| 転出率 | 転出者数 ÷ 総人口 × 100 | 参考指標 | |
| 転入率 | 転入者数 ÷ 総人口 × 100 | 参考指標 | |
| 説明変数 (流出要因) |
求人倍率 | 月間有効求人数 ÷ 月間有効求職者数 | 雇用機会の代理 |
| 消費支出(万円) | 二人以上の世帯の消費支出 | 所得水準の代理 | |
| 高齢化率 | 65歳以上人口 ÷ 総人口 × 100 | 高齢化の程度 | |
| 大学進学率 | 高校卒業者のうち進学者数 ÷ 高校卒業者数 × 100 | 若者の転出圧力 |
SSDSE-Bの全期間データ(2012〜2023年)を用いて、地域ブロック別の純移動率の推移を分析した。純移動率は「転入者数から転出者数を差し引いた値を総人口で割った割合」であり、プラスなら転入超過、マイナスなら転出超過を意味する。
転出者数の絶対値は人口規模が大きい都市部で大きくなるため、地域間の比較には不適切。純移動率(転入 − 転出)÷ 総人口 × 100 を使うことで、人口規模の異なる都道府県を同じ基準で比較できる。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 | 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} のように書式も指定できます。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 | # ── データ読み込み ────────────────────────────────────────────────────────── 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' } |
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ループ不要なのが強み。43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 | # ── 変数の計算 ─────────────────────────────────────────────────────────────── df_b['地域区分'] = df_b['都道府県'].map(region_map) df_b['純移動率'] = ( (df_b['転入者数(日本人移動者)'] - df_b['転出者数(日本人移動者)']) / df_b['総人口'] * 100 ) df_b['転出率'] = df_b['転出者数(日本人移動者)'] / df_b['総人口'] * 100 df_b['転入率'] = df_b['転入者数(日本人移動者)'] / df_b['総人口'] * 100 df_b['高齢化率'] = df_b['65歳以上人口'] / df_b['総人口'] * 100 df_b['求人倍率'] = df_b['月間有効求人数(一般)'] / df_b['月間有効求職者数(一般)'] df_b['消費支出万円'] = df_b['消費支出(二人以上の世帯)'] / 10000 df_b['大学進学率'] = ( df_b['高等学校卒業者のうち進学者数'] / df_b['高等学校卒業者数'] * 100 ) |
print はしません。データや図が裏で更新されただけ。次のステップへ進みましょう。.map() は「1対1の置き換え」、.apply() は「関数を当てる」。辞書なら .map()、ロジックなら .apply()。58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 | # ── 2022年断面データ ───────────────────────────────────────────────────────── df22 = df_b[df_b['年度'] == 2022].copy() # ── OLS重回帰(標準化係数) ────────────────────────────────────────────────── exog_cols = ['求人倍率', '消費支出万円', '高齢化率', '大学進学率'] X_raw = df22[exog_cols].copy() X_std = (X_raw - X_raw.mean()) / X_raw.std() y_ols = df22['純移動率'] X_const = sm.add_constant(X_std) ols_model = sm.OLS(y_ols, X_const).fit() print(ols_model.summary()) coefs = ols_model.params[1:] pvals = ols_model.pvalues[1:] conf = ols_model.conf_int().iloc[1:] r2 = ols_model.rsquared adjr2 = ols_model.rsquared_adj fstat = ols_model.fvalue fpval = ols_model.f_pvalue print(f"\nR² = {r2:.3f}, Adj.R² = {adjr2:.3f}") print(f"F統計量 = {fstat:.2f}, p = {fpval:.2e}") |
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行でリストを作れます。80 81 82 83 84 85 86 87 88 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 | # 相関係数 for col in exog_cols: r, p = stats.pearsonr(df22[col].dropna(), y_ols[df22[col].dropna().index]) print(f"{col}: r={r:.3f}, p={p:.4f}") # ── 地域別時系列集計(2012〜2023) ────────────────────────────────────────── region_ts = ( df_b.groupby(['年度', '地域区分'])['純移動率'] .mean() .reset_index() ) years = sorted(df_b['年度'].unique()) fig1, ax1 = plt.subplots(figsize=(10, 5.5)) regions_ordered = ['関東', '近畿', '中部', '北海道・東北', '中国・四国', '九州・沖縄'] for reg in regions_ordered: subset = region_ts[region_ts['地域区分'] == reg] ax1.plot( subset['年度'], subset['純移動率'], color=region_colors[reg], linewidth=2.2, marker='o', markersize=5, label=reg ) ax1.axhline(0, color='black', linewidth=0.8, linestyle='--', alpha=0.5) ax1.set_title('地域別 純移動率の推移(2012〜2023年)', fontsize=14, fontweight='bold', pad=12) ax1.set_xlabel('年度', fontsize=11) ax1.set_ylabel('純移動率(%)', fontsize=11) ax1.set_xticks(years) ax1.set_xticklabels([str(y) for y in years], rotation=45) ax1.legend(loc='upper left', fontsize=10, framealpha=0.85) ax1.grid(axis='y', alpha=0.3) ax1.spines['top'].set_visible(False) ax1.spines['right'].set_visible(False) fig1.tight_layout() fig1.savefig(os.path.join(FIG_DIR, '2020_H5_1_fig1.png'), dpi=150, bbox_inches='tight') plt.close(fig1) print("図1 保存完了") |
OLS Regression Results
==============================================================================
Dep. Variable: 純移動率 R-squared: 0.610
Model: OLS Adj. R-squared: 0.573
Method: Least Squares F-statistic: 16.45
Date: Mon, 18 May 2026 Prob (F-statistic): 3.49e-08
Time: 11:23:37 Log-Likelihood: 37.525
No. Observations: 47 AIC: -65.05
Df Residuals: 42 BIC: -55.80
Df Model: 4
Covariance Type: nonrobust
==============================================================================
coef std err t P>|t| [0.025 0.975]
------------------------------------------------------------------------------
const -0.1305 0.017 -7.768 0.000 -0.164 -0.097
求人倍率 -0.0424 0.019 -2.242 0.030 -0.080 -0.004
消費支出万円 0.0401 0.019 2.055 0.046 0.001 0.079
高齢化率 -0.0936 0.022 -4.220 0.000 -0.138 -0.049
大学進学率 0.0053 0.022 0.235 0.816 -0.040 0.050
==============================================================================
Omnibus: 5.292 Durbin-Watson: 1.864
Prob(Omnibus): 0.071 Jarque-Bera (JB): 2.214
Skew: 0.169 Prob(JB): 0.330
Kurtosis: 1.992 Cond. No. 2.30
==============================================================================
Notes:
[1] Standard Errors assume that the covariance matrix of the errors is correctly specified.
R² = 0.610, Adj.R² = 0.573
F統計量 = 16.45, p = 3.49e-08
求人倍率: r=-0.462, p=0.0011
消費支出万円: r=0.437, p=0.0021
高齢化率: r=-0.725, p=0.0000
大学進学率: r=0.518, p=0.0002
図1 保存完了df.groupby('列').apply(関数) — グループごとに関数を適用。時系列や地域別の集計でよく使います。fig, ax = plt.subplots(...) — 図全体(fig)と軸(ax)を作る定番。以降は ax.bar(...) 等で操作。ax.axhline / ax.axvline — 水平/垂直の点線。平均線や基準線として定番。stats.pearsonr(x, y) — Pearson相関係数 r と p値を同時に返します。r, p = stats.pearsonr(...) — Pythonは複数戻り値を同時に受け取れる(タプルアンパック)。2022年の47都道府県データを用いて、純移動率(目的変数)に対する各要因変数の影響を重回帰分析で定量化した。説明変数はすべて標準化(平均0・標準偏差1)したうえでOLS(最小二乗法)で推定し、標準化偏回帰係数として比較した。
| 説明変数 | 標準化係数 β | t値 | p値 | 95%CI | 有意性 |
|---|---|---|---|---|---|
| 求人倍率 | −0.042 | −2.242 | 0.030 | [−0.080, −0.004] | * 有意 |
| 消費支出(万円) | +0.040 | +2.055 | 0.046 | [+0.001, +0.079] | * 有意 |
| 高齢化率 | −0.094 | −4.220 | < 0.001 | [−0.138, −0.049] | *** 高度有意 |
| 大学進学率 | +0.005 | +0.235 | 0.816 | [−0.040, +0.050] | n.s. 非有意 |
OLS回帰の非標準化係数は変数の単位に依存するため、異なる変数の影響力を直接比較することができない。各変数を標準化(z-score化)してから回帰することで、「1標準偏差分の変化に対する目的変数の変化量」として統一的に比較できる。
まず単相関で各変数と純移動率の関係を確認した。高齢化率との相関が最も強く(r = −0.725)、次いで大学進学率(r = +0.518)、求人倍率(r = −0.462)、消費支出(r = +0.437)の順であった。
| 変数 | 相関係数 r | p値 | 解釈 |
|---|---|---|---|
| 高齢化率 | −0.725 | < 0.001 | 高齢化が進むほど転出超過 |
| 大学進学率 | +0.518 | < 0.001 | 進学率高い地域は都市部に集中 |
| 求人倍率 | −0.462 | 0.001 | 求人倍率と転入超過の逆相関 |
| 消費支出(万円) | +0.437 | 0.002 | 所得水準高い地域に転入集中 |
説明変数間に強い相関がある場合(多重共線性)、個々の偏回帰係数の推定が不安定になる。VIF(分散膨張因子)を確認し、VIF > 10 の変数は除外を検討する必要がある。本分析では VIF が最大でも 2.3 程度であり、多重共線性は問題なかった。
119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 | df22_sorted = df22.sort_values('純移動率') colors_bar = [region_colors[region_map[pref]] for pref in df22_sorted['都道府県']] fig2, ax2 = plt.subplots(figsize=(10, 11)) bars = ax2.barh( df22_sorted['都道府県'], df22_sorted['純移動率'], color=colors_bar, edgecolor='white', linewidth=0.5 ) ax2.axvline(0, color='black', linewidth=1.0) ax2.set_title('都道府県別 純移動率ランキング(2022年)', fontsize=13, fontweight='bold', pad=10) ax2.set_xlabel('純移動率(%)', fontsize=11) ax2.tick_params(axis='y', labelsize=9) ax2.grid(axis='x', alpha=0.3) ax2.spines['top'].set_visible(False) ax2.spines['right'].set_visible(False) # 凡例 from matplotlib.patches import Patch legend_elements = [Patch(facecolor=region_colors[r], label=r) for r in region_colors] ax2.legend(handles=legend_elements, loc='lower right', fontsize=9, framealpha=0.85) fig2.tight_layout() fig2.savefig(os.path.join(FIG_DIR, '2020_H5_1_fig2.png'), dpi=150, bbox_inches='tight') plt.close(fig2) print("図2 保存完了") |
図2 保存完了
import pandas as pd など — 必要なライブラリをまとめて呼び出します。as pd は短い別名(alias)。fig, ax = plt.subplots(...) — 図全体(fig)と軸(ax)を作る定番。以降は ax.bar(...) 等で操作。sort_values('列名', ascending=False) — 指定列で並べ替え(降順)。ax.axhline / ax.axvline — 水平/垂直の点線。平均線や基準線として定番。df['A'] / df['B'] — pandasの列同士の四則演算は要素ごと(element-wise)。forループ不要なのが強み。純移動率ランキング(2022年)をもとに、転出超過が深刻な都道府県の特徴を分析した。
| 順位 | 都道府県 | 純移動率 | 地域ブロック | 高齢化率 |
|---|---|---|---|---|
| 1位(最大流出) | 長崎県 | −0.403% | 九州・沖縄 | 33.9% |
| 2位 | 福島県 | −0.372% | 北海道・東北 | 32.7% |
| 3位 | 岩手県 | −0.371% | 北海道・東北 | 34.5% |
| 4位 | 青森県 | −0.364% | 北海道・東北 | 34.8% |
| 5位 | 山形県 | −0.361% | 北海道・東北 | 34.8% |
| 順位 | 都道府県 | 純移動率 | 地域ブロック | 高齢化率 |
|---|---|---|---|---|
| 1位(最大流入) | 千葉県 | +0.299% | 関東 | 28.0% |
| 2位 | 埼玉県 | +0.263% | 関東 | 27.4% |
| 3位 | 神奈川県 | +0.244% | 関東 | 25.8% |
| 4位 | 東京都 | +0.242% | 関東 | 22.8% |
| 5位 | 福岡県 | +0.174% | 九州・沖縄 | 28.3% |
本研究では「断面データ(2022年・47都道府県)」で重回帰を行い、「パネルデータ(2012〜2023年・47都道府県)」で時系列推移を確認した。断面データは変数間の現状のパターンを把握しやすく、パネルデータは「変化のトレンド」と「都道府県固有の効果」を区別できる点で有用。
144 145 146 147 148 149 150 151 152 153 154 | fig3, ax3 = plt.subplots(figsize=(10, 7)) for _, row in df22.iterrows(): c = region_colors[region_map.get(row['都道府県'], '関東')] ax3.scatter(row['求人倍率'], row['純移動率'], color=c, s=60, zorder=3, alpha=0.85) ax3.annotate( row['都道府県'].replace('県', '').replace('府', '').replace('都', '').replace('道', ''), (row['求人倍率'], row['純移動率']), fontsize=7.5, ha='center', va='bottom', xytext=(0, 4), textcoords='offset points', color='#333333' ) |
print はしません。データや図が裏で更新されただけ。次のステップへ進みましょう。fig, ax = plt.subplots(...) — 図全体(fig)と軸(ax)を作る定番。以降は ax.bar(...) 等で操作。for _, row in df.iterrows() — DataFrameを1行ずつ取り出すループ。1点ずつ描画したいときに使用。.map() は「1対1の置き換え」、.apply() は「関数を当てる」。辞書なら .map()、ロジックなら .apply()。155 156 157 158 159 160 161 162 163 164 165 166 167 168 | # 回帰線 x_plot = np.linspace(df22['求人倍率'].min() * 0.97, df22['求人倍率'].max() * 1.03, 200) slope, intercept, r_val, p_val, _ = stats.linregress(df22['求人倍率'], df22['純移動率']) ax3.plot(x_plot, intercept + slope * x_plot, color='#c0392b', linewidth=1.8, linestyle='--', zorder=2, label=f'回帰線 r={r_val:.3f}(p={p_val:.3f})') ax3.axhline(0, color='gray', linewidth=0.7, linestyle=':') ax3.set_title('求人倍率と純移動率の関係(2022年・47都道府県)', fontsize=13, fontweight='bold', pad=12) ax3.set_xlabel('求人倍率(月間有効求人数÷月間有効求職者数)', fontsize=11) ax3.set_ylabel('純移動率(%)', fontsize=11) ax3.legend(fontsize=10, loc='upper right') ax3.grid(alpha=0.25) ax3.spines['top'].set_visible(False) ax3.spines['right'].set_visible(False) |
print はしません。データや図が裏で更新されただけ。次のステップへ進みましょう。ax.axhline / ax.axvline — 水平/垂直の点線。平均線や基準線として定番。stats.linregress(x, y) — 単回帰の傾き・切片・r値・p値・標準誤差を返します。使わない値は _ で受け取り。[式 for x in リスト] はリスト内包表記。forループでappendする代わりに1行でリストを作れます。169 170 171 172 173 174 175 176 177 178 179 | # 地域凡例 from matplotlib.patches import Patch leg_els = [Patch(facecolor=region_colors[r], label=r) for r in region_colors] ax3.legend(handles=leg_els + [ plt.Line2D([0], [0], color='#c0392b', linewidth=1.8, linestyle='--', label=f'回帰線 r={r_val:.3f}(p={p_val:.3f})') ], fontsize=9, framealpha=0.85, loc='upper right') fig3.tight_layout() fig3.savefig(os.path.join(FIG_DIR, '2020_H5_1_fig3.png'), dpi=150, bbox_inches='tight') plt.close(fig3) print("図3 保存完了") |
図3 保存完了
import pandas as pd など — 必要なライブラリをまとめて呼び出します。as pd は短い別名(alias)。r, p = stats.pearsonr(...) — Pythonは複数戻り値を同時に受け取れる(タプルアンパック)。重回帰分析と時系列分析の結果から、人口流出の主因は「高齢化の進行」と「所得・消費水準の格差」であることが明らかになった。これをふまえ、以下の3つの政策提言を行う。
時系列分析が示すように、東京圏(関東ブロック)への一極集中は2012年以降一貫して続いている。コロナ禍の2020〜2021年に一時的な緩和が見られたことは、「地方でも働ける環境整備(テレワーク普及)」が東京一極集中を是正できる可能性を示唆している。ポストコロナにおいても、デジタル技術を活用した「どこでも働ける」環境の維持・拡大が重要な政策課題である。
181 182 183 184 185 186 187 188 189 190 191 192 193 194 195 196 197 198 199 200 201 202 | coef_labels = ['求人倍率', '消費支出\n(万円)', '高齢化率', '大学進学率'] coef_vals = coefs.values ci_low = conf.iloc[:, 0].values ci_hi = conf.iloc[:, 1].values err_lo = coef_vals - ci_low err_hi = ci_hi - coef_vals bar_colors = ['#c0392b' if p < 0.05 else '#95a5a6' for p in pvals.values] fig4, ax4 = plt.subplots(figsize=(7, 4.5)) y_pos = np.arange(len(coef_labels)) ax4.barh(y_pos, coef_vals, xerr=[err_lo, err_hi], color=bar_colors, edgecolor='white', linewidth=0.8, capsize=5, error_kw={'linewidth': 1.5}) ax4.axvline(0, color='black', linewidth=0.9) ax4.set_yticks(y_pos) ax4.set_yticklabels(coef_labels, fontsize=11) ax4.set_xlabel('標準化偏回帰係数(95%CI)', fontsize=11) ax4.set_title(f'純移動率の重回帰分析(標準化係数)\nR²={r2:.3f}, Adj.R²={adjr2:.3f}, p={fpval:.2e}', fontsize=12, fontweight='bold', pad=10) ax4.grid(axis='x', alpha=0.3) ax4.spines['top'].set_visible(False) ax4.spines['right'].set_visible(False) |
print はしません。データや図が裏で更新されただけ。次のステップへ進みましょう。fig, ax = plt.subplots(...) — 図全体(fig)と軸(ax)を作る定番。以降は ax.bar(...) 等で操作。ax.axhline / ax.axvline — 水平/垂直の点線。平均線や基準線として定番。[式 for x in リスト] はリスト内包表記。forループでappendする代わりに1行でリストを作れます。203 204 205 206 207 208 209 210 211 | # 凡例(赤=有意、灰=非有意) from matplotlib.patches import Patch leg_sig = [Patch(facecolor='#c0392b', label='p < 0.05(有意)'), Patch(facecolor='#95a5a6', label='p >= 0.05(非有意)')] ax4.legend(handles=leg_sig, fontsize=9, loc='lower right', framealpha=0.85) fig4.tight_layout() fig4.savefig(os.path.join(FIG_DIR, '2020_H5_1_fig4.png'), dpi=150, bbox_inches='tight') plt.close(fig4) print("図4 保存完了") |
print はしません。データや図が裏で更新されただけ。次のステップへ進みましょう。import pandas as pd など — 必要なライブラリをまとめて呼び出します。as pd は短い別名(alias)。r, p = stats.pearsonr(...) — Pythonは複数戻り値を同時に受け取れる(タプルアンパック)。212 213 214 215 216 217 218 219 220 221 222 | # ── 統計値サマリー出力 ───────────────────────────────────────────────────── print("\n===== 統計値サマリー =====") print(f"分析対象: 47都道府県 × 2012〜2023年(12年間)") print(f"2022年 純移動率 平均={df22['純移動率'].mean():.3f}%, SD={df22['純移動率'].std():.3f}%") print(f"2022年 純移動率 最小={df22['純移動率'].min():.3f}% ({df22.loc[df22['純移動率'].idxmin(),'都道府県']})") print(f"2022年 純移動率 最大={df22['純移動率'].max():.3f}% ({df22.loc[df22['純移動率'].idxmax(),'都道府県']})") print(f"R²={r2:.3f}, Adj.R²={adjr2:.3f}, F={fstat:.2f}, p={fpval:.2e}") for i, col in enumerate(exog_cols): sig = '*' if pvals.iloc[i] < 0.05 else ' ' print(f" {col}: β={coef_vals[i]:.4f}, p={pvals.iloc[i]:.4f} {sig}") print("図4枚すべて保存完了") |
図4 保存完了 ===== 統計値サマリー ===== 分析対象: 47都道府県 × 2012〜2023年(12年間) 2022年 純移動率 平均=-0.131%, SD=0.176% 2022年 純移動率 最小=-0.403% (長崎県) 2022年 純移動率 最大=0.299% (千葉県) R²=0.610, Adj.R²=0.573, F=16.45, p=3.49e-08 求人倍率: β=-0.0424, p=0.0303 * 消費支出万円: β=0.0401, p=0.0462 * 高齢化率: β=-0.0936, p=0.0001 * 大学進学率: β=0.0053, p=0.8157 図4枚すべて保存完了
x if cond else y は三項演算子。リスト内包表記と組み合わせると、forとifを1行で書けます。SSDSE-B(47都道府県、2012〜2023年)を用いた分析により、以下の知見が得られた。
| データ | 出典 |
|---|---|
| SSDSE-B 都道府県データ(2012〜2023年) | 統計数理研究所 SSDSE(社会・人口統計体系) |
| 転入者数・転出者数 | 総務省 住民基本台帳人口移動報告(SSDSE-B収録) |
| 月間有効求人数・求職者数 | 厚生労働省 職業安定業務統計(SSDSE-B収録) |
| 消費支出 | 総務省 家計調査(SSDSE-B収録) |
| 高等学校卒業者・進学者数 | 文部科学省 学校基本調査(SSDSE-B収録) |
本分析はSSDSE-B(実公的統計データ)のみを使用。合成データ(np.random.seed等)は一切使用していない。
統計分析の解釈で初心者がやりがちな勘違いをまとめます。特に「相関と因果の混同」「p値の過信」は研究現場でもよく起きる落とし穴です。本文を読む前にも、読んだ後にも、目を通してみてください。
統計の基本用語を初心者向けに解説します。本文中で見慣れない言葉が出てきたら、ここに戻って確認してください。
統計手法について「何のためか」「結果をどう読むか」を初心者向けに解説します。
この研究をさらに発展させるための3つの方向性を示します。「今回わかったこと(X)」から「次に検証すべき仮説(Y)」を立て、「具体的に何をするか(Z)」まで考えてみましょう。
学んだだけでは身につきません。実際に手を動かすのが最強の学習方法です。本論文のスクリプトをベースに、以下のチャレンジに挑戦してみてください。難易度別に5つ用意しました。
本論文で学んだ手法は、研究の世界だけでなく、行政・企業・NPO の現場でも様々に活用されています。具体的なシーンを紹介します。
この論文を読んで初心者が抱きやすい疑問に、教育的観点から答えます。