このページの分析を自分で再現するには、以下の手順でデータを準備してください。コードの編集は不要です。
data/raw/ フォルダに入れます。html/figures/ に自動保存されます。
日本では急速な高齢化を背景に、医療費の増大が社会的課題となっている。2022年度の国民医療費は約46兆円に上り、その抑制は財政上の喫緊の課題である。一方で、スポーツ・運動習慣が生活習慣病予防や健康寿命の延伸に効果があることは多くの研究が示している。
まず「スポーツ施設・体育活動と医療費・健康指標の関係分析」を統計的にとらえることが有効だと考えられる。 その理由は感覚や経験則だけでは、複雑な社会要因の中で「何が本当に効いているか」を見極めにくいからである。 本研究では公開データと統計手法を組み合わせ、この問いに定量的な答えを出すことを目指す。
本研究は、都道府県別のスポーツ・健康活動関連支出(教養娯楽費を代理変数として使用)が保健医療費に与える影響を、重回帰分析と相関分析を用いて統計的に検証する。
SSDSE-B Pearson相関分析 OLS重回帰 地域比較
SSDSE(社会・人口統計体系)-B 2026年版(統計数理研究所提供)の2022年度断面データ。47都道府県すべてを対象とする。消費支出の内訳は「二人以上の世帯」の月額支出額(円)。
| 変数名 | SSDSE-B列名 | 単位 | 役割 |
|---|---|---|---|
| 保健医療費 | 保健医療費(二人以上の世帯) | 円/月 | 目的変数(医療費指標) |
| 教養娯楽費 | 教養娯楽費(二人以上の世帯) | 円/月 | 説明変数(スポーツ・文化活動の代理変数) |
| 高齢化率 | 65歳以上人口 / 総人口 × 100 | % | 説明変数(制御変数) |
| 病院密度 | 一般病院数 / 総人口 × 100,000 | 施設/10万人 | 説明変数(医療インフラの代理変数) |
| 変数 | 最大値(都道府県) | 最小値(都道府県) | 平均 | 標準偏差 |
|---|---|---|---|---|
| 保健医療費(円/月) | 19,107(愛知県) | 9,411(青森県) | 14,390 | 2,007 |
| 教養娯楽費(円/月) | 35,050(東京都) | 17,601(青森県) | 25,974 | 3,811 |
| 高齢化率(%) | 38.2(秋田県) | 22.2(沖縄県) | 31.4 | 3.6 |
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 | 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 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) # 2022年断面 df = df_b[df_b['年度'] == 2022].copy().reset_index(drop=True) assert len(df) == 47, f"47都道府県のはずが {len(df)} 行" |
print はしません。データや図が裏で更新されただけ。次のステップへ進みましょう。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} のように書式も指定できます。25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 | df['教養娯楽費'] = df['教養娯楽費(二人以上の世帯)'] # 円/月 df['保健医療費'] = df['保健医療費(二人以上の世帯)'] # 円/月(目的変数) df['高齢化率'] = df['65歳以上人口'] / df['総人口'] * 100 # % df['病院密度'] = df['一般病院数'] / df['総人口'] * 100000 # 10万人あたり # 相関分析用変数 vars_for_corr = { '教養娯楽費\n(スポーツ等代理)': '教養娯楽費', '保健医療費\n(医療費指標)': '保健医療費', '高齢化率\n(%)': '高齢化率', '病院密度\n(10万人あたり)': '病院密度', } corr_labels = list(vars_for_corr.keys()) corr_cols = list(vars_for_corr.values()) |
print はしません。データや図が裏で更新されただけ。次のステップへ進みましょう。df['A'] / df['B'] — pandasの列同士の四則演算は要素ごと(element-wise)。forループ不要なのが強み。40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 | # 地域マップ region_map = { '北海道': '北海道・東北', '青森県': '北海道・東北', '岩手県': '北海道・東北', '宮城県': '北海道・東北', '秋田県': '北海道・東北', '山形県': '北海道・東北', '福島県': '北海道・東北', '茨城県': '関東', '栃木県': '関東', '群馬県': '関東', '埼玉県': '関東', '千葉県': '関東', '東京都': '関東', '神奈川県': '関東', '新潟県': '中部', '富山県': '中部', '石川県': '中部', '福井県': '中部', '山梨県': '中部', '長野県': '中部', '岐阜県': '中部', '静岡県': '中部', '愛知県': '中部', '三重県': '近畿', '滋賀県': '近畿', '京都府': '近畿', '大阪府': '近畿', '兵庫県': '近畿', '奈良県': '近畿', '和歌山県': '近畿', '鳥取県': '中国・四国', '島根県': '中国・四国', '岡山県': '中国・四国', '広島県': '中国・四国', '山口県': '中国・四国', '徳島県': '中国・四国', '香川県': '中国・四国', '愛媛県': '中国・四国', '高知県': '中国・四国', '福岡県': '九州・沖縄', '佐賀県': '九州・沖縄', '長崎県': '九州・沖縄', '熊本県': '九州・沖縄', '大分県': '九州・沖縄', '宮崎県': '九州・沖縄', '鹿児島県': '九州・沖縄', '沖縄県': '九州・沖縄' } region_colors = { '北海道・東北': '#4e9af1', '関東': '#e05c5c', '中部': '#f0a500', '近畿': '#5cb85c', '中国・四国': '#9b59b6', '九州・沖縄': '#f39c12' } df['地域'] = df['都道府県'].map(region_map) df['色'] = df['地域'].map(region_colors) |
print はしません。データや図が裏で更新されただけ。次のステップへ進みましょう。.map() は「1対1の置き換え」、.apply() は「関数を当てる」。辞書なら .map()、ロジックなら .apply()。教養娯楽費(スポーツ等代理変数)と保健医療費の都道府県別分布を地域色で示す。 両変数に強い正の相関(r = 0.575, p < 0.001)が見られ、教養娯楽費が高い都道府県ほど 保健医療費も高い傾向がある。
「教養娯楽費が高い → スポーツ習慣が豊か → 医療費が低い」と仮定したが、 結果は逆(正の相関)だった。これは「所得が高い地域は教養娯楽費も保健医療費も両方高い」 という交絡変数(confounders)の存在を示唆する。代理変数を使う際は、 想定しない変数が背後に潜んでいないか(omitted variable bias)を常に疑うことが重要。
65 66 67 68 69 70 71 72 | fig1, ax1 = plt.subplots(figsize=(9, 7)) for region, color in region_colors.items(): mask = df['地域'] == region ax1.scatter( df.loc[mask, '教養娯楽費'], df.loc[mask, '保健医療費'], c=color, s=60, alpha=0.85, label=region, zorder=3 ) |
print はしません。データや図が裏で更新されただけ。次のステップへ進みましょう。fig, ax = plt.subplots(...) — 図全体(fig)と軸(ax)を作る定番。以降は ax.bar(...) 等で操作。[式 for x in リスト] はリスト内包表記。forループでappendする代わりに1行でリストを作れます。73 74 75 76 77 78 79 80 81 | # 都道府県ラベル for _, row in df.iterrows(): name = row['都道府県'].replace('県', '').replace('府', '').replace('都', '').replace('道', '') ax1.annotate( name, (row['教養娯楽費'], row['保健医療費']), fontsize=6.5, ha='center', va='bottom', xytext=(0, 4), textcoords='offset points' ) |
print はしません。データや図が裏で更新されただけ。次のステップへ進みましょう。for _, row in df.iterrows() — DataFrameを1行ずつ取り出すループ。1点ずつ描画したいときに使用。r, p = stats.pearsonr(...) — Pythonは複数戻り値を同時に受け取れる(タプルアンパック)。82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 | # 回帰直線 x_vals = np.array([df['教養娯楽費'].min(), df['教養娯楽費'].max()]) slope, intercept, r, p, _ = stats.linregress(df['教養娯楽費'], df['保健医療費']) ax1.plot(x_vals, slope * x_vals + intercept, 'k--', linewidth=1.5, label=f'回帰線 r={r:.2f} (p={p:.3f})') ax1.set_xlabel('教養娯楽費(円/月)', fontsize=12) ax1.set_ylabel('保健医療費(円/月)', fontsize=12) ax1.set_title('図1:教養娯楽費(スポーツ等代理変数)と保健医療費の関係\n2022年 都道府県別', fontsize=13) ax1.legend(fontsize=9, loc='upper left', framealpha=0.9) ax1.grid(True, alpha=0.3) fig1.tight_layout() fig1.savefig(os.path.join(FIG_DIR, '2021_H4_fig1.png'), bbox_inches='tight') plt.close(fig1) print("fig1 saved") |
fig1 saved
stats.linregress(x, y) — 単回帰の傾き・切片・r値・p値・標準誤差を返します。使わない値は _ で受け取り。x if cond else y は三項演算子。リスト内包表記と組み合わせると、forとifを1行で書けます。保健医療費(目的変数)に対して、教養娯楽費・高齢化率・病院密度の3変数を説明変数とする OLS(最小二乗法)重回帰分析を実施した。各変数を標準化(平均0、標準偏差1)したうえで推定し、 スケールの異なる変数の影響力を比較する。
| 変数の組み合わせ | r値 | p値 | 解釈 |
|---|---|---|---|
| 教養娯楽費 ↔ 保健医療費 | +0.58 | <0.001 | 正の相関:文化活動支出が多い地域ほど医療費も高い |
| 高齢化率 ↔ 保健医療費 | −0.25 | 0.09 | 弱い負の相関(限界的有意) |
| 高齢化率 ↔ 教養娯楽費 | −0.56 | <0.001 | 高齢化が進んだ地域は娯楽支出が低い |
| 病院密度 ↔ 保健医療費 | +0.22 | 0.14 | 正の相関(有意でない) |
| 変数 | 標準化係数 β | t値 | p値 | 有意性 |
|---|---|---|---|---|
| 教養娯楽費(スポーツ等代理) | +997 | 3.75 | 0.001 | ** |
| 高齢化率 | −720 | −2.49 | 0.017 | * |
| 病院密度(10万人あたり) | +465 | 1.66 | 0.105 | n.s. |
| モデル適合度: R² = 0.420、調整済みR² = 0.379、F(3,43) = 10.37、p < 0.001 | ||||
標準化した説明変数を使うと、係数βは「その変数が1標準偏差増加したときの目的変数の変化量(元の単位)」を表す。これにより単位の異なる変数(円・%・施設数)の影響力を直接比較できる。
「スポーツ活動が多い地域ほど医療費が低いはず」と予想したが、データは逆の傾向を示した。 このような場合に考えられる説明:
① 交絡変数(所得・GDP):豊かな都市部は教養娯楽費も保健医療費も高い。 ② 代理変数の不完全性:教養娯楽費にはスポーツ以外の支出(旅行、映画、習い事)が混在。 ③ 集計レベルの問題:都道府県別集計では個人レベルの因果関係が見えにくい(生態学的錯誤)。 ④ 逆因果:医療への関心が高い地域は医療・健康への支出も多くなる。
99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 | corr_data = df[corr_cols].copy() corr_data.columns = corr_labels corr_matrix = corr_data.corr() fig2, ax2 = plt.subplots(figsize=(7, 6)) n = len(corr_cols) im = ax2.imshow(corr_matrix.values, cmap='RdBu_r', vmin=-1, vmax=1, aspect='auto') plt.colorbar(im, ax=ax2, shrink=0.8, label='Pearson相関係数') ax2.set_xticks(range(n)) ax2.set_yticks(range(n)) ax2.set_xticklabels(corr_labels, fontsize=9) ax2.set_yticklabels(corr_labels, fontsize=9) for i in range(n): for j in range(n): val = corr_matrix.values[i, j] # p値計算 if i != j: _, pval = stats.pearsonr(corr_data.iloc[:, i].dropna(), corr_data.iloc[:, j].dropna()) star = '**' if pval < 0.01 else ('*' if pval < 0.05 else '') else: star = '' text_color = 'white' if abs(val) > 0.5 else 'black' ax2.text(j, i, f'{val:.2f}{star}', ha='center', va='center', fontsize=10, color=text_color, fontweight='bold') ax2.set_title('図2:健康・スポーツ関連変数のPearson相関行列\n2022年 都道府県別(*p<0.05, **p<0.01)', fontsize=12) fig2.tight_layout() fig2.savefig(os.path.join(FIG_DIR, '2021_H4_fig2.png'), bbox_inches='tight') plt.close(fig2) print("fig2 saved") |
fig2 saved
fig, ax = plt.subplots(...) — 図全体(fig)と軸(ax)を作る定番。以降は ax.bar(...) 等で操作。stats.pearsonr(x, y) — Pearson相関係数 r と p値を同時に返します。r, p = stats.pearsonr(...) — Pythonは複数戻り値を同時に受け取れる(タプルアンパック)。47都道府県を6地域(北海道・東北、関東、中部、近畿、中国・四国、九州・沖縄)に分類し、 地域別の保健医療費の特徴を比較する。
| 地域 | 保健医療費 平均(円/月) | 全国比 |
|---|---|---|
| 関東 | 15,719 | +9.2% |
| 近畿 | 15,016 | +4.4% |
| 中部 | 15,006 | +4.3% |
| 九州・沖縄 | 14,516 | +0.9% |
| 中国・四国 | 13,700 | −4.8% |
| 北海道・東北 | 12,384 | −14.0% |
| 全国平均 | 14,390 | — |
都道府県レベルの分析では、「教養娯楽費が高い都道府県ほど保健医療費が高い」という結果が得られた。しかし、これが個人レベルでも同じことを意味するとは限らない。これを生態学的錯誤(Ecological Fallacy)と呼ぶ。
たとえば、スポーツを多くする個人は医療費を節約できていても、その人が住む都道府県全体では他の要因(所得・人口構成)が優勢で、集計値では逆の相関が現れることがある。
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 159 160 161 162 | fig3, ax3 = plt.subplots(figsize=(8, 5)) colors_coef = ['#e05c5c' if p < 0.05 else '#aaaaaa' for p in std_pvals] y_pos = range(len(X_labels)) bars = ax3.barh(list(y_pos), std_coefs, color=colors_coef, height=0.5, edgecolor='white') for bar, val, p in zip(bars, std_coefs, std_pvals): label = f'β={val:.3f}' if p < 0.01: label += ' **' elif p < 0.05: label += ' *' else: label += f' (n.s.)' x_off = 0.01 if val >= 0 else -0.01 ha = 'left' if val >= 0 else 'right' ax3.text(val + x_off, bar.get_y() + bar.get_height() / 2, label, va='center', ha=ha, fontsize=10) ax3.axvline(0, color='black', linewidth=0.8, linestyle='-') ax3.set_yticks(list(y_pos)) ax3.set_yticklabels(X_labels, fontsize=10) ax3.set_xlabel('標準化偏回帰係数 β', fontsize=11) ax3.set_title( f'図3:保健医療費に対する標準化偏回帰係数\n' f'2022年 都道府県別 OLS(R²={model_raw.rsquared:.3f}, adj.R²={model_raw.rsquared_adj:.3f})', fontsize=12 ) ax3.set_xlim(min(std_coefs) - 0.25, max(std_coefs) + 0.25) |
print はしません。データや図が裏で更新されただけ。次のステップへ進みましょう。fig, ax = plt.subplots(...) — 図全体(fig)と軸(ax)を作る定番。以降は ax.bar(...) 等で操作。ax.axhline / ax.axvline — 水平/垂直の点線。平均線や基準線として定番。x if cond else y は三項演算子。リスト内包表記と組み合わせると、forとifを1行で書けます。163 164 165 166 167 168 169 170 171 172 173 174 175 | # 凡例 from matplotlib.patches import Patch legend_elements = [ Patch(facecolor='#e05c5c', label='有意 (p<0.05)'), Patch(facecolor='#aaaaaa', label='非有意 (p≥0.05)') ] ax3.legend(handles=legend_elements, fontsize=9, loc='lower right') ax3.grid(True, axis='x', alpha=0.3) fig3.tight_layout() fig3.savefig(os.path.join(FIG_DIR, '2021_H4_fig3.png'), bbox_inches='tight') plt.close(fig3) print("fig3 saved") |
fig3 saved
import pandas as pd など — 必要なライブラリをまとめて呼び出します。as pd は短い別名(alias)。df[col](1列)と df[[col1, col2]](複数列)でカッコの数が違います。リストを渡していると覚えるとミスを減らせます。本研究の統計分析から得られた知見をもとに、スポーツ・健康施策と医療費抑制に関する政策提言を整理する。
177 178 179 180 181 182 183 | X_cols = ['教養娯楽費', '高齢化率', '病院密度'] X_labels = ['教養娯楽費\n(スポーツ等代理)', '高齢化率(%)', '病院密度\n(10万人あたり)'] y_col = '保健医療費' df_reg = df[X_cols + [y_col]].dropna() X_raw = df_reg[X_cols].values y = df_reg[y_col].values |
print はしません。データや図が裏で更新されただけ。次のステップへ進みましょう。.map() は「1対1の置き換え」、.apply() は「関数を当てる」。辞書なら .map()、ロジックなら .apply()。184 185 186 187 188 189 | # 標準化 X_mean = X_raw.mean(axis=0) X_std = X_raw.std(axis=0) X_std_ = X_raw.std(axis=0, ddof=1) y_std_ = y.std(ddof=1) X_scaled = (X_raw - X_mean) / X_std |
print はしません。データや図が裏で更新されただけ。次のステップへ進みましょう。[式 for x in リスト] はリスト内包表記。forループでappendする代わりに1行でリストを作れます。190 191 192 193 194 195 196 197 198 199 200 201 | # OLS(標準化変数) X_sm = sm.add_constant(X_scaled) model = sm.OLS(y, X_sm).fit() print(model.summary()) # 標準化偏回帰係数 std_coefs = model.params[1:] # 定数項を除く std_pvals = model.pvalues[1:] print("\n標準化偏回帰係数:") for lbl, coef, p in zip(X_labels, std_coefs, std_pvals): lbl2 = lbl.replace('\n', ' ') print(f" {lbl2}: β={coef:.4f}, p={p:.4f}") |
print はしません。データや図が裏で更新されただけ。次のステップへ進みましょう。sm.add_constant(X) — 切片項(定数1の列)を先頭に追加。statsmodelsで必須。sm.OLS(y, X).fit() — 最小二乗法でモデルを推定。model.params, model.pvalues, model.conf_int() で結果取得。r, p = stats.pearsonr(...) — Pythonは複数戻り値を同時に受け取れる(タプルアンパック)。202 203 204 205 206 | # 非標準化モデル(R²確認用) X_sm_raw = sm.add_constant(X_raw) model_raw = sm.OLS(y, X_sm_raw).fit() print(f"\nR² = {model_raw.rsquared:.4f}") print(f"調整済みR² = {model_raw.rsquared_adj:.4f}") |
OLS Regression Results
==============================================================================
Dep. Variable: y R-squared: 0.420
Model: OLS Adj. R-squared: 0.379
Method: Least Squares F-statistic: 10.37
Date: Mon, 18 May 2026 Prob (F-statistic): 2.94e-05
Time: 11:23:49 Log-Likelihood: -410.81
No. Observations: 47 AIC: 829.6
Df Residuals: 43 BIC: 837.0
Df Model: 3
Covariance Type: nonrobust
==============================================================================
coef std err t P>|t| [0.025 0.975]
------------------------------------------------------------------------------
const 1.439e+04 230.693 62.376 0.000 1.39e+04 1.49e+04
x1 996.8707 266.031 3.747 0.001 460.369 1533.373
x2 -719.7072 289.132 -2.489 0.017 -1302.798 -136.617
x3 464.5632 280.307 1.657 0.105 -100.730 1029.857
==============================================================================
Omnibus: 0.742 Durbin-Watson: 1.776
Prob(Omnibus): 0.690 Jarque-Bera (JB): 0.400
Skew: 0.225 Prob(JB): 0.819
Kurtosis: 3.044 Cond. No. 2.07
==============================================================================
Notes:
[1] Standard Errors assume that the covariance matrix of the errors is correctly specified.
標準化偏回帰係数:
教養娯楽費 (スポーツ等代理): β=996.8707, p=0.0005
高齢化率(%): β=-719.7072, p=0.0168
病院密度 (10万人あたり): β=464.5632, p=0.1047
R² = 0.4197
調整済みR² = 0.3792sm.add_constant(X) — 切片項(定数1の列)を先頭に追加。statsmodelsで必須。sm.OLS(y, X).fit() — 最小二乗法でモデルを推定。model.params, model.pvalues, model.conf_int() で結果取得。x if cond else y は三項演算子。リスト内包表記と組み合わせると、forとifを1行で書けます。207 208 209 210 211 212 213 214 215 216 217 218 219 220 221 222 223 224 225 226 | df_sorted = df[['都道府県', '保健医療費', '地域', '色']].sort_values('保健医療費', ascending=False) top10 = df_sorted.head(10) bot10 = df_sorted.tail(10) plot_df = pd.concat([top10, bot10]) fig4, ax4 = plt.subplots(figsize=(10, 7)) short_names = [ s.replace('県', '').replace('府', '').replace('都', '').replace('道', '') for s in plot_df['都道府県'] ] bars = ax4.bar(range(len(plot_df)), plot_df['保健医療費'].values, color=plot_df['色'].values, edgecolor='white', linewidth=0.5) ax4.set_xticks(range(len(plot_df))) ax4.set_xticklabels(short_names, rotation=45, ha='right', fontsize=9) ax4.set_ylabel('保健医療費(円/月、二人以上の世帯)', fontsize=11) ax4.set_title('図4:都道府県別保健医療費ランキング\n上位10都道府県・下位10都道府県(2022年)', fontsize=12) |
print はしません。データや図が裏で更新されただけ。次のステップへ進みましょう。fig, ax = plt.subplots(...) — 図全体(fig)と軸(ax)を作る定番。以降は ax.bar(...) 等で操作。sort_values('列名', ascending=False) — 指定列で並べ替え(降順)。df[col](1列)と df[[col1, col2]](複数列)でカッコの数が違います。リストを渡していると覚えるとミスを減らせます。227 228 229 230 231 232 233 234 235 | # 上位/下位区分線 ax4.axvline(9.5, color='gray', linestyle='--', linewidth=1.5, alpha=0.7) ax4.text(4.7, ax4.get_ylim()[1] * 0.97, '高い(上位10)', ha='center', fontsize=9, color='gray') ax4.text(14.5, ax4.get_ylim()[1] * 0.97, '低い(下位10)', ha='center', fontsize=9, color='gray') # 地域凡例 handles = [Patch(facecolor=c, label=r) for r, c in region_colors.items()] ax4.legend(handles=handles, fontsize=8, loc='upper right', framealpha=0.9, ncol=2) ax4.grid(True, axis='y', alpha=0.3) |
print はしません。データや図が裏で更新されただけ。次のステップへ進みましょう。ax.axhline / ax.axvline — 水平/垂直の点線。平均線や基準線として定番。s[:-n]「末尾n文字を除く」/s[n:]「先頭n文字を除く」。スライス [start:stop:step] はリスト・タプル・文字列共通の基本ワザです。236 237 238 239 240 241 242 243 244 245 | # 値ラベル for bar in bars: h = bar.get_height() ax4.text(bar.get_x() + bar.get_width() / 2, h + 100, f'{int(h):,}', ha='center', va='bottom', fontsize=7) fig4.tight_layout() fig4.savefig(os.path.join(FIG_DIR, '2021_H4_fig4.png'), bbox_inches='tight') plt.close(fig4) print("fig4 saved") |
fig4 saved
np.cumsum(arr) は累積和、np.linspace(a, b, n) は「aからbを等間隔でn個」。NumPyの定石です。246 247 248 249 250 251 252 253 254 255 256 257 258 259 260 261 262 263 264 265 266 | print("\n===== 統計サマリー =====") print(f"分析対象: 2022年 47都道府県") print(f"保健医療費 平均: {df['保健医療費'].mean():.0f} 円/月") print(f"保健医療費 最大: {df.loc[df['保健医療費'].idxmax(), '都道府県']} ({df['保健医療費'].max():.0f})") print(f"保健医療費 最小: {df.loc[df['保健医療費'].idxmin(), '都道府県']} ({df['保健医療費'].min():.0f})") print(f"教養娯楽費 平均: {df['教養娯楽費'].mean():.0f} 円/月") print(f"高齢化率 平均: {df['高齢化率'].mean():.1f}%") r_kyo, p_kyo = stats.pearsonr(df['教養娯楽費'], df['保健医療費']) print(f"教養娯楽費-保健医療費 相関: r={r_kyo:.3f}, p={p_kyo:.4f}") print(f"重回帰 R²: {model_raw.rsquared:.3f}") print(f"重回帰 調整済みR²: {model_raw.rsquared_adj:.3f}") print(f"教養娯楽費 β: {std_coefs[0]:.3f}, p={std_pvals[0]:.4f}") print(f"高齢化率 β: {std_coefs[1]:.3f}, p={std_pvals[1]:.4f}") print(f"病院密度 β: {std_coefs[2]:.3f}, p={std_pvals[2]:.4f}") top_ken = df.nlargest(5, '保健医療費')[['都道府県', '保健医療費', '地域']] bot_ken = df.nsmallest(5, '保健医療費')[['都道府県', '保健医療費', '地域']] print("\n保健医療費 上位5:") print(top_ken.to_string(index=False)) print("\n保健医療費 下位5:") print(bot_ken.to_string(index=False)) |
print はしません。データや図が裏で更新されただけ。次のステップへ進みましょう。stats.pearsonr(x, y) — Pearson相関係数 r と p値を同時に返します。s[:-n]「末尾n文字を除く」/s[n:]「先頭n文字を除く」。スライス [start:stop:step] はリスト・タプル・文字列共通の基本ワザです。267 268 269 270 | # 地域別平均 reg_mean = df.groupby('地域')['保健医療費'].mean().sort_values(ascending=False) print("\n地域別保健医療費 平均:") print(reg_mean.to_string()) |
===== 統計サマリー ===== 分析対象: 2022年 47都道府県 保健医療費 平均: 14390 円/月 保健医療費 最大: 愛知県 (19107) 保健医療費 最小: 青森県 (9411) 教養娯楽費 平均: 25974 円/月 高齢化率 平均: 31.4% 教養娯楽費-保健医療費 相関: r=0.575, p=0.0000 重回帰 R²: 0.420 重回帰 調整済みR²: 0.379 教養娯楽費 β: 996.871, p=0.0005 高齢化率 β: -719.707, p=0.0168 病院密度 β: 464.563, p=0.1047 保健医療費 上位5: 都道府県 保健医療費 地域 愛知県 19107 中部 京都府 18383 近畿 東京都 17303 関東 石川県 16907 中部 鹿児島県 16549 九州・沖縄 保健医療費 下位5: 都道府県 保健医療費 地域 青森県 9411 北海道・東北 和歌山県 10846 近畿 福井県 11522 中部 沖縄県 11587 九州・沖縄 鳥取県 11638 中国・四国 地域別保健医療費 平均: 地域 関東 15719.285714 近畿 15016.142857 中部 15006.000000 九州・沖縄 14515.750000 中国・四国 13700.000000 北海道・東北 12384.428571
df.groupby('列').apply(関数) — グループごとに関数を適用。時系列や地域別の集計でよく使います。sort_values('列名', ascending=False) — 指定列で並べ替え(降順)。np.cumsum(arr) は累積和、np.linspace(a, b, n) は「aからbを等間隔でn個」。NumPyの定石です。SSDSE-B 2022年断面データ(47都道府県)を用いた相関分析・重回帰分析の結果:
| 手法 | 主な知見 | 限界 |
|---|---|---|
| Pearson相関分析 | 教養娯楽費-保健医療費 r=0.575 (p<0.001) | 交絡変数の影響を考慮できない |
| OLS重回帰分析 | R²=0.420。教養娯楽費・高齢化率が有意 | n=47の小標本。生態学的錯誤のリスク |
| 地域比較 | 関東・中部・近畿が高く、北東北が低い | 地域内の都道府県間格差も大きい |
| データ | 出典 |
|---|---|
| SSDSE-B 都道府県データ(2022年度) | 統計数理研究所 SSDSE(社会・人口統計体系)2026年版 |
| 消費支出内訳(二人以上の世帯) | 総務省 家計調査(SSDSE-B 収録) |
| 人口・高齢化率 | 総務省 住民基本台帳人口移動報告(SSDSE-B 収録) |
| 一般病院数 | 厚生労働省 医療施設調査(SSDSE-B 収録) |
本教育用コードはSSSDSE-B-2026.csvの実データを使用(合成データ不使用)。分析対象:2022年度・47都道府県。
統計分析の解釈で初心者がやりがちな勘違いをまとめます。特に「相関と因果の混同」「p値の過信」は研究現場でもよく起きる落とし穴です。本文を読む前にも、読んだ後にも、目を通してみてください。
統計の基本用語を初心者向けに解説します。本文中で見慣れない言葉が出てきたら、ここに戻って確認してください。
統計手法について「何のためか」「結果をどう読むか」を初心者向けに解説します。
この研究をさらに発展させるための3つの方向性を示します。「今回わかったこと(X)」から「次に検証すべき仮説(Y)」を立て、「具体的に何をするか(Z)」まで考えてみましょう。
学んだだけでは身につきません。実際に手を動かすのが最強の学習方法です。本論文のスクリプトをベースに、以下のチャレンジに挑戦してみてください。難易度別に5つ用意しました。
本論文で学んだ手法は、研究の世界だけでなく、行政・企業・NPO の現場でも様々に活用されています。具体的なシーンを紹介します。
この論文を読んで初心者が抱きやすい疑問に、教育的観点から答えます。