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

2019年度(令和元年度)統計データ分析コンペティション

地方創生目標指標に関する変化要因ネットワークの推定と
それに基づく地域間連携策の提案

⏱️ 推定読了時間: 約45分
張 瀚天・白鳥 友風(筑波大学大学院 システム情報工学研究科 社会工学専攻)
ガウシアングラフィカルモデル(glasso)・媒介中心性・潜在クラス分析 | SSDSE-2019A + e-Stat + RESAS(1722市町村)
🔬 AIC/BIC🔬 LASSO🔬 クラスター分析🔬 グラフィカルlasso🔬 ネットワーク分析🔬 媒介中心性🔬 潜在クラス分析🔬 特化係数🔬 相関分析🏷 移住・人口移動🏷 財政・行政
🔬 手法タグ / 🏷 応用タグ(クリックで同タグの論文をネットワーク検索)
🔬 再現カルテ — 原論文と同じデータ・同じ手法で再現

この教材は原論文と同じデータを読み込み、同じ手順で計算し直しています。画面に出る数値と図は、あなたのブラウザがその場で計算した結果です。

原論文が使ったデータ論文本文からは特定できなかった
分析単位:市区町村
中核手法:相関分析・ガウシアングラフィカルモデル・ネットワーク分析・グラフィカル lasso
この教材が使うデータ
原論文(PDF)地方創生目標指標に関する変化要因ネットワークの推定とそれに基づく地域間連携策の提案
総務大臣賞/張 瀚天、白鳥 友風(筑波大学大学院システム情報工学研究科)
✅ この教材でできること
  • 原論文の中核手法(相関分析)を実データで実行できる
  • 分析に使うデータは同梱済みで、ブラウザ上でそのまま読み込める
  • 数値・図を最後まで再計算できる(偏相関分析・Graphical Lasso)
突合監査の結果、主要データと中核手法はいずれも原論文と一致しています。

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

🏅 論文審査会コメント(審査員はここを評価した)
「グラフィカルモデリングを用いて、地方創生に関わる探索的関係性解析を多方面で実施し、データ分析能力が高く評価された。政策に関わる仮説実証型論文とは異なるが、近年のデータマイニングや機械学習に関わる方法論の政策科学分野への適用可能性を示した論文であり、得られた結論も探索的なものではあるが興味深いものもあった。」
出典:統計センター「統計データ分析コンペティション」受賞論文PDF掲載の審査講評。プロの審査員が何を評価し、何を注文したかは論文の読み方の最良の手本になる。
📝 3行で分かる要約

目次

  1. 研究の背景:地方創生と4つの基本目標
  2. データと目標指標(1722市町村)
  3. 分析1:目標指標の増加率と人口規模(図1)
  4. 前処理:ベキ分布を人口あたりに変換(図2)
  5. 分析2:ガウシアングラフィカルモデルと glasso(図3)
  6. 媒介中心性と「稼ぐ力」(図4)
  7. 分析3:潜在クラス分析による地域間連携パターン
  8. まとめ
  9. 📥 データの準備
  10. 💼 実社会での応用
  11. ⚠️ よくある誤解
  12. 📖 用語集
  13. 📐 手法ガイド
  14. 🚀 発展の可能性
  15. 🎯 自分でやってみよう
  16. 🤔 Q&A
  17. 🐍 ブラウザで動かす

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

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

このページの手法デモを自分で動かすには、以下の手順でデータを準備してください。コードの編集は不要です。

1
データをダウンロードする 独立行政法人統計センターの SSDSE(教育用標準データセット)配布ページから、以下のファイルをダウンロードします。
SSDSE-A-2025.csv ← SSDSE-A(市区町村データ)📥 直接DL
⬇ SSDSEダウンロードページを開く
2
ファイルを所定のフォルダに配置する ダウンロードしたCSVを、プロジェクトの data/raw/ フォルダに入れます。
2026 統計・データ解析コンペ/ ├── code/ │ └── 2019_U1_daijin.py ← 実行するスクリプト └── data/ └── raw/ SSDSE-A-2025.csv ← ここに置く
3
スクリプトをそのまま実行する ターミナルでプロジェクトルートに移動し、以下を実行します。
python3 code/2019_U1_daijin.py
図は html/figures/ に自動保存されます。

※ 原論文は SSDSE-2019A・e-Stat・RESAS を統合した2010年→2015年の「変化数」データ(1722市町村)を分析しました。現在配布中の SSDSE には 2010年・2015年の市町村値も RESAS の特化係数も収録されていないため、本ページの図1は原論文の報告値の可視化(再計算ではない)、図2〜図4は現行 SSDSE-A-2025 の水準値を使った手法デモです(詳細は「データと目標指標」の再現範囲を参照)。

研究の背景:地方創生と4つの基本目標

日本の人口減少・少子高齢化は、特に地方において深刻である。原論文の指摘によれば、東京・埼玉・千葉・神奈川の人口の合計は2015年で日本の約28.4%を占め、2010年の約27.8%から0.6ポイント(約51万3千人)増加した——地方から大都市圏への人口流出が続いている。この課題に歯止めをかけるため、内閣府地方創生推進事務局は2015年に第1期「まち・ひと・しごと創生総合戦略」を策定し、「地方創生」を達成するための4つの基本目標を設定した。

基本目標内容
目標1地方に仕事をつくり、安心して働けるようにする
目標2地方への新しいひとの流れをつくる
目標3若い世代の結婚・出産・子育ての希望をかなえる
目標4時代にあった地域をつくり、安心なくらしを守るとともに、地域と地域を連携する

これらの達成度を定量的に評価するため、基本目標に対して15件、施策に対して116件の KPI(key performance indicator)が設定されている。また取り組みの1つとして「連携中核都市圏構想」(平成26年度から展開、2019年9月時点で32圏域が宣言)があるが、先行研究では圏内に含まれない地域の存在や、圏外から圏内への人口流出を助長する可能性が指摘されている。

さらに厄介なのは、基本目標が互いに独立に達成しうるものではないことである。例えば目標1に関連する地域産業の「付加価値額」は目標2に関連する「人口流出率」と相関し、同時に「人口流入率」と「所得水準」にも相関がある——人口と所得水準は循環して影響しあう。民間企業・自治体・地域間連携など複数の主体の要因が複雑に絡み合うなかで、各自治体は「具体的に何を改善すれば基本目標の達成につながるのか」が不透明な状況に置かれている。

研究の問い(原論文 1節) 各地域では(1)どのような指標が基本目標の達成につながるか、(2)その指標を改善するためにはどのような対策が必要か——この2点を、1722市町村の包括的データから明らかにする。
分析フロー
データ統合
SSDSE-2019A
+e-Stat+RESAS
(1722市町村)
分析1
増加率と人口規模
(相関分析)
分析2
GGM+glasso
+媒介中心性
分析3
潜在クラス分析
(特化係数)
地域間連携策
の提案
論文審査会コメント(原論文より) 「グラフィカルモデリングを用いて、地方創生に関わる探索的関係性解析を多方面で実施し、データ分析能力が高く評価された。政策に関わる仮説実証型論文とは異なるが、近年のデータマイニングや機械学習に関わる方法論の政策科学分野への適用可能性を示した論文であり、得られた結論も探索的なものではあるが興味深いものもあった。」

ガウシアングラフィカルモデル グラフィカルlasso 媒介中心性 潜在クラス分析 SSDSE-A

データと目標指標(1722市町村)

使用データ(原論文 3節)

原論文は、市町村に対して広範な変数を収録する SSDSE-2019A(独立行政法人統計センターの教育用標準データセット・市区町村データ)を軸に、5年(2010年→2015年)の変化に着目するため e-Stat から取得した変数、および RESAS(地域経済分析システム)の特化係数・売上金額を、市町村のユニークな id である地域コードで統合した。欠損を除いた 1722市町村が分析対象である。

細かいが大事な処理(原論文 3節) 宮城県富谷市・福岡県那珂川市は期間中に「町」から「市」に変わり地域コードが合致しない箇所があるが、同一の市町村とみなして分析している。データ統合では、こうしたコード体系の変更への対処が精度を左右する。
1722
分析対象市町村
(欠損を除く)
4
地方創生の基本目標
(まち・ひと・しごと創生総合戦略)
10
設定された目標指標
(目標1〜3に対応)
24
分析3のクラスタ数
AIC基準で決定)

10の目標指標

4つの基本目標の KPI に深く関連する10項目を「目標指標」として定義した。

基本目標目標指標
目標1(しごと)就業者数・女性就業者数・完全失業者数・正規雇用者数(4変数)
目標2(ひとの流れ)転入者数・転出者数・転出超過数(3変数)
目標3(結婚・出産・子育て)婚姻件数・出生数・保育所等数(3変数)
目標4(地域づくり・地域間連携)設定せず——KPI が「立地適正化計画を作成する市町村数」など市町村にまたがる項目が多く単一市町村の分析になじまないこと、収集できるデータの限界のため

再現可能性の整理(本ページの方針)

本ページで「実データ再現」できる範囲・できない範囲
  • 原論文の報告値の可視化(図1):分析1の相関係数(原論文 図表3)は、2010年・2015年の市町村値が現行 SSDSE に収録されていないため再計算できない。原論文の報告値をそのままグラフ化した(再計算ではない)。
  • 手法デモ(図2〜図4):前処理・glasso・媒介中心性の一連の手順を、現行 SSDSE-A-2025 の水準値(人口あたり)に適用して体験する。原論文の「2010→2015年の変化数」ネットワークの再計算ではない。使える変数も一部異なる(正規雇用者数・課税対象所得・一般財源・投資的経費などは SSDSE-A-2025 に未収録。転出超過数は転入・転出と線形従属になるため本デモでは除外)。
  • 原論文参照(図表4〜6):変化数ネットワーク図(図表4a)・媒介中心性の値(図表4b)・24クラスタの日本地図(図表5a)・産業ヒートマップ(図表5b)・クラスタ別市町村一覧(図表6)は、RESAS特化係数を含む原データが再取得できないため再現せず、内容を本文と表で示す。図は原論文参照
1
分析1:目標指標の増加率と人口規模の関連(図1)

都市部への人口流出が続くなか、「すでに人口規模が大きいところほど目標指標を改善しやすいのではないか?」という疑問がまず浮かぶ。もしそうなら、大都市と過疎地域では処方箋がまったく別になる。分析1では、2010年総人口各目標指標の増加率(2010→2015年)相関を確認する。

やってみよう準備: ライブラリの読み込みと設定
📝 コード
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
import os
import numpy as np
import pandas as pd
import matplotlib
matplotlib.use('Agg')
import matplotlib.pyplot as plt
import networkx as nx
from sklearn.covariance import GraphicalLasso

plt.rcParams['font.family'] = 'Hiragino Sans'
plt.rcParams['axes.unicode_minus'] = False
plt.rcParams['figure.dpi'] = 150

FIG_DIR = 'html/figures'
DATA_A = 'data/raw/SSDSE-A-2025.csv'
os.makedirs(FIG_DIR, exist_ok=True)
▼ 実行結果
このステップは print はしません。ライブラリと保存先の設定だけ。次のステップへ進みましょう。
💡 解説
  • networkx — ネットワーク(グラフ)の構築・媒介中心性の計算・描画を担うライブラリ。
  • sklearn.covariance.GraphicalLasso — グラフィカルlasso(スパースな精度行列の推定)の実装。原論文はRのglassoパッケージ相当の手法を用いた。
  • matplotlib.use('Agg') — 画面表示せずファイルに保存するための設定。
💡 Python TIPS from ライブラリ import クラス — 長い名前空間を省略してクラスを直接呼べる。使うものだけを import するとコードの依存関係が読みやすくなります。
やってみよう図1: 原論文 図表3 の相関係数(報告値)を可視化する
📝 コード
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
# ===== ステップ1: 図1 原論文 図表3 の相関係数(報告値)の可視化 =====
# 原論文 図表3: 2010年総人口と各目標指標の増加率(2010→2015年)の相関係数。
# 以下の数値は原論文 図表3 に記載の報告値の転記であり、再計算ではない。
paper_corr = {
    '就業者増加率': 0.127, '女性就業者増加率': 0.149,
    '完全失業者増加率': 0.097, '正規雇用者増加率': 0.059,
    '転出増加率': 0.036, '転入増加率': 0.068,
    '転出超過増加率': -0.047, '婚姻件数増加率': -0.0046,
    '出生数増加率': 0.027, '保育所等増加率': 0.012,
}
fig, ax = plt.subplots(figsize=(9, 4.8))
names = list(paper_corr.keys())
vals = [paper_corr[k] for k in names]
colors = ['#1565C0' if v >= 0 else '#C62828' for v in vals]
ax.barh(range(len(names))[::-1], vals, color=colors, height=0.6)
ax.set_yticks(range(len(names))[::-1])
ax.set_yticklabels(names, fontsize=10)
ax.axvline(0, color='#555', lw=0.8)
ax.axvline(0.2, color='#999', lw=0.8, ls='--')
ax.axvline(-0.2, color='#999', lw=0.8, ls='--')
ax.set_xlim(-0.25, 0.25)
ax.set_xlabel('2010年総人口との相関係数(原論文 図表3 の報告値)')
ax.set_title('分析1: 目標指標の増加率と人口規模の相関\n'
             '(原論文 図表3 の報告値の可視化。再計算ではない)', fontsize=11)
for i, v in zip(range(len(names))[::-1], vals):
    ax.text(v + (0.008 if v >= 0 else -0.008), i, f'{v:.3f}',
            va='center', ha='left' if v >= 0 else 'right', fontsize=9)
fig.tight_layout()
fig.savefig(f'{FIG_DIR}/2019_U1_fig1.png', bbox_inches='tight')
plt.close(fig)
print('【図1】原論文 図表3 の報告値(2010年総人口と増加率の相関係数)')
print('  最大: 女性就業者増加率 r=0.149 / 最小: 転出超過増加率 r=-0.047')
print('  → いずれも |r|<0.2 で、人口規模は増加率にほぼ影響しない(原論文の結論)')
▼ 実行結果
【図1】原論文 図表3 の報告値(2010年総人口と増加率の相関係数)
  最大: 女性就業者増加率 r=0.149 / 最小: 転出超過増加率 r=-0.047
  → いずれも |r|<0.2 で、人口規模は増加率にほぼ影響しない(原論文の結論)
💡 解説
  • 辞書 paper_corr の10個の数値は原論文 図表3 に記載された報告値の転記です(2010年・2015年の市町村値が現行SSDSEにないため再計算はできません)。
  • 正の値を青、負の値を赤で塗り分け、|r|=0.2 の破線を「弱い相関」の目安として引いています。
  • 10本の棒がすべて破線の内側——どの目標指標の増加率も人口規模とほぼ無相関であることが一目で分かります。
💡 Python TIPS ax.barh(y, vals) は横棒グラフ。range(len(names))[::-1] のように [::-1] で逆順にすると、辞書の並び順を上から下へ表示できます。
分析1: 目標指標の増加率と人口規模の相関(原論文 図表3 の報告値の可視化)
図1:2010年総人口と各目標指標の増加率(2010→2015年)の相関係数。本図は原論文 図表3 の報告値をそのまま可視化したもので、再計算ではない。最大でも女性就業者増加率の r=0.149 であり、すべて |r|<0.2 の弱い相関にとどまる。
📌 この図の読み方
このグラフは
10個の目標指標それぞれについて「増加率が人口規模と関係するか」を相関係数で示した横棒グラフ。原論文 図表3 は同じ情報を10枚の散布図+相関係数で示している。
どこを見る?
すべての棒が ±0.2 の破線の内側に収まっている点。散布図でも比例関係は見られなかったと原論文は報告している。
次に何を疑う?
「相関が小さい=無関係」と即断してよいか。原論文は散布図の形状(比例関係の不在)も併せて確認したうえで結論づけている。
分析1の結論(原論文 4.1節) 人口規模は目標指標の増加率に影響しない。現在人口を集められている地方でも、過疎化が進行している地方でも、過去5年間の目標指標の増加率には人口規模が関係しない。だからこそ分析2では、規模によらず全市町村に共通する目標指標の変動要因を探る。
2
前処理:ベキ分布を人口あたりに変換する(図2)

分析2で使うガウシアングラフィカルモデル(GGM)は、変数が多変量正規分布に従うことを仮定する。ところが市町村の規模の変数(就業者数など)は、少数の大都市が極端に大きい値をとる裾の重い分布(ベキ分布)をしている。原論文は分析1の結果(増加率は人口規模によらない)を踏まえ、2010年と2015年の差(変化数)を2010年の総人口で割って「一人当たり」の値にすることで、分布を正規分布に近づけた(原論文 図表2)。

ここでは同じ変換の効果を、現行 SSDSE-A-2025 の水準値で体験する(原論文が扱ったのは変化数である点に注意)。

やってみようステップ2: SSDSE-A-2025(市区町村データ)の読み込み
📝 コード
69
70
71
72
73
# ===== ステップ2: SSDSE-A-2025 の読み込み(手法デモ用の現行データ) =====
raw = pd.read_csv(DATA_A, encoding='cp932', header=None, skiprows=3)
raw.columns = pd.read_csv(DATA_A, encoding='cp932', header=None, nrows=3).iloc[2]
print(f'\n【SSDSE-A-2025】{len(raw)}市区町村を読み込み'
      f'(原論文の SSDSE-2019A ベース1722市町村とは別の年次・版)')
▼ 実行結果
【SSDSE-A-2025】1741市区町村を読み込み(原論文の SSDSE-2019A ベース1722市町村とは別の年次・版)
💡 解説
  • SSDSE-A-2025 は先頭3行がヘッダー(項目コード・年度・日本語項目名)なので、skiprows=3 でデータ本体を読み、3行目(日本語名)を列名として貼り直しています。
  • 読み込めるのは1741市区町村(1718市町村+東京23特別区)。原論文の1722市町村(SSDSE-2019Aベース・欠損除去後)とは年次も版も異なることを出力でも明示しています。
💡 Python TIPS pd.read_csv(..., header=None, nrows=3).iloc[2] — ヘッダーが複数行あるCSVは「ヘッダーだけ別に読む」テクニックが便利。
やってみよう図2: 「人口で割る」前処理の効果を見る
📝 コード
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
# ===== ステップ3: 図2 前処理デモ — ベキ分布を人口あたりに変換 =====
# 原論文 図表2: 就業者数の「変化数」がベキ分布 → 2010年人口で割って正規分布に近づけた。
# ここでは現行データの「水準値」で同じ変換の効果を体験する(変化数のデモではない)。
emp = raw['就業者数'].astype(float)
emp_pc = emp / raw['総人口'].astype(float)
fig, axes = plt.subplots(1, 2, figsize=(9.6, 3.8))
axes[0].hist(emp / 1e4, bins=120, color='#26A69A')
axes[0].set_title('(a) 就業者数(万人): 裾の重い分布', fontsize=10.5)
axes[0].set_xlabel('就業者数(万人)')
axes[0].set_ylabel('市区町村数')
axes[1].hist(emp_pc, bins=60, color='#26A69A')
axes[1].set_title('(b) 就業者数 ÷ 総人口: 対称な分布に近づく', fontsize=10.5)
axes[1].set_xlabel('就業者数 ÷ 総人口')
fig.suptitle('前処理デモ: 原論文 図表2 と同じ「人口で割る」変換(SSDSE-A-2025 の水準値。'
             '原論文は2010→2015年の変化数に適用)', fontsize=10)
fig.tight_layout(rect=[0, 0, 1, 0.90])
fig.savefig(f'{FIG_DIR}/2019_U1_fig2.png', bbox_inches='tight')
plt.close(fig)
print('\n【図2】前処理デモ(就業者数)')
print(f'  変換前の歪度: {emp.skew():.2f} → 人口あたり変換後: {emp_pc.skew():.2f}')
▼ 実行結果
【図2】前処理デモ(就業者数)
  変換前の歪度: 9.29 → 人口あたり変換後: 1.02
💡 解説
  • (a) 就業者数そのまま:ほとんどの市町村が左端に張り付き、少数の大都市が長い裾を作るベキ分布
  • (b) 総人口で割ると、分布が対称に近づきます。歪度(分布の非対称さ)が 9.29 → 1.02 に激減——「人口で割る」だけで正規分布の仮定にぐっと近づくことが数値でも確認できます。
  • 原論文 図表2 は「2010→2015年の就業者数の変化数」に同じ変換を施し、正規分布裾野の厚い分布を扱いやすくしました。
💡 Python TIPS Series.skew() で歪度(skewness)を計算できます。0に近いほど左右対称。正規分布への近さの簡便なチェックに便利。
前処理デモ: 就業者数の分布と人口あたり変換(SSDSE-A-2025)
図2:前処理デモ——(a) 就業者数はベキ分布、(b) 総人口で割ると対称な分布に近づく(SSDSE-A-2025 の水準値で作図)。原論文 図表2 は2010→2015年の「変化数」に対して同じ変換を適用したもので、本図はその考え方を現行データで体験するデモである。
やってみようステップ4: 変数の構築——人口あたり変換・多重共線性の確認・符号反転
📝 コード
 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
130
131
132
# ===== ステップ4: 変数の構築(人口あたり変換と符号反転) =====
# 原論文にならい、規模の変数は総人口で割り、比率(%)の変数はそのまま使う。
goal_vars = ['就業者数', '就業者数(女)', '完全失業者数',
             '転入者数(日本人移動者)', '転出者数(日本人移動者)',
             '婚姻件数', '出生数', '保育所等数(基本票)']  # 目標指標(8個)
other_cnt = ['15~64歳人口', '65歳以上人口', '死亡数', '事業所数(民営)',
             '従業者数(民営)', '歳入決算総額(市町村財政)',
             '歳出決算総額(市町村財政)', '地方税(市町村財政)',
             '民生費(市町村財政)', '教育費(市町村財政)',
             '災害復旧費(市町村財政)']                     # 規模の変数
ratio_vars = ['経常収支比率(市町村財政)', '実質公債費比率(市町村財政)']  # 比率

X = pd.DataFrame(index=raw.index)
pop = raw['総人口'].astype(float)
for c in goal_vars + other_cnt:
    X[c] = raw[c].astype(float) / pop
for c in ratio_vars:
    X[c] = raw[c].astype(float)
X = X.dropna()
X = X[pop.loc[X.index] > 0]

# 多重共線性の確認(原論文は歳入・歳出・投資的経費が r>=0.9 → 歳出等を除外)
r_in_out = X['歳入決算総額(市町村財政)'].corr(X['歳出決算総額(市町村財政)'])
print(f'\n【変数の構築】n={len(X)}市区町村, {X.shape[1]}変数')
print(f'  歳入決算総額 と 歳出決算総額 の相関: r={r_in_out:.3f}'
      ' → 原論文と同様ほぼ同一の変数とみなし歳出を除外')
X = X.drop(columns=['歳出決算総額(市町村財政)'])

# 符号の反転: 地方創生にとって「減ることが望ましい」変数に -1 を掛けて
# 解釈を揃える(原論文 2.3節・3節の処理。原論文は変化数に適用)
flip = ['完全失業者数', '転出者数(日本人移動者)', '死亡数',
        '経常収支比率(市町村財政)', '実質公債費比率(市町村財政)']
X[flip] = -X[flip]
Z = (X - X.mean()) / X.std()  # 標準化(平均0・分散1)
short = {c: c.replace('(市町村財政)', '').replace('(日本人移動者)', '')
             .replace('(基本票)', '').replace('(民営)', '') for c in X.columns}
print(f'  符号反転: {len(flip)}変数(完全失業者数・転出者数・死亡数・経常収支比率・実質公債費比率)')
▼ 実行結果
【変数の構築】n=1740市区町村, 21変数
  歳入決算総額 と 歳出決算総額 の相関: r=0.999 → 原論文と同様ほぼ同一の変数とみなし歳出を除外
  符号反転: 5変数(完全失業者数・転出者数・死亡数・経常収支比率・実質公債費比率)
💡 解説
  • 目標指標系8変数+規模の変数11個は総人口で割り、比率(経常収支比率・実質公債費比率)はそのまま使います。
  • 歳入決算総額と歳出決算総額の相関は r=0.999。原論文も変化数どうしで「歳入・歳出・投資的経費が互いに0.9以上の相関」を見つけ、ほぼ同一の変数とみなして歳出・投資的経費を除きました(多重共線性対策)。同じ判断が現行データの水準値でも成り立つことが分かります。
  • 原論文はさらに「総人口の変化数と15〜64歳人口の変化数の相関が0.85以上」で総人口を除外し、「非水洗化人口は変化が負の方向にしか存在しない」ため正規性の仮定から除外しています。
  • 符号反転:完全失業者数など「減ることが望ましい」変数に −1 を掛けることで、後の媒介中心性の解釈を「地方創生への貢献」と一致させます(原論文 2.3節・3節)。
💡 Python TIPS X[flip] = -X[flip] — 列のリストを使えば複数列にまとめて演算を適用できます。
原論文の変数除外・変換の一覧(原論文 3節)
  • 除外:歳出決算総額・投資的経費の変化数(歳入の変化数と r≧0.9)、総人口の変化数(15〜64歳人口の変化数と r≧0.85)、非水洗化人口(変化が負の方向のみで正規性を満たさない)
  • 符号反転(−1倍):完全失業者・転出者・転出超過・死亡者・経常収支比率・実質公債費比率の変化数——推定されるグラフの構造には影響しないが、係数の符号の解釈を地方創生への影響と合致させるための処理
  • 変換:変化数を2010年総人口で割って一人当たりに
3
分析2:ガウシアングラフィカルモデルと glasso(図3)

「相関がある」ではなく「他の変数を考慮しても直接つながっている」を見る

目標指標は他の様々な要因と複雑に関係しあっている。単純な相関行列では、AとBの両方がCに引きずられて生じる「見かけの相関」が大量のエッジを作ってしまう。そこで原論文はガウシアングラフィカルモデル(GGM)を使い、変数 Xi と Xj の関係を「他のすべての変数を与えたうえでの条件付き分布」で推定してグラフ化した。GGMのモデルは次の式で表される(原論文 2.3節)。

Xj = −Σk≠jjk / ωjj) Xk + εj, εj 〜 N(0, 1/ωjj)

ここで ωjk は説明変数の共分散行列の逆行列(精度行列)の (j,k) 要素である。ωjk = 0 と推定されれば「Xj と Xk は他の変数が与えられた下で独立」=「他の変数を考慮すると直接の関係はない」という条件付き独立として解釈できる。

なぜ glasso か(原論文 2.3節)
  • 実データでは計算誤差の影響で ωjk がちょうど0に推定されることはまれ→関係が弱いものを0と推定するスパース推定法であるグラフィカルlasso(glasso)[Friedman, Hastie & Tibshirani 2008]を使う。
  • 変数間に高い相関があると通常の推定は不安定になるが、glasso は多重共線性に頑健であることが知られている。
  • 分布を仮定するモデルなので尤度が計算でき、AICBICで正則化の強さ λ を客観的に選択できる。原論文は λ を 0〜0.5 の 0.001 刻みで探索し、AIC 最小の値を採用した。
やってみようステップ5: glasso のハイパーパラメータ λ を AIC で探索する(手法デモ)
📝 コード
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
# ===== ステップ5: glasso のハイパーパラメータを AIC で探索 =====
# 原論文は λ を 0〜0.5 の 0.001 刻みで探索し AIC 最小を選択。
# 本デモは 0.005〜0.5 の 0.005 刻み(計算時間短縮のため)。
n, p = Z.shape
results = []
for alpha in np.arange(0.005, 0.5001, 0.005):
    try:
        gl = GraphicalLasso(alpha=alpha, max_iter=500).fit(Z.values)
    except Exception:
        continue
    k = (np.abs(gl.precision_[np.triu_indices(p, 1)]) > 1e-8).sum() + p
    aic = -2 * n * gl.score(Z.values) + 2 * k
    results.append((alpha, aic, k - p, gl))
best_alpha, best_aic, best_edges, best_gl = min(results, key=lambda t: t[1])
print(f'\n【glasso デモ】λ を {len(results)}通り探索(AIC 基準)')
print(f'  AIC 最小: λ={best_alpha:.3f}, AIC={best_aic:.1f}, エッジ数={best_edges}')
print('  ※原論文は 0.001 刻みで探索し、変化数データに対して AIC 最小の λ を採用')
▼ 実行結果
【glasso デモ】λ を 100通り探索(AIC 基準)
  AIC 最小: λ=0.005, AIC=68800.1, エッジ数=164
  ※原論文は 0.001 刻みで探索し、変化数データに対して AIC 最小の λ を採用
💡 解説
  • 標準化したデータに GraphicalLasso(alpha=λ) を当てはめ、λ を 0.005〜0.5 の0.005刻み(100通り)で動かします(原論文は 0〜0.5 の0.001刻み)。
  • AIC = −2×(対数尤度) + 2×(パラメータ数)。パラメータ数は精度行列の非ゼロ要素数で数えます。λ が大きいほどエッジが減って単純になり、尤度は下がる——そのトレードオフの最適点を探します。
  • 本デモでは λ=0.005(エッジ164本)が AIC 最小でした。n=1740 と標本が大きいため、かなり密なネットワークが選ばれています。これは水準値デモの結果であり、原論文の変化数データでの選択結果とは異なります
💡 Python TIPS min(results, key=lambda t: t[1]) — タプルのリストから「2番目の要素が最小のもの」を1行で取り出せます。
やってみようステップ6: ネットワークの構築と描画(図3)
📝 コード
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
# ===== ステップ6: 図3 推定されたネットワークの可視化(手法デモ) =====
# 偏相関 r_jk = -ω_jk / sqrt(ω_jj・ω_kk) をエッジの重みとする
prec = best_gl.precision_
d = np.sqrt(np.diag(prec))
pcorr = -prec / np.outer(d, d)
np.fill_diagonal(pcorr, 0.0)
cols = list(Z.columns)
G = nx.Graph()
G.add_nodes_from(range(p))
for i in range(p):
    for j in range(i + 1, p):
        if abs(pcorr[i, j]) > 1e-4:
            G.add_edge(i, j, w=pcorr[i, j], dist=1.0 / abs(pcorr[i, j]))

# 正・負それぞれの係数ネットワークで媒介中心性を計算し、差をとる(原論文 2.3節)
Gp = nx.Graph()
Gn = nx.Graph()
Gp.add_nodes_from(range(p))
Gn.add_nodes_from(range(p))
for u, v, d_ in G.edges(data=True):
    (Gp if d_['w'] > 0 else Gn).add_edge(u, v, dist=d_['dist'])
bc_p = nx.betweenness_centrality(Gp, weight='dist')
bc_n = nx.betweenness_centrality(Gn, weight='dist')
score = {i: bc_p.get(i, 0.0) - bc_n.get(i, 0.0) for i in range(p)}

pos = nx.spring_layout(G, seed=42, k=1.4)
fig, ax = plt.subplots(figsize=(9.6, 7.6))
sizes = [300 + 2600 * max(score[i], 0) for i in range(p)]
node_col = ['#FFC107' if cols[i] in goal_vars else '#90CAF9' for i in range(p)]
top3 = sorted(score, key=score.get, reverse=True)[:3]
for i in top3:
    node_col[i] = '#F57F17' if cols[i] in goal_vars else '#1565C0'
epos = [(u, v) for u, v, d_ in G.edges(data=True) if d_['w'] > 0]
eneg = [(u, v) for u, v, d_ in G.edges(data=True) if d_['w'] < 0]
nx.draw_networkx_edges(G, pos, edgelist=epos, edge_color='#78909C',
                       width=[3 * abs(G[u][v]['w']) + 0.3 for u, v in epos], ax=ax)
nx.draw_networkx_edges(G, pos, edgelist=eneg, edge_color='#E57373', style='dashed',
                       width=[3 * abs(G[u][v]['w']) + 0.3 for u, v in eneg], ax=ax)
nx.draw_networkx_nodes(G, pos, node_size=sizes, node_color=node_col,
                       edgecolors='#455A64', ax=ax)
nx.draw_networkx_labels(G, pos, labels={i: short[cols[i]] for i in range(p)},
                        font_size=8, font_family='Hiragino Sans', ax=ax)
ax.set_title('glasso により推定した変数間ネットワーク(手法デモ: SSDSE-A-2025 の水準値, '
             f'λ={best_alpha:.3f}, AIC最小)\n'
             '黄=目標指標系 / 青=その他 / 濃色=媒介中心性スコア上位3 / '
             '実線=正・破線=負の偏相関(原論文 図表4(a) の再計算ではない)',
             fontsize=10)
ax.axis('off')
fig.tight_layout()
fig.savefig(f'{FIG_DIR}/2019_U1_fig3.png', bbox_inches='tight')
plt.close(fig)
print(f'\n【図3】ネットワーク描画: ノード{p}個, 正エッジ{len(epos)}本, 負エッジ{len(eneg)}本')
▼ 実行結果
【図3】ネットワーク描画: ノード20個, 正エッジ96本, 負エッジ68本
💡 解説
  • 精度行列から偏相関 rjk = −ωjk/√(ωjjωkk) を計算し、非ゼロの組にエッジを張ります。
  • 正の偏相関は実線(灰)、負の偏相関は破線(赤)。エッジの太さは偏相関の大きさに比例させています。
  • ノードの大きさは次のステップで計算する媒介中心性スコアに比例——原論文 図表4(a) が「ノードの大きさ=媒介中心性」で描いたのと同じ流儀です。
  • 黄色いノードが目標指標系、青がその他の変数。原論文のネットワークでも10個の目標指標がすべてネットワークに含まれ、変数が互いに複雑に影響しあうことが示されました。
💡 Python TIPS nx.spring_layout(G, seed=42) — バネモデルによる自動レイアウト。seed を固定すると毎回同じ配置になり再現性が保てます。
glassoにより推定した変数間ネットワーク(手法デモ・SSDSE-A-2025)
図3:glasso により推定した変数間ネットワーク(手法デモ:SSDSE-A-2025 の水準値(人口あたり)、λ=0.005・AIC最小、n=1740)。黄=目標指標系、青=その他、濃色=媒介中心性スコア上位3変数、実線=正・破線=負の偏相関。原論文 図表4(a)(2010→2015年の変化数ネットワーク)の再計算ではない。原論文のネットワーク図は原論文参照。
📌 この図の読み方
このグラフは
線で繋がっているノード(変数)どうしは「他の変数を考慮しても互いに影響を与え合う」変数。線がない組は条件付き独立と推定された組。
どこを見る?
大きく濃いノード(歳入決算総額・就業者数・地方税)がネットワークの中央に陣取り、多数の変数を中継している点。目標指標(黄)がすべてネットワークに含まれている点も原論文の変化数ネットワークと共通。
次に何を疑う?
エッジの有無は λ の選び方に依存する。λ を大きくすれば疎な骨格だけが残る。また、このデモは「水準値」の関係であり、原論文が見た「5年間の変化」の関係とは意味が異なる。
原論文の分析2の結果(4.2節)——図表4(a) は原論文参照 推定されたネットワークには10個の目標指標がすべて含まれ、各変数が互いに複雑に影響しあっていることが客観的に示された。冒頭で述べた「目標指標間の複雑な関連性」(目標どうしの循環)が、データからも裏付けられた形である。
4
媒介中心性と「稼ぐ力」(図4)

ネットワークが推定できたら、次は「その構造の中でどの変数が最も影響を及ぼしているか」を評価したい。原論文は媒介中心性(betweenness centrality、Brandes 2001)を使う。媒介中心性は「あるノードが、他のノード間の最短距離のパスに含まれた回数」で評価され、どれだけ他の変数への影響を中継しているかを表す。

原論文の工夫(2.3節)——正と負を分けて評価する
  • 係数(偏相関)が大きい=関係が強い、なので係数の逆数 1/|係数| をノード間の「距離」として最短経路を計算する。
  • 係数は正とは限らない。そこで正の係数だけのネットワーク負の係数だけのネットワークを独立に評価し、各ノードについて「正のネットワークでの媒介中心性 − 負のネットワークでの媒介中心性」を正の影響度合いのスコアとする。
  • 失業者数など「減らすことが望ましい」変数は符号を反転(−1倍)してあるので、スコアの解釈は一貫して「地方創生への正の貢献」と読める。
やってみようステップ7: 媒介中心性スコアの可視化(図4)
📝 コード
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
# ===== ステップ7: 図4 媒介中心性スコア(正−負)の可視化(手法デモ) =====
order = sorted(range(p), key=lambda i: score[i])
fig, ax = plt.subplots(figsize=(8.6, 6.4))
vals4 = [score[i] for i in order]
cols4 = ['#1565C0' if v >= 0 else '#C62828' for v in vals4]
ax.barh(range(p), vals4, color=cols4, height=0.62)
ax.set_yticks(range(p))
ax.set_yticklabels([short[cols[i]] for i in order], fontsize=9)
ax.axvline(0, color='#555', lw=0.8)
ax.set_xlabel('媒介中心性スコア(正の係数ネットワーク − 負の係数ネットワーク)')
ax.set_title('手法デモ: 各変数の媒介中心性スコア(SSDSE-A-2025 の水準値)\n'
             '原論文 図表4(b) と同じ手順(距離=1/|係数|)。変化数分析の再計算ではない',
             fontsize=10.5)
fig.tight_layout()
fig.savefig(f'{FIG_DIR}/2019_U1_fig4.png', bbox_inches='tight')
plt.close(fig)
print('\n【図4】媒介中心性スコア(デモ)上位5変数:')
for i in sorted(score, key=score.get, reverse=True)[:5]:
    print(f'  {short[cols[i]]}: {score[i]:+.4f}')

print('\n【原論文 4.2節の報告】媒介中心性が最も高かった変数(変化数, 順に):')
print('  市町村の一般財源, 15〜64歳人口, 課税対象所得, 地方税, 歳入決算額')
print('  負の値が大きい変数: 災害復旧費, 実質公債費比率, 経常収支比率')
print('  → 経済規模の変化に関する変数群 =「稼ぐ力」が地方創生の出発点(原論文の結論)')

print('\n=== 完了 ===')
for i in range(1, 5):
    print(f'図{i}: html/figures/2019_U1_fig{i}.png')
▼ 実行結果
【図4】媒介中心性スコア(デモ)上位5変数:
  歳入決算総額: +0.2398
  就業者数: +0.1345
  地方税: +0.0819
  事業所数: +0.0760
  従業者数: +0.0760

【原論文 4.2節の報告】媒介中心性が最も高かった変数(変化数, 順に):
  市町村の一般財源, 15〜64歳人口, 課税対象所得, 地方税, 歳入決算額
  負の値が大きい変数: 災害復旧費, 実質公債費比率, 経常収支比率
  → 経済規模の変化に関する変数群 =「稼ぐ力」が地方創生の出発点(原論文の結論)

=== 完了 ===
図1: html/figures/2019_U1_fig1.png
図2: html/figures/2019_U1_fig2.png
図3: html/figures/2019_U1_fig3.png
図4: html/figures/2019_U1_fig4.png
💡 解説
  • 正のエッジだけのグラフ Gp と負のエッジだけのグラフ Gn で別々に媒介中心性を計算し(距離=1/|偏相関|)、差をスコアにします——原論文 2.3節とまったく同じ手順です。
  • 本デモ(水準値)の上位は歳入決算総額・就業者数・地方税・事業所数・従業者数。原論文(変化数)の上位——一般財源・15〜64歳人口・課税対象所得・地方税・歳入決算額——と顔ぶれが重なるのは示唆的ですが、水準と変化という意味の違いがあるため同一視はできません。
  • 最後の print は原論文 4.2節の報告のまとめであり、本スクリプトの計算結果ではありません(出力にもそう明記)。
💡 Python TIPS nx.betweenness_centrality(G, weight='dist')weight にエッジ属性名を渡すと、重み付き最短経路で媒介中心性を計算します。
媒介中心性スコア(手法デモ・SSDSE-A-2025)
図4:各変数の媒介中心性スコア(正の係数ネットワーク − 負の係数ネットワーク)。手法デモ:SSDSE-A-2025 の水準値に対して原論文 図表4(b) と同じ手順を適用したもので、原論文の変化数分析の再計算ではない。原論文の媒介中心性の表は原論文 図表4(b) 参照。

原論文の結果:媒介中心性が示した「稼ぐ力」

方向変数(原論文 4.2節の報告、変化数)原論文の解釈
正の影響が大きい
(上位5・順に)
市町村の一般財源・15〜64歳人口・課税対象所得・地方税・歳入決算額の変化数 多くが自治体の経済規模の変化に関連する項目=中村良平(2018)の言う地方自治体の「稼ぐ力」。「稼ぐ力」が経済の好循環を生む出発点であるという考えと合致。
負の値が大きい 災害復旧費・実質公債費比率・経常収支比率(の変化数) 災害復旧費は災害に見舞われた地方で高くなるため、災害の影響から他の変数へ負の影響を与えていると考えられる。実質公債費比率・経常収支比率は分母と分子の与える影響がそれぞれ異なることが負の影響につながった可能性。
分析2の結論(原論文 4.2節) 複数存在した地方創生の目標指標は統一的な変数間の関係ネットワークにすべて含まれ、そのネットワーク全体へ大きな正の影響を与える変数として、地方の「稼ぐ力」=経済規模の変化に関する変数群が挙げられた。「稼ぐ力」の重視という現在の政策的な考え方に、分析による客観的な根拠を与えた点がこの論文の核心である。なお推定されたネットワークで15〜64歳人口の変化量は2番目に正の影響を与える変数であり、人口の増加が見込みにくい今後は、連携によって経済規模を担保することが必要になる——これが分析3の動機となる。
5
分析3:潜在クラス分析による地域間連携パターンの推定

分析2で「稼ぐ力」の重要性が示された。それを向上させる案として原論文が注目したのが、基本目標4にもある「地方連携」である。理由は4つ(原論文 4.2節)。

#地域間連携を考える理由
1地域によって得意とする産業や環境が異なる——同様の状況にある自治体と連携することで、それぞれの状況に適した案を創出できる
2今後の人口減少傾向の下では、地域間で連携して経済規模を担保することが必要(15〜64歳人口の変化量はネットワークで2番目に正の影響)
3現在の連携中核都市圏構想では広域連携が難しい地域が多数存在する——近隣に限らない連携の枠組みが必要
4海外に向けての「稼ぐ力」の向上——輸出には企業・産業の規模が関係する(Wagner 2007)ため、規模の獲得にも連携が有効

使ったデータと下ごしらえ(原論文 3節・4.3節)

潜在クラス分析(原論文 2.4節)

潜在クラス分析は、離散変数の尤度を EMアルゴリズムで最大化し、類似した変数の傾向をもつサンプルを共通のクラスターに分類する手法である(実装は R の poLCA が代表例;Linzer & Lewis 2011)。glasso と同じく尤度を用いる手法なので、クラスタ数をAICで客観的に決められる点、結果が所属確率で返るため各市町村が複数のクラスターに所属しうる(ソフトクラスタリング)点が、この研究の目的——柔軟な地方連携の提案——に合っている。原論文はクラスタ数を2〜50の間で探索し、AIC最小の24クラスタを採用した。

分析3の結果(原論文 4.3節)——図表5・図表6は原論文参照
  • クラスタごとに色分けした日本地図(図表5a)では、局所的には近隣地域が同じクラスターに属する傾向が見られるが、全体では地理的な制約によらないクラスタリングができている。
  • 東京都港区・愛知県名古屋市・大阪府大阪市という3大都市の代表都市が同一のクラスターに属しており、経済規模も反映されている。
  • クラスタごとの特化係数平均のヒートマップ(図表5b)から、各クラスタで重複する構成は存在せず、強みとする産業や産業構成によってクラスタリングされている。
  • 同程度の経済規模・産業の強みを持つ、地理的な制約によらないクラスタリングが実現できた。既存の枠組みにとらわれない地方連携への新たな示唆である。
本ページでの扱い 分析3の入力である RESAS の特化係数・売上金額は SSDSE に収録されておらず(RESAS からの再取得・再集計が必要)、24クラスタの割当も原論文に市町村一覧(図表6)として掲載されているのみでデータとしては配布されていない。このため本ページでは再計算・図の再現は行わず、手法の考え方と原論文の報告内容の解説にとどめる。日本地図・ヒートマップ・クラスタ別市町村一覧は原論文(図表5・図表6)参照

まとめ

本研究は SSDSE-2019A・e-Stat・RESAS を統合した1722市町村のデータから、地方創生の目標指標に関する変化要因ネットワークを推定し、それに基づく地域間連携策を提案した。

主要な発見(いずれも原論文の報告)
  • 分析1:目標指標の増加率は人口規模によらない(図表3、いずれも相関係数は小さい)——大都市も過疎地域も共通の土俵で要因を探れる。
  • 分析2:glasso で推定した変化要因ネットワークは10個の目標指標をすべて含み、変数が複雑に影響しあう構造を客観的に示した。媒介中心性の上位は一般財源・15〜64歳人口・課税対象所得・地方税・歳入決算額の変化数=地方の「稼ぐ力」であり、現行の政策的な考え方に分析による客観的な根拠を与えた。
  • 分析3:特化係数と売上金額の潜在クラス分析(AICで24クラスタ)により、同程度の経済規模・産業の強みをもつ、地理的な制約によらない地域間連携パターンを提示した(例:東京都港区・名古屋市・大阪市が同一クラスタ)。

分析の限界と今後の課題(原論文 5節)

限界内容と今後
収集できるデータの限界 市町村単位のデータでは不足する変数が存在した可能性。5年でなく1年ごとの変化や、4つの目標に即した施策の有無などの変数が加わればより詳細で精緻な分析ができる。分析3の特化係数の欠損(秘匿)も同様。
将来のデータに対する妥当性 使用データは2016年以前が多く、地方創生への取り組みがまだ多くなかった時期のもの。様々な介入が行われた後の第2期総合戦略に対してこの結果がどれほど一般性をもつかは検証が必要。ただし分析自体はデータを変えることで更新でき、最新の国勢調査などの結果で分析をアップデートできる。
統計学習のポイント この論文の教育的価値は3つある。(1)相関ネットワークではなく条件付き独立に基づく偏相関ネットワークを使い、「見かけの相関」を排して直接の関係だけを描いたこと。(2)λ・クラスタ数という研究者の主観が入りやすいハイパーパラメータを、尤度に基づくAICで一貫して客観的に選択したこと。(3)審査会コメントにあるとおり、これは仮説実証型ではなく探索的解析である——ネットワークのエッジは因果の向きを示さず、得られた知見は「次に検証すべき仮説」として位置づけるのが正しい読み方である。
やってみようスクリプト全体の実行結果(まとめ)
📝 コード
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
# ===== ステップ7: 図4 媒介中心性スコア(正−負)の可視化(手法デモ) =====
order = sorted(range(p), key=lambda i: score[i])
fig, ax = plt.subplots(figsize=(8.6, 6.4))
vals4 = [score[i] for i in order]
cols4 = ['#1565C0' if v >= 0 else '#C62828' for v in vals4]
ax.barh(range(p), vals4, color=cols4, height=0.62)
ax.set_yticks(range(p))
ax.set_yticklabels([short[cols[i]] for i in order], fontsize=9)
ax.axvline(0, color='#555', lw=0.8)
ax.set_xlabel('媒介中心性スコア(正の係数ネットワーク − 負の係数ネットワーク)')
ax.set_title('手法デモ: 各変数の媒介中心性スコア(SSDSE-A-2025 の水準値)\n'
             '原論文 図表4(b) と同じ手順(距離=1/|係数|)。変化数分析の再計算ではない',
             fontsize=10.5)
fig.tight_layout()
fig.savefig(f'{FIG_DIR}/2019_U1_fig4.png', bbox_inches='tight')
plt.close(fig)
print('\n【図4】媒介中心性スコア(デモ)上位5変数:')
for i in sorted(score, key=score.get, reverse=True)[:5]:
    print(f'  {short[cols[i]]}: {score[i]:+.4f}')

print('\n【原論文 4.2節の報告】媒介中心性が最も高かった変数(変化数, 順に):')
print('  市町村の一般財源, 15〜64歳人口, 課税対象所得, 地方税, 歳入決算額')
print('  負の値が大きい変数: 災害復旧費, 実質公債費比率, 経常収支比率')
print('  → 経済規模の変化に関する変数群 =「稼ぐ力」が地方創生の出発点(原論文の結論)')

print('\n=== 完了 ===')
for i in range(1, 5):
    print(f'図{i}: html/figures/2019_U1_fig{i}.png')
▼ 実行結果
【図4】媒介中心性スコア(デモ)上位5変数:
  歳入決算総額: +0.2398
  就業者数: +0.1345
  地方税: +0.0819
  事業所数: +0.0760
  従業者数: +0.0760

【原論文 4.2節の報告】媒介中心性が最も高かった変数(変化数, 順に):
  市町村の一般財源, 15〜64歳人口, 課税対象所得, 地方税, 歳入決算額
  負の値が大きい変数: 災害復旧費, 実質公債費比率, 経常収支比率
  → 経済規模の変化に関する変数群 =「稼ぐ力」が地方創生の出発点(原論文の結論)

=== 完了 ===
図1: html/figures/2019_U1_fig1.png
図2: html/figures/2019_U1_fig2.png
図3: html/figures/2019_U1_fig3.png
図4: html/figures/2019_U1_fig4.png
💡 解説
  • 出力の前半(図4のスコア)は本スクリプトの実際の計算結果、後半の【原論文 4.2節の報告】は原論文の報告の転記です。この区別を出力にも刻んでおくのが、教育用再現の透明性を保つコツです。

原論文の使用データ:SSDSE-2019A(独立行政法人統計センター・教育用標準データセット 市区町村データ)、e-Stat、RESAS——地域コードで統合、欠損を除く1722市町村
原論文の分析手法:相関分析、ガウシアングラフィカルモデル(グラフィカルlasso、λはAICで選択)、媒介中心性(正負ネットワーク分離)、潜在クラス分析(クラスタ数2〜50をAICで探索→24)
本ページのデモ:SSDSE-A-2025(1740市区町村・20変数の水準値)に同じ手順を適用(scikit-learn GraphicalLasso・networkx)
対象論文:2019年度(令和元年度)統計データ分析コンペティション 総務大臣賞(大学生・一般の部) 張 瀚天・白鳥 友風(筑波大学大学院 システム情報工学研究科 社会工学専攻)

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

統計分析の解釈で初心者がやりがちな勘違いをまとめます。特に「相関因果の混同」「p値の過信」は研究現場でもよく起きる落とし穴です。本文を読む前にも、読んだ後にも、目を通してみてください。

❌ 「相関がある=因果関係がある」ではない
疑似相関spurious correlationとは、見かけ上は関係があるように見えるが、実際は無関係、または第三の変数(交絡変数)が両方に影響しているだけの現象です。

古典例: アイスクリームの売上 と 水難事故件数 は強く相関するが、片方が他方を引き起こしているわけではない。両者とも「夏の暑さ」という第三の変数に引きずられているだけ。

論文を読むときの心構え: 「○○と△△に強い相関が見られた」だけで終わっている主張は、本当に因果関係があるのか、それとも第三の変数(人口・所得・地理など)が共通要因として効いているだけではないかを必ず疑ってください。
❌ 「p値が小さい=重要な発見」ではない
p値が小さい(例えば p < 0.001)ことは「統計的に偶然とは考えにくい」という意味であって、「実用的に大きな効果がある」という意味ではありません。

例: 巨大なサンプルサイズ(n=100,000)では、相関係数 r=0.02 でも p < 0.001 になります。しかし r=0.02 は実用上ほぼ無視できる関係です。

正しい読み方: p値効果量係数の大きさ、相関係数の値)の両方をセットで判断してください。p値だけで「重要な発見」と結論づけるのは誤りです。
❌ 「回帰係数が大きい=重要な変数」ではない
回帰係数の絶対値は、説明変数単位に強く依存します。「年収(万円)」と「失業率(%)」の係数を直接比較しても意味がありません。

正しい比較方法: (1) 標準化係数(各変数を平均0・分散1に変換した上での係数)を使う、(2) 限界効果(変数を1標準偏差動かしたときのyの変化)で比較する。

また、係数の大きさが「因果関係の強さ」を意味するわけでもありません。あくまで「相関的な関連の強さ」です。
❌ 「外れ値を除外すれば正しい結果」ではない
外れ値(極端な値)を「目障りだから」「結果が綺麗にならないから」という理由で除外するのは分析の改ざんに近い行為です。

外れ値が示すもの: 本当に重要な情報(東京の超高密度、北海道の超低密度など)であることが多い。外れ値を取り除くと「日本全体の傾向」を見誤る原因になります。

正しい対処: (1) 外れ値の出現要因を調査する(なぜ東京だけ突出するのか)、(2) ノンパラメトリック手法(Spearman相関Kruskal-Wallis)を使う、(3) 外れ値を含む結果と除外した結果の両方を提示し、解釈を読者に委ねる。
❌ 「サンプルサイズが大きい=信頼できる」ではない
サンプルサイズ(n)が大きいと統計的検定の検出力は上がりますが、それは「偶然による誤差を減らす効果」にすぎません。

nが大きくても解消されない問題:
選択バイアス標本が偏っている)
測定誤差(変数の定義が曖昧)
欠損値のパターン(欠損がランダムでない)
交絡変数の見落とし

例: 1万人にWeb調査して「ネット利用と幸福度は強く相関」と言っても、そもそも回答者がネットユーザー寄りに偏っているため、母集団全体の結論にはなりません。
❌ 「複雑なモデル=より良い分析」ではない
ランダムフォレストニューラルネット・複雑な階層モデルなど、高度な手法を使えば「良い分析」と感じがちですが、必ずしもそうではありません。

過学習(overfitting)の罠: モデルが複雑すぎると、訓練データ偶然のパターンまで学習してしまい、新しいデータでは予測精度が落ちます。

シンプルさの価値: 重回帰分析相関分析は「結果が解釈しやすい」「再現性が高い」という大きな利点があります。複雑な手法はシンプルな手法で答えが出ない時の最後の手段です。
❌ 「多重共線性は気にしなくていい」ではない
多重共線性とは、説明変数同士の相関が極めて強い状態のこと。これを放置すると、回帰係数符号や大きさが入れ替わる異常事態が起こります。

典型例: 「総人口」と「労働力人口」を同時に投入すると、両者の相関が r=0.99 になり、係数推定が極端に不安定になります。「総人口は正だが、労働力人口は負」のような解釈不能な結果になりがちです。

診断と対処:
VIF(分散拡大係数)を計算し、VIF > 10 の変数を確認
相関行列で |r| > 0.8 のペアをチェック
・対処法:一方を除外、合成変数(PCA)に変換、Ridge回帰で安定化
❌ 「R²が高い=良いモデル」ではない
決定係数 R² はモデルの「当てはまりの良さ」を示しますが、 が高くてもモデルが正しいとは限りません

が高くなる罠:
説明変数を増やせば は自動的に上がる(無関係な変数を追加してもは下がらない)
時系列データでは、共通のトレンド(時間とともに増加)があるだけで が 0.9 を超える
サンプルサイズが小さいとが過大評価される

代替指標: 調整済み (変数の数でペナルティ)AICBICモデル選択基準)を併用してください。予測力の真の評価には交差検証(cross-validation)テストデータ を見ること。
❌ 「ステップワイズで選んだ変数は重要」ではない
ステップワイズ法(バックワード・フォワード選択)は便利ですが、p値ベースの変数選択は再現性に問題があると批判されています。

問題点:
同じデータでも実行順序によって最終モデルが変わる
p値を繰り返し見ることで「偶然に有意な変数」を拾ってしまう(p-hacking
係数標準誤差が過小評価され、信頼区間が嘘っぽくなる

より良い方法:
事前に変数を理論で絞る(先行研究から候補を選ぶ)
LASSO回帰(自動かつ統計的に正当化された変数選択)を使う
交差検証AIC/BIC 最小モデルを選ぶ
❌ 「線形回帰なら線形関係を前提にすべき」
重回帰分析線形関係を前提とします。実際の関係が非線形なのに線形モデルで分析すると、本当の関係を見逃します

非線形の例:
U字型関係: 失業率と物価上昇率(フィリップス曲線)
逓減効果: 所得と幸福度(年収 800万円までは強い正の効果、それ以上は飽和)
閾値効果: 高齢化率と医療費(ある水準を超えると急激に上がる)

診断と対処:
残差プロット残差が0周辺に均等に分布しているか確認
変数の対数変換・二乗項追加で非線形性を取り込む
・どうしても線形では捉えられないなら、機械学習RF・GBM)を併用する
❌ 「データに当てはまった=予測に使える」ではない
「過去のデータでフィットしたから将来も予測できる」と思うのは危険です。

過学習(overfitting)の例: 47都道府県のデータに10個の説明変数を投入すれば、ほぼ完璧にフィットします(自由度がほぼゼロ)。でもそのモデルを新しい年度に適用すると、予測精度はほぼランダム並みに落ちることがあります。

正しい予測力の評価:
・データを訓練用 70%テスト用 30%に分割し、テスト用での予測精度を見る
k分割交差検証(k-fold CV)で予測の安定性を確認
・「説明変数の数 ≪ サンプルサイズ」のバランスを意識(目安:n > 10 × 変数数)

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

統計の基本用語を初心者向けに解説します。本文中で見慣れない言葉が出てきたら、ここに戻って確認してください。

p値
「効果がない」と仮定したときに、観察されたデータ(またはより極端なデータ)が得られる確率。0〜1の値で、慣例的に 0.05(5%)未満を「有意」と判断する。
有意水準
「偶然」と「意味のある違い」を分ける基準。通常 α=0.05(5%)を使う。p値 < α なら「有意」と判定。
信頼区間
「真の値はこの範囲にあるだろう」という幅。95%信頼区間 = 同じ実験を100回繰り返したら95回はこの範囲に真の値が入る。
サンプルサイズ
分析に使ったデータ点の数(n)。一般にnが大きいほど推定が安定し、わずかな差も検出できるようになる。
標準誤差
推定値(係数など)のばらつきの目安。標準誤差が小さいほど推定値が安定している。
正規分布
釣鐘型の左右対称な分布。多くのパラメトリック検定(t検定F検定など)は「データが正規分布に従う」ことを仮定する。
因果相関
相関がある」と「原因と結果の関係(因果)」は別物。アイスクリームの売上と水難事故は相関するが、原因は両者とも「夏の暑さ」。
外れ値
他のデータから極端に離れた値。分析結果を歪める原因になるため、検出して除外するか別途扱う必要がある。
欠損値
データが取得できなかった部分(NaN・空白)。除外するか補完(平均代入・回帰代入など)するかが分析上の重要な判断点。
VIF
Variance Inflation Factor分散拡大係数)。多重共線性の強さを示す指標。VIF > 10 で「強い多重共線性あり」と判断。
交絡変数
「真の原因」と「結果」の両方に影響する第三の変数。これを統制しないと、見かけ上の関係を真の因果と誤認する。
係数回帰係数
説明変数 x が1単位増えたとき、目的変数 y が平均でどれだけ変化するか」を示す数値。正の値は正の影響、負の値は負の影響。
内生性
説明変数と誤差項が相関している状態。逆因果交絡変数の存在で発生する。これを放置すると係数推定にバイアスが生じる。
多重共線性
説明変数同士の相関が強すぎる状態。係数推定が不安定になり、解釈を誤る原因になる。VIF > 10 が警告サイン。
標準化係数
変数の単位の影響を取り除いた係数。複数の変数の影響の大きさを単位に依存せず比較するために使う。
決定係数 R²
回帰モデル目的変数のばらつきの何%を説明できるかを示す指標。0〜1の値で、1に近いほどモデルの説明力が高い。
条件付き独立
「他のすべての変数の値を知ったうえでは、XとYの間にもう関係が残っていない」という状態。GGMではエッジが張られない(精度行列の要素が0)ことに対応する。単なる無相関(周辺独立)とは異なる。
偏相関
他の変数の影響を取り除いたうえでの2変数の相関。精度行列(共分散行列の逆行列)の要素 ω から r = −ωjk/√(ωjjωkk) で計算できる。
精度行列
共分散行列の逆行列。多変量正規分布では、この行列の (j,k) 要素が0であることと「変数jと変数kが他の変数を与えたもとで条件付き独立」であることが同値になる。
媒介中心性
ネットワークの中で、あるノードが「他のノード同士を結ぶ最短経路」にどれだけ含まれるかを数えた指標。値が大きいノードほど情報や影響の「中継点」として重要とみなされる。
ベキ分布
ごく少数の巨大な値と大多数の小さな値からなる、裾が極端に重い分布。市町村の人口・就業者数などの規模の変数が典型例。正規分布を仮定する手法の前に変換(人口あたり・対数など)が必要になる。
潜在クラス分析
離散変数(カテゴリ)の組合せパターンから、背後にある「見えないグループ(潜在クラス)」を尤度最大化(EMアルゴリズム)で推定する手法。各サンプルは各クラスへの所属確率をもつ(ソフトクラスタリング)。
特化係数
ある地域のある産業の構成比を、全国の構成比で割った値。1を超えていればその産業に地域が「特化」している(強みをもつ)ことを意味する。RESASでは従業者数・付加価値額・労働生産性ベースの3種が提供される。
RESAS
地域経済分析システム(Regional Economy Society Analyzing System)。内閣府等が提供する、産業構造・人口動態・観光などの地域データを可視化・取得できるシステム。

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

統計手法について「何のためか」「結果をどう読むか」を初心者向けに解説します。

◆ 統計の基本概念(この論文を読む前提)

🔍 相関・偏相関・条件付き独立の違い
何?
相関は2変数の関係をそのまま測る。偏相関は「他の変数の影響を取り除いたうえでの」2変数の関係を測る。偏相関が0=条件付き独立(他の変数を知っていれば、もう互いに情報を持たない)。
なぜ必要?
市町村データでは、ほぼすべての規模の変数が「経済規模」に引きずられて互いに相関してしまう。偏相関ならこの「見かけの相関」を除いて、直接つながる変数の組だけを取り出せる。
何がわかる?
「AとBが相関する」のは(a)直接の関係、(b)第三の変数C経由、のどちらか区別できないが、偏相関ネットワークなら (b) のエッジは張られない。
読み方
GGMのネットワーク図で「エッジがない」=無関係ではなく「他の変数を考慮すると直接の関係はない」。この条件付きの読み方が最重要。
⚖️ AIC(赤池情報量規準)によるモデル選択
何?
AIC = −2×(最大対数尤度) + 2×(パラメータ数)。「当てはまりの良さ」と「モデルの単純さ」のバランスを1つの数値にした指標。小さいほど良い。
なぜ必要?
glasso の λ や潜在クラス分析のクラスタ数は、研究者の主観で選ぶと恣意的になる。尤度に基づくモデルなら AIC で候補を横並びに比較できる。
何がわかる?
本論文では λ(0〜0.5・0.001刻み)とクラスタ数(2〜50)をともに AIC 最小で決定——「なぜその設定か」に客観的な答えを用意できる。
読み方
AICの絶対値には意味がなく、同じデータでの差だけが意味をもつ。異なるデータ間で AIC は比較できない。

◆ この論文で使われている手法

🔗 相関分析(分析1・変数の下ごしらえ)
何?
2つの変数の「一緒に増減する傾向の強さと向き」を −1〜+1 の相関係数 r で数値化する手法。
どう使う?
本論文では(1)分析1で人口規模と増加率の関係の確認、(2)ほぼ同一の変数(歳入・歳出・投資的経費、r≧0.9)の検出と除外、(3)特化係数の代替変数の妥当性確認(従業者数ベースと付加価値額ベースで r=0.78)の3か所で使われる。
何がわかる?
本格的な多変量解析の前に「重複した変数」「無関係な変数」を整理できる。
結果の読み方
|r|>0.7 で強い相関、|r|<0.2 はごく弱い。図1のようにすべて |r|<0.2 なら「規模の影響は無視できる」と判断できる。
⚠️ 注意点
(1) ベキ分布に弱い——市町村の規模変数は外れ値(大都市)に相関係数が引きずられるので、人口あたり変換や対数変換を先に。(2) 相関≠因果——散布図で形状(非線形・外れ値)も必ず確認。(3) 見かけの相関——第三の変数の影響は偏相関・GGMで確認する。本論文の分析2はまさにその対処である。
🕸 ガウシアングラフィカルモデル(GGM)
何?
多変量正規分布に従う p 次元の確率変数について、変数の組ごとの「条件付き独立かどうか」を精度行列(共分散行列の逆行列)の要素 ωjk=0 か否かで表し、グラフ(ネットワーク)として描くモデル。
どう使う?
変数を正規分布に近づける前処理(人口あたり変換など)→標準化→精度行列を推定→非ゼロ要素にエッジを張る。エッジの重みには偏相関 −ωjk/√(ωjjωkk) を使う。
何がわかる?
「他のすべての変数を考慮したうえで、直接つながっている変数の組」だけからなるネットワーク。相関行列より格段に疎で解釈しやすい。
結果の読み方
エッジあり=条件付き依存、なし=条件付き独立。エッジの符号(正負)で影響の方向を読む。
⚠️ 注意点
(1) 多変量正規の仮定——ベキ分布のまま当てはめると誤ったエッジが出る。本論文は人口あたり変換で対処し、変化が負のみの変数(非水洗化人口)は除外した。(2) 無向グラフ——エッジは因果の向きを示さない。(3) n(標本数)が小さいと精度行列の推定は不安定——スパース推定(glasso)と併用するのが実務の定石。
✂️ グラフィカルlasso(glasso)
何?
精度行列の推定に L1 正則化(lasso と同じペナルティ)を加え、「弱い関係」をちょうど0と推定してスパースなネットワークを得る手法(Friedman, Hastie & Tibshirani 2008)。
どう使う?
正則化の強さ λ を決めて対数尤度−λ×Σ|ω| を最大化。λ が大きいほどエッジが減る。本論文は λ を 0〜0.5 の 0.001 刻みで探索し AIC 最小を採用。
何がわかる?
計算誤差でゼロにならない微小な偏相関を自動で刈り込み、本質的な骨格だけのネットワークが得られる。
結果の読み方
残ったエッジが「データが支持する直接の関係」。λ 選択の根拠(AIC/BIC/交差検証)を必ず確認する。
⚠️ 注意点
(1) 結果は λ に強く依存——λ を手で決めると恣意的になる。情報量規準や交差検証で客観的に選び、選択基準を明記する。(2) 多重共線性には頑健だが、完全な線形従属(例:転出超過=転出−転入を全部入れる)は避ける。(3) n が大きいと AIC は密なネットワークを選びがち——本ページのデモ(n=1740、λ=0.005)がその例で、解釈目的なら BIC やより大きな λ の感度分析も併用するとよい。
🎯 媒介中心性(betweenness centrality)
何?
ネットワーク上で、あるノードが「他のノード間の最短経路」に何回含まれるかを数えた中心性指標(効率的な計算法は Brandes 2001)。
どう使う?
本論文の流儀では、エッジの重み(偏相関)の逆数を「距離」とし、正の係数ネットワークと負の係数ネットワークを別々に評価して差をとる。減らしたい変数は事前に符号反転して解釈を揃える。
何がわかる?
ネットワーク全体への影響を最も「中継」している変数=介入の梃子(てこ)になりうる変数を特定できる。本論文ではこれが「稼ぐ力」の変数群だった。
結果の読み方
スコア上位=ネットワークの要。ただし「重要さ」の定義は中心性の種類(次数中心性・固有ベクトル中心性など)によって変わる。
⚠️ 注意点
(1) 中心性は「重要さ」の一つの定義にすぎない——別の中心性では順位が変わりうるので、目的(影響の中継)と指標の対応を説明できるように。(2) 距離=1/|係数| という変換に依存——単調変換を変えると最短経路も変わりうる。(3) エッジは無向・相関的——「上位の変数に介入すれば波及する」は仮説であって実証ではない。
🧩 潜在クラス分析(LCA)
何?
離散変数(カテゴリ)の組合せパターンの尤度を EMアルゴリズムで最大化し、背後の「見えないグループ(潜在クラス)」と各サンプルの所属確率を推定する手法(poLCA; Linzer & Lewis 2011)。
どう使う?
連続変数は先に離散化(本論文:売上金額は分位点0.1刻み、特化係数は1・3・5の閾値)。クラスタ数を変えながら当てはめ、AIC最小のクラスタ数を選ぶ(本論文:2〜50を探索→24)。
何がわかる?
「どの産業に強いか」のパターンが似た市町村のグループ。所属確率で返るため、1市町村が複数のグループに足をかける柔軟な連携提案ができる。
結果の読み方
各クラスタの変数分布(本論文ではヒートマップ)を見てグループの意味を解釈・命名する。地図に落とすと地理的パターンも確認できる。
⚠️ 注意点
(1) 離散化の閾値に結果が依存——なぜ1・3・5なのか、分位点なのかの根拠を示す(本論文はベキ分布と「1超=強み」という特化係数の意味から設定)。(2) EMは局所解に落ちる——初期値を変えて複数回推定するのが定石。(3) k-meansなどのハードクラスタリングとの違い(所属確率の有無)を理解して使い分ける。

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

この研究をさらに発展させるための3つの方向性を示します。「今回わかったこと(X)」から「次に検証すべき仮説(Y)」を立て、「具体的に何をするか(Z)」まで考えてみましょう。

① データ・時間的拡張:第2期総合戦略の検証
結果 X
原論文のデータは2016年以前が中心で、地方創生の取り組みが本格化する前の構造を捉えたもの(原論文自身が5節で指摘)。
新仮説 Y
2020年国勢調査以降のデータで変化数を再構築すれば、第1期・第2期総合戦略の介入後にネットワーク構造(特に「稼ぐ力」の中心性)が変化したかを検証できる。
課題 Z
(1)e-Stat から2015年・2020年の市町村値を取得して変化数を作る。(2)本ページのスクリプトの glasso・媒介中心性部分を変化数に適用する。(3)原論文の図表4(b) の順位と比較し、変わった変数・変わらない変数を考察する。
② 手法の発展:無向ネットワークから因果の向きへ
結果 X
GGM のエッジは条件付き依存を示すが因果の向きは示さない。「稼ぐ力→他の指標」という解釈は探索的な仮説にとどまる。
新仮説 Y
因果探索(LiNGAM・PCアルゴリズム)やベイジアンネットワーク、複数時点データがあればパネル分析や時系列因果(Granger因果)で、エッジに向きをつけられる可能性がある。
課題 Z
(1)同じ変数集合に LiNGAM(Python: lingam パッケージ)を適用し、glasso のエッジと向きつきエッジを比較する。(2)非正規性・非巡回性などの仮定が市町村データで妥当かを検討する。(3)結論がどの仮定に依存しているかを整理する。
③ 政策提言・実践への応用:連携相手のマッチング
結果 X
分析3は「同程度の経済規模・似た産業の強みをもつ、地理的に離れた市町村」のクラスタ(24個)を提示した。
新仮説 Y
同一クラスタ内の市町村ペアは、既存の連携中核都市圏よりも施策の移転可能性(政策の「輸入」のしやすさ)が高いのではないか。
課題 Z
(1)自分の住む市町村がどんな産業に特化しているか RESAS で調べる。(2)似た特化パターンの遠隔地の市町村を探し、実際の成功施策を比較する。(3)「地理的に近い連携」と「産業構造が近い連携」の長所短所を1枚にまとめる。

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

学んだだけでは身につきません。実際に手を動かすのが最強の学習方法です。本ページのスクリプトをベースに、以下のチャレンジに挑戦してみてください。難易度別に5つ用意しました。

★☆☆☆☆ 入門
CH1. スクリプトをそのまま実行して図1〜図4を再現する
付属の Python スクリプトを実行し、このページと同じ図を出力してみてください。
ポイント: どの図が「原論文の報告値の可視化」で、どの図が「現行データでの手法デモ」かをコメントから読み分ける。
★★☆☆☆ 初級
CH2. λ を手で動かしてネットワークの疎密を体感する
GraphicalLasso(alpha=...) の λ を 0.01・0.05・0.1・0.3 に固定して図3を描き直してください。
ポイント: λ が大きいほどエッジが減り「骨格」だけが残る。どの λ でも残るエッジ=頑健な関係。AIC 最小の λ と見比べる。
★★★☆☆ 中級
CH3. 変数を追加・除外してネットワークがどう変わるか調べる
SSDSE-A-2025 の別の変数(医師数・小売店数・第1次産業就業者数など)を加えて再実行してください。
ポイント: 偏相関ネットワークは「どの変数を条件にするか」で変わる。既存のエッジが消えたら、新変数が「見かけの相関」の正体だった可能性がある。
★★★★☆ 上級
CH4. AIC と BIC でモデル選択を比較する
スクリプトの AIC を BIC(ペナルティ 2k → k·log n)に替えて λ を選び直し、エッジ数と媒介中心性の順位を比較してください。
ポイント: n が大きいと BIC はより疎なネットワークを選ぶ。結論(上位変数)が基準の選び方に頑健かどうかが大事。
★★★★★ 発展
CH5. オリジナルの「指標ネットワーク」を作る
あなた自身の問い(例:「健康・医療の指標はどうつながっているか」「教育指標の要はどれか」)を立て、SSDSE から変数を選んで GGM+媒介中心性で分析してください。
ポイント: 前処理(人口あたり・符号反転)→ λ の客観的選択 → 中心性 → 解釈、という本論文の型をなぞる。問い・データ・手法・結論を1ページにまとめる。
💡 ヒント: 詰まったら本サイトの他の論文(同じデータ・関連手法を使っている)のスクリプトをコピーして組み合わせるのが効率的です。手法ガイド・用語集も参考に。

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

本論文で学んだ手法(グラフィカルモデル・中心性・潜在クラス分析)は、研究の世界だけでなく、行政・企業・NPO の現場でも様々に活用されています。具体的なシーンを紹介します。

🏛️
行政のEBPM・KPI設計
自治体のKPIは互いに影響しあうため、単独の指標だけを追うと副作用を見落とします。本論文のように指標間ネットワークを推定し「要」の指標に資源を集中させる発想は、EBPM(証拠に基づく政策立案)の実践そのものです。
💰
金融:システミックリスクの把握
金融機関どうしの資産・取引の連関をネットワークとして推定し、「どの銀行が破綻するとネットワーク全体に波及するか」を中心性で評価します。グラフィカルモデルと媒介中心性はリスク管理の標準ツールです。
🏥
医療・心理学:症状ネットワーク
うつ・不安などの症状間の偏相関ネットワーク(ネットワーク精神病理学)では、glasso がデファクトスタンダードです。中心性の高い症状を治療の標的にするという発想は本論文の「稼ぐ力」特定と同型です。
🏢
マーケティング:顧客セグメンテーション
潜在クラス分析は購買パターン・アンケート回答から「見えない顧客タイプ」を推定する定番手法です。所属確率つき(ソフト)なので「複数タイプに足をかける顧客」も表現でき、施策の出し分けに直結します。
🧬
生命科学:遺伝子ネットワーク
数千の遺伝子発現データから制御ネットワークを推定する場面では、変数が標本より多い(p≫n)ためスパース推定が必須です。glasso はこの分野で生まれ育った手法でもあります。
🎓
学術研究(隣接分野)
経済学・社会学・疫学の探索的研究で、仮説を立てる前段の「変数の見取り図」としてグラフィカルモデルが使われます。審査会コメントの言う「データマイニング的方法論の政策科学への適用」は今や広い潮流です。

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

この論文を読んで初心者が抱きやすい疑問に、教育的観点から答えます。

Q1. この分析、自分でもできますか?
手法デモの部分(図2〜図4)はできます。SSDSE は無料で公開されており、Python の pandasscikit-learn(GraphicalLasso)・networkx で本ページのスクリプトがそのまま動きます。原論文の完全再現には、e-Stat からの2010年・2015年の市町村値の取得と、RESAS の特化係数・売上金額の取得(利用登録が必要)が追加で必要です。
Q2. 「相関ネットワーク」と何が違うのですか?
相関ネットワークは相関係数がしきい値を超えた組すべてにエッジを張るため、「第三の変数経由の見かけの相関」も線になります。GGM(偏相関ネットワーク)は他のすべての変数を考慮したうえで残る直接の関係だけを描くので、はるかに疎で解釈しやすいネットワークになります。さらに glasso で弱い関係を0に刈り込みます。
Q3. 結論は本当に「因果関係」を示していますか?
いいえ。GGM のエッジは無向で、条件付き依存(どちらが原因かは不明)を示すだけです。「稼ぐ力の変数に介入すれば他の指標が改善する」は本論文から導かれる探索的な仮説であり、審査会コメントも「仮説実証型論文とは異なる」「得られた結論も探索的」と明確に位置づけています。因果の向きを言うには因果探索や介入データが必要です。
Q4. データの最新版を使うとどうなりますか?
原論文自身が5節で「最新の国勢調査などの結果を用いることで分析をアップデートできる」と述べています。使用データは2016年以前が中心=地方創生の介入が本格化する前の構造なので、2020年国勢調査以降のデータで再推定して構造変化を見ること自体が新しい研究になります。
Q5. もっと深く学ぶには何を読めばいいですか?
グラフィカルモデルとスパース推定なら、原論文も引用する Friedman, Hastie & Tibshirani (2008) "Sparse inverse covariance estimation with the graphical lasso"(Biostatistics)が原典です。日本語ではスパース推定・グラフィカルモデリングの入門書、潜在クラス分析は Linzer & Lewis (2011) の poLCA 論文(Journal of Statistical Software)が実践的です。本サイトの他の論文も読み比べてみてください。

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

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

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

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

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