このページの分析を自分で再現するには、以下の手順でデータを準備してください。コードの編集は不要です。
data/raw/ フォルダに入れます。html/figures/ に自動保存されます。
住宅費(居住コスト)は家計支出の中でも最も地域差が大きい項目の一つである。都市圏への人口集中が進む日本において、住居費の格差は単なる地域経済の反映にとどまらず、移住・定住行動、少子高齢化、地方創生政策と深く関わる問題である。
まず「住宅費・居住コストの地域格差と決定要因分析」を統計的にとらえることが有効だと考えられる。 その理由は感覚や経験則だけでは、複雑な社会要因の中で「何が本当に効いているか」を見極めにくいからである。 本研究では公開データと統計手法を組み合わせ、この問いに定量的な答えを出すことを目指す。
住宅費の地域格差を生む要因として、以下の仮説が考えられる。
| 仮説 | 指標(代理変数) | 予想符号 |
|---|---|---|
| 都市集積仮説:地価が高い都市ほど住居費も高い | 住宅地標準価格(log) | 正(+) |
| 需要圧力仮説:人口流入が多いほど住居費が上昇 | 転入率(人口千人あたり) | 正(+) |
| 所得水準仮説:豊かな地域では住居費も高い | 消費支出総額(所得水準の代理) | 正(+) |
| 高齢化仮説:高齢化が進む地域では需要が縮小 | 高齢化率(65歳以上人口比率) | 負(-) |
| 将来需要仮説:出生率が高い地域では将来の需要も高い | 合計特殊出生率 | 正(+) |
SSDSE-B 重回帰分析(OLS) 地域比較 相関分析 時系列分析
SSDSE-B(社会・人口統計体系 都道府県データセット)2026年版を使用した。47都道府県の横断分析には2022年度データを用い、時系列分析には2012〜2023年度データを使用した。
| データ | 出典 | 観測数 | 期間 |
|---|---|---|---|
| SSDSE-B-2026 | 統計センター(SSDSE) | 47都道府県 × 12年 = 564観測 | 2012〜2023年度 |
| 横断分析用 | 2022年度断面 | 47都道府県 | 2022年度 |
| 種別 | 変数名 | SSDSE列名 | 単位 |
|---|---|---|---|
| 目的変数 | 住居費 | 住居費(二人以上の世帯) | 円/月 |
| 説明変数 | 住宅地価格(log) | 標準価格(平均価格)(住宅地) | 円/m²(log変換) |
| 転入率 | 転入者数(日本人移動者)÷ 総人口 × 1000 | 人/千人 | |
| 消費支出 | 消費支出(二人以上の世帯) | 円/月 | |
| 高齢化率 | 65歳以上人口 ÷ 総人口 × 100 | % | |
| 合計特殊出生率 | 合計特殊出生率 | — |
2022年度における47都道府県の住居費(二人以上の世帯・月額)を見ると、全国平均は約19,244円であり、都道府県間に大きな格差が確認される。
| 地域区分 | 平均住居費(円/月) | 特徴 |
|---|---|---|
| 関東 | 約22,000〜30,000 | 東京都を筆頭に高水準。転入超過が持続。 |
| 近畿 | 約18,000〜26,000 | 大阪・京都は高め。奈良は持ち家比率高く高水準。 |
| 九州・沖縄 | 約18,000〜30,000 | 熊本・沖縄は旺盛な移住需要で高め。 |
| 中部 | 約13,000〜22,000 | 愛知は高め。福井・静岡は低い。 |
| 北海道・東北 | 約10,000〜25,000 | 秋田・青森は低く、北海道・宮城は中程度。 |
| 中国・四国 | 約14,000〜22,000 | 広島は中程度。和歌山・高知は低め。 |
SSDSE-B の「住居費(二人以上の世帯)」は総務省家計調査に基づく月額平均支出である。「住居費」には家賃・地代のほか、設備修繕・維持費が含まれる。持ち家比率が高い地域では家賃支払いが少ないため、住居費が低く出る場合がある(福井県が最低の主因)。地価や居住コストの絶対値とは異なることに注意が必要。
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 43 44 45 46 | # ── データ読み込み ────────────────────────────────── 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ループ不要なのが強み。47 48 49 50 51 52 53 54 55 56 57 58 59 60 | # ── 2022年断面データ ────────────────────────────── df22 = df_b[df_b['年度'] == 2022].copy() df22['地域'] = df22['都道府県'].map(region_map) # 派生変数 df22['転入率'] = df22['転入者数(日本人移動者)'] / df22['総人口'] * 1000 # 人口千人あたり転入者数 df22['高齢化率'] = df22['65歳以上人口'] / df22['総人口'] * 100 # % df22['住宅地価格'] = df22['標準価格(平均価格)(住宅地)'] # 円/m²(都市集積の代理) df22['住宅地価格_log'] = np.log(df22['住宅地価格']) df22 = df22.sort_values('住居費(二人以上の世帯)', ascending=False).reset_index(drop=True) Y_COL = '住居費(二人以上の世帯)' # 目的変数 X_COLS = ['住宅地価格_log', '転入率', '消費支出(二人以上の世帯)', '高齢化率', '合計特殊出生率'] X_LABELS = ['住宅地価格\n(log, 都市集積)', '転入率\n(需要代理)', '消費支出\n(所得水準)', '高齢化率\n(%)', '合計特殊\n出生率'] |
print はしません。データや図が裏で更新されただけ。次のステップへ進みましょう。sort_values('列名', ascending=False) — 指定列で並べ替え(降順)。.map() は「1対1の置き換え」、.apply() は「関数を当てる」。辞書なら .map()、ロジックなら .apply()。61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 | # ── OLS重回帰 ────────────────────────────────────── Y = df22[Y_COL] X_raw = df22[X_COLS].copy() X_mat = sm.add_constant(X_raw) model = sm.OLS(Y, X_mat).fit() # 標準化偏回帰係数 Y_std = (Y - Y.mean()) / Y.std() X_std_df = (X_raw - X_raw.mean()) / X_raw.std() X_std_mat = sm.add_constant(X_std_df) model_std = sm.OLS(Y_std, X_std_mat).fit() std_coefs = model_std.params[1:].values std_pvals = model_std.pvalues[1:].values print("=" * 60) print("OLS 重回帰分析(住居費の決定要因)") print("=" * 60) print(model.summary()) print() print("標準化偏回帰係数:") for lbl, c, p in zip(X_LABELS, std_coefs, std_pvals): sig = "**" if p < 0.01 else ("*" if p < 0.05 else "n.s.") print(f" {lbl.replace(chr(10),'')}: β={c:.4f} p={p:.4f} {sig}") print() print(f"R² = {model.rsquared:.4f}, 調整済みR² = {model.rsquared_adj:.4f}") print(f"F統計量 = {model.fvalue:.3f}, p(F) = {model.f_pvalue:.4f}") |
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行でリストを作れます。87 88 89 90 91 92 93 94 95 | # ── 記述統計(出力用) ────────────────────────────── max_val = df22[Y_COL].max() min_val = df22[Y_COL].min() mean_val = df22[Y_COL].mean() max_pref = df22.loc[df22[Y_COL].idxmax(), '都道府県'] min_pref = df22.loc[df22[Y_COL].idxmin(), '都道府県'] print() print(f"住居費 最大: {max_pref} {max_val:,.0f}円 最小: {min_pref} {min_val:,.0f}円 全国平均: {mean_val:,.0f}円") print(f"最大/最小 比率: {max_val/min_val:.1f}倍") |
print はしません。データや図が裏で更新されただけ。次のステップへ進みましょう。r, p = stats.pearsonr(...) — Pythonは複数戻り値を同時に受け取れる(タプルアンパック)。96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 | # 転入率と住居費の相関 r_nyusu, p_nyusu = stats.pearsonr(df22['転入率'], df22[Y_COL]) r_price, p_price = stats.pearsonr(df22['住宅地価格'], df22[Y_COL]) r_aging, p_aging = stats.pearsonr(df22['高齢化率'], df22[Y_COL]) print(f"\n相関係数:") print(f" 転入率 vs 住居費: r={r_nyusu:.3f}, p={p_nyusu:.4f}") print(f" 住宅地価格 vs 住居費: r={r_price:.3f}, p={p_price:.4f}") print(f" 高齢化率 vs 住居費: r={r_aging:.3f}, p={p_aging:.4f}") fig1, ax1 = plt.subplots(figsize=(14, 7)) df_sorted = df22.sort_values(Y_COL, ascending=True) bar_colors = [region_colors[r] for r in df_sorted['地域']] bars = ax1.barh(df_sorted['都道府県'], df_sorted[Y_COL] / 1000, color=bar_colors, edgecolor='none', height=0.75) |
print はしません。データや図が裏で更新されただけ。次のステップへ進みましょう。fig, ax = plt.subplots(...) — 図全体(fig)と軸(ax)を作る定番。以降は ax.bar(...) 等で操作。sort_values('列名', ascending=False) — 指定列で並べ替え(降順)。stats.pearsonr(x, y) — Pearson相関係数 r と p値を同時に返します。x if cond else y は三項演算子。リスト内包表記と組み合わせると、forとifを1行で書けます。112 113 114 115 116 117 | # 全国平均線 mean_k = mean_val / 1000 ax1.axvline(mean_k, color='#333', linewidth=1.5, linestyle='--', label=f'全国平均 {mean_val:,.0f}円') ax1.set_xlabel('住居費(二人以上の世帯)[千円/月]', fontsize=12) ax1.set_title('図1: 都道府県別 住居費ランキング(2022年度)', fontsize=14, fontweight='bold', pad=12) ax1.tick_params(axis='y', labelsize=8.5) |
print はしません。データや図が裏で更新されただけ。次のステップへ進みましょう。ax.axhline / ax.axvline — 水平/垂直の点線。平均線や基準線として定番。df[col](1列)と df[[col1, col2]](複数列)でカッコの数が違います。リストを渡していると覚えるとミスを減らせます。118 119 120 121 122 123 124 125 126 127 | # 凡例(地域) from matplotlib.patches import Patch legend_handles = [Patch(facecolor=c, label=r) for r, c in region_colors.items()] ax1.legend(handles=legend_handles, loc='lower right', fontsize=9, framealpha=0.9) ax1.text(mean_k + 0.3, 2, '全国平均', fontsize=9, color='#333') plt.tight_layout() fig1.savefig(os.path.join(FIG_DIR, '2020_U5_3_fig1.png'), dpi=150, bbox_inches='tight') plt.close(fig1) print("\n図1 保存完了: 2020_U5_3_fig1.png") |
============================================================
OLS 重回帰分析(住居費の決定要因)
============================================================
OLS Regression Results
==============================================================================
Dep. Variable: 住居費(二人以上の世帯) R-squared: 0.279
Model: OLS Adj. R-squared: 0.191
Method: Least Squares F-statistic: 3.179
Date: Mon, 18 May 2026 Prob (F-statistic): 0.0162
Time: 11:23:44 Log-Likelihood: -457.21
No. Observations: 47 AIC: 926.4
Df Residuals: 41 BIC: 937.5
Df Model: 5
Covariance Type: nonrobust
=================================================================================
coef std err t P>|t| [0.025 0.975]
---------------------------------------------------------------------------------
const 1.207e+04 3.4e+04 0.354 0.725 -5.67e+04 8.08e+04
住宅地価格_log -394.6169 1915.029 -0.206 0.838 -4262.096 3472.862
転入率 538.3337 255.661 2.106 0.041 22.017 1054.651
消費支出(二人以上の世帯) 0.0304 0.038 0.809 0.423 -0.045 0.106
高齢化率 -209.8749 367.969 -0.570 0.572 -953.003 533.253
合計特殊出生率 533.7194 5025.604 0.106 0.916 -9615.694 1.07e+04
==============================================================================
Omnibus: 1.662 Durbin-Watson: 0.624
Prob(Omnibus): 0.436 Jarque-Bera (JB): 0.832
Skew: 0.048 Prob(JB): 0.660
Kurtosis: 3.645 Cond. No. 1.57e+07
==============================================================================
Notes:
[1] Standard Errors assume that the covariance matrix of the errors is correctly specified.
[2] The condition number is large, 1.57e+07. This might indicate that there are
strong multicollinearity or other numerical problems.
標準化偏回帰係数:
住宅地価格(log, 都市集積): β=-0.0567 p=0.8378 n.s.
転入率(需要代理): β=0.4161 p=0.0414 *
消費支出(所得水準): β=0.1206 p=0.4230 n.s.
高齢化率(%): β=-0.1419 p=0.5715 n.s.
合計特殊出生率: β=0.0165 p=0.9159 n.s.
R² = 0.2794, 調整済みR² = 0.1915
F統計量 = 3.179, p(F) = 0.0162
住居費 最大: 熊本県 30,323円 最小: 福井県 6,220円 全国平均: 19,244円
最大/最小 比率: 4.9倍
相関係数:
転入率 vs 住居費: r=0.508, p=0.0003
住宅地価格 vs 住居費: r=0.411, p=0.0041
高齢化率 vs 住居費: r=-0.424, p=0.0030
図1 保存完了: 2020_U5_3_fig1.pngimport pandas as pd など — 必要なライブラリをまとめて呼び出します。as pd は短い別名(alias)。s[:-n]「末尾n文字を除く」/s[n:]「先頭n文字を除く」。スライス [start:stop:step] はリスト・タプル・文字列共通の基本ワザです。2022年度の47都道府県データを用いて、住居費を目的変数とする OLS(最小二乗法)重回帰分析を実施した。
| 変数 | 標準化偏回帰係数 (β) | p値 | 有意性 | 解釈 |
|---|---|---|---|---|
| 住宅地価格(log) | -0.057 | 0.838 | n.s. | 単独では有意でない(多重共線性の影響) |
| 転入率 | +0.416 | 0.041 | * | 転入者が多い都道府県ほど住居費が有意に高い |
| 消費支出 | +0.121 | 0.423 | n.s. | 所得水準の影響は単独では有意でない |
| 高齢化率 | -0.142 | 0.572 | n.s. | 高齢化が進む地域では住居費がやや低い傾向 |
| 合計特殊出生率 | +0.017 | 0.916 | n.s. | 出生率との関係は観察されない |
| 変数 | 相関係数 r | p値 | 有意性 |
|---|---|---|---|
| 転入率 | +0.508 | 0.0003 | *** |
| 住宅地価格 | +0.411 | 0.0041 | ** |
| 高齢化率 | -0.424 | 0.0030 | ** |
| 消費支出 | +0.276 | 0.060 | n.s. |
| 合計特殊出生率 | -0.147 | 0.325 | n.s. |
住宅地価格は単変量では住居費と正の有意相関(r=0.411, p=0.004)を示すが、重回帰では係数が負で非有意(β=-0.057, p=0.84)になる。これは多重共線性(multicollinearity)の典型例である。住宅地価格・転入率・消費支出は互いに相関しており、重回帰でそれぞれの純粋な効果を分離するのが難しくなる。
住宅地価格は最小(秋田県 13,200円/m²)〜 最大(東京都 389,100円/m²)で約30倍の幅がある。このような右歪み(right-skewed)な変数を対数変換することで、線形モデルへの適合が改善される。対数変換後は「価格が1%上昇すると住居費は XX 円変化する」という弾力性解釈が可能になる。
129 130 131 132 133 134 | fig2, ax2 = plt.subplots(figsize=(10, 7)) for region, grp in df22.groupby('地域'): ax2.scatter(grp['住宅地価格'], grp[Y_COL] / 1000, color=region_colors[region], label=region, s=55, alpha=0.85, zorder=3) |
print はしません。データや図が裏で更新されただけ。次のステップへ進みましょう。df.groupby('列').apply(関数) — グループごとに関数を適用。時系列や地域別の集計でよく使います。fig, ax = plt.subplots(...) — 図全体(fig)と軸(ax)を作る定番。以降は ax.bar(...) 等で操作。df['A'] / df['B'] — pandasの列同士の四則演算は要素ごと(element-wise)。forループ不要なのが強み。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 | # 都道府県ラベル for _, row in df22.iterrows(): ax2.annotate(row['都道府県'].replace('県', '').replace('府', '').replace('都', '').replace('道', ''), (row['住宅地価格'], row[Y_COL] / 1000), fontsize=6.5, xytext=(3, 2), textcoords='offset points', color='#444') # 回帰線(対数スケール → 線形) x_range = np.linspace(df22['住宅地価格'].min(), df22['住宅地価格'].max(), 200) # Fit simple regression log(price) → cost from numpy.polynomial import polynomial as P log_x = np.log(df22['住宅地価格']) c_fit = np.polyfit(log_x, df22[Y_COL] / 1000, 1) ax2.plot(x_range, np.polyval(c_fit, np.log(x_range)), color='#333', linewidth=1.8, linestyle='--', label=f'回帰線 r={r_price:.3f}') ax2.set_xscale('log') ax2.set_xlabel('標準価格(住宅地)[円/m²](対数スケール)', fontsize=11) ax2.set_ylabel('住居費(二人以上の世帯)[千円/月]', fontsize=11) ax2.set_title('図2: 住宅地価格(都市集積)と住居費の関係(2022年度)', fontsize=13, fontweight='bold', pad=10) ax2.legend(fontsize=9, framealpha=0.9) ax2.grid(True, which='major', alpha=0.3) plt.tight_layout() fig2.savefig(os.path.join(FIG_DIR, '2020_U5_3_fig2.png'), dpi=150, bbox_inches='tight') plt.close(fig2) print("図2 保存完了: 2020_U5_3_fig2.png") |
図2 保存完了: 2020_U5_3_fig2.png
import pandas as pd など — 必要なライブラリをまとめて呼び出します。as pd は短い別名(alias)。for _, row in df.iterrows() — DataFrameを1行ずつ取り出すループ。1点ずつ描画したいときに使用。.map() は「1対1の置き換え」、.apply() は「関数を当てる」。辞書なら .map()、ロジックなら .apply()。SSDSE-B の時系列データ(2012〜2023年度)を用いて、地域別の住居費推移を可視化した。
本研究では2022年度の横断(cross-sectional)データで重回帰分析を実施し、時系列データで推移を可視化した。両者を組み合わせることで「ある時点での格差の要因」と「格差の経年変化」の両面から問題を捉えることができる。
より高度な分析としては、パネルデータ分析(固定効果モデル等)により都道府県固有の効果を制御しながら決定要因を推定することが考えられる。
162 163 164 165 166 167 168 169 170 171 172 173 174 175 176 177 178 179 180 181 182 183 184 185 186 187 188 189 | ts_df = df_b[df_b['年度'].between(2012, 2023)].copy() ts_df['地域'] = ts_df['都道府県'].map(region_map) # 地域別・年度別 平均住居費 ts_region = ts_df.groupby(['年度', '地域'])[Y_COL].mean().reset_index() fig3, ax3 = plt.subplots(figsize=(11, 6)) region_order = ['関東', '近畿', '中部', '九州・沖縄', '北海道・東北', '中国・四国'] for region in region_order: sub = ts_region[ts_region['地域'] == region].sort_values('年度') ax3.plot(sub['年度'], sub[Y_COL] / 1000, color=region_colors[region], linewidth=2.2, marker='o', markersize=5, label=region) ax3.set_xticks(range(2012, 2024)) ax3.set_xticklabels([str(y) for y in range(2012, 2024)], rotation=45, fontsize=9) ax3.set_xlabel('年度', fontsize=11) ax3.set_ylabel('住居費(二人以上の世帯)[千円/月]', fontsize=11) ax3.set_title('図3: 地域別 住居費の推移(2012〜2023年度)', fontsize=13, fontweight='bold', pad=10) ax3.legend(loc='upper left', fontsize=10, framealpha=0.9) ax3.grid(True, alpha=0.3) ax3.set_xlim(2011.5, 2023.5) plt.tight_layout() fig3.savefig(os.path.join(FIG_DIR, '2020_U5_3_fig3.png'), dpi=150, bbox_inches='tight') plt.close(fig3) print("図3 保存完了: 2020_U5_3_fig3.png") |
図3 保存完了: 2020_U5_3_fig3.png
df.groupby('列').apply(関数) — グループごとに関数を適用。時系列や地域別の集計でよく使います。fig, ax = plt.subplots(...) — 図全体(fig)と軸(ax)を作る定番。以降は ax.bar(...) 等で操作。sort_values('列名', ascending=False) — 指定列で並べ替え(降順)。.map() は「1対1の置き換え」、.apply() は「関数を当てる」。辞書なら .map()、ロジックなら .apply()。本分析の結果から、住居費の地域格差を是正・管理するための政策的示唆を示す。
191 192 193 194 195 196 197 198 199 200 201 202 | fig4, ax4 = plt.subplots(figsize=(9, 5)) colors_coef = [] for c, p in zip(std_coefs, std_pvals): if p < 0.05: colors_coef.append('#e05c5c' if c < 0 else '#2e86ab') else: colors_coef.append('#aaa') bars4 = ax4.barh(X_LABELS, std_coefs, color=colors_coef, edgecolor='none', height=0.55) ax4.axvline(0, color='#333', linewidth=1.2) |
print はしません。データや図が裏で更新されただけ。次のステップへ進みましょう。fig, ax = plt.subplots(...) — 図全体(fig)と軸(ax)を作る定番。以降は ax.bar(...) 等で操作。ax.axhline / ax.axvline — 水平/垂直の点線。平均線や基準線として定番。[式 for x in リスト] はリスト内包表記。forループでappendする代わりに1行でリストを作れます。203 204 205 206 207 208 209 210 211 212 213 | # p値の注釈 for i, (c, p) in enumerate(zip(std_coefs, std_pvals)): sig_mark = '**' if p < 0.01 else ('*' if p < 0.05 else '') offset = 0.01 if c >= 0 else -0.01 ha = 'left' if c >= 0 else 'right' ax4.text(c + offset, i, f' β={c:.3f}{sig_mark}', va='center', ha=ha, fontsize=10, color='#222') ax4.set_xlabel('標準化偏回帰係数(β)', fontsize=11) ax4.set_title('図4: 住居費に対する標準化偏回帰係数(OLS,2022年度)', fontsize=12, fontweight='bold', pad=10) ax4.set_xlim(-0.5, 0.65) ax4.grid(True, axis='x', alpha=0.3) |
print はしません。データや図が裏で更新されただけ。次のステップへ進みましょう。r, p = stats.pearsonr(...) — Pythonは複数戻り値を同時に受け取れる(タプルアンパック)。214 215 216 217 218 219 220 221 | # 凡例 from matplotlib.patches import Patch legend_h = [ Patch(facecolor='#2e86ab', label='正の効果(p<0.05)'), Patch(facecolor='#e05c5c', label='負の効果(p<0.05)'), Patch(facecolor='#aaa', label='非有意(p>=0.05)'), ] ax4.legend(handles=legend_h, loc='lower right', fontsize=9, framealpha=0.9) |
print はしません。データや図が裏で更新されただけ。次のステップへ進みましょう。import pandas as pd など — 必要なライブラリをまとめて呼び出します。as pd は短い別名(alias)。x if cond else y は三項演算子。リスト内包表記と組み合わせると、forとifを1行で書けます。222 223 224 225 226 227 228 229 230 231 | # 統計量テキスト ax4.text(0.02, 0.97, f'R2={model.rsquared:.3f} 調整済みR2={model.rsquared_adj:.3f}\nN=47都道府県 *p<0.05 **p<0.01', transform=ax4.transAxes, fontsize=9, va='top', color='#555', bbox=dict(boxstyle='round,pad=0.4', fc='white', ec='#ccc', alpha=0.9)) plt.tight_layout() fig4.savefig(os.path.join(FIG_DIR, '2020_U5_3_fig4.png'), dpi=150, bbox_inches='tight') plt.close(fig4) print("図4 保存完了: 2020_U5_3_fig4.png") print("\n全図の生成が完了しました。") |
図4 保存完了: 2020_U5_3_fig4.png 全図の生成が完了しました。
df[col](1列)と df[[col1, col2]](複数列)でカッコの数が違います。リストを渡していると覚えるとミスを減らせます。本研究では、SSDSE-B データを用いて47都道府県の住居費(居住コスト)の地域格差とその決定要因を統計的に分析した。
| 分析 | 主な発見 |
|---|---|
| 地域分布 | 最高(熊本県:30,323円)と最低(福井県:6,220円)の格差は約4.9倍。関東・九州・沖縄が高水準。 |
| 相関分析 | 転入率(r=0.508)・高齢化率(r=-0.424)・住宅地価格(r=0.411)が住居費と有意な相関。 |
| 重回帰分析 | 転入率のみが有意な説明変数(β=0.416, p=0.041)。モデル全体の説明力はR²=0.279。 |
| 時系列 | 関東は全期間高水準維持。九州・沖縄は近年上昇傾向。地域間格差は縮小していない。 |
使用データ: SSDSE-B-2026(統計センター)| 分析: Python 3 / statsmodels / scipy
本ページは教育目的で作成されました。統計データ分析コンペティション 2020年度 審査員奨励賞(大学生・一般の部)受賞作品の再現・解説です。
統計分析の解釈で初心者がやりがちな勘違いをまとめます。特に「相関と因果の混同」「p値の過信」は研究現場でもよく起きる落とし穴です。本文を読む前にも、読んだ後にも、目を通してみてください。
統計の基本用語を初心者向けに解説します。本文中で見慣れない言葉が出てきたら、ここに戻って確認してください。
統計手法について「何のためか」「結果をどう読むか」を初心者向けに解説します。
この研究をさらに発展させるための3つの方向性を示します。「今回わかったこと(X)」から「次に検証すべき仮説(Y)」を立て、「具体的に何をするか(Z)」まで考えてみましょう。
学んだだけでは身につきません。実際に手を動かすのが最強の学習方法です。本論文のスクリプトをベースに、以下のチャレンジに挑戦してみてください。難易度別に5つ用意しました。
本論文で学んだ手法は、研究の世界だけでなく、行政・企業・NPO の現場でも様々に活用されています。具体的なシーンを紹介します。
この論文を読んで初心者が抱きやすい疑問に、教育的観点から答えます。