論文一覧に戻る 🕸 論文ネットワーク 🗺 用語ネットワーク 統計データ分析コンペ 教育用再現集
2019年度 統計データ分析コンペティション | 高校生の部
優秀賞

南海トラフ地震に備えて
指定避難所に3人に1人が避難できず、災害時の医療体制は本当に十分か?

⏱️ 推定読了時間: 約40分
渡邉 璃里香・吉田 美咲 愛媛県立松山南高等学校
🔬 GIS到達圏🔬 空間計量分析🔬 記述統計🏷 防災・災害🏷 医療・健康
🔬 手法タグ / 🏷 応用タグ(クリックで同タグの論文をネットワーク検索)
🔬 再現カルテ — 原論文と同じデータ・同じ手法で再現

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

原論文が使ったデータSSDSE-E・jSTAT MAP・指定緊急避難場所一覧表
分析単位:その他
中核手法:統計GIS・相関分析
この教材が使うデータ
原論文(PDF)南海トラフ地震に備えて ~指定避難所に3人に1人が避難できず、災害時の医療体制は本当に十分か?~
優秀賞/
✅ この教材でできること
  • 分析に使うデータは同梱済みで、ブラウザ上でそのまま読み込める
⚠️ この教材ではできないこと(原論文との違い)
  • 原論文は SSDSE-E を使っているが、この教材は SSDSE-A を使っている(ただし原論文には種別が明記されておらず、本文からの推定。読むときは原論文で確かめてほしい)
🚀 原論文と同じ粒度で挑戦したい人へ

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

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

🏅 論文審査会コメント(審査員はここを評価した)
「社会的問題について具体的な地域への政策提言がなされており、その視点も分かりやすい。jSTATMAPを用いて指定避難所や診療所の不足地域を明らかにしたことも説得力が高い。SSDSEの統計分析としては物足りない面もあるが、高校生のオペレーションズリサーチの論文としては高い水準のものと評価できる。」
出典:統計センター「統計データ分析コンペティション」受賞論文PDF掲載の審査講評。プロの審査員が何を評価し、何を注文したかは論文の読み方の最良の手本になる。
📝 3行で分かる要約

目次

  1. 研究概要と背景:30年以内に70〜80%
  2. データと再現範囲:SSDSE+jSTAT MAP+松山市公開資料
  3. 全国比較:避難所1か所当たりの人数と医師数(図1・図2)
  4. 半径3km圏の現実:3人に1人が避難できない(表1・図3)
  5. 徒歩10分到達圏と診療所の分布(原論文 図4〜図11)
  6. 提案:新たな避難所・救護所とその効果(図4・原論文 図12)
  7. まとめと提言
  8. 📥 データの準備
  9. 💼 実社会での応用
  10. ⚠️ よくある誤解
  11. 📖 用語集
  12. 📐 手法ガイド
  13. 🚀 発展の可能性
  14. 🎯 自分でやってみよう
  15. 🤔 Q&A
  16. 🐍 ブラウザで動かす

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

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

このページの再現分析(図1・図2の全国比較)を自分で動かすには、以下の手順でデータを準備してください。コードの編集は不要です。

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

※ 原論文の分析のうち、SSDSEを使う全国比較(図1・図2)は実データで再現できます。一方、jSTAT MAP(統計GIS)上で行われた松山南高校半径3km圏の地図分析(原論文 図3〜図12・表1)は対話的な地図操作にもとづくため、スクリプトでは再計算できません。該当部分の数値は原論文の報告値として本文の表と図3・図4に示します(詳細は「データと再現範囲」参照)。

研究概要と背景:30年以内に70〜80%

政府地震調査研究推進本部によると、30年以内に南海トラフ地震が起きる確率は70〜80%と予想されている(原論文執筆当時)。 愛媛県が発表した松山市の被害想定では、最大で震度7の揺れとなり、火災での焼失をあわせると建物全壊棟数は3万5千棟を超え、死者数715人、負傷者数5,707人になると想定されている(改訂版まつやま防災マップ)。

自然災害は避けることができないうえ、ある日突然発生する。しかし、日頃から防災対策をし、避難所の確保や負傷者の救護を迅速に行うことができれば、被害を最小限に抑えられるのではないか。 そこで著者らは、避難所と災害時の医療体制の現状と問題点を統計データで明らかにし、改善策を提案することを目指した。

研究の問い 南海トラフ地震が起きたとき、(1)通学する松山南高校の半径3km圏の住民は全員が指定避難所に避難できるのか?(2)外科・産婦人科・小児科・整形外科・内科という災害時に必要な診療科は十分な場所に配置されているのか?不足しているならどこに何を作るべきか?
分析の流れ(原論文 2節)
SSDSEで全国比較
避難所1か所当たり人数
医師数(図1・図2)
jSTAT MAPで
3km圏に避難所を
プロット(図3)
収容力と徒歩10分
到達圏の解析
(表1・図4)
5診療科の分布と
重ね合わせ
(図5〜11)
新たな避難所・
救護所の提案
(図12)

SSDSE(教育用標準データセット) jSTAT MAP(統計GIS) 徒歩10分到達圏(バッファ分析) 収容力ギャップ分析

論文審査会コメント(原論文より) 「社会的問題について具体的な地域への政策提言がなされており、その視点も分かりやすい。jSTAT MAPを用いて指定避難所や診療所の不足地域を明らかにしたことも説得力が高い。SSDSEの統計分析としては物足りない面もあるが、高校生のオペレーションズリサーチの論文としては高い水準のものと評価できる。」

データと再現範囲:SSDSE+jSTAT MAP+松山市公開資料

使用データ(原論文 8節の参考文献より)

データ・資料用途
SSDSE(教育用標準データセット)
独立行政法人統計センター
各都道府県庁所在市の「避難所1か所当たりの人数」「人口1万人あたりの医師数」の計算(図1・図2)
jSTAT MAP(地図で見る統計GIS)
e-Stat 政府統計の総合窓口
松山南高校を中心とした半径3km圏への指定避難所・5診療科のプロット、圏内人口の集計、徒歩10分到達圏の作図(図3〜図12)
改訂版まつやま防災マップ・指定緊急避難場所一覧表
松山市ホームページ
被害想定、指定避難所の場所・収容可能人数・給食施設の有無
不動産の表示に関する公正競争規約施行規則「徒歩1分=80m」という到達圏の基準(徒歩10分=800m)

自分たちで定義した指標

指標計算方法(原論文 2節)
避難所1か所当たりの人数総人口 ÷ 避難所数。避難所=小学校+中学校+高等学校+公民館とみなす(SSDSEから計算)
人口1万人あたりの医師数医師数 ÷ 総人口 × 10000
収容率(本ページでの呼び方)合計収容可能人数 ÷ 圏内人口総数 × 100(原論文 表1 の計算:142,164÷207,828×100≒68.40%)
「避難所の数」をどう数えるかの工夫 SSDSEに「指定避難所数」という項目はない。原論文は、指定避難所になることが多い施設(小学校・中学校・高等学校・公民館)の数を合計して避難所数の代理指標とした。 測りたいものが直接収録されていないとき、収録されている変数を組み合わせて近似する——これはデータ分析の重要な技術である。 ただし実際の指定避難所とは完全には一致しない点に注意(後述のQ&A参照)。
本ページの再現範囲(重要)
  • 実データで再現(図1・図2):SSDSEによる全国比較。本ページは現行の SSDSE-A-2025(市区町村データ)で再計算した。原論文は2019年当時のSSDSEを使ったため、数値は完全には一致しないが、傾向(大都市ほど避難所1か所当たり人数が多い、さいたま市の医師数が最低、松山市は平均並み/平均より低い)は一致する。
  • 原論文の報告値の可視化(図3・図4):jSTAT MAP上の集計(表1の人口・収容可能人数、エリア①〜④の人数)は再計算できないため、原論文の報告値をそのままグラフ化した。再計算ではない。
  • 地図そのもの(原論文 図3〜図12):jSTAT MAPの対話的な操作で作られた地図は本ページでは再現せず、内容を表・文章で示す。地図は原論文を参照
1
全国比較:避難所1か所当たりの人数と医師数(図1・図2)

まずSSDSEを使い、各都道府県庁所在市(東京は23区を合算)について「避難所1か所当たりの人数」と「人口1万人あたりの医師数」を計算し、松山市を全国の中に位置づける。 原論文の図1・図2は47市を横に並べた棒グラフで、本ページでは同じ指標をランキング形式の横棒グラフとして SSDSE-A-2025 の実データから再計算した。

やってみようステップ1: SSDSE-A(市区町村データ)の読み込み
📝 コード
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
import os
import numpy as np
import pandas as pd
import matplotlib
matplotlib.use('Agg')
import matplotlib.pyplot as plt

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)

# ── データ読み込み(SSDSE-A:市区町村データ) ──────────────────
# 1行目=項目コード、2行目=年度、3行目=日本語の項目名。コード行をヘッダーに使う
df_a = pd.read_csv(DATA_A, encoding='cp932', header=0, skiprows=[1, 2])
df_a = df_a.rename(columns={
    'SSDSE-A-2025': '地域コード', 'Prefecture': '都道府県', 'Municipality': '市区町村',
    'A1101': '総人口', 'E2101': '小学校数', 'E3101': '中学校数',
    'E4101': '高等学校数', 'G1201': '公民館数', 'I6100': '医師数',
})
cols = ['総人口', '小学校数', '中学校数', '高等学校数', '公民館数', '医師数']
df_a[cols] = df_a[cols].apply(pd.to_numeric, errors='coerce')
▼ 実行結果
このステップは print はしません。データや図が裏で更新されただけ。次のステップへ進みましょう。
💡 解説
  • pd.read_csv(..., encoding='cp932', skiprows=[1, 2]) — SSDSEはShift_JIS系(cp932)で、先頭3行がコード・年度・項目名の3段ヘッダー。コード行だけをヘッダーに残して読む。
  • rename(columns={...}) — 項目コード(A1101など)を日本語名に付け替えて、以降のコードを読みやすくする。
  • apply(pd.to_numeric, errors='coerce') — 数値化できないセル('-'など)をNaNに変換。集計前の定番処理。
💡 Python TIPS SSDSEの列名は「統計データのコード(社会・人口統計体系)」に対応しています。コードで扱うと版が変わっても対応表を差し替えるだけで済みます。
やってみようステップ2: 47都道府県庁所在市の抽出(東京は23区を合算)
📝 コード
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
# ── 都道府県庁所在市の抽出(東京は原論文にならい23区を合算) ──────
capitals = {
    '北海道': '札幌市', '青森県': '青森市', '岩手県': '盛岡市', '宮城県': '仙台市',
    '秋田県': '秋田市', '山形県': '山形市', '福島県': '福島市', '茨城県': '水戸市',
    '栃木県': '宇都宮市', '群馬県': '前橋市', '埼玉県': 'さいたま市', '千葉県': '千葉市',
    '神奈川県': '横浜市', '新潟県': '新潟市', '富山県': '富山市', '石川県': '金沢市',
    '福井県': '福井市', '山梨県': '甲府市', '長野県': '長野市', '岐阜県': '岐阜市',
    '静岡県': '静岡市', '愛知県': '名古屋市', '三重県': '津市', '滋賀県': '大津市',
    '京都府': '京都市', '大阪府': '大阪市', '兵庫県': '神戸市', '奈良県': '奈良市',
    '和歌山県': '和歌山市', '鳥取県': '鳥取市', '島根県': '松江市', '岡山県': '岡山市',
    '広島県': '広島市', '山口県': '山口市', '徳島県': '徳島市', '香川県': '高松市',
    '愛媛県': '松山市', '高知県': '高知市', '福岡県': '福岡市', '佐賀県': '佐賀市',
    '長崎県': '長崎市', '熊本県': '熊本市', '大分県': '大分市', '宮崎県': '宮崎市',
    '鹿児島県': '鹿児島市', '沖縄県': '那覇市',
}
rows = []
for pref, city in capitals.items():
    rows.append(df_a[(df_a['都道府県'] == pref) & (df_a['市区町村'] == city)][cols].iloc[0])
df_cap = pd.DataFrame(rows)
df_cap.insert(0, '市', list(capitals.values()))

# 東京23区(地域コード R13101〜R13123)を合算して1行にする
wards23 = df_a[df_a['地域コード'].astype(str).str.match(r'R131[0-2]\d')]
tokyo = wards23[cols].sum()
tokyo['市'] = '東京23区'
df_cap = pd.concat([df_cap, tokyo.to_frame().T], ignore_index=True)
df_cap[cols] = df_cap[cols].apply(pd.to_numeric)
print(f'都道府県庁所在市 {len(df_cap)} 市(東京23区を含む)')
print(f'東京23区の合算人口: {int(tokyo["総人口"]):,} 人')
▼ 実行結果
都道府県庁所在市 47 市(東京23区を含む)
東京23区の合算人口: 9,733,276 人
💡 解説
  • 辞書 capitals に「都道府県→県庁所在市」の対応を持たせ、1市ずつ抽出します。
  • SSDSE-Aに「東京23区の合計」という行はないため、地域コード R13101〜R13123 の23区を sum() で合算して1行を作ります。原論文の図1・図2が「東京23区」で比較しているのに合わせた処理です。
💡 Python TIPS str.match(r'R131[0-2]\d') のように正規表現でコード帯を指定すると、23行を列挙せずに済みます。
やってみようステップ3: 指標の計算——避難所1か所当たり人数・人口1万人あたり医師数
📝 コード
 99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
# ── 指標の計算(原論文 2節の定義どおり) ─────────────────────────
# 避難所 = 小学校+中学校+高等学校+公民館 とみなす(原論文の定義)
df_cap['避難所数'] = (df_cap['小学校数'] + df_cap['中学校数']
                      + df_cap['高等学校数'] + df_cap['公民館数'])
df_cap['避難所1か所当たり人数'] = df_cap['総人口'] / df_cap['避難所数']
df_cap['人口1万人あたり医師数'] = df_cap['医師数'] / df_cap['総人口'] * 10000

mean_shelter = df_cap['避難所1か所当たり人数'].mean()
mean_doctor  = df_cap['人口1万人あたり医師数'].mean()
m = df_cap[df_cap['市'] == '松山市'].iloc[0]
print(f'\n【避難所1か所当たりの人数】47市平均: {mean_shelter:,.0f} 人')
print('上位5市:')
top5 = df_cap.nlargest(5, '避難所1か所当たり人数')
for _, r in top5.iterrows():
    print(f"  {r['市']}: {r['避難所1か所当たり人数']:,.0f} 人")
print(f"松山市: {m['避難所1か所当たり人数']:,.0f} 人(平均の {m['避難所1か所当たり人数']/mean_shelter:.2f} 倍)")
print(f'\n【人口1万人あたりの医師数】47市平均: {mean_doctor:.1f} 人')
low5 = df_cap.nsmallest(5, '人口1万人あたり医師数')
print('下位5市:')
for _, r in low5.iterrows():
    print(f"  {r['市']}: {r['人口1万人あたり医師数']:.1f} 人")
print(f"松山市: {m['人口1万人あたり医師数']:.1f} 人(平均より "
      f"{'低い' if m['人口1万人あたり医師数'] < mean_doctor else '高い'})")
▼ 実行結果
【避難所1か所当たりの人数】47市平均: 3,472 人
上位5市:
  横浜市: 6,132 人
  東京23区: 5,814 人
  札幌市: 5,497 人
  大阪市: 5,164 人
  名古屋市: 5,114 人
松山市: 3,431 人(平均の 0.99 倍)

【人口1万人あたりの医師数】47市平均: 36.5 人
下位5市:
  さいたま市: 21.1 人
  宇都宮市: 22.8 人
  山口市: 23.8 人
  横浜市: 24.3 人
  青森市: 24.5 人
松山市: 32.5 人(平均より 低い)
💡 解説
  • 避難所=小学校+中学校+高等学校+公民館という原論文の定義どおりに足し上げ、総人口を割ります。
  • 実行結果が原論文の読み取りと一致:上位5市は横浜・東京23区・札幌・大阪・名古屋(原論文が「平均を大きく上回る」と指摘した5大都市そのもの)、松山市は平均の0.99倍でほぼ平均どおり
  • 医師数もさいたま市が最下位(原論文と同じ)、松山市は32.5人で平均36.5人より低い。版の違うSSDSEでも結論が再現されました。
都道府県庁所在市別 避難所1か所当たりの人数(SSDSE-A-2025で再計算)
図1:都道府県庁所在市別 避難所1か所当たりの人数(原論文 図1 の再現・SSDSE-A-2025で再計算)。避難所=小学校+中学校+高等学校+公民館。橙=原論文が「平均を大きく上回る」と指摘した5大都市(東京23区・札幌・名古屋・大阪・横浜)、赤=松山市、破線=47市平均(3,472人)。
📖 図1の読み方
何の図?
「避難所1つで何人を受け持つ計算になるか」を市ごとに並べた横棒グラフ。棒が長いほど、災害時に1つの避難所へ集まる人数が多くなる(=1人当たりのスペースが狭くなる)。
どこを見る?
横浜市(6,132人)・東京23区(5,814人)・札幌市(5,497人)・大阪市(5,164人)・名古屋市(5,114人)の5大都市が上位を占め、平均(3,472人)を大きく上回る。松山市は3,431人で平均とほぼ同じ——原論文(SSDSE 2019年版)と同じ結論が現行データでも再現された。
次に何を疑う?
「平均並みなら安心」だろうか?この平均的な数字からは避難所が適切な場所にあるかは読み取れない。だからこそ次節でGISを使った空間分析に進む。
やってみよう図1: 避難所1か所当たりの人数(横棒グラフ)
📝 コード
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
# ── 図1:避難所1か所当たりの人数(原論文 図1 の再現) ─────────────
d1 = df_cap.sort_values('避難所1か所当たり人数', ascending=True)
colors1 = ['#C62828' if c == '松山市' else
           ('#F57C00' if c in ('東京23区', '札幌市', '名古屋市', '大阪市', '横浜市')
            else '#78909C') for c in d1['市']]
fig1, ax1 = plt.subplots(figsize=(9, 13))
ax1.barh(d1['市'], d1['避難所1か所当たり人数'], color=colors1, alpha=0.9, height=0.72)
ax1.axvline(mean_shelter, color='#333333', linewidth=2, linestyle='--',
            label=f'47市平均 {mean_shelter:,.0f} 人', zorder=5)
ax1.set_xlabel('避難所1か所当たりの人数(人)', fontsize=12)
ax1.set_title('都道府県庁所在市別 避難所1か所当たりの人数\n'
              '(避難所=小学校+中学校+高等学校+公民館、SSDSE-A-2025で再計算)',
              fontsize=13, fontweight='bold', pad=12)
ax1.tick_params(axis='y', labelsize=8.5)
ax1.grid(True, axis='x', alpha=0.3)
ax1.legend(loc='lower right', fontsize=10)
plt.tight_layout()
fig1.savefig(os.path.join(FIG_DIR, '2019_H2_fig1.png'), dpi=150, bbox_inches='tight')
plt.close(fig1)
print('\n図1 保存完了(避難所1か所当たりの人数)')
▼ 実行結果
図1 保存完了(避難所1か所当たりの人数)
💡 解説
  • sort_values(...) で小さい順に並べ、barh で横棒に。5大都市を橙、松山市を赤で塗り分けます。
  • ax.axvline(平均, linestyle='--') — 平均の基準線。原論文の図1も平均線との比較で「大都市ほど多い」「松山市は平均並み」を読み取っています。
都道府県庁所在市別 人口1万人あたりの医師数(SSDSE-A-2025で再計算)
図2:都道府県庁所在市別 人口1万人あたりの医師数(原論文 図2 の再現・SSDSE-A-2025で再計算)。青=さいたま市(最下位21.1人)、赤=松山市(32.5人)、破線=47市平均(36.5人)。原論文の「さいたま市が最も低く、松山市も平均より低い」という観察が現行データでも成り立つ。
図1・図2から分かること(原論文 3節の結論)
  • 大都市ほど避難所1か所当たりの人数が多い:大都市で災害が起きた場合、1人当たりのスペースを十分に確保できない可能性が高い。
  • 松山市は避難所1か所当たり人数では平均並み。しかし医師数は平均より低い。
  • グラフの限界:これらのグラフだけでは、避難所や病院等が適切な場所にあるかは読み取れない。→ jSTAT MAP による空間分析へ。
やってみよう図2: 人口1万人あたりの医師数(横棒グラフ)
📝 コード
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
# ── 図2:人口1万人あたりの医師数(原論文 図2 の再現) ─────────────
d2 = df_cap.sort_values('人口1万人あたり医師数', ascending=True)
colors2 = ['#C62828' if c == '松山市' else
           ('#1565C0' if c == 'さいたま市' else '#78909C') for c in d2['市']]
fig2, ax2 = plt.subplots(figsize=(9, 13))
ax2.barh(d2['市'], d2['人口1万人あたり医師数'], color=colors2, alpha=0.9, height=0.72)
ax2.axvline(mean_doctor, color='#333333', linewidth=2, linestyle='--',
            label=f'47市平均 {mean_doctor:.1f} 人', zorder=5)
ax2.set_xlabel('人口1万人あたりの医師数(人)', fontsize=12)
ax2.set_title('都道府県庁所在市別 人口1万人あたりの医師数\n'
              '(SSDSE-A-2025で再計算。赤=松山市、青=さいたま市)',
              fontsize=13, fontweight='bold', pad=12)
ax2.tick_params(axis='y', labelsize=8.5)
ax2.grid(True, axis='x', alpha=0.3)
ax2.legend(loc='lower right', fontsize=10)
plt.tight_layout()
fig2.savefig(os.path.join(FIG_DIR, '2019_H2_fig2.png'), dpi=150, bbox_inches='tight')
plt.close(fig2)
print('図2 保存完了(人口1万人あたりの医師数)')
▼ 実行結果
図2 保存完了(人口1万人あたりの医師数)
💡 解説
  • 図1と同じ型の再利用です。色分けの条件(さいたま市=青、松山市=赤)だけ差し替えています。
  • 「一度作った作図コードを関数化・使い回しする」のは分析の効率を大きく上げる習慣です。

DS LEARNING POINT 1

「率」に直してから比べる——人口1万人あたり・1か所当たり

医師数の実数を比べれば、人口の多い横浜市が松山市より多いのは当たり前である。地域を公平に比べるには、総人口で割って「人口1万人あたり」に標準化する必要がある。避難所も同様に「1か所当たりの人数」に直すことで、規模の違う市を同じ物差しで比較できる。

ただし割り算の分母を何にするか(総人口?夜間人口?高齢者人口?)で結果の意味は変わる。指標を自作するときは定義式を必ず明記すること——原論文が2節で「避難所を小学校、中学校、高等学校、公民館とした」と明示しているのは良い実践である。

# 「率」への標準化の例 df_cap['人口1万人あたり医師数'] = df_cap['医師数'] / df_cap['総人口'] * 10000 df_cap['避難所1か所当たり人数'] = df_cap['総人口'] / df_cap['避難所数']
2
半径3km圏の現実:3人に1人が避難できない(表1・図3)

ここからが本研究の核心である。著者らは jSTAT MAP を用いて、松山南高校を中心とした半径3km圏の松山市指定避難所を統計GISの地図上にプロットした(原論文 図3。地図は原論文参照)。 指定避難所とは、災害により短期間の避難生活を余儀なくされた場合に、一定期間の避難生活を行う施設のことである。

原論文 図3(避難所のプロット図)から読み取られたこと
  • 3km圏の中に指定避難所がない空白地帯が存在する(原論文は地図上に赤丸で明示)。
  • 給食施設のある避難所は大学・小学校・中学校・病院に限られる。大災害の直後は各家庭での食料確保が難しく、他県から食料が届いた際に炊き出しを供給できる給食施設付き避難所が重要になる。

表1:3km圏の人口と収容可能人数(原論文の報告値)

統計GISで集計した圏内の人口総数と、松山市の指定緊急避難場所一覧表に記載された収容可能人数を突き合わせる。以下は原論文 表1 の報告値である。

項目値(原論文 表1)
人口総数(人口・jSTAT MAPで集計)207,828 人
合計収容可能人数(指定緊急避難場所一覧表より)142,164 人
指定避難所の数67 か所
やってみよう表1の報告値から収容率を計算する(原論文 4.1節の計算の追試)
📝 コード
164
165
166
167
168
169
170
171
172
173
174
175
176
# ── 図3:半径3km圏の人口と収容可能人数(原論文 表1 の報告値の可視化) ──
# 以下の3つの数値は原論文 表1 の報告値(jSTAT MAP・松山市指定緊急避難場所
# 一覧表から原論文が集計したもの)。本スクリプトでの再計算ではない。
pop_3km      = 207828   # 黒線内エリアの人口総数(人)
capacity_3km = 142164   # 合計収容可能人数(人)
shelters_3km = 67       # 指定避難所の数(か所)
ratio = capacity_3km / pop_3km * 100
shortage = pop_3km - capacity_3km
print(f'\n【原論文 表1 の報告値】松山南高校 半径3km圏')
print(f'  人口総数        : {pop_3km:,} 人')
print(f'  合計収容可能人数: {capacity_3km:,} 人(避難所 {shelters_3km} か所)')
print(f'  収容率 = {capacity_3km:,} / {pop_3km:,} × 100 ≒ {ratio:.2f} %')
print(f'  → 約 {shortage:,} 人(およそ3人に1人)が指定避難所に避難できない')
▼ 実行結果
【原論文 表1 の報告値】松山南高校 半径3km圏
  人口総数        : 207,828 人
  合計収容可能人数: 142,164 人(避難所 67 か所)
  収容率 = 142,164 / 207,828 × 100 ≒ 68.40 %
  → 約 65,664 人(およそ3人に1人)が指定避難所に避難できない
💡 解説
  • pop_3kmcapacity_3kmshelters_3km原論文 表1 の報告値(jSTAT MAPと松山市一覧表から原論文が集計)で、本スクリプトで再集計したものではありません。
  • 割り算の追試:142,164÷207,828×100≒68.40%。原論文の「約68%」「3人に1人は避難できない」という計算が正確であることを確認できます。
💡 Python TIPS 論文の数値を引用するときは、原データの再集計(reproduction)と、報告値からの計算の追試(checking)を区別して明記しましょう。
松山南高校 半径3km圏の人口総数と収容可能人数(原論文 表1 の報告値の可視化)
図3:松山南高校 半径3km圏の人口総数と指定避難所の合計収容可能人数。本図は原論文 表1 の報告値をそのまま可視化したもので、再計算ではない。収容率 142,164÷207,828×100≒68.4%——約65,664人分が不足し、3人に1人は指定避難所に避難できない
📖 図3の読み方
何の図?
圏内の人口(需要)と避難所の収容可能人数(供給)を並べた棒グラフ。青い棒が灰色の棒より短い分だけ「入りきらない人」が出る。
どこを見る?
収容可能人数は人口総数の約68%。約3人に1人(約6.6万人)は指定避難所に入れない計算になる。
次に何を疑う?
不足は圏内に均等に生じるのか?それとも特定の場所に集中するのか?——次節の徒歩10分到達圏の分析で「どこの人が避難できないか」を特定する。
やってみよう図3: 収容力ギャップの可視化(報告値の可視化)
📝 コード
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
fig3, ax3 = plt.subplots(figsize=(9, 4.6))
ax3.barh(['合計収容可能人数', '人口総数'], [capacity_3km, pop_3km],
         color=['#1565C0', '#78909C'], alpha=0.9, height=0.55)
ax3.barh(['合計収容可能人数'], [pop_3km - capacity_3km], left=[capacity_3km],
         color='#C62828', alpha=0.35, height=0.55,
         label=f'収容できない人数 約{shortage:,}人')
for y, v in zip([0, 1], [capacity_3km, pop_3km]):
    ax3.annotate(f'{v:,} 人', (v, y), xytext=(6, 0), textcoords='offset points',
                 va='center', fontsize=11, fontweight='bold')
ax3.annotate(f'収容率 {ratio:.1f}%\n= 3人に1人が避難できない',
             (capacity_3km * 0.5, 0), va='center', ha='center',
             fontsize=11, color='white', fontweight='bold')
ax3.set_xlim(0, 235000)
ax3.set_title('松山南高校 半径3km圏の人口総数と指定避難所の収容可能人数\n'
              '(原論文 表1 の報告値の可視化。再計算ではない)',
              fontsize=12.5, fontweight='bold', pad=10)
ax3.set_xlabel('人数(人)', fontsize=11)
ax3.grid(True, axis='x', alpha=0.3)
ax3.legend(loc='lower right', fontsize=10)
plt.tight_layout()
fig3.savefig(os.path.join(FIG_DIR, '2019_H2_fig3.png'), dpi=150, bbox_inches='tight')
plt.close(fig3)
print('図3 保存完了(表1の報告値の可視化)')
▼ 実行結果
図3 保存完了(表1の報告値の可視化)
💡 解説
  • 2本の棒(人口総数と収容可能人数)を並べ、不足分を薄い赤で上塗りして「入りきらない約65,664人」を面積で見せます。
  • タイトルと図注に「原論文 表1 の報告値の可視化。再計算ではない」と明記——出所の透明性は教育用再現の生命線です。

DS LEARNING POINT 2

需要と供給を同じ単位で突き合わせる(キャパシティ分析)

「避難所は67か所ある」だけでは十分かどうか判断できない。需要(圏内人口207,828人)と供給(収容可能人数142,164人)を同じ単位(人数)で突き合わせて初めて「約68%しか収容できない」という定量的な結論が出る

この「需要÷供給」の考え方は、保育所の待機児童、病床の逼迫率、電力需給など、社会インフラの分析全般で使われる基本技術である。分子・分母の定義(収容可能人数は1人当たり何m²で計算されているか等)を確認する癖をつけよう。

3
徒歩10分到達圏と診療所の分布(原論文 図4〜図11)

徒歩10分で避難所に着けない4つのエリア(原論文 図4)

収容力の不足に加えて「距離」の問題がある。著者らは歩く速度を分速80m(不動産の表示に関する公正競争規約施行規則の基準)とし、各指定避難所を中心に徒歩10分(=800m)で到達できるエリアを地図上に描いた(原論文 図4。地図は原論文参照)。 災害時に避難所が近くにない場合、高齢者や小さい子どもをもつ家族、けがをしている人は避難するのが大変である。

その結果、徒歩10分以内に指定避難所へ到達できないエリアが4か所見つかった。各エリアの人数(jSTAT MAPで集計した原論文の報告値)は次のとおり。

エリア徒歩10分以内に指定避難所へ到達できない人数(原論文の報告値)
エリア①約 1,400 人
エリア②約 7,000 人
エリア③約 6,000 人
エリア④約 4,000 人
合計約 18,400 人

5つの診療科の分布(原論文 図5〜図10)

次に著者らは、災害発生時に必要不可欠な医療機関を外科・産婦人科・小児科・整形外科・内科の5科に絞り、それぞれの診療所を同じ3km圏の地図にプロットした(原論文 図5〜図10。地図は原論文参照)。読み取られた特徴は次のとおり。

観察内容(原論文 4.2節)
共通の立地傾向どの診療科も交通に便利な電車の駅付近や主要道路沿いに多く立地し、そこから離れるにつれ数が少なくなる
学校の近く幼稚園・小中学校・高校の近くには、児童・生徒の利用頻度が高い整形外科や内科が多い
内科患者数の多い内科は圧倒的に数が多く、ほぼ偏りなく分布——災害時にも円滑に対応可能とみられる
産婦人科・小児科患者の対象が限られる科は数が少なく、分布に偏りがある。外科・整形外科も同様に不足地域が存在
重ね合わせの発見(原論文 図11・5節):不足地域が一致する 指定避難所の分布(図3)と5科の診療所の分布(図10)を重ね合わせると、両方の分布は似ており、不足している箇所は同じような場所にあることが分かった。 避難所や診療所が集中している地域では災害時に連携がとりやすく負傷者の救護を素早く行える一方、不足している地域では十分な救護を受けられない可能性が高い。 地域間で大きな格差がある——これが本研究のデータ分析の中心的な発見である。

DS LEARNING POINT 3

到達圏(バッファ)分析——「近くにあるか」を定量化する

施設の「数」が足りていても、「距離」が遠ければ使えない。GISでは、施設を中心に一定距離の円(バッファ)や移動時間の到達圏を描き、どの圏にも入らない場所=サービスの空白地帯を特定する。これをバッファ分析(到達圏分析)と呼ぶ。

本研究の優れた点は、徒歩速度に「分速80m」という公的な基準(不動産の表示に関する公正競争規約施行規則)の出典を明示したこと。分析の前提となる数値には必ず根拠を付けよう。jSTAT MAPの「リッチレポート」や「エリア作成」機能を使えば、同じ分析を誰でも無料で行える。

4
提案:新たな避難所・救護所とその効果(図4・原論文 図12)

避難所と診療所がともに不足する4つのエリアに対し、著者らは避難所や診療所の代わりになる実在の施設を提案した(原論文 6節・図12)。 提案場所の面積を jSTAT MAP で測定し、1人当たりの避難スペースを2m²として新たに何人避難できるかを計算している。以下はいずれも原論文の報告値である。

エリア提案場所提案の根拠救護所とする診療科新たに避難可能
(報告値)
私立幼稚園2園+大学グラウンド幼稚園は自園調理の給食制度があり食事を提供できる。大学グラウンドは一時避難所で、テントを張り広大な土地を活用産婦人科・外科・整形外科約 30,000 人
(到達困難 約1,400人 全員)
ショッピングセンター+認定こども園自衛隊と「大規模災害時における物資の供給要請に関する協定」を締結済みで物資を迅速に届けられる。こども園には給食施設小児科・産婦人科・外科約 16,000 人
(到達困難 約7,000人 全員)
自動車教習所+私立保育所・私立幼稚園教習所は教室・ロビーに加え託児室があり幼児にも過ごしやすい。保育所・幼稚園には給食施設小児科・整形外科・産婦人科・外科約 6,600 人
(到達困難 約6,000人 全員)
松山市総合公園+南江戸公園救護用・避難民用のテントを張り、広大な土地を避難スペースや応急手当場所として活用小児科・整形外科・産婦人科・外科約 20,000 人
(到達困難 約4,000人 全員)
やってみようエリア①〜④の報告値を整理する
📝 コード
202
203
204
205
206
207
208
209
210
211
212
213
214
215
# ── 図4:エリア①〜④の報告値の可視化(原論文 4.1節・6節) ─────────
# いずれも原論文の報告値。徒歩10分=分速80m×10分=800mの到達圏に入らない
# 4つの空白エリアの人数と、提案場所の導入で新たに避難可能となる人数。
areas = ['エリア①\n(私立幼稚園2園+\n大学グラウンド)',
         'エリア②\n(ショッピングセンター+\n認定こども園)',
         'エリア③\n(自動車教習所+\n私立保育所・幼稚園)',
         'エリア④\n(松山市総合公園+\n南江戸公園)']
unreachable = [1400, 7000, 6000, 4000]      # 徒歩10分で避難所に到達できない人数
new_capacity = [30000, 16000, 6600, 20000]  # 提案導入で新たに避難可能となる人数

print('\n【原論文の報告値】徒歩10分で指定避難所に到達できないエリア')
for a, u, n in zip(['①', '②', '③', '④'], unreachable, new_capacity):
    print(f'  エリア{a}: 到達困難 約{u:,}人 → 提案場所の導入で新たに約{n:,}人が避難可能')
print(f'  合計    : 到達困難 約{sum(unreachable):,}人 / 新規避難可能 約{sum(new_capacity):,}人')
▼ 実行結果
【原論文の報告値】徒歩10分で指定避難所に到達できないエリア
  エリア①: 到達困難 約1,400人 → 提案場所の導入で新たに約30,000人が避難可能
  エリア②: 到達困難 約7,000人 → 提案場所の導入で新たに約16,000人が避難可能
  エリア③: 到達困難 約6,000人 → 提案場所の導入で新たに約6,600人が避難可能
  エリア④: 到達困難 約4,000人 → 提案場所の導入で新たに約20,000人が避難可能
  合計    : 到達困難 約18,400人 / 新規避難可能 約72,600人
💡 解説
  • 4エリアの「徒歩10分で到達できない人数」と「提案で新たに避難可能となる人数」は、いずれも原論文の報告値をリストに転記したものです。
  • 合計すると到達困難は約18,400人。提案による新規収容は約72,600人で、全エリアで到達困難者を上回ります。
エリア①〜④の到達困難人数と提案による新規避難可能人数(原論文の報告値の可視化)
図4:避難所空白エリア①〜④の「徒歩10分で到達できない人数」(赤)と「提案場所の導入で新たに避難可能となる人数」(緑)。本図は原論文 4.1節・6節の報告値をそのまま可視化したもので、再計算ではない。全エリアで緑が赤を上回り、到達困難だった約18,400人全員の受け入れが可能になる。
📖 図4の読み方
何の図?
エリアごとに「困っている人数(需要)」と「提案で増える収容力(供給)」を対にした横棒グラフ。
どこを見る?
4エリアすべてで緑(新規収容)が赤(到達困難)以上——距離的な問題で避難が難しかった人全員が避難可能になるという原論文の主張が一目で確認できる。
次に何を疑う?
エリア③は約6,600人と余裕が小さい(到達困難約6,000人)。一方①②④は余裕が大きく、原論文も「1人当たりの避難スペースが大きくなり、ゆとりをもって避難生活を送ることができる」と述べる。前提(1人2m²・施設側の受け入れ可否)が変わると結論がどう変わるかも考えたい。
やってみよう図4: エリア別の到達困難人数と提案の効果(報告値の可視化)
📝 コード
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
y = np.arange(len(areas))
fig4, ax4 = plt.subplots(figsize=(10, 6.2))
ax4.barh(y + 0.21, unreachable, height=0.38, color='#C62828', alpha=0.9,
         label='徒歩10分以内に指定避難所へ到達できない人数')
ax4.barh(y - 0.21, new_capacity, height=0.38, color='#2E7D32', alpha=0.9,
         label='提案場所の導入で新たに避難可能となる人数')
for yi, v in zip(y + 0.21, unreachable):
    ax4.annotate(f'約{v:,}人', (v, yi), xytext=(5, 0), textcoords='offset points',
                 va='center', fontsize=10)
for yi, v in zip(y - 0.21, new_capacity):
    ax4.annotate(f'約{v:,}人', (v, yi), xytext=(5, 0), textcoords='offset points',
                 va='center', fontsize=10)
ax4.set_yticks(y)
ax4.set_yticklabels(areas, fontsize=9.5)
ax4.invert_yaxis()
ax4.set_xlim(0, 34000)
ax4.set_xlabel('人数(人)', fontsize=11)
ax4.set_title('避難所空白エリア①〜④の到達困難人数と提案の効果\n'
              '(原論文 4.1節・6節の報告値の可視化。再計算ではない)',
              fontsize=12.5, fontweight='bold', pad=10)
ax4.grid(True, axis='x', alpha=0.3)
ax4.legend(loc='lower right', fontsize=10)
plt.tight_layout()
fig4.savefig(os.path.join(FIG_DIR, '2019_H2_fig4.png'), dpi=150, bbox_inches='tight')
plt.close(fig4)
print('図4 保存完了(エリア①〜④の報告値の可視化)')
▼ 実行結果
図4 保存完了(エリア①〜④の報告値の可視化)
💡 解説
  • barh(y+0.21, ...)barh(y-0.21, ...) で赤(到達困難)と緑(新規収容)の2系列をエリアごとに対にして描きます。
  • y軸ラベルに提案場所(幼稚園・ショッピングセンター・教習所・公園)を書き込み、グラフ1枚で「どこに・何を・どれだけの効果」が読めるようにしています。

DS LEARNING POINT 4

分析から提案へ——オペレーションズリサーチの発想

本研究が審査会で「高校生のオペレーションズリサーチ(OR)の論文としては高い水準」と評価されたのは、問題の特定(空白エリアと人数)→資源の発見(給食施設・協定・広い土地をもつ実在施設)→効果の定量化(新たに何人収容できるか)という一連の流れを閉じているからである。

「避難所を増やすべきだ」という一般論ではなく、「エリア②はこのショッピングセンターとこども園。理由は協定と給食施設。効果は約16,000人」とまで具体化して初めて、政策提言として説得力を持つ。

まとめと提言

主要な発見(いずれも原論文の報告値・解釈)

  1. 全国比較:大都市ほど避難所1か所当たりの人数が多く、1人当たりスペースの確保が難しい。松山市は避難所1か所当たり人数では平均並みだが、人口1万人あたりの医師数は平均より低い。
  2. 収容力:松山南高校半径3km圏では、収容可能人数142,164人に対し人口207,828人(収容率約68.4%)。3人に1人は指定避難所に避難できない
  3. 距離:徒歩10分(分速80m)で指定避難所に到達できないエリアが4か所あり、合計約18,400人が取り残される。
  4. 医療:診療所は駅付近・主要道路沿いに集中。内科は多く偏りがないが、産婦人科・小児科・整形外科・外科には不足地域がある。避難所と診療所の不足地域は一致しており、地域間格差が大きい。
  5. 提案の効果:幼稚園・ショッピングセンター・教習所・公園などを新たな避難所・救護所とすることで、距離的に避難が難しかった人全員が避難可能になり、分布の偏りも小さくなる。
原論文の提言(7節) 少子高齢化の現在、災害時に高齢者や負傷者が自力で遠くへ行くことは難しい。個人だけでなく国や地方公共団体も前もって、指定避難所の設置、大規模災害時の協定の締結、自衛隊と医療チームの派遣などの準備をしておくべきである。今回の解析結果は南海トラフ地震だけでなく他の自然災害でも役立つ。
分析の限界と読むときの注意(教育用の補足)
  • 収容可能人数の定義:市の一覧表の収容人数がどんな前提(1人当たり面積・使用可能な部屋)で計算されているかで結論は変わりうる。
  • 直線距離の到達圏:徒歩10分圏は地図上の距離に基づく。実際の道路網・河川・坂道を考えると、到達できない人はさらに多い可能性がある。
  • 昼と夜の人口:jSTAT MAPの人口は夜間(居住)人口が基本。昼間に地震が起きた場合の通勤・通学者の分布は別に検討が必要。
  • 建物被災の可能性:提案施設や既存避難所自体が地震で被災する(耐震性・火災・浸水)シナリオは扱っていない。

DS LEARNING POINT 5

「平均で安心しない」——全国比較と地域内分析の使い分け

図1で松山市は「平均並み」だった。しかし3km圏に絞って空間分布を見ると、3人に1人が避難できず、徒歩10分圏の空白が4か所も見つかった。集計値(市全体の平均)が問題なしに見えても、内部の分布に大きな偏りが隠れていることがある

マクロ(全国比較)で自分の街を位置づけ、ミクロ(GIS)で内部の偏りを暴く——このズームイン構造は、地域分析レポートの優れたお手本である。

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

分析スクリプト(2019_H2_yushu.py)
データ・資料出典・説明
SSDSE-A-2025(市区町村データ)独立行政法人統計センター SSDSE(教育用標準データセット)。本ページの再現分析(図1・図2)に使用。原論文は2019年当時のSSDSEを使用。
jSTAT MAP(地図で見る統計GIS)総務省統計局・独立行政法人統計センターが提供する地理情報システムjstatmap.e-stat.go.jp)。原論文の図3〜図12の作成に使用。無料で利用できる。
改訂版まつやま防災マップ・指定緊急避難場所一覧表松山市ホームページ。被害想定と各指定避難所の収容可能人数・給食施設の有無。
徒歩1分=80m の基準「不動産の表示に関する公正競争規約施行規則」第5章 表示基準 第10条(不動産公正取引協議会連合会)。

図1・図2は SSDSE-A-2025 の実データから計算・作図(合成データ・乱数生成なし)。 図3・図4および本文の数値(207,828人/142,164人/67か所/68.40%/エリア①〜④の人数など)は原論文の報告値であり、本ページで再計算したものではない。原論文の地図(図3〜図12)は本ページでは再現していない。

教育用解説ページ | 2019年度 統計データ分析コンペティション 優秀賞 [高校生の部]「南海トラフ地震に備えて」
データ出典:SSDSE(独立行政法人統計センター)・jSTAT MAP・松山市ホームページ

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

統計分析の解釈で初心者がやりがちな勘違いをまとめます。特に「相関因果の混同」「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 × 変数数)

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

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

GIS(地理情報システム)/jSTAT MAP
データを地図の上に重ねて分析する仕組み。jSTAT MAPは政府統計ポータル e-Stat が提供する無料の統計GISで、国勢調査の小地域人口を円やポリゴンで集計したり、施設をプロットしたりできる。本論文の図3〜図12はすべてこれで作られた。
指定避難所・指定緊急避難場所
指定避難所は、災害で家に住めなくなった人が一定期間の避難生活を行う施設(学校の体育館・公民館など)。市町村が指定し、収容可能人数が一覧表で公開されている。
到達圏(バッファ)分析
施設を中心に「徒歩10分=800m」のような一定距離・時間の圏を描き、どの圏にも入らない空白地帯を見つける分析。本論文は分速80m(不動産表示の公的基準)×10分を採用した。
収容率(需要と供給の比率)
合計収容可能人数÷対象人口×100。本論文では142,164÷207,828×100≒68.4%で、「3人に1人が避難できない」の根拠となった数値。
記述統計
データを集計・可視化して特徴を要約する統計。平均との比較・ランキング棒グラフなどが代表。検定や回帰のような推測統計と対になる概念。
代理指標(プロキシ)
直接測れないものを、入手できる別の変数で近似したもの。本論文の「避難所数=小・中・高・公民館の合計」がその例。定義を明示し、実際とのズレを意識して使う。
平均
データの合計を個数で割った代表値。本論文は47市平均を基準線にして各市を比べた。外れ値(突出した大都市)に引っ張られやすい点に注意。
外れ値
他のデータから極端に離れた値。図1の5大都市のような外れ値は「取り除く」対象ではなく、それ自体が重要な情報であることが多い。
人口(夜間人口・昼間人口)
国勢調査の人口は居住地ベース(夜間人口)。昼間に災害が起きた場合の避難需要は通勤・通学先の分布(昼間人口)で考える必要がある。
ジオコーディング
住所や施設名を地図上の座標(緯度・経度)に変換すること。施設をGISにプロットする際の前処理にあたる。
オープンデータ
誰でも自由に使えるよう公開されたデータ。本論文はSSDSE・jSTAT MAP・松山市の公開資料という、すべて無料で入手できる情報だけで政策提言まで到達している。
因果相関
「関連がある」と「原因と結果の関係」は別物。本論文は主に分布の記述と需給比較であり、因果を主張する分析ではない。
欠損値
データが取得できなかった部分(NaN・空白)。SSDSE-Aでも一部の市区町村・項目に欠損があり、集計前に確認が必要。
サンプルサイズ
分析に使ったデータ点の数(n)。図1・図2はn=47(都道府県庁所在市)。少数の比較では1市の特殊事情が平均を動かしうる。

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

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

◆ 統計の基本概念(どの論文にも共通)

🔍 平均との比較——「基準線」の考え方
何?
各地域の値を全体の平均と比べ、「平均より上か下か・どれくらい離れているか」で位置づける最も基本的な比較法。
なぜ必要?
単独の数値(松山市の医師数32.5人)だけでは多いか少ないか判断できない。基準線(47市平均36.5人)があって初めて「平均より低い」と言える。
何がわかる?
自分の地域の相対的な立ち位置。グラフに平均の破線を引くだけで説得力が大きく変わる。
読み方
平均は外れ値に引っ張られる。図1のように大都市が突出する分布では、中央値も並べて確認すると安全。
➗ 「率」への標準化(人口1万人あたり・1か所当たり)
何?
実数を人口や施設数で割り、規模の違う地域を同じ物差しで比べられるようにする変換。
なぜ必要?
実数のままでは「人口が多い市は何でも多い」となり比較にならない。率に直すことで人口規模の影響を取り除ける。
何がわかる?
地域の「密度」や「充足度」。医師数(実数)では上位の横浜市が、人口1万人あたりでは下位グループに落ちる、といった逆転が見える。
読み方
分母の選び方(総人口か・高齢者人口か・面積か)で意味が変わる。定義式が明示されているかを必ず確認する。

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

📊 記述統計による地域間比較(図1・図2)
何?
SSDSEから指標(避難所1か所当たり人数・人口1万人あたり医師数)を計算し、47都道府県庁所在市を棒グラフ+平均線で比較する分析。
どう使う?
①指標の定義式を決める → ②全地域で同じ式で計算する → ③並べ替えて平均線とともに描く → ④注目地域(松山市)を強調する。
何がわかる?
自分の地域の全国での立ち位置と、都市規模に伴う傾向(大都市ほど避難所1か所当たり人数が多い)。
結果の読み方
平均より上/下、上位・下位の顔ぶれ、平均からの乖離幅を読む。本論文は「松山市はほぼ平均」「医師数は平均より低い」と読み取った。
⚠️ 注意点
(1) 定義依存:「避難所=小中高+公民館」という代理定義を変えると順位も変わる。定義を明記し、可能なら別定義でも確認する。(2) 集計単位:市全体の平均が良くても内部に偏りが隠れる(本論文自身が3km圏分析でそれを示した)。(3) データ年次:SSDSEの版によって収録年が違うため、版とデータ年を必ず書く。
🗺️ GISプロット(jSTAT MAP・原論文 図3・図5〜図11)
何?
施設(指定避難所・診療所)を地図上に点で描き、分布の偏り・空白地帯を目で確かめる空間分析の第一歩。
どう使う?
jSTAT MAPで中心(学校)と半径(3km)を指定してエリアを作り、施設リストをプロット。属性(給食施設の有無・診療科)で色や記号を分ける。
何がわかる?
「駅や幹線道路沿いに集中している」「この一角に何もない」という、集計表からは見えない立地のパターン。
結果の読み方
点の密集と空白を読む。複数のレイヤー(避難所×診療所)を重ねると「両方不足する地域」が特定できる(原論文 図11)。
⚠️ 注意点
(1) 目視判断の主観性:「偏っている」の判断が目分量になりがち。人数集計(本論文はエリア別人数を出した)とセットにする。(2) プロット漏れ:施設リストの鮮度(閉院・新設)で結果が変わる。(3) 縮尺と印象:地図の縮尺次第で密集にも疎にも見えるため、同じ縮尺で比較する。
🚶 徒歩10分到達圏の分析(バッファ分析・原論文 図4)
何?
各避難所から「分速80m×10分=800m」の到達圏を描き、どの圏にも入らないエリアとそこに住む人数を特定する手法。
どう使う?
①徒歩速度と時間の基準を決め出典を明示 → ②全施設の到達圏を描く → ③圏外エリアを囲む → ④jSTAT MAPでエリア内人口を集計する。
何がわかる?
「施設の数は足りていても、歩いて行けない人が何人いるか」。本論文は4エリア・合計約18,400人を特定した。
結果の読み方
空白エリアの位置と人数を読む。人数が多いエリアほど新設の優先度が高い、という政策判断につながる。
⚠️ 注意点
(1) 直線距離の限界:川・線路・坂で実際の徒歩距離は伸びる。道路ネットワーク距離での再計算が望ましい。(2) 移動弱者:高齢者・けが人は分速80mで歩けない。速度を落とした感度分析をすると説得力が増す。(3) 夜間人口ベース:昼間の発災では通勤・通学者の分布が異なる。
🏥 収容力ギャップ分析(需要×供給・表1・原論文 6節)
何?
需要(圏内人口)と供給(収容可能人数)を同じ単位で突き合わせ、不足量を定量化する分析。提案の効果測定(1人2m²で新規収容人数を試算)にも使う。
どう使う?
①需要=jSTAT MAPの圏内人口 → ②供給=公開一覧表の収容可能人数の合計 → ③比率と不足数を計算 → ④対策候補の面積÷2m²で追加供給を見積もる。
何がわかる?
「収容率68.4%=3人に1人が避難できない」「提案でエリアの到達困難者全員をカバーできる」という定量的な結論。
結果の読み方
比率(68.4%)と絶対数(約65,664人)の両方を示す。比率だけでは深刻さの規模感が、絶対数だけでは相対的な深刻さが伝わらない。
⚠️ 注意点
(1) 前提の明示:「1人2m²」の仮定を変えれば収容人数は比例して変わる。仮定は必ず明記し、幅をもって示す。(2) 供給の実効性:収容「可能」人数は建物が無事である前提。耐震性・浸水想定との重ね合わせが次の課題。(3) 二重計上:提案施設の利用者(園児・買い物客)と避難者が競合する時間帯の検討も必要。

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

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

① データ・空間的拡張
結果 X
本論文は松山南高校の半径3km圏という限られたエリアで、避難所の空白4か所・約18,400人を特定した。
新仮説 Y
同じ手法を松山市全域や愛媛県沿岸部に広げれば、津波浸水想定と重なる「より危険な空白地帯」が見つかるかもしれない。
課題 Z
(1)国土数値情報の「避難施設データ」と国勢調査メッシュ人口で市全域の到達圏分析を行う。(2)ハザードマップ(津波・洪水浸水想定)のレイヤーを重ね、「空白×浸水」の二重リスク地域を特定する。(3)最新のSSDSE-Aで図1・図2を更新し、傾向の変化を見る。
② 手法の発展:バッファ分析の次のステップ
結果 X
本論文は直線距離ベースの徒歩10分圏(分速80m)で空白エリアを判定した。
新仮説 Y
道路ネットワーク距離や移動弱者の歩行速度を使うと、到達困難人口は約18,400人より多くなる可能性がある。逆に、施設配置を数理的に最適化すれば、より少ない新設数で全域をカバーできるかもしれない。
課題 Z
(1)OpenStreetMap等の道路網データでネットワーク到達圏を再計算し、直線距離との差を比較する。(2)高齢者向けに分速40〜60mでの感度分析を行う。(3)「最少の施設数で全人口を10分圏に収める」という集合被覆問題(オペレーションズリサーチの定番)として定式化して解いてみる。
③ 政策提言・実践への応用
結果 X
本論文は給食施設・自衛隊との協定・広い土地という根拠付きで、実在施設を新たな避難所・救護所として提案した。
新仮説 Y
提案の実現には施設側の合意・費用・運営体制が必要で、「効果(収容人数)あたりの実現コスト」で優先順位をつけられるはずだ。
課題 Z
(1)提案施設への聞き取りや自治体の地域防災計画で、受け入れの実現可能性を確認する。(2)エリアごとに「新規収容人数÷必要な準備(協定・備蓄・人員)」を粗く見積もり優先順位表を作る。(3)市の防災担当部署に分析結果を1枚のマップ+表で提出してみる(原論文のような具体的提案は自治体に歓迎されやすい)。

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

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

★☆☆☆☆ 入門
CH1. 再現スクリプトを実行して図1〜4を作る
付属の Python スクリプトをそのまま実行し、全国比較の2枚と報告値可視化の2枚を再現してください。
ポイント: 上位5市(横浜・東京23区・札幌・大阪・名古屋)と松山市の値、収容率68.40%が表示されるか確認。各図がどのコード行から生成されているか辿る。
★★☆☆☆ 初級
CH2. 「避難所」の定義を変えて結果を比べる
避難所の定義(小+中+高+公民館)から公民館を外す、あるいは義務教育学校(E3901)を加えるなど、定義を変えて図1を作り直してください。
ポイント: 松山市の順位や「平均並み」という結論は定義にどれくらい頑健か? 代理指標の感度を自分の手で確かめる。
★★★☆☆ 中級
CH3. 自分の市で同じ指標を計算する
SSDSE-A には全国の市区町村が収録されています。自分の住む市(または学校のある市)の「避難所1か所当たり人数」「人口1万人あたり医師数」を計算し、47都道府県庁所在市の分布の中に位置づけてください。
ポイント: 図1・図2に自分の市の線を追加で描き込むと比較が一目瞭然になる。
★★★★☆ 上級
CH4. jSTAT MAPで自分の学校の半径3km圏を分析する
jSTAT MAP(無料)で自分の学校を中心に半径3kmの円を作り、圏内人口を集計。市の指定避難所一覧と突き合わせて「自分の街の収容率」を計算してください。
ポイント: 原論文と同じ手順(エリア作成→人口集計→一覧表と照合)。収容率は68.4%より高いか低いか?
★★★★★ 発展
CH5. 徒歩10分圏の空白エリアを見つけて提案までやり切る
自分の街の避難所について徒歩10分到達圏を描き、空白エリアと人数を特定した上で、原論文のように「新たな避難所・救護所の候補と根拠」まで提案してください。
ポイント: 問題の特定→資源の発見→効果の定量化、という本論文の3ステップを踏んで1ページのレポートにまとめる。これが政策提言型データ分析の「実践」。
💡 ヒント: 詰まったら本サイトの他の論文(同じ手法を使っている)のスクリプトをコピーして組み合わせるのが効率的です。手法ガイド・用語集も参考に。

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

本論文で学んだ手法(GIS・到達圏分析・需給ギャップ分析)は、研究の世界だけでなく、行政・企業・NPO の現場でも様々に活用されています。具体的なシーンを紹介します。

🏛️
自治体の防災計画・地域防災力評価
市町村の防災担当は、避難所の収容力と人口分布を突き合わせて避難所の追加指定や民間施設との協定締結を進めます。本論文とまったく同じ「空白地帯の特定→協定候補の洗い出し」が実務の中心です。
🏪
小売・物流の出店計画(商圏分析)
「店舗から徒歩10分圏に何人住んでいるか」はコンビニ・スーパーの出店判断の基本指標。jSTAT MAPと同種の商圏分析ツールで、到達圏人口・競合の空白地帯を評価します。
🚑
救急医療・医療圏の設計
救急車が何分で到達できるか(カバー圏)、産科・小児科の空白地域はどこか——都道府県の医療計画は本論文と同じ到達圏分析と診療科別の分布分析で作られています。
🏙️
都市計画・公共施設の最適配置
学校統廃合・図書館・保育所の配置検討では、「最少の施設で住民の90%を徒歩圏に収める」といった施設配置最適化(オペレーションズリサーチ)が使われます。本論文はその入り口にあたります。
💰
損害保険・災害リスク評価
保険会社はハザードマップ・建物分布・人口データを重ね合わせて地域ごとの災害リスクを推定し、保険料設定や再保険の判断に使います。レイヤーの重ね合わせ(原論文 図11)と同じ発想です。
📰
データジャーナリズム
「避難所が足りない地域はどこか」「保育園に入りにくい駅はどこか」といった報道は、公開データ+GISによる空白地帯の可視化が中核。本論文の手順はそのまま調査報道の型になっています。

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

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

Q1. この分析、自分でもできますか?
できます。図1・図2の全国比較は、SSDSE-A(無料公開)と本ページのスクリプトを実行するだけで再現できます。3km圏の空間分析も、jSTAT MAP は誰でも無料で使えるWebサービスなので、自分の学校を中心にエリアを作って圏内人口を集計すれば同じ手順をなぞれます(チャレンジCH4)。避難所の収容可能人数は自分の市のホームページで公開されています。
Q2. 本ページの図1・図2の数値が原論文と少し違うのはなぜですか?
使用したSSDSEの版が違うためです。原論文は2019年当時のSSDSEを、本ページは現行の SSDSE-A-2025(国勢調査2020年・学校統計2023年などを収録)を使っています。それでも「5大都市が平均を大きく上回る」「松山市は平均並み」「さいたま市の医師数が最低」「松山市の医師数は平均より低い」という原論文の読み取りはすべて現行データでも成り立ちました。データの年次が変わっても結論が保たれるかを確かめる、良い頑健性チェックになっています。
Q3. 「3人に1人が避難できない」はどこまで正確な数字ですか?
収容率68.4%(=142,164÷207,828)という計算自体は原論文 表1 の値から正確に出ます。ただしこの数字は「圏内の全員が一斉に指定避難所へ行く」「収容可能人数の定義どおり使える」という前提の上に立っています。実際には在宅避難・車中泊・親戚宅への避難もあれば、建物被災で使えない避難所も出ます。「厳密な予測値」ではなく「収容力が明らかに足りないことを示す規模感」として読むのが正しい姿勢です。
Q4. なぜ原論文の地図をこのページで再現しないのですか?
原論文の図3〜図12は jSTAT MAP 上の対話的な操作(エリア作成・施設プロット・到達圏の手描き)で作られており、スクリプトによる自動再現ができません。数値を捏造してそれらしい地図を作ることは教育用ページとして最も避けるべきことなので、本ページでは地図の内容を表・文章で忠実に要約し、集計値(表1・エリア人数)は「原論文の報告値の可視化」と明示した棒グラフ(図3・図4)で示す方針を取りました。地図そのものは原論文(PDF)を参照してください。
Q5. もっと深く学ぶには何をすればいいですか?
まず jSTAT MAP の公式チュートリアル(e-Stat内)で「エリア作成」「リッチレポート」を触ってみるのが近道です。書籍では『地理空間情報を活かす授業のためのGIS教材』や、施設配置の数理を扱うオペレーションズリサーチの入門書(集合被覆問題・p-メディアン問題)が本論文の発展に直結します。QGIS(無料のGISソフト)と国土数値情報の避難施設データを使えば、道路距離ベースの本格的な到達圏分析にも挑戦できます。

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

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

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

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

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