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

健康寿命の延伸に向けて

太佐 美結(フェリス女学院高等学校 1年)
⏱️ 推定読了時間: 約28分
相関分析・因子分析・重回帰分析 目的変数:男女別の健康寿命(47都道府県)
🔬 因子分析🔬 標準化係数🔬 相関分析🔬 重回帰🏷 医療・健康🏷 食・家計消費🏷 子育て・保育
🔬 手法タグ / 🏷 応用タグ(クリックで同タグの論文をネットワーク検索)
🔬 再現カルテ — 原論文のデータが手に入らないため、代替データで再現

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

原論文が使ったデータSSDSE-C・SSDSE-2020B・SSDSE-D・e-Stat
分析単位:都道府県
中核手法:相関分析・重回帰分析
この教材が使うデータCSV は読み込まない(原論文が報告した数値をそのまま図表化して読み解く)
原論文(PDF)健康寿命の延伸に向けて
優秀賞/太佐 美結(フェリス女学院高等学校)
✅ この教材でできること
  • 数値・図を最後まで再計算できる(因子分析)
⚠️ この教材ではできないこと(原論文との違い)
  • 原論文と同じデータでの再現はできない:論文=SSDSE-C/D → 教材=報告値転記中心
📄 原論文との違いを、もっと詳しく
📄 原論文:SSDSE-C(家計消費)・SSDSE-D(社会生活基本調査)で健康寿命の延伸要因を分析。
📘 本教材:step 1〜4 は原論文の報告値転記が中心。step 5 で原論文と同じ SSDSE-C/D の実データによる健康要因の分析を再現
⚠️ 注意:健康寿命そのもの(厚労省推計)は SSDSE 未収録のため、健康行動の地域差の分析にとどめる。
🚀 原論文と同じ粒度で挑戦したい人へ

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

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

🏅 論文審査会コメント(審査員はここを評価した)
「先行研究、研究プロセスの計画、要因の選定、データの吟味(外れ値摘出)などが実に緻密である。解釈・提言等の出し方について、素朴な分析だが、高校生でこれくらいできれば言うことはなく、教育者にも参考になる。」
出典:統計センター「統計データ分析コンペティション」受賞論文PDF掲載の審査講評。プロの審査員が何を評価し、何を注文したかは論文の読み方の最良の手本になる。
📝 3行で分かる要約
⚠️ このページの図について(再現可能性トリアージ) 本論文の目的変数「健康寿命」は e-Stat(厚生労働省由来)の値で、説明変数の多くも SSDSE-C・SSDSE-D・国民生活基礎調査・国立がん研究センターなど SSDSE-B 以外の出典から集められています。これらは本教材リポジトリには収録されておらず、原論文の数値を手元で再計算して復元することはできません。そこで本ページの4枚の図は、いずれも原論文(PDF)が報告した数値を書き写して可視化したもの=「報告値の可視化(再計算ではない)」です。図中と図注の両方にその旨を明記しています。原論文そのものの図(特性要因図・箱ひげ図・因子負荷量プロット等)は、忠実な再現が難しいため本文で表・文章として示し、必要に応じて「グラフは原論文参照」と記します。新しい数値の捏造は行っていません。

目次

  1. 1. 研究のテーマと目的
  2. 2. 研究の方法と手順
  3. 3. データセットの加工(要因選定・外れ値・因子分析)
  4. 4. データ分析の結果(相関・重回帰)
  5. 5. 結果の解釈と提案
  6. 6. まとめと今後の課題
  7. 📥 図の再現手順
  8. 📐 手法ガイド
  9. ⚠️ よくある誤解
  10. 📖 用語集
  11. 🚀 発展の可能性
  12. 🎯 自分でやってみよう
  13. 🤔 Q&A
  14. 🐍 ブラウザで動かす

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

📥 図の再現手順(コードを動かす前に)

このページの4枚の図は原論文の報告値を可視化したものなので、外部データのダウンロードは不要です。付属スクリプトには数値が直接書き込まれており、そのまま実行すれば同じ図が得られます。

1
スクリプトをそのまま実行する プロジェクトルートで以下を実行します。
python3 code/2021_H2_yushu.py
図は html/figures/ に保存されます(外部CSV不要)。
2
(発展)原論文の分析を自分でやり直したい場合 健康寿命・スポーツ行動者率・家計消費データ等は SSDSE-C/SSDSE-D や e-Stat から取得します。SSDSE は統計センター(独立行政法人統計センター)が教育用に公開する教育用標準データセットです。
⬇ SSDSEダウンロードページを開く
1
研究のテーマと目的

2016年の日本の男女平均寿命は 84.2歳で世界一の長寿国となった。しかし「寿命」は誕生から死亡までの期間であり、その中には介護などで日常生活が制限される期間も含まれる。WHO が提唱した健康寿命——「日常的に介護を必要としないで、自立した生活ができる生存期間」——をどれだけ延ばせるかが重要になっている。

国内で見ると、平均寿命が長いのは長野県・滋賀県、短いのは青森県で、男性では約 3.11年の差がある。一方、健康寿命が長いのは愛知県や山梨県などで、奈良県や京都府のように平均寿命が長くても健康寿命は比較的短い県もある。

先行研究が示していたこと ・山梨総合研究所「山梨は健康寿命がなぜ長いのか」(2018):平均寿命が長いからといって健康寿命も長い傾向があるわけではない
・ニッセイ基礎研究所「健康寿命の都道府県格差」(2019):健康寿命は平均寿命ほど男女に共通した傾向が見られない。健康寿命には複数の要因が関係していると想定される。
研究の問い(Research Question) 健康寿命に影響を与える要因は、平均寿命に影響を与える要因とは異なるものが存在するのではないか。複数の要因間の関係を重回帰分析で調べ、健康寿命の延伸に向けた提案を行う。

2. 研究の方法と手順

本研究は次の8手順で進められた(原論文 図1 のフローチャート。フロー図そのものは原論文参照)。

手順1
平均寿命と
健康寿命の相関
手順2-3
要因の選定
+因子分析
手順4
外れ値の
考察
手順5
多重共線性
の確認
手順6-7
重回帰と
その評価
手順8
考察と
対策の提案
手順内容
手順1男女別に、各都道府県の健康寿命と平均寿命の相関係数を確認する。
手順2健康寿命に影響しそうな要因を『社会制度』『運動』『生活』『休息・余暇』『栄養・食生活』『気候』の観点から選定する。
手順3『栄養・食生活』は SSDSE-C(家計消費データ)を用い、因子分析で食生活の指標を抽出する。
手順4箱ひげ図で外れ値を特定し、除外すべきか(都道府県の特徴を表す値か)を検討する。
手順5同一グループ内の説明変数間で相関を算出し、|r|≥0.7 なら健康寿命との相関が高い方を残す(多重共線性対策)。
手順6選定した説明変数で重回帰分析を実施する。
手順7重回帰式の精度(決定係数)・P値・残差を評価する。
手順8妥当性が確認された後、健康寿命に影響する要因を考察し、延伸のための対策を提案する。

3. データセットの加工

3.1 要因の選定(特性要因図)

健康寿命に影響しそうな要因を6つの観点で洗い出した(原論文 図2 の特性要因図。図そのものは原論文参照)。

観点含まれる要因の例
社会制度医療(病院数・歯科診療所数・健康診断受診率)、育児、学習機会、図書館・博物館、高齢者学級
運動通勤・通学、交通の発展度、1日の歩数、日常の運動機会、公園・スポーツ施設
生活同世代・異世代交流、高齢者就業率、家族形態、未婚率・離婚率、ボランティア活動
栄養・食生活和食/洋食/麺類、飲酒、間食、糖分、油と塩分、野菜・果物(→ 因子分析へ)
休息・余暇睡眠時間、趣味・娯楽時間、外出時間、公民館数、喫煙、飲酒
気候気温・降水量・積雪・日照時間(このうち日照時間のみ使用)

3.2 使用するデータ

目的変数は『男性健康寿命』『女性健康寿命』の2つ。健康寿命は e-Stat から得た「日常的に介護を必要としないで、自立した生活ができる生存期間」を用いた。説明変数は SSDSE を可能な限り活用し、足りないものは e-Stat や外部データで補った(原論文 表1)。

種別主な出典
目的変数(健康寿命・平均寿命)e-Stat
社会制度・運動・生活・休息余暇の各指標SSDSE-2020B / SSDSE-D / e-Stat
がん検診受診率国民生活基礎調査 / 国立がん研究センター がん対策情報センター
家計消費データ(→因子分析)SSDSE-2020C(都道府県庁所在市別・2017〜2019年の平均値)
設計上の工夫「説明変数は管理のしやすいものを選んだ方が対策につなげやすい」という指摘から、気候は本人が管理できない気温などを避け、外に出て陽を浴びる時間として決められる日照時間だけを採用している。

3.3 外れ値の考察

各変数を箱ひげ図で確認し、外れ値の発生原因を1つずつ検討した(原論文 図3。箱ひげ図は原論文参照)。特別な理由による外れ値(例:東京の飲食店の多さなど)は除外を検討し、都道府県の特徴を表す値は残した。「外れ値だから機械的に消す」のではなく、意味を吟味してから残す/除くを決めている点が本研究の丁寧なところ。

3.4 食生活の指標を作成(因子分析)

個々の食品の消費量ではなく「食生活の特徴」をつかむため、SSDSE-C の家計消費データに因子分析を適用した。分析には EXCEL 上の統計分析ソフト HAD を使用している。

因子分析の設定内容
因子数固有値が1以上となるものを抽出
抽出法主成分法
回転法斜交回転

7因子が抽出され、そのうち解釈できた5つに名前を付けた(原論文 図4 の因子負荷量プロットは原論文参照)。

因子命名負荷量が大きかった品目(原論文の記述)
因子1和食野菜・海藻、梅干し・漬物、中華麺、魚介類、大豆製品、果物、米(+)
因子2外食とテイクアウト外食・調理食品・菓子類・喫茶代(+)、小麦粉・米・砂糖(−)
因子3洋食[逆符号]パン・肉類(−)
因子4濃い味しょう油・砂糖・小麦粉・みそ(+)
因子5家での飲み物コーヒー(+)/緑茶(−)
符号の読み方に注意因子5「家での飲み物」は緑茶が負・コーヒーが正。つまりこの指標が小さいほど緑茶をよく飲む県を意味する。のちの女性モデルで係数が負になるのは「緑茶消費が多いほど健康寿命が長い」と読み替えられる(=5.2で解説)。

3.5 説明変数間の相関分析(多重共線性の確認)

重回帰の予測を歪める多重共線性を避けるため、同一グループ内の説明変数間で相関を算出し、|r|≥0.7 の組があれば、健康寿命との相関が高い方だけを分析に用いた(原論文 表3 の相関行列)。

4. データ分析の結果

4.1 健康寿命と平均寿命の相関分析

まず出発点として、健康寿命と平均寿命の順位が一致するかを男女別に確認した。

平均寿命と健康寿命の相関係数(男女・報告値)
図1(本ページ). 平均寿命と健康寿命の相関係数(男女別)。報告値の可視化(再計算ではない)/原論文 4.1 の報告値:男性 r=0.38、女性 r=−0.03。
📌 この図の読み方
このグラフは
健康寿命と平均寿命の相関係数を男女で並べた棒グラフ。
読み方
男性は弱い正の相関(r=0.38)、女性はほぼ相関なし(r=−0.03)。
なぜ重要か
「平均寿命が長い県=健康寿命も長い県」とは言えない。だから健康寿命に効く要因を平均寿命とは別に探す、という研究の動機が裏づけられる。
やってみよう① 準備:図の保存先と「報告値」であることの明示
📝 コード
 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
import os
import matplotlib
matplotlib.use('Agg')
import matplotlib.pyplot as plt

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

FIG_DIR = 'html/figures'
os.makedirs(FIG_DIR, exist_ok=True)

# すべての図に付す注記:この教材の図は「報告値の可視化」であって再計算ではない
NOTE = '※報告値の可視化(再計算ではない)/原論文の報告値'
▼ 実行結果
このステップは画面出力しません。図の保存先フォルダ html/figures/ を用意し、すべての図に付ける注記文字列 NOTE(「報告値の可視化(再計算ではない)」)を準備しました。この一行が、本ページの図が原論文の数値を写して描いたものであることの宣言です。
💡 解説
  • 目的:作図の下ごしらえ。日本語フォント(Mac は Hiragino Sans)を設定します。
  • NOTE をあえて定数にしておき、4枚すべての図に同じ注記を焼き込みます。読み手が「これは再計算ではない」と一目で分かるようにするためです。
💡 Python TIPS plt.savefig(..., bbox_inches='tight') で余白を自動で詰めて保存、plt.close() でメモリ解放。図を量産するときの定番です。
やってみよう② 原論文の報告値を転記する(新しい計算はしない)
📝 コード
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
# 原論文(PDF)から転記した報告値。ここでは新しい統計計算は一切行わない。

# 4.1 平均寿命と健康寿命の相関係数(図5の報告値)
corr_life_health = {'男性': 0.38, '女性': -0.03}

# 表5 標準化偏回帰係数(本文5.2で解釈された主要な説明変数)
#   (変数名, β, p値, 有意か[p<=0.1])
male_coefs = [
    ('スポーツ全般行動者率(男性)', 0.989, 0.000, True),
    ('胃・大腸・肺がん検診受診率(男性)', 0.519, 0.005, True),
    ('65歳以上就業者割合', 0.428, 0.010, True),
    ('一般診療所数(10万人あたり)', -0.490, 0.010, True),
]
female_coefs = [
    ('老人クラブ会員数(65歳以上人口10万あたり)', 0.446, 0.105, False),
    ('家での飲み物(緑茶ほど負の指標)', -0.333, 0.048, True),
]

# 表4 重回帰式の評価(決定係数とP値の報告値)
model_eval = {
    '男性': {'r2': 0.785, 'p': 0.000},
    '女性': {'r2': 0.490, 'p': 0.288},
}
▼ 実行結果
このステップも画面出力はありません。PDF の本文・表から読み取った数値を、そのまま Python の辞書・リストに書き写しました。ここで統計量を計算し直すことはしません。目的変数「健康寿命」も説明変数の多くも SSDSE-B には収録されておらず、再計算に必要な生データが手元にないためです。
💡 解説
  • 目的:以降の図の材料を用意する。male_coefs / female_coefs は (変数名, β, p値, 有意か)の4つ組で、原論文の表5から転記しています。
  • corr_life_health(図5)と model_eval(表4)も同様に報告値です。コードに書かれた 0.38 や 0.785 という数字は、すべて PDF に載っている値です。
💡 Python TIPS {'男性': 0.38} は辞書。d['男性'] でキーから値を引けます。表やCSVを介さず「紙の数値」をそのままコードに持てるのが便利です。
やってみよう③ Figure 1:平均寿命と健康寿命の相関係数(男女・報告値)
📝 コード
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
fig, ax = plt.subplots(figsize=(7, 5))
sexes = list(corr_life_health.keys())
rvals = [corr_life_health[s] for s in sexes]
colors = ['#1565C0' if v >= 0.2 else '#9E9E9E' for v in rvals]

ax.bar(sexes, rvals, color=colors, width=0.5, alpha=0.9)
ax.axhline(0, color='black', lw=1.0)
ax.set_ylabel('平均寿命と健康寿命の相関係数 r')
ax.set_title('平均寿命と健康寿命の順位は一致するか')

plt.savefig(FIG_DIR + '/2021_H2_fig1.png', bbox_inches='tight')
plt.close()
print('Figure 1 saved: 平均寿命と健康寿命の相関係数(報告値)')
print(f'  男性 r = {corr_life_health["男性"]:.2f}(弱い正の相関)')
print(f'  女性 r = {corr_life_health["女性"]:.2f}(相関は見られない)')
▼ 実行結果
Figure 1 saved: 平均寿命と健康寿命の相関係数(報告値)
  男性 r = 0.38(弱い正の相関)
  女性 r = -0.03(相関は見られない)
💡 解説
  • 目的:本研究の出発点「平均寿命と健康寿命の順位は一致するのか?」を1枚で示す。
  • 読み取り:男性は r=0.38(弱い正の相関)、女性は r=-0.03(ほぼ相関なし)。つまり平均寿命が長い県ほど健康寿命も長い、とは言えない。だからこそ「健康寿命に効く要因は平均寿命とは別に探す必要がある」という本研究の問いにつながります。
💡 Python TIPS [式 for x in リスト]リスト内包表記rvals = [d[s] for s in sexes] のように、辞書から欲しい値だけを1行で取り出せます。

4.2 健康寿命を説明する重回帰分析

表3の相関で健康寿命との相関が |r|≥0.2 の要因を説明変数に選び、男女別に重回帰分析を行った。説明変数は標準化し、標準化偏回帰係数で影響の大きさを比較した。まず男性モデルの主要な係数を見る。

男性の健康寿命を説明する要因(標準化偏回帰係数・報告値)
図2(本ページ). 男性モデルの標準化偏回帰係数(本文5.2で解釈された主要変数)。報告値の可視化(再計算ではない)/原論文 表5。R²=0.785, P=0.000。**: p<0.01, *: p<0.05。
やってみよう④ 男女で使い回す描画関数を用意する
📝 コード
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
def plot_coefs(coef_list, title, fname):
    """標準化偏回帰係数(報告値)の水平バーを描く共通関数。"""
    names = [c[0] for c in coef_list]
    betas = [c[1] for c in coef_list]
    bar_colors = ['#C62828' if b < 0 else '#1565C0' for b in betas]

    fig, ax = plt.subplots(figsize=(9, 0.9 * len(names) + 1.8))
    ax.barh(range(len(names)), betas, color=bar_colors, height=0.55)
    ax.axvline(0, color='black', lw=1.1)
    ax.set_yticks(range(len(names)))
    ax.set_yticklabels(names)
    ax.invert_yaxis()
    ax.set_xlabel('標準化偏回帰係数 β(報告値)')
    ax.set_title(title)
    plt.savefig(FIG_DIR + '/' + fname, bbox_inches='tight')
    plt.close()
▼ 実行結果
このステップは画面出力しません。標準化偏回帰係数の水平バーを描く共通関数 plot_coefs() を定義しました。負の係数は赤、正は青で塗り分けます。男性・女性それぞれの図(Figure 2・3)を、この1つの関数を呼び分けて作ります。
💡 解説
  • 目的:同じ形の図を男女で2枚描くので、描画処理を関数にまとめて重複を無くす。
  • ax.invert_yaxis() で、リストの上に書いた変数がグラフでも上に来るようにしています。色分け(正=青/負=赤)は、健康寿命への効果の向きを直感的に読めるようにするためです。
💡 Python TIPS 同じ描画を男女で2回使うなら def で関数化。引数を変えて呼ぶだけで重複が消え、修正も1か所で済みます。
やってみよう⑤ Figure 2:男性の健康寿命を説明する要因(報告値)
📝 コード
68
69
70
71
72
73
74
75
plot_coefs(
    male_coefs,
    '男性の健康寿命を説明する要因(標準化偏回帰係数)\nR²=0.785, P=0.000',
    '2021_H2_fig2.png',
)
print('Figure 2 saved: 男性 標準化偏回帰係数(報告値)')
for name, b, p, s in male_coefs:
    print(f'  {name}: β={b:+.3f}, p={p:.3f}')
▼ 実行結果
Figure 2 saved: 男性 標準化偏回帰係数(報告値)
  スポーツ全般行動者率(男性): β=+0.989, p=0.000
  胃・大腸・肺がん検診受診率(男性): β=+0.519, p=0.005
  65歳以上就業者割合: β=+0.428, p=0.010
  一般診療所数(10万人あたり): β=-0.490, p=0.010
💡 解説
  • 目的:男性モデル(R²=0.785, P=0.000)の主要な標準化偏回帰係数を並べる。
  • 読み取りスポーツ全般行動者率 β=+0.989 が突出して大きい正の効果。がん検診受診率 +0.51965歳以上就業者割合 +0.428 も正。一方 一般診療所数 −0.490 は負——「医療機関が多いほど健康」という直感と逆で、原論文は「予防を大切にする県ほど健康寿命が長い可能性」と解釈しています。
💡 Python TIPS f"{b:+.3f}"+ は符号を必ず表示、.3f は小数3桁。係数の正負をそろえて並べると読みやすくなります。

次に女性モデル。有意な説明変数は「家での飲み物」(緑茶の指標)だけであった。

女性の健康寿命を説明する要因(標準化偏回帰係数・報告値)
図3(本ページ). 女性モデルの標準化偏回帰係数。報告値の可視化(再計算ではない)/原論文 表5。R²=0.490, P=0.288。*: p<0.05, n.s.: 非有意。
やってみよう⑥ Figure 3:女性の健康寿命を説明する要因(報告値)
📝 コード
76
77
78
79
80
81
82
83
plot_coefs(
    female_coefs,
    '女性の健康寿命を説明する要因(標準化偏回帰係数)\nR²=0.490, P=0.288',
    '2021_H2_fig3.png',
)
print('Figure 3 saved: 女性 標準化偏回帰係数(報告値)')
for name, b, p, s in female_coefs:
    print(f'  {name}: β={b:+.3f}, p={p:.3f}')
▼ 実行結果
Figure 3 saved: 女性 標準化偏回帰係数(報告値)
  老人クラブ会員数(65歳以上人口10万あたり): β=+0.446, p=0.105
  家での飲み物(緑茶ほど負の指標): β=-0.333, p=0.048
💡 解説
  • 目的:女性モデルの係数を同じ関数で描く。
  • 読み取り:有意なのは 家での飲み物 β=−0.333(p=0.048)だけ。この指標は因子分析由来で「値が小さいほど緑茶消費が多い」ため、緑茶をよく飲む県ほど女性の健康寿命が長いと読めます。老人クラブ会員数 +0.446 はやや正だが p=0.105 で有意ではありません。
💡 Python TIPS f"{b:+.3f}"+ は符号を必ず表示、.3f は小数3桁。係数の正負をそろえて並べると読みやすくなります。

最後に、2つのモデルの妥当性(説明力と予測への有用性)を比べる。

重回帰式の評価(決定係数R²・P値、男女・報告値)
図4(本ページ). 重回帰式の評価。報告値の可視化(再計算ではない)/原論文 表4。男性 R²=0.785・P=0.000、女性 R²=0.490・P=0.288。
📌 R² と P値をセットで見る
決定係数 R²
重相関係数の二乗。値に絶対的な基準はなく、複雑な現象では「ある程度説明できていれば良い」と判断する。
P値
帰無仮説「この重回帰式は予測に役立たない」の検定。男性は P=0.000 で棄却=役立つ。女性は P=0.288 で棄却できず=役立つとは言えない。
結論
R² が中程度(女性0.490)でも P値が大きければ「予測に使えるモデル」とは言えない。女性は選んだ要因の外に強い要因がある可能性が示唆される。
やってみよう⑦ Figure 4:重回帰式の評価(決定係数R²・P値、男女・報告値)
📝 コード
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
fig, (ax1, ax2) = plt.subplots(1, 2, figsize=(10, 4.5))
sexes = list(model_eval.keys())
r2 = [model_eval[s]['r2'] for s in sexes]
pv = [model_eval[s]['p'] for s in sexes]

ax1.bar(sexes, r2, color=['#1565C0', '#9E9E9E'], width=0.5)
ax1.set_title('決定係数 R²(説明力)')

ax2.bar(sexes, pv, color=['#2E7D32', '#C62828'], width=0.5)
ax2.axhline(0.05, color='#E65100', ls='--', label='有意水準 0.05')
ax2.set_title('重回帰式のP値')

plt.savefig(FIG_DIR + '/2021_H2_fig4.png', bbox_inches='tight')
plt.close()
print('Figure 4 saved: 重回帰式の評価(報告値)')
print(f'  男性: R²={model_eval["男性"]["r2"]:.3f}, P={model_eval["男性"]["p"]:.3f} → 予測に役立つ')
print(f'  女性: R²={model_eval["女性"]["r2"]:.3f}, P={model_eval["女性"]["p"]:.3f} → 役立つとは言えない')
▼ 実行結果
Figure 4 saved: 重回帰式の評価(報告値)
  男性: R²=0.785, P=0.000 → 予測に役立つ
  女性: R²=0.490, P=0.288 → 役立つとは言えない
💡 解説
  • 目的:2つのモデルが「どれだけ説明でき/予測に役立つか」を並べて評価する。
  • 読み取り:男性は R²=0.785 と高く P=0.000 で有意——予測に役立つ。女性は R²=0.490 だが P=0.288 と有意水準0.05を大きく超え、「この重回帰式は健康寿命の予測に役立つとは言えない」。R² が中程度でも P 値次第で結論が変わる、という統計の勘所がそのまま出ています。
💡 Python TIPS plt.savefig(..., bbox_inches='tight') で余白を自動で詰めて保存、plt.close() でメモリ解放。図を量産するときの定番です。

5. 結果の解釈と提案

P値が 0.1 以下の説明変数を「健康寿命に有意に関係する要因」とみなし、男女別に考察する(原論文 5.2)。

男性の健康寿命

女性の健康寿命

分析を解釈しての提案(原論文)家の外に活動・交流の場をつくる——地域のスポーツクラブや、学校の奉仕活動などを通じて高齢者と触れ合い、共に体を動かす機会を増やす。
病院・診療所に頼りすぎず「自分の身体は自分で守り、予防を大切にする」——健康寿命が長い県では検診受診率が高い一方、医療機関数は全国平均を下回る指標が多かったことから、治療より予防の意識を高めることが重要。

6. まとめと今後の課題

健康寿命に効きそうな要因を多角的に洗い出し、因子分析で食生活の指標を作り、男女別に重回帰分析を行うことで、健康寿命に関係する要因を導けた。要因は男女で異なり、男性はスポーツ行動、女性は緑茶などの食生活が関連した。

原論文が挙げた今後の課題 ・女性モデルは妥当性(P=0.288)が低く、要因の選定が甘かった可能性。より深く要因を考え直す必要がある。
・SSDSE-D「都道府県別の自由時間活動・生活時間データ」から、活動・生活パターンの指標を因子分析で新たに作れるのではないか。
・目的変数を『不健康な期間(=平均寿命−健康寿命)』に変えて、本分析の結果と比較検討する。
審査会コメント(原論文より)先行研究、研究プロセスの計画、要因の選定、データの吟味(外れ値摘出)などが実に緻密。解釈・提言の出し方は素朴な分析だが、高校生でこれくらいできれば言うことはなく、教育者にも参考になる。

📐 手法ガイド

本論文で使われた3つの手法を、定義・使いどころ・つまずきやすい注意点で整理します。データは統計センター(独立行政法人統計センター)が公開する SSDSE(教育用標準データセット) などを用います。

① 相関分析(多重共線性の点検にも使う)
何をする
2変数の関係の強さと向きを相関係数 r(−1〜+1)で数値化する。
本論文での役割
(a) 健康寿命と平均寿命の関係の確認(図5)、(b) 説明変数どうしの相関を見て |r|≥0.7 の組の片方を落とす多重共線性対策。
注意
相関は因果ではない。また外れ値1点で r が大きく動くので、箱ひげ図での事前チェックが効く。
② 因子分析
何をする
多数の観測変数の背後にある少数の共通因子を推定する。本論文では家計消費の多品目から「和食」「濃い味」など食生活の指標を作った。
設定(本論文)
因子数=固有値1以上、抽出法=主成分法、回転法=斜交回転。ソフトは EXCEL 上の HAD。
注意
因子の命名は分析者が解釈して行うため主観が入る(本論文でも7因子中2因子は命名できず)。負荷量の符号の向きを取り違えると解釈が逆になる(「家での飲み物」は緑茶が負)。
③ 重回帰分析
何をする
複数の説明変数で目的変数を同時に説明する。標準化偏回帰係数βで、単位の違う変数の影響を比べられる。
評価の3点セット
決定係数R²(説明力)、P値(式が予測に役立つか)、残差(偏りがないか)。本論文では男性が有意、女性は P=0.288 で非有意。
注意
説明変数間の相関(多重共線性)が強いと係数が不安定になる。だから手順5の事前点検が重要。

⚠️ よくある誤解

この論文を読むときに陥りやすい誤解を、原論文の数値に沿って解きほぐします。

誤解1:「平均寿命が長い県は健康寿命も長い」
本研究の相関は男性 r=0.38(弱い)・女性 r=−0.03(ほぼなし)。順位は一致しません。だからこそ健康寿命に効く要因を平均寿命とは別に探すのが本研究の出発点です。
誤解2:「医療機関が多い県ほど健康」
男性モデルで一般診療所数の係数は負(β=−0.490)。原論文は「治療より予防」を重視する県ほど健康寿命が長い可能性と解釈します。ただしこれは相関であって因果の証明ではない点に注意。
誤解3:「R²が高ければ良いモデル」
女性モデルは R²=0.490 と中程度でも、P=0.288 で「予測に役立つとは言えない」。R²だけでなく P値・残差をセットで見る必要があります。
誤解4:「このページの図=原論文の再現」
本ページの4枚の図は原論文の報告値を写して描いたもので、手元データからの再計算ではありません(健康寿命等が SSDSE-B 未収録のため)。図中・図注に「報告値の可視化」と明記しています。

📖 用語集

本論文の理解に必要な用語をまとめます。

健康寿命
日常的に介護を必要とせず、自立した生活ができる生存期間。本論文では e-Stat の値を使用。
平均寿命
0歳の人があと何年生きられるかの期待値。健康ではない期間も含む。
相関係数
2変数の関係の強さと向きを −1〜+1 で表す指標。
多重共線性
説明変数どうしが強く相関し、重回帰の係数推定が不安定になる現象。本論文は |r|≥0.7 の組を整理して回避。
因子分析
多数の観測変数の背後にある少数の共通因子を推定する多変量解析。
因子負荷量
各観測変数が各因子とどれだけ結びつくかを表す値。命名の手がかりになる。
重回帰分析
複数の説明変数で目的変数を説明・予測する手法。
標準化偏回帰係数(β)
変数を標準化して得る係数。単位の違う説明変数の影響を比較できる。
決定係数 R²
重相関係数の二乗。モデルの説明力の目安。
P値
帰無仮説のもとで、観測された以上に極端な結果が出る確率。小さいほど有意。
外れ値
他から大きく離れた値。除外すべきか、地域の特徴かを吟味する。
SSDSE
統計センター(独立行政法人統計センター)が公開する教育用標準データセット。B(都道府県)・C(家計消費)・D(生活時間)等がある。

🚀 発展の可能性

この研究を一歩進めるアイデアです(原論文の今後の課題を含む)。

1. 目的変数を「不健康な期間」に変える
やること
『平均寿命 − 健康寿命』を目的変数にして本分析と比較する。
期待
「長く生きる」と「支障なく生きる」の要因の違いがより鮮明になる。
2. 生活時間データから新しい指標を作る
やること
SSDSE-D(自由時間活動・生活時間)に因子分析を適用し、活動・生活パターンの指標を作る。
期待
「運動」「休息」をより実態に近い形で表現できる。
3. 女性モデルの再設計
やること
P=0.288 で非有意だった女性モデルの説明変数を選び直す。相関の基準(|r|≥0.2)の見直しも。
期待
女性の健康寿命に効く要因をより確かに特定できる。

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

手を動かすほど理解が深まります。付属スクリプト(報告値の可視化)を土台に挑戦してみましょう。

★☆☆☆☆ 入門
CH1. 図を再現する
python3 code/2021_H2_yushu.py を実行し、4枚の図が出ることを確認。各図がどの報告値から描かれているかをコードで辿る。
★★☆☆☆ 初級
CH2. 係数の並べ方を変える
male_coefs を β の絶対値順に並べ替えて描く。影響の大きい要因が上に来るように sorted() を使ってみる。
★★★☆☆ 中級
CH3. 報告値を表からも読む
原論文 表5 の他の変数(歯科健診指導延人員など)の β・p値を読み取り、リストに追加して図に反映する。読み取りにくい値は「不確実」と注記する誠実さも大切。
★★★★☆ 上級
CH4. 因子分析を体験する
SSDSE-C を入手し、因子分析(主成分法・固有値1以上)を factor_analyzer 等で実行。原論文の「和食」「濃い味」に近い因子が出るか確かめる。
★★★★★ 発展
CH5. 「不健康な期間」で分析し直す
目的変数を『平均寿命−健康寿命』に変え、同じ手順で重回帰。健康寿命のときと結論がどう変わるかを1ページにまとめる。
💡 ヒント:同じ手法(相関・重回帰)を使う本サイトの他論文のスクリプトを流用すると効率的です。

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

因子分析・相関・重回帰は、健康分野に限らず幅広い現場で使われています。

🏛️
自治体の健康政策
健康寿命の地域差の要因分析や、検診受診率向上・介護予防施策の効果検証に、本論文と同じ相関・重回帰が使われます。
🛒
マーケティングの因子分析
アンケートの多数の質問項目から「価格志向」「品質志向」などの潜在因子を取り出す——本論文の食生活指標づくりと同じ発想です。
🏥
公衆衛生・疫学
生活習慣と疾病の関連を、交絡を調整しながら重回帰で評価する手法は疫学研究の基本です。
📊
データジャーナリズム
「何が地域差を生むのか」を公開データと回帰分析で示す記事は、本論文と同じ道具立てです。

🤔 よくある質問(想定Q&A)

初学者が抱きやすい疑問に答えます。

Q1. なぜこのページの図は「再現」ではなく「報告値の可視化」なの?
目的変数の健康寿命(e-Stat)や、スポーツ行動者率・家計消費など多くの説明変数が SSDSE-B に収録されておらず、手元に生データが無いためです。数値を再計算で復元できないので、原論文が報告した値を写して可視化しています。
Q2. 因子分析はどうやって「和食」などの名前を決めたの?
因子負荷量が大きい品目を見て、分析者が解釈して命名します。本論文では7因子中5つに命名でき、2つは解釈できませんでした。命名には主観が入る点が因子分析の特徴です。
Q3. 女性モデルは失敗なの?
P=0.288 で「予測に役立つとは言えない」結果でしたが、それ自体が発見です。原論文も「要因の選定が甘かった可能性」と正直に述べ、今後の課題としています。うまくいかない結果を隠さないのが良い研究の姿勢です。
Q4. 「緑茶で健康寿命が延びる」と断言していい?
できません。これは相関であって因果の証明ではありません。緑茶をよく飲む県は他の生活習慣も違うかもしれず、交絡の可能性があります。原論文も「交流の機会」など別の解釈を併記しています。

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

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

5
SSDSE-C/D(家計消費・社会生活)で健康要因データを再現する

原論文のデータ出典は SSDSE-C(家計消費)と SSDSE-D(社会生活基本調査)でした。同じ 2 種のデータから、健康寿命に関わる運動習慣・食生活の地域差を確認します。

やってみようスポーツ行動者率(D)× 野菜支出割合(C)
📝 コード
 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
c = pd.read_csv('data/raw/SSDSE-C-2026.csv', encoding='cp932', header=1)
c = c[c['地域コード'] != 'R00000'].set_index('都道府県')
cv = lambda x: pd.to_numeric(c[x], errors='coerce')
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')

sports = dv('スポーツの総数')
veg = cv('05 野菜・海藻') / cv('食料(合計)') * 100
salt_soy = (cv('食塩') + cv('しょう油')) / cv('食料(合計)') * 1000
print('スポーツ行動者率 上位5県:', '、'.join(sports.nlargest(5).index))
print('野菜支出割合    上位5県:', '、'.join(veg.nlargest(5).index))
r, p = stats.pearsonr(sports, veg.reindex(sports.index))
print(f'スポーツ行動者率 × 野菜支出割合: r = {r:+.3f} (p={p:.4f})')
print(f'食塩+しょう油支出(食料1000円当たり)最高: {salt_soy.idxmax()} {salt_soy.max():.1f}円 / 最低: {salt_soy.idxmin()} {salt_soy.min():.1f}円')
▼ 実行結果
スポーツ行動者率 上位5県: 東京都、神奈川県、埼玉県、愛知県、千葉県 野菜支出割合 上位5県: 秋田県、新潟県、青森県、岩手県、宮城県 スポーツ行動者率 × 野菜支出割合: r = -0.303 (p=0.0384) 食塩+しょう油支出(食料1000円当たり)最高: 山形県 3.0円 / 最低: 東京都 1.6円
💡 解説
  • スポーツ行動者率と野菜支出割合の上位県を並べると、健康行動の「地域文化」が見えてきます。両者の相関も確認でき、原論文が C と D を組み合わせた意図(食と運動の両面から健康寿命に迫る)を体験できます。
  • 食塩+しょう油の支出(食料1000円当たり)は東北で高い——減塩が健康寿命延伸の地域課題であるという原論文の議論と整合します。
💡 Python TIPS 出典の違うデータはset_index("都道府県")でそろえてから reindex で並び順を合わせます。

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

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

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