この教材は原論文と同じデータを読み込み、同じ手順で計算し直しています。画面に出る数値と図は、あなたのブラウザがその場で計算した結果です。
⚠ ただし一部は再現していません:被説明変数の学力偏差値のほか、 通塾率・不登校率・自治体教育費・教員給与・教員経験年数・進学率が SSDSE-B に無いため、 原論文の回帰そのものは再現していません。 収録されている対照変数のみで再計算しています。
| 原論文が使ったデータ | SSDSE-B・学校教員統計調査・全国学力・学習状況調査 分析単位:都道府県 中核手法:パネルデータ分析・固定効果法・変量効果法・Pooled OLS・Hausman 検定 |
|---|---|
| この教材が使うデータ |
|
| 原論文(PDF) | 都道府県別パネルデータを用いた学力の決定要因分析 特別賞/桑名 聖人(早稲田大学政治経済学部政治学科) 豊野 拓巳・吉田 賢汰(早稲田大学政治経済学部経済学科) |
▶ ここに書いてある分析は、ページ下部の「🐍 ブラウザで動かす」でそのまま実行できます(インストール不要)。動かしているのは code/2021_U5_3_shorei.py(386 行)そのものです。
このページのクラスサイズのランキング(図3)とパネル推定手順のデモ(図4)は、以下の手順で自分で再現できます。コードの編集は不要です。(固定効果法の推定係数=図1、F検定・Hausman検定=図2は、被説明変数の学力偏差値・通塾率・不登校率などがSSDSE-Bに無いため、原論文の報告値を可視化します。)
data/raw/ フォルダに入れます。html/figures/ に自動保存されます。
2021年度の文教費予算は約4兆216億円、世帯年収に占める教育費は3割を超えるなど、日本の教育投資は莫大である。教育の目的の一つは学力の形成にあり、「どの要因が学力形成に大きく影響するのか」を知ることは、能率的な教育政策の立案や世帯の教育投資の促進にとって有用だ。人的資本の蓄積が経済発展を導くという理論もあり、学力形成要因を分析する社会的意義は大きい。
先行研究には、大学・大学院卒業者の割合が学力と強く正相関する(土屋, 2014)、離婚率や不登校率が児童の学力と相関する(志水, 2014)、気温が高いとテストスコアが下がる(Zivin et al., 2020)といった知見がある。しかし多くはクロスセクション(1時点)のOLS分析にとどまり、各都道府県に固有で観測できない要因(教育文化など)を制御できず、内生性の問題が残る。そこで本研究は4時点の都道府県別パネルを用い、内生性に対処しながら学力の決定要因を分析する。
大学生・一般の部 全国学力・学習状況調査・SSDSE-B パネルデータ回帰 固定効果法・変量効果法 F検定・Hausman検定・VIF
被説明変数は、国立教育政策研究所が実施した全国学力・学習状況調査(小学6年生)の国語・算数の平均正答率から、年ごとに偏差値を計算したもの。私立比率が都道府県で大きく異なる中学3年生は上方バイアスを避けるため除外している。分析対象は、3年ごとの学校教員統計調査に合わせた2007・2010・2013・2016年の4時点。2016年の熊本県は熊本地震で調査見送りのため欠損し、全体はアンバランスパネルとなっている。
| 領域 | 説明変数 | 仮説(学力への符号) | SSDSE-B収録 |
|---|---|---|---|
| x₁ 個人属性・ 家庭/社会環境 | 世帯教育費 | + | ○(教育費) |
| 教養娯楽費 | + | ○ | |
| 通塾率 | + | ×(児童質問紙) | |
| 不登校率 | − | × | |
| 離婚率(1年ラグ) | − | ○(離婚件数) | |
| 大学進学率・大学院進学率 | + | ×(独自定義) | |
| 標準価格(住宅地) | + | ○ | |
| (通塾率は保護者の姿勢の代理でもある) | — | — | |
| x₂ 学校が供給 する教育の質 | 教員給与 | + | ×(学校教員統計) |
| 教員経験年数 | + | × | |
| クラスサイズ(教員一人あたり児童数) | −(少人数学級が有効) | ○(児童数/教員数) | |
| 自治体教育費 | + | ×(地方教育費調査) | |
| x₄ その他 | 年平均気温 | − | ○ |
被説明変数 Yᵢₜ は第 i 都道府県・t 年度のテストスコア偏差値。式は Yᵢₜ = α + Σβⱼ Xⱼ,ᵢₜ + β₁₃ X₁₃,ᵢ₍ₜ₋₁₎ + Fᵢ + Uᵢₜ。ここで Fᵢ が各都道府県の「個別効果」(例:教育文化)で、観測できず時間を通じて不変。唯一のラグ付き変数は離婚率(学力の測定に先行する必要があるため1年前の値)。国語・算数それぞれで POLS・固定効果法・変量効果法を推定し比較した。
個別効果 Fᵢ が説明変数と相関していると、これを無視したPOLSの係数は内生性バイアスを持つ。固定効果法は各都道府県の平均を差し引く(within変換)ことで、時間を通じて不変な Fᵢ をまるごと消去する。内生性が無い場合でも、同一県の異時点の誤差に自己相関が生じうるため、変量効果法での推定も併せて検討する。
F検定で「個別効果が存在するか」を判定(帰無仮説:個別効果なし=POLSでよい)。存在すれば固定効果法か変量効果法のいずれか。どちらを採るかはHausman検定(帰無仮説:個別効果と説明変数は無相関)で決める。棄却されれば固定効果法、されなければより効率的な変量効果法を選ぶ。
原論文が固定効果法で有意と報告した係数を、著者自身の換算(「1単位あたりの偏差値変化」)で国語・算数に並べて可視化する。この図は再計算ではなく、原論文(表4・本文)の報告値をそのまま転記したものである(被説明変数の学力偏差値・通塾率・不登校率・自治体教育費はSSDSE-Bに無いため)。
=== [2] 報告値:固定効果法の推定係数(原論文 表4・本文)=== 変数 単位 国語Δ偏差値 算数Δ偏差値 有意(国/算) 世帯教育費 +1万円 4.00 3.00 ** / n.s. 通塾率 +1% 0.85 0.94 ** / ** 不登校率 +1人/千人 2.51 3.59 ** / ** クラスサイズ +1人/教員 2.69 0.00 * / n.s. 自治体教育費 +10万円 2.00 1.00 * / n.s. ※ 生の係数(国語/算数): 世帯教育費 0.0004/**, 通塾率 0.8489/0.9414, 不登校率 2.5092/3.5927, クラスサイズ 2.6857/非有意, 自治体教育費 0.00002/非有意 ※ 国語・算数で共通して正に有意なのは通塾率と不登校率。 ※ クラスサイズは負を予想する先行研究が多い中、国語で"正に有意"という真逆の結果。 これらはすべて原論文の報告値であり、本スクリプトで計算し直したものではない。
なぜ固定効果法で解釈したのか。著者はF検定(個別効果の有無)とHausman検定(固定効果か変量効果か)の統計量を国語・算数それぞれで報告している。この図はその検定統計量(報告値)を可視化したものである。
=== [3] 報告値:F検定・Hausman検定(原論文 5.1・5.2)=== 個別効果の有無 → F検定。固定効果か変量効果か → Hausman検定。 教科 F検定 F値 Hausman χ² 採択モデル 国語 7.82 36.86 固定効果法(両検定とも1%で有意) 算数 7.50 45.35 固定効果法(両検定とも1%で有意) F検定:p値は少なくとも小数第4位まで0 → 1%水準で個別効果が存在(POLSは不適)。 Hausman検定:帰無仮説「個別効果と説明変数は無相関」を1%水準で棄却 → 固定効果法を採択。 補足(符号反転の報告):POLSで負に有意だった通塾率・不登校率が、固定効果法では正に有意へ。 POLSで正に有意だった大学進学率・標準価格(住宅地)や負に有意だった離婚率は固定効果法で非有意。 → 単純なPOLSの内生性バイアスが固定効果法である程度克服された、と著者は解釈。
以下の係数・有意性はすべて原論文の報告値(固定効果法)である。
| 変数 | 国語(偏差値変化) | 算数(偏差値変化) | 著者の解釈 |
|---|---|---|---|
| 通塾率 | +0.85(**) | +0.94(**) | 塾で先取り・補習が進み、学校の勉強の定着が上がる(仮説通り) |
| 不登校率 | +2.51(**) | +3.59(**) | 不登校児はテストを受けない傾向。受験者の平均が押し上げられる可能性(仮説と逆) |
| 変数 | 国語 | 算数 | 著者の解釈 |
|---|---|---|---|
| 世帯教育費 | +4.0(**, +1万円あたり) | n.s.(p≈0.135) | 家庭の教育投資が国語学力を高める実証的根拠 |
| クラスサイズ | +2.69(*, +1人あたり) | n.s. | 人数が多いほど多様な意見に触れ、国語の感性が育つ可能性(先行研究と真逆) |
| 自治体教育費 | +2.0(*, +10万円あたり) | n.s.(p≈0.113) | 自治体の教育予算が国語学力に寄与 |
原論文の被説明変数(学力偏差値)はSSDSE-Bに無い。しかしSSDSE-Bには小学校児童数・小学校教員数があるので、原論文の目玉であるクラスサイズ(教員一人あたり児童数)を実データで計算できる。まず読み込む。
109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 | df_raw = pd.read_csv(DATA_B, encoding='cp932', skiprows=[1]) # 都道府県行のみ(地域コード R+5桁、全国 R00000 を除外) mask = (df_raw['Code'].astype(str).str.match(r'^R\d{5}$', na=False) & (df_raw['Code'] != 'R00000')) df_all = df_raw[mask].copy() # 使う列(コード → 意味): # Prefecture 都道府県 / E2401 小学校教員数 / E2501 小学校児童数 # L322108 教育費(二人以上世帯,月) / L322109 教養娯楽費 / L3221 消費支出 # A9201 離婚件数 / A1101 総人口 / B4101 年平均気温 / C5401 標準価格(住宅地) rename = {'SSDSE-B-2026': '年度', 'Prefecture': '都道府県', 'E2401': '小学校教員数', 'E2501': '小学校児童数', 'L322108': '世帯教育費', 'L322109': '教養娯楽費', 'L3221': '消費支出', 'A9201': '離婚件数', 'A1101': '総人口', 'B4101': '年平均気温', 'C5401': '標準価格住宅地'} df_all = df_all.rename(columns=rename) for c in ['小学校教員数', '小学校児童数', '世帯教育費', '教養娯楽費', '消費支出', '離婚件数', '総人口', '年平均気温', '標準価格住宅地']: df_all[c] = pd.to_numeric(df_all[c], errors='coerce') df_all['年度'] = df_all['年度'].astype(int) # 原論文の"意外な正の変数"クラスサイズ = 小学校児童数 ÷ 小学校教員数(教員一人あたり児童数) df_all['クラスサイズ'] = df_all['小学校児童数'] / df_all['小学校教員数'] |
=== [1] SSDSE-B 読み込み(実再現に使う説明変数を用意)=== 収録年度: [np.int64(2012), np.int64(2013), np.int64(2014), np.int64(2015), np.int64(2016), np.int64(2017), np.int64(2018), np.int64(2019), np.int64(2020), np.int64(2021), np.int64(2022), np.int64(2023)] 都道府県数: 47 SSDSE-B に収録されている原論文の説明変数:クラスサイズ(児童数/教員数)・世帯教育費・教養娯楽費・離婚率・年平均気温・標準価格(住宅地) SSDSE-B に無い変数(→再現不可):被説明変数の学力偏差値・通塾率・不登校率・自治体教育費・教員給与・教員経験年数・大学進学率・大学院進学率
248 249 250 251 252 253 | d23 = df_all[df_all['年度'] == 2023].dropna(subset=['クラスサイズ']).copy() d23 = d23.sort_values('クラスサイズ', ascending=False).reset_index(drop=True) print(f'クラスサイズ(小学校児童数/小学校教員数, 2023) 平均 {d23["クラスサイズ"].mean():.2f}' f' / 最大 {d23["クラスサイズ"].max():.2f} / 最小 {d23["クラスサイズ"].min():.2f}') print('▼ 教員一人あたり児童数が多い上位5') print(d23[['都道府県', 'クラスサイズ']].head(5).to_string(index=False, float_format='%.2f')) |
=== [4] 実再現:クラスサイズ(教員一人あたり児童数)ランキング(SSDSE-B 2023)=== クラスサイズ(小学校児童数/小学校教員数, 2023) 平均 13.25 / 最大 17.10 / 最小 10.51 ▼ 教員一人あたり児童数が多い上位5 都道府県 クラスサイズ 東京都 17.10 埼玉県 16.59 神奈川県 16.45 千葉県 16.08 愛知県 15.50 ▼ 少ない下位5 都道府県 クラスサイズ 高知県 10.51 和歌山県 10.62 島根県 10.82 徳島県 11.10 鹿児島県 11.44 原論文はこの変数を4時点で平均15.16と算出(担任外の教員も含めたため過小推定と注記)。 SSDSE-Bで実計算した2023年の平均は上記の通りで、都市部(東京・神奈川・埼玉)ほど大きい。 原論文は「クラスサイズが大きいほど国語の偏差値が高い(正に有意)」と報告したが、被説明変数の学力偏差値はSSDSEに無いため、その関係の再現は不可(図1の報告値を参照)。
原論文の学力回帰そのものはSSDSE-Bでは再現できない。しかし推定手順(POLS→F検定→固定効果/変量効果→Hausman検定)は、SSDSE-Bの実変数だけで一通り追体験できる。ここでは原論文の説明変数でもある世帯教育費を被説明変数に見立てた手法デモとして動かす(学力の決定要因の再現ではない)。
291 292 293 294 295 296 297 298 299 300 301 302 303 304 305 306 307 308 309 310 311 312 313 314 315 316 317 | years_panel = [2013, 2016, 2019, 2022] # 原論文の4時点構成にならい4時点を採用 dp = df_all[df_all['年度'].isin(years_panel)].dropna( subset=['世帯教育費', '教養娯楽費', '消費支出']).copy() dp['Y'] = dp['世帯教育費'] / 1000.0 # 千円/月 dp['x1'] = dp['教養娯楽費'] / 1000.0 # 千円/月 dp['x2'] = dp['消費支出'] / 1000.0 # 千円/月 dp['ent'] = dp['都道府県'] N = dp['ent'].nunique() T = len(years_panel) K = 2 n = len(dp) print(f'\nパネル構成:{N}都道府県 × {T}時点 = {n}観測(被説明変数=世帯教育費・千円/月)') # --- POLS --- Xp = sm.add_constant(dp[['x1', 'x2']]) pols = sm.OLS(dp['Y'], Xp).fit() # --- 固定効果法(within変換:各都道府県の平均を控除)--- g = dp.groupby('ent') dm = dp.copy() for c in ['Y', 'x1', 'x2']: dm[c] = dp[c] - g[c].transform('mean') fe = sm.OLS(dm['Y'], dm[['x1', 'x2']]).fit() ssr_fe = fe.ssr sig2e = ssr_fe / (n - N - K) # --- F検定(個別効果の有無:POLS vs 固定効果)--- F_stat = ((pols.ssr - ssr_fe) / (N - 1)) / (ssr_fe / (n - N - K)) F_p = stats.f.sf(F_stat, N - 1, n - N - K) |
318 319 320 321 322 323 324 325 326 327 328 329 330 331 332 333 334 335 336 | # --- 変量効果法(Swamy–Arora風のquasi-demean)--- bt = dp.groupby('ent')[['Y', 'x1', 'x2']].mean() btw = sm.OLS(bt['Y'], sm.add_constant(bt[['x1', 'x2']])).fit() sig2_b = btw.ssr / (N - K - 1) sig2u = max(sig2_b - sig2e / T, 0.0) theta = 1 - np.sqrt(sig2e / (T * sig2u + sig2e)) if (T * sig2u + sig2e) > 0 else 0.0 qd = dp.copy() for c in ['Y', 'x1', 'x2']: qd[c] = dp[c] - theta * g[c].transform('mean') qd['const'] = 1 - theta re = sm.OLS(qd['Y'], qd[['const', 'x1', 'x2']]).fit() # --- Hausman検定(Mundlak補助回帰版:頑健で常に非負)--- dp['x1bar'] = g['x1'].transform('mean') dp['x2bar'] = g['x2'].transform('mean') Xm = sm.add_constant(dp[['x1', 'x2', 'x1bar', 'x2bar']]) mund = sm.OLS(dp['Y'], Xm).fit(cov_type='cluster', cov_kwds={'groups': dp['ent']}) R = np.zeros((2, 5)); R[0, 3] = 1; R[1, 4] = 1 wald = mund.wald_test(R, scalar=True) H_stat = float(wald.statistic); H_p = float(wald.pvalue) |
通塾率が高いほど学力が高いのは、塾通いの児童ほど先取り学習や補習で定着が進むため(仮説通り)。一方、不登校率が高いほど平均学力が高いのは仮説と逆だが、不登校児はテストを受けない傾向にあり、学習に遅れた層が平均から抜けることで受験者平均が押し上げられる、という解釈が可能だと著者は述べる(原因と結果の向きに注意)。
国語ではクラスサイズ(教員一人あたり児童数)が大きいほど偏差値が高い。多くの先行研究が示す"少人数学級の有効性"と真逆で、著者は「国語ではクラスの人数が多いほど多様な意見に触れ、豊かな感性が育つのかもしれない」と考察する。算数では非有意で、教科による違いが浮かぶ。
本研究は、都道府県レベルの4時点パネルを用い、教育の生産関数の枠組みで国語・算数の学力の決定要因を分析した。固定効果法により、通塾率・不登校率が両教科で、世帯教育費・クラスサイズ・自治体教育費が国語で、学力に正の影響を持つことを示した。特にクラスサイズは先行研究と真逆の"正"という新規な結果を得て、教科別に比較した点に貢献がある。
このページのクラスサイズのランキング(図3)とパネル推定手順デモ(図4)は、以下から再現できます。
🐍 再現コード(.py) 📊 SSDSE-B-2026.csv
※ 固定効果法の推定係数(図1)とF検定・Hausman検定(図2)は、被説明変数の学力偏差値・通塾率・不登校率などがSSDSE-B外のため、原論文の報告値を可視化したものです。図4は世帯教育費を被説明変数に見立てた手法デモで、原論文の学力回帰そのものではありません。
この研究を読むとき・まねするときに陥りやすい誤解を整理する。
クリックすると各用語の詳しい解説ページに移動できます。
この研究のパネル分析を、手を動かす順に説明する。
この研究の「相関は示したが因果の向きは不明」という結論は、次の研究の出発点になる。
再現コードを少し変えるだけで試せる課題を、易しい順に用意した。
df_all['年度'] == 2023 を 2016 や 2019 に変えて、クラスサイズのランキングや全国平均が年で変わるか確かめよう。原論文の4時点(2007・2010・2013・2016)に近い年を選ぶと比較しやすい。E3501(中学校生徒数)/E3401(中学校教員数)に差し替え、小学校と中学校で教員一人あたり児童・生徒数がどう違うか比較しよう。statsmodels の variance_inflation_factor でVIFを計算。原論文の「最大6.98」に近い水準か確かめよう。pd.get_dummies(dp['年度'], drop_first=True) で作れる。within変換後に結合してOLSに入れる。「複数時点のパネルで個別効果を制御し、政策効果を測る」発想は、現場でも広く使われている。
この研究を読んで浮かびやすい疑問に答える。
この論文を理解できたか、クリックで確認しましょう。間違えても解説が出ます。
このページの分析は、この画面の中でそのまま実行できます。
Python をインストールする必要も、CSV をダウンロードする必要もありません。
下のセルの 「▶ ブラウザで実行」 を上から順に押すか、
「▶ 最初から全部実行」 で一気に流してください。
表示されるのは、本文の図表とまったく同じ計算の結果です
(動かしているのは再現スクリプト code/2021_U5_3_shorei.py そのもの)。
コードは書き換えられます。「✏️ 書き換える」で数字や変数を変えて ▶ を押すと、 結果がどう変わるかをその場で確かめられます(元に戻すボタンつき)。 ページを開いた時点で裏で実行環境の準備が始まっているので、待ち時間はほとんどありません。 初回だけ実行環境の取得にインターネット接続が必要です。