論文一覧に戻る 🕸 論文ネットワーク 🗺 用語ネットワーク 統計データ分析コンペ 教育用再現集
特別賞(統計分析)[大学生・一般の部] ★

自治体間の人口流動性を考慮した
潜在的な人手不足の可視化

⏱️ 推定読了時間: 約30分
記述統計・ポジショニングマップ・非負値行列因子分解(NMF)
2021年度(令和3年度)統計データ分析コンペティション | 渡邉 晃大・村上 竜之介(千葉工業大学先進工学部知能メディア工学科) | SSDSE-A(産業別従業者数 2014・2016)/再現はSSDSE-B(転入・転出)
🔬 ポジショニングマップ🔬 記述統計🔬 非負値行列因子分解🏷 労働・雇用🏷 移住・人口移動🏷 農林水産
🔬 手法タグ / 🏷 応用タグ(クリックで同タグの論文をネットワーク検索)
🔬 再現カルテ — 原論文のデータが手に入らないため、代替データで再現

この教材は、原論文が使ったデータそのものを使えていません。そこで代わりのデータで同じ問いを追いかけ、結論の向き(増える/減る、強い/弱い)が原論文と一致するかを確かめます。「同じ数値が出る」ことは目標にしていません。

原論文が使ったデータSSDSE-A
分析単位:都道府県
中核手法:非負値行列因子分解
この教材が使うデータ
原論文(PDF)自治体間の人口流動性を考慮した潜在的な人手不足の可視化
特別賞/渡邉 晃大・村上 竜之介(千葉工業大学先進工学部知能メディア工学科)
✅ この教材でできること
  • 分析に使うデータは同梱済みで、ブラウザ上でそのまま読み込める
  • 数値・図を最後まで再計算できる(相関分析)
⚠️ この教材ではできないこと(原論文との違い)
  • 原論文と同じデータでの再現はできない:論文=SSDSE-A(市区町村) → 教材=SSDSE-B
  • 原論文は SSDSE-A を使っているが、この教材は SSDSE-B を使っている(原論文本文で確認)
📄 原論文との違いを、もっと詳しく
📄 原論文:市区町村(SSDSE-A 系)の自治体間人口流動性データから潜在的な人手不足を可視化。
📘 本教材:step 1〜4 は SSDSE-B(都道府県)での代理分析。step 5 で原論文と同じ市区町村粒度(SSDSE-A-2025・N=1,740)の人口流動 × 労働供給構造を再現
⚠️ 注意:原論文の流動性指標の定義は簡略化している。学ぶべきは市区町村粒度で人口流動を見る視点。
🚀 原論文と同じ粒度で挑戦したい人へ

原論文と同じ粒度のデータは、この教材にも同梱しています。これを読み込めば、原論文と同じ細かさで分析をやり直せます(下の「🐍 ブラウザで動かす」でコードを書き換えて試せます)。ただし原論文が使った項目がすべて収録されているとは限りません。足りない項目は、上の「できないこと」に書いた出典から取ってくる必要があります。

▶ ここに書いてある分析は、ページ下部の「🐍 ブラウザで動かす」でそのまま実行できます(インストール不要)。動かしているのは code/2021_U5_2_shorei.py(325 行)そのものです。

🏅 論文審査会コメント(審査員はここを評価した)
「素朴な探索的記述統計を用いた分析手順はシンプルで分かりやすく、結果も大変興味深いものが出ているが、構造化データで非負値分解する必然性の説明が必要である。」
出典:統計センター「統計データ分析コンペティション」受賞論文PDF掲載の審査講評。プロの審査員が何を評価し、何を注文したかは論文の読み方の最良の手本になる。
📝 3行で分かる要約

目次

  1. 研究のテーマと目的
  2. 使用データと指標の作り方(原論文)
  3. 分析方法:記述統計→ポジショニングマップ→NMF
  4. 図1:業種別の人手不足リスク地域(報告値の可視化)
  5. 図2:NMFの主要因子と反応地域(報告値の可視化)
  6. 主要な発見(原論文の報告値)
  7. 再現コード:転入超過を読み込む(実再現)
  8. 図3:転入超過率ランキング(実再現)
  9. 図4:転入超過率と高齢化率(実再現)
  10. 結果の解釈と提言
  11. SSDSE-A 市区町村の人口流動再現
  12. まとめ
  13. データ・コードのDL
  14. ⚠️ よくある誤解
  15. 📖 用語集
  16. 📐 手法ガイド
  17. 🚀 発展の可能性
  18. 🎯 自分でやってみよう
  19. 🤔 Q&A
  20. 🐍 ブラウザで動かす

🎯 この記事を読むと何ができるようになるか

📥 データの準備(再現コードを動かす前に)

このページの転入超過率ランキング(図3)と高齢化率との関係(図4)は、以下の手順で自分で再現できます。コードの編集は不要です。(人手不足リスク地域=図1、NMF因子=図2は、業種別従業者数などSSDSE-Bに無いデータを使うため、原論文の報告値を可視化します。)

1
データをダウンロードする 独立行政法人統計センターの SSDSE(教育用標準データセット)配布ページから、以下をダウンロードします。
SSDSE-B-2026.csv ← SSDSE-B(都道府県別・基礎データ、社会・人口統計体系)📥 直接DL
⬇ SSDSEダウンロードページを開く
2
ファイルを所定のフォルダに配置する ダウンロードしたCSVを、プロジェクトの data/raw/ フォルダに入れます。
2026 統計・データ解析コンペ/ ├── code/ │ └── 2021_U5_2_shorei.py ← 実行するスクリプト └── data/ └── raw/ SSDSE-B-2026.csv ← ここに置く
3
スクリプトをそのまま実行する ターミナルでプロジェクトルートに移動し、以下を実行します。
python3 code/2021_U5_2_shorei.py
図は html/figures/ に自動保存されます。
研究のテーマと目的

近年、都市部への人口集中が社会問題となっており、東京都は23年間連続で人口が増加している。国土交通白書によれば、東京圏(東京都・千葉県・埼玉県・神奈川県)には日本の人口の約29%=約3,700万人が居住する。2018年の東京都の転入超過数は13万6千人で、そのうち20代(20〜29歳)が約73%を占める(いずれも原論文の報告値)。若者の移動が東京圏への転入超過に大きく影響していることがわかる。

若者が地方から都市部へ流出すると、地方に残る産業の新しい労働力が不足し、地方産業の衰退につながる。それがさらに人口流出を招き、東京一極集中を深刻化させる——この悪循環を防ぐには、どの業種・どの地域が潜在的に人手不足に陥るのかを早期に可視化する必要がある。そこで著者は、産業別従業者数の時間変化に着目した。

約29%
東京圏に住む人口の割合(約3,700万人・報告値)
13万6千
2018年 東京都の転入超過数(人・報告値)
73%
東京圏転入超過に占める20代の割合(報告値)
10因子
非負値行列因子分解で抽出した因子数(報告値)
研究の問い 地方から都市部への若者の人口移動が盛んな状況で、潜在的に人手不足に陥る可能性のある業種と地域の関係性を可視化する。これにより人口集中の原因特定や対策の糸口を見つけることを目的とする。
分析のキモ:2つの指標「増加数」と「重要度」 著者は業種ごとに、①2014年→2016年の従業者の増加数(増加率)と、②地域内の全従業者に占める割合=重要度の2指標を計算した。重要度が高い(地域の中心産業)のに増加数が低い(人が減っている)業種・地域を、将来の人手不足リスクと捉える。

大学生・一般の部 SSDSE-A(産業別従業者数) ポジショニングマップ 非負値行列因子分解(NMF) コロプレス図

使用データと指標の作り方(原論文)

著者は年度をまたいだ産業別従業者数を用いた。2021年度版SSDSE-Aに2016年の、2020年度版SSDSE-Aに2014年の産業別従業者数が収録されており、この差から各産業の増減傾向を調べる。なお、2020年度版には漁業従事者数が無いため解析対象から除外している。

表1 使用した指標(原論文)

指標定義
増加率(2016年の産業Aの従業者数 − 2014年の産業Aの従業者数) ÷ 2014年の産業Aの従業者数
重要度2016年の産業Aの従業者数 ÷ 2016年の全事業従業者数(地域内シェア)
正規化各指標を都道府県間で min-max 変換し 0〜1 に(NMFの非負制約とスケール差の回避のため)
対象全47都道府県・15業種(漁業は2020年度版に無いため除外)
出典2021年度版・2020年度版 SSDSE-A(産業別従業者数)
再現可能性の整理(このページの図の作り方)
  • 報告値の可視化(再計算ではない):人手不足リスク地域(図1)とNMF因子(図2)は、産業別従業者数(SSDSE-A・2014/2016)に基づく。このデータは本教材が使うSSDSE-B(都道府県別基礎データ)に収録されていないため、原論文(PDF原本)の報告値を転記して可視化する。新たな数値の計算は一切していない。
  • 実再現できる部分:原論文の動機である「自治体間の人口流動性=転入超過(東京一極集中)」は、SSDSE-Bの転入者数・転出者数で近似再現できる(図3・図4)。ただし粒度は都道府県(原論文が課題に挙げた市区町村レベルの精緻化には及ばない)、年次は2023年(原論文の動機は2018年の人口移動)である点を図注に明記する。

分析方法:記述統計 → ポジショニングマップ → NMF

分析の流れ
産業別従業者数
(2014・2016)
増加数・重要度
を業種別に計算
ポジショニング
マップ
(4象限)
NMF
10因子→コロプレス図

① 記述統計:増加数と重要度

業種ごとに、年度間の差分から「従業者の増加数(増加率)」と、地域内の全従業者に占める割合から「重要度」を計算する。前者はその業種が伸びているか衰えているか、後者はその業種が地域でどれだけ中心的かを表す。

② ポジショニングマップ(4象限分析)

横軸に「増加数」、縦軸に「重要度」をとった散布図を業種別に15枚作成し、各軸の平均で4象限に分割する。とくに第二象限(重要度が高いのに増加数が低い=減少傾向)は、地域の中心産業なのに人が減っている状態で、将来的に人手不足に陥る可能性が高い。ここに着目する。

③ 非負値行列因子分解(NMF)

多数の変数(業種×指標)から全体傾向や地域性を把握するため、教師なし学習である非負値行列因子分解で次元を削減する。各指標を min-max で 0〜1 に正規化してから10因子に分解し、抽出された因子の重みを都道府県別に彩色(コロプレス図)して可視化する。

審査会コメント(原論文) 「素朴な探索的記述統計を用いた分析手順はシンプルで分かりやすく、結果も大変興味深いものが出ているが、構造化データで非負値分解する必然性の説明が必要である」。NMFの基底数などパラメータ設定の議論不足は、著者自身も今後の課題に挙げている。
1
図1:業種別の人手不足リスク地域(報告値の可視化)

原論文の図1(15枚のうち特徴的な5枚)で示された、業種別ポジショニングマップの第二象限=潜在的人手不足リスク地域を1枚に整理する。この図は再計算ではなく、産業別従業者数(SSDSE-A)に基づく原論文の報告値(PDF原本の記述)をそのまま転記・可視化したものである。

やってみよう原論文 図1 の第二象限(人手不足リスク地域)を転記する【報告値の可視化】
  • ① このコードの目的:産業別従業者数(SSDSE-A)はSSDSE-Bに無いため座標は再計算できない。そこでPDF原本が「重要度が高いのに増加率が低い(第二象限)」と読み取った地域を、業種ごとに辞書へ転記する。あわせて「伸び・期待(第一象限)」の地域も記す。
  • ② 前後のつながり:ここで転記した報告値がそのまま図1になる。数表としての座標値は原論文に無いため、地域名の転記にとどめる(再計算ではない)。
📝 コード
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原本からの転記。
  【農業・林業】人手不足リスク: 北海道・岩手県・青森県・長野県・鹿児島県
            伸び・期待  : 宮崎県・秋田県・島根県
  【卸売業・小売業】人手不足リスク: 北海道・鹿児島県・熊本県・和歌山県・長崎県・秋田県
            伸び・期待  : 都市部・沖縄県
  【運輸業・郵便業】人手不足リスク: 北海道・大阪府
            伸び・期待  : 埼玉県・千葉県
  【情報通信業】人手不足リスク: (該当なし)
            伸び・期待  : 東京都が極端に上昇(一極集中)
  【不動産業・物品賃貸業】人手不足リスク: 関西圏・北海道・沖縄県
            伸び・期待  : 東京都が突出(一極集中)
  • ④ 実行結果の読み取り:農業・林業は北海道・岩手・青森・長野・鹿児島、卸売・小売業は北海道・鹿児島・熊本・和歌山・長崎・秋田が人手不足リスク。情報通信業・不動産業は東京都が突出(一極集中)で、他県はほぼ同位置。すべて原論文の報告値である。
業種別の潜在的人手不足リスク地域(報告値の可視化)
図1:業種別ポジショニングマップの第二象限(高重要度・低増加=人手不足リスク)地域。報告値の可視化(再計算ではない)(原論文 図1・産業別従業者数 SSDSE-A 2014→2016)。赤=人手不足リスク、青=伸び・期待。座標値は原論文に数表が無く、地域名の転記による。
📊 この図の読み方
赤(第二象限)
重要度が高い(地域の中心産業)のに増加数が低い=人が減っている。将来の人手不足リスク。
青(第一象限)
重要度も増加数も高い=今後の伸びが期待できる業種・地域。
東京の突出
情報通信業・不動産業では東京都だけが極端に上昇し、一極集中の要因となっている。
位置づけ
報告値の可視化。地域名は原論文の報告値で、本ページで新たに計算したものではない。
2
図2:NMFの主要因子と反応地域(報告値の可視化)

非負値行列因子分解で得た10因子のうち、原論文が特徴的とした第2・第3・第10因子を、コロプレス図(地図)の代わりに反応が強い都道府県のリストで再表現する。NMFは産業別従業者数を入力とするため再計算できない。以下は原論文 表2・図2 の報告値の転記である。

やってみよう原論文 表2・図2 のNMF主要因子を転記する【報告値の可視化】
  • ① このコードの目的:10因子のNMF結果は産業別従業者数が入力で、SSDSE-Bでは再計算不可。PDF原本の表2(重みの大きい変数)と図2(反応が強い都道府県)を、第2・第3・第10因子について転記する。
  • ② 前後のつながり:ここで転記した因子の内容がそのまま図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因子=卸小売で東北+西日本+東京近郊(千葉・埼玉)。すべて原論文の報告値。
NMFの主要因子と反応が強い都道府県(報告値の可視化)
図2:非負値行列因子分解(10因子)の主要因子と、反応が強い都道府県。報告値の可視化(再計算ではない)(原論文 表2・図2・NMF)。コロプレス図(地図)を、指示に従い反応地域のリストで再表現。
📊 この図の読み方
第2因子(赤)
情報通信・金融・不動産業が東京都に集中。都市部(大阪・愛知など)も弱く反応し、都市部を特徴づける因子。
第3因子(青)
農業・林業の重要度が高いのに増加が低い。北海道・青森・岩手など東北の人手不足リスク。
第10因子(緑)
卸売・小売業の重要度が本研究で最大。東北+西日本+東京近郊で人手不足リスク。
位置づけ
報告値の可視化。因子の内容・反応地域は原論文の報告値である。
3
主要な発見(原論文の報告値)

以下の業種・地域はすべて原論文の報告値である。

因子/業種反応が強い地域著者の解釈
第2因子:情報通信・金融・不動産東京都(一極集中)主要企業・住宅需要・最新技術が東京に集まり、都市部を特徴づける
第3因子:農業・林業北海道・青森・岩手(東北)重要度が高いのに増加が低く、潜在的人手不足。近畿以西はリスク低
第10因子:卸売・小売業東北+大阪・京都・高知+千葉・埼玉ネット通販普及に伴う都市需要増が周辺の卸小売に影響

ポジショニングマップ(図1)では、農業・林業で北海道・岩手・青森・長野・鹿児島、卸売・小売業で北海道・鹿児島・熊本・和歌山・長崎・秋田、運輸・郵便業で北海道・大阪が人手不足リスクと判定された。情報通信業・不動産業は東京都の突出が顕著で、一極集中の要因と考えられる。

東北3県(北海道・青森・岩手)の限界も正直に記述 著者は、第3因子で東北3県が農林業の人手不足リスクを示したものの、他地域と比べて「なぜこの3県か」を決定づける要素は見つけられなかったと率直に述べている。今後は市区町村レベルの粒度の高いデータで裏づける必要がある、と課題を挙げる。
4
再現コード:転入超過を読み込む(実再現)

原論文の中核データ(産業別従業者数 SSDSE-A)はSSDSE-Bに無い。しかしSSDSE-Bには転入者数・転出者数があるので、原論文の動機である「自治体間の人口流動性=転入超過(東京一極集中)」を実データで再現できる。まず読み込む。

やってみようSSDSE-B を読み込み、転入超過(社会増減)を計算する【実再現】
  • ① このコードの目的:SSDSE-B を cp932・header=1 で読み込み、都道府県行(地域コード R+5桁)の2023年を残す。転入者数(日本人移動者)−転出者数=転入超過数を計算し、人口千人あたりに規格化する。原論文の動機である「自治体間の人口流動性」を、都道府県粒度で近似再現する。
  • ② 前後のつながり:ここで用意した転入超過が、原論文の背景=東京一極集中にあたる。以降でランキング(図3)と高齢化率との関係(図4)を実データで確かめる。
📝 コード
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年は転出超過)。
  • ④ 実行結果の読み取り:2023年、転入超過(社会増)はわずか6都府県(東京・千葉・埼玉・神奈川・福岡・大阪)で、41道県は転出超過。原論文が動機とした「東京圏+大阪・福岡への集中」が、最新のSSDSE-Bでも再現された(愛知は2018年は転入超過だが2023年は転出超過という年次差はある)。
5
図3:転入超過率ランキング(実再現)
やってみよう転入超過率で都道府県をランキングする【実再現】
  • ① このコードの目的:転入超過率で47都道府県を降順に並べ、上位(転入超過)と下位(転出超過)を書き出す。原論文が背景に置いた「東京圏への一極集中」を、地図の代わりにランキングで可視化する。
  • ② 前後のつながり:ここで得た順位を、図3の横棒ランキングにする(コロプレス図の代わりに順位で一極集中を表現)。
📝 コード
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
  • ④ 実行結果の読み取り:上位は東京都(千人あたり+4.15)・千葉・埼玉・神奈川と東京圏が独占し、福岡・大阪が続く。下位は長崎・青森・岩手・山形など地方が並ぶ。原論文の「東京一極集中/地方からの若者流出」が、転入超過という別データでもはっきり再現された。
転入超過率 都道府県ランキング(実再現)
図3:転入超過率(転入−転出/人口千人)ランキング(上位8・下位8)。実再現(SSDSE-B 2023年・都道府県粒度・日本人移動者, N=47)。色は地域ブロック。コロプレス図の代わりにランキングで一極集中を表現。
📊 この図の読み方
右(プラス)
転入超過=社会増。東京都が突出し、千葉・神奈川・埼玉と東京圏が上位を占める。
左(マイナス)
転出超過=社会減。長崎・青森・岩手・山形など地方が並び、若者を中心に流出が続く。
粒度差の注記
実再現。ただし都道府県粒度で、原論文が課題に挙げた市区町村レベルには及ばない。年次も2023年で原論文の動機(2018年)とは異なる。
6
図4:転入超過率と高齢化率(実再現)

原論文が問題視した「若者の流出→地方の労働力減少」を、転入超過率と高齢化率の関係として実データで確かめる。高齢化率はSSDSE-Bに収録されている。

やってみよう転入超過率と高齢化率の相関を計算する【実再現】
  • ① このコードの目的:転入超過率と高齢化率(65歳以上人口比率)の相関係数を実際に計算し、「若者が流出する地域ほど高齢化が進み、労働力が細る=人手不足リスク」という原論文の文脈を実データで確かめる。
  • ② 前後のつながり:ここで負の相関が出るかを確認してから、図4の散布図を描く。
📝 コード
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)
負の相関:転出超過(人口流出)の県ほど高齢化率が高い。若者流出が続く地域は労働力が細り、潜在的人手不足に陥りやすいという原論文の文脈と整合。
  • ④ 実行結果の読み取り:再計算 r=−0.795(p<0.001, N=47)。転出超過(人口流出)の県ほど高齢化率が高い、という強い負の相関。若者流出が続く地域は労働力が細り潜在的人手不足に陥りやすいという原論文の問題意識と整合する。ただしこれは横断的な相関で、原論文のポジショニングマップ/NMF(業種別の分析)とは手法もデータも異なる補足的な確認である。
転入超過率と高齢化率の散布図(実再現)
図4:転入超過率と高齢化率(SSDSE-B 2023年・都道府県粒度, N=47)。実再現:再計算 r=−0.795(p<0.001)。原論文の「若者流出=人手不足リスク」の文脈を横断データで補足確認したもの(業種別のNMF結果そのものではない)。
📊 この図の読み方
右下がり
転入超過率が高い(人が集まる)県ほど高齢化率が低く、転出超過の県ほど高齢化率が高い。
因果ではない
高齢化が流出を招くのか、流出が高齢化を進めるのか、この相関だけでは決められない(双方向・第3要因の可能性)。
位置づけ
実再現(補足)。原論文の中核(業種別ポジショニング・NMF)とはデータ・手法が異なる、動機の裏づけである。

結果の解釈と提言(原論文「5. 結果の解釈」)

情報通信・金融・不動産業の東京一極集中

図1(d)・表2・図2(a)から、情報通信業・金融業・不動産業・物品賃貸業が東京都に集中していることが読み取れた。著者は、東京都の人口が多く住宅需要が大きいこと(不動産業)、主要企業が東京に集まりそれを相手にする産業であること(情報通信業)などを理由に挙げる。大阪・愛知・宮城・広島・福岡・関東圏も弱く反応しており、この因子が都市部を特徴づける要因だと解釈した。

東北の農業・林業/広域の卸売・小売業の人手不足リスク

北海道・青森・岩手では農業・林業が潜在的人手不足に陥る可能性が示されたが、決定的な要素は見つからず、市区町村粒度での検証が必要だと述べる。卸売・小売業は東北・西日本・東京近郊で広くリスクが示され、ネットショッピング普及に伴う都市部の需要増が周辺に影響した結果と考察している。

提言:東京集中産業の地方分散と地方産業の機能強化 著者は、地方の人手不足を解消し東京一極集中を是正するために、東京都に集中している産業を地方に分散させることや、地方で確立している産業の機能を強化し、地方の人が地元で就職したいと思える政策を推進することが必要だと提言する。
5
SSDSE-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})')
▼ 実行結果
市区町村数: 1740 転出超過率 上位5(人口流出=潜在的人手不足の供給源): 福島県浪江町: 転出超過 10.97%/年 東京都青ヶ島村: 転出超過 5.92%/年 福島県飯舘村: 転出超過 4.78%/年 福島県富岡町: 転出超過 4.42%/年 熊本県球磨村: 転出超過 4.23%/年 転出超過率 × 生産年齢割合: r = -0.318 (p=4.3e-42)
💡 解説
  • 転出超過率の上位は原発事故・災害の被災自治体と離島。転出超過が大きい自治体ほど生産年齢割合が低い(r=−0.32, p<10⁻⁴¹)——人口流出が労働供給の質的な劣化も伴うという原論文の問題意識を市区町村レベルで確認できます。
💡 Python TIPS 転出超過率 =(転出 − 転入)÷ 総人口。符号の向きに注意(正 = 流出超過)。

まとめ

本研究は、産業別従業者数の「増加数」と「重要度」という2指標でポジショニングマップを作り、さらに非負値行列因子分解でコロプレス図を描くことで、将来的に人手不足に陥る可能性のある業種と地域の関係性を可視化した。情報通信・金融・不動産の東京一極集中、東北の農林業、広域の卸小売という人手不足リスクを示し、産業の地方分散・地方産業の機能強化を提言した点に価値がある。

この研究の限界(原論文の今後の課題) ①NMFの基底数などパラメータ設定の議論が不足している(審査会も「非負値分解の必然性の説明が必要」と指摘)。②人口の比率を考慮した特徴量の導入。③今回除外した漁業データの追加。④市区町村レベルのより粒度の高いデータによる精緻化。
この研究から学べること 「変化(増加数)」と「規模・シェア(重要度)」を2軸に置いて4象限で解釈する探索的な発想と、多数の変数を教師なし学習(NMF)で圧縮して地図に落とす可視化の流れ。素朴でシンプルだが、政策課題の共有に資する興味深い結果を出せることを示している。

データ・コードのダウンロード

このページの転入超過率ランキング(図3)と高齢化率との関係(図4)は、以下から再現できます。

🐍 再現コード(.py) 📊 SSDSE-B-2026.csv

※ 人手不足リスク地域(図1)とNMF因子(図2)は、産業別従業者数(SSDSE-A・2014/2016)に基づくためSSDSE-Bでは再計算できず、原論文の報告値を可視化したものです。図3・図4は転入超過による近似的な確認で、都道府県粒度・2023年であり、原論文の産業別分析(市区町村粒度の精緻化を課題とする)とは粒度・年次・データが異なります。

⚠️ よくある誤解と注意点

この研究を読むとき・まねするときに陥りやすい誤解を整理する。

誤解1:「人手不足リスクと判定された=実際に人手不足が起きている」
図1・図2が示すのは「重要度が高いのに増加が低い」という潜在的リスクの可視化であって、実際の求人倍率や欠員率を測ったものではない。あくまで探索的な指標であることに注意。
誤解2:「NMFの因子番号(第2・第3・第10)に大小の意味がある」
NMFの因子には主成分分析のような明確な順位(寄与率の大小)は必ずしもない。第2・第3・第10因子は解釈しやすかった因子を著者が選んだもの。基底数(10)の設定根拠も含め、著者自身が課題と認めている。
誤解3:「このページの図はすべて原論文と同じ数値を計算し直したもの」
図1・図2は原論文の報告値の可視化(再計算ではない)。産業別従業者数がSSDSE-Bに無いため転記である。図3・図4は実再現だが、転入超過による都道府県粒度・2023年の近似で、原論文の産業別分析そのものではない。図注に明記している。
誤解4:「相関 r=−0.795 は高齢化が人口流出を引き起こす証拠」
相関は向きと強さを示すだけで、因果の向きは決められない。流出が高齢化を進めるのか、高齢化が流出を招くのか、あるいは第3の要因かはこの図だけでは分からない。

📖 用語集(この記事に出てくる統計用語)

クリックすると各用語の詳しい解説ページに移動できます。

非負値行列因子分解(NMF)
非負のデータ行列を、2つの非負行列の積に近似分解する次元削減手法。要素が足し算だけで表され、「部分の集まり」として解釈しやすい。本研究は10因子に分解した。
ポジショニングマップ
2つの指標を縦横軸にとった散布図を平均で4象限に分け、対象の位置づけを読み取る手法。本研究は増加数×重要度で人手不足リスク(第二象限)を探した。
重要度(地域内シェア)
ある業種の従業者数が、その地域の全従業者に占める割合。地域における産業の中心性を表す。
コロプレス図
地図上の各地域を、統計量の大小に応じて色分けする図。本研究はNMF因子の重みを都道府県別に彩色した。
教師なし学習
正解ラベルを使わずデータの構造やまとまりを見つける機械学習。NMFやクラスタリングが該当する。
転入超過(社会増減)
地域間の移動による人口の増減。転入者数−転出者数がプラスなら社会増(転入超過)。出生・死亡による自然増減と対をなす。
相関係数
2つの数量が一緒に増減する強さと向きを−1〜+1で表す指標。図4で転入超過率×高齢化率に使う。
SSDSE
教育用標準データセット。本研究はSSDSE-A(産業別従業者数)、本教材の再現はSSDSE-B(都道府県別基礎データ)を使う。

📐 使っている手法をわかりやすく解説

この研究で使われている手法を、手を動かす順に説明する。

全体像
産業別従業者数から「増加数」と「重要度」を計算 → ポジショニングマップで4象限に分けて人手不足リスクを探す → 非負値行列因子分解で多数の変数を10因子に圧縮し、コロプレス図で地域性を可視化する。探索的な記述統計と教師なし学習を組み合わせるのが見どころ。
🧭 ポジショニングマップ(4象限分析)
何をする
横軸=増加数、縦軸=重要度の散布図を業種別に作り、各軸の平均で4象限に分ける。第二象限(高重要度・低増加)を人手不足リスクとみなす。
読み方
点が第二象限にある地域=中心産業なのに人が減っている。第一象限は伸びが期待できる地域。
注意
平均で機械的に区切るため、外れ値(東京都など)が平均を引っ張ると他の点の象限が変わりうる。あくまで探索的な整理。
🧩 非負値行列因子分解(NMF)
何をする
非負のデータ行列を、2つの非負行列(基底×係数)の積に近似分解する。多数の変数を少数の因子にまとめ、地域性を掴む。
なぜ必要
業種×指標の変数が多すぎて全体傾向が見えないため。非負制約により「部分の足し合わせ」として解釈しやすい因子が得られる。
注意
基底数(因子数)の決め方に定石が少なく、結果が設定に依存する。入力は非負・スケール調整が必要(本研究は0〜1に正規化)。審査会も「非負分解の必然性の説明が必要」と指摘した。
🔗 相関係数(図4の実再現)
何をする
転入超過率と高齢化率が一緒に動く強さ・向きを−1〜+1で測る。本ページでは実データで r=−0.795 を得た。
なぜ必要
「若者流出=地方の高齢化・労働力減少」という原論文の文脈を、数値で確かめるため。
注意
相関は因果ではない。向きと強さのみを示す。外れ値(東京都)の影響も受けやすい。

🚀 発展の可能性(結果 X → 新仮説 Y → 課題 Z)

原論文が自ら挙げた課題は、次の研究の出発点になる。

発展1:市区町村粒度で人手不足リスクを精緻化
結果X
東北3県の農林業リスクは示せたが、「なぜこの3県か」の決定的要素は都道府県粒度では見つからなかった。
新仮説Y
人手不足リスクは県内でも地域差が大きく、市区町村粒度なら要因が特定できるのでは。
課題Z
市区町村別の産業別従業者数・人口流動データを使い、より細かい単位でポジショニングとNMFを行う(原論文が明示した発展方向)。
発展2:人口比・年齢構成を考慮した特徴量へ
結果X
増加数・重要度は従業者数の絶対量・シェアに基づき、人口規模や年齢構成の違いを直接は反映していない。
新仮説Y
人口比や若年就業者比率を組み込めば、真に人手不足に陥る地域をより正確に抽出できるのでは。
課題Z
人口比を考慮した特徴量や、除外した漁業データを加えて再分析する(原論文が課題に挙げた方向)。

🎯 自分でやってみよう(5つのチャレンジ)

再現コードを少し変えるだけで試せる課題を、易しい順に用意した。

★☆☆☆☆ 難易度1
別の年で転入超過を出す
読み込みの d = df_b[df_b['年度'] == 2023] を 2022 や 2015 に変えて、転入超過率ランキングが年で変わるか確かめよう。
★★☆☆☆ 難易度2
男女別の転入超過を比べる
列を「転入者数(日本人移動者)(男)/(女)」に差し替え、男女で東京圏集中の強さが違うか比べよう(原論文は20代の移動が大きいと指摘)。
★★★☆☆ 難易度3
高齢化率の代わりに出生率と相関させる
図4の高齢化率を「合計特殊出生率」や「総人口」に変えて、転入超過率との相関を見よう。高齢化率ほど強いか?
★★★★☆ 難易度4
複数指標をmin-max正規化する
転入超過率・高齢化率・出生率などを (x-min)/(max-min) で0〜1に正規化し、都道府県ごとの特徴ベクトルを作ろう。原論文のNMF前処理と同じ発想だ。
★★★★★ 難易度5
NMFで都道府県を因子分解する
sklearn.decomposition.NMF を使い、難易度4で作った非負の特徴量行列を数因子に分解して、都道府県別の因子の重みを見よう。原論文の手法を自分のデータで体験できる。
ヒント:from sklearn.decomposition import NMF; NMF(n_components=3).fit_transform(X)。入力は必ず非負にすること。

💼 この手法は実社会でこう使われている

「2軸で位置づけを探り、多数の変数を圧縮して地図に落とす」発想は、現場でも広く使われている。

🗾
地方創生・EBPM
産業構造と人口動態を業種×地域で可視化し、どの産業を誘致・強化すべきかの優先順位づけに使う。人手不足の早期警戒にも。
🛒
マーケティング(ポジショニング)
価格×品質、認知×好意などの2軸マップで、自社・競合の立ち位置と空白市場を探る。4象限分析はビジネスの定番。
🧬
NMFによる特徴抽出
画像の部分特徴、文書のトピック、遺伝子発現パターンの抽出など、「非負の部分の集まり」として解釈したい場面で広く使われる。

🤔 よくある質問(読者からの想定Q&A)

この研究を読んで浮かびやすい疑問に答える。

Q. タイトルは「人口流動性」なのに、分析は産業別従業者数ですね?
A. はい。人口流動性(若者の都市部流出・東京一極集中)は研究の動機・背景で、実際の分析は産業別従業者数の増加数と重要度でポジショニングマップとNMFを行っています。人口移動そのものは、本ページの図3・図4でSSDSE-Bの転入超過として実再現しています。
Q. このページの図は原論文と同じ数値ですか?
A. 一部だけ実再現です。図1(人手不足リスク地域)と図2(NMF因子)は、産業別従業者数(SSDSE-A・2014/2016)がSSDSE-Bに無いため、原論文(PDF原本)の報告値を転記・可視化したもの。図3・図4はSSDSE-Bの転入者数・転出者数・高齢化率から実際に計算した実データですが、都道府県粒度・2023年の近似で、原論文の産業別分析とは粒度・年次・データが異なります。図注に明記しています。
Q. なぜ第二象限が「人手不足リスク」なのですか?
A. 縦軸=重要度が高い=その地域の中心産業、横軸=増加数が低い(マイナス)=従業者が減っている、という組み合わせだからです。中心産業なのに人が減っている状態は、放置すれば人手不足に陥る可能性が高い、と解釈します。
Q. NMFの因子数はなぜ10なのですか?
A. 原論文では10因子に分解していますが、基底数(因子数)の決め方の議論は不足していると著者自身が今後の課題に挙げています。審査会も「構造化データで非負値分解する必然性の説明が必要」とコメントしており、因子数の選び方は本手法の重要な論点です。

✅ 理解度チェック(4問)

この論文を理解できたか、クリックで確認しましょう。間違えても解説が出ます。

🐍 ブラウザで動かす — インストール不要でこの論文の分析を再現する

このページの分析は、この画面の中でそのまま実行できます。 Python をインストールする必要も、CSV をダウンロードする必要もありません。 下のセルの 「▶ ブラウザで実行」 を上から順に押すか、 「▶ 最初から全部実行」 で一気に流してください。 表示されるのは、本文の図表とまったく同じ計算の結果です (動かしているのは再現スクリプト code/2021_U5_2_shorei.py そのもの)。

コードは書き換えられます。「✏️ 書き換える」で数字や変数を変えて ▶ を押すと、 結果がどう変わるかをその場で確かめられます(元に戻すボタンつき)。 ページを開いた時点で裏で実行環境の準備が始まっているので、待ち時間はほとんどありません。 初回だけ実行環境の取得にインターネット接続が必要です。