この教材は原論文と同じデータを読み込み、同じ手順で計算し直しています。画面に出る数値と図は、あなたのブラウザがその場で計算した結果です。
⚠ ただし一部は再現していません:都道府県ペアの移住オッズ比と県内総生産が SSDSE-B に無いため、 原論文 表2 の推定は再現していません。 係数は報告値をそのまま転記して可視化しています。
| 原論文が使ったデータ | SSDSE-B・住民基本台帳人口移動報告・県民経済計算・一般職業紹介状況・都道府県庁間の距離 分析単位:都道府県 中核手法:ロジットモデル |
|---|---|
| この教材が使うデータ |
|
| 原論文(PDF) | 地域格差から見る人口移動 審査員奨励賞/野村 京加(名古屋市立大学経済学部) |
▶ ここに書いてある分析は、ページ下部の「🐍 ブラウザで動かす」でそのまま実行できます(インストール不要)。動かしているのは code/2022_U5_11_shorei.py(224 行)そのものです。
このページで実再現できるのは図2〜図4(純移動率・進学率・大学数)です。コードの編集は不要です。(原論文の中心である県間移住のオッズ比と県内総生産は SSDSE-B に列が無いため、図1(表2の推定結果)は原論文の報告値を転記して可視化します。)
data/raw/ フォルダに入れます。html/figures/ に自動保存されます。県間移住オッズ比・県内総生産など SSDSE-B 収録外の指標はスクリプト内に原論文の報告値を転記して可視化し、純移動率・進学率・大学数は SSDSE-B から実再現します。
日本では長年、東京一極集中という形で都市部にヒト・モノ・カネが集まる一方、地方ではそれらが流出し格差が広がっている。著者はこのうち特に「ヒト」に着目した。都市部への人口集中は地価高騰や交通渋滞を、地方には過疎化や産業衰退を招く。所得や労働生産性が低い地方から都市部に人が流出し、賃金・教育・労働生産性という地域格差がさらに広がる——この人口流出の要因を突き止めれば、対策が打てるはずだと考えた。
そこで著者は「県をまたぐ移住は、賃金・教育・労働機会などの地域格差で説明できる」という問いを立てた。地域格差を表すデータとして県内総生産・有効求人倍率・高校卒業後の進学率・大学数・専修学校数・短期大学数を、加えて移動のしやすさとして都道府県間距離を取り上げる。日本で移住の契機になりやすい「進学」「就職・転勤」に焦点を当てた分析である。
大学生・一般の部 住民基本台帳+県民経済計算+SSDSE-B ロジットモデル オッズ比の回帰 地域格差=移住先−移住元の差
本研究は複数の出典を組み合わせている。被説明変数の県間移住者数は総務省「住民基本台帳人口移動報告」、県内総生産は内閣府「県民経済計算」、有効求人倍率は厚生労働省「一般職業紹介状況」、進学率・大学数・短期大学数・専修学校数は SSDSE-B、都道府県間距離は国土地理院から取っている。分析期間は SSDSE の掲載開始(2007年)と当時の最新公開(2017年)に合わせた 2007〜2017 年である。
| 役割 | データ | 出典 | 本ページでの扱い |
|---|---|---|---|
| 被説明変数 | 都道府県 i→j の移住者数(オッズ比の対数) | 総務省 住民基本台帳人口移動報告 | 報告値の可視化 |
| 豊かさ | 県内総生産の対数の差 | 内閣府 県民経済計算 | 報告値の可視化 |
| 就業機会 | 有効求人倍率の差 | 厚生労働省 一般職業紹介状況 | 報告値の可視化 |
| 教育(進学) | 移住前の高校卒業後進学率 | SSDSE-B(進学者数/卒業者数) | 実再現 |
| 教育(機関) | 大学数・短期大学数・専修学校数の差 | SSDSE-B | 大学数を実再現 |
| 移動コスト | 都道府県間距離 | 国土地理院 都道府県庁間の距離 | 報告値(表2) |
| 人口移動 | 転入者数・転出者数(純移動率) | SSDSE-B(A5101/A5102/A1101) | 実再現 |
各年について都道府県 i から j への移動確率 pij を、i から i への(留まる)移動確率 pii で割る。人口 popi が約分され、結果は移住者数の比 Eij/Eii になる。その対数を被説明変数にする。
県内総生産(対数)・有効求人倍率・大学数・短期大学数・専修学校数は、移住先 j と移住元 i の差 (Xj−Xi) にする。差が大きい(=移住先の方が豊か・学校が多い)ほど移住しやすいか、を見る。進学率だけは移住前 i の値を使う。
都道府県間距離、年ダミー、移住前・移住先の都道府県ダミーを加えてロジットモデルで推定。各変数の推定値・t値・p値を読む。サンプルは 47×46×11 = 23,782。
まず原論文の中心的な結果である、ロジットモデルの推定結果(表2)を見る。被説明変数の県間移住オッズ比と県内総生産は SSDSE に無い変数のため、原論文 表2 の報告値を符号・桁そのまま転記して可視化する(再計算ではない)。
=== [1] 原論文 表2 推定結果(報告値・再計算ではない)===
変数 推定値 t値 p値
県内総生産の対数の差 0.749159 63.09 0.000
有効求人倍率の差 -0.210239 -9.15 0.000
高校卒業後の進学率(移住前) 0.028804 24.09 0.000
短期大学数の差 0.003667 2.13 0.033
大学数の差 0.001862 2.26 0.024
専修学校数の差 -0.001627 -6.03 0.000
都道府県間距離 -0.001580 -82.01 0.000
※ 被説明変数=移住オッズ比の対数 ln(E_ij/E_ii)。有意水準5%で全変数が有意。
Fig1 saved (report values)
原論文の中心テーマ「人口移動の地域格差」を、SSDSE-B の実データで確かめる。ここは実再現で、転入・転出・総人口から都道府県ごとの純移動率を計算する。原論文の県間ペア・オッズ比ではなく都道府県単位の近似だが、東京一極集中という問題意識が実データで見える。
skiprows=[1] で読み込み、2023年(df[df["SSDSE-B-2026"]==2023])について A5101 転入・A5102 転出・A1101 総人口から純移動率(‰)=(転入−転出)/総人口×1000を計算する。進学率・大学数も同時に作る。80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 | # 先頭列名 'SSDSE-B-2026' が年度。ラベル行 skiprows=[1] を読み飛ばす。 df = pd.read_csv(DATA_B, encoding='cp932', skiprows=[1]) d = df[df['SSDSE-B-2026'] == 2023].copy() # 2023 年の 47 都道府県 # 使う列(コード)を数値化:A1101 総人口 / A5101 転入 / A5102 転出 # E4601 高校卒業者数 / E4602 進学者数 / E6102 大学数 for c in ['A1101', 'A5101', 'A5102', 'E4601', 'E4602', 'E6102']: d[c] = pd.to_numeric(d[c], errors='coerce') # 純移動率(‰) = (転入 - 転出) / 総人口 × 1000 d['純移動率'] = (d['A5101'] - d['A5102']) / d['A1101'] * 1000 # 高校卒業後進学率(%) = 進学者数 / 卒業者数 × 100(原論文の進学率変数に対応) d['進学率'] = d['E4602'] / d['E4601'] * 100 d['大学数'] = d['E6102'] print("=== [0] データ概要(SSDSE-B・2023年・実再現)===") print(f"対象年: 2023 / 都道府県数: {len(d)}") print(f"純移動率(‰) 平均 {d['純移動率'].mean():6.3f} 最小 {d['純移動率'].min():6.3f} 最大 {d['純移動率'].max():6.3f}") print(f"進学率(%) 平均 {d['進学率'].mean():6.2f} 最小 {d['進学率'].min():6.2f} 最大 {d['進学率'].max():6.2f}") print(f"大学数 平均 {d['大学数'].mean():6.1f} 最小 {int(d['大学数'].min())} 最大 {int(d['大学数'].max())}") |
=== [0] データ概要(SSDSE-B・2023年・実再現)=== 対象年: 2023 / 都道府県数: 47 純移動率(‰) 平均 -1.678 最小 -5.017 最大 4.152 進学率(%) 平均 57.56 最小 46.69 最大 74.12 大学数 平均 17.2 最小 2 最大 144
146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 | # (原論文の県間ペア・オッズ比ではなく都道府県単位の近似。) rank = d.sort_values('純移動率', ascending=True) print("=== [2] 都道府県別 純移動率(2023・実再現・単位‰)===") top = d.sort_values('純移動率', ascending=False).head(5) bot = d.sort_values('純移動率', ascending=True).head(5) print("流入超過 上位5:", " ".join(f"{p}{v:+.2f}" for p, v in zip(top['Prefecture'], top['純移動率']))) print("流出超過 下位5:", " ".join(f"{p}{v:+.2f}" for p, v in zip(bot['Prefecture'], bot['純移動率']))) fig, ax = plt.subplots(figsize=(8, 11)) bar_colors = ['#e05c5c' if v > 0 else '#4e9af1' for v in rank['純移動率']] ax.barh(rank['Prefecture'], rank['純移動率'], color=bar_colors, alpha=0.85) ax.axvline(0, color='black', linewidth=1) ax.set_xlabel('純移動率(‰)= (転入−転出)/総人口×1000', fontsize=11) ax.set_title('図2:都道府県別 純移動率ランキング(2023年・SSDSE-B 実再現)\n' '赤=流入超過, 青=流出超過', fontsize=12, fontweight='bold') ax.grid(axis='x', alpha=0.3) plt.tight_layout() plt.savefig(os.path.join(FIG_DIR, '2022_U5_11_fig2_rank.png'), dpi=150, bbox_inches='tight') plt.close() |
=== [2] 都道府県別 純移動率(2023・実再現・単位‰)=== 流入超過 上位5: 東京都+4.15 千葉県+2.62 埼玉県+2.43 神奈川県+2.39 福岡県+1.69 流出超過 下位5: 長崎県-5.02 青森県-4.70 岩手県-4.12 山形県-4.08 福島県-3.92 Fig2 saved (real)
原論文で正の効果(+0.029)が出た説明変数「移住前の高校卒業後進学率」を、SSDSE-B から実再現する。実再現で、進学者数を卒業者数で割って求める。進学率の高い地域ほど、進学を機に県外へ出やすいという原論文の解釈の背景を確かめる。
E4602 高校卒業者のうち進学者数を E4601 高校卒業者数で割って高校卒業後進学率(%)を計算し、降順に並べる。原論文が移住要因に用いた進学率変数を、実データで再現する。171 172 173 174 175 176 177 178 179 180 181 182 183 184 185 186 | # SSDSE-B の E4602(進学者数)/E4601(卒業者数) から実計算する。 srank = d.sort_values('進学率', ascending=True) print("=== [3] 高校卒業後進学率(2023・実再現・単位%)===") stop = d.sort_values('進学率', ascending=False).head(3) sbot = d.sort_values('進学率', ascending=True).head(3) print("進学率 高い3県:", " ".join(f"{p}{v:.1f}" for p, v in zip(stop['Prefecture'], stop['進学率']))) print("進学率 低い3県:", " ".join(f"{p}{v:.1f}" for p, v in zip(sbot['Prefecture'], sbot['進学率']))) fig, ax = plt.subplots(figsize=(8, 11)) ax.barh(srank['Prefecture'], srank['進学率'], color='#f0a500', alpha=0.85) ax.set_xlabel('高校卒業後進学率(%)= 進学者数 / 卒業者数 × 100', fontsize=11) ax.set_title('図3:都道府県別 高校卒業後進学率(2023年・SSDSE-B 実再現)', fontsize=12, fontweight='bold') ax.grid(axis='x', alpha=0.3) plt.tight_layout() plt.savefig(os.path.join(FIG_DIR, '2022_U5_11_fig3_fe_coef.png'), dpi=150, bbox_inches='tight') |
=== [3] 高校卒業後進学率(2023・実再現・単位%)=== 進学率 高い3県: 東京都74.1 京都府74.0 神奈川県69.4 進学率 低い3県: 沖縄県46.7 宮崎県48.0 鹿児島県48.1 Fig3 saved (real)
原論文は「大学数が多い地域に移住する(正の効果 +0.0019)」を報告している。その傾向を、大学数と純移動率の県横断的な関係として実再現する。ここで計算する相関係数は本ページの再計算値で、原論文の回帰係数とは別物である点に注意する。
E6102 大学数と純移動率の相関係数を計算し、散布図と回帰直線を描く。原論文が正の効果を報告した「大学数の多さと人口流入」の関係を、都道府県横断で可視化する。196 197 198 199 200 201 202 203 204 205 206 207 208 209 210 211 212 213 214 215 216 217 218 219 | # 0.0018618 とは別物であり混同しない。) r = d['大学数'].corr(d['純移動率']) print("=== [4] 大学数と純移動率の関係(2023・実再現)===") print(f"大学数と純移動率の相関係数 r = {r:+.3f}(本ページの再計算値。原論文の係数とは別物)") print("→ 大学が多い都道府県ほど人口が流入する県横断的な傾向が確認できる。") fig, ax = plt.subplots(figsize=(9, 6)) ax.scatter(d['大学数'], d['純移動率'], s=60, color='#5cb85c', alpha=0.8, edgecolor='white') for _, row in d.iterrows(): if row['大学数'] > 25 or abs(row['純移動率']) > 3: ax.annotate(row['Prefecture'], (row['大学数'], row['純移動率']), fontsize=8, alpha=0.7, xytext=(3, 3), textcoords='offset points') slope, intercept = np.polyfit(d['大学数'], d['純移動率'], 1) xr = np.linspace(d['大学数'].min(), d['大学数'].max(), 100) ax.plot(xr, slope * xr + intercept, 'k--', linewidth=1.4, label=f'回帰直線 (r={r:+.2f})') ax.axhline(0, color='gray', linewidth=0.8, linestyle=':') ax.set_xlabel('大学数(校・2023年)', fontsize=11) ax.set_ylabel('純移動率(‰)', fontsize=11) ax.set_title('図4:大学数と純移動率(2023年・SSDSE-B 実再現, N=47)\n' '大学が多い県ほど流入超過', fontsize=12, fontweight='bold') ax.legend(fontsize=10) ax.grid(alpha=0.3) plt.tight_layout() plt.savefig(os.path.join(FIG_DIR, '2022_U5_11_fig4_scatter.png'), dpi=150, bbox_inches='tight') |
=== [4] 大学数と純移動率の関係(2023・実再現)=== 大学数と純移動率の相関係数 r = +0.671(本ページの再計算値。原論文の係数とは別物) → 大学が多い都道府県ほど人口が流入する県横断的な傾向が確認できる。 Fig4 saved (real)
推定結果(表2・報告値)を、著者は次のように読み解いている。効いたのは豊かさ(県内総生産)と教育(進学率・大学数・短大数)で、予想に反して就業機会(有効求人倍率)は移住を説明しなかった。
県内総生産の対数の差が正(+0.749)で、県内総生産が低い県から高い県へ移住する。公共交通が整い、サービスや設備が充実した地域が選ばれる。進学率(+0.029)・大学数(+0.0019)・短期大学数(+0.0037)も正で、進学志向が高く教育機関が多い地域へ移住する。進学率の高い地域は教育・学歴への意識が高く、進学時に選択肢の広い県外へ出る人が多い、と著者は解釈する。
有効求人倍率の差は予想(正)に反して負(−0.210)。有効求人倍率が高い地域へ就業機会を求めて移るという結果は得られず、就職での移住は求人数以外の要因で決まるとみられる。専修学校数の差も負(−0.0016)で、専修学校に通うための移住は少ない。都道府県間距離は負(−0.0016)で、引越し費用などのコストが大きい遠方には移住しにくい。
教育機関の数や県内総生産に表れる「生活の中で選択肢が多いこと」が移住を促す一方、就業機会の差では移住を説明できなかった。ここから著者は、地方からの人口流出を止め格差拡大を防ぐには、若者の進学の選択肢を地方にもより増やす必要があると提言する。
本研究は、県をまたぐ移住は地域格差のどれで説明できるかという問いに、移住オッズ比の対数を被説明変数にしたロジットモデルで挑んだ(2007〜2017年、47×46×11=23,782サンプル)。結果(報告値)は、県内総生産の対数の差 +0.749・進学率 +0.029・大学数の差 +0.0019・短大数の差 +0.0037が正で、豊かさと教育機関という「選択肢の多さ」がある地域へ移住する。逆に有効求人倍率の差 −0.210は予想に反して負で、就業機会では移住を説明できなかった。提言は進学の選択肢を地方に増やすことである。本ページでは、純移動率・進学率・大学数を SSDSE-B で実再現し(図2〜4)、県間移住オッズ比と県内総生産にまつわる係数は報告値として切り分けた。
このページの実再現の図(図2〜図4)は、以下から再現できます。
🐍 再現コード(.py) 📊 SSDSE-B-2026.csv
※ 図2(純移動率)・図3(進学率)・図4(大学数と純移動率)はSSDSE-Bの A5101/A5102/A1101・E4601/E4602・E6102 から算出した実再現です(収録年2023・都道府県単位)。図1(表2の推定結果)は、被説明変数の県間移住オッズ比と県内総生産がSSDSE-B外のため、原論文の報告値を符号・桁そのまま可視化したものです(新たな数値の捏造はしていません)。
この研究を読むとき・まねするときに陥りやすい誤解を整理する。
クリックすると各用語の詳しい解説ページに移動できます。
この研究で使われている手法を、手を動かす順に説明する。
この研究の「豊かさと教育機関のある地域へ移住し、就業機会では説明できない」という結論は、次の研究の出発点になる。
再現コードを少し変えるだけで試せる課題を、易しい順に用意した。
df[df['SSDSE-B-2026']==2023] で2023年を選んでいる。ここを2015年や2019年に変えて、流入・流出の順位がどう変わるかを見てみよう。E6102 の代わりに短期大学数 E6101・専修学校数 E7101 を使って純移動率との相関を計算し、原論文の符号(短大=正、専修=負)と方向が合うか確かめよう。F3103 月間有効求人数÷F3102 月間有効求職者数で有効求人倍率を作り、純移動率との相関を計算してみよう。原論文の負の係数と、県横断の相関が同じ向きになるかを考えてみよう。「移住や選択をオッズ比・ロジットで捉え、要因の差で説明する」発想は、行政や企業で広く使われている。
この研究を読んで浮かびやすい疑問に答える。
この論文を理解できたか、クリックで確認しましょう。間違えても解説が出ます。
このページの分析は、この画面の中でそのまま実行できます。
Python をインストールする必要も、CSV をダウンロードする必要もありません。
下のセルの 「▶ ブラウザで実行」 を上から順に押すか、
「▶ 最初から全部実行」 で一気に流してください。
表示されるのは、本文の図表とまったく同じ計算の結果です
(動かしているのは再現スクリプト code/2022_U5_11_shorei.py そのもの)。
コードは書き換えられます。「✏️ 書き換える」で数字や変数を変えて ▶ を押すと、 結果がどう変わるかをその場で確かめられます(元に戻すボタンつき)。 ページを開いた時点で裏で実行環境の準備が始まっているので、待ち時間はほとんどありません。 初回だけ実行環境の取得にインターネット接続が必要です。