この教材は原論文と同じデータを読み込み、同じ手順で計算し直しています。画面に出る数値と図は、あなたのブラウザがその場で計算した結果です。
| 原論文が使ったデータ | 教育用標準データセット・人口推計・建築着工統計調査・都道府県地価調査・労働市場年報・「外国人雇用状況」の届出状況表一覧・工業統計調査・在留外国人統計 分析単位:都道府県 中核手法:パネルデータ分析・固定効果モデル・二方向固定効果モデル |
|---|---|
| この教材が使うデータ |
|
| 原論文(PDF) | 外国人技能実習生の実習地選択における就労産業、国籍、都道府県別クラスター効果の導出 特別賞/後藤 龍星(慶應義塾大学法学部政治学科) |
▶ ここに書いてある分析は、ページ下部の「🐍 ブラウザで動かす」でそのまま実行できます(インストール不要)。動かしているのは code/2021_U5_1_shorei.py(391 行)そのものです。
このページの図のうち、統制変数の再現検証(図4)だけが実データからの再計算です。コードの編集は不要です。(回帰係数=図3、時間効果=図1、個体効果=図2は、技能実習生数・就労産業/国籍クラスター・製造業事業所数などSSDSE-Bに無いデータに基づくため、原論文の報告値を可視化します。)
data/raw/ フォルダに入れます。html/figures/ に自動保存されます。
少子高齢化を背景に、日本の外国人労働者数は2013年以降増加を続けている。とりわけ技能実習生を巡っては、労働環境や斡旋業者を巡る問題が多く、厚生労働省の調査では監督指導を行った実習実施機関の約7割で労働基準関係法令違反が認められたと報告されている。
著者が注目したのは、外国人労働者の増加がクラスター化しているのではないか、という点である。技能実習生は渡航前に自国で勤務先を決める制度になっており、日本にいる同胞・同業者やインターネットの情報を頼りに、同じ国籍・同じ業種のコミュニティに入りやすい実習地を選ぶ傾向が強いと考えられる。ならば「どの地域で、どの職種を望む、どの国からの実習生が増えるか」を事前にモデル化できれば、労働力の過不足や行政の非効率が緩和されるはずだ——ここに研究の意義がある。
大学生・一般の部 SSDSE・e-Stat(人口推計・地価調査・労働市場年報・工業統計・在留外国人統計) 二方向固定効果モデル 2次関数近似(逆U字) 交差項・変動係数・標準化
著者は教育用標準データセット(SSDSE)と政府統計サイト e-Stat で入手できる都道府県別データを加工し、分析用の変数を用意した。従属変数は「労働人口に占める外国人技能実習生の割合(%)」で、独立変数はクラスター指標(x1・x2)と統制変数(x3〜x6)+交差項からなる。
| 記号 | 項目 | 出典 |
|---|---|---|
| a,b | 総人口・15〜64歳人口 | 総務省統計局「人口推計」 |
| c | 着工建築物床面積 | 国土交通省「建築着工統計調査」 |
| d | 標準価格(平均価格・住宅地) | 国土交通省「都道府県地価調査」 |
| e,f | 月間有効求職者数・求人数(一般) | 厚生労働省「労働市場年報」 |
| g,h | 在留資格別(技能実習生)・産業別 外国人労働者数 | 厚生労働省「外国人雇用状況の届出状況」 |
| i | 製造業事業所数(従業者4人以上) | 経済産業省「工業統計調査」 |
| j | 国籍・地域別 在留外国人 構成比 | 法務省出入国在留管理庁「在留外国人統計」 |
| 変数 | 定義 | 平均 | 標準偏差 |
|---|---|---|---|
| y 技能実習生割合(%) | 技能実習生数 ÷ 15〜64歳人口 ×100 | 0.4602 | 0.2517 |
| x1 就労産業クラスター | 上位7産業割合の全国平均からの偏り(変動係数の加重平均) | 0.4208 | 0.1374 |
| x2 国籍クラスター | 上位5か国割合の全国平均からの偏り(同上) | 0.1784 | 0.0629 |
| x3 有効求人倍率 | 有効求人数 ÷ 有効求職者数 | 1.3955 | 0.2578 |
| x4 製造業事業所数/万人 | 製造業事業所数 ÷ 総人口 ×1万 | 16.6196 | 5.2983 |
| x5 着工床面積/万人 | 着工建築物床面積 ÷ 総人口 | 1.0362 | 0.1594 |
| x6 住宅地価格(万円/m²) | 標準価格(住宅地) ÷ 1万 | 5.0888 | 5.6117 |
x1 の7産業は「建設業・製造業・情報通信業・卸売小売業・宿泊飲食業・教育学習支援業・サービス業」、x2 の上位5か国は「ベトナム・中国・フィリピン・インドネシア・タイ」(技能実習生の約95%)。x3〜x6 は見かけ上の相関(交絡)を統制するために投入された。
各都道府県には数値化しにくい「魅力度」など観察されない異質性がある。これが独立変数と相関すると最小二乗法の推定にバイアスが生じる。そこで固定効果モデルを用い、個体(都道府県)と時間(年度)の両方の水準差を除く二方向固定効果で推定する。都道府県ダミーの係数 αi は「技能実習生にとっての各県の魅力度」、年度ダミーの係数は「年ごとの受入増減」を表す指標になる。
著者は、産業の偏りが大きい地方部でも、偏りの小さい大都市でも技能実習生割合が高まり、U字型の2次相関が生じると仮説を立てた。そこで x1 の1次項と2乗項を同時に投入した(結果は仮説と逆符号の逆U字だった、後述)。
有効求人倍率(x3)と製造業事業所数(x4)の相関は r=0.469 とやや高い。「後継者不足の中小製造業が多い地域ほど求人倍率が高い」という条件付き効果を統制するため、多重共線性への配慮も兼ねて交差項 x3×x4 を投入した。
まず分析の中心である表4の回帰結果を見る。ここは原論文の報告値をそのまま図にする(再計算ではない)。
146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 | TABLE4 = [ # (表示名, 係数, 標準誤差, 有意記号) ('x1 就労産業クラスター', 2.299, 0.8178, '**'), ('x1^2 就労産業クラスター(2乗)', -2.495, 0.9774, '*'), ('x2 国籍クラスター', 0.3785, 0.1587, '*'), ('x3 有効求人倍率', -0.2047, 0.1625, ''), ('x4 製造業事業所数/万人', -0.1001, 0.0172, '***'), ('x5 着工床面積/万人', -0.0187, 0.0582, ''), ('x6 住宅地価格', -0.0433, 0.0071, '***'), ('x3×x4 交差項', 0.0103, 0.0068, ''), ] N_OBS, ADJ_R2 = 188, 0.98284 print(f" {'独立変数':<26}{'係数':>10}{'標準誤差':>10}{'有意':>6}") print(" " + "-" * 52) for name, b, se, sig in TABLE4: print(f" {name:<26}{b:>10.4f}{se:>10.4f}{sig:>6}") print(" " + "-" * 52) print(f" サンプルサイズ N = {N_OBS} / 自由度調整済み決定係数 = {ADJ_R2}") |
=== [2] 【報告値の可視化】表4 パネルデータ分析の結果(原論文より転記)
====================================================================
独立変数 係数 標準誤差 有意
----------------------------------------------------
x1 就労産業クラスター 2.2990 0.8178 **
x1^2 就労産業クラスター(2乗) -2.4950 0.9774 *
x2 国籍クラスター 0.3785 0.1587 *
x3 有効求人倍率 -0.2047 0.1625
x4 製造業事業所数/万人 -0.1001 0.0172 ***
x5 着工床面積/万人 -0.0187 0.0582
x6 住宅地価格 -0.0433 0.0071 ***
x3×x4 交差項 0.0103 0.0068
----------------------------------------------------
サンプルサイズ N = 188 / 自由度調整済み決定係数 = 0.98284
有意水準 ***: p<.001 **: p<.01 *: p<.05 .: p<.10
読み: x1は係数+2.299(**)・2乗項-2.495(*)で【逆U字】。x2国籍は+0.3785(*)で正。
x4製造業事業所数(-0.1001,***)とx6住宅地価格(-0.0433,***)は有意に負。
x3有効求人倍率・x5着工床面積・x3×x4交差項は有意でない。※すべて報告値。
====================================================================
177 178 179 180 181 182 183 184 185 186 187 | # 原論文 表5(2016年を基準=0 とした年度固定効果) YEARS = [2016, 2017, 2018, 2019] TIME_COEF = [0.0000, 0.0667, 0.1287, 0.2254] TIME_SE = [None, 0.0197, 0.0334, 0.0345] TIME_SIG = ['***', '**', '***', '***'] print(f" {'年度':<8}{'時間効果係数':>12}{'標準誤差':>10}{'有意':>6}") print(" " + "-" * 36) for y, c, se, sig in zip(YEARS, TIME_COEF, TIME_SE, TIME_SIG): se_s = '―' if se is None else f'{se:.4f}' print(f" {y:<8}{c:>12.4f}{se_s:>10}{sig:>6}") print(" " + "-" * 36) |
=== [3] 【報告値の可視化】表5 年度ごとの時間効果(原論文より転記)
====================================================================
年度 時間効果係数 標準誤差 有意
------------------------------------
2016 0.0000 ― ***
2017 0.0667 0.0197 **
2018 0.1287 0.0334 ***
2019 0.2254 0.0345 ***
------------------------------------
読み: 2016→2019 で時間効果は単調に増加(0→0.0667→0.1287→0.2254)。
技能実習生受入が年々強まったことを示す。※報告値。
====================================================================
都道府県ダミーの係数 αi は「技能実習生にとっての各県の魅力度」を表す。地図の代わりに標準化個体効果のランキングで、正の効果がどこに集まるかを可視化する。
199 200 201 202 203 204 205 206 207 208 209 210 211 212 213 214 215 216 217 218 219 220 221 222 | # 原論文 表6 の生の個体効果 αi(PDFから全47都道府県を転記)。愛知は基準県で αi=0。 ALPHA = { '北海道':-1.676,'青森':-1.728,'岩手':-0.9746,'宮城':-1.463,'秋田':-1.176,'山形':-0.5994, '福島':-0.8719,'茨城':-0.6030,'栃木':-0.4443,'群馬':-0.1008,'埼玉':-0.8639,'千葉':-1.442, '東京':-0.5908,'神奈川':-1.043,'新潟':-0.5530,'富山':0.2044,'石川':0.0059,'福井':0.3584, '山梨':-0.7100,'長野':-0.2901,'岐阜':0.5550,'静岡':-0.0541,'愛知':0.0000,'三重':-0.3649, '滋賀':-0.6049,'京都':-0.7951,'大阪':-0.1931,'兵庫':-0.9517,'奈良':-1.280,'和歌山':-1.033, '鳥取':-1.128,'島根':-0.9412,'岡山':-0.7145,'広島':-0.3725,'山口':-1.352,'徳島':-0.8800, '香川':-0.2273,'愛媛':-0.5517,'高知':-1.064,'福岡':-1.443,'佐賀':-1.061,'長崎':-1.432, '熊本':-1.212,'大分':-1.232,'宮崎':-1.337,'鹿児島':-1.402,'沖縄':-1.962, } # 原論文 表7 が標準化に用いた定数(平均・標準偏差=報告値) REP_MEAN, REP_SD = -0.916, 0.526 prefs = list(ALPHA.keys()) alpha = np.array([ALPHA[p] for p in prefs]) # 表7 の標準化(原論文の報告パラメータを使用): CV_i = (αi - 平均) / 標準偏差 alpha_std = (alpha - REP_MEAN) / REP_SD print(f" 標準化定数(報告値): 平均 {REP_MEAN} / 標準偏差 {REP_SD} を使用") print(f" (表6 αi 実測の平均 {alpha.mean():.3f}・SD {alpha.std():.3f} とは僅差だが、") print(f" 個々の標準化値は表7の記載値を正しく再現する=報告値の転記)") order = np.argsort(-alpha_std) print("\n 標準化個体効果(表7の再現)上位10:") for r in order[:10]: print(f" {r+1:>2}位 {prefs[r]:<4} 標準化={alpha_std[r]:+.4f} (生の αi={alpha[r]:+.4f})") |
=== [4] 【報告値の可視化】表6→表7 都道府県別の個体効果と標準化
====================================================================
標準化定数(報告値): 平均 -0.916 / 標準偏差 0.526 を使用
(表6 αi 実測の平均 -0.800・SD 0.566 とは僅差だが、
個々の標準化値は表7の記載値を正しく再現する=報告値の転記)
標準化個体効果(表7の再現)上位10:
21位 岐阜 標準化=+2.7966 (生の αi=+0.5550)
18位 福井 標準化=+2.4228 (生の αi=+0.3584)
16位 富山 標準化=+2.1300 (生の αi=+0.2044)
17位 石川 標準化=+1.7527 (生の αi=+0.0059)
23位 愛知 標準化=+1.7414 (生の αi=+0.0000)
22位 静岡 標準化=+1.6386 (生の αi=-0.0541)
10位 群馬 標準化=+1.5498 (生の αi=-0.1008)
27位 大阪 標準化=+1.3743 (生の αi=-0.1931)
37位 香川 標準化=+1.3093 (生の αi=-0.2273)
20位 長野 標準化=+1.1899 (生の αi=-0.2901)
※原論文本文は上位5位を「岐阜・福井・栃木・愛媛・山形」とし、
大都市圏の周縁地域に正の効果が集中すると結論(報告値)。
※より正確な分析(補足):表7の数値どおりに並べると、愛知(生の個体効果=0の
基準県)や長野・三重・広島も正の標準化個体効果を示し、栃木・愛媛より上位。
愛知は基準県ゆえ標準化で見かけ上大きくなる点に注意。原論文の主張自体は
「大都市の周縁に正の効果」という傾向として妥当。
ここまでは報告値の可視化だった。最後に、SSDSE-Bで実際に再計算できる統制変数(有効求人倍率・住宅地価格・着工床面積)を計算し、原論文 表2 の記述統計と照合する。これは技能実習生の実習地選択そのものではなく、データの妥当性チェックである。
header=1 で読み込み、都道府県行(地域コード R+5桁)の2016〜2019年だけ残す(47×4=188で論文のNと一致)。統制変数のうち x3=求人数/求職者数・x5=着工床面積/総人口・x6=住宅地価格/1万 を計算し、原論文 表2 の平均・標準偏差・最小・最大と一致度を並べる。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 | df_raw = pd.read_csv(DATA_B, encoding='cp932', header=1) # 都道府県行のみ(地域コード = R + 5桁、全国 R00000 を除外) df = df_raw[df_raw['地域コード'].astype(str).str.match(r'^R\d{5}$', na=False)].copy() df['年度'] = df['年度'].astype(int) # 論文の分析期間 2016〜2019 に限定(47都道府県 × 4年 = 188 と一致するはず) d = df[df['年度'].between(2016, 2019)].copy() pop = pd.to_numeric(d['総人口'], errors='coerce') req = pd.to_numeric(d['月間有効求人数(一般)'], errors='coerce') seek = pd.to_numeric(d['月間有効求職者数(一般)'], errors='coerce') floor = pd.to_numeric(d['着工建築物床面積'], errors='coerce') land = pd.to_numeric(d['標準価格(平均価格)(住宅地)'], errors='coerce') d['x3_有効求人倍率'] = req / seek # = 有効求人数 / 有効求職者数 d['x5_着工床面積対人口'] = floor / pop # = 着工建築物床面積 / 総人口(m2/人) d['x6_住宅地価格'] = land / 10000 # = 標準価格(住宅地)/ 10000(万円/m2) print(f" 対象: {d['都道府県'].nunique()} 都道府県 × {d['年度'].nunique()} 年度 = {len(d)} 観測(論文 N=188)") print() # 原論文 表2 の記述統計(報告値) REPORTED = { 'x3_有効求人倍率': dict(mean=1.3955, sd=0.2578, mn=0.8846, mx=1.9998), 'x5_着工床面積対人口': dict(mean=1.0362, sd=0.1594, mn=0.6783, mx=1.5569), 'x6_住宅地価格': dict(mean=5.0888, sd=5.6117, mn=1.3300, mx=37.4300), } LABEL = {'x3_有効求人倍率':'x3 有効求人倍率', 'x5_着工床面積対人口':'x5 着工床面積/人口', 'x6_住宅地価格':'x6 住宅地価格(万円/m2)'} print(f" {'変数':<20}{'統計量':<6}{'再計算値':>12}{'報告値(表2)':>12}{'一致度':>9}") print(" " + "-" * 62) recomp = {} for col, rep in REPORTED.items(): s = d[col] got = dict(mean=s.mean(), sd=s.std(), mn=s.min(), mx=s.max()) recomp[col] = got for stat, jp in [('mean','平均'), ('sd','標準偏差'), ('mn','最小'), ('mx','最大')]: ratio = got[stat] / rep[stat] if rep[stat] else float('nan') head = LABEL[col] if stat == 'mean' else '' print(f" {head:<20}{jp:<6}{got[stat]:>12.4f}{rep[stat]:>12.4f}{ratio:>8.1%}") |
=== [1] 【実再現】SSDSE-B-2026 による統制変数 x3・x5・x6 の再現
====================================================================
対象: 47 都道府県 × 4 年度 = 188 観測(論文 N=188)
変数 統計量 再計算値 報告値(表2) 一致度
--------------------------------------------------------------
x3 有効求人倍率 平均 1.3955 1.3955 100.0%
標準偏差 0.2585 0.2578 100.3%
最小 0.8846 0.8846 100.0%
最大 2.0000 1.9998 100.0%
--------------------------------------------------------------
x5 着工床面積/人口 平均 1.0271 1.0362 99.1%
標準偏差 0.1613 0.1594 101.2%
最小 0.6773 0.6783 99.9%
最大 1.5515 1.5569 99.7%
--------------------------------------------------------------
x6 住宅地価格(万円/m2) 平均 5.0888 5.0888 100.0%
標準偏差 5.6267 5.6117 100.3%
最小 1.3300 1.3300 100.0%
最大 37.4300 37.4300 100.0%
--------------------------------------------------------------
→ x3・x6 は平均・最小・最大まで報告値とほぼ完全一致。
x5 は着工床面積/総人口(m2/人)で約1%差(SSDSE-B改訂による微差)。
技能実習生数・就労産業/国籍クラスター(x1,x2)・製造業事業所数(x4)は
SSDSE-B に無いため、以下の表4・5・7は報告値の可視化として扱う。
====================================================================
仮説はU字だったが、結果は逆U字。産業の偏りが極端に大きい地域と極端に小さい地域では技能実習生割合がむしろ低く、中間層で最も高い。著者は、産業割合の全国平均に外国人労働者全般のデータを使ったため、製造業中心の技能実習生とのズレが生じたと考察。「都会過ぎず田舎過ぎない地域」に集まる傾向の手がかりになったとする。
仮説通り正で有意(.001<p<.05)。国籍の偏りが大きい地域ほど、同国籍の実習生が帰属意識を抱きやすく、乗数的に増える傾向が認められた。
| 変数 | 結果(報告値) | 著者の解釈 |
|---|---|---|
| x3 有効求人倍率 | 非有意 | 全業種横断の指標で、製造・建設中心の技能実習生割合とは相関しにくい |
| x4 製造業事業所数/万人 | 負・有意(***) | 従属変数の分母(労働人口)が大きくなり効果が薄まるトレードオフ |
| x5 着工床面積/万人 | 非有意 | 建築業への就業は2割程度で、県境をまたぐ性質もあり交絡になりにくい |
| x6 住宅地価格 | 負・有意(***) | 生活費を抑えられる地域を選ぶ傾向(初期投資が小さい) |
年度効果は2016→2019で単調増加(労働市場のグローバル化・制度の後押し)。個体効果は大都市圏の周縁地域(関東外縁・北陸・中京・瀬戸内周辺)に正の効果が集中し、新潟・名古屋・広島といった中規模工業都市を中心に同心円状に波及する、と著者は結論した。
本研究は、外国人技能実習生の実習地選択を産業・国籍のクラスター効果という指標に落とし込み、47都道府県×4年のパネルを二方向固定効果モデルで分析した。製造業事業所数と住宅地価格が有意に負、国籍クラスターが正、就労産業クラスターは逆U字(いずれも報告値)で、技能実習生が「都会過ぎず田舎過ぎない地域」を選ぶ傾向を一定の有意水準で定量化・可視化した。
このページの統制変数の再現検証(図4)は、以下から実際に再現できます。
🐍 再現コード(.py) 📊 SSDSE-B-2026.csv
※ 回帰係数(図3)・時間効果(図1)・個体効果ランキング(図2)は、技能実習生数・就労産業/国籍クラスター・製造業事業所数などSSDSE-B外のデータに基づくため、原論文の報告値を可視化したものです。図4のみ実データからの再計算で、しかも従属変数ではなく統制変数の妥当性確認です。本ページに新しく推定した数値はありません。
この研究を読むとき・まねするときに陥りやすい誤解を整理する。
クリックすると各用語の詳しい解説ページに移動できます。
この研究で使われている手法を、手を動かす順に説明する。
この研究の「データの制約で仮説が一部覆った」という結論は、次の研究の出発点になる。
再現コードを少し変えるだけで試せる課題を、易しい順に用意した(図4の統制変数再現がベース)。
d = df[df['年度'].between(2016, 2019)] の範囲を 2020〜2023 に変えて、有効求人倍率や住宅地価格の平均がどう動いたか確かめよう。x6_住宅地価格 で47都道府県を降順に並べ、東京・神奈川が上位、地方が下位という構図を確認しよう。原論文が x6 を負に効くと報告した背景が見えてくる。scipy.stats.pearsonr で2019年の x3 と x6 の相関を計算しよう。原論文 表3 では両者の相関は0.12前後だった。近い値になるか?linearmodels.PanelOLS で都道府県固定効果を入れて推定してみよう(技能実習生割合の代わりの練習)。この研究を読んで浮かびやすい疑問に答える。
この論文を理解できたか、クリックで確認しましょう。間違えても解説が出ます。
このページの分析は、この画面の中でそのまま実行できます。
Python をインストールする必要も、CSV をダウンロードする必要もありません。
下のセルの 「▶ ブラウザで実行」 を上から順に押すか、
「▶ 最初から全部実行」 で一気に流してください。
表示されるのは、本文の図表とまったく同じ計算の結果です
(動かしているのは再現スクリプト code/2021_U5_1_shorei.py そのもの)。
コードは書き換えられます。「✏️ 書き換える」で数字や変数を変えて ▶ を押すと、 結果がどう変わるかをその場で確かめられます(元に戻すボタンつき)。 ページを開いた時点で裏で実行環境の準備が始まっているので、待ち時間はほとんどありません。 初回だけ実行環境の取得にインターネット接続が必要です。