この教材は、原論文が使ったデータそのものを使えていません。そこで代わりのデータで同じ問いを追いかけ、結論の向き(増える/減る、強い/弱い)が原論文と一致するかを確かめます。「同じ数値が出る」ことは目標にしていません。
| 原論文が使ったデータ | SSDSE-A 分析単位:都道府県 中核手法:非負値行列因子分解 |
|---|---|
| この教材が使うデータ |
|
| 原論文(PDF) | 自治体間の人口流動性を考慮した潜在的な人手不足の可視化 特別賞/渡邉 晃大・村上 竜之介(千葉工業大学先進工学部知能メディア工学科) |
原論文と同じ粒度のデータは、この教材にも同梱しています。これを読み込めば、原論文と同じ細かさで分析をやり直せます(下の「🐍 ブラウザで動かす」でコードを書き換えて試せます)。ただし原論文が使った項目がすべて収録されているとは限りません。足りない項目は、上の「できないこと」に書いた出典から取ってくる必要があります。
▶ ここに書いてある分析は、ページ下部の「🐍 ブラウザで動かす」でそのまま実行できます(インストール不要)。動かしているのは code/2021_U5_2_shorei.py(325 行)そのものです。
このページの転入超過率ランキング(図3)と高齢化率との関係(図4)は、以下の手順で自分で再現できます。コードの編集は不要です。(人手不足リスク地域=図1、NMF因子=図2は、業種別従業者数などSSDSE-Bに無いデータを使うため、原論文の報告値を可視化します。)
data/raw/ フォルダに入れます。html/figures/ に自動保存されます。
近年、都市部への人口集中が社会問題となっており、東京都は23年間連続で人口が増加している。国土交通白書によれば、東京圏(東京都・千葉県・埼玉県・神奈川県)には日本の人口の約29%=約3,700万人が居住する。2018年の東京都の転入超過数は13万6千人で、そのうち20代(20〜29歳)が約73%を占める(いずれも原論文の報告値)。若者の移動が東京圏への転入超過に大きく影響していることがわかる。
若者が地方から都市部へ流出すると、地方に残る産業の新しい労働力が不足し、地方産業の衰退につながる。それがさらに人口流出を招き、東京一極集中を深刻化させる——この悪循環を防ぐには、どの業種・どの地域が潜在的に人手不足に陥るのかを早期に可視化する必要がある。そこで著者は、産業別従業者数の時間変化に着目した。
大学生・一般の部 SSDSE-A(産業別従業者数) ポジショニングマップ 非負値行列因子分解(NMF) コロプレス図
著者は年度をまたいだ産業別従業者数を用いた。2021年度版SSDSE-Aに2016年の、2020年度版SSDSE-Aに2014年の産業別従業者数が収録されており、この差から各産業の増減傾向を調べる。なお、2020年度版には漁業従事者数が無いため解析対象から除外している。
| 指標 | 定義 |
|---|---|
| 増加率 | (2016年の産業Aの従業者数 − 2014年の産業Aの従業者数) ÷ 2014年の産業Aの従業者数 |
| 重要度 | 2016年の産業Aの従業者数 ÷ 2016年の全事業従業者数(地域内シェア) |
| 正規化 | 各指標を都道府県間で min-max 変換し 0〜1 に(NMFの非負制約とスケール差の回避のため) |
| 対象 | 全47都道府県・15業種(漁業は2020年度版に無いため除外) |
| 出典 | 2021年度版・2020年度版 SSDSE-A(産業別従業者数) |
業種ごとに、年度間の差分から「従業者の増加数(増加率)」と、地域内の全従業者に占める割合から「重要度」を計算する。前者はその業種が伸びているか衰えているか、後者はその業種が地域でどれだけ中心的かを表す。
横軸に「増加数」、縦軸に「重要度」をとった散布図を業種別に15枚作成し、各軸の平均で4象限に分割する。とくに第二象限(重要度が高いのに増加数が低い=減少傾向)は、地域の中心産業なのに人が減っている状態で、将来的に人手不足に陥る可能性が高い。ここに着目する。
多数の変数(業種×指標)から全体傾向や地域性を把握するため、教師なし学習である非負値行列因子分解で次元を削減する。各指標を min-max で 0〜1 に正規化してから10因子に分解し、抽出された因子の重みを都道府県別に彩色(コロプレス図)して可視化する。
原論文の図1(15枚のうち特徴的な5枚)で示された、業種別ポジショニングマップの第二象限=潜在的人手不足リスク地域を1枚に整理する。この図は再計算ではなく、産業別従業者数(SSDSE-A)に基づく原論文の報告値(PDF原本の記述)をそのまま転記・可視化したものである。
126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 | positioning = { '農業・林業': { 'risk': ['北海道', '岩手県', '青森県', '長野県', '鹿児島県'], 'grow': ['宮崎県', '秋田県', '島根県'], }, '卸売業・小売業': { 'risk': ['北海道', '鹿児島県', '熊本県', '和歌山県', '長崎県', '秋田県'], 'grow': ['都市部', '沖縄県'], }, '運輸業・郵便業': { 'risk': ['北海道', '大阪府'], 'grow': ['埼玉県', '千葉県'], }, '情報通信業': { 'risk': [], 'grow': ['東京都が極端に上昇(一極集中)'], }, '不動産業・物品賃貸業': { 'risk': ['関西圏', '北海道', '沖縄県'], 'grow': ['東京都が突出(一極集中)'], }, } print('\n=== [2] 報告値の可視化:ポジショニングマップの第二象限=人手不足リスク地域(原論文 図1)===') print('※ 産業別従業者数(SSDSE-A)はSSDSE-Bに無いため再計算不可。以下はPDF原本からの転記。') for ind, v in positioning.items(): risk = '・'.join(v['risk']) if v['risk'] else '(該当なし)' print(f' 【{ind}】人手不足リスク: {risk}') print(f' 伸び・期待 : {"・".join(v["grow"])}') |
=== [2] 報告値の可視化:ポジショニングマップの第二象限=人手不足リスク地域(原論文 図1)===
※ 産業別従業者数(SSDSE-A)はSSDSE-Bに無いため再計算不可。以下はPDF原本からの転記。
【農業・林業】人手不足リスク: 北海道・岩手県・青森県・長野県・鹿児島県
伸び・期待 : 宮崎県・秋田県・島根県
【卸売業・小売業】人手不足リスク: 北海道・鹿児島県・熊本県・和歌山県・長崎県・秋田県
伸び・期待 : 都市部・沖縄県
【運輸業・郵便業】人手不足リスク: 北海道・大阪府
伸び・期待 : 埼玉県・千葉県
【情報通信業】人手不足リスク: (該当なし)
伸び・期待 : 東京都が極端に上昇(一極集中)
【不動産業・物品賃貸業】人手不足リスク: 関西圏・北海道・沖縄県
伸び・期待 : 東京都が突出(一極集中)
非負値行列因子分解で得た10因子のうち、原論文が特徴的とした第2・第3・第10因子を、コロプレス図(地図)の代わりに反応が強い都道府県のリストで再表現する。NMFは産業別従業者数を入力とするため再計算できない。以下は原論文 表2・図2 の報告値の転記である。
160 161 162 163 164 165 166 167 168 169 170 171 172 173 174 175 176 177 178 179 180 181 182 | factors = { '第2因子': { 'ind': '情報通信業・金融業・不動産業/物品賃貸業(重要度が高く増加数も多い)', 'pref': ['東京都'], 'note': '都市部(大阪・愛知・宮城・広島・福岡・関東圏)も弱く反応=東京一極集中の要因', }, '第3因子': { 'ind': '農業・林業(重要度が高いのに増加数が低い)', 'pref': ['北海道', '青森県', '岩手県'], 'note': '東北で農林業の潜在的人手不足リスク。近畿以西はリスクが低い', }, '第10因子': { 'ind': '卸売業・小売業(重要度が本研究で最大なのに増加数が低い)', 'pref': ['北海道', '青森県', '岩手県', '福島県', '大阪府', '京都府', '高知県', '千葉県', '埼玉県'], 'note': '東北+西日本+東京近郊(千葉・埼玉)で卸小売の潜在的人手不足リスク', }, } print('\n=== [3] 報告値の可視化:NMF主要因子と反応が強い都道府県(原論文 表2・図2)===') print('※ NMF(10因子)は産業別従業者数が入力。SSDSE-Bで再計算不可のためPDF原本から転記。') for fac, v in factors.items(): print(f' 【{fac}】{v["ind"]}') print(f' 反応が強い地域: {"・".join(v["pref"])}') print(f' 解釈 : {v["note"]}') |
=== [3] 報告値の可視化:NMF主要因子と反応が強い都道府県(原論文 表2・図2)===
※ NMF(10因子)は産業別従業者数が入力。SSDSE-Bで再計算不可のためPDF原本から転記。
【第2因子】情報通信業・金融業・不動産業/物品賃貸業(重要度が高く増加数も多い)
反応が強い地域: 東京都
解釈 : 都市部(大阪・愛知・宮城・広島・福岡・関東圏)も弱く反応=東京一極集中の要因
【第3因子】農業・林業(重要度が高いのに増加数が低い)
反応が強い地域: 北海道・青森県・岩手県
解釈 : 東北で農林業の潜在的人手不足リスク。近畿以西はリスクが低い
【第10因子】卸売業・小売業(重要度が本研究で最大なのに増加数が低い)
反応が強い地域: 北海道・青森県・岩手県・福島県・大阪府・京都府・高知県・千葉県・埼玉県
解釈 : 東北+西日本+東京近郊(千葉・埼玉)で卸小売の潜在的人手不足リスク
以下の業種・地域はすべて原論文の報告値である。
| 因子/業種 | 反応が強い地域 | 著者の解釈 |
|---|---|---|
| 第2因子:情報通信・金融・不動産 | 東京都(一極集中) | 主要企業・住宅需要・最新技術が東京に集まり、都市部を特徴づける |
| 第3因子:農業・林業 | 北海道・青森・岩手(東北) | 重要度が高いのに増加が低く、潜在的人手不足。近畿以西はリスク低 |
| 第10因子:卸売・小売業 | 東北+大阪・京都・高知+千葉・埼玉 | ネット通販普及に伴う都市需要増が周辺の卸小売に影響 |
ポジショニングマップ(図1)では、農業・林業で北海道・岩手・青森・長野・鹿児島、卸売・小売業で北海道・鹿児島・熊本・和歌山・長崎・秋田、運輸・郵便業で北海道・大阪が人手不足リスクと判定された。情報通信業・不動産業は東京都の突出が顕著で、一極集中の要因と考えられる。
原論文の中核データ(産業別従業者数 SSDSE-A)はSSDSE-Bに無い。しかしSSDSE-Bには転入者数・転出者数があるので、原論文の動機である「自治体間の人口流動性=転入超過(東京一極集中)」を実データで再現できる。まず読み込む。
header=1 で読み込み、都道府県行(地域コード R+5桁)の2023年を残す。転入者数(日本人移動者)−転出者数=転入超過数を計算し、人口千人あたりに規格化する。原論文の動機である「自治体間の人口流動性」を、都道府県粒度で近似再現する。100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 | df_b = pd.read_csv(DATA_B, encoding='cp932', header=1) df_b = df_b[df_b['地域コード'].str.match(r'^R\d{5}', na=False)].copy() df_b['年度'] = df_b['年度'].astype(int) d = df_b[df_b['年度'] == 2023].copy() d['転入超過数'] = d['転入者数(日本人移動者)'] - d['転出者数(日本人移動者)'] d['転入超過率'] = d['転入超過数'] / d['総人口'] * 1000 # 人口千人あたり d['高齢化率'] = d['65歳以上人口'] / d['総人口'] * 100 d['地域区分'] = d['都道府県'].map(region_map) d = d.sort_values('転入超過率', ascending=False).reset_index(drop=True) net_in = d[d['転入超過数'] > 0] print('=== [1] 実再現:転入超過(社会増減)の集計 ===') print(f'対象: SSDSE-B 2023年 / {len(d)}都道府県(転入者数−転出者数, 日本人移動者)') print(f'転入超過(社会増)の都道府県: {len(net_in)} / {len(d)}') print(' →', '・'.join(net_in['都道府県'].tolist())) print(f'転出超過(社会減)の都道府県: {len(d) - len(net_in)} / {len(d)}') print('原論文の動機(2018年): 東京圏+愛知・大阪・福岡が転入超過。' '2023年でも東京圏+大阪・福岡が転入超過で構図は共通(愛知は2023年は転出超過)。') |
=== [1] 実再現:転入超過(社会増減)の集計 === 対象: SSDSE-B 2023年 / 47都道府県(転入者数−転出者数, 日本人移動者) 転入超過(社会増)の都道府県: 6 / 47 → 東京都・千葉県・埼玉県・神奈川県・福岡県・大阪府 転出超過(社会減)の都道府県: 41 / 47 原論文の動機(2018年): 東京圏+愛知・大阪・福岡が転入超過。2023年でも東京圏+大阪・福岡が転入超過で構図は共通(愛知は2023年は転出超過)。
187 188 189 190 191 192 193 | print('\n=== [4] 実再現:転入超過率ランキング(SSDSE-B 2023, 人口千人あたり)===') print('[上位=転入超過]') for _, r in d.head(6).iterrows(): print(f' {r["都道府県"]:<5} 転入超過 {int(r["転入超過数"]):>+7,} 人 / 千人あたり {r["転入超過率"]:+.2f}') print('[下位=転出超過]') for _, r in d.tail(6).iterrows(): print(f' {r["都道府県"]:<5} 転入超過 {int(r["転入超過数"]):>+7,} 人 / 千人あたり {r["転入超過率"]:+.2f}') |
=== [4] 実再現:転入超過率ランキング(SSDSE-B 2023, 人口千人あたり)=== [上位=転入超過] 東京都 転入超過 +58,489 人 / 千人あたり +4.15 千葉県 転入超過 +16,375 人 / 千人あたり +2.62 埼玉県 転入超過 +17,850 人 / 千人あたり +2.43 神奈川県 転入超過 +22,088 人 / 千人あたり +2.39 福岡県 転入超過 +8,642 人 / 千人あたり +1.69 大阪府 転入超過 +13,071 人 / 千人あたり +1.49 [下位=転出超過] 鳥取県 転入超過 -1,888 人 / 千人あたり -3.52 福島県 転入超過 -6,926 人 / 千人あたり -3.92 山形県 転入超過 -4,190 人 / 千人あたり -4.08 岩手県 転入超過 -4,787 人 / 千人あたり -4.12 青森県 転入超過 -5,566 人 / 千人あたり -4.70 長崎県 転入超過 -6,357 人 / 千人あたり -5.02
原論文が問題視した「若者の流出→地方の労働力減少」を、転入超過率と高齢化率の関係として実データで確かめる。高齢化率はSSDSE-Bに収録されている。
199 200 201 | r_val, p_val = stats.pearsonr(d['転入超過率'], d['高齢化率']) print('\n=== [5] 実再現:転入超過率 × 高齢化率 の相関 ===') print(f'ピアソン相関 r = {r_val:.3f} (p = {p_val:.2e}, N={len(d)})') |
=== [5] 実再現:転入超過率 × 高齢化率 の相関 === ピアソン相関 r = -0.795 (p = 2.43e-11, N=47) 負の相関:転出超過(人口流出)の県ほど高齢化率が高い。若者流出が続く地域は労働力が細り、潜在的人手不足に陥りやすいという原論文の文脈と整合。
図1(d)・表2・図2(a)から、情報通信業・金融業・不動産業・物品賃貸業が東京都に集中していることが読み取れた。著者は、東京都の人口が多く住宅需要が大きいこと(不動産業)、主要企業が東京に集まりそれを相手にする産業であること(情報通信業)などを理由に挙げる。大阪・愛知・宮城・広島・福岡・関東圏も弱く反応しており、この因子が都市部を特徴づける要因だと解釈した。
北海道・青森・岩手では農業・林業が潜在的人手不足に陥る可能性が示されたが、決定的な要素は見つからず、市区町村粒度での検証が必要だと述べる。卸売・小売業は東北・西日本・東京近郊で広くリスクが示され、ネットショッピング普及に伴う都市部の需要増が周辺に影響した結果と考察している。
原論文は市区町村(SSDSE-A 系)の人口流動から潜在的な人手不足を可視化しました。同じ市区町村粒度で、転出超過率と労働供給構造の関係を確認します。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 | a = pd.read_csv('data/raw/SSDSE-A-2025.csv', encoding='cp932', header=2) a = a[a['地域コード'].str.match(r'^R\d+', na=False)].copy() a = a[pd.to_numeric(a['総人口'], errors='coerce') > 0] num = lambda c: pd.to_numeric(a[c], errors='coerce') d2 = pd.DataFrame({'市区町村': (a['都道府県'] + a['市区町村']).values}) d2['転出超過率'] = ((num('転出者数(日本人移動者)') - num('転入者数(日本人移動者)')) / num('総人口') * 100).values d2['生産年齢割合'] = (num('15~64歳人口') / num('総人口') * 100).values d2['第3次産業割合'] = (num('第3次産業就業者数') / num('就業者数') * 100).values d2 = d2.dropna() print(f'市区町村数: {len(d2)}') print('転出超過率 上位5(人口流出=潜在的人手不足の供給源):') for _, r in d2.nlargest(5, '転出超過率').iterrows(): print(f" {r['市区町村']}: 転出超過 {r['転出超過率']:.2f}%/年") r1, p1 = stats.pearsonr(d2['転出超過率'], d2['生産年齢割合']) print(f'転出超過率 × 生産年齢割合: r = {r1:+.3f} (p={p1:.1e})') |
本研究は、産業別従業者数の「増加数」と「重要度」という2指標でポジショニングマップを作り、さらに非負値行列因子分解でコロプレス図を描くことで、将来的に人手不足に陥る可能性のある業種と地域の関係性を可視化した。情報通信・金融・不動産の東京一極集中、東北の農林業、広域の卸小売という人手不足リスクを示し、産業の地方分散・地方産業の機能強化を提言した点に価値がある。
このページの転入超過率ランキング(図3)と高齢化率との関係(図4)は、以下から再現できます。
🐍 再現コード(.py) 📊 SSDSE-B-2026.csv
※ 人手不足リスク地域(図1)とNMF因子(図2)は、産業別従業者数(SSDSE-A・2014/2016)に基づくためSSDSE-Bでは再計算できず、原論文の報告値を可視化したものです。図3・図4は転入超過による近似的な確認で、都道府県粒度・2023年であり、原論文の産業別分析(市区町村粒度の精緻化を課題とする)とは粒度・年次・データが異なります。
この研究を読むとき・まねするときに陥りやすい誤解を整理する。
クリックすると各用語の詳しい解説ページに移動できます。
この研究で使われている手法を、手を動かす順に説明する。
原論文が自ら挙げた課題は、次の研究の出発点になる。
再現コードを少し変えるだけで試せる課題を、易しい順に用意した。
d = df_b[df_b['年度'] == 2023] を 2022 や 2015 に変えて、転入超過率ランキングが年で変わるか確かめよう。(x-min)/(max-min) で0〜1に正規化し、都道府県ごとの特徴ベクトルを作ろう。原論文のNMF前処理と同じ発想だ。sklearn.decomposition.NMF を使い、難易度4で作った非負の特徴量行列を数因子に分解して、都道府県別の因子の重みを見よう。原論文の手法を自分のデータで体験できる。from sklearn.decomposition import NMF; NMF(n_components=3).fit_transform(X)。入力は必ず非負にすること。「2軸で位置づけを探り、多数の変数を圧縮して地図に落とす」発想は、現場でも広く使われている。
この研究を読んで浮かびやすい疑問に答える。
この論文を理解できたか、クリックで確認しましょう。間違えても解説が出ます。
このページの分析は、この画面の中でそのまま実行できます。
Python をインストールする必要も、CSV をダウンロードする必要もありません。
下のセルの 「▶ ブラウザで実行」 を上から順に押すか、
「▶ 最初から全部実行」 で一気に流してください。
表示されるのは、本文の図表とまったく同じ計算の結果です
(動かしているのは再現スクリプト code/2021_U5_2_shorei.py そのもの)。
コードは書き換えられます。「✏️ 書き換える」で数字や変数を変えて ▶ を押すと、 結果がどう変わるかをその場で確かめられます(元に戻すボタンつき)。 ページを開いた時点で裏で実行環境の準備が始まっているので、待ち時間はほとんどありません。 初回だけ実行環境の取得にインターネット接続が必要です。