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

香川県の交通事故発生の要因を
交通違反件数を基に分析する

⏱️ 推定読了時間: 約30分
2019年度 高校生部門 宇川 昇吾・宮本 紫苑・山地 悠介(香川県立観音寺第一高等学校)
🔬 回帰診断🔬 地域比較🔬 変数増減法🔬 重回帰🏷 交通
🔬 手法タグ / 🏷 応用タグ(クリックで同タグの論文をネットワーク検索)
🔬 再現カルテ — 原論文と同じデータ・同じ手法で再現

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

原論文が使ったデータSSDSE-B・警察庁・統計でみる都道府県のすがた 2019
分析単位:都道府県
中核手法:重回帰分析
この教材が使うデータ
原論文(PDF)香川県の交通事故発生の要因を交通違反件数を基に分析する
特別賞/
✅ この教材でできること
  • 分析に使うデータは同梱済みで、ブラウザ上でそのまま読み込める
突合監査の結果、主要データと中核手法はいずれも原論文と一致しています。

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

🏅 論文審査会コメント(審査員はここを評価した)
「社会問題を扱った統計データを用いたレポートとしては、論文の書き方にもう少し工夫が必要かもしれないが、データ解析の流れは自然であり、高く評価された。SSDSEの活用については、不足との指摘もあったが、注目した問題からすればやむを得ないものと認められる。」
出典:統計センター「統計データ分析コンペティション」受賞論文PDF掲載の審査講評。プロの審査員が何を評価し、何を注文したかは論文の読み方の最良の手本になる。
📝 3行で分かる要約

目次

  1. 研究概要と背景
  2. データと変数:SSDSE+警察庁+e-Stat
  3. 香川県と和歌山県:人口は同規模、事故は約2.3倍(図1・図2)
  4. 重回帰分析:交通違反件数から事故件数を説明する(表1・表2・図3)
  5. 回帰診断と「このモデルは妥当ではない」という判断
  6. 考察:一時停止違反への絞り込みと実地調査(図4)
  7. まとめと提言
  8. 📥 データの準備
  9. 💼 実社会での応用
  10. ⚠️ よくある誤解
  11. 📖 用語集
  12. 📐 手法ガイド
  13. 🚀 発展の可能性
  14. 🎯 自分でやってみよう
  15. 🤔 Q&A
  16. 🐍 ブラウザで動かす

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

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

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

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

※ 原論文が使った変数のうち、現行の SSDSE に収録されているのは人口総数(総人口)のみです。警察庁の交通違反取り締まり件数・交通事故件数、e-Statの人口10万人あたり交通事故件数は未収録のため、それらは原論文の報告値の可視化(再計算ではない)として図・表に示します(詳細は「データと変数」参照)。

研究概要と背景:香川県の交通事故はなぜ多いのか

香川県の交通事故状況は全国的に見て長年かなり悪い状況にある。近年は少しずつ改善されてきているものの、それでもなお交通事故件数は多い——この問題意識が本研究の出発点である。実際、人口10万人あたりの交通事故発生件数(e-Stat「統計でみる都道府県のすがた2019」)は香川県が全国6位(633.5件)。一方、香川県と人口の差が最も小さい和歌山県は36位(274.2件)と半分以下である。

人口規模がほぼ同じなのに、事故は約2.3倍。それなら「香川と和歌山で何が違うのか」を調べれば、香川県の事故の多さの要因に迫れるはずだ——本研究は、交通事故と関係の深い交通違反の取り締まり件数を説明変数とする重回帰分析と両県の比較で、この問いに挑む。

研究の問い 香川県の交通事故発生件数が多い要因は何か。人口規模が最も近く、人口10万人あたりの交通事故件数がかなり少ない和歌山県との比較を通して、どの交通違反が交通事故の発生と結びついているのかを明らかにする。
分析の流れ(原論文 2章)
交通事故に関連する
変数を収集
(SSDSE・警察庁等)
変数増減法で
変数選択
重回帰分析
(香川・和歌山)
回帰診断
(残差・正規確率)
データ比較+
実地調査で考察
論文審査会コメント(原論文1頁目より) 「社会問題を扱った統計データを用いたレポートとしては、論文の書き方にもう少し工夫が必要かもしれないが、データ解析の流れは自然であり、高く評価された。SSDSEの活用については、不足との指摘もあったが、注目した問題からすればやむを得ないものと認められる。」

SSDSE(人口総数) 警察庁データ 重回帰分析 変数増減法・回帰診断 県間比較+実地調査

データと変数:SSDSE+警察庁+e-Stat

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

原論文は、SSDSE(教育用標準データセット・独立行政法人統計センター)からは「人口総数(A1101)」を使用し、交通関係の変数は警察庁などの公的データから収集した。

データ出典対象・期間
人口総数(A1101)SSDSE(都道府県・時系列データ)47都道府県
交通違反取り締まり件数
(無免許運転・飲酒運転・最高速度違反・整備不良違反・一時停止違反・駐停車違反)
警察庁香川県・和歌山県
平成14〜29年
総交通事故件数警察庁同上
人口10万人あたり交通事故件数e-Stat「統計でみる都道府県のすがた2019」47都道府県
法令違反別交通事故件数の構成比グーネット(原論文が引用)全国
一時停止の実地観察独自調査(祝日 9:30〜10:30)+地元警察署ヒアリング地元の道路1地点
変数選択について(原論文 3章の記述) 原論文は「回帰分析をする際に変数選択を行い、その結果、分析に使う変数はどちらも6つずつとした」と述べている。重回帰の結果表(表1・表2)に掲載された説明変数速度違反・飲酒運転・整備不良・一時停止・駐停車の5つである。

本ページでの再現可能性(トリアージ)

実データ再現と「報告値の可視化」の区別 原論文の使用データのうち、現行の SSDSE に収録されているのは人口総数のみです。本ページでは以下のルールで図を作成し、各図の注記にも明示しています。新しい数値の捏造は一切していません。
原論文の変数SSDSE収録本ページでの扱い
人口総数○(SSDSE-B「総人口」)実データで再現(図2)
人口10万人あたり交通事故件数×原論文の報告値の可視化(図1)
交通違反取り締まり件数・重回帰の係数×原論文 表1・表2の報告値の可視化(図3)
法令違反別事故構成比(グーネット)×原論文 図16の報告値の可視化(図4)
一時停止違反者数・事故件数の推移、違反件数比較、実地観察の結果×数値が原論文の図から正確に読み取れないため、表・文章で紹介(グラフは原論文 図17〜20参照)
1
香川県と和歌山県:人口は同規模、事故は約2.3倍(図1・図2)

e-Stat「統計でみる都道府県のすがた2019」によると、香川県と和歌山県の総人口は39位・40位とさほど変わらない。しかし人口10万人あたりの交通事故発生件数は香川県が6位(633.5件)、和歌山県が36位(274.2件)と大きく異なる(原論文 3.3節)。

人口10万人あたり交通事故件数 香川県と和歌山県の比較
図1:人口10万人あたりの交通事故件数。原論文 図1の報告値(e-Stat「統計でみる都道府県のすがた2019」)をそのまま可視化したもので、本ページでの再計算ではない。香川県は和歌山県の約2.3倍。
📖 図1の読み方
比べているもの
「件数そのもの」ではなく人口10万人あたりの事故件数。人口の影響を除いた率で比べるのがポイント。
見るべき点
人口順位は39位と40位で隣どうしなのに、事故率は6位と36位。人口では説明できない差=香川県固有の要因がある。

「人口の差が最も小さい県」という対照県の選び方の根拠を、SSDSE-B の実データで確認したのが図2である(原論文 図3「都道府県別人口(20位〜47位)」の再現)。

都道府県別総人口ランキング 20位から47位
図2:都道府県別総人口 20位〜47位(2017年度)。原論文 図3の再現として SSDSE-B-2026 の実データから作成。香川県は39位(96.8万人)、和歌山県は40位(94.8万人)で、人口差はわずか2.0万人——原論文の「39位、40位とさほど変わらない」という記述と一致する。

※ 原論文はこのほかに都道府県別の交通事故数ランキング(原論文 図2)も示している。都道府県別の交通事故件数は SSDSE 未収録のため本ページでは再現せず、グラフは原論文を参照のこと。

やってみよう再現①: SSDSE-Bを読み込み、香川県と和歌山県の人口を確認する
📝 コード
33
34
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
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_B = 'data/raw/SSDSE-B-2026.csv'
os.makedirs(FIG_DIR, exist_ok=True)

df_b = pd.read_csv(DATA_B, encoding='cp932', header=1)
df_b = df_b[df_b['地域コード'].str.match(r'^R\d{5}', na=False)].copy()
df_b = df_b[df_b['地域コード'] != 'R00000'].copy()   # 全国行を除外
df_b['年度'] = df_b['年度'].astype(int)

# 原論文が比較した平成29年(2017年度)の総人口
pop17 = df_b[df_b['年度'] == 2017][['都道府県', '総人口']].copy()
pop17['総人口'] = pd.to_numeric(pop17['総人口'], errors='coerce')
pop17['人口順位'] = pop17['総人口'].rank(ascending=False).astype(int)
pop17 = pop17.sort_values('総人口', ascending=False).reset_index(drop=True)

print('=== SSDSE-B 2017年度(平成29年)の総人口 ===')
for ken in ['香川県', '和歌山県']:
    row = pop17[pop17['都道府県'] == ken].iloc[0]
    print(f"{ken}: {row['総人口']:,.0f} 人(全国 {row['人口順位']} 位)")
diff = abs(pop17.set_index('都道府県').loc['香川県', '総人口']
           - pop17.set_index('都道府県').loc['和歌山県', '総人口'])
print(f"人口差: {diff:,.0f} 人")
▼ 実行結果
=== SSDSE-B 2017年度(平成29年)の総人口 ===
香川県: 968,000 人(全国 39 位)
和歌山県: 948,000 人(全国 40 位)
人口差: 20,000 人
💡 解説
  • header=1 — SSDSE-Bは1行目が変数コード、2行目が日本語の変数名なので、2行目を列名に使います。
  • str.match(r'^R\d{5}') — 地域コードが「R+数字5桁」の行(=47都道府県)だけを残し、全国行(R00000)を除きます。
  • rank(ascending=False) — 総人口の大きい順に順位を付けます。香川県39位・和歌山県40位となり、原論文の「総人口数は39位、40位とさほど変わらない」という記述をSSDSE-Bの実データで確認できました。
💡 Python TIPS df.rank() はデータフレームの列にそのまま順位を振れる便利メソッド。ascending=False で「大きいほど1位」になります。
やってみよう報告値の可視化①: 図1 人口10万人あたり交通事故件数
📝 コード
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
# 出典: e-Stat「統計でみる都道府県のすがた2019」(原論文 3.3節・図1の報告値)
# ※ SSDSE には交通事故件数が未収録のため、原論文の報告値をそのまま描く(再計算ではない)
jiko_10man = {'香川県': 633.5, '和歌山県': 274.2}   # 件 / 人口10万人
jiko_rank = {'香川県': '全国6位', '和歌山県': '全国36位'}

fig1, ax = plt.subplots(figsize=(6.5, 5))
colors = ['#C62828', '#1565C0']
bars = ax.bar(jiko_10man.keys(), jiko_10man.values(), color=colors, width=0.55)
for bar, (ken, v) in zip(bars, jiko_10man.items()):
    ax.text(bar.get_x() + bar.get_width()/2, v + 12,
            f'{v:.1f}\n{jiko_rank[ken]})', ha='center', fontsize=12, fontweight='bold')
ax.set_ylabel('人口10万人あたり交通事故件数(件)')
ax.set_ylim(0, 780)
ax.set_title('人口10万人あたりの交通事故件数(原論文 図1の報告値)\n'
             '出典: e-Stat「統計でみる都道府県のすがた2019」', fontsize=12)
ax.text(0.5, -0.13, '※ 原論文の報告値の可視化(本ページでの再計算ではない)',
        transform=ax.transAxes, ha='center', fontsize=9, color='#777')
fig1.savefig(os.path.join(FIG_DIR, '2019_H5_2_fig1.png'), bbox_inches='tight')
plt.close(fig1)
print('図1 saved:', os.path.join(FIG_DIR, '2019_H5_2_fig1.png'))
print(f"香川県 {jiko_10man['香川県']}件 は 和歌山県 {jiko_10man['和歌山県']}件 の "
      f"約{jiko_10man['香川県']/jiko_10man['和歌山県']:.1f}倍")
▼ 実行結果
図1 saved: html/figures/2019_H5_2_fig1.png
香川県 633.5件 は 和歌山県 274.2件 の 約2.3倍
💡 解説
  • 人口10万人あたり交通事故件数はSSDSEに未収録のため、原論文が e-Stat「統計でみる都道府県のすがた2019」から引いた報告値(633.5件・274.2件)を辞書に直接書いて描いています。本ページでの再計算ではありません。
  • 図の注記にも「原論文の報告値の可視化」と明記しました。自分で計算していない数値をグラフにするときは、必ず出典と「再計算ではない」ことを図中に書く——これが誠実なデータの扱い方です。
💡 Python TIPS zip(bars, jiko_10man.items()) — 複数のリストを同時にループしたいときは zip()。棒とラベルの対応づけに便利です。
やってみよう再現②: 図2 都道府県別総人口ランキング(SSDSE-B実データ)
📝 コード
 92
 93
 94
 95
 96
 97
 98
 99
100
101
102
103
104
105
106
107
108
109
# 原論文 図3「都道府県別人口(20位〜47位)」の再現
sub = pop17.iloc[19:].copy()          # 20位〜47位
sub = sub.sort_values('総人口')       # 少ない順に下から

bar_colors = ['#C62828' if k == '香川県' else '#1565C0' if k == '和歌山県'
              else '#B0BEC5' for k in sub['都道府県']]
fig2, ax = plt.subplots(figsize=(8, 9))
ax.barh(sub['都道府県'], sub['総人口'] / 1e4, color=bar_colors)
for y, (k, v, r) in enumerate(zip(sub['都道府県'], sub['総人口'], sub['人口順位'])):
    if k in ('香川県', '和歌山県'):
        ax.text(v / 1e4 + 2, y, f'{r}{v/1e4:.0f}万人',
                va='center', fontsize=10, fontweight='bold')
ax.set_xlabel('総人口(万人・2017年度)')
ax.set_title('都道府県別総人口 20位〜47位(原論文 図3の再現)\n'
             'SSDSE-B-2026 の実データから作成', fontsize=12)
fig2.savefig(os.path.join(FIG_DIR, '2019_H5_2_fig2.png'), bbox_inches='tight')
plt.close(fig2)
print('図2 saved:', os.path.join(FIG_DIR, '2019_H5_2_fig2.png'))
▼ 実行結果
図2 saved: html/figures/2019_H5_2_fig2.png
💡 解説
  • 原論文 図3「都道府県別人口(20位〜47位)」を、SSDSE-B-2026の実データで再現しています。pop17.iloc[19:] で20位以下を切り出します。
  • 香川県(赤)と和歌山県(青)がランキング上で隣り合う(39位・40位)ことが一目で分かります。「人口の差が最も小さい県」という対照県の選び方の根拠がこの図です。
💡 Python TIPS リスト内包表記 [A if cond else B for x in xs] で「条件に応じた色のリスト」を1行で作れます。
2
重回帰分析:交通違反件数から事故件数を説明する(表1・表2・図3)

原論文は、警察庁データから選出した速度違反・飲酒運転・整備不良・一時停止・駐停車の各取り締まり件数(平成14〜29年)を説明変数交通事故発生件数目的変数として、香川県・和歌山県それぞれで重回帰分析を行った。p値0.05未満を統計的に有意とみなす(原論文 4.1節)。

交通事故件数 = β₁·速度違反 + β₂·飲酒運転 + β₃·整備不良 + β₄·一時停止 + β₅·駐停車 + 定数

表1 香川県:交通事故発生数を目的変数とした結果(原論文の報告値)

変数回帰係数標準誤差t値p値判定(p<0.05)
速度違反−0.0120.056−0.2210.829有意でない
飲酒運転2.1340.9642.2140.051有意でない(僅差)
整備不良3.6360.5786.2940.000有意(正)
一時停止−0.5170.072−7.2050.000有意だが
駐停車−0.6220.198−3.1490.010有意だが

重決定R2 = 0.96、補正R2 = 0.94(原論文 表1)

表2 和歌山県:交通事故発生数を目的変数とした結果(原論文の報告値)

変数回帰係数標準誤差t値p値判定(p<0.05)
速度違反0.1120.0671.6860.123有意でない
飲酒運転3.3881.0153.3370.008有意(正)
整備不良3.4470.6625.2100.000有意(正)
一時停止−0.3150.170−1.8510.094有意でない
駐停車−0.8450.320−2.6400.025有意だが

重決定R2 = 0.91、補正R2 = 0.865(原論文 表2)

重回帰の回帰係数の比較(香川県・和歌山県)
図3:重回帰の回帰係数の比較(* p<0.05、** p<0.01)。原論文 表1・表2の報告値の可視化であり、再計算ではない(警察庁の違反件数データは SSDSE 未収録のため)。整備不良・飲酒運転は両県とも正、一時停止・駐停車は両県とも負という構図。
📖 図3の読み方
正の係数
その違反の取り締まり件数が多い年ほど事故も多い(整備不良・飲酒運転)。
負の係数
その違反の取り締まり件数が多い年ほど事故が少ないことになる(一時停止・駐停車)。「違反が増えると事故が減る」ことになり、理屈に合わない。
星印
* は p<0.05、** は p<0.01。香川では「一時停止」が有意に負——これが次節の妥当性判断につながる。
やってみよう報告値の整理: 原論文 表1・表2 をDataFrameにする
📝 コード
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
# 目的変数: 交通事故発生件数(平成14〜29年の年次データ)
# 説明変数: 各交通違反の取り締まり件数(警察庁データ)
# ※ 警察庁データは SSDSE 未収録のため係数は原論文の報告値(再計算ではない)
variables = ['速度違反', '飲酒運転', '整備不良', '一時停止', '駐停車']

kagawa = pd.DataFrame({
    '回帰係数': [-0.012, 2.134, 3.636, -0.517, -0.622],
    '標準誤差': [0.056, 0.964, 0.578, 0.072, 0.198],
    't値':     [-0.221, 2.214, 6.294, -7.205, -3.149],
    'p値':     [0.829, 0.051, 0.000, 0.000, 0.010],
}, index=variables)

wakayama = pd.DataFrame({
    '回帰係数': [0.112, 3.388, 3.447, -0.315, -0.845],
    '標準誤差': [0.067, 1.015, 0.662, 0.170, 0.320],
    't値':     [1.686, 3.337, 5.210, -1.851, -2.640],
    'p値':     [0.123, 0.008, 0.000, 0.094, 0.025],
}, index=variables)

print('=== 表1 香川県(原論文の報告値, R2=0.96, 補正R2=0.94)===')
print(kagawa)
print()
print('=== 表2 和歌山県(原論文の報告値, R2=0.91, 補正R2=0.865)===')
print(wakayama)
print()
print('p<0.05で有意なのに回帰係数が負の変数(香川):',
      list(kagawa[(kagawa['p値'] < 0.05) & (kagawa['回帰係数'] < 0)].index))
▼ 実行結果
=== 表1 香川県(原論文の報告値, R2=0.96, 補正R2=0.94)===
       回帰係数   標準誤差     t値     p値
速度違反 -0.012  0.056 -0.221  0.829
飲酒運転  2.134  0.964  2.214  0.051
整備不良  3.636  0.578  6.294  0.000
一時停止 -0.517  0.072 -7.205  0.000
駐停車  -0.622  0.198 -3.149  0.010

=== 表2 和歌山県(原論文の報告値, R2=0.91, 補正R2=0.865)===
       回帰係数   標準誤差     t値     p値
速度違反  0.112  0.067  1.686  0.123
飲酒運転  3.388  1.015  3.337  0.008
整備不良  3.447  0.662  5.210  0.000
一時停止 -0.315  0.170 -1.851  0.094
駐停車  -0.845  0.320 -2.640  0.025

p<0.05で有意なのに回帰係数が負の変数(香川): ['一時停止', '駐停車']
💡 解説
  • 警察庁の交通違反取り締まり件数はSSDSEに未収録のため、回帰そのものは再計算できません。そこで原論文 表1・表2の報告値をそのままDataFrameに転記して整理しています。
  • 最後の1行がこの論文の核心です。p<0.05で有意なのに係数が負の変数(一時停止・駐停車)を条件抽出しています。「違反が増えると事故が減る」ことになり、理屈に合いません。
💡 Python TIPS df[(df['A'] < 0.05) & (df['B'] < 0)] — 複数条件の行フィルタは &(かつ)・|(または)で。各条件は必ず括弧で囲みます。
やってみよう報告値の可視化②: 図3 回帰係数の比較(香川 vs 和歌山)
📝 コード
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
def stars(p):
    return '**' if p < 0.01 else '*' if p < 0.05 else ''

y = np.arange(len(variables))
h = 0.38
fig3, ax = plt.subplots(figsize=(8.5, 5.5))
ax.barh(y + h/2, kagawa['回帰係数'], height=h, color='#C62828', label='香川県')
ax.barh(y - h/2, wakayama['回帰係数'], height=h, color='#1565C0', label='和歌山県')
for yi, v in enumerate(variables):
    ck, cw = kagawa.loc[v], wakayama.loc[v]
    ax.text(ck['回帰係数'] + (0.08 if ck['回帰係数'] >= 0 else -0.08), yi + h/2,
            f"{ck['回帰係数']:+.3f}{stars(ck['p値'])}", va='center',
            ha='left' if ck['回帰係数'] >= 0 else 'right', fontsize=10)
    ax.text(cw['回帰係数'] + (0.08 if cw['回帰係数'] >= 0 else -0.08), yi - h/2,
            f"{cw['回帰係数']:+.3f}{stars(cw['p値'])}", va='center',
            ha='left' if cw['回帰係数'] >= 0 else 'right', fontsize=10)
ax.axvline(0, color='#555', lw=1)
ax.set_yticks(y)
ax.set_yticklabels(variables)
ax.invert_yaxis()
ax.set_xlabel('回帰係数(目的変数: 交通事故発生件数)')
ax.set_xlim(-1.8, 4.8)
ax.legend(loc='lower right')
ax.set_title('重回帰の回帰係数の比較(原論文 表1・表2の報告値の可視化)\n'
             '* p<0.05, ** p<0.01 / 警察庁データはSSDSE未収録のため再計算ではない',
             fontsize=11)
fig3.savefig(os.path.join(FIG_DIR, '2019_H5_2_fig3.png'), bbox_inches='tight')
plt.close(fig3)
print('図3 saved:', os.path.join(FIG_DIR, '2019_H5_2_fig3.png'))
▼ 実行結果
図3 saved: html/figures/2019_H5_2_fig3.png
💡 解説
  • 香川県(赤)と和歌山県(青)の回帰係数を変数ごとに並べた横棒グラフです。整備不良・飲酒運転は両県とも正一時停止・駐停車は両県とも負という構図が一目で分かります。
  • stars() 関数で p<0.05 に「*」、p<0.01 に「**」を付けています。有意なのに負(香川の一時停止**・駐停車*)が「モデルは妥当でない」と判断された理由です。
💡 Python TIPS ax.barh(y + h/2, ...) — y座標を少しずらして2本の横棒を並べると「グループ横棒グラフ」になります。
3
回帰診断と「このモデルは妥当ではない」という判断

原論文は回帰の後、残差のグラフを確認して等分散性・独立性・正規性外れ値をチェックした(原論文 4.2節)。説明変数ごとの残差グラフ(香川:図4〜8、和歌山:図10〜14)と正規確率グラフ(香川:図9、和歌山:図15)の計12枚を描き、「等分散性、独立性、正規性が確認された。また、外れ値はないと判断した」と報告している。これらのグラフは原論文を参照(残差の元データが公開されていないため本ページでは再現しない)。

それでも「妥当ではない」——原論文の判断(4.2節) 「しかし、結果には回帰係数が負であるものが見られた。交通違反件数が増えれば、交通事故発生件数が減るというのはおかしいため、この回帰モデルは妥当ではなかったと考えた。

ここがこの論文の最大の読みどころである。 = 0.96(香川)という非常に高い当てはまりで、残差診断も全て通っている。それでも「係数の符号が現実の理屈に合わない」という一点で、モデルを妥当と認めなかった。統計量だけでなくドメイン知識(現実の交通の常識)との整合性で最終判断する姿勢は、審査会が「データ解析の流れは自然」と高く評価した理由の一つと考えられる。

なぜ負の係数が出たのか(本ページによる教育的補足——原論文の記述ではない)
  • 小標本:平成14〜29年の年次データは n=16。そこに説明変数5つは「n > 10×変数数」の目安を大きく下回り、推定が不安定になりやすい。
  • 共通トレンド:この期間、交通事故も多くの取り締まり件数も年々変化しており、時系列の水準どうしの回帰はトレンドを拾ってが高く出やすい(見せかけの回帰)。
  • 取り締まり件数の性質:違反の「取り締まり件数」は、違反の実態だけでなく取り締まりの強さも反映する(内生性)。事故が減った時期に一時停止の取り締まりが強化されていれば、負の相関が生じうる。
  • 多重共線性違反件数どうしは連動しやすく、係数の符号が入れ替わる現象の典型的な原因になる。
4
考察:データと現場観察で「一時停止違反」に絞り込む(図4)

回帰モデルからは結論を出せなくなった原論文は、集めた警察庁データとグーネットのデータに立ち返り、複数の証拠の突き合わせで要因を絞り込んでいく(原論文 5〜6章)。

手がかり①:両県の違反件数比較(原論文 図20)

平成29年の香川県と和歌山県の違反件数を比べると、両県とも速度違反件数と一時停止違反件数が多かった(グラフは原論文 図20参照)。候補はこの2つに絞られる。

手がかり②:事故原因ランキングに「速度違反」が現れない(原論文 図16)

法令違反別交通事故件数の構成比
図4:法令違反別の交通事故件数の構成比。原論文 図16の報告値(グーネット調べ、原論文が引用)の可視化であり、再計算ではない。安全不確認31%・わき見運転16%・動静不注視11%・漠然運転9%・運転操作不適6%・その他27%。

安全不確認(31%)がトップである一方、「速度違反」は上位項目に見られず、その他に属していると考えられる。ここから原論文は「速度違反は交通事故への結びつきが一時停止違反ほどではない」と判断した。一時停止を怠る行動は、まさに「安全不確認」型の事故に直結する。

手がかり③:推移データ(原論文 図17・図18)

原論文の図内容読み取れたこと(原論文の記述)
図17一時停止違反者数の推移(平成14〜29年)近年、香川県の一時停止違反者は和歌山県よりも多く、増加傾向にある
図18香川県の交通事故発生件数の推移(平成14〜30年)香川県の交通事故発生件数は減少傾向にある

※ 年ごとの数値は原論文の図から正確には読み取れないため、本ページでは表・文章で紹介する。グラフは原論文 図17・図18を参照。

これらを合わせて原論文は「香川県と和歌山県の交通事故件数で差が生じるのは、一時停止違反が要因である」と考えた。その背景として、飛び出しの危険性や一時停止の重要性の理解不足、見通しの悪い曲がり角での「横からくる車はいないだろう」という思い込みを挙げている。

手がかり④:自分たちの目で確かめる——実地観察(原論文 図19)

独自の観察調査 祝日の9時半〜10時半に実際の道路で、どれほどの車が一時停止をしているかを観察(結果のグラフは原論文 図19参照)。きちんと一時停止をしている車は少なく、止まっている場合のほとんどは「目の前の道路を他の車が通っているとき」だった。ここから原論文は、実際の一時停止違反は取り締まり件数(データ)の数十倍ほどあるのではないかと推測している。

手がかり⑤:地元警察署へのヒアリング

地元の警察署では、交通違反を基に分析したことについて「特に問題はないと思う」との評価に加え、「一時停止違反件数は多いし、交通事故につながりやすい」「速度違反による事故は一時停止によるものより少ない」と教わり、研究の方向性が現場の実感とも一致することを確認した。「年齢別に絞って交通事故の原因を考えてもいいと思う」という発展の助言も得ている。

提言:呼びかけは「具体的に、丁寧に」

研究当時の香川県は交通死亡事故が相次ぎ緊急事態宣言を出しており、2019年9月13日の朝には知事らが高松市の小学校前で交通安全を呼びかけた。しかし原論文は、「交通ルールを厳守しましょう」という一般的な呼びかけだけでは実行に至らない人が多いと指摘し、次のような提案をする。

原論文の提案する呼びかけ 「たとえ車が通っていなくても、ばからしいと思わずに完全な一時停止をお願いいたします」——一時停止を守ることによる香川県の交通事故発生件数への影響は大きいとわかったので、具体的な内容をより丁寧な言葉で伝えたほうが、実行に至らない人を減らすことができ、さらに良い対策になる。
やってみよう報告値の可視化③: 図4 法令違反別交通事故の構成比
📝 コード
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
# 出典: グーネット「交通事故・交通死亡事故の発生原因は何?」(原論文が引用)
gense = {'安全不確認': 31, 'わき見運転': 16, '動静不注視': 11,
         '漠然運転': 9, '運転操作不適': 6, 'その他': 27}

labels = list(gense.keys())
vals = list(gense.values())
cols = ['#C62828' if k == '安全不確認' else '#90A4AE' if k == 'その他'
        else '#1565C0' for k in labels]

fig4, ax = plt.subplots(figsize=(8, 5))
ax.barh(labels, vals, color=cols)
for yi, v in enumerate(vals):
    ax.text(v + 0.5, yi, f'{v}%', va='center', fontsize=11, fontweight='bold')
ax.invert_yaxis()
ax.set_xlabel('交通事故件数に占める割合(%)')
ax.set_xlim(0, 36)
ax.set_title('法令違反別 交通事故件数の構成比(原論文 図16の報告値の可視化)\n'
             '出典: グーネット(原論文が引用)/「速度違反」は上位項目に現れない', fontsize=11)
fig4.savefig(os.path.join(FIG_DIR, '2019_H5_2_fig4.png'), bbox_inches='tight')
plt.close(fig4)
print('図4 saved:', os.path.join(FIG_DIR, '2019_H5_2_fig4.png'))
print('安全不確認(31%)がトップ。一時停止を怠る行動は「安全不確認」型の事故に直結する。')
▼ 実行結果
図4 saved: html/figures/2019_H5_2_fig4.png
安全不確認(31%)がトップ。一時停止を怠る行動は「安全不確認」型の事故に直結する。
💡 解説
  • 原論文 図16(グーネットの事故原因ランキング)の報告値の可視化です。安全不確認が31%でトップ、一方「速度違反」は上位項目に現れません。
  • 原論文はここから「速度違反は事故への結びつきが一時停止違反ほどではない」と推論し、候補を一時停止違反に絞り込みました。一時停止を怠る行動はまさに「安全不確認」型の事故に直結します。
💡 Python TIPS ax.invert_yaxis() — 横棒グラフは既定では下から積み上がるので、上から大きい順に見せたいときは軸を反転します。

まとめと提言

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

  1. 人口は同規模、事故は約2.3倍:総人口は香川県39位・和歌山県40位とほぼ同じなのに、人口10万人あたりの交通事故件数は633.5件(全国6位)対274.2件(36位)。
  2. 重回帰モデルは「妥当ではない」: = 0.96(香川)・0.91(和歌山)と当てはまりは高いが、一時停止・駐停車の係数が負となり、現実の理屈に合わないためモデルとしては採用しなかった。
  3. 和歌山県では飲酒運転(p=0.008)・整備不良(p=0.000)・駐停車(p=0.025)が有意(ただし駐停車は負)。
  4. 複数の証拠から一時停止違反に絞り込み:違反件数比較(図20)・事故原因構成比(図16)・推移(図17・18)・実地観察(図19)・警察ヒアリングの突き合わせにより、一時停止違反が香川県の交通事故の多さに深く関わっていると結論。
  5. 提言:一時停止違反多発地域での取り締まり厳重化、交通安全教育の重点化、そして「車が通っていなくても完全な一時停止を」という具体的で丁寧なメディアでの呼びかけ。

研究の限界(原論文自身の記述)

解釈上の注意
  • 数値上のデータをもとにした考察であり、県民性を全く考慮していない。地域別の平均年齢や地理的な要因によって事故が多発している可能性もあり、何が最も香川県の交通事故の多発に関わっているかを断言できる状態には至らなかった
  • 今後の課題として、年齢別の要因分析と「回帰分析の、特に変数選択に関する知識」の習得を挙げている。
  • 原論文は「回帰分析の結果がおかしいことに気付くのが遅く、回帰分析の結果から考察できなかったことが残念に思った」と失敗を隠さず明記している。
教育的価値(この論文から学べること)
  • 高いに飛びつかない:当てはまりの良さと妥当性は別物。係数の符号が現実の理屈と矛盾したら、立ち止まって疑う。
  • 対照県との比較:「人口の差が最も小さい県」を比較対象に選ぶことで、人口では説明できない要因を浮かび上がらせた。
  • 統計×現場:回帰が使えなくても、公的データの突き合わせ・実地観察・ヒアリングで結論を組み立て直せる。失敗の過程も含めて報告する誠実さが評価につながった。

参考文献(原論文 8章)

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

分析スクリプト(2019_H5_2_shorei.py)
データ出典備考
SSDSE-B-2026(総人口)独立行政法人統計センター実データを使用(図2)
交通違反取り締まり件数・交通事故件数警察庁(原論文が使用)SSDSE未収録。原論文の報告値のみ(図3・表1・表2)
人口10万人あたり交通事故件数e-Stat「統計でみる都道府県のすがた2019」(原論文が使用)SSDSE未収録。原論文の報告値のみ(図1)
法令違反別事故構成比グーネット(原論文が引用)原論文の報告値のみ(図4)

図1・図3・図4および本文の回帰係数・p値はすべて原論文の報告値であり、本ページで再計算したものではない。図2のみ SSDSE-B-2026 の実データから作成。数値の捏造・合成データは一切使用していない。

教育用解説 | 2019年 統計データ分析コンペティション 特別賞 [高校生の部] | 香川県の交通事故発生の要因を交通違反件数を基に分析する

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

統計分析の解釈で初心者がやりがちな勘違いをまとめます。特に「相関因果の混同」「p値の過信」は研究現場でもよく起きる落とし穴です。本文を読む前にも、読んだ後にも、目を通してみてください。本論文はまさに「R²が高い(0.96)のに妥当でないモデル」「変数増減法の落とし穴」「係数の符号の異常」を実体験した好例です。

❌ 「相関がある=因果関係がある」ではない
疑似相関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に近いほどモデルの説明力が高い。
変数増減法
説明変数の追加と削除を繰り返して「良い」変数の組み合わせを探すステップワイズ変数選択の一種。本論文が重回帰の変数選択に使用した。便利だが再現性の問題も指摘される(「よくある誤解」参照)。
残差
実測値と回帰モデルの予測値との差。残差のグラフを描いて等分散性・独立性・正規性外れ値をチェックするのが回帰診断の基本手順(原論文 図4〜15)。
補正R²
説明変数を増やすほどが自動的に上がる問題を修正した決定係数。本論文は重決定R2(香川0.96・和歌山0.91)とともに補正R2(0.94・0.865)を報告している。

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

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

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

🔍 p値有意確率)とは
何?
「もし本当に効果がなかったとしたら、今回の結果(またはもっと極端な結果)が偶然起きる確率」のこと。
なぜ必要?
帰無仮説(「効果なし」の仮定)のもとで検定統計量の分布から計算する。
何がわかる?
「この関係は偶然ではなく、統計的に意味がある」と主張するための客観的な根拠になる。
読み方
p < 0.05(5%未満)を「統計的に有意」と判断するのが慣例で、本論文もこの基準を使う。ただし「p値が小さい=効果が大きい」ではない。効果量係数の大きさ)や符号の妥当性とセットで判断する。
📊 決定係数 R²補正R²とは
何?
回帰モデルが目的変数のばらつきの何割を説明できるかを示す指標(0〜1)。補正R²は説明変数の数によるかさ上げを修正したもの。
なぜ必要?
モデルの「当てはまりの良さ」を1つの数値で要約できる。変数の数が違うモデル同士の比較には補正R²を使う。
何がわかる?
本論文では香川 R²=0.96/補正R²=0.94、和歌山 R²=0.91/補正R²=0.865。
読み方
高い R² はモデルの正しさを保証しない。本論文は R²=0.96 でも係数の符号の異常を理由にモデルを棄却した。特に時系列データでは共通トレンドだけで R² が0.9を超えることがある。

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

📈 重回帰分析
何?
複数の説明変数(ここでは5種類の交通違反件数)が1つの目的変数(交通事故件数)にどれだけ影響するかを同時に推定する手法。
どう使う?
y = β₁x₁ + β₂x₂ + … + 定数 という式を最小二乗法でフィットさせ、各係数の符号・大きさ・p値を読む。
何がわかる?
複数の違反が混在するなかで「どの違反が事故と結びついているか」を一度に検証できる。
結果の読み方
係数が正なら「その違反が多い年ほど事故も多い」。p < 0.05 で統計的に有意。
⚠️ 注意点
(1) 高いでも係数の符号が理屈に合わなければ妥当としない——本論文の最大の教訓。(2) 小標本:年次データ n=16 に説明変数5つは「n > 10×変数数」の目安を大きく下回り、推定が不安定になる。(3) 時系列の水準どうしの回帰は共通トレンドを拾って見せかけの相関(見せかけの回帰)が出やすい。差分・変化率への変換を検討する。(4) 違反件数どうしは連動しやすく多重共線性による符号逆転が起こりうる(VIFで確認)。
🔀 変数増減法(ステップワイズ変数選択)
何?
説明変数の追加と削除を繰り返し、統計的な基準で「良い」変数の組み合わせを探す自動的な変数選択法。
どう使う?
候補変数(無免許運転・飲酒運転・最高速度違反・整備不良・一時停止・駐停車など)から出発し、基準を改善しない変数を外し、改善する変数を加える操作を収束するまで繰り返す。
何がわかる?
候補が多いとき、モデルに残す変数の組み合わせを機械的に絞り込める。本論文はこの方法で分析に使う変数を決めた。
結果の読み方
「残った変数=重要な変数」と機械的に解釈しないこと。選ばれた変数の組は出発点や基準によって変わりうる。
⚠️ 注意点
(1) p値を繰り返し見る選択は偶然有意な変数を拾いやすい(p-hacking の温床)。(2) 実行順序・基準(AIC か p値か)で最終モデルが変わり、再現性が低い(3) 理論・先行研究・ドメイン知識による事前の絞り込みと必ず併用する。原論文自身も「変数選択に関する知識を身に着けることが重要」と反省点に挙げている。
🩺 回帰診断(残差プロット・正規確率プロット)
何?
回帰モデルの前提(等分散性・独立性・正規性外れ値なし)が満たされているかを、残差(実測値−予測値)のグラフで確認する手順。
どう使う?
説明変数ごとに残差を縦軸にした散布図を描き、パターン(漏斗型・曲線・飛び値)がないか目視する。正規確率プロットで点が直線に乗るかを見る(原論文 図4〜15)。
何がわかる?
前提が崩れていれば p値や信頼区間が信用できないことが分かる。本論文は12枚のグラフで「等分散性・独立性・正規性を確認、外れ値なし」と判断した。
結果の読み方
残差が0の周りに構造なく散らばっていれば合格。漏斗型は等分散性の崩れ、波形は独立性の崩れのサイン。
⚠️ 注意点
残差診断を全部通っても「良いモデル」とは限らない。診断が調べるのは統計的な前提だけで、係数の符号や大きさが現実の理屈と整合するかは調べてくれない。本論文のように「診断は合格、しかし符号が不自然」という事態はあり得る。ドメイン知識との突き合わせを診断の最終ステップに組み込むこと。
⚖️ 対照県との比較(コントロール比較)
何?
条件(ここでは人口規模)が近い地域を「比較対象」に選び、注目する結果(事故率)の差から要因を絞り込む考え方。
どう使う?
本論文は「香川県と人口の差が最も小さく、人口10万人あたり事故件数がかなり少ない」和歌山県を選んだ。同じ変数で両県それぞれに回帰を行い、結果や違反件数の構成を比べる。
何がわかる?
人口では説明できない差=地域固有の要因(本論文では一時停止違反の多さ)が浮かび上がる。
結果の読み方
比較で見つかるのは「有力な候補」であって因果の証明ではない。差を生む他の説明(対立仮説)を必ず考える。
⚠️ 注意点
人口が近くても、地形・気候・道路構造・自動車依存度・年齢構成などは揃わない。原論文自身も県民性・平均年齢・地理的要因を考慮できていないことを限界に挙げ、「断言できる状態には至らなかった」と明記している。対照の選び方を変えても結論が保たれるか(頑健性)を確かめるとより強い議論になる。
🚶 実地観察・ヒアリング調査(フィールドワーク)
何?
統計データだけでは分からない現場の実態を、自分の目での観察や関係者への聞き取りで確かめる方法。
どう使う?
本論文は祝日の9:30〜10:30に道路脇で一時停止の実施状況を数え(原論文 図19)、地元警察署で警察官に聞き取りを行った。
何がわかる?
「取り締まり件数」という統計が氷山の一角であること(実際の違反は数十倍ではないか)、統計から立てた仮説が現場の実感と一致すること、を確認できた。
結果の読み方
観察結果は統計の代わりではなく補強証拠。数値データと観察・証言が同じ方向を指すとき、結論の説得力が増す。
⚠️ 注意点
1地点・1時間・祝日の観察は代表性が限られる。場所(見通し・交通量)や時間帯を変えると結果が変わる可能性がある。観察の条件(日時・場所・数え方)を必ず記録・報告すること。ヒアリングは相手の発言を正確に記録し、自分に都合の良い部分だけ引用しない。

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

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

① データの細分化:年齢別・地域別へ
結果 X
県レベルの年次データ(平成14〜29年)で一時停止違反が有力な要因と示唆された。警察官からも「年齢別に絞って考えてもいい」と助言を得た。
新仮説 Y
年齢層(若年・高齢)や市町村によって、事故と結びつく違反の種類が異なるのではないか。
課題 Z
(1)香川県警の交通事故統計(年齢層別・市町村別)を収集する。(2)年齢層別に違反・事故の関係を比較する。(3)一時停止違反の多発地点マップを作り、取り締まり重点化の候補地を提案する。
② 手法の発展:符号の異常を解消する回帰へ
結果 X
時系列の水準どうしの重回帰では、一時停止・駐停車の係数が不自然な負になった。
新仮説 Y
率への変換(人口10万人あたり)、前年差分・変化率への変換、または47都道府県×年のパネルデータ固定効果モデルを使えば、共通トレンドや県固有の要因による偏りを減らせるのではないか。
課題 Z
(1)変数を前年差分に変換して回帰し、係数の符号が変わるか確認する。(2)VIFで違反件数どうしの多重共線性を診断する。(3)47都道府県のパネルデータで固定効果モデルを推定し、香川県固有の効果を取り出す。
③ 政策提言・実践への応用:啓発の効果検証
結果 X
「車が通っていなくても完全な一時停止を」という具体的で丁寧な呼びかけを提案した。
新仮説 Y
具体的な呼びかけは、一般的な「交通ルールを守りましょう」より一時停止率を高める効果があるのではないか。
課題 Z
(1)啓発を実施するモデル地区と実施しない対照地区を設定する。(2)実施前後の一時停止率を両地区で観察し、差分の差分(DiD)の考え方で効果を測る。(3)効果があれば県・警察への提案資料にまとめる。

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

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

★☆☆☆☆ 入門
CH1. スクリプトを実行して図1〜図4を再現する
付属の Python スクリプトをそのまま実行し、4枚の図を出力してください。
ポイント: どの図が「SSDSE-Bの実データ」で、どの図が「原論文の報告値の可視化」かをコード内のコメントで確認する。香川県39位・和歌山県40位が実データで再現されることを確かめる。
★★☆☆☆ 初級
CH2. 年度を変えて人口ランキングを描き直す
スクリプトの df_b['年度'] == 2017 を 2012 年や 2022 年に変えて図2を描き直してください。
ポイント: 香川県と和歌山県の順位や人口差は年度によって変わるか? 「人口の差が最も小さい県」という対照県の選択は他の年度でも成り立つか確認する。
★★★☆☆ 中級
CH3. e-Statから事故データを取得してランキングを自作する
e-Stat から都道府県別の交通事故件数を取得し、SSDSE-Bの総人口と組み合わせて「人口10万人あたり交通事故件数」を自分で計算、47都道府県ランキング(原論文 図2に相当)を作ってください。
ポイント: 最新年で計算すると、香川県は今も上位か? 原論文当時(6位・633.5件)からの変化を考察する。
★★★★☆ 上級
CH4. 差分に変換して「負の係数」問題を検証する
警察庁・県警の公開統計から違反件数と事故件数の時系列を集め、水準のまま回帰した場合と前年差分・変化率に変換して回帰した場合で、係数の符号やがどう変わるか比べてください。VIFによる多重共線性の診断も行うこと。
ポイント: 本論文で起きた「有意なのに負」という現象を、自分のデータで説明できるようになるのが目標。
★★★★★ 発展
CH5. 自分の県で「対照県比較」を一式やってみる
自分の住む県について、人口規模が最も近い県を SSDSE-B から探し、気になる社会指標(事故・ごみ・医療など)の差を「比較 → 回帰 → 診断 → 現場観察」という本論文の枠組みで分析してください。
ポイント: 統計だけで終わらせず、本論文のように実地観察やヒアリングを1つ組み込む。モデルが「妥当でない」と分かったときの立て直し方まで含めてレポートにまとめる。
💡 ヒント: 詰まったら本サイトの他の論文(同じ手法を使っている)のスクリプトをコピーして組み合わせるのが効率的です。手法ガイド・用語集も参考に。

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

本論文で学んだ手法は、研究の世界だけでなく、行政・企業・NPO の現場でも様々に活用されています。具体的なシーンを紹介します。

🏛️
行政の政策立案
都道府県警・自治体の交通安全担当は、本論文と同様に違反・事故データの分析で「どの違反を・どの地域で・どの年齢層に」重点的に対策するかを決めています。 香川県が2019年に出した交通死亡事故多発の緊急事態宣言も、こうしたデータ監視の仕組みの上にあります。
🏢
企業のマーケティング・出店戦略
小売チェーン・サービス業の出店戦略では、地域特性(人口構成、所得、ライフスタイル)と売上の関係を本論文と同じ手法で分析します。 ECサイトでも顧客セグメント分析・購買要因分析に類似手法が使われます。
🏥
医療・公衆衛生
感染症の流行予測、医療資源配分の最適化、健康格差の地域要因分析などで、本論文の統計手法は標準的に使われています。 WHO・厚労省レベルの政策評価でも同じ手法が活躍しています。
📊
メディア・ジャーナリズム
新聞・テレビの社会調査記事、選挙予測、世論調査の分析でも、本論文と同じ手法(回帰分析・クラスタリングなど)が使われています。 データジャーナリズムの記事はこの種の分析が中核です。
🎓
学術研究(隣接分野)
経済学・社会学・公衆衛生学・教育学・地理学などの実証研究では、本論文と同じ手法が日常的に使われます。 専門誌に掲載される論文の8割以上が、こうした統計手法に基づいて結論を出しています。
💰
金融・保険業界
与信判断(融資審査)、保険料の地域別設定、不動産価格予測などで、本論文と同様のモデリング手法が広く活用されています。 統計分析の能力は金融業界の必須スキルになっています。

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

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

Q1. この分析、自分でもできますか?
一部はできます。人口の確認とランキング(図2)は SSDSE-B と本ページのスクリプトだけで再現できます。ただし核心部分の重回帰に必要な交通違反取り締まり件数・交通事故件数(平成14〜29年)は SSDSE 未収録のため、警察庁・県警の統計や e-Stat から自分で収集する必要があります。原論文もまさにその収集作業をしています。
Q2. なぜ「違反が増えると事故が減る」という負の係数が出たのですか?
確定的なことは言えませんが、複数の技術的要因が考えられます。(1)取り締まり件数は違反の実態だけでなく取り締まりの強さも反映するため、事故が減った時期に取り締まりが強化されていれば負の関係が生じる(内生性)。(2)n=16 の小標本に説明変数5つで推定が不安定。(3)違反件数どうしの多重共線性による符号逆転。(4)時系列の共通トレンド。いずれにせよ「相関因果ではない」ことの実例です。
Q3. モデルが「妥当でない」のに、結論を出してよいのですか?
原論文は回帰モデルの結果からは結論を出していません。モデルを棄却したうえで、違反件数の比較(図20)・事故原因の構成比(図16)・推移データ(図17・18)・実地観察・警察ヒアリングという複数の独立した証拠を突き合わせて「一時停止違反が深く関わる」と論じ直しました。審査会コメントの「データ解析の流れは自然であり、高く評価された」は、この立て直しのプロセスを含めた評価と読めます。
Q4. 「一時停止違反件数」は違反の多さの指標として適切ですか?
注意が必要です。これは取り締まり件数であり、実際に起きた違反の総数ではありません。原論文自身も実地観察から「実際の一時停止違反は取り締まり件数の数十倍ほどあるのではないか」と推測しています。取り締まり件数は警察の重点方針にも左右されるため、「観測されたデータが何を測っているのか」を常に問う姿勢が大切です。
Q5. この論文から学ぶべき一番のポイントは何ですか?
= 0.96 という一見素晴らしい結果に飛びつかず、「違反が増えれば事故が減るのはおかしい」という常識との照合でモデルを棄却したことです。さらに、その失敗を隠さず論文に明記し、別の証拠で結論を組み立て直しました。統計リテラシーとは計算技術だけでなく、結果を疑い、誠実に報告する態度でもある——それを高校生が実践した好例です。

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

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

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

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

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