この教材は、原論文が使ったデータそのものを使えていません。そこで代わりのデータで同じ問いを追いかけ、結論の向き(増える/減る、強い/弱い)が原論文と一致するかを確かめます。「同じ数値が出る」ことは目標にしていません。
| 原論文が使ったデータ | 患者調査・SSDSE-A・SSDSE-B・SSDSE-C・SSDSE-D・地域別最低賃金改定状況・統計でみる都道府県の姿 2020・面積調 分析単位:都道府県 中核手法:相関分析・重回帰分析 |
|---|---|
| この教材が使うデータ |
|
| 原論文(PDF) | 増減数から見るうつ病の要因 審査員奨励賞/塚田 梢太(愛知工業大学名電高等学校) |
原論文と同じ粒度のデータは、この教材にも同梱しています。これを読み込めば、原論文と同じ細かさで分析をやり直せます(下の「🐍 ブラウザで動かす」でコードを書き換えて試せます)。ただし原論文が使った項目がすべて収録されているとは限りません。足りない項目は、上の「できないこと」に書いた出典から取ってくる必要があります。
▶ ここに書いてある分析は、ページ下部の「🐍 ブラウザで動かす」でそのまま実行できます(インストール不要)。動かしているのは code/2022_H5_10_shorei.py(333 行)そのものです。
このページの転入者数ランキング(図3)と支出項目間の相関ヒートマップ(図4)は、以下の手順で自分で再現できます。コードの編集は不要です。(うつ病患者増減数は患者調査由来でSSDSE-Bに無いため、うつ病に関わる図1・図2は原論文の報告値を可視化します。)
data/raw/ フォルダに入れます。html/figures/ に自動保存されます。
いまや若者だけでなく中高年でも、だれもがかかりうるのがうつ病であり、我が国の患者数は増加の一途をたどっている。著者は「この状況に終止符を打つべく、うつ病の要因を解明し社会に提言する」ことを目的に掲げた。うつ病の原因は「遺伝」「ストレス」「脳機能」の3つに大別されるが、遺伝・脳機能は専門知識が必要で解明が難しいため、本研究は「ストレス」に着目する。
分析期間は2014年から2017年に限定した。これは新型コロナウイルスという特殊な影響を除くためで、著者は「コロナ終息後のうつ病対策にも役立つ」と考えた。うつ病患者数を減らすことは、WHOが指摘する自殺(精神障害のある人が9割)の抑制や「社会活動の活発化」にもつながる、という問題意識が背景にある。
高校生の部 患者調査・SSDSE-A/B/C/D 相関分析・無相関の検定 多重共線性・VIF 重回帰分析
目的変数はうつ病患者増減数で、厚生労働省「患者調査」の「精神及び行動の障害(気分[感情]障害(躁うつ病を含む)(再掲))」を用い、2017年の値 − 2014年の値で都道府県ごとに算出した。説明変数は6観点の仮説指標で、SSDSE-A/B/C/D、地域別最低賃金改定状況(厚生労働省)、統計でみる都道府県の姿2020、面積調(国土地理院)など複数の出典を組み合わせている。年度の異なるデータを組み合わせている点は注意が必要である。
| 観点 | 変数(例) | 出典 |
|---|---|---|
| うつ病 | 精神及び行動の障害(気分[感情]障害)(人) | 患者調査(厚生労働省, 2014・2017) |
| 社会 | 就業者数・完全失業者数・最低賃金 | SSDSE-A / 地域別最低賃金改定状況 |
| 生活 | 単独世帯・睡眠・仕事・学業・休養(生活時間) | SSDSE-A / SSDSE-D |
| 娯楽 | 映画鑑賞率・音楽鑑賞率・読書・ゲーム | SSDSE-D |
| 環境 | 転入者数・降水日数・森林面積割合・日照時間・人口密度 | SSDSE-B / 面積調 ほか |
| 食生活 | 米・小麦・果実・外食 | SSDSE-C / SSDSE-D |
| 家計 | 消費支出・食料費・交通通信費・教育費・教養娯楽費 ほか | SSDSE-B |
仮説を立てた各指標とうつ病患者増減数の相関係数を求め、さらに無相関の検定でp値を算出した。著者は「r が −1≦r<−0.2 または 0.2<r≦1 の範囲内、かつ有意水準5%で有意」なものを「うつ病の要因と考えられる指標」と定義した。
選ばれた指標で重回帰する前に、VIFを計算。VIF>10 を多重共線性ありと判断し、映画鑑賞率・音楽鑑賞率・趣味としての読書のうちVIFの高い音楽鑑賞率・読書を除外した。外れ値(東京・神奈川・青森・秋田・埼玉・大阪・千葉・愛知)も箱ひげ図で特定して除いた。
仮説と反して正の相関を示した「映画鑑賞」「音楽鑑賞」「読書」「外食」に、著者は「出費」という共通性を見出した。そこで家計の支出項目(消費支出ほか)を新たに使い、支出とうつ病患者増減数の重回帰分析を追加で行った。
6観点の仮説指標それぞれと、うつ病患者増減数との相関係数が原論文 表3 にまとめられている。この図はその報告値をそのまま可視化したものである(うつ病患者増減数=患者調査はSSDSE-Bに無いため再計算できない)。無相関の検定で有意(p<0.05)だった指標を赤で示す。
=== [1] 仮説指標とうつ病患者増減数の相関係数(原論文 表3 の報告値)=== 目的変数「うつ病患者増減数」は患者調査由来で SSDSE に無く、再計算不可(報告値の転記) 無相関の検定で有意(p<0.05)だった指標は 7 個: 睡眠 r=-0.309(負の相関・有意) 映画鑑賞率 r=+0.397(正の相関・有意) 音楽鑑賞率 r=+0.330(正の相関・有意) 趣味としての読書 r=+0.382(正の相関・有意) 転入者数 r=+0.437(正の相関・有意) 森林面積割合 r=-0.359(負の相関・有意) 外食 r=+0.306(正の相関・有意) 最大の正の相関: 転入者数 r=+0.437 / 最大の負の相関: 森林面積割合 r=-0.359 ※ 男女別うつ病患者増減数どうしの相関は r=0.84(原論文 図3 の報告値)
「出費」という共通性に着目した著者は、家計の支出7項目を説明変数に、うつ病患者増減数を目的変数にした重回帰分析を行った。その偏回帰係数とP値が原論文 表11 にまとめられている。この図はその報告値をそのまま可視化したものである(目的変数がSSDSE-Bに無いため再計算不可)。
=== [2] 支出の重回帰の偏回帰係数(原論文 表11 の報告値)=== 切片=-12.197 / 重相関R=0.590537 / 補正R²=0.23184 / 有意F=0.013204 / 観測数=47 説明変数 係数 P値 判定 消費支出 -0.000580 0.015377 有意・減少要因 食料費 0.000753 0.259842 n.s. 家具・家事用品費 0.000270 0.907371 n.s. 被服及び履物費 -0.001450 0.571215 n.s. 交通・通信費 0.001219 0.020736 有意・増加要因 教育費 -0.000058 0.934852 n.s. 教養娯楽費 0.003347 0.006597 有意・増加要因 → 有意(P<0.05): 消費支出=減少要因 / 交通・通信費・教養娯楽費=増加要因(原論文の判断) ※ もう一つの重回帰では転入者数が有意(係数0.000266・P=0.004488、原論文 表参照) ※ 著者は「補正R²が低い」ことを認めつつ、原因解明が目的として有意Fと係数を解釈
以下の相関・係数の向きと数値はすべて原論文の報告値である。相関分析(表3・表4)と2つの重回帰(転入者数の回帰・支出の回帰)から、著者は次のように整理した。
| 指標グループ | うつ病増減数との関係 | 解釈(著者) |
|---|---|---|
| 娯楽・環境(転入者数・映画・音楽・読書・外食) | 有意な正の相関 | 「出費」という共通性がある=お金を使うことが増加側に効く |
| 生活・環境(睡眠・森林面積割合) | 有意な負の相関 | しっかり休む・自然が多い地域はうつ病が増えにくい |
| 米・小麦・降水日数・日照時間 など | ほぼ無相関 | 今回の増減数とは関連が弱い |
最初の重回帰(要因指標+外れ値除外, 観測数39)では転入者数が有意(係数0.000266, P=0.004488)で、うつ病の要因と判断された。支出の重回帰(観測数47)では、消費支出が減少要因(−0.00058, P=0.015)、交通・通信費(+0.001219, P=0.021)と教養娯楽費(+0.003347, P=0.007)が増加要因として有意だった。
原論文の目的変数(うつ病患者増減数)はSSDSE-Bに無い。しかし説明変数の一部(転入者数・家計の支出項目)はSSDSE-Bにも収録されている。まずは最初の重回帰で有意だった「転入者数」を、SSDSE-Bから構築してみる。
skiprows=[1] で読み込み、先頭列 SSDSE-B-2026(年度)が2023の47都道府県を残す。原論文の最初の重回帰で有意だった転入者数(A5101)を取り出し、大都市圏の外れ値を確認する。160 161 162 163 164 165 166 167 168 169 170 171 172 173 174 175 176 177 178 179 180 181 182 183 | df = pd.read_csv(DATA_B, encoding='cp932', header=0, skiprows=[1]) df['SSDSE-B-2026'] = pd.to_numeric(df['SSDSE-B-2026'], errors='coerce') d = df[df['SSDSE-B-2026'] == 2023].copy().reset_index(drop=True) for c in ['A1101', 'A5101', 'L3221', 'L322101', 'L322104', 'L322105', 'L322107', 'L322108', 'L322109']: d[c] = pd.to_numeric(d[c], errors='coerce') d['転入者数'] = d['A5101'] # A5101 転入者数(日本人移動者・人) d['転入率'] = d['A5101'] / d['A1101'] * 1000 # 参考: 人口千対 print('=== [3] SSDSE-B から転入者数を構築(実再現・2023年・都道府県)===') print(f'対象: {len(d)}都道府県 / 原論文の最初の重回帰で有意だった「転入者数」を SSDSE-B で構築') dr = d.sort_values('転入者数', ascending=False) # 原論文 表1 が転入者数の外れ値として除外した6都府県 outliers = ['東京都', '神奈川県', '埼玉県', '大阪府', '千葉県', '愛知県'] print('転入者数が多い上位6都府県(原論文が外れ値として除外した地域とほぼ一致):') for _, r in dr.head(6).iterrows(): flag = ' ← 原論文で外れ値除外' if r['Prefecture'] in outliers else '' print(f" {r['Prefecture']:<5} {int(r['転入者数']):>8,} 人{flag}") print('転入者数が少ない下位5県:') for _, r in dr.tail(5).iterrows(): print(f" {r['Prefecture']:<5} {int(r['転入者数']):>8,} 人") print('→ 転入者数は大都市圏が突出。原論文もこれらを外れ値として除外して回帰した。') |
=== [3] SSDSE-B から転入者数を構築(実再現・2023年・都道府県)=== 対象: 47都道府県 / 原論文の最初の重回帰で有意だった「転入者数」を SSDSE-B で構築 転入者数が多い上位6都府県(原論文が外れ値として除外した地域とほぼ一致): 東京都 406,749 人 ← 原論文で外れ値除外 神奈川県 211,257 人 ← 原論文で外れ値除外 埼玉県 160,736 人 ← 原論文で外れ値除外 大阪府 159,522 人 ← 原論文で外れ値除外 千葉県 140,104 人 ← 原論文で外れ値除外 愛知県 104,565 人 ← 原論文で外れ値除外 転入者数が少ない下位5県: 島根県 9,318 人 徳島県 8,397 人 高知県 8,278 人 福井県 8,135 人 鳥取県 7,578 人 → 転入者数は大都市圏が突出。原論文もこれらを外れ値として除外して回帰した。
原論文の最初の重回帰で有意だった変数は転入者数だった。その転入者数を、SSDSE-Bの「転入者数(日本人移動者)」から都道府県別にランキングにする。これは実データからの再計算(実再現)で、原論文と同じ都道府県粒度だが、年次が2023年である点に注意(地図の代わりにランキングで地域差を表現)。
原論文の統計的な見どころは、支出の重回帰の前に支出項目どうしの相関(表9)とVIF(表10)で多重共線性を確認した点にある。SSDSE-Bで構築した支出7項目の相関を計算し、その多重共線性を自分の手で確かめる。
190 191 192 193 194 195 196 197 198 199 200 201 202 203 204 205 206 207 208 209 210 211 212 | exp_cols = { 'L3221': '消費支出', 'L322101': '食料費', 'L322104': '家具・家事用品費', 'L322105': '被服及び履物費', 'L322107': '交通・通信費', 'L322108': '教育費', 'L322109': '教養娯楽費', } exp = d[list(exp_cols.keys())].rename(columns=exp_cols) corr = exp.corr() print('=== [4] 支出7項目間の相関ヒートマップ(実再現・原論文 表9 に対応)===') print('うつ病患者増減数(患者調査)は SSDSE に無いため、原論文 表9 のうち') print('「支出項目どうしの相関」だけを SSDSE-B 2023年で実計算する(多重共線性の実演)。') print(corr.round(2).to_string()) pairs = [] labels = list(exp_cols.values()) for i in range(len(labels)): for j in range(i + 1, len(labels)): pairs.append((labels[i], labels[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}') |
=== [4] 支出7項目間の相関ヒートマップ(実再現・原論文 表9 に対応)===
うつ病患者増減数(患者調査)は SSDSE に無いため、原論文 表9 のうち
「支出項目どうしの相関」だけを SSDSE-B 2023年で実計算する(多重共線性の実演)。
消費支出 食料費 家具・家事用品費 被服及び履物費 交通・通信費 教育費 教養娯楽費
消費支出 1.00 0.68 0.55 0.68 0.57 0.58 0.80
食料費 0.68 1.00 0.48 0.61 -0.03 0.73 0.76
家具・家事用品費 0.55 0.48 1.00 0.67 0.22 0.41 0.58
被服及び履物費 0.68 0.61 0.67 1.00 0.09 0.63 0.76
交通・通信費 0.57 -0.03 0.22 0.09 1.00 -0.15 0.15
教育費 0.58 0.73 0.41 0.63 -0.15 1.00 0.75
教養娯楽費 0.80 0.76 0.58 0.76 0.15 0.75 1.00
最も強い相関ペア: 消費支出 × 教養娯楽費 → r = 0.801
→ 支出項目どうしは正に相関し合う(原論文 表9 と整合)。ただし原論文は表10 の
VIF がすべて10未満だったため、全項目を残して重回帰を行った。
著者は2つの重回帰の結果から、転入者数・交通・通信費・教養娯楽費がうつ病の増加要因、消費支出が減少要因と結論づけ、それぞれに解釈を与えた(すべて報告値に基づく著者の考察)。
転入者数:新たな土地への移住の不安や、新しい環境になじみにくいこと。交通・通信費:移動という「絶対的に必要な出費」が多いほど自由に使えるお金が減り、生活が苦しくなる。教養娯楽費:趣味にお金をつぎ込みすぎて自由なお金が減り、さらに「楽しさからのむなしさという落差」が精神的ダメージを増幅させる、と著者は考えた。映画・音楽鑑賞が正の相関を示したのもこの支出が原因だと解釈している。
消費支出:物を買うことで購買意欲を満たせる。ただし「支出の中にも増加要因がある」ため、何にお金を使うのかが大切だと著者は強調する。
原論文は SSDSE-A/D の生活時間・行動データを使ってうつ病の要因を探索しました。同じ SSDSE-D-2023 の睡眠時間を使い、健康関連指標との関係を確認します。
1 2 3 4 5 6 7 8 9 10 11 12 13 | d_raw = pd.read_csv('data/raw/SSDSE-D-2023.csv', encoding='cp932', header=1) d_raw = d_raw[(d_raw['男女の別'] == '0_総数') & (d_raw['地域コード'] != 'R00000')] d = d_raw.set_index('都道府県') dv = lambda c: pd.to_numeric(d[c], errors='coerce') b_raw = pd.read_csv('data/raw/SSDSE-B-2026.csv', encoding='cp932', header=1) b = b_raw[(b_raw['年度'] == 2021) & b_raw['地域コード'].str.match(r'^R\d{5}$', na=False)].set_index('都道府県') bv = lambda c: pd.to_numeric(b[c], errors='coerce') sleep = dv('睡眠') health = bv('保健医療費(二人以上の世帯)') / bv('消費支出(二人以上の世帯)') * 100 r, p = stats.pearsonr(sleep, health) print(f'睡眠時間(分/日)平均 {sleep.mean():.0f} 分 最長: {sleep.idxmax()} {sleep.max():.0f}分 / 最短: {sleep.idxmin()} {sleep.min():.0f}分') print(f'睡眠時間 × 保健医療費割合: r = {r:+.3f} (p={p:.4f})') |
本研究は、都道府県別のうつ病患者増減数(2017−2014)を目的変数に、6観点の仮説指標を相関分析+無相関の検定でスクリーニングし、VIFで多重共線性を確認してから重回帰する、という手順で、転入者数・交通・通信費・教養娯楽費(増加要因)と消費支出(減少要因)を見出した(いずれも報告値)。「楽しいはずの娯楽が正の相関」という違和感から「支出」という共通性を発見し、追加の重回帰につなげた探究の流れが見どころである。
このページの転入者数ランキング(図3)と支出項目間の相関ヒートマップ(図4)は、以下から再現できます。
🐍 再現コード(.py) 📊 SSDSE-B-2026.csv
※ 図1(仮説指標の相関係数)と図2(支出の重回帰の偏回帰係数)は、目的変数のうつ病患者増減数(患者調査)がSSDSE-B外のため、原論文の報告値を可視化したものです。図3・図4はSSDSE-Bの転入者数・家計支出項目からの実再現ですが、原論文が2017年前後なのに対し本再現は2023年で、うつ病患者増減数が無いため「説明変数の作り方と多重共線性」の再現です。
この研究を読むとき・まねするときに陥りやすい誤解を整理する。
クリックすると各用語の詳しい解説ページに移動できます。
この研究で使われている手法を、手を動かす順に説明する。
この研究の「要因の候補は見えたが補正R²が低く因果は不明」という結論は、次の研究の出発点になる。
再現コードを少し変えるだけで試せる課題を、易しい順に用意した。
d = df[df['SSDSE-B-2026'] == 2023] を 2015 や 2020 に変えて、転入者数の都道府県ランキングが年で変わるか確かめよう。ds['転入者数'] を、コードで作ってある ds['転入率'](人口千対)に変えて、生の人数と人口比でランキング上位県がどう変わるか比べよう。大都市圏の見え方が変わる。exp_cols に 'L322103': '光熱・水道費' や 'L322106': '保健医療費' を加え、支出項目どうしの多重共線性がどう増えるか観察しよう。statsmodels の variance_inflation_factor を使って、支出7項目のVIFを計算し、10を超える変数があるか確かめよう。原論文 表10 の作業を追体験できる。from statsmodels.stats.outliers_influence import variance_inflation_factor。定数項を sm.add_constant で入れてから計算する。「地域単位のデータで健康・社会現象の要因を相関と重回帰で探る」発想は、公衆衛生や行政で広く使われている。
この研究を読んで浮かびやすい疑問に答える。
この論文を理解できたか、クリックで確認しましょう。間違えても解説が出ます。
このページの分析は、この画面の中でそのまま実行できます。
Python をインストールする必要も、CSV をダウンロードする必要もありません。
下のセルの 「▶ ブラウザで実行」 を上から順に押すか、
「▶ 最初から全部実行」 で一気に流してください。
表示されるのは、本文の図表とまったく同じ計算の結果です
(動かしているのは再現スクリプト code/2022_H5_10_shorei.py そのもの)。
コードは書き換えられます。「✏️ 書き換える」で数字や変数を変えて ▶ を押すと、 結果がどう変わるかをその場で確かめられます(元に戻すボタンつき)。 ページを開いた時点で裏で実行環境の準備が始まっているので、待ち時間はほとんどありません。 初回だけ実行環境の取得にインターネット接続が必要です。