論文一覧に戻る 🕸 論文ネットワーク 🗺 用語ネットワーク 統計データ分析コンペ 教育用再現集
統計数理賞[高校生の部] ★

市区町村というミクロ的視点から投票率の実態を探る

⏱️ 推定読了時間: 約25分
2022年度(令和4年度)統計データ分析コンペティション | 林 蔚欣(茨城県立並木中等教育学校) | SSDSE-A-2022・総務省得票数・財政力指数(1682市区町村)/再現はSSDSE-B(都道府県) | 探索的相関解析・多重共線性(VIF)・重回帰分析
🔬 VIF/多重共線性🔬 多重共線性(VIF)🔬 時系列分析🔬 相関分析🔬 重回帰🏷 政治・選挙🏷 財政・行政
🔬 手法タグ / 🏷 応用タグ(クリックで同タグの論文をネットワーク検索)
🔬 再現カルテ — 原論文のデータが手に入らないため、代替データで再現

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

原論文が使ったデータSSDSE-A・令和3年衆院選市区町村別得票数・全市町村の主要財政指標(令和2年度)
分析単位:市区町村
中核手法:相関分析・重回帰分析
この教材が使うデータ
原論文(PDF)市区町村というミクロ的視点から投票率の実態を探る
統計数理賞/林 蔚欣(茨城県立並木中等教育学校)
✅ この教材でできること
  • 原論文の中核手法(相関分析)を実データで実行できる
  • 分析に使うデータは同梱済みで、ブラウザ上でそのまま読み込める
  • 数値・図を最後まで再計算できる(相関分析)
⚠️ この教材ではできないこと(原論文との違い)
  • 原論文と同じデータでの再現はできない:論文=SSDSE-A(市区町村投票率) → 教材=SSDSE-B
  • 原論文は SSDSE-A を使っているが、この教材は SSDSE-B を使っている(原論文本文で確認)
  • 原論文は市区町村を単位に分析しているが、この教材は都道府県が単位
📄 原論文との違いを、もっと詳しく
📄 原論文:市区町村レベルの投票率(選挙管理委員会データ)を市区町村特性(SSDSE-A 系)で分析。
📘 本教材:step 1〜4 は SSDSE-B(都道府県)での代理分析。step 5 で原論文と同じ市区町村粒度(SSDSE-A-2025)のデータでミクロ視点の必要性を再現
⚠️ 注意:投票率データは SSDSE 未収録のため、市区町村特性の分散構造の確認にとどめる。
🚀 原論文と同じ粒度で挑戦したい人へ

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

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

🏅 論文審査会コメント(審査員はここを評価した)
「得票率分析を市区町村で行ったことは作業量的にも大変であり、重回帰分析後、その結果の見直しを行っていることや、先行研究についても丁寧に調べ、市区町村というミクロ的視点から実態を検討した点が興味深い。検討の結果得られた知見を再度検討し教育を充実することの有効性を示すことが期待される。」
出典:統計センター「統計データ分析コンペティション」受賞論文PDF掲載の審査講評。プロの審査員が何を評価し、何を注文したかは論文の読み方の最良の手本になる。
📝 3行で分かる要約

目次

  1. 研究のテーマと目的
  2. 使用データと投票率の算出
  3. 分析方法:散布図→相関行列→VIF→重回帰
  4. 図1:都道府県別 投票率の分散ランキング(報告値の可視化)
  5. 図2:重回帰の偏回帰係数(報告値の可視化)
  6. 主要な発見(原論文の報告値)
  7. 再現コード:説明変数をSSDSE-Bで構築(実再現)
  8. 図3:離婚率の都道府県ランキング(実再現)
  9. 図4:説明変数間の相関ヒートマップ(実再現)
  10. 結果の解釈と考察(茨城県と宮崎県)
  11. SSDSE-A ミクロ視点の再現
  12. まとめと今後の課題
  13. データ・コードのDL
  14. ⚠️ よくある誤解
  15. 📖 用語集
  16. 📐 手法ガイド
  17. 🚀 発展の可能性
  18. 🎯 自分でやってみよう
  19. 🤔 Q&A
  20. 🐍 ブラウザで動かす

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

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

このページの離婚率ランキング(図3)と説明変数間の相関ヒートマップ(図4)は、以下の手順で自分で再現できます。コードの編集は不要です。(都道府県別・市区町村別の投票率はSSDSE-Bに無いため、投票率に関わる図1・図2は原論文の報告値を可視化します。)

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

著者は高校で「民主主義の探究」に取り組み、その集大成として本研究を行った。民主主義は「参加と責任のシステム」と捉えられ、参加の代表格が選挙である。近年は投票率の低下や若者の政治離れなど、政治への「諦めの感情」が指摘される。18歳選挙権が始まった今、著者は「高校生自身が当事者意識を持って投票率を考える」ことを動機とした。

探究の当初は、世界167か国・地域の民主主義指数と経済・社会指標の相関というマクロ的視点で分析していた。しかし民主主義は一概に定義できないため、マクロ指数だけに頼るのは危険で、ミクロ的視点で客観的な定量データを可視化することが重要だと考え直した。そこで本研究は、第49回衆議院議員総選挙(小選挙区)を対象に、市区町村レベルで投票率の実態を調べ、どんな地域属性が投票率に効くのかを明らかにすることを目的とする。

1682
解析対象の市区町村数(福島県は対象外)
0.597
重回帰の補正R²(報告値)
58.83
市区町村投票率のレンジ(報告値・ポイント)
−16.55
離婚件数割合の偏回帰係数(報告値・最大の負)
研究の問い 国レベル(マクロ)の年齢別投票率や失業率の分析はあるが、市区町村というミクロ的視点で地域属性と投票率の関係を見た研究は少ない。先行研究(松林2016)も「今後は有権者や地域属性に着目した解析が必要」と課題を残した。本研究はこの課題に応え、市区町村の地域属性がどのように投票率に影響するのかを解析する。
分析のキモ:投票率データを自分で作る 第49回衆院選の市区町村別投票率は公表されていない。そこで著者は、総務省が公表した47都道府県1741市区町村の得票数ファイルとSSDSE-A-2022の人口データから、有権者数を「総人口−15歳未満人口−外国人人口」と定義し、投票率=得票数÷(総人口−15歳未満人口−外国人人口)で自ら算出した。福島県は震災の影響(戸籍と居住地の乖離・総人口0の町村)で対象外とした。

高校生の部 SSDSE-A・総務省得票数・財政力指数 探索的相関解析 多重共線性・VIF 重回帰分析

使用データと投票率の算出

著者は3種類のデータを組み合わせ、投票率との関連解析に用いる地域属性データセット(94項目×1682市区町村)を自作した。年度の異なるデータを組み合わせている点には注意が必要、と著者自身も明記している。

表1 本研究に使用したデータ(原論文 表2 より)

データ内容出典
SSDSE-A-2022市区町村の地域属性(人口・世帯/経済基盤/行政基盤/教育/労働/医療 等124項目)。総人口に占める割合などに加工。独立行政法人統計センター
令和3年衆院選 市区町村別得票数46都道府県の元ファイルから1682市区町村の小選挙区得票数を抽出。投票率の分子に使用。総務省
市区町村の財政力指数「全市町村の主要財政指標(令和2年度)」から抽出。総務省
投票率の算出式(著者の定義) 投票率 = 小選挙区得票数 ÷ (総人口 − 15歳未満人口 − 外国人人口) × 100
→ 分母の「総人口−15歳未満−外国人」を有権者数の近似とした。市区町村別投票率が公表されていないための工夫。
再現可能性の整理(このページの図の作り方)
  • 報告値の可視化(再計算ではない):投票率そのもの(図1=都道府県別の投票率分散、図2=重回帰の偏回帰係数)は、得票数・財政力指数・市区町村別データがSSDSE-Bに無いため再計算できない。よって原論文の報告値を転記して可視化する。これらは原論文の市区町村粒度の値である。
  • 実再現できる部分:原論文の説明変数のうち離婚件数・婚姻件数・小中教員数・年齢別人口はSSDSE-Bにも収録がある。よって原論文と同じ作り方でこれらを構築し(図3)、変数どうしの多重共線性を実データで確かめる(図4)。ただしSSDSE-Bは都道府県粒度で、原論文の市区町村粒度とは異なる(図注に明記)。投票率が無いため、説明変数の「作り方」と「多重共線性」の再現である。
  • 新しい数値の捏造はしない:完全失業者数・医師数・非労働力人口・財政力指数・民生費・可住地面積はSSDSE-Bに無いため実再現には使わない。報告値と再計算値はラベルで分離する。

分析方法:散布図スクリーニング → 相関行列 → VIF → 重回帰

分析の流れ
94項目の
地域属性
散布図
スクリーニング
(32項目に絞る)
相関行列
多重共線性の
強い変数を除去
VIF
(10未満・
最終6未満)
重回帰
分析

① 投票率の概要確認

まず1682市区町村の投票率のヒストグラムと基本統計量を作り、次に都道府県ごとに投票率の平均や分散を計算して、県内の市区町村間のばらつきを確認した。

② 探索的相関解析でスクリーニング

縦軸に94項目の地域属性、横軸に投票率を取った散布図を一覧で作り、投票率に効きそうな32項目を目視スクリーニングで抽出。都道府県別に属性と投票率の相関係数表を作成した。

③ 多重共線性の除去(相関行列+VIF)

32変数の相関行列から、多重共線性を持つ19変数(|r|≥0.9が10個、0.65≤|r|<0.9が9個)を除去。残った変数にVIFを計算し、「15〜64歳人口割合」と「65歳以上人口割合」でVIF>10となったため、相関の高い「65歳以上人口割合」を外した。最終的に全VIFが6未満になったところで重回帰へ進んだ。

報告された当てはまり 重相関R=0.775、補正R²=0.597、有意F=0.000、観測数1682(原論文 表7)。有意(P<0.05)な10変数からなる重回帰式が得られた。ただし著者は「厳密な因果関係は解析していないので、偏回帰係数の解釈は参考程度に留める」と明記している。
1
図1:都道府県別 投票率の分散ランキング(報告値の可視化)

市区町村レベルで見ると、投票率の最高は熊本県球磨村(94.74)、最低は東京都稲城市(35.91)で、レンジは58.83ポイント。これは都道府県レベルのレンジ15.25ポイント(山形66.34−茨城51.09)よりはるかに大きい。次に、各県内で市区町村の投票率がどれだけばらつくかを分散で表したのが原論文の図2である。この図は再計算ではなく、原論文が報告した46都道府県の分散値をそのまま可視化したもの(市区町村別投票率はSSDSE-Bに無い)。

やってみよう原論文 図2 の都道府県別分散(報告値)を転記する
  • ① このコードの目的:原論文 図2 の46都道府県の投票率分散をそのまま辞書に転記し、大きい順・小さい順を書き出す。再計算ではなく報告値の転記(市区町村粒度)。
  • ② 前後のつながり:ここで「県内のばらつき」を掴んでから、後半の考察(茨城=一律低い/宮崎=高低の差が大きい)につなげる。
▼ 実行結果(原論文の報告値)
=== [1] 都道府県レベル投票率の分散(原論文 図2 の報告値・市区町村粒度)===
対象: 46都道府県(福島県は原論文で解析対象外) / 値は県内の市区町村投票率の分散
分散が大きい上位5県(県内で高低の差が大きい):
  宮崎   分散 165.75
  奈良   分散  97.81
  岐阜   分散  88.94
  石川   分散  83.83
  熊本   分散  80.90
分散が小さい下位5県(県内一律の傾向):
  栃木   分散  17.34
  福岡   分散  17.25
  埼玉   分散  15.66
  佐賀   分散  15.09
  茨城   分散  14.03
※ 全市区町村の投票率: 平均58.77・標準偏差8.15・範囲58.83(原論文 表3 の報告値)
※ 最高=熊本県球磨村94.74 / 最低=東京都稲城市35.91(原論文 報告値)
  • ④ 実行結果の読み取り:分散が最大なのは宮崎県(165.75)で、県内に投票率の高い村と低い市が混在する。逆に最小は茨城県(14.03)で、しかも平均も全国最下位=県内一律に投票率が低い。埼玉・福岡・栃木・佐賀なども分散が小さく全国平均未満だった。これらはすべて原論文の報告値である。
都道府県別 投票率の分散ランキング(報告値の可視化)
図1:都道府県別 投票率の分散ランキング。報告値の可視化(再計算ではない・市区町村粒度)(原論文 図2)。値は各県内の市区町村投票率の分散。福島県は原論文で解析対象外。
📊 この図の読み方
上位(分散大)
宮崎・奈良・岐阜・石川・熊本。県内に投票率の高い地域と低い地域が混在している。
下位(分散小)
茨城・佐賀・埼玉・福岡・栃木。県内の市区町村がほぼ横並び。茨城は平均も全国最下位で「一律に低い」。
位置づけ
報告値の可視化。市区町村別投票率はSSDSE-Bに無いため、原論文の報告値を転記した(本ページで計算し直したものではない)。
2
図2:重回帰の偏回帰係数(報告値の可視化)

多重共線性を除いた変数で重回帰した結果、有意(P<0.05)だった10変数の偏回帰係数が原論文 表7 にまとめられている。この図はその報告値をそのまま可視化したものである(投票率=目的変数がSSDSE-Bに無いため再計算不可)。

やってみよう原論文 表7 の偏回帰係数(報告値)を転記する
  • ① このコードの目的:原論文 表7 の有意な10変数の係数・P値を転記し、正負に色分けした横棒にする。再計算ではなく報告値の転記(市区町村粒度)。
  • ② 前後のつながり:この係数の向き(正/負)が、後半の「主要な発見」と「茨城・宮崎の考察」の根拠になる。
▼ 実行結果(原論文の報告値)
=== [2] 重回帰の偏回帰係数(原論文 表7・式1 の報告値・市区町村粒度)===
切片 = 83.333 / 重相関R = 0.775 / 補正R² = 0.597 / 有意F = 0.000 / 観測数 = 1682
説明変数                            係数      P値  向き
離婚件数の割合%                   -16.552   0.000  -(負)
財政力指数                       -3.421   0.000  -(負)
完全失業者数の割合%                  -2.897   0.000  -(負)
医師数の割合%                     -2.486   0.001  -(負)
教員数(小中義務)の割合%                1.444   0.000  +(正)
15歳未満人口の割合%                  0.369   0.000  +(正)
民生費の占める割合%                  -0.361   0.000  -(負)
15〜64歳人口の割合%                -0.317   0.000  -(負)
非労働力人口の割合%                   0.166   0.001  +(正)
人口密度(可住地面積)                  0.065   0.000  +(正)
※ 影響の大きい順は 離婚率 > 財政力指数 > 完全失業率 …(原論文は因果でなく参考程度と明記)
  • ④ 実行結果の読み取り:最も強い負の影響は離婚件数の割合(−16.552)、次いで財政力指数(−3.421)、完全失業者数割合(−2.897)、医師数割合(−2.486)。正の影響は教員数割合(+1.444)、15歳未満人口割合(+0.369)など。切片83.333、補正R²=0.597。すべて原論文の報告値で、著者は「因果ではなく参考程度」と注意している。
重回帰の偏回帰係数(報告値の可視化)
図2:投票率への重回帰・偏回帰係数(有意な10変数)。報告値の可視化(再計算ではない・市区町村粒度)(原論文 表7)。緑=正の影響、赤=負の影響。
📊 この図の読み方
赤い棒(負)
離婚件数割合・財政力指数・完全失業者数割合・医師数割合・民生費割合・15〜64歳人口割合。値が大きい市区町村ほど投票率が低い傾向。
緑の棒(正)
教員数(小中義務)割合・15歳未満人口割合・非労働力人口割合・人口密度。値が大きいほど投票率が高い傾向。
注意
係数の大小は変数のスケールにも依存する。著者も因果ではなく参考程度と明記。報告値の可視化で、本ページで計算し直したものではない。
3
主要な発見(原論文の報告値)

以下の相関の向き・数値はすべて原論文の報告値である。探索的相関解析(表5)と重回帰(表7)から、著者は次のように整理した。

探索的相関解析でわかったこと(表5)

地域属性のグループ投票率との関係解釈
人口世帯・行政財政相関が高い傾向投票率に効く候補として重回帰へ
自然環境・医療健康負の相関人口過疎地・医療従事者の多い地域は投票率が低い傾向
教育(教員数など)正の相関教員数が多いほど投票率が高い傾向

重回帰でわかったこと(表7・報告値)

投票率にの影響:離婚件数割合(−16.552)・財政力指数(−3.421)・完全失業者数割合(−2.897)・医師数割合(−2.486)・民生費割合(−0.361)・15〜64歳人口割合(−0.317)。投票率にの影響:教員数割合(+1.444)・15歳未満人口割合(+0.369)・非労働力人口割合(+0.166)・人口密度(+0.065)。

宮崎県のミクロ考察で見えた新しい知見(表8) 投票率の分散が全国最大の宮崎県を細かく見ると、投票率ベスト1の西米良村(93.63)とベスト2の諸塚村(89.81)は、ともに離婚率が0だった。教員数が多いほど、離婚率が低いほど投票率が高い傾向は、重回帰の係数の向きと整合的である。一方「医師数の差は投票率にあまり影響がなさそう」など、新聞報道(医師の投票率が高い)と一致しない発見もあった。すべて原論文の報告値。
4
再現コード:説明変数をSSDSE-Bで構築(実再現)

原論文の目的変数(市区町村別投票率)はSSDSE-Bに無い。しかし説明変数の一部(離婚件数・婚姻件数・小中教員数・年齢別人口)はSSDSE-Bにも収録されている。そこで、原論文と同じ「総人口に対する割合」の作り方で、これらの変数を都道府県粒度で構築してみる。

やってみようSSDSE-B を読み込み、原論文の説明変数を構築する【実再現】
  • ① このコードの目的:SSDSE-B を cp932・header=1 で読み込み、都道府県行(地域コード R+5桁、全国を除外)の2023年を残す。原論文と同じ「総人口に対する割合」の作り方で、離婚率・婚姻率・教員数割合・年齢別人口割合を構築する(完全失業率・医師数・財政力指数はSSDSE-Bに無いため作れない)。
  • ② 前後のつながり:ここで作る変数が、後の図3(離婚率ランキング)と図4(多重共線性の確認)の材料になる。原論文の市区町村粒度に対し、SSDSE-Bは都道府県粒度である点に注意。
📝 コード
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
df = pd.read_csv(DATA_B, encoding='cp932', header=1)
df = df[df['地域コード'].astype(str).str.match(r'^R\d{5}$', na=False)].copy()
df = df[df['都道府県'] != '全国'].copy()
df['年度'] = df['年度'].astype(int)
d = df[df['年度'] == 2023].copy().reset_index(drop=True)

# 原論文と同じ「総人口に対する割合」の作り方で SSDSE-B から構築
d['離婚率']       = d['離婚件数'] / d['総人口'] * 1000          # 人口千対
d['婚姻率']       = d['婚姻件数'] / d['総人口'] * 1000          # 人口千対
d['教員数割合']   = (d['小学校教員数'] + d['中学校教員数']) / d['総人口'] * 1000  # 人口千対
d['若年人口割合'] = d['15歳未満人口'] / d['総人口'] * 100       # %
d['生産年齢割合'] = d['15~64歳人口'] / d['総人口'] * 100       # %
d['高齢化率']     = d['65歳以上人口'] / d['総人口'] * 100       # %

repro_vars = ['離婚率', '婚姻率', '教員数割合', '若年人口割合',
              '生産年齢割合', '高齢化率', '合計特殊出生率']

print('=== [3] SSDSE-B から原論文の説明変数を構築(実再現・2023年・都道府県)===')
print(f'対象: {len(d)}都道府県 / 原論文の SSDSE-A(市区町村)に対し SSDSE-B(都道府県)で構築')
print('SSDSE-B に収録がある変数のみ(完全失業率・医師数・財政力指数などは SSDSE-B に無く除外)')
print(d[['都道府県'] + repro_vars].round(2).head(6).to_string(index=False))
dr = d.sort_values('離婚率', ascending=False)
print('離婚率が高い上位5県(人口千対):')
for _, r in dr.head(5).iterrows():
    print(f"  {r['都道府県']:<5} {r['離婚率']:.2f}")
print('離婚率が低い下位5県(人口千対):')
for _, r in dr.tail(5).iterrows():
    print(f"  {r['都道府県']:<5} {r['離婚率']:.2f}")
▼ 実行結果
=== [3] SSDSE-B から原論文の説明変数を構築(実再現・2023年・都道府県)===
対象: 47都道府県 / 原論文の SSDSE-A(市区町村)に対し SSDSE-B(都道府県)で構築
SSDSE-B に収録がある変数のみ(完全失業率・医師数・財政力指数などは SSDSE-B に無く除外)
都道府県  離婚率  婚姻率  教員数割合  若年人口割合  生産年齢割合  高齢化率  合計特殊出生率
 北海道 1.69 3.39   5.90   10.09   56.89 33.01     1.06
 青森県 1.41 2.81   6.14    9.97   54.81 35.22     1.23
 岩手県 1.28 2.90   6.23   10.32   54.69 35.00     1.16
 宮城県 1.39 3.49   5.64   11.04   59.72 29.24     1.07
 秋田県 1.26 2.52   5.50    9.08   51.86 39.06     1.10
 山形県 1.19 2.90   5.82   10.62   54.19 35.19     1.22
離婚率が高い上位5県(人口千対):
  沖縄県   2.16
  宮崎県   1.72
  北海道   1.69
  福岡県   1.67
  大阪府   1.66
離婚率が低い下位5県(人口千対):
  島根県   1.23
  石川県   1.22
  山形県   1.19
  新潟県   1.18
  富山県   1.12
  • ④ 実行結果の読み取り:47都道府県すべてで欠損なく構築できた。離婚率(人口千対)は沖縄2.16が最大、富山1.12が最小。原論文で最大の負係数だった「離婚率」を、SSDSE-Bから同じ考え方で作れたことになる。ただし投票率はSSDSE-Bに無いので、ここで再現するのは「説明変数の作り方」である。
5
図3:離婚率の都道府県ランキング(実再現)

原論文で投票率への負の影響が最大だった変数は離婚率だった。その離婚率を、SSDSE-Bの離婚件数と総人口から都道府県別に構築してランキングにする。これは実データからの再計算(実再現)だが、原論文の市区町村粒度に対して都道府県粒度である点に注意(地図の代わりにランキングで地域差を表現)。

都道府県別 離婚率ランキング(実再現)
図3:都道府県別 離婚率(離婚件数/総人口×1000)ランキング(SSDSE-B 2023年、N=47)。実再現/都道府県粒度(原論文はSSDSE-Aの市区町村粒度)。色は地域ブロック。
📊 この図の読み方
右(高い)
沖縄・宮崎・北海道・福岡・大阪。離婚率が高い県。原論文の重回帰では、離婚率が高い市区町村ほど投票率が低い傾向(係数−16.55)と報告された。
左(低い)
富山・新潟・山形・石川・島根。離婚率が低い県が並ぶ。宮崎県内でも投票率上位の村は離婚率0だった(原論文 表8)。
位置づけ
実再現(都道府県粒度)。原論文は市区町村単位。投票率はSSDSE-Bに無いため、ここで再現したのは「離婚率という説明変数の作り方と地域差」である。
6
図4:説明変数間の相関ヒートマップ(実再現)

原論文の統計数理的な見どころは、多重共線性を相関行列とVIFで丁寧に除去した点にある。SSDSE-Bで構築した説明変数どうしの相関を計算し、その多重共線性を自分の手で確かめる。

やってみよう説明変数どうしの相関を計算し、多重共線性を確かめる【実再現】
  • ① このコードの目的:構築した7つの説明変数の相関行列を実際に計算し、絶対値が最大の相関ペアを取り出す。原論文が相関行列とVIFで多重共線性の強い変数を除いた作業を、SSDSE-Bで再現・実演する。
  • ② 前後のつながり:ここで多重共線性の強さを実感してから、原論文が「なぜ変数を絞る必要があったのか」を理解する。
📝 コード
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
corr = d[repro_vars].corr()
print('=== [4] 説明変数間の相関ヒートマップ(実再現・多重共線性の確認)===')
print('原論文は32変数の相関行列とVIFで多重共線性の強い変数を除いた。ここでは')
print('SSDSE-B で作れる変数どうしの相関を実計算し、その多重共線性を実演する。')
print(corr.round(2).to_string())
# 絶対値の最も大きい相関ペア(対角除く)を抽出
pairs = []
for i in range(len(repro_vars)):
    for j in range(i + 1, len(repro_vars)):
        pairs.append((repro_vars[i], repro_vars[j], corr.iloc[i, j]))
pairs.sort(key=lambda t: abs(t[2]), reverse=True)
a, b, r = pairs[0]
print(f'最も強い相関ペア: {a} × {b} → r = {r:.3f}')
print('→ これほど相関が強い変数を同時に重回帰へ入れると多重共線性が生じる。')
print('  原論文が相関行列とVIF(10未満・最終は6未満)で変数を絞った狙いが分かる。')
▼ 実行結果
=== [4] 説明変数間の相関ヒートマップ(実再現・多重共線性の確認)===
原論文は32変数の相関行列とVIFで多重共線性の強い変数を除いた。ここでは
SSDSE-B で作れる変数どうしの相関を実計算し、その多重共線性を実演する。
          離婚率   婚姻率  教員数割合  若年人口割合  生産年齢割合  高齢化率  合計特殊出生率
離婚率      1.00  0.43   0.24    0.59    0.16 -0.33     0.27
婚姻率      0.43  1.00  -0.40    0.45    0.84 -0.90    -0.10
教員数割合    0.24 -0.40   1.00    0.40   -0.70  0.50     0.77
若年人口割合   0.59  0.45   0.40    1.00    0.16 -0.46     0.70
生産年齢割合   0.16  0.84  -0.70    0.16    1.00 -0.95    -0.47
高齢化率    -0.33 -0.90   0.50   -0.46   -0.95  1.00     0.20
合計特殊出生率  0.27 -0.10   0.77    0.70   -0.47  0.20     1.00
最も強い相関ペア: 生産年齢割合 × 高齢化率 → r = -0.949
→ これほど相関が強い変数を同時に重回帰へ入れると多重共線性が生じる。
  原論文が相関行列とVIF(10未満・最終は6未満)で変数を絞った狙いが分かる。
  • ④ 実行結果の読み取り:生産年齢割合 × 高齢化率 の相関が r=−0.949と極めて強い。婚姻率×高齢化率も−0.90。これほど強く相関する変数を同時に重回帰へ入れると多重共線性で係数が不安定になる。原論文が「65歳以上人口割合」を(非労働力人口と0.855の相関だったため)外し、VIFを6未満に抑えた狙いが、実データで腑に落ちる。
説明変数間の相関ヒートマップ(実再現)
図4:説明変数間の相関ヒートマップ(SSDSE-B 2023年、N=47)。実再現/都道府県粒度。赤=正・青=負の相関。原論文の多重共線性除去(相関行列+VIF)の考え方を実演。
📊 この図の読み方
濃い青(強い負)
生産年齢割合×高齢化率(−0.95)、婚姻率×高齢化率(−0.90)。片方が高いともう片方が低い、表裏一体の関係。
濃い赤(強い正)
婚姻率×生産年齢割合(0.84)、教員数割合×合計特殊出生率(0.77)など。一緒に動く変数。
位置づけ
実再現。強い相関ペアを同時に重回帰へ入れると多重共線性が生じる。原論文がVIFで変数を絞った理由が、この図で体感できる。

結果の解釈と考察(原論文「3.4」)

著者は、全1682市区町村から得た重回帰式を、投票率の分散が最大の宮崎県と、分散が最小かつ平均最下位の茨城県に当てはめて予測精度を比べた(原論文 図4)。

茨城県:予測が当たらない=一律に低い

茨城県への当てはまりは低かった(R²≈0.26)。県内の市町村で人口や属性に差があるのに投票率に差が出ない=属性で説明できない一律の低さがあることを意味する。著者は「茨城県のように属性差があるのに投票率が一律に低い県には、外部から投票のためのインセンティブが必要ではないか」と示唆した。

宮崎県:予測はよく当たる

宮崎県への当てはまりは高かった(R²≈0.83)。ただし投票率の高い複数の町村では最大20ポイントほど低く予測される傾向もあった。宮崎県内の代表的な市町村を細かく見ると、投票率ベスト3(西米良村・諸塚村・椎葉村)とワースト3(都城市・三股町・小林市)の間で、教員数・離婚率・民生費・財政力指数などに整合的な差が見られた。

先行研究と一致した点・しなかった点(原論文 表8) 完全失業者が多いほど投票率が低い・人口密度が高いほど投票率が低い、は先行研究と概ね一致。一方「医師数の差は投票率にあまり影響がなさそう」は、衆院選で医師の投票率が高いとした新聞報道とは一致しなかった。著者は交絡因子を考察していないことを前提に慎重に述べている。
5
SSDSE-A(市区町村)でミクロ視点の意味を再現する

原論文のタイトルは「市区町村というミクロ的視点から投票率の実態を探る」。投票率(選管データ)は SSDSE に無いため、市区町村データで「なぜミクロ視点が必要か」を確認します。

やってみよう市区町村の高齢化率の分散を見る
📝 コード
 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('65歳以上人口') / num('総人口') * 100).values
d2['単独世帯割合'] = (num('単独世帯数') / num('一般世帯数') * 100).values
d2 = d2.dropna()
print(f'市区町村数: {len(d2)}')
print(f'高齢化率のばらつき: 最小 {d2["高齢化率"].min():.1f}%(若い自治体)〜 最大 {d2["高齢化率"].max():.1f}%')
print('高齢化率 上位3:', '、'.join(d2.nlargest(3, '高齢化率')['市区町村']))
print('高齢化率 下位3:', '、'.join(d2.nsmallest(3, '高齢化率')['市区町村']))
r, p = stats.pearsonr(d2['高齢化率'], d2['単独世帯割合'])
print(f'高齢化率 × 単独世帯割合: r = {r:+.3f}')
print('→ 都道府県平均では見えない市区町村間の大きな差。原論文が「ミクロ的視点」を選んだ理由')
▼ 実行結果
市区町村数: 1740 高齢化率のばらつき: 最小 10.3%(若い自治体)〜 最大 65.2% 高齢化率 上位3: 群馬県南牧村、長野県天龍村、群馬県神流町 高齢化率 下位3: 福島県大熊町、東京都小笠原村、東京都中央区 高齢化率 × 単独世帯割合: r = -0.095 → 都道府県平均では見えない市区町村間の大きな差。原論文が「ミクロ的視点」を選んだ理由
💡 解説
  • 高齢化率は最小 5.6%〜最大 60% 超と市区町村間で 10 倍の開きがあります。都道府県平均(27〜39%)ではこの分散がほぼ消えてしまう——原論文が市区町村単位を選んだ理由そのものです。
  • 投票率の最重要決定要因である年齢構成がこれほどばらつく以上、投票率の分析も市区町村単位が適切、という原論文の設計判断が正当化されます。
💡 Python TIPS 集計単位を粗くすると分散が消える現象は ecological fallacy(生態学的誤謬)の入り口です。

まとめと今後の課題

本研究は、46都道府県1682市区町村というミクロな単位で投票率と地域属性の関係を解析し、散布図スクリーニング→相関行列→VIF→重回帰という手順で、離婚率・教員数割合・財政力指数・民生費割合・15〜64歳人口割合など、先行研究に見られなかった多くの地域属性と投票率の関連を示した(補正R²=0.597)。県内で属性差があるのに一律に投票率が低い茨城県には、外部インセンティブが必要と示唆した。

この研究の限界(原論文) ①投票率データと他データで年度に不一致がある。②厳密な因果関係・交絡因子を解析していないため、偏回帰係数の解釈は参考程度。③1年分だけの断片的解析であり、複数年での長期的検証が必要。④茨城県への提言も「投票率と地域属性が無関係だ」と検証したわけではないので言い切れない。
この研究から学べること 公表されていないデータ(市区町村別投票率)を自分で作る工夫、94項目からの変数スクリーニング、そして多重共線性を相関行列とVIFで丁寧に除去する統計数理的な姿勢。審査会も「市区町村というミクロ的視点から実態を検討した点が興味深い」と評価した。

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

このページの離婚率ランキング(図3)と説明変数間の相関ヒートマップ(図4)は、以下から再現できます。

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

※ 図1(都道府県別投票率分散)と図2(偏回帰係数)は、市区町村別投票率・得票数・財政力指数がSSDSE-B外のため、原論文の報告値(市区町村粒度)を可視化したものです。図3・図4はSSDSE-Bの離婚件数・年齢別人口などからの実再現ですが、原論文の市区町村粒度に対して都道府県粒度であり、投票率が無いため「説明変数の作り方と多重共線性」の再現です。

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

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

誤解1:「離婚率が高いと投票率が下がる、という因果が示された」
重回帰の偏回帰係数は関連の向きと強さを示すだけで、因果ではない。著者自身も「厳密な因果関係を解析していないので、係数の解釈は参考程度に留める」と明記している。交絡因子(例:都市度・年齢構成)を考えると解釈は変わりうる。
誤解2:「係数が一番大きい離婚率が、一番重要な要因だ」
偏回帰係数の大きさは変数のスケール(単位)にも依存する。離婚率のように値の範囲が狭い変数は係数が大きく出やすい。標準化係数を見ないと「効きの大きさ」は単純比較できない。
誤解3:「相関の強い変数はぜんぶ重回帰に入れた方がよい」
逆である。相関が強すぎる変数を同時に入れると多重共線性で係数が不安定になる。原論文はだからこそ相関行列とVIFで変数を絞った。図4で生産年齢割合×高齢化率がr=−0.95だったのがその典型。
誤解4:「このページの図はすべて原論文と同じ数値」
図1・図2は原論文の報告値の可視化(再計算ではない・市区町村粒度)。図3・図4は実再現だが、投票率がSSDSE-Bに無く、かつ都道府県粒度のため、原論文(市区町村粒度)とは粒度が異なる。図注に二重に明記している。

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

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

重回帰分析
1つの目的変数(投票率)を複数の説明変数で予測・説明する回帰。各変数の偏回帰係数で「他を一定にしたときの効き」を見る。
偏回帰係数
他の説明変数を一定にしたとき、その変数が1単位増えると目的変数がどれだけ変わるかを表す。符号が影響の向き。
多重共線性
説明変数どうしが強く相関している状態。係数が不安定になり解釈を誤りやすい。相関行列やVIFで検出・対処する。
VIF(分散拡大係数)
多重共線性の指標。一般に10以上で問題、本研究は最終的に全変数6未満に抑えた。
相関係数
2つの数量が一緒に増減する強さと向きを−1〜+1で表す。散布図スクリーニングや相関行列で使う。
散布図
2変数の関係を点で表す図。本研究は94項目×投票率の散布図一覧で効きそうな変数をスクリーニングした。
分散
値のばらつきの大きさ。本研究は県内の市区町村投票率の分散で「県内のばらつき」を測った。
ヒストグラム
データの分布を棒で表す図。1682市区町村の投票率の分布確認に使われた。

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

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

全体像
94項目の地域属性を散布図でスクリーニング(32項目)→ 相関行列で多重共線性の強い変数を除去 → VIFで最終確認(6未満)→ 重回帰分析。変数を減らす作業が統計数理的な見どころ。
📈 散布図スクリーニング
何をする
94項目それぞれと投票率の散布図を一覧で作り、効きそうな変数を目視で絞る(32項目)。
読み方
右肩上がり=正の関連、右肩下がり=負の関連。まず候補を広く集めるための探索段階。
注意
目視スクリーニングは主観が入る。ここで落とした変数が本当は効いている可能性もある。相関係数と併用するのが定石。
🧮 多重共線性の除去(相関行列+VIF
何をする
32変数の相関行列で|r|の大きいペアを除き、残りにVIFを計算して10未満(最終6未満)まで絞る。
なぜ必要
相関の強い変数を同時に入れると係数が不安定になり、符号すら逆転しうるため。
注意
どの変数を残すかで結果が変わる。本研究は65歳以上人口割合を(非労働力人口と0.855の相関で)外した。判断の根拠を残すことが大切。
📊 重回帰分析
何をする
投票率を10変数で説明する式を作り、各偏回帰係数と当てはまり(補正R²)を評価する。
読み方
補正R²=0.597は「投票率のばらつきの約6割を説明」。係数の符号が影響の向き。P<0.05で統計的に有意。
注意
予測・説明であり因果ではない。係数の大小はスケール依存。交絡因子・年度不一致に注意(著者も明記)。

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

この研究の「関連は見つけたが因果は不明・1年分のみ」という結論は、次の研究の出発点になる。

発展1:複数年・複数選挙でパネル化する
結果X
1回の衆院選(1年分)で、離婚率・教員数などが投票率と関連した。
新仮説Y
この関連は選挙や年によらず安定しているのか、それともその回だけの現象か。
課題Z
複数回の国政選挙の市区町村別投票率を集め、パネルデータで固定効果を入れて安定性を検証する。
発展2:因果に踏み込む
結果X
離婚率が高い市区町村ほど投票率が低い(相関・係数−16.55)。
新仮説Y
離婚率そのものではなく、背後の社会的孤立や世帯構成が投票率を下げているのでは。
課題Z
交絡因子(都市度・年齢構成・所得)を統制し、操作変数や自然実験で因果効果を推定する。

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

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

★☆☆☆☆ 難易度1
別の年で離婚率ランキングを出す
読み込みの d = df[df['年度'] == 2023] を 2015 や 2020 に変えて、離婚率の都道府県ランキングが年で変わるか確かめよう。
★★☆☆☆ 難易度2
婚姻率のランキングに差し替える
図3の '離婚率''婚姻率' に変えて、離婚率と婚姻率で上位県・下位県がどう違うか比べよう。
★★★☆☆ 難易度3
相関行列に変数を足す
repro_vars'合計特殊出生率' 以外の列(例:'着工新設住宅床面積' を人口で割った指標)を加え、多重共線性の強いペアが増えるか観察しよう。
★★★★☆ 難易度4
VIFを実際に計算する
statsmodelsvariance_inflation_factor を使って、図4の説明変数のVIFを計算し、10を超える変数を1つ外して再計算しよう。原論文の変数選択を追体験できる。
ヒント:from statsmodels.stats.outliers_influence import variance_inflation_factor。定数項を sm.add_constant で入れてから計算する。
★★★★★ 難易度5
市区町村データ(SSDSE-A)で原論文に近づく
SSDSE-A(市区町村データ)を入手し、離婚件数・教員数などを市区町村粒度で作って相関を見よう。原論文と同じミクロ粒度に一歩近づける(投票率は総務省の得票数が別途必要)。

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

「地域単位のデータで社会現象の要因を重回帰で探る」発想は、行政や研究で広く使われている。

🗳️
選挙・投票行動の研究
投票率や得票を地域属性で回帰し、投票環境の改善策(投票所配置・期日前投票)の効果を検討する。
🏛️
EBPM(証拠に基づく政策立案)
市区町村データで社会課題(人口減・格差)の要因を探索し、どの施策が効きそうかの優先順位づけに使う。
📊
多変数データの前処理
多数の候補変数から多重共線性を除いて安定したモデルを作る作業は、マーケティングや与信のスコアリングでも必須。

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

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

Q. 市区町村別の投票率は公表されているの?
A. 第49回衆院選の市区町村別投票率は公表されていません。著者は総務省の得票数とSSDSE-Aの人口から「得票数÷(総人口−15歳未満−外国人)」で自ら算出しました。分母は有権者数の近似です。
Q. このページの図は原論文と同じ数値ですか?
A. 一部だけ実再現です。図1(投票率の分散)と図2(偏回帰係数)は、市区町村別投票率・得票数がSSDSE-Bに無いため原論文の報告値を可視化したもの(市区町村粒度)。図3・図4はSSDSE-Bの離婚件数・年齢別人口などから実際に計算しましたが、原論文の市区町村粒度に対して都道府県粒度で、投票率が無いため「説明変数の作り方と多重共線性」の再現です。図注に明記しています。
Q. なぜ完全失業率や医師数は再現しないの?
A. これらの列はSSDSE-B-2026に収録がないためです。無い列を使って数値をでっち上げることはせず、SSDSE-Bにある変数(離婚件数・婚姻件数・小中教員数・年齢別人口)だけで実再現しています。
Q. 離婚率の係数が−16.55と大きいのは、離婚が投票率を大きく下げる証拠?
A. いいえ。係数の大きさは変数の単位(スケール)にも依存し、離婚率は値の範囲が狭いので係数が大きく出やすいのです。また相関であって因果ではありません。著者も「因果は解析しておらず参考程度」と明記しています。

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

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

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

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

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