このページの分析を自分で再現するには、以下の手順でデータを準備してください。コードの編集は不要です。
data/raw/ フォルダに入れます。html/figures/ に自動保存されます。
日本は世界有数の長寿国でありながら、健康寿命(健康上の問題で日常生活が制限されない期間)と平均寿命の差(「不健康期間」)が依然として大きい。また、都道府県間で健康指標に顕著な格差が存在することが厚生労働省の調査により明らかになっている。
まず「都道府県別健康寿命の決定要因社会経済・医療アクセス要因の重回帰分析」を統計的にとらえることが有効だと考えられる。 その理由は感覚や経験則だけでは、複雑な社会要因の中で「何が本当に効いているか」を見極めにくいからである。 本研究では公開データと統計手法を組み合わせ、この問いに定量的な答えを出すことを目指す。
本研究では、健康水準(死亡率で代理測定)に影響を与える要因として以下の3カテゴリを想定した。
SSDSE-B Pearson相関 重回帰(OLS) 標準化偏回帰係数 Cook's距離
統計数理研究所が公開するSSDSE(社会・人口統計体系)-B 2026年版を使用した。本データセットは都道府県別の人口・経済・医療・教育等の統計を2012〜2023年度にわたって収録している。本分析では2019年度(N=47都道府県)の横断面データを採用した。
| 変数の役割 | 変数名 | 単位 | 計算式 | 予想効果 |
|---|---|---|---|---|
| 目的変数 | 死亡率(千人当) | 件/千人 | 死亡数 / 総人口 × 1000 | — |
| 社会経済 | 消費支出(万円) | 万円/月 | 二人以上世帯の月間消費支出 | 負(高収入ほど健康) |
| 保健医療費(万円) | 万円/月 | 二人以上世帯の月間保健医療費 | 負(医療支出多→健康意識高) | |
| 医療アクセス | 病院数(千人当) | 施設/千人 | 一般病院数 / 総人口 × 1000 | 負(病院多→早期発見) |
| 人口構造 | 高齢化率(%) | % | 65歳以上人口 / 総人口 × 100 | 正(高齢者多→死亡率高) |
| 手法 | 目的 | Pythonライブラリ |
|---|---|---|
| Pearson相関分析 | 変数間の線形関係の強さと方向を把握 | scipy.stats |
| OLS重回帰分析 | 複数説明変数を同時制御した効果推定 | statsmodels |
| 標準化偏回帰係数 | 説明変数間の相対的な影響力を比較 | statsmodels(標準化後OLS) |
| Kruskal-Wallis検定 | 地域間の死亡率格差の有意性を検証 | scipy.stats.kruskal |
| Cook's距離 | 外れ値・影響点の検出 | statsmodels(OLSInfluence) |
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 | import os import numpy as np import pandas as pd import matplotlib matplotlib.use('Agg') import matplotlib.pyplot as plt import statsmodels.api as sm from scipy import stats from scipy.stats import kruskal 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['年度'].astype(int) print("=== df_b.columns ===") print(df_b.columns.tolist()) print() print("=== df_b.head() ===") print(df_b.head()) |
=== df_b.columns ===
['年度', '地域コード', '都道府県', '総人口', '総人口(男)', '総人口(女)', '日本人人口', '日本人人口(男)', '日本人人口(女)', '15歳未満人口', '15歳未満人口(男)', '15歳未満人口(女)', '15~64歳人口', '15~64歳人口(男)', '15~64歳人口(女)', '65歳以上人口', '65歳以上人口(男)', '65歳以上人口(女)', '出生数', '出生数(男)', '出生数(女)', '合計特殊出生率', '死亡数', '死亡数(男)', '死亡数(女)', '転入者数(日本人移動者)', '転入者数(日本人移動者)(男)', '転入者数(日本人移動者)(女)', '転出者数(日本人移動者)', '転出者数(日本人移動者)(男)', '転出者数(日本人移動者)(女)', '婚姻件数', '離婚件数', '年平均気温', '最高気温(日最高気温の月平均の最高値)', '最低気温(日最低気温の月平均の最低値)', '降水日数(年間)', '降水量(年間)', '着工建築物数', '着工建築物床面積', '旅館営業施設数(ホテルを含む)', '旅館営業施設客室数(ホテルを含む)', '標準価格(平均価格)(住宅地)', '標準価格(平均価格)(商業地)', '幼稚園数', '幼稚園教員数', '幼稚園在園者数', '小学校数', '小学校教員数', '小学校児童数', '中学校数', '中学校教員数', '中学校生徒数', '中学校卒業者数', '中学校卒業者のうち進学者数', '高等学校数', '高等学校教員数', '高等学校生徒数', '高等学校卒業者数', '高等学校卒業者のうち進学者数', '短期大学数', '大学数', '短期大学教員数', '大学教員数', '短期大学学生数', '大学学生数', '短期大学卒業者数', '短期大学卒業者のうち進学者数', '大学卒業者数', '大学卒業者のうち進学者数', '専修学校数', '各種学校数', '専修学校生徒数', '各種学校生徒数', '新規求職申込件数(一般)', '月間有効求職者数(一般)', '月間有効求人数(一般)', '充足数(一般)', '就職件数(一般)', '一般旅券発行件数', '延べ宿泊者数', '外国人延べ宿泊者数', '着工新設住宅戸数', '着工新設持家数', '着工新設貸家数', '着工新設分譲住宅数', '着工新設住宅床面積', '着工新設持家床面積', '着工新設分譲住宅床面積', '着工新設貸家床面積', 'ごみ総排出量(総量)', '1人1日当たりの排出量', 'ごみのリサイクル率', '一般病院数', '一般診療所数', '歯科診療所数', '保育所等数', '保育所等定員数', '保育所等利用待機児童数', '保育所等在所児数', '保育所等保育士数', '消費支出(二人以上の世帯)', '食料費(二人以上の世帯)', '住居費(二人以上の世帯)', '光熱・水道費(二人以上の世帯)', '家具・家事用品費(二人以上の世帯)', '被服及び履物費(二人以上の世帯)', '保健医療費(二人以上の世帯)', '交通・通信費(二人以上の世帯)', '教育費(二人以上の世帯)', '教養娯楽費(二人以上の世帯)', 'その他の消費支出(二人以上の世帯)']
=== df_b.head() ===
年度 地域コード 都道府県 ... 教育費(二人以上の世帯) 教養娯楽費(二人以上の世帯) その他の消費支出(二人以上の世帯)
0 2023 R01000 北海道 ... 6911 25661 48694
1 2022 R01000 北海道 ... 9551 27234 46466
2 2021 R01000 北海道 ... 9913 23762 51583
3 2020 R01000 北海道 ... 9394 26539 56316
4 2019 R01000 北海道 ... 8848 29335 57289
[5 rows x 112 columns]import pandas as pd など — 必要なライブラリをまとめて呼び出します。as pd は短い別名(alias)。matplotlib.use('Agg') — グラフを画面表示せずファイルに保存するためのおまじない。plt.rcParams['font.family'] — グラフの日本語表示用フォント指定(Macは Hiragino Sans、Windowsなら Yu Gothic 等)。os.makedirs('html/figures', exist_ok=True) — 図の保存先フォルダを作る(既にあってもOK)。pd.read_csv(...) でCSVを読み込みます。encoding='cp932' は日本語Windows由来の文字コード、header=1 は「2行目を列名として使う」。df['地域コード'].str.match(r'^R\d{5}', ...) — 正規表現で「R+数字5桁」の行(47都道府県)だけTrueにし、真偽値で行をフィルタ。.astype(int) — 列を整数に変換(年度などを数値比較するため)。f"...{x}..." はf-string。文字列の中に {変数} と書くだけで埋め込めて、{x:.2f} のように書式も指定できます。28 29 30 | YEAR = 2019 df_cross = df_b[df_b['年度'] == YEAR].copy().reset_index(drop=True) print(f"\n=== {YEAR}年度 都道府県数: {len(df_cross)} ===") |
=== 2019年度 都道府県数: 47 ===
df['A'] / df['B'] — pandasの列同士の四則演算は要素ごと(element-wise)。forループ不要なのが強み。31 32 33 34 35 36 37 38 | df_cross['死亡率'] = df_cross['死亡数'] / df_cross['総人口'] * 1000 # 説明変数 # (1) 高齢化率(%)― 高齢者が多いほど死亡率は上がる可能性 df_cross['高齢化率'] = df_cross['65歳以上人口'] / df_cross['総人口'] * 100 # (2) 消費支出(万円/世帯月額)― 社会経済的地位の代理変数 df_cross['消費支出_万円'] = df_cross['消費支出(二人以上の世帯)'] / 10000 |
print はしません。データや図が裏で更新されただけ。次のステップへ進みましょう。.map() は「1対1の置き換え」、.apply() は「関数を当てる」。辞書なら .map()、ロジックなら .apply()。39 40 41 42 43 44 45 46 47 48 49 50 | # (3) 保健医療費(万円/世帯月額)― 医療へのアクセス・支出 df_cross['保健医療費_万円'] = df_cross['保健医療費(二人以上の世帯)'] / 10000 # (4) 病院数(千人当たり)― 医療インフラアクセス df_cross['病院数_千人'] = df_cross['一般病院数'] / df_cross['総人口'] * 1000 # (5) 食料費(万円/世帯月額)― 食生活・栄養の代理変数 df_cross['食料費_万円'] = df_cross['食料費(二人以上の世帯)'] / 10000 print("\n=== 主要変数の記述統計 ===") key_vars = ['死亡率', '高齢化率', '消費支出_万円', '保健医療費_万円', '病院数_千人', '食料費_万円'] print(df_cross[key_vars].describe().round(3)) |
print はしません。データや図が裏で更新されただけ。次のステップへ進みましょう。.describe() — 件数・平均・標準偏差・四分位・最大/最小を一括計算。データの素性チェックに必須。[式 for x in リスト] はリスト内包表記。forループでappendする代わりに1行でリストを作れます。51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 | # 地域区分(6地域) region_map = { '北海道': '北海道・東北', '青森県': '北海道・東北', '岩手県': '北海道・東北', '宮城県': '北海道・東北', '秋田県': '北海道・東北', '山形県': '北海道・東北', '福島県': '北海道・東北', '茨城県': '関東', '栃木県': '関東', '群馬県': '関東', '埼玉県': '関東', '千葉県': '関東', '東京都': '関東', '神奈川県': '関東', '新潟県': '中部', '富山県': '中部', '石川県': '中部', '福井県': '中部', '山梨県': '中部', '長野県': '中部', '岐阜県': '中部', '静岡県': '中部', '愛知県': '中部', '三重県': '近畿', '滋賀県': '近畿', '京都府': '近畿', '大阪府': '近畿', '兵庫県': '近畿', '奈良県': '近畿', '和歌山県': '近畿', '鳥取県': '中国・四国', '島根県': '中国・四国', '岡山県': '中国・四国', '広島県': '中国・四国', '山口県': '中国・四国', '徳島県': '中国・四国', '香川県': '中国・四国', '愛媛県': '中国・四国', '高知県': '中国・四国', '福岡県': '九州・沖縄', '佐賀県': '九州・沖縄', '長崎県': '九州・沖縄', '熊本県': '九州・沖縄', '大分県': '九州・沖縄', '宮崎県': '九州・沖縄', '鹿児島県': '九州・沖縄', '沖縄県': '九州・沖縄' } df_cross['地域'] = df_cross['都道府県'].map(region_map) region_order = ['北海道・東北', '関東', '中部', '近畿', '中国・四国', '九州・沖縄'] region_colors = { '北海道・東北': '#2196F3', '関東': '#4CAF50', '中部': '#FF9800', '近畿': '#9C27B0', '中国・四国': '#F44336', '九州・沖縄': '#009688' } |
=== 主要変数の記述統計 ===
死亡率 高齢化率 消費支出_万円 保健医療費_万円 病院数_千人 食料費_万円
count 47.000 47.000 47.000 47.000 47.000 47.000
mean 12.119 30.415 28.852 1.351 0.069 7.370
std 1.816 3.055 2.626 0.172 0.028 0.575
min 8.556 22.025 21.059 1.028 0.031 6.160
25% 10.949 29.021 27.361 1.248 0.049 6.996
50% 12.372 30.675 28.988 1.332 0.060 7.401
75% 13.605 32.502 30.638 1.436 0.082 7.664
max 16.239 36.934 35.506 1.790 0.162 8.918r, p = stats.pearsonr(...) — Pythonは複数戻り値を同時に受け取れる(タプルアンパック)。
| 変数 | 標準化係数β | p値 | 有意性 | 解釈 |
|---|---|---|---|---|
| 高齢化率 | +1.70 | <0.001 | *** | 最も強い正の効果:高齢化率1SD上昇→死亡率+1.70SD |
| 消費支出 | −0.11 | 0.256 | n.s. | 負の方向だが非有意(高齢化率と交絡) |
| 保健医療費 | −0.12 | 0.256 | n.s. | 負の方向だが非有意 |
| 病院数(千人当) | −0.05 | 0.589 | n.s. | 非有意(単純相関での正の関係は交絡による見せかけ) |
モデル全体:R²=0.922,adj R²=0.915,F(4,42)=124.5,p<0.001
高齢化率が死亡率の分散の約92%を説明する強力な規定因子であることが判明。
81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 | heat_vars = ['死亡率', '高齢化率', '消費支出_万円', '保健医療費_万円', '病院数_千人', '食料費_万円'] heat_labels = ['死亡率\n(千人当)', '高齢化率\n(%)', '消費支出\n(万円)', '保健医療費\n(万円)', '病院数\n(千人当)', '食料費\n(万円)'] n_vars_heat = len(heat_vars) corr_matrix = df_cross[heat_vars].corr() pval_matrix = pd.DataFrame(np.ones((n_vars_heat, n_vars_heat)), index=heat_vars, columns=heat_vars) for i, v1 in enumerate(heat_vars): for j, v2 in enumerate(heat_vars): if i != j: r, p = stats.pearsonr(df_cross[v1].dropna(), df_cross[v2].dropna()) pval_matrix.loc[v1, v2] = p fig1, ax1 = plt.subplots(figsize=(8, 6.5)) im = ax1.imshow(corr_matrix.values, cmap='RdBu_r', vmin=-1, vmax=1, aspect='auto') plt.colorbar(im, ax=ax1, shrink=0.8, label='Pearson相関係数 r') ax1.set_xticks(range(n_vars_heat)) ax1.set_yticks(range(n_vars_heat)) ax1.set_xticklabels(heat_labels, fontsize=10) ax1.set_yticklabels(heat_labels, fontsize=10) for i in range(n_vars_heat): for j in range(n_vars_heat): r_val = corr_matrix.values[i, j] p_val = pval_matrix.values[i, j] stars = '***' if p_val < 0.001 else '**' if p_val < 0.01 else '*' if p_val < 0.05 else '' txt = f"{r_val:.2f}{stars}" color = 'white' if abs(r_val) > 0.5 else 'black' ax1.text(j, i, txt, ha='center', va='center', fontsize=10, color=color, fontweight='bold' if stars else 'normal') ax1.set_title('図1:主要変数間のPearson相関係数ヒートマップ\n(2019年度 都道府県別,N=47)\n*p<0.05, **p<0.01, ***p<0.001', fontsize=11, pad=12) plt.tight_layout() fig1.savefig(os.path.join(FIG_DIR, '2019_U5_2_fig1.png'), bbox_inches='tight') plt.close(fig1) print("\n図1 保存完了") |
図1 保存完了
fig, ax = plt.subplots(...) — 図全体(fig)と軸(ax)を作る定番。以降は ax.bar(...) 等で操作。stats.pearsonr(x, y) — Pearson相関係数 r と p値を同時に返します。r, p = stats.pearsonr(...) — Pythonは複数戻り値を同時に受け取れる(タプルアンパック)。2変数の線形関係の強さと方向を−1〜+1の範囲で数値化する基礎的な手法。相関係数 r は次の式で定義される。
有意性検定では「真の相関 ρ = 0」という帰無仮説を検定し,t統計量 t = r√(N−2)/√(1−r²) が t分布に従うことを利用する(自由度 N−2)。
Pearson相関は「線形関係」しか捉えられない。また,N=47程度ではr≥0.29程度でp<0.05になるため,「統計的有意」が必ずしも「実質的意義(effect size)」を意味しない点に注意が必要。
Cohen(1988)の効果量基準:|r|≥0.5(大),|r|≥0.3(中),|r|≥0.1(小)
複数の説明変数を同時にモデルに投入し,各説明変数の「他の変数を制御した上での」純粋な効果を推定する手法。残差平方和を最小化するパラメータを求める(最小二乗法)。
OLSの偏回帰係数(β)は単位が異なる変数間で直接比較できない。標準化偏回帰係数は全変数を平均0・標準偏差1に変換後の回帰係数で,異なる単位の変数の「相対的影響力」を比較可能にする。
OLS回帰の推定値に対して各観測値が与える影響力を定量化する指標。観測値 i を除いたときの回帰係数ベクトルの変化量を標準化したもので,次の式で定義される。
一般的な閾値として Dᵢ > 4/N(= 4/47 ≈ 0.085)を影響点と判定する。
Cook's距離が大きい観測値は「外れ値」または「特異な特性を持つ観測値」であり,その都道府県を除外した場合に回帰係数が大きく変わる可能性がある。ただし,これらを機械的に除外するのではなく,なぜ特異なのかを解釈することが重要。
120 121 122 123 124 125 126 | fig2, ax2 = plt.subplots(figsize=(9, 7)) for region in region_order: mask = df_cross['地域'] == region ax2.scatter(df_cross.loc[mask, '消費支出_万円'], df_cross.loc[mask, '死亡率'], c=region_colors[region], label=region, s=60, alpha=0.85, zorder=3) |
print はしません。データや図が裏で更新されただけ。次のステップへ進みましょう。fig, ax = plt.subplots(...) — 図全体(fig)と軸(ax)を作る定番。以降は ax.bar(...) 等で操作。x if cond else y は三項演算子。リスト内包表記と組み合わせると、forとifを1行で書けます。127 128 129 130 131 132 | # 都道府県ラベル for _, row in df_cross.iterrows(): ax2.annotate(row['都道府県'].replace('県', '').replace('都', '').replace('府', '').replace('道', ''), (row['消費支出_万円'], row['死亡率']), fontsize=6.5, ha='left', va='bottom', xytext=(2, 2), textcoords='offset points', color='#333333') |
print はしません。データや図が裏で更新されただけ。次のステップへ進みましょう。for _, row in df.iterrows() — DataFrameを1行ずつ取り出すループ。1点ずつ描画したいときに使用。df[col](1列)と df[[col1, col2]](複数列)でカッコの数が違います。リストを渡していると覚えるとミスを減らせます。133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 | # 回帰直線 x_plot = df_cross['消費支出_万円'].dropna() y_plot = df_cross['死亡率'].dropna() idx_common = df_cross[['消費支出_万円', '死亡率']].dropna().index x_c = df_cross.loc[idx_common, '消費支出_万円'] y_c = df_cross.loc[idx_common, '死亡率'] r_val, p_val = stats.pearsonr(x_c, y_c) slope, intercept, _, _, _ = stats.linregress(x_c, y_c) x_line = np.linspace(x_c.min(), x_c.max(), 100) ax2.plot(x_line, slope * x_line + intercept, 'k--', linewidth=1.5, alpha=0.7) stars = '***' if p_val < 0.001 else '**' if p_val < 0.01 else '*' if p_val < 0.05 else '' ax2.text(0.05, 0.95, f'r = {r_val:.3f}{stars}\np = {p_val:.4f}\nN = 47', transform=ax2.transAxes, fontsize=11, verticalalignment='top', bbox=dict(boxstyle='round', facecolor='white', alpha=0.8)) ax2.set_xlabel('消費支出(万円/月,二人以上の世帯)', fontsize=12) ax2.set_ylabel('死亡率(千人当たり)', fontsize=12) ax2.set_title('図2:消費支出と死亡率の散布図\n(2019年度 都道府県別,地域別色分け)', fontsize=12) ax2.legend(loc='upper right', fontsize=9, title='地域', title_fontsize=9) ax2.grid(True, alpha=0.3) fig2.tight_layout() fig2.savefig(os.path.join(FIG_DIR, '2019_U5_2_fig2.png'), bbox_inches='tight') plt.close(fig2) print("図2 保存完了") |
図2 保存完了
stats.pearsonr(x, y) — Pearson相関係数 r と p値を同時に返します。stats.linregress(x, y) — 単回帰の傾き・切片・r値・p値・標準誤差を返します。使わない値は _ で受け取り。s[:-n]「末尾n文字を除く」/s[n:]「先頭n文字を除く」。スライス [start:stop:step] はリスト・タプル・文字列共通の基本ワザです。本分析の最重要な発見の一つは,「病院数と死亡率の単純正相関(高齢化率による交絡)」が重回帰で制御されることで消える点にある。このような交絡の除去は疫学・社会科学の多変量解析の核心的課題である。
| 課題 | 内容 | 対処法 |
|---|---|---|
| 空間的自己相関 | 隣接都道府県のデータは独立ではない(地理的パターン) | 空間回帰モデル(SAR/SEM),Moran's I検定 |
| 少サンプル(N=47) | 推定の不確実性が大きく過学習しやすい | 調整済みR²・AIC重視,Leave-one-out交差検証 |
| 多重共線性 | 高齢化率と消費支出が相関(r≈−0.55) | VIF(分散膨張係数)の確認,Ridge回帰 |
| 生態学的誤謬 | 都道府県集計データの知見を個人に一般化する危険 | 分析単位を明記し,個人レベルの推論を避ける |
説明変数間の相関が強いと,個々の偏回帰係数の推定精度が低下する(標準誤差が大きくなる)。VIF ≥ 10 が一般的な問題のある多重共線性の基準。本分析では高齢化率と消費支出のVIFを確認することが重要。
本分析は2019年の横断面データを使用しているが,SSDSE-Bは2012〜2023年の時系列データを提供している。固定効果モデル(Fixed Effects Model)を用いたパネル分析により,都道府県固有の未観測特性を制御した,より信頼性の高い推定が可能となる。
160 161 162 163 164 165 166 167 168 169 170 171 172 173 | fig3, ax3 = plt.subplots(figsize=(9, 6)) groups = [df_cross.loc[df_cross['地域'] == reg, '死亡率'].dropna().values for reg in region_order] stat_kw, p_kw = kruskal(*groups) bp = ax3.boxplot(groups, patch_artist=True, notch=False, medianprops=dict(color='black', linewidth=2), whiskerprops=dict(linewidth=1.5), capprops=dict(linewidth=1.5)) for patch, region in zip(bp['boxes'], region_order): patch.set_facecolor(region_colors[region]) patch.set_alpha(0.7) |
print はしません。データや図が裏で更新されただけ。次のステップへ進みましょう。fig, ax = plt.subplots(...) — 図全体(fig)と軸(ax)を作る定番。以降は ax.bar(...) 等で操作。df[col](1列)と df[[col1, col2]](複数列)でカッコの数が違います。リストを渡していると覚えるとミスを減らせます。174 175 176 177 178 179 180 181 182 183 184 185 186 187 188 189 190 191 192 | # 個別データ点をオーバーレイ for i, (region, grp) in enumerate(zip(region_order, groups), start=1): jitter = np.random.default_rng(seed=42 + i).uniform(-0.15, 0.15, len(grp)) ax3.scatter([i + j for j in jitter], grp, color=region_colors[region], s=30, alpha=0.8, zorder=3) ax3.set_xticks(range(1, len(region_order) + 1)) ax3.set_xticklabels(region_order, fontsize=9, rotation=15) ax3.set_ylabel('死亡率(千人当たり)', fontsize=12) ax3.set_title('図3:地域別死亡率の比較(箱ひげ図)\n(2019年度,N=47)', fontsize=12) ax3.text(0.98, 0.97, f'Kruskal-Wallis: H={stat_kw:.2f}, p={p_kw:.4f}', transform=ax3.transAxes, ha='right', va='top', fontsize=10, bbox=dict(boxstyle='round', facecolor='lightyellow', alpha=0.9)) ax3.grid(True, axis='y', alpha=0.3) fig3.tight_layout() fig3.savefig(os.path.join(FIG_DIR, '2019_U5_2_fig3.png'), bbox_inches='tight') plt.close(fig3) print("図3 保存完了") |
図3 保存完了
s[:-n]「末尾n文字を除く」/s[n:]「先頭n文字を除く」。スライス [start:stop:step] はリスト・タプル・文字列共通の基本ワザです。SSDSE-B 2019年度の都道府県別データ(N=47)を用いた重回帰分析の結果,以下の知見が得られた。
| データ名 | 収録内容 | 出典機関 |
|---|---|---|
| SSDSE-B-2026 | 都道府県別社会・人口統計(2012〜2023年度,N=47×12年) | 統計数理研究所(SSDSE) |
| 人口統計(死亡数・総人口) | 死亡率(千人当たり)の計算に使用 | 総務省統計局(住民基本台帳 / 国勢調査)経由 |
| 消費支出・保健医療費 | 二人以上世帯の月間支出(円) | 総務省統計局「家計調査」経由 |
| 一般病院数 | 都道府県別の一般病院施設数 | 厚生労働省「医療施設(動態)調査」経由 |
本教育用コードは実公的統計データ(SSDSE-B-2026)のみを使用しています。合成データ・疑似乱数シード等による人工データは一切含みません。分析結果は教育目的の再現であり,原著論文の結果と完全に一致するものではありません。
統計分析の解釈で初心者がやりがちな勘違いをまとめます。特に「相関と因果の混同」「p値の過信」は研究現場でもよく起きる落とし穴です。本文を読む前にも、読んだ後にも、目を通してみてください。
統計の基本用語を初心者向けに解説します。本文中で見慣れない言葉が出てきたら、ここに戻って確認してください。
統計手法について「何のためか」「結果をどう読むか」を初心者向けに解説します。
この研究をさらに発展させるための3つの方向性を示します。「今回わかったこと(X)」から「次に検証すべき仮説(Y)」を立て、「具体的に何をするか(Z)」まで考えてみましょう。
学んだだけでは身につきません。実際に手を動かすのが最強の学習方法です。本論文のスクリプトをベースに、以下のチャレンジに挑戦してみてください。難易度別に5つ用意しました。
本論文で学んだ手法は、研究の世界だけでなく、行政・企業・NPO の現場でも様々に活用されています。具体的なシーンを紹介します。
この論文を読んで初心者が抱きやすい疑問に、教育的観点から答えます。