この教材は原論文と同じデータを読み込み、同じ手順で計算し直しています。画面に出る数値と図は、あなたのブラウザがその場で計算した結果です。
⚠ ただし一部は再現していません:福島県の 3 市町村を除外した「人口増減率 × 外国人比率」の相関は、 市町村単位の除外操作が SSDSE では行えないため再現していません。 その行は原論文の報告値です。
| 原論文が使ったデータ | SSDSE-A・SSDSE-B・在留外国人統計 分析単位:市区町村 中核手法:相関分析 |
|---|---|
| この教材が使うデータ |
|
| 原論文(PDF) | 日本で暮らす外国人の動向から見た多民族化 統計活用奨励賞/ |
▶ ここに書いてある分析は、ページ下部の「🐍 ブラウザで動かす」でそのまま実行できます(インストール不要)。動かしているのは code/2019_H4_katsuyo.py(317 行)そのものです。
このページの分析を自分で再現するには、以下の手順でデータを準備してください。コードの編集は不要です。
data/raw/ フォルダに入れます。html/figures/ に自動保存されます。
日本人の人口が減少を続ける一方で、日本に暮らす外国人は増加している。法務省の統計では、総人口に占める在留外国人の割合は2019年に2%を超えた。著者は「多民族化が人口問題解決の鍵になる」という仮説の下、SSDSE(教育用標準データセット)のSSDSE-2019A(市区町村)とSSDSE-2019B(都道府県・時系列)から人口・地方経済関連のデータを抽出し、外国人人口・外国人比率と各種地域指標の相関分析を行った。
著者は夏に「AIG高校生外交官渡米プログラム」で約3週間アメリカに滞在し、移民国家の多様性を肌で感じた経験からこの問いを立てた。「増加する外国人は、人口減少の歯止めになっているのか? 外国人割合の地域格差はどんな要因と関連しているのか?」——コンビニで外国人店員を見かけるという日常の実感を、公的統計で定量的に検証していく。
SSDSE-A(市区町村) SSDSE-B(都道府県・時系列) 相関分析 散布図・回帰直線 塗り分けマップ・時系列
| データ | 内容 | 原論文での用途 |
|---|---|---|
| SSDSE-2019A | 市区町村別データ(2016年前後の公的統計) | 総人口・外国人人口・事業所数・生産年齢人口・人口密度・市町村財政指標の相関分析 |
| SSDSE-2019B | 都道府県別・時系列データ(2005–2016年) | 外国人比率の年次推移。外国人人口=総人口−日本人人口として算出 |
| 法務省「在留外国人統計」(e-Stat) | 国籍・地域別の在留外国人数 | 地域別在留外国人の割合と推移(円グラフ・棒グラフ) |
| 原論文の分析 | 本ページでの扱い |
|---|---|
| 図1:総人口×外国人人口(散布図・相関) | 実データ再現(図1) |
| 図2:事業所数×外国人人口 | 実データ再現(図2) |
| 図3:人口増減率×外国人比率 | 原論文の報告値のみ(現行SSDSE-Aの転入・転出は「日本人移動者」のみで同一定義の再現が不可) |
| 図4:生産年齢人口比率×外国人比率 | 相関係数を実データで再計算(下表) |
| 図5:都道府県別外国人比率の塗り分けマップ | 同一指標をランキング棒グラフで再表現(図5)。地図は原論文参照 |
| 図6・図7:外国人比率の年次推移(2005–2016) | 実データ再現(図4、2012–2023年) |
| 図8:経常収支比率・実質公債費比率×外国人人口 | 実データ再現(図6) |
| 図9・表1:人口密度×外国人比率、上位市町村 | 実データ再現(図3) |
| 図10・図11:外国人比率の平均±標準偏差・ヒストグラム | 本文・チャレンジ課題で解説(グラフは原論文参照) |
| 図12:地域別在留外国人の割合(e-Stat) | 原論文の報告値を表で提示(SSDSE未収録。グラフは原論文参照) |
相関係数はすべて Excel の CORREL 関数(=Pearsonの相関係数)による。「原論文」列は原論文の報告値(2016年データ)、「再現」列は本ページがSSDSE-A-2025(2020年)で再計算した値である。
| 変数の組 | 市区町村 | 都道府県 | ||
|---|---|---|---|---|
| 原論文の報告値 | 本再現(2020年) | 原論文の報告値 | 本再現(2020年) | |
| 総人口 × 外国人人口 | 0.879 | 0.882 | 0.932 | 0.949 |
| 事業所数 × 外国人人口 | 0.899 | 0.897 | 0.953 | 0.959 |
| 人口増減率 × 外国人比率 | 0.276(福島県の3市町村を除外) | 再現不可※ | 0.684 | 再現不可※ |
| 生産年齢人口比率 × 外国人比率 | 0.380 | 0.419 | 0.663 | 0.748 |
| 人口密度 × 外国人比率 | 0.365 | 0.341 | 0.657 | 0.577 |
| ※ SSDSE-A-2025の転入者数・転出者数は「日本人移動者」のみのため、原論文の定義(外国人を含む増減率)では再計算できない。 | ||||
まず「人口の多い地域ほど外国人も多いのか」を確かめる。原論文は市区町村・都道府県の2つの集計レベルで散布図を描き、回帰直線とR²を添えた(原論文 図1)。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 | import pandas as pd # SSDSE-A: 1行目=項目コード、2行目=データ年度、3行目=日本語項目名 df_a = pd.read_csv('data/raw/SSDSE-A-2025.csv', encoding='cp932', header=2) df_a = df_a[df_a['市区町村'].notna()].copy() # 派生変数(原論文と同じ定義) df_a['外国人比率'] = df_a['外国人人口'] / df_a['総人口'] * 10000 # 1万人あたり df_a['生産年齢人口比率'] = df_a['15~64歳人口'] / df_a['総人口'] * 100 df_a['人口密度'] = df_a['総人口'] / (df_a['総面積(北方地域及び竹島を除く)'] / 100) # 都道府県レベル=市区町村を合算 df_p = df_a.groupby('都道府県', as_index=False)[ ['総人口', '外国人人口', '15~64歳人口', '事業所数(民営)']].sum() # 相関係数(Excel の CORREL と同じ Pearson の r) r_muni = df_a['総人口'].corr(df_a['外国人人口']) r_pref = df_p['総人口'].corr(df_p['外国人人口']) print(f"総人口×外国人人口: 市区町村 r={r_muni:.3f} / 都道府県 r={r_pref:.3f}") print("原論文の報告値 : 市町村 r=0.879 / 都道府県 r=0.932") |
SSDSE-A-2025: 1741 市区町村 === 相関係数の比較(原論文2016年データ → 本再現2020/2021年データ) === 変数の組 原論文·市町村 再現·市町村 原論文·都道府県 再現·都道府県 総人口×外国人人口 0.879 0.882 0.932 0.949 事業所数×外国人人口 0.899 0.897 0.953 0.959 生産年齢人口比率×外国人比率 0.380 0.419 0.663 0.748 人口密度×外国人比率 0.365 0.341 0.657 0.577
header=2 — SSDSE-Aは先頭2行がコードと年度なので、3行目を列名として読み込みます。.corr() — pandasの相関係数はExcelの CORREL 関数と同じPearsonの r。原論文はExcelで計算しましたが、結果は同等です。groupby('都道府県').sum() — 市区町村を県単位に合算して「都道府県レベル」を作ります。原論文もSSDSE-2019Aから都道府県別データを集計しています。外国人の主な在留目的は就労・就学・研修である。そこで「働く場所の多さ」を表す事業所数(商店・工場・事務所・学校・病院など、経済活動を行う場所的単位)と外国人人口の関係を調べた(原論文 図2)。
人数×人数の相関(図1・図2:r ≈ 0.9)は地域の規模に引きずられて大きく出る。一方、規模の影響を除いた比率どうし(生産年齢人口比率×外国人比率:r = 0.380/0.663、人口密度×外国人比率:r = 0.365/0.657 — いずれも原論文の報告値)では相関は中程度に下がる。原論文はこの2段構えで「規模の効果」と「構造の効果」を区別しており、これは地域データ分析の基本作法である。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 | import numpy as np import matplotlib.pyplot as plt def scatter_two(dm, dp, x, y, xlab, ylab, title, fname, xdiv=1000, ydiv=1000): fig, axes = plt.subplots(1, 2, figsize=(12.5, 5.4)) for ax, d, name in [(axes[0], dm, '市区町村'), (axes[1], dp, '都道府県')]: dd = d[[x, y]].dropna() xs, ys = dd[x] / xdiv, dd[y] / ydiv r = dd[x].corr(dd[y]) ax.scatter(xs, ys, s=26, color='#3F6BB5', alpha=0.55) m, b = np.polyfit(xs, ys, 1) # 回帰直線(1次式) xr = np.linspace(xs.min(), xs.max(), 100) ax.plot(xr, m * xr + b, 'k--', linewidth=1.4) ax.set_title(f'{name}(n={len(dd)}) r = {r:.3f}, R² = {r**2:.3f}') ax.set_xlabel(xlab); ax.set_ylabel(ylab) fig.suptitle(title, fontweight='bold') fig.savefig(fname, bbox_inches='tight') scatter_two(df_a, df_p, '事業所数(民営)', '外国人人口', '事業所数(千事業所)', '外国人人口(千人)', '図2(再現):事業所数と外国人人口', '2019_H4_fig2.png') |
2019_H4_fig1.png saved. 2019_H4_fig2.png saved.
np.polyfit(xs, ys, 1) — 1次の多項式(=直線)を最小二乗法でフィット。Excelの散布図に「近似曲線(線形)」を追加する操作に対応します。r**2 — 単回帰では決定係数R²は相関係数rの2乗。原論文が図中に示した「R²」と同じ量です。本論文のハイライト。人口が増加し生産年齢人口が多い地域は人口密度も高いはず——と予測して人口密度×外国人比率の散布図を描いたところ、確かに正の相関(原論文の報告値:市町村 0.365、都道府県 0.657)はあるものの、人口密度が低いのに外国人比率が極めて高い市町村が見つかった(原論文 図9・表1)。
| 順位 | 原論文の報告値(2016年) | 本再現(2020年国勢調査) | ||
|---|---|---|---|---|
| 市区町村 | 外国人比率(/1万人) | 市区町村 | 外国人比率(/1万人) | |
| 1 | 長野県 川上村 | 1575.86 | 長野県 川上村 | 1899.17 |
| 2 | 群馬県 大泉町 | 1464.01 | 群馬県 大泉町 | 1756.28 |
| 3 | 長野県 南牧村 | 1255.87 | 長野県 南牧村 | 1394.20 |
| 4 | 東京都 新宿区 | 914.56 | 北海道 占冠村 | 1110.26 |
| 5 | 東京都 豊島区 | 765.16 | 東京都 豊島区 | 847.91 |
| 6 | 東京都 港区 | 703.62 | 埼玉県 蕨市 | 847.17 |
| 7 | 東京都 台東区 | 696.46 | 岐阜県 美濃加茂市 | 818.85 |
| 8 | 東京都 荒川区 | 686.69 | 茨城県 常総市 | 781.64 |
| 9 | 岐阜県 美濃加茂市 | 640.26 | 東京都 新宿区 | 778.97 |
| 10 | 岐阜県 坂祝町 | 597.42 | 東京都 荒川区 | 773.15 |
相関係数 r = 0.34 という「弱い相関」だけを見て終わらず、散布図の左上に浮かぶ外れ値(低密度・高外国人比率)に注目し、その市町村名を特定して産業構造まで調べたことが、この論文を「読みごたえがある」と評価させた核心である。審査会コメントの「データの特異な変動を発見」もこの姿勢を指している。
1 2 3 4 5 6 7 8 9 10 11 12 13 | top10 = df_a.nlargest(10, '外国人比率')[ ['都道府県', '市区町村', '外国人比率', '総人口', '人口密度']] for i, (_, row) in enumerate(top10.iterrows(), 1): print(f"{i:>2}. {row['都道府県']} {row['市区町村']:<8} " f"{row['外国人比率']:>8.2f} /1万人") # 散布図の上位5点に市町村名を注記 dd = df_a[['人口密度', '外国人比率', '市区町村']].dropna() top5 = dd.nlargest(5, '外国人比率') for _, row in top5.iterrows(): ax.annotate(row['市区町村'], (row['人口密度'], row['外国人比率']), xytext=(6, 2), textcoords='offset points', fontsize=9, color='#C62828', fontweight='bold') |
=== 外国人比率が高い市区町村 上位10(2020年・本再現) === 1. 長野県 川上村 1899.17 /1万人 (人口密度 20.7 人/km2) 2. 群馬県 大泉町 1756.28 /1万人 (人口密度 2334.4 人/km2) 3. 長野県 南牧村 1394.20 /1万人 (人口密度 24.4 人/km2) 4. 北海道 占冠村 1110.26 /1万人 (人口密度 2.3 人/km2) 5. 東京都 豊島区 847.91 /1万人 (人口密度 23182.1 人/km2) 6. 埼玉県 蕨市 847.17 /1万人 (人口密度 14536.8 人/km2) 7. 岐阜県 美濃加茂市 818.85 /1万人 (人口密度 757.8 人/km2) 8. 茨城県 常総市 781.64 /1万人 (人口密度 492.0 人/km2) 9. 東京都 新宿区 778.97 /1万人 (人口密度 19175.9 人/km2) 10. 東京都 荒川区 773.15 /1万人 (人口密度 21405.0 人/km2) 2019_H4_fig3.png saved.
nlargest(10, '外国人比率') — 指定列の上位n行を取り出す。並べ替え+先頭切り出しより速くて読みやすい定番です。ax.annotate(...) — 散布図の点に市町村名などのラベルを付けます。外れ値の「正体」を図の中で示すのは伝わる図の必須テクニック。f"{x:>8.2f}" は「右詰め8桁・小数2桁」。表形式のprint出力を揃えると確認ミスが減ります。SSDSE-B(都道府県・時系列)には外国人人口の項目がない。原論文は「外国人人口=総人口−日本人人口」という工夫でこれを算出し、2005〜2016年の外国人比率の推移を折れ線グラフにした(原論文 図6)。すると大多数の都道府県で緩やかな増加に加え、2005・2010・2015年と5年毎に急峻で一時的な増加という奇妙なパターンが現れた。
外国人人口=総人口−日本人人口という導出変数は、引き算する2系列の定義が揃っている限り有効だが、国勢調査年(実測)と推計年で「日本人人口」の扱いが変わると、その差分に不連続が集中して現れる。導出変数を使うときは元系列の出典・定義の切り替わり年を必ず確認しよう。原論文は「5年毎の調査基準は共通なので、5年おきの比較(2005 vs 2010 vs 2015)なら経年比較が可能」と整理し、図10・図11の分析につなげている。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 | df_b = pd.read_csv('data/raw/SSDSE-B-2026.csv', encoding='cp932', header=1) df_b = df_b[df_b['都道府県'] != '全国'].copy() # 原論文と同じ算出方法:外国人人口 = 総人口 − 日本人人口 df_b['外国人人口'] = df_b['総人口'] - df_b['日本人人口'] df_b['外国人比率'] = df_b['外国人人口'] / df_b['総人口'] * 10000 # 年×都道府県の表に変換して47本の折れ線を描く pivot = df_b.pivot_table(index='年度', columns='都道府県', values='外国人比率') # 全国計でスパイクを数値確認 nat = df_b.groupby('年度')[['総人口', '日本人人口']].sum() nat['外国人比率'] = (nat['総人口'] - nat['日本人人口']) / nat['総人口'] * 10000 for y in nat.index: mark = ' ←国勢調査年' if y in (2015, 2020) else '' print(f" {y}: {nat.loc[y, '外国人比率']:>6.1f}{mark}") |
=== 国勢調査年スパイクの確認(全国計・外国人比率 /1万人) === 2012: 123.0 2013: 126.5 2014: 131.5 2015: 221.2 ←国勢調査年 2016: 155.4 2017: 171.3 2018: 189.2 2019: 210.7 2020: 365.0 ←国勢調査年 2021: 216.7 2022: 233.2 2023: 254.0 2019_H4_fig4.png saved.
pivot_table(index='年度', columns='都道府県') — 縦持ちデータを「年×県」の表に組み替えると、そのまま47本の折れ線が描けます。groupby('年度').sum() で全国計を作ってから比率を計算すること。県別比率の単純平均は人口の重みを無視した別物になります。原論文はExcelの「塗り分けマップ」機能で2016年の都道府県別外国人比率を日本地図上に可視化した(原論文 図5、値域26.35〜280.10人/1万人)。本ページでは同一指標をランキング棒グラフとして再表現する(地図そのものは原論文を参照)。
1 2 3 4 5 6 7 8 9 10 11 12 13 | df_p['外国人比率'] = df_p['外国人人口'] / df_p['総人口'] * 10000 rank = df_p.sort_values('外国人比率', ascending=False).reset_index(drop=True) for i in range(6): print(f"{i+1}位 {rank.loc[i, '都道府県']} {rank.loc[i, '外国人比率']:.1f}") hiro = rank.index[rank['都道府県'] == '広島県'][0] + 1 print(f"…{hiro}位 広島県、47位 {rank.loc[46, '都道府県']}") # ランキング棒グラフ(塗り分けマップの代替表現) fig, ax = plt.subplots(figsize=(13.5, 6)) ax.bar(range(47), rank['外国人比率']) ax.set_xticks(range(47)) ax.set_xticklabels(rank['都道府県'], rotation=60, ha='right', fontsize=8.5) |
=== 都道府県別外国人比率ランキング(2020年・本再現) === 1位 東京都 344.1 2位 愛知県 306.8 3位 群馬県 275.5 4位 三重県 252.6 5位 岐阜県 247.5 6位 静岡県 236.8 …17位 広島県 170.5、47位 秋田県 38.1 2019_H4_fig5.png saved.
sort_values(..., ascending=False) — 降順に並べ替え。reset_index(drop=True) で0始まりの順位インデックスに振り直します。geopandas+国土数値情報の県境ポリゴンが定番。ただしまず棒グラフ・散布図で数値を固めてからにしましょう。外国人が多い市町村は財政的にどんな地域か。原論文は外国人比率ランキング1位・3位・中位の東京都・群馬県・広島県を取り上げ、市町村の経常収支比率(財政構造の弾力性を示す指標。一般に70〜80%が適正水準とされ、高いほど財政の自由度が低い)と実質公債費比率(収入に対する借金返済の割合)に対して外国人人口の散布図を描いた(原論文 図8)。
| 指標 | 県 | 原論文の報告値 | 本再現(2020/2021年) |
|---|---|---|---|
| 経常収支比率 × 外国人人口 | 東京都 | −0.365 | −0.297(n=62) |
| 群馬県 | −0.268 | +0.320(n=35)符号逆転 | |
| 広島県 | −0.164 | +0.215(n=23)符号逆転 | |
| 実質公債費比率 × 外国人人口 | 東京都 | −0.440 | −0.673(n=62) |
| 群馬県 | −0.391 | −0.271(n=35) | |
| 広島県 | −0.011 | −0.168(n=23) |
1 2 3 4 5 6 7 8 9 10 11 12 | prefs3 = ['東京都', '群馬県', '広島県'] orig_keijo = {'東京都': -0.365, '群馬県': -0.268, '広島県': -0.164} # 原論文の報告値 orig_saimu = {'東京都': -0.440, '群馬県': -0.391, '広島県': -0.011} # 原論文の報告値 for pref in prefs3: d = df_a[df_a['都道府県'] == pref] for xcol, orig in [('経常収支比率(市町村財政)', orig_keijo), ('実質公債費比率(市町村財政)', orig_saimu)]: dd = d[[xcol, '外国人人口']].dropna() r = dd[xcol].corr(dd['外国人人口']) print(f" {pref} {xcol[:7]}×外国人人口: " f"原論文 {orig[pref]:+.3f} → 再現 {r:+.3f} (n={len(dd)})") |
=== 市町村財政と外国人人口の相関(原論文の報告値 → 本再現) === 東京都 経常収支比率×外国人人口: 原論文 -0.365 → 再現 -0.297 (n=62) 東京都 実質公債費比率×外国人人口: 原論文 -0.440 → 再現 -0.673 (n=62) 群馬県 経常収支比率×外国人人口: 原論文 -0.268 → 再現 +0.320 (n=35) 群馬県 実質公債費比率×外国人人口: 原論文 -0.391 → 再現 -0.271 (n=35) 広島県 経常収支比率×外国人人口: 原論文 -0.164 → 再現 +0.215 (n=23) 広島県 実質公債費比率×外国人人口: 原論文 -0.011 → 再現 -0.168 (n=23) 2019_H4_fig6.png saved.
dropna() — 財政指標は特別区や一部町村で欠損があるため、相関計算の前に除外します。nを必ず出力して「何自治体で計算したか」を明示しましょう。| 地域 | アジア | 南米 | ヨーロッパ | 北米 | その他(アフリカ・オセアニア・無国籍等) |
|---|---|---|---|---|---|
| 2016年の割合 | 83% | 10% | 3% | 3% | 約1% |
※ 本表は原論文の報告値をそのまま示したもの(再計算ではない)。出典は法務省「在留外国人統計」(e-Stat)。円グラフ・棒グラフ(推移)は原論文 図12 を参照。SSDSEには国籍・地域別の在留外国人データは収録されていない。
| データ・ツール | 出典・説明 |
|---|---|
| SSDSE-A-2025(市区町村データ) | 独立行政法人 統計センター SSDSE(教育用標準データセット)。1741市区町村×125項目。総人口・外国人人口・事業所数・市町村財政指標など。原論文はSSDSE-2019Aを使用。 |
| SSDSE-B-2026(都道府県・時系列データ) | 同上。47都道府県×2012–2023年×107項目。総人口・日本人人口から外国人人口を導出。原論文はSSDSE-2019B(2005–2016年)を使用。 |
| 法務省「在留外国人統計」(e-Stat) | 国籍・地域別・在留資格別の在留外国人数。原論文が図12(地域別割合)で使用。本ページでは原論文の報告値を表で提示。 |
本教育用コードはSSDSE-A-2025・SSDSE-B-2026の実公的統計データを使用(合成データ不使用)。出典:独立行政法人 統計センター。
この論文のような地域データの相関分析で初心者がやりがちな勘違いをまとめます。本文を読む前にも、読んだ後にも、目を通してみてください。
この論文の理解に必要な用語を初心者向けに解説します。本文中で見慣れない言葉が出てきたら、ここに戻って確認してください。
この論文はすべて「高校で学ぶ統計技術」で構成されています。各手法について「何のためか」「結果をどう読むか」「何に注意するか」を解説します。
この研究をさらに発展させるための3つの方向性を示します。「今回わかったこと(X)」から「次に検証すべき仮説(Y)」を立て、「具体的に何をするか(Z)」まで考えてみましょう。
学んだだけでは身につきません。実際に手を動かすのが最強の学習方法です。本ページのスクリプトをベースに、以下のチャレンジに挑戦してみてください。難易度別に5つ用意しました。
scipy.stats.wilcoxon(x2020 - x2015, alternative='greater')。原論文が保留した結論に、原論文が指名した手法で決着をつける挑戦です。
本論文で学んだ手法(地域データの相関分析・可視化)は、研究の世界だけでなく、行政・企業・NPOの現場でも様々に活用されています。具体的なシーンを紹介します。
この論文を読んで初心者が抱きやすい疑問に、教育的観点から答えます。
この論文を理解できたか、クリックで確認しましょう。間違えても解説が出ます。
このページの分析は、この画面の中でそのまま実行できます。
Python をインストールする必要も、CSV をダウンロードする必要もありません。
下のセルの 「▶ ブラウザで実行」 を上から順に押すか、
「▶ 最初から全部実行」 で一気に流してください。
表示されるのは、本文の図表とまったく同じ計算の結果です
(動かしているのは再現スクリプト code/2019_H4_katsuyo.py そのもの)。
コードは書き換えられます。「✏️ 書き換える」で数字や変数を変えて ▶ を押すと、 結果がどう変わるかをその場で確かめられます(元に戻すボタンつき)。 ページを開いた時点で裏で実行環境の準備が始まっているので、待ち時間はほとんどありません。 初回だけ実行環境の取得にインターネット接続が必要です。