論文一覧に戻る 🕸 論文ネットワーク 🗺 用語ネットワーク 統計データ分析コンペ 教育用再現集
2019年度(令和元年度) 統計データ分析コンペティション | 優秀賞(大学生・一般の部)

我が国における人口増減の決定要因

⏱️ 推定読了時間: 約35分
竹内 太郎(大阪大学医学部医学科5年) | 手法:パネルデータ分析(固定効果・ランダム効果モデル) | データ:SSDSE-2019B・e-Stat(47都道府県×2005〜2016年度)
🔬 Hausman検定🔬 パネルデータ分析🏷 医療・健康🏷 教育・学力🏷 人口・少子化
🔬 手法タグ / 🏷 応用タグ(クリックで同タグの論文をネットワーク検索)
🔬 再現カルテ — 原論文と同じデータ・同じ手法で再現

この教材は原論文と同じデータを読み込み、同じ手順で計算し直しています。画面に出る数値と図は、あなたのブラウザがその場で計算した結果です。

原論文が使ったデータSSDSE-B・e-Stat
分析単位:都道府県
中核手法:パネルデータ分析・重回帰分析・固定効果モデル・ランダム効果モデル・相関分析
この教材が使うデータ
原論文(PDF)我が国における人口増減の決定要因
優秀賞/竹内 太郎(大阪大学医学部)
✅ この教材でできること
  • 原論文の中核手法(パネルデータ分析・重回帰分析)を実データで実行できる
  • 分析に使うデータは同梱済みで、ブラウザ上でそのまま読み込める
  • 数値・図を最後まで再計算できる(重回帰分析(OLS)・パネルデータ分析)
突合監査の結果、主要データと中核手法はいずれも原論文と一致しています。

▶ ここに書いてある分析は、ページ下部の「🐍 ブラウザで動かす」でそのまま実行できます(インストール不要)。動かしているのは code/2019_U2_yushu.py(230 行)そのものです。

🏅 論文審査会コメント(審査員はここを評価した)
「変量効果モデルを用いて、人口増減に与える要因を示しており、解釈も明確であり、十分な実証技術を示した論文として評価された。一方で、当該分野には変数間の因果関係についても様々な先行研究が存在する。それらを参考にすることで、論文の考察や結論を発展させることが期待できる。」
出典:統計センター「統計データ分析コンペティション」受賞論文PDF掲載の審査講評。プロの審査員が何を評価し、何を注文したかは論文の読み方の最良の手本になる。
📝 3行で分かる要約

目次

  1. 研究の背景:日本の人口減少という社会問題
  2. データと変数(SSDSE-2019B・e-Stat、47都道府県×12年度)
  3. 15指標の経年変化と変数間の相関(図1・補表2)
  4. パネルデータ分析:固定効果 vs ランダム効果(表2)
  5. 人口増加が続いた5都道府県の深掘り(図2・図3)
  6. 考察:教育・医療への政策的含意
  7. まとめ:研究の強みと限界
  8. 📥 データの準備
  9. 💼 実社会での応用
  10. ⚠️ よくある誤解
  11. 📖 用語集
  12. 📐 手法ガイド
  13. 🚀 発展の可能性
  14. 🎯 自分でやってみよう
  15. 🤔 Q&A
  16. 🐍 ブラウザで動かす

🎯 この記事を読むと何ができるようになるか

📥 データの準備(再現コードを動かす前に)

このページの実データ追試を自分で動かすには、以下の手順でデータを準備してください。コードの編集は不要です。

1
データをダウンロードする 独立行政法人統計センターの SSDSE(教育用標準データセット)配布ページから、以下のファイルをダウンロードします。
SSDSE-B-2026.csv ← SSDSE-B(都道府県・時系列データ)📥 直接DL
⬇ SSDSEダウンロードページを開く
2
ファイルを所定のフォルダに配置する ダウンロードしたCSVを、プロジェクトの data/raw/ フォルダに入れます。
2026 統計・データ解析コンペ/ ├── code/ │ └── 2019_U2_yushu.py ← 実行するスクリプト └── data/ └── raw/ SSDSE-B-2026.csv ← ここに置く
3
スクリプトをそのまま実行する ターミナルでプロジェクトルートに移動し、以下を実行します。
python3 code/2019_U2_yushu.py
図は html/figures/ に自動保存されます。

※ 原論文は SSDSE-2019B と e-Stat の 2005〜2016年度データを使いました。現在配布中の SSDSE-B-2026 の収録期間は 2012〜2023年度で、医師数・歯科医師数・看護師数・精神科病院数や年齢階級別人口(3-5歳など)は収録されていません。そのため本ページでは、図1・図3・図4を実データによる追試(期間・変数定義が異なる)、図2(原論文 表2 の解析結果)を原論文の報告値の可視化(再計算ではない)として扱います(詳細は「データと変数」の再現範囲を参照)。

研究の背景:日本の人口減少という社会問題

日本における人口減少は社会的な問題である。原論文の引用する推計によれば、2010年の国勢調査で1億2806万人であった我が国の総人口は、2060年には8674万人に減少すると推計されている。また、老年人口割合(65歳以上人口)は増加し続けており、2060年にはおよそ40%に達すると推計されている(いずれも厚生労働白書からの引用)。

人口減少は次の3段階に分けて捉えることができる:

段階特徴
第1段階若年人口は減少するが、高齢者は増加する時期(日本は今ここ
第2段階若年人口の減少が加速するとともに、高齢者人口が微減へと転じる時期
第3段階若年人口の減少がより一層加速化し、高齢者人口も減少する時期

人口減少がもたらす影響は、経済(就業者数の減少と経済成長の停滞)、地域社会(労働人口減少や消費の停滞)、社会保障(担い手である生産年齢人口の減少による社会保障・財政維持の困難)と広範にわたる。

これまでも、医療・教育・労働・財政基盤といった各分野の諸要因が人口増減に与える影響は分析されてきた。しかし多くは単年度のデータを用いた解析だった。社会的要因は時間の経過に従って変化する。ならば、複数年度のデータをまとめて経時的変化も考慮した解析を行えば、人口増減に影響を与える要因をより適切に検討できるはずだ——これが本研究の出発点である。

研究の問い(原論文 1節) 若年者と特に関わりの深い教育、健康・医療の2分野の社会生活統計指標を説明変数、人口増減率を被説明変数として、2005〜2016年度の12年間・全国47都道府県のパネルデータ分析を行い、日本における人口減少の決定要因を明らかにする。
分析の流れ
SSDSE-2019B
+e-Stat
47都道府県×12年度
人口増減率と
15指標の作成
経年変化・
相関の確認
固定効果/
ランダム効果
モデルの推定
LM検定・
ハウスマン検定
→ モデル採択
論文審査会コメント(原論文より) 「変量効果モデルを用いて、人口増減に与える要因を示しており、解釈も明確であり、十分な実証技術を示した論文として評価された。一方で、当該分野には変数間の因果関係についても様々な先行研究が存在する。それらを参考にすることで、論文の考察や結論を発展させることが期待できる。」

パネルデータ分析 固定効果モデル ランダム効果モデル ハウスマン検定 Breusch-PaganのLM検定

データと変数(SSDSE-2019B・e-Stat、47都道府県×12年度)

使用データ(原論文 3節)

被説明変数・説明変数とも、SSDSE-2019B(独立行政法人統計センターの教育用標準データセット・都道府県/時系列データ)と政府統計の総合窓口(e-Stat)から取得した、2005〜2016年度・47都道府県のデータである。統計解析は Stata/MP 15.0、仮説検定は有意水準5%で行われた。

47
都道府県(個体数)
12
年度(2005〜2016)
564
延べ観測数(47×12)
15
説明変数(社会生活統計指標)

被説明変数:人口増減率

人口増減率は自然増減率と社会増減率の和として、SSDSE-2019B の出生数・死亡数・転入者数・転出者数・日本人人口から算出された(人口千対)。

自然増減率 = (出生数 − 死亡数) / 日本人人口 × 1000
社会増減率 = (転入者数 − 転出者数) / 日本人人口 × 1000
人口増減率 = 自然増減率 + 社会増減率

説明変数:15の社会生活統計指標(原論文 表1)

教育、健康・医療の2分野から15指標を選び、高齢化の影響を調整するため老年人口割合も説明変数に含めた。学校数は対象年齢人口10万人あたり、医療関係は人口10万人あたりに標準化されている。

分野項目名コード出典データ
人口・世帯老年人口割合(65歳以上人口割合)A03503国勢調査、人口推計
教育幼稚園数(3-5歳人口10万人あたり)E0110104学校基本調査
小学校数(6-11歳人口10万人あたり)E0110101
中学校数(12-14歳人口10万人あたり)E0110102
高等学校数(15-17歳人口10万人あたり)E0110103
大学数(人口10万人あたり)E0610102
中学校卒業者進学率E09401
高等学校卒業者進学率E09402
健康・医療一般病院数(人口10万人あたり)I0910103医療施設動態調査
一般診療所数(人口10万人あたり)I0910105
歯科診療所数(人口10万人あたり)I0910106
精神科病院数(人口10万人あたり)I0910107
医療施設に従事する医師数(人口10万人あたり)I0920101医師・歯科医師・薬剤師調査
医療施設に従事する歯科医師数(人口10万人あたり)I0920201
医療施設に従事する看護師・准看護師数(人口10万人あたり)I0920301

※ コードは原論文 表1 の社会生活統計指標コードの転記(先頭の英字は指標分類)。

再現可能性の整理(本ページの方針)

本ページで「実データ追試」できる範囲・できない範囲
  • 実データ追試(図1・図3・図4・ステップ6):人口増減率(出生数・死亡数・転入者数・転出者数・日本人人口)と、学校数・進学率・医療施設数など11変数は現行 SSDSE-B-2026 でも計算できる。ただし収録期間は 2012〜2023年度(原論文は2005〜2016年度)で、学校数の分母も総人口で代用しており、原論文の数値の「検算」ではない
  • 原論文の報告値の可視化(図2):医師数・歯科医師数・看護師/准看護師数・精神科病院数は SSDSE-B-2026 に未収録のため、原論文の15変数モデルは再推定できない。表2(ランダム効果モデル)の解析結果は原論文の報告値をそのままグラフ化した(再計算ではない)。
  • 原論文参照:原論文の図1-(a)〜(o)(15指標すべての経年変化)と図3(5都道府県の医師数推移)は、対応するデータが SSDSE に未収録のものを含むため、本文と表で内容を示す。グラフは原論文参照
やってみよう準備: ライブラリの読み込みと設定
📝 コード
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
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') — グラフを画面表示せずファイルに保存するためのおまじない。
  • statsmodels — 回帰分析・パネルデータ分析用のライブラリ。原論文は Stata/MP 15.0 を使いましたが、同型のモデルは Python でも推定できます。
  • plt.rcParams['font.family'] — グラフの日本語表示用フォント指定(Macは Hiragino Sans、Windowsなら Yu Gothic 等)。
やってみようステップ1: データ読み込みと人口増減率の計算
📝 コード
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
# ===== ステップ1: SSDSE-B-2026 の読み込みと人口増減率の計算 =====
df = pd.read_csv(DATA_B, encoding='cp932', header=1)
df = df[df['地域コード'].str.match(r'^R\d{5}', na=False)].copy()
df['年度'] = df['年度'].astype(int)

# 人口増減率 = 自然増減率 + 社会増減率(原論文 3節の定義そのまま)
#   自然増減率 = (出生数 - 死亡数) / 日本人人口 * 1000
#   社会増減率 = (転入者数 - 転出者数) / 日本人人口 * 1000
df['自然増減率'] = (df['出生数'] - df['死亡数']) / df['日本人人口'] * 1000
df['社会増減率'] = (df['転入者数(日本人移動者)'] -
                    df['転出者数(日本人移動者)']) / df['日本人人口'] * 1000
df['人口増減率'] = df['自然増減率'] + df['社会増減率']

# 説明変数(SSDSE-B-2026 で計算可能な11指標。医師数などは未収録)
df['老年人口割合'] = df['65歳以上人口'] / df['総人口'] * 100
for col in ['幼稚園数', '小学校数', '中学校数', '高等学校数',
            '大学数', '一般病院数', '一般診療所数', '歯科診療所数']:
    df[col + '_10万対'] = df[col] / df['総人口'] * 100000  # 人口10万人あたり
df['中学校卒業者進学率'] = df['中学校卒業者のうち進学者数'] / df['中学校卒業者数'] * 100
df['高等学校卒業者進学率'] = df['高等学校卒業者のうち進学者数'] / df['高等学校卒業者数'] * 100

print(f"【SSDSE-B-2026】47都道府県 × {df['年度'].nunique()}年度"
      f"({df['年度'].min()}{df['年度'].max()})= {len(df)}観測")
print('  ※ 原論文の SSDSE-2019B(2005〜2016年度)とは収録期間が異なる')
▼ 実行結果
【SSDSE-B-2026】47都道府県 × 12年度(2012〜2023)= 564観測
  ※ 原論文の SSDSE-2019B(2005〜2016年度)とは収録期間が異なる
💡 解説
  • pd.read_csv(..., encoding='cp932', header=1) — SSDSE-B は1行目が変数コード、2行目が日本語の変数名なので、2行目を列名にします。
  • str.match(r'^R\d{5}') — 地域コードが「R+数字5桁」の行=47都道府県だけを残します(全国計の行を除外)。
  • 人口増減率=自然増減率+社会増減率という定義は原論文 3節の式をそのまま実装しています。* 1000 で「人口千人あたり(人口千対)」になります。
  • 学校数・医療施設数は / 総人口 * 100000 で「人口10万人あたり」に変換。原論文は幼稚園〜高等学校を対象年齢人口(3-5歳など)10万人あたりで定義していますが、SSDSE-B-2026 には年齢階級別人口(3-5歳など)がないため総人口で代用しています(追試の限界)。
💡 Python TIPS lambda や列名のループを使うと、同じ変換を複数の列にまとめて適用できます。コピペの繰り返しはミスのもと。
1
15指標の経年変化と変数間の相関(図1・補表2)

回帰分析に入る前に、原論文はまず15指標それぞれの経年変化(全国平均値の推移及び標準偏差)を図1-(a)〜(o) で確認している。12年間(2005〜2016年度)の全国的な傾向は次の通りである(原論文 4節)。

傾向指標
概ね増加傾向老年人口割合、人口10万人あたりの大学数・一般診療所数・歯科診療所数・医師数・歯科医師数・看護師/准看護師数
2009年度頃を境に減少傾向へ人口10万人あたりの幼稚園数・小学校数・中学校数・高等学校数
12年間ほぼ一貫して減少人口10万人あたりの一般病院数

※ 原論文 図1-(a)〜(o) は15枚の経年変化図。本ページでは SSDSE-B-2026 で計算できる4指標のみ追試した(下の図1)。15枚すべてのグラフは原論文参照。

主要指標の経年変化(47都道府県の平均±標準偏差、2012〜2023年度)
図1(追試):主要指標の経年変化(47都道府県の平均±標準偏差)。SSDSE-B-2026(2012〜2023年度)による実データ追試で、原論文 図1(2005〜2016年度)とは期間が異なる。老年人口割合・高等学校卒業者進学率・一般診療所数の増加傾向は原論文の観察と同じ向きで続いており、人口増減率(右下)は全国平均でマイナス幅が拡大している。
📊 図の読み方
折れ線
各年度の47都道府県の平均値。原論文 図1 と同じ「全国平均値の推移」。
赤いヒゲ
±1標準偏差=都道府県間のばらつき。ヒゲが長い指標ほど地域差が大きい。
注意
期間は2012〜2023年度。原論文(2005〜2016年度)の図1の数値の再現ではなく、同じ描き方による最近データの追試。
やってみようステップ2: 図1 主要指標の経年変化(実データ追試)
📝 コード
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 主要指標の経年変化(全国平均±標準偏差、実データ追試) =====
# 原論文 図1-(a)〜(o) と同じ「全国平均値の推移+標準偏差」の描き方を、
# SSDSE-B-2026 で計算できる4指標について 2012〜2023年度で追試する。
items = [('老年人口割合', '老年人口割合 [%]'),
         ('高等学校卒業者進学率', '高等学校卒業者進学率 [%]'),
         ('一般診療所数_10万対', '一般診療所数(人口10万人あたり)'),
         ('人口増減率', '人口増減率 [人口千対]')]
g = df.groupby('年度')
fig, axes = plt.subplots(2, 2, figsize=(10, 7))
for ax, (col, label) in zip(axes.ravel(), items):
    m, s = g[col].mean(), g[col].std()
    ax.errorbar(m.index, m.values, yerr=s.values, color='#455A64',
                ecolor='#C62828', elinewidth=1, capsize=3, lw=1.5)
    ax.set_title(label, fontsize=11)
    ax.set_xlabel('年度')
    ax.grid(alpha=0.3)
fig.suptitle('図1(追試)主要指標の経年変化:47都道府県の平均±標準偏差\n'
             '(SSDSE-B-2026、2012〜2023年度。原論文 図1 は 2005〜2016年度)',
             fontsize=12)
fig.tight_layout(rect=[0, 0, 1, 0.93])
fig.savefig(f'{FIG_DIR}/2019_U2_fig1.png', bbox_inches='tight')
plt.close(fig)
print('【図1】全国平均の変化(2012年度 → 2023年度、実データ)')
for col, label in items:
    print(f'  {label}: {g[col].mean().iloc[0]:.2f}{g[col].mean().iloc[-1]:.2f}')
▼ 実行結果
【図1】全国平均の変化(2012年度 → 2023年度、実データ)
  老年人口割合 [%]: 25.62 → 31.59
  高等学校卒業者進学率 [%]: 49.79 → 57.56
  一般診療所数(人口10万人あたり): 79.58 → 84.50
  人口増減率 [人口千対]: -3.95 → -10.22
💡 解説
  • groupby('年度')mean() / std() — 各年度の47都道府県の平均と標準偏差。原論文 図1 の「全国平均値の推移及び標準偏差」と同じ集計です。
  • ax.errorbar(..., yerr=s.values) — 平均値の折れ線にエラーバー(±1標準偏差)を重ねる、原論文 図1 と同じ描き方。
  • 出力を見ると、2012→2023年度でも老年人口割合・進学率・診療所数は増加、人口増減率は低下——原論文が 2005〜2016年度で観察したトレンドが最近まで続いていることが確認できます。

変数間の相関(原論文 補表2)

原論文は15変数間の相関係数も確認している(巻末の補表2)。主な観察は:

なぜ相関を先に見るのか 説明変数どうしの相関が強すぎると、回帰係数の推定が不安定になる(多重共線性)。原論文が補表2を巻末に付けているのは、読者が「どの係数が互いに影響し合っている可能性があるか」を確認できるようにするためでもある。小・中・高等学校数の相関(r>0.8)はこの点で要注意であり、これらの係数は互いに切り分けて解釈しにくい。
2
パネルデータ分析:固定効果 vs ランダム効果(表2)

本研究の中心は、15指標を説明変数、人口増減率を被説明変数とするパネルデータ分析である。モデルは次の重回帰型で表される(原論文 2節)。

Yit = α + Σj=1..15 βj Xj,it + ui + εit

Yit は第 i 都道府県の t 年度における人口増減率、Xj,it は15の説明変数、βj回帰係数。ui都道府県ごとに異なる individual effect(個体効果)で、これを定数とみなすのが固定効果モデル確率変数とみなすのがランダム効果モデルである。原論文は両方を推定して比較した。

モデル選択の3つの検定(原論文 4節)

F(46,502)
=13.82
個体効果の検定
P<0.001 → 都道府県ごとの個体効果あり
P<0.001
Breusch-PaganのLM検定
→ ランダム効果が存在する
P=0.150
ハウスマン検定
→ ランダム効果と説明変数は無相関=RE採用可

検定の流れを言葉にすると——「都道府県ごとの体質の違い(個体効果)は確かにある(F検定・LM検定)。では、その体質の違いは説明変数と相関しているか? 相関しているなら固定効果モデルしか使えないが、ハウスマン検定の結果(P=0.150)は無相関を否定しなかった。よってより効率的なランダム効果モデルの推定値を主に用いる」——これが原論文の判断である。

ランダム効果モデルの解析結果(原論文 表2)

下表は原論文 表2 の転記である(原論文の報告値)。太字は5%水準で有意な変数(赤=負、オレンジ=正)。

説明変数回帰係数95%信頼区間P値
老年人口割合 [%]−0.656−0.772 〜 −0.540<0.01
幼稚園数(3-5歳人口10万人あたり)0.0020.000 〜 0.0040.04
小学校数(6-11歳人口10万人あたり)−0.002−0.008 〜 0.0040.53
中学校数(12-14歳人口10万人あたり)0.001−0.007 〜 0.0090.77
高等学校数(15-17歳人口10万人あたり)−0.024−0.036 〜 −0.011<0.01
大学数(人口10万人あたり)−0.074−1.833 〜 1.6850.94
中学校卒業者進学率−0.284−0.557 〜 −0.0110.04
高等学校卒業者進学率0.1250.068 〜 0.182<0.01
一般病院数(人口10万人あたり)−0.119−0.360 〜 0.1220.33
一般診療所数(人口10万人あたり)−0.090−0.134 〜 −0.046<0.01
歯科診療所数(人口10万人あたり)0.1100.010 〜 0.2090.03
精神科病院数(人口10万人あたり)0.449−0.812 〜 1.7110.49
医師数(人口10万人あたり)0.0300.014 〜 0.045<0.01
歯科医師数(人口10万人あたり)−0.024−0.068 〜 0.0190.28
看護師・准看護師数(人口10万人あたり)0.000−0.003 〜 0.0030.92

※ 原論文 表2 の報告値の転記。赤=負で有意、オレンジ=正で有意(P<0.05)。幼稚園数は係数0.002と小さいが、報告P値0.04で有意(信頼区間の下限は0.000)。

ランダム効果モデルによる解析結果(原論文 表2 の報告値の可視化)
図2:ランダム効果モデルによる解析結果のフォレストプロット。本図は原論文 表2 の報告値をそのまま可視化したもので、再計算ではない。青=正で有意、赤=負で有意、灰=有意でない(有意性は原論文の報告P値で判定)。
📊 図の読み方
回帰係数の推定値。0より右=その指標が大きいほど人口増減率が高い(人口増加に働く)。
横線
95%信頼区間0の縦線をまたがなければ5%水準で有意
スケール
係数の単位は変数ごとに異なる(進学率は「%ポイントあたり」、施設数は「人口10万対1施設あたり」)。係数の大小=重要度の大小ではない点に注意。

解析の結果、人口増加と有意に関連していたのは次の8変数である(原論文 4節):①老年人口割合の減少、②幼稚園数の増加、③高等学校数の減少、④中学校卒業者進学率の減少、⑤高等学校卒業者進学率の上昇、⑥一般診療所数の減少、⑦歯科診療所数の増加、⑧医師数の増加

やってみようステップ3: 図2 原論文 表2(ランダム効果モデル)の報告値を可視化
📝 コード
 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
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
# ===== ステップ3: 図2 原論文 表2(ランダム効果モデル)の報告値の可視化 =====
# 以下の数値は原論文 表2 の転記(回帰係数・95%信頼区間・P値)であり、再計算ではない。
paper_re = [  # (変数名, 係数, CI下限, CI上限, P値表記)
    ('老年人口割合 [%]',              -0.656, -0.772, -0.540, '<0.01'),
    ('幼稚園数 (3-5歳人口10万対)',     0.002,  0.000,  0.004, '0.04'),
    ('小学校数 (6-11歳人口10万対)',   -0.002, -0.008,  0.004, '0.53'),
    ('中学校数 (12-14歳人口10万対)',   0.001, -0.007,  0.009, '0.77'),
    ('高等学校数 (15-17歳人口10万対)', -0.024, -0.036, -0.011, '<0.01'),
    ('大学数 (人口10万対)',           -0.074, -1.833,  1.685, '0.94'),
    ('中学校卒業者進学率',            -0.284, -0.557, -0.011, '0.04'),
    ('高等学校卒業者進学率',           0.125,  0.068,  0.182, '<0.01'),
    ('一般病院数 (人口10万対)',       -0.119, -0.360,  0.122, '0.33'),
    ('一般診療所数 (人口10万対)',     -0.090, -0.134, -0.046, '<0.01'),
    ('歯科診療所数 (人口10万対)',      0.110,  0.010,  0.209, '0.03'),
    ('精神科病院数 (人口10万対)',      0.449, -0.812,  1.711, '0.49'),
    ('医師数 (人口10万対)',            0.030,  0.014,  0.045, '<0.01'),
    ('歯科医師数 (人口10万対)',       -0.024, -0.068,  0.019, '0.28'),
    ('看護師・准看護師数 (人口10万対)', 0.000, -0.003,  0.003, '0.92'),
]
fig, ax = plt.subplots(figsize=(9.6, 7.2))
ys = np.arange(len(paper_re))[::-1]
for y, (name, b, lo, hi, p) in zip(ys, paper_re):
    sig = p.startswith('<') or float(p) < 0.05   # 原論文の報告P値で5%有意判定
    color = ('#1565C0' if b > 0 else '#C62828') if sig else '#9E9E9E'
    ax.plot([lo, hi], [y, y], color=color, lw=2)
    ax.plot(b, y, 'o', color=color, ms=7)
    ax.text(1.80, y, f'P{p}' if p.startswith('<') else f'P={p}',
            va='center', fontsize=9, color='#333')
ax.axvline(0, color='#555', lw=0.8, ls='--')
ax.set_yticks(ys)
ax.set_yticklabels([r[0] for r in paper_re], fontsize=10)
ax.set_xlim(-2.0, 2.35)
ax.set_xlabel('回帰係数(人口増減率[人口千対]への影響、95%信頼区間)')
ax.set_title('図2:ランダム効果モデルによる解析結果\n'
             '(原論文 表2 の報告値の可視化。再計算ではない)\n'
             '青=正で有意 / 赤=負で有意 / 灰=有意でない(原論文の報告P値で判定)', fontsize=11)
ax.grid(axis='x', alpha=0.3)
fig.tight_layout()
fig.savefig(f'{FIG_DIR}/2019_U2_fig2.png', bbox_inches='tight')
plt.close(fig)
is_sig = lambda p: p.startswith('<') or float(p) < 0.05
sig_pos = [r[0].split(' ')[0] for r in paper_re if is_sig(r[4]) and r[1] > 0]
sig_neg = [r[0].split(' ')[0] for r in paper_re if is_sig(r[4]) and r[1] < 0]
print('【図2】原論文 表2(ランダム効果モデル)の報告値')
print('  正で有意:', '、'.join(sig_pos))
print('  負で有意:', '、'.join(sig_neg))
▼ 実行結果
【図2】原論文 表2(ランダム効果モデル)の報告値
  正で有意: 幼稚園数、高等学校卒業者進学率、歯科診療所数、医師数
  負で有意: 老年人口割合、高等学校数、中学校卒業者進学率、一般診療所数
💡 解説
  • paper_re のリストは原論文 表2 の転記(回帰係数・95%信頼区間・P値)。ここでの再計算ではありません——医師数など SSDSE 未収録の変数を含むため再計算はできません。
  • sig = not (lo <= 0 <= hi) — 95%信頼区間が0をまたがない=5%水準で有意、という読み方をそのままコードにしたもの。
  • このような「係数+信頼区間」の横棒プロットはフォレストプロットと呼ばれ、回帰結果の表を直感的に読むための定番の図です。

固定効果モデルの結果(原論文 補表1)との比較

固定効果モデルによる解析でも、ランダム効果モデルと同様の傾向が認められた(原論文 補表1)。主な有意変数の係数を並べると:老年人口割合 −0.560(P<0.01)、幼稚園数 0.004(P=0.03)、高等学校数 −0.028(P<0.01)、高等学校卒業者進学率 0.133(P<0.01)、一般診療所数 −0.116(P=0.02)、医師数 0.022(P=0.05)。2つのモデルで符号と有意性がほぼ一致していることが、結果の頑健性を支えている。

やってみようステップ6: 追試 — SSDSE-B-2026 の11変数でパネルデータ分析
📝 コード
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
# ===== ステップ6: 追試 — 11変数によるパネルデータ分析(FE・RE、期間・変数が異なる) =====
# 原論文と同型のモデル Y_it = α + Σβj X_j,it + u_i + ε_it を、SSDSE-B-2026 で
# 計算可能な11変数・2012〜2023年度で推定する。医師数など4変数は未収録のため入らず、
# 学校数の分母も対象年齢人口ではなく総人口。原論文の係数の「検算」ではない点に注意。
xvars = ['老年人口割合', '幼稚園数_10万対', '小学校数_10万対', '中学校数_10万対',
         '高等学校数_10万対', '大学数_10万対', '中学校卒業者進学率',
         '高等学校卒業者進学率', '一般病院数_10万対', '一般診療所数_10万対',
         '歯科診療所数_10万対']
pdat = df[['都道府県', '年度', '人口増減率'] + xvars].dropna()
y, X = pdat['人口増減率'], sm.add_constant(pdat[xvars])

# (1) プーリングOLS と 固定効果(LSDV)→ 個体効果の存在を F 検定
pool = sm.OLS(y, X).fit()
Xd = pd.concat([X, pd.get_dummies(pdat['都道府県'], drop_first=True, dtype=float)], axis=1)
lsdv = sm.OLS(y, Xd).fit()
dfn, dfd = pdat['都道府県'].nunique() - 1, int(lsdv.df_resid)
F = ((lsdv.rsquared - pool.rsquared) / dfn) / ((1 - lsdv.rsquared) / dfd)
print(f'【追試】個体効果の F 検定: F({dfn}, {dfd}) = {F:.2f}, '
      f'P = {stats.f.sf(F, dfn, dfd):.1e}(原論文: F(46,502)=13.82, P<0.001)')

# (2) Breusch-Pagan の LM 検定(プーリングOLS残差から。ランダム効果の存在を検定)
e = pool.resid
T = pdat['年度'].nunique()
S1 = pdat.assign(e=e).groupby('都道府県')['e'].sum().pow(2).sum()
LM = len(pdat) * T / (2 * (T - 1)) * (S1 / (e ** 2).sum() - 1) ** 2
print(f'  Breusch-Pagan LM 検定: LM = {LM:.1f}, '
      f'P = {stats.chi2.sf(LM, 1):.1e}(原論文: P<0.001 → ランダム効果あり)')

# (3) ランダム効果(変量切片)モデル: MixedLM で推定
re = sm.MixedLM(y, X, groups=pdat['都道府県']).fit(reml=True)
ci = re.conf_int()
print('\n【追試】ランダム効果モデル(SSDSE-B-2026、2012〜2023年度、11変数)')
print('  ※ 期間・変数定義が異なるため原論文 表2 と数値は一致しない')
paper_map = {r[0].split(' ')[0]: r for r in paper_re}
print(f"  {'変数': <11s}{'係数':>8s} {'95%信頼区間':>16s} {'P値':>6s}   原論文表2の係数")
for v in xvars:
    key = v.replace('_10万対', '')
    pb = paper_map[key]
    ptxt = f'P{pb[4]}' if pb[4].startswith('<') else f'P={pb[4]}'
    star = '*' if re.pvalues[v] < 0.05 else ' '
    print(f'  {key: <11s}{re.params[v]:+8.3f} '
          f'[{ci.loc[v, 0]:+.3f}, {ci.loc[v, 1]:+.3f}] {re.pvalues[v]:6.3f}{star}  '
          f'{pb[1]:+.3f} ({ptxt})')
print('  (* は追試で5%有意。右端の欄は原論文 表2 の報告値)')
▼ 実行結果
【追試】個体効果の F 検定: F(46, 506) = 21.42, P = 3.5e-91(原論文: F(46,502)=13.82, P<0.001)
  Breusch-Pagan LM 検定: LM = 7257.8, P = 0.0e+00(原論文: P<0.001 → ランダム効果あり)

【追試】ランダム効果モデル(SSDSE-B-2026、2012〜2023年度、11変数)
  ※ 期間・変数定義が異なるため原論文 表2 と数値は一致しない
  変数               係数          95%信頼区間     P値   原論文表2の係数
  老年人口割合       -0.492 [-0.585, -0.399]  0.000*  -0.656 (P<0.01)
  幼稚園数         +0.158 [+0.077, +0.238]  0.000*  +0.002 (P=0.04)
  小学校数         -0.059 [-0.222, +0.105]  0.482   -0.002 (P=0.53)
  中学校数         -0.495 [-0.841, -0.149]  0.005*  +0.001 (P=0.77)
  高等学校数        -0.528 [-1.060, +0.004]  0.052   -0.024 (P<0.01)
  大学数          -0.782 [-2.404, +0.839]  0.344   -0.074 (P=0.94)
  中学校卒業者進学率    +0.445 [+0.324, +0.567]  0.000*  -0.284 (P=0.04)
  高等学校卒業者進学率   -0.099 [-0.156, -0.042]  0.001*  +0.125 (P<0.01)
  一般病院数        -0.039 [-0.293, +0.216]  0.765   -0.119 (P=0.33)
  一般診療所数       -0.022 [-0.066, +0.022]  0.332   -0.090 (P<0.01)
  歯科診療所数       +0.148 [+0.065, +0.231]  0.000*  +0.110 (P=0.03)
  (* は追試で5%有意。右端の欄は原論文 表2 の報告値)
💡 解説
  • 原論文と同型のモデル Yit = α + ΣβjXj,it + ui + εit を、SSDSE-B-2026 で計算できる11変数(医師数・歯科医師数・看護師数・精神科病院数は未収録のため除外)で推定します。
  • 個体効果の F 検定Breusch-Pagan の LM 検定はどちらも原論文と同じく「都道府県ごとの個体効果が存在する」ことを強く支持しました。
  • ランダム効果モデルは sm.MixedLM(..., groups=都道府県)(変量切片モデル)で推定。老年人口割合(負)・幼稚園数(正)・歯科診療所数(正)は原論文 表2 と同じ向きで有意でした。
  • 一方、高等学校卒業者進学率は原論文と逆向き(負)で有意、中学校卒業者進学率も逆向きでした。期間(2012〜2023 vs 2005〜2016)・変数の分母(総人口 vs 対象年齢人口)・欠けた4変数の影響で結果が変わりうる——追試は「検算」ではないことがよくわかる結果です。
💡 Python TIPS 統計モデルの結果を比べるときは「同じ変数・同じ期間・同じ定義か」をまず確認。1つでも違えば、係数の違いはモデルの誤りではなく設定の違いかもしれません。
追試からの学び 最新データ(2012〜2023年度・11変数)でも、個体効果の存在(F検定・LM検定)は原論文と同じく強く支持され、老年人口割合(負)・幼稚園数(正)・歯科診療所数(正)は同じ向きで有意だった。一方、進学率の係数は逆向きになった。期間も変数定義も違う追試は「検算」にはならないが、どの結果が設定に頑健で、どの結果が敏感かを教えてくれる。
3
人口増加が続いた5都道府県の深掘り(原論文 図2・図3)

回帰結果の解釈を補強するため、原論文は2005〜2016年度の12年間、人口増減率が常に正であった5都道府県——埼玉県・東京都・神奈川県・愛知県・沖縄県——を取り出し、有意だった2つの指標の推移を個別に確認している。

高等学校卒業者進学率(原論文 図2)

高等学校卒業者進学率(高等教育機関への進学率)は日本全体ではここ数年頭打ちとされる(原論文の引用する学校基本調査)。しかしこの5都道府県では概ね増加傾向にあり、2016年度の値は2005年度と比較していずれの都道府県でも上昇していた——高等教育機関への進学率の上昇が人口増加に寄与する可能性を支持する観察である。

人口増加が続いた5都道府県の高等学校卒業者進学率の推移(2012〜2023年度)
図3(追試):5都道府県の高等学校卒業者進学率の推移。SSDSE-B-2026(2012〜2023年度)による実データ追試で、原論文 図2(2005〜2016年度)とは期間が異なる。最近の12年間でも5都道府県すべてで進学率は上昇し続けており、原論文の観察と整合的(東京都 65.1→74.1%、沖縄県 38.2→46.7% など)。
やってみようステップ4: 図3 人口増加が続いた5都道府県の進学率(実データ追試)
📝 コード
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
# ===== ステップ4: 図3 人口増加が続いた5都道府県の高等学校卒業者進学率(実データ追試) =====
# 原論文 図2: 2005〜2016年度に人口増減率が常に正だった5都道府県
# (埼玉・東京・神奈川・愛知・沖縄)の高等学校卒業者進学率の推移。
# ここでは同じ5都道府県を SSDSE-B-2026(2012〜2023年度)で追試する。
five = ['埼玉県', '東京都', '神奈川県', '愛知県', '沖縄県']
colors5 = ['#1565C0', '#C62828', '#2E7D32', '#6A1B9A', '#E65100']
fig, ax = plt.subplots(figsize=(9, 5))
for pref, c in zip(five, colors5):
    sub = df[df['都道府県'] == pref].sort_values('年度')
    ax.plot(sub['年度'], sub['高等学校卒業者進学率'], marker='o', ms=4, color=c, label=pref)
ax.set_xlabel('年度')
ax.set_ylabel('高等学校卒業者進学率 [%]')
ax.set_title('図3(追試)人口増加が続いた5都道府県の高等学校卒業者進学率\n'
             '(SSDSE-B-2026、2012〜2023年度。原論文 図2 は 2005〜2016年度)', fontsize=11)
ax.legend(loc='lower right', fontsize=10)
ax.grid(alpha=0.3)
fig.tight_layout()
fig.savefig(f'{FIG_DIR}/2019_U2_fig3.png', bbox_inches='tight')
plt.close(fig)
print('【図3】5都道府県の高等学校卒業者進学率(2012→2023年度、実データ)')
for pref in five:
    sub = df[df['都道府県'] == pref].sort_values('年度')
    print(f"  {pref}: {sub['高等学校卒業者進学率'].iloc[0]:.1f}% → "
          f"{sub['高等学校卒業者進学率'].iloc[-1]:.1f}%")
▼ 実行結果
【図3】5都道府県の高等学校卒業者進学率(2012→2023年度、実データ)
  埼玉県: 56.4% → 65.8%
  東京都: 65.1% → 74.1%
  神奈川県: 60.2% → 69.4%
  愛知県: 58.3% → 64.0%
  沖縄県: 38.2% → 46.7%
💡 解説
  • 原論文 図2 と同じ5都道府県(埼玉・東京・神奈川・愛知・沖縄)について、SSDSE-B-2026 の実データで高等学校卒業者進学率の推移を描きます。
  • 期間は 2012〜2023年度(原論文は 2005〜2016年度)ですが、5都道府県すべてで進学率が上昇し続けていることが確認でき、原論文の観察と整合的です。
  • df[df['都道府県'] == pref] — 都道府県名でパネルデータから1本の時系列を取り出す基本操作。

医師数(原論文 図3)——グラフは原論文参照

同じ5都道府県について、原論文 図3 は人口10万人あたり医師数の推移を示している。医師数は SSDSE-B-2026 に収録されていないため本ページでは再現できない(グラフは原論文参照)。原論文が図3から読み取った内容は:

「12年間常に正」は今も成り立つか(実データ検証)

では、この「人口増加が続く5都道府県」という構図は最近のデータでも維持されているのだろうか。SSDSE-B-2026(2012〜2023年度)で同じ判定をやり直してみる。

2023年度の都道府県別人口増減率ランキング
図4:2023年度の都道府県別人口増減率(SSDSE-B-2026から計算した実データ)。プラスは東京都(+0.56)のみ。オレンジは原論文の「12年間常に正」だった5都道府県のうちマイナスに転じた県(沖縄 −2.22、神奈川 −2.53、埼玉 −3.32、愛知 −4.84)。2012〜2023年度を通して常に正だった都道府県は存在しない
📊 図の読み方
横棒
2023年度の人口増減率(人口千対)。右(正)=人口増加、左(負)=人口減少。
青=プラスの都道府県。オレンジ=原論文の5都道府県のうちマイナスの県。灰=その他。
示唆
原論文の分析期間(2005〜2016年度)に比べ、人口減少はさらに全国に広がった。分析期間が変わると「人口増加県」の顔ぶれ自体が変わる——結論を最新データで検証し続けることの大切さを示す。
やってみようステップ5: 図4 「12年間常に正」は今も成り立つか(実データ検証)
📝 コード
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
# ===== ステップ5: 図4 2023年度の人口増減率ランキング+「常に正」の検証(実データ) =====
always_pos = [p for p, s in df.groupby('都道府県')['人口増減率'] if (s > 0).all()]
print('【検証】2012〜2023年度に人口増減率が常に正だった都道府県:',
      '、'.join(always_pos) if always_pos else 'なし')
latest = df[df['年度'] == 2023].sort_values('人口増減率')
fig, ax = plt.subplots(figsize=(8.5, 11))
cols = ['#1565C0' if v > 0 else ('#E65100' if p in five else '#B0BEC5')
        for v, p in zip(latest['人口増減率'], latest['都道府県'])]
ax.barh(range(len(latest)), latest['人口増減率'], color=cols, height=0.65)
ax.set_yticks(range(len(latest)))
ax.set_yticklabels(latest['都道府県'], fontsize=9)
ax.axvline(0, color='#555', lw=0.8)
ax.set_xlabel('人口増減率 [人口千対](自然増減率+社会増減率)')
ax.set_title('図4:2023年度の都道府県別人口増減率(SSDSE-B-2026 から計算した実データ)\n'
             '青=プラス / オレンジ=原論文の「12年間常に正」だった5都道府県のうちマイナスの県', fontsize=11)
ax.grid(axis='x', alpha=0.3)
fig.tight_layout()
fig.savefig(f'{FIG_DIR}/2019_U2_fig4.png', bbox_inches='tight')
plt.close(fig)
top3 = latest.tail(3)[['都道府県', '人口増減率']].iloc[::-1]
print('【図4】2023年度の人口増減率 上位3:',
      ' / '.join(f'{r.都道府県} {r.人口増減率:+.2f}' for r in top3.itertuples()))
print('  原論文の5都道府県の2023年度値:',
      ' / '.join(f"{p} {latest.set_index('都道府県').loc[p, '人口増減率']:+.2f}" for p in five))
▼ 実行結果
【検証】2012〜2023年度に人口増減率が常に正だった都道府県: なし
【図4】2023年度の人口増減率 上位3: 東京都 +0.56 / 沖縄県 -2.22 / 神奈川県 -2.53
  原論文の5都道府県の2023年度値: 埼玉県 -3.32 / 東京都 +0.56 / 神奈川県 -2.53 / 愛知県 -4.84 / 沖縄県 -2.22
💡 解説
  • (s > 0).all() — その都道府県の人口増減率が全年度で正なら True。原論文の「2005〜2016年度の12年間常に正であった5都道府県」の判定を 2012〜2023年度でやり直します。
  • 結果は「なし」。原論文の5都道府県のうち2023年度もプラスなのは東京都だけで、埼玉・神奈川・愛知・沖縄もマイナスに転じています。人口減少がこの10年でさらに全国に広がったことが実データからわかります。
  • これは原論文の誤りではなく、「どの期間のデータで分析するか」で結論の見え方が変わるという、パネルデータ分析の大事な教訓です。

考察:教育・医療への政策的含意(原論文 5節)

教育分野:幼稚園数・進学率

幼稚園数の増加は人口増加と有意に関連していた。原論文は、2015年4月施行の子ども・子育て支援新制度(認定こども園・幼稚園・保育所・地域型保育の「量的拡充」と質の向上を掲げる)に触れ、幼稚園を始めとする子どもの養育施設の充実が「子どもを産み育てやすい環境づくり」につながり、人口増加に結びついたのではないかと解釈している。

中学校卒業者進学率の「負の係数」をどう読むか(原論文の慎重な解釈) 中学校卒業者進学率の減少が人口増加と関連する、という一見不思議な結果について、原論文は「12年間を通じて96〜97%の高い値で推移しており、他の説明変数に比べて僅かな変化が結果に大きく影響したのではないか」と述べ、「中学校卒業者進学率の減少が人口増加につながるとは結論し難い」と明確に留保している。有意=実質的に意味がある、ではない——統計結果の誠実な読み方の好例である。

高等学校卒業者進学率の上昇は人口増加と有意に関連しており(係数0.125、P<0.01)、5都道府県の推移(図3)とも整合的だった。高等教育機関への進学率の上昇が人口増加に寄与する可能性が示唆された。

健康・医療分野:歯科診療所数・医師数

人口10万人あたりの歯科診療所数(係数0.110、P=0.03)や医師数(係数0.030、P<0.01)の増加が人口増加に寄与する可能性が示唆された。急速に少子高齢化が進む我が国では医療・介護の提供体制の整備が喫緊の課題であり、医師偏在——特に地方での医師不足が深刻な問題となっている。原論文は、人口増加が続いた5都道府県が概ね大都市を含み医師数を十分確保できたことを踏まえ、「これら以外の都道府県、特に地方でも同様に医師数を増やしていくための政策を推進していくことが必要」と提言している。

一般診療所数の「負の係数」について 一般診療所数(係数−0.090、P<0.01)は医師数と逆にで有意だった。原論文の1ページ目の概要では「一般診療所数、医師数の増加などが人口増加に影響している」とまとめられているが、表2の報告値では一般診療所数の係数は負である(本文4節の記述も「一般診療所数の減少」が人口増加と関連、とする)。数値の解釈はあくまで表2の報告値(負)を正とし、係数の符号どうしが混同されやすい例として覚えておきたい。医師数(人的資源)と診療所数(施設数)は相関しつつも別の動きをする(補表2で r=0.705)。

まとめ:研究の強みと限界(原論文 5-2節)

💪 本研究の強み
  • 単年度でなく過去12年間の国の統計データを用い、各社会生活統計指標の経時的な変化も考慮して多変量解析を行った。
  • ランダム効果モデルを用いることで、都道府県間の違い(個体効果)を考慮できた。
  • 明らかになった要因は、少子高齢化・人口減少を克服するための効果的な政策立案の基礎資料になりうる。
⚠️ 研究限界(原論文自身の記述)
  • ① 経時的に(毎年度)調査されていない変数は、原則として解析に用いることができなかった。
  • ② 各社会生活統計指標と人口増減の関連について、因果の逆転(人口が増えたから施設・人員が増えた可能性)に関する検討を十分行えなかった。
この論文から学べる「型」
  1. 問いを立てる:人口増減の決定要因を、単年度でなく複数年度の変化から探る。
  2. 変数を定義する:人口増減率=自然増減率+社会増減率。指標は人口10万対に標準化。
  3. モデルを選ぶ:固定効果とランダム効果の両方を推定し、F検定・LM検定・ハウスマン検定で選択の根拠を示す。
  4. 結果を誠実に読む:有意でも実質的に解釈しがたい係数(中学校卒業者進学率)は正直に留保する。
  5. 限界を明示する:因果の逆転・使えなかった変数を自分から書く。

参考文献(原論文 6節)

⚠️ よくある誤解と注意点

この論文(とパネルデータ分析全般)を読むときに、初心者が陥りやすい誤解を整理します。

誤解1:「有意な係数=因果関係が証明された」
本研究は観察データの分析であり、「医師数を増やせば人口が増える」という因果関係を証明したわけではない。原論文自身が研究限界として「因果の逆転に関する検討を十分行えなかった」と明記している——人口が増えて(若い世帯が流入して)需要が伸びたから診療所や医師が増えた、という逆向きの経路も十分ありうる。パネルデータは横断データより因果に迫りやすいが、それでも「関連が見られた」以上のことは言えない。
誤解2:「係数が大きい変数ほど重要」
表2の係数は変数の単位に依存する。老年人口割合の係数−0.656は「1%ポイント上昇で人口増減率が0.656(千対)低下」、幼稚園数の0.002は「3-5歳人口10万人あたり幼稚園1園の増加で0.002上昇」という意味で、そのまま大小比較はできない。重要度を比べたければ標準化係数や「現実的にありうる変化幅×係数」で考える必要がある。
誤解3:「ハウスマン検定で有意でなかったから、ランダム効果モデルが正しい」
ハウスマン検定のP=0.150は「ランダム効果と説明変数の相関という矛盾の証拠が見つからなかった」ことを意味するだけで、ランダム効果モデルの正しさを積極的に証明したわけではない。帰無仮説を棄却できないことと帰無仮説が真であることは別物。だからこそ原論文は固定効果モデルの結果(補表1)も併記し、両モデルで傾向が一致することを確認している。
誤解4:「統計的に有意なら、実質的にも意味がある」
中学校卒業者進学率は「減少が人口増加と関連」(P=0.04)と有意だったが、原論文はこの変数が12年間96〜97%でほぼ動かないことを踏まえ、「結論し難い」と自ら留保した。ほとんど変化しない変数の係数は、僅かな揺らぎに引きずられて不安定になりうる。P値だけでなく変数の分布・変化幅・解釈可能性を必ずセットで確認しよう。
誤解5:「追試で違う結果が出た=原論文が間違い」
本ページの追試(2012〜2023年度・11変数)では高等学校卒業者進学率の係数が原論文と逆向きになった。これは原論文の誤りを示すものではない。期間も、使える変数も、変数の分母も違うからだ。実際、「12年間常に人口増減率が正」の都道府県は最近の12年間では1つもなくなっており、データが描く日本自体が変わっている。追試は「検算」ではなく「結果がどの条件にどれだけ敏感かを知る実験」として読むのが正しい。

📖 用語集(この記事に出てくる統計用語)

本文中の 下線付き用語 はクリックすると詳しい解説がポップアップします。ここでは特に重要な用語をまとめます。

パネルデータ
同じ対象(ここでは47都道府県)を複数時点(2005〜2016年度)にわたって追跡したデータ。横断データ(1時点×多数対象)と時系列データ(1対象×多時点)の両方の情報を持ち、「対象ごとの見えない体質」を統制した分析ができる。
個体効果(individual effect)
モデル式の ui。都道府県ごとに固有で、時間を通じて変わらない要因(気候・地理・歴史・文化など、測定されていないもの全部)をまとめて表す項。
固定効果モデル
ui を「都道府県ごとの定数」として扱うモデル。個体効果が説明変数と相関していても一致推定できるのが強み。時間を通じて変わらない変数の効果は識別できない。
ランダム効果モデル
ui を「平均0の確率変数」として扱うモデル(審査会コメントの「変量効果モデル」も同義)。個体効果と説明変数が無相関という前提が必要だが、その前提が成り立つなら固定効果より効率的(推定のばらつきが小さい)。
Breusch-PaganのLM検定
「帰無仮説:ランダム効果は存在しない」を検定する。棄却されれば(原論文ではP<0.001)、プーリングOLSでなくパネルモデルを使うべきという証拠になる。
ハウスマン検定
「帰無仮説:ランダム効果と説明変数は無相関」を検定する。棄却されれば固定効果モデルを、棄却されなければ(原論文ではP=0.150)ランダム効果モデルを採用するのが定石。
人口増減率
自然増減率(出生−死亡)と社会増減率(転入−転出)の和。単位は人口千対(日本人人口1000人あたりの人数)。人口の増減を「自然要因」と「移動要因」に分解して捉えられる。
老年人口割合
総人口に占める65歳以上人口の割合。本研究では高齢化の影響を調整するための統制変数として投入され、負で有意(−0.656)だった。
95%信頼区間
推定の不確かさの幅。区間が0をまたがないことと、5%水準で有意(P<0.05)はほぼ同じ意味になる。図2のフォレストプロットはこの読み方を視覚化したもの。
社会生活統計指標
総務省統計局が都道府県別に整備している統計指標体系(人口・教育・医療など分野別、A03503のようなコード付き)。SSDSE-B はここから代表的な指標を抜き出した教育用データセット。

📐 使っている手法をわかりやすく解説

統計手法について「何のためか」「結果をどう読むか」を初心者向けに解説します。

◆ 統計の基本概念(この論文を読む前提)

🔍 なぜ「単年度の重回帰」ではダメなのか
何?
1年分の47都道府県データで重回帰すると、標本は47しかなく、しかも「都道府県ごとの見えない体質」(気候・歴史・産業構造…)が誤差に混ざる。
パネルの利点
47都道府県×12年度=564観測に増え、さらに個体効果 ui を明示的にモデル化することで「体質の違い」と「指標の変化の効果」を切り分けられる。
この論文では
先行研究の多くが単年度解析だったことを踏まえ、「経時的変化も考慮した解析」を行うことが研究の動機そのものになっている(原論文 1節)。
読み方
パネル分析の係数は「同じ都道府県の中で指標が変化したとき、人口増減率がどう変化するか」というニュアンスを帯びる(特に固定効果モデル)。

◆ この論文で使われている手法

📊 パネルデータ分析(重回帰の拡張)
何?
Yit = α + ΣβjXj,it + ui + εit という形で、通常の重回帰に個体効果 ui を加えたモデル。
どう使う?
本論文では15の社会生活統計指標を説明変数、人口増減率を被説明変数として、47都道府県×12年度の564観測で推定(Stata/MP 15.0)。
何がわかる?
都道府県固有の観測できない要因を統制したうえで、各指標と人口増減率の関連を定量化できる。
結果の読み方
係数・95%信頼区間・P値のセットで読む(表2・図2)。単位が変数ごとに違うので係数の大小比較には注意。
⚠️ 注意点
(1) 因果の逆転に弱い——同時点の X と Y の回帰なので「人口が増えたから施設が増えた」経路を排除できない(原論文も限界として明記)。ラグ付き説明変数や操作変数が発展形。(2) 説明変数間の強い相関——小・中・高等学校数は r>0.8(補表2)で、個々の係数の切り分けは難しい。(3) 毎年度観測できる変数しか使えない——調査周期の長い変数は落ちる(原論文の限界①)。
🏔 固定効果モデル(FE)
何?
個体効果 ui を「都道府県ごとの定数(ダミー変数)」とみなして推定するモデル。各都道府県の平均からの偏差だけを使うイメージ。
どう使う?
本論文では補表1として推定結果を報告。「帰無仮説:全ての都道府県で ui=0」の検定は F(46,502)=13.82、P<0.001 で棄却され、個体効果の存在が示された。
何がわかる?
時間を通じて変わらない都道府県の特徴をすべて統制した「県内の変化ベース」の効果。
結果の読み方
ランダム効果モデル(表2)と符号・有意性がほぼ一致しており、結論の頑健性の根拠になっている。
⚠️ 注意点
(1) 時間不変の変数は推定不能——「面積」「地理的位置」などの効果は個体効果に吸収される。(2) 変動の少ない変数の係数は不安定——県内でほとんど動かない変数(例:中学校卒業者進学率)は誤差に敏感。(3) 自由度を47個の定数に使う——観測数に対して個体数が多いと効率が落ちる。効率を重視するなら(前提を検定したうえで)ランダム効果を検討する。
🎲 ランダム効果モデル(RE・変量効果モデル)
何?
個体効果 ui を「平均0・分散σ²の確率変数」とみなして推定するモデル。県間のばらつきも情報として使う。
どう使う?
本論文の主たる結果(表2)。ハウスマン検定で前提が確認できたため、「結果の解釈ではランダム効果モデルによる推定値を主に用いた」(原論文 4節)。
何がわかる?
個体効果を確率的に扱うぶん推定が効率的になり、信頼区間が狭くなる。時間不変の変数も投入できる。
結果の読み方
表2の8つの有意変数が本論文の中心的な発見。固定効果の結果と見比べて頑健性を確かめる。
⚠️ 注意点
(1) 「個体効果と説明変数が無相関」という強い前提が必要——成り立たないと係数に偏りが出る。必ずハウスマン検定などで確認する。(2) 前提が微妙なときは FE と併記——本論文のように両方を報告するのが誠実な作法。(3) 「ランダム」は無作為抽出の意味ではない——個体効果を確率変数としてモデル化するという意味。
🧪 Breusch-Pagan の LM 検定
何?
「帰無仮説:ランダム効果は存在しない(個体効果の分散=0)」を、プーリングOLSの残差から検定するラグランジュ乗数(LM)検定。
どう使う?
本論文では P<0.001 で帰無仮説が棄却され、ランダム効果の存在——つまり「都道府県をひとまとめにした単純な回帰では不適切」——が示された。
何がわかる?
プーリングOLSとパネルモデルのどちらを使うべきかの判断材料。
結果の読み方
棄却=パネル構造を無視してはいけない。棄却されなければプーリングOLSでも大きな問題はない。
⚠️ 注意点
(1) 「ランダム効果 vs 固定効果」を選ぶ検定ではない——あくまで「個体効果の分散が0か」の検定。FE/REの選択はハウスマン検定の仕事。(2) 大標本ではほぼ必ず棄却される——本ページの追試でも LM=7257.8 と極端な値になった。棄却自体より効果の大きさ(個体間分散の割合)を見る方が情報量が多い。
⚖️ ハウスマン検定
何?
「帰無仮説:ランダム効果と説明変数は無相関」を、FE推定値とRE推定値の乖離の大きさで検定する。乖離が大きい=REの前提が怪しい。
どう使う?
本論文では P=0.150 で帰無仮説は棄却されず、「ランダム効果モデルの前提は満たされた」としてREを採用した。
何がわかる?
固定効果とランダム効果のどちらの推定値を主に報告すべきかの、広く使われる判断基準。
結果の読み方
P<0.05 なら固定効果を採用。P≥0.05 ならランダム効果を採用してよい(ただし「証明」ではない)。
⚠️ 注意点
(1) 棄却されない=REが正しい、ではない——検出力の問題で相関を見逃している可能性は残る。(2) 検定統計量が負になるなど数値的に不安定な場合がある——ソフトウェアによって頑健版(Wooldridge流の補助回帰版)を使う。(3) 結論がP値ぎりぎりのときは両モデルを併記——本論文が補表1にFEを載せているのはこの作法に適う。

🚀 発展の可能性(結果 X → 新仮説 Y → 課題 Z)

この研究をさらに発展させるための3つの方向性を示します。「今回わかったこと(X)」から「次に検証すべき仮説(Y)」を立て、「具体的に何をするか(Z)」まで考えてみましょう。

① 因果の逆転への挑戦:医師数は原因か結果か
結果 X
医師数の増加が人口増加と有意に関連していた(表2)。しかし原論文自身が「因果の逆転の検討が不十分」と明記している。
新仮説 Y
「t年度の医師数の増加が、t+1年度以降の人口増減率を高める」——時間的先行を明示した仮説なら、逆転の可能性を一部切り分けられる。
課題 Z
説明変数に1〜3年のラグを付けたパネル回帰や、医学部定員政策(地域枠拡大など)を利用した自然実験的な分析。e-Stat の医師・歯科医師・薬剤師統計から最新の医師数を取得して期間を延長する。
② 人口増減率の分解:自然増減と社会増減で効く要因は違うか
結果 X
本論文の被説明変数は「自然増減率+社会増減率」の合計だった。幼稚園数は出生(自然増)に、進学率や医師数は移動(社会増)に効いている可能性がある。
新仮説 Y
「教育・医療の各指標は、自然増減率と社会増減率に対して異なる経路で影響する」。
課題 Z
被説明変数を自然増減率と社会増減率に分けて同じモデルを2本推定し、係数を比較する。SSDSE-B だけで今すぐ実行できる(本ページのスクリプトの拡張課題)。
③ 空間的な細分化:市区町村レベルでも成り立つか
結果 X
都道府県単位の分析では、県内の大都市と過疎地域の違いが平均されてしまう。
新仮説 Y
「医療・教育インフラの効果は、都道府県内の市区町村間の人口移動においてより強く現れる」。
課題 Z
SSDSE-A(市区町村データ)や国勢調査の市区町村人口を使った分析。時系列が必要なら e-Stat の市区町村別統計を複数年分結合する(データ整備が主戦場になる)。

🎯 自分でやってみよう(5つのチャレンジ)

このページのスクリプト(code/2019_U2_yushu.py)を出発点に、難易度順の5つの課題に挑戦してみましょう。

難易度 ★☆☆☆☆
CH1. 別の指標の経年変化を描く
ステップ2の items リストを書き換えて、幼稚園数・小学校数・一般病院数など別の指標の経年変化(平均±標準偏差)を描いてみよう。原論文が観察した「幼稚園〜高等学校数の減少」「一般病院数の一貫した減少」は 2012〜2023年度でも見えるだろうか?
難易度 ★★☆☆☆
CH2. 「常にプラス」の判定期間を変えてみる
ステップ5の判定を「直近5年間(2019〜2023年度)」に変えると、常に正の都道府県はあるか? 「12年間で1度でも正になった県」はいくつあるか? (s > 0).all().any() や期間スライスに変えて確かめよう。
難易度 ★★★☆☆
CH3. 自然増減率と社会増減率に分けて回帰する
ステップ6の被説明変数 人口増減率自然増減率社会増減率 に差し替えて2本のランダム効果モデルを推定し、係数を比較しよう。幼稚園数はどちらに効くか? 進学率は?(発展の可能性②の実装)
難易度 ★★★★☆
CH4. 固定効果モデルを推定して表2と補表1のように並べる
ステップ6の LSDV(都道府県ダミー入りOLS)の係数と、MixedLM(ランダム効果)の係数を1つの表に並べ、原論文の「表2 vs 補表1」のような比較表を作ろう。どの変数の係数が2モデルで大きくずれるか? ずれる変数はハウスマン検定的に何を意味するか?
難易度 ★★★★★
CH5. ラグ付きモデルで「因果の逆転」に迫る
説明変数をすべて1年前の値(groupby('都道府県').shift(1))に置き換えたモデルを推定し、同時点モデルと係数を比較しよう。医師数や診療所数の係数はどう変わるか? それでも因果とは言い切れない理由を、自分の言葉で説明できれば合格。
💡 ヒント: 詰まったら本サイトの他の論文(同じパネルデータ分析を使っている)のスクリプトをコピーして組み合わせるのが効率的です。手法ガイド・用語集も参考に。

💼 この手法は実社会でこう使われている

本論文で学んだパネルデータ分析は、研究の世界だけでなく、行政・企業・NPO の現場でも様々に活用されています。具体的なシーンを紹介します。

🏛️
行政の政策評価(EBPM)
都道府県・市区町村の政策効果を「自治体×年度」のパネルで検証するのは EBPM(証拠に基づく政策立案)の定番。子育て支援・移住促進・医療提供体制などの施策評価で、本論文と同じ固定効果/ランダム効果モデルが使われます。
🏥
医療・公衆衛生
医師偏在対策(地域枠・派遣制度)の効果検証、医療資源と健康アウトカムの関連分析は「地域×年」パネルの主戦場。本論文の著者(医学部生)の問題意識そのものが、医療政策研究の現場に直結しています。
🏢
企業の出店・市場分析
店舗×月のパネルで「地域の人口構成・競合状況が売上に与える影響」を推定するなど、店舗網をもつ企業の意思決定にパネル分析は広く使われます。店舗固有の立地の良さを固定効果で吸収するのがコツ。
💰
経済・金融の実証分析
国×年、企業×年のパネルは計量経済学の標準装備。最低賃金と雇用、金融政策と投資などの実証研究は、本論文と同じ「FE/RE推定+ハウスマン検定」の作法で行われています。
🎓
教育政策の研究
学校×年度のパネルで少人数学級・ICT導入の効果を測る研究が典型例。本論文の「進学率と人口動態」というテーマは、教育経済学でも活発に研究されています。
📰
データジャーナリズム
「人口減少の要因」「地方消滅」などの報道企画では、都道府県・市区町村の複数年データを使った分析が核になります。本論文のように定義(自然増減・社会増減)を明示する姿勢が信頼される記事の条件です。

🤔 よくある質問(読者からの想定Q&A)

この論文を読んで初心者が抱きやすい疑問に、教育的観点から答えます。

Q1. この分析、自分でもできますか?
できます。SSDSE-B は無料で公開されており、Python の pandas と statsmodels があれば、本ページのスクリプトで人口増減率の計算からランダム効果モデルの推定まで一通り体験できます。ただし医師数など4変数は現行 SSDSE-B に未収録なので、原論文の15変数モデルを完全に再現するには e-Stat から追加取得が必要です。
Q2. 固定効果とランダム効果、結局どちらを使えばいいのですか?
迷ったらまず両方推定し、ハウスマン検定で判断するのが定石です(本論文の手順そのもの)。検定が棄却されれば固定効果、されなければランダム効果。さらに本論文のように両方の結果を併記して「符号と有意性が一致する」ことを示せば、どちらの読者も納得させられます。
Q3. 結論は本当に「因果関係」を示していますか?
いいえ、そこは原論文自身が慎重です。研究限界として「因果の逆転に関する検討を十分行えなかった」と明記しています。人口が増えるから診療所・学校が増える、という逆の経路もありえます。因果に迫るには、ラグ付きモデル、操作変数法差の差法などの追加の工夫が必要です(審査会コメントも先行研究の因果分析を参照するよう勧めています)。
Q4. なぜ「一般診療所数の減少」が人口増加と関連するのですか?
正直に言えば、原論文もこの符号のメカニズムを深くは説明していません。考えられる解釈としては、診療所数(人口10万対)の分母は人口なので、人口が増える地域では相対的に「10万人あたり診療所数」が下がる、という機械的な関係(因果の逆転の一種)があります。医師数(正で有意)と診療所数(負で有意)の符号が割れたこと自体が、「施設の数」と「人的資源」を区別して考える必要性を教えてくれます。
Q5. データの最新版を使うとどうなりますか?
本ページのステップ6がまさにその実験です。2012〜2023年度・11変数の追試では、老年人口割合・幼稚園数・歯科診療所数は原論文と同じ向きで有意でしたが、高等学校卒業者進学率は逆向きになりました。また「12年間常に人口増減率が正」の都道府県は1つもなくなりました(2023年度にプラスなのは東京都のみ)。結論は期間に依存します——それ自体が新しい研究テーマになります。

✅ 理解度チェック(4問)

この論文を理解できたか、クリックで確認しましょう。間違えても解説が出ます。

🐍 ブラウザで動かす — インストール不要でこの論文の分析を再現する

このページの分析は、この画面の中でそのまま実行できます。 Python をインストールする必要も、CSV をダウンロードする必要もありません。 下のセルの 「▶ ブラウザで実行」 を上から順に押すか、 「▶ 最初から全部実行」 で一気に流してください。 表示されるのは、本文の図表とまったく同じ計算の結果です (動かしているのは再現スクリプト code/2019_U2_yushu.py そのもの)。

コードは書き換えられます。「✏️ 書き換える」で数字や変数を変えて ▶ を押すと、 結果がどう変わるかをその場で確かめられます(元に戻すボタンつき)。 ページを開いた時点で裏で実行環境の準備が始まっているので、待ち時間はほとんどありません。 初回だけ実行環境の取得にインターネット接続が必要です。