この教材は、原論文が使ったデータそのものを使えていません。そこで代わりのデータで同じ問いを追いかけ、結論の向き(増える/減る、強い/弱い)が原論文と一致するかを確かめます。「同じ数値が出る」ことは目標にしていません。
| 原論文が使ったデータ | 厚生労働省人口動態保健所・市区町村別統計・住民基本台帳移動報告・SSDSE-A 分析単位:市区町村 中核手法:LightGBM・回帰分析・クラスタリング |
|---|---|
| この教材が使うデータ |
|
| 原論文(PDF) | 市区町村別に見た少子化の要因分析 優秀賞/倉島 茂之(東京理科大学経営学部経営学科) |
原論文と同じ粒度のデータは、この教材にも同梱しています。これを読み込めば、原論文と同じ細かさで分析をやり直せます(下の「🐍 ブラウザで動かす」でコードを書き換えて試せます)。ただし原論文が使った項目がすべて収録されているとは限りません。足りない項目は、上の「できないこと」に書いた出典から取ってくる必要があります。
▶ ここに書いてある分析は、ページ下部の「🐍 ブラウザで動かす」でそのまま実行できます(インストール不要)。動かしているのは code/2021_U2_yushu.py(261 行)そのものです。
このページのTFRランキング・女性転入出比・大学収容力(図1〜図3)は、以下の手順で自分で再現できます。コードの編集は不要です。(LightGBMの特徴量重要度・7クラスタ=図4・図5は市区町村別の分析のため、原論文の報告を可視化します。)
data/raw/ フォルダに入れます。html/figures/ に自動保存されます。
合計特殊出生率(TFR)は「1人の女性が生涯に産む子どもの数」の指標で、少子化の代表的な物差しである。2005年に過去最低を記録して以降も低水準が続く。ところが市区町村別に見ると、原論文によれば最高は沖縄県金武町の2.47、最低は大阪府豊能町の0.84(2013〜2017年)と、地域差が非常に大きい。この格差の要因を解けば、少子化への打開策のヒントになる。
だが著者は、もう一段深い問題を指摘する。前田(2015)が述べるように、TFRは年齢別出生数 ÷ 年齢別女子人口の総和なので、若い女性が転出して分母が減ると、出生数(分子)も減るのに、TFRには表れにくい。つまりTFRだけを見ていては少子化の実態を見落とす。そこで本研究は、TFRに加えて、分母である15〜49歳女子人口の流入出そのものに影響する要因も分析することを目的とする。
大学生・一般の部 SSDSE-2021A/2020A/2021B e-Stat・厚労省・国交省ほか(市区町村別) LightGBM・特徴量重要度 k-meansクラスタリング
| 目的変数 | 定義・出典(原論文) |
|---|---|
| 合計特殊出生率 TFR | 厚生労働省 人口動態保健所・市区町村別統計(2013〜2017年の5年平均。変動を抑えるため平均を使用) |
| 若年女性転入出 | 15〜49歳女性の転入数÷転出数(住民基本台帳移動報告、2014〜2016年平均)=著者が新たに定義 |
| 説明変数のグループ | おもな項目 | 出典(原論文) |
|---|---|---|
| 人口構成 | 15歳未満/15〜64歳/65歳以上人口割合、男性比率、世帯構成(単独・核家族)ほか | SSDSE-2021A |
| 地理 | 緯度・経度、東京・大阪からの距離、標高、傾斜 | 国土交通省/CSIS |
| 教育・就業 | 最終学歴(短大・大学院卒割合)、就業率、生徒当たり小中学校・教員数 | SSDSE-2021A/e-Stat |
| 社会福祉・財政 | 0〜3歳人口当たり保育所数、人口当たり診療所・医師数、歳出項目別割合(老人福祉費・児童福祉費ほか) | e-Stat |
| 産業・所得 | 産業別事業所・従業者割合、平均年収(課税所得÷納税者数) | SSDSE-2020A/総務省 |
決定木ベースのLightGBMは「どの変数が効くか」(重要度)はわかるが「どう効くか」まではわからない。そこで著者はクラスタごとに特徴量を可視化して解釈を補った。
まず、原論文の出発点である「TFRの地域差」を、収録済みの SSDSE-B(都道府県別)で確かめる。市区町村ほど極端ではないが、地域差の向きは同じかを見る。
skiprows=[1] で読み込み、年度列 SSDSE-B-2026==2023 で最新年の47都道府県を抽出。TFR・婚姻率・高齢化率・女性転入出比・大学収容力を作る。d を土台に、以降の図1〜図3を都道府県粒度で再計算していく。58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 | df = pd.read_csv(DATA_B, encoding='cp932', header=0, skiprows=[1]) df.columns = [c.strip() for c in df.columns] YEAR = 'SSDSE-B-2026' d = df[df[YEAR] == 2023].copy() # 最新年(2023年)の47都道府県を抽出 for c in ['A1101', 'A1303', 'A4101', 'A4103', 'A9101', 'A510102', 'A510202', 'E6302']: d[c] = pd.to_numeric(d[c], errors='coerce') # 目的変数・指標を作成(原論文の指標を都道府県粒度で近似) d['TFR'] = d['A4103'] # 合計特殊出生率 d['婚姻率'] = d['A9101'] / d['A1101'] * 1000 # 人口千人当たり婚姻件数 d['高齢化率'] = d['A1303'] / d['A1101'] * 100 # 65歳以上人口割合 d['女性転入出比'] = d['A510102'] / d['A510202'] # 女性転入/女性転出(全年齢の近似) d['大学収容力'] = d['E6302'] / d['A1101'] * 1000 # 人口千人当たり大学学生数 print('SSDSE-B 読み込み: N =', len(d), '都道府県 (抽出年: 2023年)') print(f'TFR: 平均 {d["TFR"].mean():.2f} 範囲 {d["TFR"].min():.2f}〜{d["TFR"].max():.2f}') rm, pm = stats.pearsonr(d['婚姻率'], d['TFR']) print(f'参考)婚姻率×TFR の相関 r={rm:+.3f}(p={pm:.3f})' |
SSDSE-B 読み込み: N = 47 都道府県 (抽出年: 2023年) TFR: 平均 1.29 範囲 0.99〜1.60 参考)婚姻率×TFR の相関 r=-0.102(p=0.493)…原論文でも人口当たり婚姻率の重要度は低かった
83 84 85 86 87 88 89 | r1 = d.sort_values('TFR', ascending=True) print('最低5県:') for _, r in r1.head(5).iterrows(): print(f' {r["Prefecture"]:6s} {r["TFR"]:.2f}') print('最高5県:') for _, r in r1.tail(5).iloc[::-1].iterrows(): print(f' {r["Prefecture"]:6s} {r["TFR"]:.2f}') |
=== 図1: 都道府県別TFRランキング(実再現・都道府県粒度)=== 最低5県: 東京都 0.99 北海道 1.06 宮城県 1.07 秋田県 1.10 京都府 1.11 最高5県: 沖縄県 1.60 長崎県 1.49 宮崎県 1.49 鹿児島県 1.48 熊本県 1.47
この研究のいちばんの主張は「TFRは分母(若年女性人口)の流入出に振り回される」こと。原論文の図2に対応させて、女性の転入出とTFRの関係を都道府県粒度で近似再現する。原論文は15〜49歳・市区町村別だが、収録データは全年齢女性・都道府県別なので、そこは割り引いて読む。
112 113 114 115 116 117 118 | print('=== 図2: TFRと女性転入出比の散布図(実再現・近似)===') m2 = d[['女性転入出比', 'TFR', 'Prefecture']].dropna() r2, p2 = stats.pearsonr(m2['女性転入出比'], m2['TFR']) print(f'女性転入出比 × TFR の相関 r={r2:+.3f}(p={p2:.3f}, N={len(m2)})') print('女性転入出比が高い(流入超過)5県:') for _, r in m2.nlargest(5, '女性転入出比').iterrows(): print(f' {r["Prefecture"]:6s} 転入出比 {r["女性転入出比"]:.3f} TFR {r["TFR"]:.2f}') |
=== 図2: TFRと女性転入出比の散布図(実再現・近似)=== 女性転入出比 × TFR の相関 r=-0.339(p=0.020, N=47) 女性転入出比が高い(流入超過)5県: 東京都 転入出比 1.203 TFR 0.99 千葉県 転入出比 1.153 TFR 1.14 埼玉県 転入出比 1.151 TFR 1.14 神奈川県 転入出比 1.148 TFR 1.13 大阪府 転入出比 1.120 TFR 1.19
原論文は、若年女性転入出モデルで大学(院)卒割合や平均年収が重要だったと報告する(「大学の存在が若年女性の流入を高める」)。大学学生数は SSDSE-B にも収録されているので、大学収容力と女性転入出比の関係を都道府県粒度で確かめられる。
149 150 151 152 153 154 155 | print('=== 図3: 大学収容力と女性転入出比の散布図(実再現・近似)===') m3 = d[['大学収容力', '女性転入出比', 'Prefecture']].dropna() r3, p3 = stats.pearsonr(m3['大学収容力'], m3['女性転入出比']) print(f'大学収容力 × 女性転入出比 の相関 r={r3:+.3f}(p={p3:.4f}, N={len(m3)})') print('大学収容力が高い5県:') for _, r in m3.nlargest(5, '大学収容力').iterrows(): print(f' {r["Prefecture"]:6s} 大学生/千人 {r["大学収容力"]:.1f} 転入出比 {r["女性転入出比"]:.3f}') |
=== 図3: 大学収容力と女性転入出比の散布図(実再現・近似)=== 大学収容力 × 女性転入出比 の相関 r=+0.488(p=0.0005, N=47) 大学収容力が高い5県: 京都府 大学生/千人 57.9 転入出比 0.935 東京都 大学生/千人 48.4 転入出比 1.203 大阪府 大学生/千人 26.6 転入出比 1.120 石川県 大学生/千人 25.0 転入出比 0.852 愛知県 大学生/千人 23.8 転入出比 0.970
ここからは市区町村別データによる原論文の中核分析である。以下のR²・重要な特徴量はすべて原論文の報告値(市区町村別・LightGBM)で、本ページで再計算したものではない。
取得できた全特徴量でモデルを作り、重要度上位20個で組み直して20回の交差検証をした結果、平均決定係数0.78とある程度高い精度になった。重要度の上位には経度・緯度・東京/大阪からの距離という地理的要因が並び、次いで15歳未満・15〜64歳人口割合・男性比率など人口構成が効く。単独・核家族といった家族構成、男性就業率や最終学歴もある程度の重要度を持つ。
同様に重要度上位25個で組み直し、20回の交差検証で平均決定係数0.63。こちらは65歳以上・15歳以上人口割合など人口構成が非常に重要で、生徒当たり小学校教員数・大学(院)卒割合など教育、0〜3歳人口当たり保育所数・人口当たり診療所数・地方財政など社会福祉が効く。TFRモデルで非常に強かった地理的要因は、こちらでは東京からの距離・傾斜が多少効く程度に後退する点が対照的。
原論文の図6に対応する。市区町村別LightGBMの重要度上位を、要因の分類で色分けして並べる。これは再計算ではなく、原論文が挙げた特徴量の可視化である。
186 187 188 189 190 191 192 193 194 195 196 197 198 199 200 | print('=== 報告値: TFRモデル重要特徴量(原論文 図6・報告値の可視化)===') CAT_COLOR = {'地理': '#1565C0', '人口構成': '#EF6C00', '家族': '#6A1B9A', '就業・教育': '#2E7D32'} TFR_FEATS = [ ('経度', '地理'), ('緯度', '地理'), ('東京からの距離', '地理'), ('大阪からの距離', '地理'), ('15歳未満人口割合', '人口構成'), ('15〜64歳人口割合', '人口構成'), ('男性比率', '人口構成'), ('20〜24歳人口割合', '人口構成'), ('単独世帯割合', '家族'), ('核家族世帯割合', '家族'), ('男性就業率', '就業・教育'), ('最終学歴人口(大学・大学院)', '就業・教育'), ('教育業界の従業者数', '就業・教育'), ] for name, cat in TFR_FEATS: print(f' [{cat:5s}] {name}') print('平均決定係数 R^2 = 0.78(上位20特徴量・20回交差検証, 原論文の報告値)') |
=== 報告値: TFRモデル重要特徴量(原論文 図6・報告値の可視化)=== [地理 ] 経度 [地理 ] 緯度 [地理 ] 東京からの距離 [地理 ] 大阪からの距離 [人口構成 ] 15歳未満人口割合 [人口構成 ] 15〜64歳人口割合 [人口構成 ] 男性比率 [人口構成 ] 20〜24歳人口割合 [家族 ] 単独世帯割合 [家族 ] 核家族世帯割合 [就業・教育] 男性就業率 [就業・教育] 最終学歴人口(大学・大学院) [就業・教育] 教育業界の従業者数 平均決定係数 R^2 = 0.78(上位20特徴量・20回交差検証, 原論文の報告値)
原論文の図8に対応する。図4(TFRモデル)と見比べると、同じ地域データでも目的変数が変わると効く要因がまるで違うことがわかる。
234 235 236 237 238 239 240 241 242 243 244 245 246 247 248 249 250 251 252 | print('=== 報告値: 若年女性転入出モデル重要特徴量(原論文 図8・報告値の可視化)===') CAT_COLOR2 = dict(CAT_COLOR) CAT_COLOR2['社会福祉'] = '#00838F' CAT_COLOR2['産業'] = '#8D6E63' YW_FEATS = [ ('65歳以上人口割合', '人口構成'), ('15歳以上人口割合', '人口構成'), ('単独世帯数割合', '家族'), ('生徒当たり小学校教員数', '就業・教育'), ('大学(院)卒人口割合', '就業・教育'), ('生徒当たり小学校数', '就業・教育'), ('0〜3歳人口当たり保育所数', '社会福祉'), ('人口当たり一般診療所数', '社会福祉'), ('老人福祉費割合', '社会福祉'), ('第3次産業従業者割合', '産業'), ('第2次産業事業所数割合', '産業'), ('東京からの距離', '地理'), ('傾斜', '地理'), ] for name, cat in YW_FEATS: print(f' [{cat:5s}] {name}') print('平均決定係数 R^2 = 0.63(上位25特徴量・20回交差検証, 原論文の報告値)') print('※ TFRモデルで非常に高かった地理的要因(経度・緯度・距離)が、' 'こちらでは東京からの距離・傾斜が「多少」効く程度に後退している点が対照的。') |
=== 報告値: 若年女性転入出モデル重要特徴量(原論文 図8・報告値の可視化)=== [人口構成 ] 65歳以上人口割合 [人口構成 ] 15歳以上人口割合 [家族 ] 単独世帯数割合 [就業・教育] 生徒当たり小学校教員数 [就業・教育] 大学(院)卒人口割合 [就業・教育] 生徒当たり小学校数 [社会福祉 ] 0〜3歳人口当たり保育所数 [社会福祉 ] 人口当たり一般診療所数 [社会福祉 ] 老人福祉費割合 [産業 ] 第3次産業従業者割合 [産業 ] 第2次産業事業所数割合 [地理 ] 東京からの距離 [地理 ] 傾斜 平均決定係数 R^2 = 0.63(上位25特徴量・20回交差検証, 原論文の報告値) ※ TFRモデルで非常に高かった地理的要因(経度・緯度・距離)が、こちらでは東京からの距離・傾斜が「多少」効く程度に後退している点が対照的。
著者はTFRと若年女性転入出を標準化してクラスタリングし、エルボー法で最適クラスタ数を6〜9と見積もったうえで7クラスタを採用、それぞれに名前を付けた(原論文 図4・図9)。原論文は色分け日本地図で示すが、ここでは地図の代わりに特徴一覧表で再表現する(以下はすべて原論文の記述に基づく)。なお、若年女性転入出が突出して高い外れ値は島根県知夫村(移住促進政策に成功した離島)で、著者は人口維持理想型に含めている。
| クラスタ名(色) | TFR | 若年女性転入出 | おもな特徴(原論文) |
|---|---|---|---|
| 人口維持理想型(ピンク) | — | 高い | 中部以西・大都市周辺に立地。平均年収・大卒割合が高い。15歳未満も多く高齢化も進まず、釣り鐘型に近い。沖縄など。目指すべき理想型 |
| 西日本型(茶) | 高い | 低い | 南西に多い。20〜24歳人口割合が低く分母が小さいため相対的にTFRが高く出る。高TFRでも15歳未満が多いわけではない |
| 地方都市型(赤) | 中 | 中 | 首都圏からある程度離れ、中部地方に多い。人口維持理想型に類似(改善の余地が大きい) |
| 中枢都市・近郊型(青) | 低い | 高い | 政令指定都市クラス。20〜24歳人口が多いことが低TFRの一因。周辺に少子化地方都市型が広がる |
| 少子化地方都市型(オレンジ) | 低い | 中 | 中枢都市の周辺に分布。北東へ行くほど増える |
| 衰退地域型(紫) | 低め | 低い | 東京から遠い。若年女性の流出が多い |
| 消滅地域型(緑) | 低め | 低い | 東京から遠く北東に多い。高齢化が進み若年女性流出が大きい。高齢化が進み切ると分母の若年女性が減り少子化が止まらなくなる |
人口ピラミッドからは、西日本型のように「高TFRだが実は少子化」の地域が確認できた。20〜24歳人口が凹んで分母が小さいため、TFRが相対的に高く出ているだけだ。逆に中枢都市・近郊型は20〜24歳が多く低TFRになる。TFRのみに注目するのは少子化を考えるうえで不十分だという、本研究の核心が裏付けられた。
両モデルとも地理的要因・人口構造が重要で、加えて最終学歴が効いた。若年女性転入出では平均年収も重要だった。一方、TFRに効きそうな人口当たり婚姻率の重要度が低かったこと、両モデルに効きそうな女性議員割合・公務員女性管理職割合の重要度が低かったことは注目すべき点だと著者は述べる。
人口維持理想型の特徴は、地理的に中部以西・一定規模の都市の周辺にあり、平均年収が高く大卒割合も高いこと。少子化対策の目標は、すべての地域をこの理想型に近づけることだ。著者は特に地方都市型に注目し、20〜24歳(進学・就職期)の流出を防ぐことが鍵だとする。大学進学で出た学生が戻らないのが一因であり、I・Uターン支援の前に、高校在学中に「地元で働く」選択肢を示すことを提言している。
このページのTFRランキング・女性転入出比・大学収容力(図1〜図3)は、以下から再現できます。
🐍 再現コード(.py) 📊 SSDSE-B-2026.csv
※ 図1〜図3は都道府県別データによる近似再現で、原論文(市区町村別・15〜49歳女性)とは粒度・年齢範囲が異なります。図4・図5・クラスタ表は原論文の報告値の可視化であり、重要度の数値は原論文に記載がないため順位のみを示しています。
この研究を読むとき・まねするときに陥りやすい誤解を整理する。
クリックすると各用語の詳しい解説ページに移動できます。
この研究で使われている手法を、手を動かす順に説明する。
この研究の「相関は見つけたが因果は未証明」という結論は、次の研究の出発点になる。
再現コードを少し変えるだけで試せる課題を、易しい順に用意した。
d = df[df[YEAR]==2023] の年を 2015 など別の年に変えて、TFRランキングや相関がどう変わるか確かめよう。高齢化率(A1303/A1101×100)とTFRの散布図を描き、相関を計算してみよう。原論文の「高齢化が進むと若年女性が流出」という見立てと合うか。d.nlargest(10,'女性転入出比') と d.nsmallest(10,'女性転入出比') で流入超過・流出超過の県を並べ、TFRと見比べよう。d[[...]].corr() で一括計算し、相関行列をヒートマップにしてみよう。lightgbm 回帰を組み、特徴量重要度を出してみよう(都道府県N=47なので過学習に注意)。原論文の市区町村別の結果と傾向が似るか比べる。「多数の地域指標から機械学習で要因を絞り、型に分けて解釈する」発想は、政策・ビジネスの現場で広く使われている。
この研究を読んで浮かびやすい疑問に答える。
この論文を理解できたか、クリックで確認しましょう。間違えても解説が出ます。
このページの分析は、この画面の中でそのまま実行できます。
Python をインストールする必要も、CSV をダウンロードする必要もありません。
下のセルの 「▶ ブラウザで実行」 を上から順に押すか、
「▶ 最初から全部実行」 で一気に流してください。
表示されるのは、本文の図表とまったく同じ計算の結果です
(動かしているのは再現スクリプト code/2021_U2_yushu.py そのもの)。
コードは書き換えられます。「✏️ 書き換える」で数字や変数を変えて ▶ を押すと、 結果がどう変わるかをその場で確かめられます(元に戻すボタンつき)。 ページを開いた時点で裏で実行環境の準備が始まっているので、待ち時間はほとんどありません。 初回だけ実行環境の取得にインターネット接続が必要です。