このページの分析を自分で再現するには、以下の手順でデータを準備してください。コードの編集は不要です。
data/raw/ フォルダに入れます。html/figures/ に自動保存されます。
日本の高齢化は世界でも類を見ないスピードで進行している。2022年時点で65歳以上人口は総人口の約31%に達し、都道府県別では最高の秋田県(38.6%)から最低の東京都(22.8%)まで15ポイント以上の格差がある。こうした高齢化率の地域差は、介護・医療需要のばらつきや財政負担の不均等として現れる。
まず「高齢者介護・福祉と地域格差介護施設・老人福祉費の分析」を統計的にとらえることが有効だと考えられる。 その理由は感覚や経験則だけでは、複雑な社会要因の中で「何が本当に効いているか」を見極めにくいからである。 本研究では公開データと統計手法を組み合わせ、この問いに定量的な答えを出すことを目指す。
SSDSE-B(都道府県別) 相関分析 重回帰分析 地域格差 超高齢社会
統計数理研究所が提供するSSDSE-B(社会・人口統計体系データセット 都道府県別)2026年版を使用。2012〜2023年の12年間、47都道府県のパネルデータから2022年の断面データを断面分析に、全期間を時系列分析に用いた。
| データ区分 | 内容 | 観測数 |
|---|---|---|
| 断面データ(2022年) | 重回帰・相関分析 | 47都道府県 |
| 時系列データ(2012〜2023年) | 高齢化率の推移 | 47×12=564行 |
本研究では「都道府県の保健医療費(二人以上世帯・月額)」を目的変数とし、高齢化・所得・医療インフラに関する指標を説明変数として採用した。
| 変数区分 | 変数名 | 計算方法 | 仮説 |
|---|---|---|---|
| 【目的変数】 保健医療支出 |
保健医療費(円/月) | 二人以上世帯の月額消費支出内の保健医療費 | — |
| 高齢化指標 | 高齢化率(%) | 65歳以上人口 ÷ 総人口 × 100 | 高齢化率が高いほど保健医療費は増加するか? |
| 転入超過率(‰) | (転入者−転出者)÷ 総人口 × 1,000 | 人口流入は相対的に若年層増→医療費減少? | |
| 所得・生活水準 | 消費支出(円/月) | 二人以上世帯の月額消費支出合計 | 所得水準が高いと医療費も高い(正の関係) |
| 医療インフラ | 一般病院数(万人あたり) | 一般病院数 ÷ 総人口 × 10,000 | 病院が多い地域は受診機会増→医療費増加 |
| 保育所数(万人あたり) | 保育所等数 � 総人口 × 10,000 | 保育所は生活インフラの代理指標 |
実際の分析では「理想の変数」が常に入手できるわけではない。研究仮説に近い「代理指標(proxy variable)」を探し、その限界を明示したうえで分析を進めることがデータサイエンスの重要なスキルである。
2012年から2023年の12年間で、日本の高齢化率は全国平均で25.6%から31.6%へと6ポイント上昇した。地域別に見ると、どの地域も一様に高齢化が進む一方で、その水準と変化速度に明確な格差がある。
| 地域 | 2012年 高齢化率 | 2022年 高齢化率 | 変化 | 特徴 |
|---|---|---|---|---|
| 北海道・東北 | 約27% | 33.9% | +6.9pt | 全期間を通じて最高水準 |
| 中国・四国 | 約27% | 33.5% | +6.5pt | 東北と並ぶ高齢化先進地域 |
| 九州・沖縄 | 約25% | 31.3% | +6.3pt | 中位。沖縄は比較的若い |
| 中部 | 約24% | 31.0% | +7.0pt | 上昇幅は大きい |
| 近畿 | 約23% | 30.1% | +7.1pt | 都市と地方で二極化 |
| 関東 | 約20% | 27.9% | +7.9pt | 絶対値は低いが上昇幅最大 |
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 | 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) |
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)。f"...{x}..." はf-string。文字列の中に {変数} と書くだけで埋め込めて、{x:.2f} のように書式も指定できます。17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 | # ── データ読み込み ───────────────────────────────────────────────────────────── 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) # ── 地域マップ ───────────────────────────────────────────────────────────────── region_map = { '北海道': '北海道・東北', '青森県': '北海道・東北', '岩手県': '北海道・東北', '宮城県': '北海道・東北', '秋田県': '北海道・東北', '山形県': '北海道・東北', '福島県': '北海道・東北', '茨城県': '関東', '栃木県': '関東', '群馬県': '関東', '埼玉県': '関東', '千葉県': '関東', '東京都': '関東', '神奈川県': '関東', '新潟県': '中部', '富山県': '中部', '石川県': '中部', '福井県': '中部', '山梨県': '中部', '長野県': '中部', '岐阜県': '中部', '静岡県': '中部', '愛知県': '中部', '三重県': '近畿', '滋賀県': '近畿', '京都府': '近畿', '大阪府': '近畿', '兵庫県': '近畿', '奈良県': '近畿', '和歌山県': '近畿', '鳥取県': '中国・四国', '島根県': '中国・四国', '岡山県': '中国・四国', '広島県': '中国・四国', '山口県': '中国・四国', '徳島県': '中国・四国', '香川県': '中国・四国', '愛媛県': '中国・四国', '高知県': '中国・四国', '福岡県': '九州・沖縄', '佐賀県': '九州・沖縄', '長崎県': '九州・沖縄', '熊本県': '九州・沖縄', '大分県': '九州・沖縄', '宮崎県': '九州・沖縄', '鹿児島県': '九州・沖縄', '沖縄県': '九州・沖縄' } region_colors = { '北海道・東北': '#4e9af1', '関東': '#e05c5c', '中部': '#f0a500', '近畿': '#5cb85c', '中国・四国': '#9b59b6', '九州・沖縄': '#f39c12' } |
print はしません。データや図が裏で更新されただけ。次のステップへ進みましょう。pd.read_csv(...) でCSVを読み込みます。encoding='cp932' は日本語Windows由来の文字コード、header=1 は「2行目を列名として使う」。df['地域コード'].str.match(r'^R\d{5}', ...) — 正規表現で「R+数字5桁」の行(47都道府県)だけTrueにし、真偽値で行をフィルタ。.astype(int) — 列を整数に変換(年度などを数値比較するため)。df['A'] / df['B'] — pandasの列同士の四則演算は要素ごと(element-wise)。forループ不要なのが強み。43 44 45 46 47 48 49 50 51 | # ── 指標作成 ────────────────────────────────────────────────────────────────── df_b['高齢化率'] = df_b['65歳以上人口'] / df_b['総人口'] * 100 df_b['保健医療費_人'] = df_b['保健医療費(二人以上の世帯)'] # 円/月 df_b['保育所数_万人'] = df_b['保育所等数'] / df_b['総人口'] * 10000 df_b['病院数_万人'] = df_b['一般病院数'] / df_b['総人口'] * 10000 df_b['消費支出'] = df_b['消費支出(二人以上の世帯)'] df_b['転入超過率'] = (df_b['転入者数(日本人移動者)'] - df_b['転出者数(日本人移動者)']) \ / df_b['総人口'] * 1000 df_b['地域'] = df_b['都道府県'].map(region_map) |
print はしません。データや図が裏で更新されただけ。次のステップへ進みましょう。.map() は「1対1の置き換え」、.apply() は「関数を当てる」。辞書なら .map()、ロジックなら .apply()。52 53 54 55 56 57 58 59 60 61 62 | # 2022年断面 df22 = df_b[df_b['年度'] == 2022].copy() print("=" * 60) print("2022年 断面データ(47都道府県)") print(f" N = {len(df22)}") print(f" 高齢化率: 平均 {df22['高齢化率'].mean():.1f}% " f"({df22['高齢化率'].min():.1f}〜{df22['高齢化率'].max():.1f}%)") print(f" 保健医療費: 平均 {df22['保健医療費_人'].mean():.0f}円/月 " f"({df22['保健医療費_人'].min():.0f}〜{df22['保健医療費_人'].max():.0f}円/月)") print() |
print はしません。データや図が裏で更新されただけ。次のステップへ進みましょう。[式 for x in リスト] はリスト内包表記。forループでappendする代わりに1行でリストを作れます。63 64 65 66 67 68 69 70 71 72 73 74 75 | # ── OLS 重回帰(標準化偏回帰係数) ──────────────────────────────────────────── y_col = '保健医療費_人' x_cols = ['高齢化率', '消費支出', '保育所数_万人', '病院数_万人', '転入超過率'] x_labels = { '高齢化率': '高齢化率(%)', '消費支出': '消費支出(円/月)', '保育所数_万人': '保育所数(万人当たり)', '病院数_万人': '病院数(万人当たり)', '転入超過率': '転入超過率(‰)', } d_reg = df22[[y_col] + x_cols].dropna() print(f"回帰分析 N = {len(d_reg)}") |
print はしません。データや図が裏で更新されただけ。次のステップへ進みましょう。r, p = stats.pearsonr(...) — Pythonは複数戻り値を同時に受け取れる(タプルアンパック)。76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 | # 標準化 d_std = (d_reg - d_reg.mean()) / d_reg.std() X_sm = sm.add_constant(d_std[x_cols]) result = sm.OLS(d_std[y_col], X_sm).fit() print(result.summary()) coef_df = pd.DataFrame({ '変数': x_cols, '標準化偏回帰係数': result.params[1:].values, '標準誤差': result.bse[1:].values, 'p値': result.pvalues[1:].values, }) coef_df['ラベル'] = coef_df['変数'].map(x_labels) print() print("標準化偏回帰係数:") print(coef_df[['ラベル', '標準化偏回帰係数', 'p値']].to_string(index=False)) print() print(f"R²={result.rsquared:.3f} adj.R²={result.rsquared_adj:.3f} " f"F({result.df_model:.0f},{result.df_resid:.0f})={result.fvalue:.2f} " f"p={result.f_pvalue:.2e}") |
print はしません。データや図が裏で更新されただけ。次のステップへ進みましょう。sm.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行で書けます。96 97 98 99 100 101 | # ── 相関係数(参考) ────────────────────────────────────────────────────────── print() print("保健医療費との相関:") for v in x_cols: r, p = stats.pearsonr(df22[v].dropna(), df22[y_col][df22[v].notna()]) print(f" {x_labels[v]}: r={r:.3f} p={p:.4f}") |
print はしません。データや図が裏で更新されただけ。次のステップへ進みましょう。stats.pearsonr(x, y) — Pearson相関係数 r と p値を同時に返します。df[col](1列)と df[[col1, col2]](複数列)でカッコの数が違います。リストを渡していると覚えるとミスを減らせます。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 132 133 134 135 136 137 | # ── 地域別平均(高齢化率・保健医療費) ──────────────────────────────────────── region_stats = df22.groupby('地域')[['高齢化率', '保健医療費_人']].mean().reset_index() print() print("地域別平均:") print(region_stats.to_string(index=False)) # ── ランキング(保健医療費/高齢者人口) ─────────────────────────────────────── df22_sorted = df22.sort_values('保健医療費_人', ascending=False) print() print("保健医療費 上位5都道府県:") print(df22_sorted[['都道府県', '保健医療費_人', '高齢化率']].head(5).to_string(index=False)) print("保健医療費 下位5都道府県:") print(df22_sorted[['都道府県', '保健医療費_人', '高齢化率']].tail(5).to_string(index=False)) df_ts = df_b[df_b['年度'].between(2012, 2023)].copy() df_ts_region = df_ts.groupby(['年度', '地域'])['高齢化率'].mean().reset_index() region_order = ['北海道・東北', '関東', '中部', '近畿', '中国・四国', '九州・沖縄'] fig1, ax1 = plt.subplots(figsize=(9, 5)) for region in region_order: d = df_ts_region[df_ts_region['地域'] == region].sort_values('年度') ax1.plot(d['年度'], d['高齢化率'], color=region_colors[region], marker='o', markersize=4, linewidth=2, label=region) ax1.set_title('図1: 地域別 高齢化率の推移(2012〜2023年)', fontsize=13, fontweight='bold', pad=12) ax1.set_xlabel('年度', fontsize=11) ax1.set_ylabel('高齢化率(%)', fontsize=11) ax1.legend(loc='upper left', fontsize=9, framealpha=0.9) ax1.set_xticks(range(2012, 2024)) ax1.set_xticklabels([str(y) for y in range(2012, 2024)], rotation=45, fontsize=8) ax1.yaxis.set_major_formatter(plt.FuncFormatter(lambda x, _: f'{x:.0f}%')) ax1.grid(axis='y', alpha=0.35, linestyle='--') ax1.grid(axis='x', alpha=0.2, linestyle=':') ax1.set_facecolor('#FAFAFA') |
print はしません。データや図が裏で更新されただけ。次のステップへ進みましょう。df.groupby('列').apply(関数) — グループごとに関数を適用。時系列や地域別の集計でよく使います。fig, ax = plt.subplots(...) — 図全体(fig)と軸(ax)を作る定番。以降は ax.bar(...) 等で操作。sort_values('列名', ascending=False) — 指定列で並べ替え(降順)。s[:-n]「末尾n文字を除く」/s[n:]「先頭n文字を除く」。スライス [start:stop:step] はリスト・タプル・文字列共通の基本ワザです。138 139 140 141 142 143 144 145 146 | # 2022年の国平均を強調 y2022_nat = df_ts[df_ts['年度'] == 2022]['高齢化率'].mean() ax1.axhline(y2022_nat, color='black', linestyle=':', alpha=0.5, linewidth=1) ax1.text(2023.05, y2022_nat, f'全国平均\n{y2022_nat:.1f}%', fontsize=8, va='center') plt.tight_layout() fig1.savefig(os.path.join(FIG_DIR, '2021_H5_3_fig1.png'), bbox_inches='tight') plt.close(fig1) print("\n図1 保存完了") |
============================================================
2022年 断面データ(47都道府県)
N = 47
高齢化率: 平均 31.4% (22.8〜38.6%)
保健医療費: 平均 14390円/月 (9411〜19107円/月)
回帰分析 N = 47
OLS Regression Results
==============================================================================
Dep. Variable: 保健医療費_人 R-squared: 0.597
Model: OLS Adj. R-squared: 0.548
Method: Least Squares F-statistic: 12.13
Date: Mon, 18 May 2026 Prob (F-statistic): 3.03e-07
Time: 11:23:51 Log-Likelihood: -44.845
No. Observations: 47 AIC: 101.7
Df Residuals: 41 BIC: 112.8
Df Model: 5
Covariance Type: nonrobust
==============================================================================
coef std err t P>|t| [0.025 0.975]
------------------------------------------------------------------------------
const -1.839e-16 0.098 -1.87e-15 1.000 -0.198 0.198
高齢化率 -0.4781 0.162 -2.958 0.005 -0.805 -0.152
消費支出 0.6549 0.119 5.490 0.000 0.414 0.896
保育所数_万人 -0.0805 0.122 -0.658 0.514 -0.327 0.166
病院数_万人 0.2989 0.126 2.364 0.023 0.044 0.554
転入超過率 -0.1544 0.155 -0.998 0.324 -0.467 0.158
==============================================================================
Omnibus: 0.713 Durbin-Watson: 2.164
Prob(Omnibus): 0.700 Jarque-Bera (JB): 0.809
Skew: 0.250 Prob(JB): 0.667
Kurtosis: 2.595 Cond. No. 3.59
==============================================================================
Notes:
[1] Standard Errors assume that the covariance matrix of the errors is correctly specified.
標準化偏回帰係数:
ラベル 標準化偏回帰係数 p値
高齢化率(%) -0.478134 0.005121
消費支出(円/月) 0.654936 0.000002
保育所数(万人当たり) -0.080502 0.513931
病院数(万人当たり) 0.298895 0.022899
転入超過率(‰) -0.154365 0.324127
R²=0.597 adj.R²=0.548 F(5,41)=12.13 p=3.03e-07
保健医療費との相関:
高齢化率(%): r=-0.468 p=0.0009
消費支出(円/月): r=0.696 p=0.0000
保育所数(万人当たり): r=-0.363 p=0.0121
病院数(万人当たり): r=-0.165 p=0.2671
転入超過率(‰): r=0.407 p=0.0045
地域別平均:
地域 高齢化率 保健医療費_人
中国・四国 33.458237 13700.000000
中部 31.028222 15006.000000
九州・沖縄 31.251790 14515.750000
北海道・東北 33.880937 12384.428571
近畿 30.109158 15016.142857
関東 27.875428 15719.285714
保健医療費 上位5都道府県:
都道府県 保健医療費_人 高齢化率
愛知県 19107 25.617078
京都府 18383 29.607843
東京都 17303 22.809517
石川県 16907 30.232558
鹿児島県 16549 33.461292
保健医療費 下位5都道府県:
都道府県 保健医療費_人 高齢化率
鳥取県 11638 33.088235
沖縄県 11587 23.433243
福井県 11522 31.208499
和歌山県 10846 33.997785
青森県 9411 34.800664
図1 保存完了ax.axhline / ax.axvline — 水平/垂直の点線。平均線や基準線として定番。np.cumsum(arr) は累積和、np.linspace(a, b, n) は「aからbを等間隔でn個」。NumPyの定石です。2022年断面データ(N=47)を用い、保健医療費(円/月)を目的変数とする重回帰モデルを構築した。比較のために各説明変数を標準化(平均0・標準偏差1)し、標準化偏回帰係数(β)として効果の大きさを比較する。
まず各説明変数と目的変数の単純相関(Pearson r)を確認する。
| 説明変数 | 相関係数(r) | p値 | 判定 | 解釈 |
|---|---|---|---|---|
| 消費支出(所得水準) | 0.696 | < 0.001 | ***有意 | 所得水準が最も強く正に関連 |
| 転入超過率 | 0.407 | 0.005 | **有意 | 人口流入と正の関係(豊かな都市圏) |
| 高齢化率 | −0.468 | 0.001 | ***有意 | 高齢化が進む地域ほど支出が低い(逆説) |
| 保育所数(万人あたり) | −0.363 | 0.012 | *有意 | 地方ほど保育所密度が高く保健費が低め |
| 病院数(万人あたり) | −0.165 | 0.267 | n.s. | 単純相関では有意差なし |
5変数を同時投入したOLS重回帰の結果、モデル全体の説明力はR²=0.597(adj.R²=0.548)と高い値を示した。
| 説明変数 | 標準化偏回帰係数(β) | p値 | 判定 |
|---|---|---|---|
| 消費支出(所得水準) | +0.655 | < 0.001 | *** |
| 高齢化率 | −0.478 | 0.005 | ** |
| 病院数(万人あたり) | +0.299 | 0.023 | * |
| 転入超過率 | −0.154 | 0.324 | n.s. |
| 保育所数(万人あたり) | −0.081 | 0.514 | n.s. |
| モデル適合度: R²=0.597, adj.R²=0.548, F(5,41)=12.13, p<0.001, N=47 | |||
単純相関は変数ペアの関係を示すが、交絡変数(第三の変数)の影響を含む。重回帰分析では複数の変数を同時に統制でき、「他の条件を一定にしたときの純粋な効果(偏回帰係数)」を推定できる。病院数は単純相関では有意でなかったが、重回帰では有意になった好例。
148 149 150 151 152 153 154 155 156 157 158 159 160 161 | fig2, ax2 = plt.subplots(figsize=(9, 6.5)) for _, row in df22.iterrows(): region = row['地域'] col = region_colors.get(region, '#888888') ax2.scatter(row['高齢化率'], row['保健医療費_人'], color=col, s=55, alpha=0.85, zorder=3, edgecolors='white', linewidths=0.5) # 都道府県ラベル(短縮) name = row['都道府県'].replace('県', '').replace('都', '').replace('道', '').replace('府', '') ax2.annotate(name, xy=(row['高齢化率'], row['保健医療費_人']), fontsize=6.5, ha='center', va='bottom', xytext=(0, 3), textcoords='offset points', color='#333') |
print はしません。データや図が裏で更新されただけ。次のステップへ進みましょう。fig, ax = plt.subplots(...) — 図全体(fig)と軸(ax)を作る定番。以降は ax.bar(...) 等で操作。for _, row in df.iterrows() — DataFrameを1行ずつ取り出すループ。1点ずつ描画したいときに使用。df['A'] / df['B'] — pandasの列同士の四則演算は要素ごと(element-wise)。forループ不要なのが強み。162 163 164 165 166 167 | # 回帰直線 x_reg = df22['高齢化率'].dropna() y_reg = df22['保健医療費_人'][x_reg.index] slope, intercept, r_val, p_val, _ = stats.linregress(x_reg, y_reg) x_line = np.linspace(x_reg.min(), x_reg.max(), 100) ax2.plot(x_line, slope * x_line + intercept, 'k--', linewidth=1.5, alpha=0.7, label=f'回帰直線 (r={r_val:.3f}, p={p_val:.3f})') |
print はしません。データや図が裏で更新されただけ。次のステップへ進みましょう。stats.linregress(x, y) — 単回帰の傾き・切片・r値・p値・標準誤差を返します。使わない値は _ で受け取り。.map() は「1対1の置き換え」、.apply() は「関数を当てる」。辞書なら .map()、ロジックなら .apply()。168 169 170 171 172 173 174 175 176 177 178 179 180 181 182 183 184 185 186 187 | # 凡例(地域) handles = [plt.Line2D([0], [0], marker='o', color='w', markerfacecolor=region_colors[r], markersize=8, label=r) for r in region_order] ax2.legend(handles=handles, loc='upper right', fontsize=8.5, framealpha=0.9, title='地域区分', title_fontsize=8) ax2.set_title('図2: 高齢化率と保健医療費の関係(2022年・47都道府県)', fontsize=12, fontweight='bold', pad=12) ax2.set_xlabel('高齢化率(%)', fontsize=11) ax2.set_ylabel('保健医療費(円/月・二人以上世帯)', fontsize=11) ax2.xaxis.set_major_formatter(plt.FuncFormatter(lambda x, _: f'{x:.0f}%')) ax2.yaxis.set_major_formatter(plt.FuncFormatter(lambda x, _: f'{x:,.0f}')) ax2.grid(alpha=0.3, linestyle='--') ax2.set_facecolor('#FAFAFA') plt.tight_layout() fig2.savefig(os.path.join(FIG_DIR, '2021_H5_3_fig2.png'), bbox_inches='tight') plt.close(fig2) print("図2 保存完了") |
図2 保存完了
[式 for x in リスト] はリスト内包表記。forループでappendする代わりに1行でリストを作れます。散布図(図2)とランキング図(図4)を組み合わせることで、高齢化率と保健医療費の関係、および地域別の格差構造を可視化した。
| 地域区分 | 平均高齢化率(2022) | 平均保健医療費 | 特徴 |
|---|---|---|---|
| 関東 | 27.9%(最低) | 15,719円(最高) | 低高齢化・高医療費。所得効果が強い |
| 近畿 | 30.1% | 15,016円 | 大都市圏(大阪・京都)が牽引 |
| 中部 | 31.0% | 15,006円 | 愛知県(全国1位)が平均を押し上げ |
| 九州・沖縄 | 31.3% | 14,516円 | 中位。鹿児島・大分は高い傾向 |
| 中国・四国 | 33.5% | 13,700円 | 高齢化進む一方で医療費は低め |
| 北海道・東北 | 33.9%(最高) | 12,384円(最低) | 高齢化最大・保健医療費最低。格差の象徴 |
47都道府県のデータを地域区分で集計・色分けすることで、全国的な傾向だけでなく「どの地域がどのような特徴を持つか」という空間的パターンが見えてくる。散布図のラベル表示は点数が多い場合に重なりやすいが、フォントサイズ調整と適切なオフセットで視認性を高められる。
189 190 191 192 193 194 | fig3, ax3 = plt.subplots(figsize=(8, 5)) coef_sorted = coef_df.sort_values('標準化偏回帰係数') colors3 = ['#e05c5c' if v < 0 else '#4e9af1' for v in coef_sorted['標準化偏回帰係数']] bars = ax3.barh(coef_sorted['ラベル'], coef_sorted['標準化偏回帰係数'], color=colors3, alpha=0.85, edgecolor='white', linewidth=0.5) |
print はしません。データや図が裏で更新されただけ。次のステップへ進みましょう。fig, ax = plt.subplots(...) — 図全体(fig)と軸(ax)を作る定番。以降は ax.bar(...) 等で操作。sort_values('列名', ascending=False) — 指定列で並べ替え(降順)。.map() は「1対1の置き換え」、.apply() は「関数を当てる」。辞書なら .map()、ロジックなら .apply()。195 196 197 198 199 200 201 202 203 204 205 206 207 208 209 210 211 212 | # 誤差バー ax3.errorbar(coef_sorted['標準化偏回帰係数'], range(len(coef_sorted)), xerr=1.96 * coef_sorted['標準誤差'], fmt='none', color='black', capsize=4, linewidth=1.2) # p値ラベル for i, (_, row) in enumerate(coef_sorted.iterrows()): sig_mark = '***' if row['p値'] < 0.001 else ('**' if row['p値'] < 0.01 else ('*' if row['p値'] < 0.05 else 'n.s.')) x_pos = row['標準化偏回帰係数'] + (0.02 if row['標準化偏回帰係数'] >= 0 else -0.02) ha = 'left' if row['標準化偏回帰係数'] >= 0 else 'right' ax3.text(x_pos, i, f"p={row['p値']:.3f} {sig_mark}", va='center', ha=ha, fontsize=9, color='#333') ax3.axvline(0, color='black', linewidth=0.8) ax3.set_title(f'図3: 標準化偏回帰係数(目的変数: 保健医療費)\nR²={result.rsquared:.3f}, adj.R²={result.rsquared_adj:.3f}, N=47', fontsize=11, fontweight='bold', pad=10) ax3.set_xlabel('標準化偏回帰係数 (β)', fontsize=11) ax3.grid(axis='x', alpha=0.35, linestyle='--') ax3.set_facecolor('#FAFAFA') |
print はしません。データや図が裏で更新されただけ。次のステップへ進みましょう。ax.axhline / ax.axvline — 水平/垂直の点線。平均線や基準線として定番。for _, row in df.iterrows() — DataFrameを1行ずつ取り出すループ。1点ずつ描画したいときに使用。[式 for x in リスト] はリスト内包表記。forループでappendする代わりに1行でリストを作れます。213 214 215 216 217 218 219 220 221 222 | # 凡例 from matplotlib.patches import Patch legend_els = [Patch(facecolor='#4e9af1', label='正の効果(保健医療費を増加)'), Patch(facecolor='#e05c5c', label='負の効果(保健医療費を減少)')] ax3.legend(handles=legend_els, loc='lower right', fontsize=8.5) plt.tight_layout() fig3.savefig(os.path.join(FIG_DIR, '2021_H5_3_fig3.png'), bbox_inches='tight') plt.close(fig3) print("図3 保存完了") |
図3 保存完了
import pandas as pd など — 必要なライブラリをまとめて呼び出します。as pd は短い別名(alias)。r, p = stats.pearsonr(...) — Pythonは複数戻り値を同時に受け取れる(タプルアンパック)。分析結果から、介護・福祉政策に関する以下の提言が導き出される。
統計分析は「相関関係」を明らかにするが、「因果関係」の立証は別の手続きが必要。例えば「高齢化率が高い→保健医療費が低い」という関係は、「高齢化地域は低所得」という交絡変数によるものである可能性が高い。政策提言では、分析で明らかになったことと、まだ不明な点(限界)を誠実に区別することが科学的誠実さの証。
224 225 226 227 228 229 | df_rank = df22.sort_values('保健医療費_人', ascending=True).copy() colors4 = [region_colors.get(r, '#888888') for r in df_rank['地域']] fig4, ax4 = plt.subplots(figsize=(10, 11)) bars4 = ax4.barh(df_rank['都道府県'], df_rank['保健医療費_人'], color=colors4, alpha=0.85, edgecolor='white', linewidth=0.4) |
print はしません。データや図が裏で更新されただけ。次のステップへ進みましょう。fig, ax = plt.subplots(...) — 図全体(fig)と軸(ax)を作る定番。以降は ax.bar(...) 等で操作。sort_values('列名', ascending=False) — 指定列で並べ替え(降順)。[式 for x in リスト] はリスト内包表記。forループでappendする代わりに1行でリストを作れます。230 231 232 233 234 235 236 237 238 239 | # 全国平均線 nat_avg = df22['保健医療費_人'].mean() ax4.axvline(nat_avg, color='black', linestyle='--', linewidth=1.5, alpha=0.7) ax4.text(nat_avg + 100, len(df_rank) - 1, f'全国平均\n{nat_avg:,.0f}円', va='top', ha='left', fontsize=8.5, color='#333') # 値ラベル for bar, val in zip(bars4, df_rank['保健医療費_人']): ax4.text(val + 50, bar.get_y() + bar.get_height() / 2, f'{val:,.0f}', va='center', ha='left', fontsize=7.5) |
print はしません。データや図が裏で更新されただけ。次のステップへ進みましょう。ax.axhline / ax.axvline — 水平/垂直の点線。平均線や基準線として定番。r, p = stats.pearsonr(...) — Pythonは複数戻り値を同時に受け取れる(タプルアンパック)。240 241 242 243 244 245 246 247 248 249 250 251 252 253 254 255 256 257 258 259 260 261 262 | # 凡例(地域) handles4 = [plt.Line2D([0], [0], marker='s', color='w', markerfacecolor=region_colors[r], markersize=10, label=r) for r in region_order] ax4.legend(handles=handles4, loc='lower right', fontsize=8.5, framealpha=0.9, title='地域区分', title_fontsize=8) ax4.set_title('図4: 都道府県別 保健医療費(2022年・二人以上世帯)\n地域別の格差に注目', fontsize=12, fontweight='bold', pad=12) ax4.set_xlabel('保健医療費(円/月)', fontsize=11) ax4.xaxis.set_major_formatter(plt.FuncFormatter(lambda x, _: f'{x:,.0f}')) ax4.grid(axis='x', alpha=0.35, linestyle='--') ax4.set_facecolor('#FAFAFA') ax4.tick_params(axis='y', labelsize=9) plt.tight_layout() fig4.savefig(os.path.join(FIG_DIR, '2021_H5_3_fig4.png'), bbox_inches='tight') plt.close(fig4) print("図4 保存完了") print() print("=" * 60) print("全図の生成が完了しました。") print(f"出力先: {os.path.abspath(FIG_DIR)}") |
print はしません。データや図が裏で更新されただけ。次のステップへ進みましょう。x if cond else y は三項演算子。リスト内包表記と組み合わせると、forとifを1行で書けます。263 264 265 266 267 268 269 270 271 272 273 274 275 | # ── HTML用の統計値を出力 ────────────────────────────────────────────────────── print() print("=== HTML記載用 統計値 ===") print(f"高齢化率 全国平均 (2022): {df22['高齢化率'].mean():.1f}%") print(f"高齢化率 最高: {df22.loc[df22['高齢化率'].idxmax(), '都道府県']} {df22['高齢化率'].max():.1f}%") print(f"高齢化率 最低: {df22.loc[df22['高齢化率'].idxmin(), '都道府県']} {df22['高齢化率'].min():.1f}%") print(f"保健医療費 全国平均 (2022): {df22['保健医療費_人'].mean():,.0f}円/月") print(f"保健医療費 最高: {df22.loc[df22['保健医療費_人'].idxmax(), '都道府県']} {df22['保健医療費_人'].max():,.0f}円") print(f"保健医療費 最低: {df22.loc[df22['保健医療費_人'].idxmin(), '都道府県']} {df22['保健医療費_人'].min():,.0f}円") print(f"保健医療費 格差倍率: {df22['保健医療費_人'].max() / df22['保健医療費_人'].min():.1f}倍") print(f"高齢化率×保健医療費 相関: r={stats.pearsonr(df22['高齢化率'], df22['保健医療費_人'])[0]:.3f}") print(f"OLS R²={result.rsquared:.3f} adj.R²={result.rsquared_adj:.3f}") print() |
print はしません。データや図が裏で更新されただけ。次のステップへ進みましょう。stats.pearsonr(x, y) — Pearson相関係数 r と p値を同時に返します。df[col](1列)と df[[col1, col2]](複数列)でカッコの数が違います。リストを渡していると覚えるとミスを減らせます。276 277 278 279 280 281 282 283 284 285 286 287 288 | # 地域別 高齢化率 2022 for region in region_order: val = df22[df22['地域'] == region]['高齢化率'].mean() fee = df22[df22['地域'] == region]['保健医療費_人'].mean() print(f" {region}: 高齢化率 {val:.1f}% 保健医療費 {fee:,.0f}円") # 高齢化率推移 print() print("高齢化率 全国平均推移:") for yr in [2012, 2015, 2018, 2022, 2023]: d = df_b[df_b['年度'] == yr] if len(d) > 0: print(f" {yr}年: {d['高齢化率'].mean():.1f}%") |
図4 保存完了 ============================================================ 全図の生成が完了しました。 出力先: /Users/shimpei/Dropbox/Works_Researches/2026 統計・データ解析コンペ/html/figures === HTML記載用 統計値 === 高齢化率 全国平均 (2022): 31.4% 高齢化率 最高: 秋田県 38.6% 高齢化率 最低: 東京都 22.8% 保健医療費 全国平均 (2022): 14,390円/月 保健医療費 最高: 愛知県 19,107円 保健医療費 最低: 青森県 9,411円 保健医療費 格差倍率: 2.0倍 高齢化率×保健医療費 相関: r=-0.468 OLS R²=0.597 adj.R²=0.548 北海道・東北: 高齢化率 33.9% 保健医療費 12,384円 関東: 高齢化率 27.9% 保健医療費 15,719円 中部: 高齢化率 31.0% 保健医療費 15,006円 近畿: 高齢化率 30.1% 保健医療費 15,016円 中国・四国: 高齢化率 33.5% 保健医療費 13,700円 九州・沖縄: 高齢化率 31.3% 保健医療費 14,516円 高齢化率 全国平均推移: 2012年: 25.6% 2015年: 28.0% 2018年: 30.0% 2022年: 31.4% 2023年: 31.6%
s[:-n]「末尾n文字を除く」/s[n:]「先頭n文字を除く」。スライス [start:stop:step] はリスト・タプル・文字列共通の基本ワザです。SSDSE-B 47都道府県データを用いた分析から、以下の主要な知見が得られた:
| データ | 出典 | 変数 |
|---|---|---|
| SSDSE-B-2026(都道府県別) | 統計数理研究所 SSDSE(社会・人口統計体系) | 高齢化率、消費支出、保健医療費、病院数、保育所数等 |
| 人口統計(65歳以上) | 総務省統計局(SSDSE-B収録) | 15歳未満・15〜64歳・65歳以上人口 |
| 消費支出統計 | 総務省 家計調査(SSDSE-B収録) | 消費支出・保健医療費等の費目別支出 |
本教育用コードはSSDSE-B-2026の実データを使用(合成データなし)。分析期間: 2012〜2023年。断面分析: 2022年(N=47都道府県)。
統計分析の解釈で初心者がやりがちな勘違いをまとめます。特に「相関と因果の混同」「p値の過信」は研究現場でもよく起きる落とし穴です。本文を読む前にも、読んだ後にも、目を通してみてください。
統計の基本用語を初心者向けに解説します。本文中で見慣れない言葉が出てきたら、ここに戻って確認してください。
統計手法について「何のためか」「結果をどう読むか」を初心者向けに解説します。
この研究をさらに発展させるための3つの方向性を示します。「今回わかったこと(X)」から「次に検証すべき仮説(Y)」を立て、「具体的に何をするか(Z)」まで考えてみましょう。
学んだだけでは身につきません。実際に手を動かすのが最強の学習方法です。本論文のスクリプトをベースに、以下のチャレンジに挑戦してみてください。難易度別に5つ用意しました。
本論文で学んだ手法は、研究の世界だけでなく、行政・企業・NPO の現場でも様々に活用されています。具体的なシーンを紹介します。
この論文を読んで初心者が抱きやすい疑問に、教育的観点から答えます。