この教材は、元データが公開されていないため再計算ができません。原論文が論文中に報告した数値をたどって図表にし、「その数値からどこまで言えるか」を読み解く形で学びます。数値そのものは原論文からの引用であり、この教材が計算したものではありません。
| 原論文が使ったデータ | SSDSE-A・平成 28 年経済センサス‐活動調査・国土地理院による緯度・経度データ 分析単位:その他 中核手法:Lasso 回帰・主成分分析・kmeans++法・シルエット分析 |
|---|---|
| この教材が使うデータ | CSV は読み込まない(原論文が報告した数値をそのまま図表化して読み解く) |
| 原論文(PDF) | 第二期「まち・ひと・しごと総合戦略」における日本の目指すべき将来に向けた社会構造分析及び提案 統計活用奨励賞/冨尾燿平・眞保祐樹(中央大学大学院理工学研究科) |
原論文と同じ粒度のデータは、この教材にも同梱しています。これを読み込めば、原論文と同じ細かさで分析をやり直せます(下の「🐍 ブラウザで動かす」でコードを書き換えて試せます)。ただし原論文が使った項目がすべて収録されているとは限りません。足りない項目は、上の「できないこと」に書いた出典から取ってくる必要があります。
▶ ここに書いてある分析は、ページ下部の「🐍 ブラウザで動かす」でそのまま実行できます(インストール不要)。動かしているのは code/2020_U4_katsuyo.py(239 行)そのものです。
このページの図は 原論文の報告値を可視化しただけなので、外部データのダウンロードは不要です。 図を再生成するには、プロジェクトルートで次を実行するだけです(コードの編集も不要)。
html/figures/ に自動保存されます。スクリプトは報告値を配列として持っているだけで、CSVは読み込みません。
今後わが国は、人口急減・超高齢化という大きな社会的課題に直面するとされる。原論文は冒頭で、 2020年3月の日本の人口が 1億2596万人であること、国立社会保障・人口問題研究所の推計で 2065年には8808万人まで減少し、65歳以上の老年人口比率が 38.4%(ほぼ4割が高齢者)、 生産年齢人口比率が 51.4%(2015年の60.7%を大きく下回る)になることを引用している。
こうした人口減少は、出生率の低下に加えて、地方から都市へ若者が流出し都市部の低出生率の影響を受けることで加速する。 そこで政府は「まち・ひと・しごと創生本部」を設け、2019年に 第二期「まち・ひと・しごと総合戦略」を閣議決定した。 本研究は、この戦略の基本目標を参考に、人口減少・超高齢化への対策を統計的に分析するものである。
原論文は、対策を大きく2つに分け、さらに3つの「課題」として設定する。
課題1・2 では問題を構造化して取り組むべき対策を考え、課題3 では地理的条件と「稼ぐ頭」とする業種を考慮した連携体制を提案する。 2040年には 消滅可能性都市(2010→2040年に20〜39歳の若年女性人口が5割以下に減少する市区町村)が全体の約半数の 896自治体になるとされることから、原論文は連携性の分析を 自治体レベルでなく都道府県レベルで行う方針をとる。
SSDSE-2020A Lasso回帰 主成分分析 k-means++ シルエット分析
課題1・課題2 では、教育用標準データセットの 市町村別データ SSDSE-2020A(1741市区町村・128変数)から 必要な部分だけを使う。課題3 では平成28年経済センサス‐活動調査の「稼ぐ力」「雇用力」と、国土地理院の緯度・経度データを使う。
| 課題 | 目的変数 | 対象 | 説明変数の数 | 主な前処理 |
|---|---|---|---|---|
| 課題1 | 転出者数 | 1575 市区町村 | 107 | 三大都市(東京都・大阪府・愛知県)除外、福島県の異常値(総人口0の富岡町ほか等)除去、10万人当たりに修正 |
| 課題2 | 出生数 | 589 市区町村 | 108 | 合計特殊出生率が全国平均より低い11県(北海道・宮城・秋田・埼玉・千葉・東京・神奈川・新潟・京都・大阪・奈良)に限定、10万人当たりに修正 |
| 課題3 | (クラスタリング) | 47 都道府県 | 98産業の稼ぐ力+緯度・経度 | 主成分分析で次元圧縮(累積70%)後にクラスタリング |
課題2 の表記に注意。原論文の本文では、課題2 のLasso回帰も便宜上「転出者数を目的変数とし…」と書かれているが、 分析の目的は 出生数(出生率)の要因特定であり、選択変数の解釈も出生数に対して行われている。 教材では課題2 の目的変数を 出生数として扱う(結果の解釈は原論文の表2・本文に忠実)。
本研究は3つの手法を組み合わせる。ここでは各手法の考え方を、原論文の使い方に沿って整理する。
100を超える候補変数の中から「転出/出生に効いている変数」だけを選びたい。Lassoは損失関数に係数の絶対値の和(L1ペナルティ)を加え、 不要な係数をちょうど0にすることで 変数選択と 多重共線性の回避を同時に行う。原論文は次の損失関数(1)を最小化する。
目的変数・説明変数は平均0・分散1に標準化し、正則化パラメータ λ は交差検証で 10−3 ≦ λ ≦ 102 の範囲を探索して最適値を選ぶ。
98産業の「稼ぐ力」は高次元データ。PCAで 累積寄与率が7割に達する第10主成分までを選び、少数の軸に圧縮してから解釈・クラスタリングに使う。 各主成分の 因子負荷量を見れば、その軸がどの産業に強く結びついているかが分かる。
圧縮した主成分に緯度・経度を加え、k-means++で都道府県をクラスタリング。クラスタ数は シルエット分析で決める。 原論文はシルエット図について、①各クラスタである程度のサンプルのシルエット係数が全体平均を超えていること、②各クラスタのサンプル数(プロットの厚さ)が全体的に等しいこと、の2点を満たす数を適切と判断し、クラスタ数24 を採用した。
Lasso回帰の結果、課題1 では 14変数、課題2 では 20変数が選択された。表1に交差検証による決定係数と正則化パラメータを示す。
| 回帰 | 決定係数 | 正則化パラメータ λ | 選択変数数 |
|---|---|---|---|
| 課題1(転出数) | 0.691 | 0.1 | 14 |
| 課題2(出生数) | 0.721 | 0.04 | 20 |
表1:交差検証による回帰の決定係数と正則化パラメータの値(原論文の報告値)。
まず表1の決定係数を図にしておく。以降のコードは CSVを読み込まず、原論文の報告値を配列にして描くだけである。目的は「手元の環境でも図を再生成できるようにしつつ、値は原論文に忠実に保つ」こと。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 | import os import numpy as np import matplotlib matplotlib.use('Agg') import matplotlib.pyplot as plt from matplotlib.patches import Patch plt.rcParams['font.family'] = 'Hiragino Sans' FIG_DIR = 'html/figures' os.makedirs(FIG_DIR, exist_ok=True) # --- 原論文の報告値(PDFの表から転記。ここでは再計算しない)--- R2 = {'課題1(転出数)': 0.691, '課題2(出生数)': 0.721} # 表1 決定係数 LAMBDA = {'課題1(転出数)': 0.1, '課題2(出生数)': 0.04} # 正則化パラメータλ # 表2・課題1:選択された14変数と標準偏回帰係数(抜粋。全14変数はスクリプト参照) kadai1 = [ ('単独世帯数', 0.283754), # 転出を最も増やす ('第3次産業就業者数', 0.080344), # 都市志向の職種は正 ('第2次産業就業者数', -0.049717), # 土地に根付く職種は負 ] |
================================================================ 原論文の報告値(可視化のみ・再計算ではない) ================================================================ 表1 課題1 決定係数=0.691 (λ=0.1), 課題2 決定係数=0.721 (λ=0.04) 表2 課題1で選択された変数数 = 14(うち正 12 / 負 2) 表2 課題2で選択された変数数 = 20(うち正 7 / 負 13) 表4 第10主成分までの累積寄与率 = 69.3%(原論文:約7割)
matplotlib.use("Agg") — 画面表示せず図をファイル保存するための指定。R2・LAMBDA・kadai1 は 原論文の表1・表2から転記した報告値。ここで計算しているのではなく「書き写している」点が重要。(名前, 係数) はタプル。[::-1] で逆順にすると横棒グラフが上から降順に並ぶ。1 2 3 4 5 6 7 8 9 | labels = list(R2.keys()) vals = [R2[k] for k in labels] fig, ax = plt.subplots(figsize=(7, 4.5)) ax.bar(labels, vals, color=['#B45309', '#2E7D32'], width=0.55) ax.set_ylabel('交差検証による決定係数 R^2') ax.set_title('図1:Lasso回帰の決定係数(原論文 表1の報告値)') fig.savefig(os.path.join(FIG_DIR, '2020_U4_fig1.png'), dpi=150) print('fig1 saved') |
fig1 saved
ax.bar(labels, vals, ...) で棒グラフを描画。色は課題1=茶、課題2=緑。fig1 saved の1行のみ(図はファイルに保存される)。両課題とも決定係数0.7前後で、地域差の約7割を説明できていることが読み取れる。
1 2 3 4 5 6 7 8 9 10 11 12 13 | # 課題1(転出数):係数の大きい順に横棒グラフ。正=赤 / 負=青 names = [n for n, _ in kadai1][::-1] coefs = [c for _, c in kadai1][::-1] colors = ['#C0392B' if c > 0 else '#2980B9' for c in coefs] fig, ax = plt.subplots(figsize=(9, 6.5)) ax.barh(range(len(names)), coefs, color=colors) ax.axvline(0, color='black', lw=0.8) ax.set_yticks(range(len(names))) ax.set_yticklabels(names) ax.set_xlabel('標準偏回帰係数(標準化済み)') fig.savefig(os.path.join(FIG_DIR, '2020_U4_fig2.png'), dpi=150) print('fig2 saved') # 課題2(20変数)も同じ要領で fig3 を描く |
fig2 saved
ax.barh で横棒、axvline(0) で符号の境界(ゼロ線)を引く。fig2 saved。図から 単独世帯数(+0.284)が転出を最も増やす一方、第2次産業就業者数(−0.050)は転出を抑えることが読み取れる。課題2 の20変数も同じ要領で fig3 を描く。
課題1の結論:地方部の「仕事内容における多様性の欠乏」を解決する必要がある。
表2a:課題1(転出数)選択14変数
| 順 | 変数 | 標準偏回帰係数 |
|---|---|---|
| 1 | 単独世帯数 | 0.283754 |
| 2 | 中学校数 | 0.231302 |
| 3 | 出生数 | 0.137405 |
| 4 | 15〜64歳人口(男) | 0.116443 |
| 5 | 小学校教員数 | 0.093421 |
| 6 | 第3次産業就業者数 | 0.080344 |
| 7 | 従業者数(公務) | 0.074825 |
| 8 | 第2次産業就業者数 | -0.049717 |
| 9 | 教育費(市町村財政) | 0.046383 |
| 10 | 婚姻件数 | 0.041152 |
| 11 | 15歳未満人口(女) | 0.032370 |
| 12 | 65歳以上人口(女) | -0.017277 |
| 13 | 中学校教員数 | 0.015751 |
| 14 | 高等学校数 | 0.005963 |
表2b:課題2(出生数)選択20変数
| 順 | 変数 | 標準偏回帰係数 |
|---|---|---|
| 1 | 婚姻件数 | 0.287830 |
| 2 | 65歳以上人口(男) | -0.252630 |
| 3 | 小学校児童数 | 0.249220 |
| 4 | 転入者数(日本人移動者) | 0.137510 |
| 5 | 図書館数 | -0.098040 |
| 6 | 保育所等在所児数 | 0.077730 |
| 7 | 完全失業者数(女) | -0.069470 |
| 8 | 従業者数(生活関連サービス業,娯楽業) | -0.059030 |
| 9 | 幼稚園在園者数 | 0.053850 |
| 10 | 経常収支比率(市町村財政) | -0.031530 |
| 11 | 民生費(市町村財政) | 0.027590 |
| 12 | 一般病院数 | -0.012820 |
| 13 | 農家数(販売農家) | -0.006390 |
| 14 | 事業所数(電気・ガス・熱供給・水道業) | -0.004500 |
| 15 | 中学校教員数 | -0.004480 |
| 16 | 非水洗化人口 | -0.004430 |
| 17 | 従業者数(建設業) | -0.004360 |
| 18 | 核家族世帯数 | 0.004170 |
| 19 | 第2次産業就業者数 | -0.002250 |
| 20 | 中学校数 | -0.000570 |
表2:Lassoで選択された説明変数と標準偏回帰係数の推定値(原論文の報告値)。赤=正、青=負。
課題2の結論:「働き方の多様性の欠乏」が問題。若者に結婚という選択肢を与えるには、仕事に柔軟性を持たせ、家事・生活との両立と経済的・時間的余裕が必要。
各都道府県の「稼ぐ力」(98産業)に主成分分析を適用し、累積寄与率が約7割に達する第10主成分までを採用した。
1 2 3 4 5 6 7 8 9 10 | # 主成分分析(稼ぐ力98産業)の寄与率と累積寄与率(表4の報告値) cum = np.cumsum(pca_contrib) * 100 fig, ax = plt.subplots(figsize=(9, 5)) ax.bar(pca_pc, [c * 100 for c in pca_contrib], color='#6A1B9A') # 各主成分の寄与率 ax2 = ax.twinx() ax2.plot(pca_pc, cum, color='#E65100', marker='o') # 累積寄与率 ax2.axhline(70, color='#C62828', ls='--') # 第10主成分まで=累積約70% fig.savefig(os.path.join(FIG_DIR, '2020_U4_fig4.png'), dpi=150) print('fig4 saved') |
fig4 saved
ax.twinx() で右軸を追加し、棒(寄与率)と折れ線(累積)を重ねる。axhline(70) で70%の目安線。fig4 saved。第10主成分までで累積 約70%に達し、原論文の採用基準と一致することが読み取れる。
圧縮した主成分に緯度・経度を加え、k-means++ でクラスタリング。シルエット分析により最適クラスタ数を 24 と設定した。 クラスタごとに各産業の稼ぐ力の平均が大きい上位3産業を「主要産業」とし、その平均雇用力を算出した(原論文 表5)。
表5(抜粋):各クラスタの都道府県と主要産業(原論文の報告値)
| クラスタ | 都道府県 | 主要産業1 | 主要産業2 | 主要産業3 |
|---|---|---|---|---|
| cluster1 | 東京都 | 50 各種商品卸売業 | 46 航空運輸業 | 73 広告業 |
| cluster2 | 山梨県, 長野県 | 28 電子部品・デバイス・電子回路製造業 | 26 生産用機械器具製造業 | 27 業務用機械器具製造業 |
| cluster5 | 北海道, 青森県 | 03 漁業(水産養殖業を除く) | 97 国家公務 | 02 林業 |
| cluster9 | 岩手県, 秋田県, 山形県, 福島県 | 28 電子部品・デバイス・電子回路製造業 | 02 林業 | 26 生産用機械器具製造業 |
| cluster12 | 栃木県, 群馬県, 静岡県 | 31 輸送用機械器具製造業 | 29 電気機械器具製造業 | 27 業務用機械器具製造業 |
| cluster16 | 愛知県, 大阪府 | 51 繊維・衣服等卸売業 | 55 その他の卸売業 | 25 はん用機械器具製造業 |
| cluster17 | 神奈川県, 兵庫県 | 25 はん用機械器具製造業 | 71 学術・開発研究機関 | 26 生産用機械器具製造業 |
| cluster18 | 長崎県, 鹿児島県 | 04 水産養殖業 | 03 漁業(水産養殖業を除く) | 45 水運業 |
| cluster23 | 新潟県, 富山県, 岐阜県 | 28 電子部品・デバイス・電子回路製造業 | 26 生産用機械器具製造業 | 24 金属製品製造業 |
表5抜粋:cluster1=東京都は各種商品卸売業・航空運輸業・広告業と都市型サービスに特化。地方クラスタは製造業・水産業・林業に特化。全24クラスタは原論文参照。
課題3の結論:同様の産業に強みを持つ都道府県間で連携体制を構築し、主要産業に付随する事業を多彩に創出することで、地方部でも「仕事内容に対する多様化」と経済活性化を実現できる。
人口減少の緩和:課題1・2 のLasso回帰から、「仕事に対する多様性」を持たせることで地方からの転出者数を減らし、婚姻件数を増やして出生数を高められることが分かった。 具体策として原論文は「オフィスに囚われない個人の働き方の選択肢を増やす」ことを挙げる。
地方部の経済活性化:課題3 のクラスタリングから、同様の産業に強みを持つ都道府県で連携体制を作り、 主要産業に付随する事業を多彩に創出することで、地方でも仕事の多様性と経済活性化を両立できると提言する。
この論文の手法と結果を読むときに陥りやすい誤解を整理します。
本論文を読むうえで押さえておきたい用語をまとめます。
各手法を自分で使うときに気をつけたいポイントを、本論文の使い方に即して整理します。
本研究をさらに発展させるとしたら、どんな方向がありうるでしょうか。
手を動かして理解を深めるための練習課題です。難易度順に並べています。
2020_U4_katsuyo.py の図2で、正=赤/負=青の配色を別の2色に変えて実行し、符号の見やすさを比べてみよう。kadai2 を絶対値の大きい順に並べ替え、上位5変数だけの横棒グラフを作ってみよう(sorted(..., key=lambda x: abs(x[1])))。pca_contrib の累積和を計算し、累積が80%を超えるのは第何主成分か求めてみよう(本論文の採用は約70%=第10主成分)。sklearn.linear_model.LassoCV を適用し、選択された変数を確認しよう。※本論文の市区町村別の値とは一致しない点に注意。本論文で学んだ手法は、行政・企業・研究の現場で広く使われています。
初心者が抱きやすい疑問に、教育的観点から答えます。
python3 code/2020_U4_katsuyo.py を実行すれば同じ図が再生成できます。ただしそれは原論文の報告値を描き直したもので、市区町村別の元データから再推定したものではありません。この論文を理解できたか、クリックで確認しましょう。間違えても解説が出ます。
このページの分析は、この画面の中でそのまま実行できます。
Python をインストールする必要も、CSV をダウンロードする必要もありません。
下のセルの 「▶ ブラウザで実行」 を上から順に押すか、
「▶ 最初から全部実行」 で一気に流してください。
表示されるのは、本文の図表とまったく同じ計算の結果です
(動かしているのは再現スクリプト code/2020_U4_katsuyo.py そのもの)。
コードは書き換えられます。「✏️ 書き換える」で数字や変数を変えて ▶ を押すと、 結果がどう変わるかをその場で確かめられます(元に戻すボタンつき)。 ページを開いた時点で裏で実行環境の準備が始まっているので、待ち時間はほとんどありません。 初回だけ実行環境の取得にインターネット接続が必要です。