このページの分析を自分で再現するには、以下の手順でデータを準備してください。コードの編集は不要です。
data/raw/ フォルダに入れます。html/figures/ に自動保存されます。
食費支出の地域格差は、経済格差・生活習慣・健康状態と密接に関わる社会的課題である。エンゲルの法則(低所得ほど食費の割合が高い)が示すように、食費支出のパターンは家計の豊かさを映す鏡でもある。しかし都道府県レベルで見ると、所得要因だけでは説明できない地域特性が存在する。
まず「食費支出と食生活・健康指標の地域格差分析」を統計的にとらえることが有効だと考えられる。 その理由は感覚や経験則だけでは、複雑な社会要因の中で「何が本当に効いているか」を見極めにくいからである。 本研究では公開データと統計手法を組み合わせ、この問いに定量的な答えを出すことを目指す。
本研究は、2022年の47都道府県データ(SSDSE-B)を用いて、食費支出の地域格差がどのような要因で説明されるかを相関分析・重回帰分析により定量的に検証した。また、食費と保健医療費・合計特殊出生率との関係を分析することで、食生活格差が健康・少子化問題とどのように絡み合っているかを探った。
エンゲル係数 相関分析 OLS重回帰 地域比較
統計数理研究所が提供するSSDSE(社会・人口統計体系データセット)のBシリーズ(都道府県別統計)を使用。2022年の47都道府県断面データを分析対象とした。
| データ | 収録単位 | 利用年度 | 出典 |
|---|---|---|---|
| SSDSE-B-2026.csv | 都道府県(47) | 2022年 | 統計数理研究所 |
| カテゴリ | 変数名 | 役割 | 単位 |
|---|---|---|---|
| 食費指標 | 食料費(二人以上の世帯) | 目的変数・食費水準 | 円/月 |
| 食料費割合(= 食料費÷消費支出) | 目的変数・エンゲル係数 | % | |
| 説明変数 | 消費支出(二人以上の世帯) | 所得水準の代理 | 円/月 |
| 高齢化率(65歳以上÷総人口) | 人口構成の影響 | % | |
| 保育所密度(保育所数÷人口×10万) | 子育て環境・年齢構成 | 施設/10万人 | |
| 合計特殊出生率 | 家族規模・食費構造 | — | |
| 健康指標 | 保健医療費(二人以上の世帯) | 医療支出との関係 | 円/月 |
| 合計特殊出生率 | 長期的健康・少子化指標 | — |
エンゲルの法則(1857年)とは「所得が低いほど、消費支出に占める食費の割合(エンゲル係数)が高くなる」という経験則。都道府県比較では、高消費支出の都市部で食料費割合が低くなる傾向があり、逆説的に「食費は多いが割合は低い」という現象が見られる。
2022年の47都道府県別食料費を地域区分(5区分)で色分けしてランキング表示する。
| 地域区分 | 平均食料費(円/月) | 最大 | 最小 |
|---|---|---|---|
| 関東 | 82,238 | 87,973(東京都) | 71,578(茨城県) |
| 中部 | 79,261 | 83,483 | 74,848 |
| 近畿 | 79,198 | 84,692 | 68,715 |
| 北海道・東北 | 76,239 | 79,952 | 73,037 |
| 中国・四国 | 72,186 | 78,205 | 67,889 |
| 九州・沖縄 | 71,667 | 75,957 | 68,318 |
食料費の絶対値(円/月)と食料費割合(エンゲル係数)では、都道府県のランキングが大きく異なる。大阪府は食料費の絶対値では中位だが、食料費割合(30.5%)では全国最高。これは消費支出全体が低い中で食費の占める割合が大きいことを意味する。分析目的に応じて、どの指標を使うか慎重に選択する必要がある。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 | import os, numpy as np, 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) |
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} のように書式も指定できます。18 19 20 21 22 23 24 | # ── 2022年断面データ ── df22 = df_b[df_b['年度'] == 2022].copy().reset_index(drop=True) # 派生変数の計算 df22['食料費割合'] = df22['食料費(二人以上の世帯)'] / df22['消費支出(二人以上の世帯)'] * 100 df22['高齢化率'] = df22['65歳以上人口'] / df22['総人口'] * 100 df22['保育所密度'] = df22['保育所等数'] / df22['総人口'] * 100000 |
print はしません。データや図が裏で更新されただけ。次のステップへ進みましょう。df['A'] / df['B'] — pandasの列同士の四則演算は要素ごと(element-wise)。forループ不要なのが強み。25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 | # 地域区分マップ region_map = { '北海道': '北海道・東北', '青森県': '北海道・東北', '岩手県': '北海道・東北', '宮城県': '北海道・東北', '秋田県': '北海道・東北', '山形県': '北海道・東北', '福島県': '北海道・東北', '茨城県': '関東', '栃木県': '関東', '群馬県': '関東', '埼玉県': '関東', '千葉県': '関東', '東京都': '関東', '神奈川県': '関東', '新潟県': '中部', '富山県': '中部', '石川県': '中部', '福井県': '中部', '山梨県': '中部', '長野県': '中部', '岐阜県': '中部', '静岡県': '中部', '愛知県': '中部', '三重県': '近畿', '滋賀県': '近畿', '京都府': '近畿', '大阪府': '近畿', '兵庫県': '近畿', '奈良県': '近畿', '和歌山県': '近畿', '鳥取県': '中国・四国', '島根県': '中国・四国', '岡山県': '中国・四国', '広島県': '中国・四国', '山口県': '中国・四国', '徳島県': '中国・四国', '香川県': '中国・四国', '愛媛県': '中国・四国', '高知県': '中国・四国', '福岡県': '九州・沖縄', '佐賀県': '九州・沖縄', '長崎県': '九州・沖縄', '熊本県': '九州・沖縄', '大分県': '九州・沖縄', '宮崎県': '九州・沖縄', '鹿児島県': '九州・沖縄', '沖縄県': '九州・沖縄' } region_colors = {'北海道・東北': '#4e9af1', '関東': '#e05c5c', '中部': '#f0a500', '近畿': '#5cb85c', '中国・四国': '#9b59b6', '九州・沖縄': '#f39c12'} df22['地域'] = df22['都道府県'].map(region_map) df_rank = df22[['都道府県', '食料費(二人以上の世帯)', '地域']].copy() df_rank = df_rank.sort_values('食料費(二人以上の世帯)', ascending=True).reset_index(drop=True) fig1, ax1 = plt.subplots(figsize=(10, 12)) colors_bar = [region_colors[r] for r in df_rank['地域']] bars = ax1.barh(df_rank['都道府県'], df_rank['食料費(二人以上の世帯)'], color=colors_bar, edgecolor='white', linewidth=0.5) |
print はしません。データや図が裏で更新されただけ。次のステップへ進みましょう。fig, ax = plt.subplots(...) — 図全体(fig)と軸(ax)を作る定番。以降は ax.bar(...) 等で操作。sort_values('列名', ascending=False) — 指定列で並べ替え(降順)。.map() は「1対1の置き換え」、.apply() は「関数を当てる」。辞書なら .map()、ロジックなら .apply()。54 55 56 57 58 59 60 61 62 | # 平均線 mean_food = df22['食料費(二人以上の世帯)'].mean() ax1.axvline(mean_food, color='black', linestyle='--', linewidth=1.2, alpha=0.7) ax1.text(mean_food + 200, 46, f'全国平均\n{mean_food:,.0f}円', fontsize=9, va='top', ha='left') ax1.set_xlabel('食料費(円/月、二人以上の世帯)', fontsize=12) ax1.set_title('都道府県別 食料費ランキング(2022年)', fontsize=14, fontweight='bold', pad=12) ax1.set_xlim(60000, 95000) ax1.tick_params(axis='y', labelsize=8.5) |
print はしません。データや図が裏で更新されただけ。次のステップへ進みましょう。ax.axhline / ax.axvline — 水平/垂直の点線。平均線や基準線として定番。[式 for x in リスト] はリスト内包表記。forループでappendする代わりに1行でリストを作れます。63 64 65 66 67 68 69 70 71 | # 凡例 from matplotlib.patches import Patch legend_elements = [Patch(facecolor=v, label=k) for k, v in region_colors.items()] ax1.legend(handles=legend_elements, loc='lower right', fontsize=9, framealpha=0.8) plt.tight_layout() fig1.savefig(os.path.join(FIG_DIR, '2020_U5_4_fig1.png'), bbox_inches='tight') plt.close(fig1) print('[OK] fig1 saved') |
[OK] fig1 saved
import pandas as pd など — 必要なライブラリをまとめて呼び出します。as pd は短い別名(alias)。r, p = stats.pearsonr(...) — Pythonは複数戻り値を同時に受け取れる(タプルアンパック)。食料費割合(エンゲル係数)を目的変数とし、消費支出・高齢化率・保育所密度・合計特殊出生率の4変数を説明変数とするOLS重回帰を実施した。変数の効果を比較するため、説明変数はすべて標準化(平均0・標準偏差1)して投入した。
| 説明変数 | 標準化係数(β) | t値 | p値 | 解釈 |
|---|---|---|---|---|
| 消費支出 | −0.746 | −4.19 | <0.001** | 消費支出が高いほど食料費割合は低い(エンゲル効果) |
| 合計特殊出生率 | −0.908 | −4.66 | <0.001** | 出生率が高い地域ほど食料費割合が低い(子育て世代の食費抑制?) |
| 高齢化率 | −0.487 | −2.94 | 0.005** | 高齢化が進むほど食料費割合は低い(高齢者は食費節約傾向) |
| 保育所密度 | +0.262 | +1.24 | 0.224 n.s. | 非有意(単独では食料費割合に明確な影響なし) |
説明変数のスケール(単位)が異なる場合、非標準化係数では変数間の「効果の大きさ」を比較できない。説明変数を標準化(z-score変換)すれば、βは「他の変数を固定したとき、その変数が1標準偏差変化すると目的変数が何単位変化するか」を意味する。また、「高齢化率が高い→食料費割合が低い」という符号は直感に反するが、消費支出を同時に投入することで交絡が調整されている可能性を考慮する必要がある。
73 74 75 76 77 78 79 80 81 82 | fig2, ax2 = plt.subplots(figsize=(9, 7)) for region, grp in df22.groupby('地域'): ax2.scatter(grp['消費支出(二人以上の世帯)'], grp['食料費(二人以上の世帯)'], color=region_colors[region], label=region, s=60, zorder=3, alpha=0.85) for _, row in grp.iterrows(): ax2.annotate(row['都道府県'], xy=(row['消費支出(二人以上の世帯)'], row['食料費(二人以上の世帯)']), fontsize=6.5, alpha=0.8, ha='center', va='bottom', xytext=(0, 4), textcoords='offset points') |
print はしません。データや図が裏で更新されただけ。次のステップへ進みましょう。df.groupby('列').apply(関数) — グループごとに関数を適用。時系列や地域別の集計でよく使います。fig, ax = plt.subplots(...) — 図全体(fig)と軸(ax)を作る定番。以降は ax.bar(...) 等で操作。for _, row in df.iterrows() — DataFrameを1行ずつ取り出すループ。1点ずつ描画したいときに使用。df['A'] / df['B'] — pandasの列同士の四則演算は要素ごと(element-wise)。forループ不要なのが強み。83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 | # 回帰線 x_arr = df22['消費支出(二人以上の世帯)'].values y_arr = df22['食料費(二人以上の世帯)'].values slope, intercept, r_val, p_val, _ = stats.linregress(x_arr, y_arr) x_line = np.linspace(x_arr.min(), x_arr.max(), 200) ax2.plot(x_line, intercept + slope * x_line, 'k-', linewidth=1.5, alpha=0.7, label=f'回帰線 (r={r_val:.3f}, p<0.001)') ax2.set_xlabel('消費支出合計(円/月)', fontsize=12) ax2.set_ylabel('食料費(円/月)', fontsize=12) ax2.set_title('消費支出と食料費の関係(2022年、47都道府県)\n─ エンゲル係数的観点から地域間格差を検討 ─', fontsize=13, fontweight='bold', pad=10) ax2.legend(fontsize=9, loc='upper left', framealpha=0.85, ncol=2) ax2.grid(True, alpha=0.3) plt.tight_layout() fig2.savefig(os.path.join(FIG_DIR, '2020_U5_4_fig2.png'), bbox_inches='tight') plt.close(fig2) print('[OK] fig2 saved') |
[OK] fig2 saved
stats.linregress(x, y) — 単回帰の傾き・切片・r値・p値・標準誤差を返します。使わない値は _ で受け取り。.map() は「1対1の置き換え」、.apply() は「関数を当てる」。辞書なら .map()、ロジックなら .apply()。食費支出のパターンは、保健医療費や合計特殊出生率などの健康・人口指標とどのように関係しているか。Pearson相関行列によって変数間の関係を俯瞰的に把握する。
| 変数ペア | 相関係数 r | 有意性 | 解釈 |
|---|---|---|---|
| 消費支出 ↔ 食料費 | +0.722 | p<0.001** | 所得が高い都道府県ほど食料費が多い(強い正の関係) |
| 食料費 ↔ 保健医療費 | +0.512 | p<0.001** | 食料費の多い地域は保健医療費も多い傾向 |
| 食料費 ↔ 合計特殊出生率 | −0.620 | p<0.001** | 食料費が高い(都市型)地域ほど出生率が低い |
| 食料費割合 ↔ 合計特殊出生率 | −0.433 | p=0.002** | エンゲル係数が高い地域ほど出生率が低い(消費余裕のなさ?) |
| 消費支出 ↔ 保健医療費 | +0.696 | p<0.001** | 消費支出と医療費の強い共変動 |
「食料費↔保健医療費 r=+0.512」は一見、「食費が多いほど医療費がかかる」と読めるが、消費支出(所得の代理)という共通の交絡変数が両者を同時に押し上げている可能性が高い。偏相関(partial correlation)で消費支出の影響を除去すれば、純粋な食費と医療費の関係を測定できる。交絡変数の存在を常に意識することがデータ分析の基本姿勢。
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 138 139 | corr_cols_raw = [ '食料費(二人以上の世帯)', '食料費割合', '消費支出(二人以上の世帯)', '保健医療費(二人以上の世帯)', '合計特殊出生率', '高齢化率', ] corr_labels = ['食料費', '食料費割合\n(エンゲル係数)', '消費支出', '保健医療費', '合計特殊\n出生率', '高齢化率'] df_corr = df22[corr_cols_raw].copy() df_corr.columns = corr_labels corr_mat = df_corr.corr() fig3, ax3 = plt.subplots(figsize=(7, 6)) im = ax3.imshow(corr_mat.values, cmap='RdBu_r', vmin=-1, vmax=1, aspect='auto') plt.colorbar(im, ax=ax3, fraction=0.046, pad=0.04) n = len(corr_labels) ax3.set_xticks(range(n)) ax3.set_yticks(range(n)) ax3.set_xticklabels(corr_labels, fontsize=9) ax3.set_yticklabels(corr_labels, fontsize=9) for i in range(n): for j in range(n): val = corr_mat.values[i, j] color = 'white' if abs(val) > 0.6 else 'black' ax3.text(j, i, f'{val:.2f}', ha='center', va='center', fontsize=10, fontweight='bold', color=color) ax3.set_title('食費・健康関連変数の相関行列(Pearson、2022年47都道府県)', fontsize=12, fontweight='bold', pad=12) plt.tight_layout() fig3.savefig(os.path.join(FIG_DIR, '2020_U5_4_fig3.png'), bbox_inches='tight') plt.close(fig3) print('[OK] fig3 saved') |
[OK] fig3 saved
fig, ax = plt.subplots(...) — 図全体(fig)と軸(ax)を作る定番。以降は ax.bar(...) 等で操作。.map() は「1対1の置き換え」、.apply() は「関数を当てる」。辞書なら .map()、ロジックなら .apply()。重回帰分析と相関分析の結果を総合すると、食費格差の縮小に向けていくつかの政策的示唆が得られる。
| 課題 | 根拠 | 政策方向性 |
|---|---|---|
| 地域間食費格差(約2万円/月) | 消費支出との強相関(r=0.72) | 地方の所得・雇用向上 |
| 都市部の高エンゲル係数(大阪:30.5%) | 消費支出が低い中での食費比率高 | 低所得世帯への食費補助・フードバンク |
| 食料費↔出生率の負の相関 | r=−0.62(食料費高→出生率低) | 子育て世代への食費支援・保育施設拡充 |
| 高齢化地域の食費節約傾向 | 高齢化率β=−0.49(有意) | 高齢者向け食環境整備(宅食・共食) |
141 142 143 144 145 146 147 148 149 150 151 152 | y_reg = df22['食料費割合'] X_reg = df22[['消費支出(二人以上の世帯)', '高齢化率', '保育所密度', '合計特殊出生率']].copy() X_std = (X_reg - X_reg.mean()) / X_reg.std() X_std = sm.add_constant(X_std) model = sm.OLS(y_reg, X_std).fit() coef_names = ['消費支出', '高齢化率', '保育所密度', '合計特殊出生率'] coefs = model.params.values[1:] ci_low = model.conf_int().values[1:, 0] ci_high = model.conf_int().values[1:, 1] pvals = model.pvalues.values[1:] |
print はしません。データや図が裏で更新されただけ。次のステップへ進みましょう。sm.add_constant(X) — 切片項(定数1の列)を先頭に追加。statsmodelsで必須。sm.OLS(y, X).fit() — 最小二乗法でモデルを推定。model.params, model.pvalues, model.conf_int() で結果取得。[式 for x in リスト] はリスト内包表記。forループでappendする代わりに1行でリストを作れます。153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170 171 172 173 174 175 176 177 178 179 180 181 182 183 184 185 | # p値で色分け bar_colors = ['#e05c5c' if p < 0.05 else '#aaaaaa' for p in pvals] fig4, ax4 = plt.subplots(figsize=(8, 5)) y_pos = np.arange(len(coef_names)) ax4.barh(y_pos, coefs, color=bar_colors, height=0.5, zorder=3) ax4.errorbar(coefs, y_pos, xerr=[coefs - ci_low, ci_high - coefs], fmt='none', color='black', capsize=4, linewidth=1.5, zorder=4) ax4.axvline(0, color='black', linewidth=1.0) ax4.set_yticks(y_pos) ax4.set_yticklabels(coef_names, fontsize=11) ax4.set_xlabel('標準化偏回帰係数(β)', fontsize=12) ax4.set_title(f'食料費割合を目的変数とする重回帰分析\n標準化偏回帰係数(R²={model.rsquared:.3f}, adj.R²={model.rsquared_adj:.3f})', fontsize=12, fontweight='bold', pad=10) ax4.grid(True, axis='x', alpha=0.3) for i, (c, p) in enumerate(zip(coefs, pvals)): sig_label = '**' if p < 0.01 else ('*' if p < 0.05 else 'n.s.') offset = 0.02 if c >= 0 else -0.02 ha = 'left' if c >= 0 else 'right' ax4.text(c + offset, i, sig_label, va='center', ha=ha, fontsize=11, fontweight='bold', color='#cc0000' if p < 0.05 else '#888888') from matplotlib.patches import Patch legend_items = [Patch(facecolor='#e05c5c', label='p < 0.05(有意)'), Patch(facecolor='#aaaaaa', label='n.s.(非有意)')] ax4.legend(handles=legend_items, loc='lower right', fontsize=9) plt.tight_layout() fig4.savefig(os.path.join(FIG_DIR, '2020_U5_4_fig4.png'), bbox_inches='tight') plt.close(fig4) print('[OK] fig4 saved') |
[OK] fig4 saved
import pandas as pd など — 必要なライブラリをまとめて呼び出します。as pd は短い別名(alias)。fig, ax = plt.subplots(...) — 図全体(fig)と軸(ax)を作る定番。以降は ax.bar(...) 等で操作。ax.axhline / ax.axvline — 水平/垂直の点線。平均線や基準線として定番。r, p = stats.pearsonr(...) — Pythonは複数戻り値を同時に受け取れる(タプルアンパック)。186 187 188 189 190 191 192 193 194 195 196 197 198 199 200 201 202 203 204 205 206 207 208 209 210 | print('\n=== 基礎統計 ===') print(f'全国平均食料費: {df22["食料費(二人以上の世帯)"].mean():,.0f}円/月') print(f'全国平均食料費割合: {df22["食料費割合"].mean():.2f}%') print(f'食料費 最大: {df22.loc[df22["食料費(二人以上の世帯)"].idxmax(), "都道府県"]} ({df22["食料費(二人以上の世帯)"].max():,.0f}円)') print(f'食料費 最小: {df22.loc[df22["食料費(二人以上の世帯)"].idxmin(), "都道府県"]} ({df22["食料費(二人以上の世帯)"].min():,.0f}円)') print(f'食料費 最大最小差: {df22["食料費(二人以上の世帯)"].max() - df22["食料費(二人以上の世帯)"].min():,.0f}円') print(f'食料費割合 最大: {df22.loc[df22["食料費割合"].idxmax(), "都道府県"]} ({df22["食料費割合"].max():.1f}%)') print(f'食料費割合 最小: {df22.loc[df22["食料費割合"].idxmin(), "都道府県"]} ({df22["食料費割合"].min():.1f}%)') print('\n=== 相関係数 ===') r_spend, p_spend = stats.pearsonr(df22['消費支出(二人以上の世帯)'], df22['食料費(二人以上の世帯)']) r_health, p_health = stats.pearsonr(df22['食料費(二人以上の世帯)'], df22['保健医療費(二人以上の世帯)']) r_tfr, p_tfr = stats.pearsonr(df22['食料費(二人以上の世帯)'], df22['合計特殊出生率']) r_eng_tfr, p_eng_tfr = stats.pearsonr(df22['食料費割合'], df22['合計特殊出生率']) print(f'消費支出 ↔ 食料費: r={r_spend:.3f}, p={p_spend:.4f}') print(f'食料費 ↔ 保健医療費: r={r_health:.3f}, p={p_health:.4f}') print(f'食料費 ↔ 合計特殊出生率: r={r_tfr:.3f}, p={p_tfr:.4f}') print(f'食料費割合 ↔ 合計特殊出生率: r={r_eng_tfr:.3f}, p={p_eng_tfr:.4f}') print('\n=== 重回帰分析 ===') print(model.summary()) print('\n=== 地域別平均食料費 ===') region_stats = df22.groupby('地域')['食料費(二人以上の世帯)'].agg(['mean','std','min','max']) print(region_stats.round(0)) |
=== 基礎統計 ===
全国平均食料費: 76,598円/月
全国平均食料費割合: 26.47%
食料費 最大: 東京都 (87,973円)
食料費 最小: 愛媛県 (67,889円)
食料費 最大最小差: 20,084円
食料費割合 最大: 大阪府 (30.5%)
食料費割合 最小: 山口県 (23.3%)
=== 相関係数 ===
消費支出 ↔ 食料費: r=0.722, p=0.0000
食料費 ↔ 保健医療費: r=0.512, p=0.0002
食料費 ↔ 合計特殊出生率: r=-0.620, p=0.0000
食料費割合 ↔ 合計特殊出生率: r=-0.433, p=0.0023
=== 重回帰分析 ===
OLS Regression Results
==============================================================================
Dep. Variable: 食料費割合 R-squared: 0.502
Model: OLS Adj. R-squared: 0.455
Method: Least Squares F-statistic: 10.60
Date: Mon, 18 May 2026 Prob (F-statistic): 4.98e-06
Time: 11:23:46 Log-Likelihood: -65.327
No. Observations: 47 AIC: 140.7
Df Residuals: 42 BIC: 149.9
Df Model: 4
Covariance Type: nonrobust
=================================================================================
coef std err t P>|t| [0.025 0.975]
---------------------------------------------------------------------------------
const 26.4721 0.150 176.607 0.000 26.170 26.775
消費支出(二人以上の世帯) -0.7464 0.178 -4.189 0.000 -1.106 -0.387
高齢化率 -0.4867 0.166 -2.937 0.005 -0.821 -0.152
保育所密度 0.2616 0.212 1.235 0.224 -0.166 0.689
合計特殊出生率 -0.9076 0.195 -4.657 0.000 -1.301 -0.514
==============================================================================
Omnibus: 0.079 Durbin-Watson: 1.923
Prob(Omnibus): 0.962 Jarque-Bera (JB): 0.216
Skew: -0.086 Prob(JB): 0.897
Kurtosis: 2.715 Cond. No. 2.53
==============================================================================
Notes:
[1] Standard Errors assume that the covariance matrix of the errors is correctly specified.
=== 地域別平均食料費 ===
mean std min max
地域
中国・四国 72186.0 2958.0 67889 78205
中部 79261.0 3654.0 74848 83483
九州・沖縄 71667.0 2816.0 68318 75957
北海道・東北 76239.0 2748.0 73037 79952
近畿 79198.0 6220.0 68715 84692
関東 82238.0 6008.0 71578 87973df.groupby('列').apply(関数) — グループごとに関数を適用。時系列や地域別の集計でよく使います。stats.pearsonr(x, y) — Pearson相関係数 r と p値を同時に返します。r, p = stats.pearsonr(...) — Pythonは複数戻り値を同時に受け取れる(タプルアンパック)。SSDSE-B(2022年、47都道府県)を用いた食費格差分析の結果、以下の知見が得られた:
| データ | 出典 |
|---|---|
| SSDSE-B 都道府県別統計(2022年) | 統計数理研究所 SSDSE(社会・人口統計体系) |
| 消費支出・食料費・保健医療費 | 家計調査(総務省統計局) |
| 合計特殊出生率・高齢化率・保育所数 | 人口動態統計(厚生労働省) |
分析はSSDSE-B-2026.csvの実データを使用(合成データ不使用)。2022年断面データ、47都道府県(地域コードR\d{5})。
統計分析の解釈で初心者がやりがちな勘違いをまとめます。特に「相関と因果の混同」「p値の過信」は研究現場でもよく起きる落とし穴です。本文を読む前にも、読んだ後にも、目を通してみてください。
統計の基本用語を初心者向けに解説します。本文中で見慣れない言葉が出てきたら、ここに戻って確認してください。
統計手法について「何のためか」「結果をどう読むか」を初心者向けに解説します。
この研究をさらに発展させるための3つの方向性を示します。「今回わかったこと(X)」から「次に検証すべき仮説(Y)」を立て、「具体的に何をするか(Z)」まで考えてみましょう。
学んだだけでは身につきません。実際に手を動かすのが最強の学習方法です。本論文のスクリプトをベースに、以下のチャレンジに挑戦してみてください。難易度別に5つ用意しました。
本論文で学んだ手法は、研究の世界だけでなく、行政・企業・NPO の現場でも様々に活用されています。具体的なシーンを紹介します。
この論文を読んで初心者が抱きやすい疑問に、教育的観点から答えます。