このページの分析を自分で再現するには、以下の手順でデータを準備してください。コードの編集は不要です。
data/raw/ フォルダに入れます。html/figures/ に自動保存されます。
日本の英語教育政策は小学校から大学まで大きな転換期を迎えている。しかし、英語教育の「成果」を都道府県単位で定量的に把握できる公的統計は限られている。本研究は、英語力の代理指標として大学進学率(E4602/E4601×100)を設定し、SSDSE-B の社会指標群との関係を探索的に分析することで、エビデンスに基づく英語教育政策立案のための方法論を示す。
まず「英語教育実施状況調査をエビデンス生成に繋げるための探究」を統計的にとらえることが有効だと考えられる。 その理由は感覚や経験則だけでは、複雑な社会要因の中で「何が本当に効いているか」を見極めにくいからである。 本研究では公開データと統計手法を組み合わせ、この問いに定量的な答えを出すことを目指す。
探索的分析 相関分析 重回帰分析 地域間格差
統計数理研究所 SSDSE-B-2026(都道府県レベル統計データセット)の2022年度データ(47都道府県)を使用。英語能力の代理変数として以下の指標を構築した。
| 変数名 | 計算式 | 解釈 |
|---|---|---|
| 大学進学率 (目的変数) | E4602 / E4601 × 100 | 英語能力・学習達成度の proxy |
| 教育費割合 | L322108 / L3221 × 100 | 教育投資への地域傾斜 |
| 住宅地価格 | C5401(千円/m²) | 地域の経済的豊かさ・格差 |
| 小学教員/児童比 | E2401 / E2501 | 学習環境の質(大きいほど少人数) |
| 交通通信費割合 | L322107 / L3221 | ICT環境・情報へのアクセス |
| 大学生/15-64歳比 | E6302 / A1302 × 100 | 高等教育集積度 |
| 高齢化率 | A1303 / A1101 × 100 | 人口構造(若年人口の少なさ) |
| 旅券発行per万人 | G5105 / A1101 × 10000 | 国際的経験・英語必要性 |
| 変数 | 平均 | 最大 | 最小 |
|---|---|---|---|
| 大学進学率 (%) | 56.6 | 73.0(京都府) | 46.2(沖縄県) |
| 教育費割合 (%) | 3.6 | 8.6 | 2.0 |
| 住宅地価格 (千円/m²) | 53,372 | 389,100(東京都) | 13,200 |
| 高齢化率 (%) | 31.4 | 38.6 | 22.8 |
| 旅券発行per万人 | 65.8 | 220.4 | 27.1 |
1 2 3 4 5 6 7 8 9 10 11 | import os import numpy as np import pandas as pd import matplotlib matplotlib.use('Agg') import matplotlib.pyplot as plt import warnings warnings.filterwarnings('ignore') from scipy import stats import statsmodels.api as sm |
print はしません。データや図が裏で更新されただけ。次のステップへ進みましょう。import pandas as pd など — 必要なライブラリをまとめて呼び出します。as pd は短い別名(alias)。matplotlib.use('Agg') — グラフを画面表示せずファイルに保存するためのおまじない。f"...{x}..." はf-string。文字列の中に {変数} と書くだけで埋め込めて、{x:.2f} のように書式も指定できます。12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 | # ── パス設定 ───────────────────────────────────────────────────────────────── BASE_DIR = os.path.join(_script_dir, '..') FIG_DIR = os.path.join(BASE_DIR, 'html', 'figures') DATA_PATH = os.path.join(BASE_DIR, 'data', 'raw', 'SSDSE-B-2026.csv') os.makedirs(FIG_DIR, exist_ok=True) plt.rcParams.update({ 'font.family': 'Hiragino Sans', 'axes.unicode_minus': False, 'figure.dpi': 150, 'axes.spines.top': False, 'axes.spines.right': False, }) print("=" * 60) print("■ SSDSE-B-2026.csv 読み込み(2022年度)") df_all = pd.read_csv(DATA_PATH, encoding='cp932', header=0, skiprows=[1]) df = df_all[df_all['SSDSE-B-2026'] == 2022].copy().reset_index(drop=True) assert len(df) == 47, f"47都道府県分のデータが必要ですが {len(df)} 行しかありません" print(f" 読み込み完了: {len(df)} 都道府県") PREFS = list(df['Prefecture']) |
# 実行時エラーで途中まで
os.makedirs('html/figures', exist_ok=True) — 図の保存先フォルダを作る(既にあってもOK)。pd.read_csv(...) でCSVを読み込みます。encoding='cp932' は日本語Windows由来の文字コード、header=1 は「2行目を列名として使う」。df['A'] / df['B'] — pandasの列同士の四則演算は要素ごと(element-wise)。forループ不要なのが強み。36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 | print("\n■ 変数エンジニアリング") # 目的変数(英語能力 proxy) y_univ = df['E4602'] / df['E4601'] * 100 # 大学進学率 (%) # 説明変数群 edu_cost = df['L322108'] / df['L3221'] * 100 # 教育費割合 (%) land_price = df['C5401'].astype(float) # 住宅地価格(千円/m²) teacher_ratio = df['E2401'] / df['E2501'] # 小学教員/児童比 ict_share = df['L322107'] / df['L3221'] # 交通通信費割合 univ_ratio = df['E6302'] / df['A1302'] * 100 # 大学生/15-64歳人口比 (%) aging_rate = df['A1303'] / df['A1101'] * 100 # 高齢化率 (%) passport_pc = df['G5105'] / df['A1101'] * 10000 # 国際旅券発行数per万人 feat = pd.DataFrame({ '教育費割合(%)': edu_cost, '住宅地価格(千円/m²)': land_price, '小学教員/児童比': teacher_ratio, '交通通信費割合': ict_share, '大学生/15-64歳比(%)': univ_ratio, '高齢化率(%)': aging_rate, '旅券発行per万人': passport_pc, }, index=df.index) FEAT_NAMES = list(feat.columns) print(f" 変数数: {len(FEAT_NAMES)}") print(f" 目的変数 大学進学率: 平均={y_univ.mean():.1f}%, 範囲=[{y_univ.min():.1f}, {y_univ.max():.1f}]%") |
print はしません。データや図が裏で更新されただけ。次のステップへ進みましょう。df['A'] / df['B'] — pandasの列同士の四則演算は要素ごと(element-wise)。forループ不要なのが強み。63 64 65 66 67 68 69 70 71 72 | # ── 記述統計 ───────────────────────────────────────────────────────────────── print("\n■ 記述統計") desc = feat.describe().T[['mean','std','min','max']] desc.insert(0, '大学進学率', y_univ.describe()[['mean','std','min','max']].iloc[0] if False else None) print(pd.concat([ pd.DataFrame({'mean': [y_univ.mean()], 'std': [y_univ.std()], 'min': [y_univ.min()], 'max': [y_univ.max()]}, index=['大学進学率(%)']), desc ]).round(3).to_string()) |
■ 変数エンジニアリング # 実行時エラーで途中まで
.describe() — 件数・平均・標準偏差・四分位・最大/最小を一括計算。データの素性チェックに必須。.map() は「1対1の置き換え」、.apply() は「関数を当てる」。辞書なら .map()、ロジックなら .apply()。各代理指標と大学進学率(英語能力 proxy)との Pearson 相関係数を算出した。図1は相関係数を昇順に並べた棒グラフである。
| 変数 | 相関係数 r | 有意性 | 解釈 |
|---|---|---|---|
| 旅券発行per万人 | +0.753 | *** (p<0.001) | 国際経験が英語学習意欲を高める |
| 大学生/15-64歳比 | +0.677 | *** (p<0.001) | 高等教育の集積が進学率を押し上げる |
| 住宅地価格 | +0.672 | *** (p<0.001) | 経済的豊かさが教育達成に連動 |
| 教育費割合 | +0.464 | ** (p<0.01) | 教育投資が学習成果に正の影響 |
| 交通通信費割合 | −0.488 | *** (p<0.001) | 生活費に占める通信比率が高い(農村)と進学率が低い傾向 |
| 小学教員/児童比 | −0.524 | *** (p<0.001) | 少人数制が進む地域は農村型(進学率低)と相関 |
| 高齢化率 | −0.588 | *** (p<0.001) | 高齢化が進む地域では若者の進学・流出が顕著 |
相関係数 r の有意性検定は t 分布を用いる。N=47 では |r| ≥ 0.288 で p<0.05 となる(両側検定)。Cohen(1988) の基準では r=0.5 が「大」・r=0.3 が「中」・r=0.1 が「小」効果量。
74 75 76 77 78 79 80 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 | print("\n図1: 相関係数棒グラフを作成中...") corr_sorted = corr_df.sort_values('相関係数 r') colors1 = [] for _, row in corr_sorted.iterrows(): if row['有意 (p<0.05)'] != 'n.s.': colors1.append('#C62828' if row['相関係数 r'] >= 0 else '#1565C0') else: colors1.append('#BDBDBD') fig1, ax1 = plt.subplots(figsize=(9, 5)) bars = ax1.barh(corr_sorted['変数'], corr_sorted['相関係数 r'], color=colors1, edgecolor='white', alpha=0.88, height=0.6) ax1.axvline(0, color='black', linewidth=1.0) ax1.set_xlabel('Pearson 相関係数 r', fontsize=12) ax1.set_title('各変数と大学進学率(英語能力 proxy)との相関係数\n(赤:正・有意, 青:負・有意, 灰:非有意)', fontsize=12, fontweight='bold') ax1.grid(axis='x', alpha=0.3) ax1.set_xlim(-1.05, 1.05) for bar, (_, row) in zip(ax1.patches, corr_sorted.iterrows()): r = row['相関係数 r'] sig = row['有意 (p<0.05)'] x_pos = r + 0.03 * np.sign(r) if r != 0 else 0.03 ha = 'left' if r >= 0 else 'right' label = f'{r:.3f}{sig if sig != "n.s." else ""}' ax1.text(x_pos, bar.get_y() + bar.get_height() / 2, label, va='center', ha=ha, fontsize=9, color='#222222') plt.tight_layout() fig1.savefig(os.path.join(FIG_DIR, '2023_U5_3_fig1_corr.png'), bbox_inches='tight', dpi=150) plt.close(fig1) print(" -> 2023_U5_3_fig1_corr.png 保存完了") |
図1: 相関係数棒グラフを作成中... # 実行時エラーで途中まで
fig, ax = plt.subplots(...) — 図全体(fig)と軸(ax)を作る定番。以降は ax.bar(...) 等で操作。sort_values('列名', ascending=False) — 指定列で並べ替え(降順)。ax.axhline / ax.axvline — 水平/垂直の点線。平均線や基準線として定番。for _, row in df.iterrows() — DataFrameを1行ずつ取り出すループ。1点ずつ描画したいときに使用。x if cond else y は三項演算子。リスト内包表記と組み合わせると、forとifを1行で書けます。教育費割合・住宅地価格・小学教員/児童比の3変数を説明変数とした OLS 重回帰モデルを構築した。図2は教育費割合 vs 大学進学率の散布図と回帰直線を示す。
| 変数 | 係数 β | p 値 | 解釈 |
|---|---|---|---|
| 定数項 | 59.23 | <0.001 | ベースライン |
| 教育費割合 (%) | +0.65 | n.s. (0.381) | 単独では非有意(多重共線性の可能性) |
| 住宅地価格 (千円/m²) | +0.000059 | 0.001 | 地価が高い(都市型)ほど進学率が高い |
| 小学教員/児童比 | −108.2 | n.s. (0.355) | 農村的指標として負に作用 |
モデル R²=0.480, 調整済み R²=0.443, F=13.21 (p<0.001), N=47都道府県
複数の説明変数が互いに強く相関する「多重共線性」があると、回帰係数の推定が不安定になる。VIF(分散膨張因子)≥10 が警戒レベルの目安。本分析でも住宅地価格・教育費割合・旅券発行数は互いに正相関しており、個別係数の解釈には慎重さが必要。
108 109 110 111 112 113 114 115 116 117 | print("図2: 散布図(教育費割合 vs 大学進学率)を作成中...") x_plot = np.linspace(x_edu.min() - 0.1, x_edu.max() + 0.1, 200) y_fit = intercept + slope * x_plot fig2, ax2 = plt.subplots(figsize=(10, 7)) ax2.scatter(x_edu, y_arr, color='#1565C0', s=55, alpha=0.75, zorder=3, edgecolors='white', linewidths=0.5) ax2.plot(x_plot, y_fit, color='#C62828', linewidth=2.0, linestyle='-', label=f'回帰線 (r={r_val:.3f}, p={p_val:.4f})') |
print はしません。データや図が裏で更新されただけ。次のステップへ進みましょう。fig, ax = plt.subplots(...) — 図全体(fig)と軸(ax)を作る定番。以降は ax.bar(...) 等で操作。df[col](1列)と df[[col1, col2]](複数列)でカッコの数が違います。リストを渡していると覚えるとミスを減らせます。118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 | # 都道府県ラベル(全47都道府県) for i, pref in enumerate(PREFS): short = pref.replace('県', '').replace('府', '').replace('都', '').replace('道', '') ax2.text(x_edu[i] + 0.01, y_arr[i] + 0.3, short, fontsize=6.5, color='#444444', va='bottom', ha='left') ax2.set_xlabel('教育費割合 (%, 消費支出に占める教育費)', fontsize=12) ax2.set_ylabel('大学進学率 (%, 英語能力 proxy)', fontsize=12) ax2.set_title('教育費割合と大学進学率の関係(47都道府県, 2022年度)\n' 'データ出所: SSDSE-B-2026(統計数理研究所)', fontsize=12, fontweight='bold') ax2.legend(fontsize=11) ax2.grid(True, alpha=0.2) ax2.text(0.97, 0.05, f'y = {slope:.2f}x + {intercept:.1f}\nr = {r_val:.3f} p = {p_val:.4f}', transform=ax2.transAxes, fontsize=10, va='bottom', ha='right', bbox=dict(boxstyle='round', facecolor='#FFF9C4', alpha=0.85)) plt.tight_layout() fig2.savefig(os.path.join(FIG_DIR, '2023_U5_3_fig2_scatter.png'), bbox_inches='tight', dpi=150) plt.close(fig2) print(" -> 2023_U5_3_fig2_scatter.png 保存完了") |
図2: 散布図(教育費割合 vs 大学進学率)を作成中... # 実行時エラーで途中まで
s[:-n]「末尾n文字を除く」/s[n:]「先頭n文字を除く」。スライス [start:stop:step] はリスト・タプル・文字列共通の基本ワザです。47都道府県の大学進学率を低い順に並べた水平棒グラフ(図3)により、地域格差の全体像を可視化する。全国平均は56.6%で、最高の京都府(73.0%)と最低の沖縄県(46.2%)の差は約26.8ポイントと大きい。
政策立案に向けたエビデンス生成では、まず記述統計と可視化(EDA)で「問題の全体像」を把握することが不可欠。ランキング図は単純だが、どの地域が支援を必要としているかを明確に示す「政策インサイト」として機能する。
141 142 143 144 145 146 147 148 149 150 151 152 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 | print("図3: 47都道府県 大学進学率ランキングを作成中...") rank_df = pd.DataFrame({'都道府県': PREFS, '大学進学率': y_arr}).sort_values('大学進学率') # 上位5・下位5を強調 top5_set = set(rank_df['都道府県'].iloc[-5:]) bot5_set = set(rank_df['都道府県'].iloc[:5]) avg_val = y_arr.mean() colors3 = [] for pref in rank_df['都道府県']: if pref in top5_set: colors3.append('#C62828') elif pref in bot5_set: colors3.append('#1565C0') else: colors3.append('#90A4AE') fig3, ax3 = plt.subplots(figsize=(9, 14)) bars3 = ax3.barh(rank_df['都道府県'], rank_df['大学進学率'], color=colors3, edgecolor='white', alpha=0.88, height=0.75) ax3.axvline(avg_val, color='black', linestyle='--', linewidth=1.5, label=f'全国平均 {avg_val:.1f}%') ax3.set_xlabel('大学進学率 (%)', fontsize=12) ax3.set_title('47都道府県 大学進学率ランキング(2022年度)\n' '赤:上位5県, 青:下位5県', fontsize=12, fontweight='bold') ax3.legend(fontsize=10) ax3.grid(axis='x', alpha=0.3) ax3.set_xlim(0, rank_df['大学進学率'].max() * 1.12) for bar, val in zip(ax3.patches, rank_df['大学進学率']): ax3.text(val + 0.3, bar.get_y() + bar.get_height() / 2, f'{val:.1f}%', va='center', ha='left', fontsize=7.5, color='#333333') plt.tight_layout() fig3.savefig(os.path.join(FIG_DIR, '2023_U5_3_fig3_ranking.png'), bbox_inches='tight', dpi=150) plt.close(fig3) print(" -> 2023_U5_3_fig3_ranking.png 保存完了") |
図3: 47都道府県 大学進学率ランキングを作成中... # 実行時エラーで途中まで
fig, ax = plt.subplots(...) — 図全体(fig)と軸(ax)を作る定番。以降は ax.bar(...) 等で操作。sort_values('列名', ascending=False) — 指定列で並べ替え(降順)。ax.axhline / ax.axvline — 水平/垂直の点線。平均線や基準線として定番。s[:-n]「末尾n文字を除く」/s[n:]「先頭n文字を除く」。スライス [start:stop:step] はリスト・タプル・文字列共通の基本ワザです。住宅地価格を三分位(低価格帯・中価格帯・高価格帯)に分けて、グループ別の大学進学率の分布を箱ひげ図(図4)で比較した。一元配置分散分析(ANOVA)により3群の差の有意性を検定した。
| グループ | 都道府県数 | 平均進学率 | 標準偏差 |
|---|---|---|---|
| 低価格帯(農村型) | 16 | 50.8% | 3.5% |
| 中価格帯(中間型) | 15 | 56.2% | 3.9% |
| 高価格帯(都市型) | 16 | 62.8% | 6.5% |
一元配置 ANOVA: F(2,44)=23.69, p<0.001。農村型と都市型の差は約12ポイント。
ANOVA は「グループ間の分散」と「グループ内の分散」の比(F 値)で群間差の有意性を検定する。F 値が大きいほど群間差が群内のばらつきに比べて大きく、統計的に有意な差があると判断できる。
181 182 183 184 185 186 187 188 189 190 191 192 | print("\n■ Pearson 相関分析(大学進学率 vs 各変数)") corr_results = [] y_arr = y_univ.values.astype(float) for col in FEAT_NAMES: x_arr = feat[col].values.astype(float) r, p = stats.pearsonr(x_arr, y_arr) corr_results.append({'変数': col, '相関係数 r': r, 'p値': p, '有意 (p<0.05)': '***' if p < 0.001 else ('**' if p < 0.01 else ('*' if p < 0.05 else 'n.s.'))}) corr_df = pd.DataFrame(corr_results).sort_values('相関係数 r', ascending=False) print(corr_df.round(4).to_string(index=False)) |
■ Pearson 相関分析(大学進学率 vs 各変数) # 実行時エラーで途中まで
sort_values('列名', ascending=False) — 指定列で並べ替え(降順)。stats.pearsonr(x, y) — Pearson相関係数 r と p値を同時に返します。.map() は「1対1の置き換え」、.apply() は「関数を当てる」。辞書なら .map()、ロジックなら .apply()。193 194 195 196 197 198 199 200 201 202 | print("\n■ 重回帰分析(OLS)") X_reg = sm.add_constant(feat[['教育費割合(%)', '住宅地価格(千円/m²)', '小学教員/児童比']].astype(float)) ols_model = sm.OLS(y_arr, X_reg).fit() print(ols_model.summary()) # ── 教育費割合 vs 大学進学率 の単回帰(scatter 用)───────────────────────── x_edu = edu_cost.values.astype(float) slope, intercept, r_val, p_val, se = stats.linregress(x_edu, y_arr) print(f"\n 教育費割合 vs 大学進学率: r={r_val:.3f}, p={p_val:.4f}, slope={slope:.3f}") |
■ 重回帰分析(OLS) # 実行時エラーで途中まで
stats.linregress(x, y) — 単回帰の傾き・切片・r値・p値・標準誤差を返します。使わない値は _ で受け取り。sm.add_constant(X) — 切片項(定数1の列)を先頭に追加。statsmodelsで必須。sm.OLS(y, X).fit() — 最小二乗法でモデルを推定。model.params, model.pvalues, model.conf_int() で結果取得。[式 for x in リスト] はリスト内包表記。forループでappendする代わりに1行でリストを作れます。203 204 205 206 207 208 209 210 211 212 213 214 215 216 217 218 219 220 221 222 223 224 225 | print("\n■ 都市農村格差(住宅地価格 3群)") tertile_labels = ['低価格帯\n(農村型)', '中価格帯\n(中間型)', '高価格帯\n(都市型)'] land_arr = land_price.values.astype(float) t33 = np.percentile(land_arr, 33.33) t67 = np.percentile(land_arr, 66.67) groups = [] for v in land_arr: if v <= t33: groups.append(0) elif v <= t67: groups.append(1) else: groups.append(2) groups = np.array(groups) for i, label in enumerate(tertile_labels): subset = y_arr[groups == i] print(f" {label.replace(chr(10),'')}: N={len(subset)}, 平均={subset.mean():.1f}%, SD={subset.std():.1f}%") # ANOVA f_stat, anova_p = stats.f_oneway(y_arr[groups == 0], y_arr[groups == 1], y_arr[groups == 2]) print(f" 一元配置ANOVA: F={f_stat:.3f}, p={anova_p:.4f}") |
■ 都市農村格差(住宅地価格 3群) # 実行時エラーで途中まで
r, p = stats.pearsonr(...) — Pythonは複数戻り値を同時に受け取れる(タプルアンパック)。226 227 228 229 230 231 232 233 234 235 236 237 238 239 240 | print("図4: 箱ひげ図(住宅地価格グループ別)を作成中...") group_data = [y_arr[groups == i] for i in range(3)] group_colors = ['#42A5F5', '#66BB6A', '#EF5350'] fig4, ax4 = plt.subplots(figsize=(8, 6)) bp = ax4.boxplot(group_data, patch_artist=True, notch=False, medianprops=dict(color='black', linewidth=2), whiskerprops=dict(linewidth=1.5), capprops=dict(linewidth=1.5), flierprops=dict(marker='o', markersize=5, markerfacecolor='gray', alpha=0.6)) for patch, color in zip(bp['boxes'], group_colors): patch.set_facecolor(color) patch.set_alpha(0.65) |
print はしません。データや図が裏で更新されただけ。次のステップへ進みましょう。fig, ax = plt.subplots(...) — 図全体(fig)と軸(ax)を作る定番。以降は ax.bar(...) 等で操作。np.cumsum(arr) は累積和、np.linspace(a, b, n) は「aからbを等間隔でn個」。NumPyの定石です。241 242 243 244 245 246 247 248 249 250 251 252 | # 個別データ点を重ねる(jitter) for i, gd in enumerate(group_data): jitter = (np.arange(len(gd)) - len(gd) / 2) * 0.05 ax4.scatter(np.full(len(gd), i + 1) + jitter, gd, color=group_colors[i], s=30, alpha=0.7, zorder=3, edgecolors='white', linewidths=0.5) ax4.set_xticklabels(tertile_labels, fontsize=11) ax4.set_ylabel('大学進学率 (%)', fontsize=12) ax4.set_title(f'住宅地価格グループ別 大学進学率の分布\n' f'(一元配置ANOVA: F={f_stat:.2f}, p={anova_p:.4f})', fontsize=12, fontweight='bold') ax4.grid(axis='y', alpha=0.3) |
print はしません。データや図が裏で更新されただけ。次のステップへ進みましょう。{値:.2f}(小数2桁)、{値:,}(3桁区切り)、{値:>10}(右寄せ10桁)など、覚えると出力が一気に整います。253 254 255 256 257 258 259 260 261 262 | # グループ平均ラベル for i, gd in enumerate(group_data): ax4.text(i + 1, gd.max() + 0.5, f'平均\n{gd.mean():.1f}%', ha='center', va='bottom', fontsize=9.5, fontweight='bold', color=group_colors[i]) plt.tight_layout() fig4.savefig(os.path.join(FIG_DIR, '2023_U5_3_fig4_box.png'), bbox_inches='tight', dpi=150) plt.close(fig4) print(" -> 2023_U5_3_fig4_box.png 保存完了") |
図4: 箱ひげ図(住宅地価格グループ別)を作成中... # 実行時エラーで途中まで
plt.subplots(figsize=(W, H)) で図サイズ指定、fig.savefig(..., bbox_inches='tight') で余白を自動で詰めて保存。263 264 265 266 267 268 269 270 271 272 273 274 275 276 277 | print("\n" + "=" * 60) print("✓ 全図の生成完了(4枚)") print("=" * 60) print("\n【主要知見】") print(f" データ : SSDSE-B-2026.csv(2022年度・47都道府県)") print(f" 目的変数 : 大学進学率(英語能力 proxy)") print(f" 全国平均={y_arr.mean():.1f}%, 最大={y_arr.max():.1f}%, 最小={y_arr.min():.1f}%") print(f" 相関 Top変数 : {corr_df.iloc[0]['変数']} (r={corr_df.iloc[0]['相関係数 r']:.3f})") print(f" 重回帰 R² : {ols_model.rsquared:.3f}") print(f" 都市農村格差 : 低価格帯{y_arr[groups==0].mean():.1f}% vs 高価格帯{y_arr[groups==2].mean():.1f}%") print(f" ANOVA : F={f_stat:.3f}, p={anova_p:.4f}") top3 = pd.Series(y_arr, index=PREFS).nlargest(3) bot3 = pd.Series(y_arr, index=PREFS).nsmallest(3) print(f" 大学進学率 上位3: {list(top3.index)}") print(f" 大学進学率 下位3: {list(bot3.index)}") |
============================================================ ✓ 全図の生成完了(4枚) ============================================================ 【主要知見】 データ : SSDSE-B-2026.csv(2022年度・47都道府県) 目的変数 : 大学進学率(英語能力 proxy) # 実行時エラーで途中まで
{値:.2f}(小数2桁)、{値:,}(3桁区切り)、{値:>10}(右寄せ10桁)など、覚えると出力が一気に整います。SSDSE-B-2026(47都道府県, 2022年度)を用いた探索的分析から、英語教育の地域格差(大学進学率で代理)について以下のエビデンスが得られた。
| データ | 出典 |
|---|---|
| SSDSE-B-2026(都道府県統計) | 統計数理研究所 SSDSE(社会・人口統計体系データセット) |
| 大学等進学率(E4602/E4601) | 文部科学省 学校基本調査 |
| 家計消費支出内訳(L3221系) | 総務省 家計調査 |
| 住宅地価格(C5401) | 国土交通省 地価公示 |
| 国際旅券発行数(G5105) | 外務省 旅券統計 |
本コードは実公的データ(SSDSE-B-2026)のみを使用しています。合成データ・乱数生成は一切使用していません。
統計分析の解釈で初心者がやりがちな勘違いをまとめます。特に「相関と因果の混同」「p値の過信」は研究現場でもよく起きる落とし穴です。本文を読む前にも、読んだ後にも、目を通してみてください。
統計の基本用語を初心者向けに解説します。本文中で見慣れない言葉が出てきたら、ここに戻って確認してください。
統計手法について「何のためか」「結果をどう読むか」を初心者向けに解説します。
この研究をさらに発展させるための3つの方向性を示します。「今回わかったこと(X)」から「次に検証すべき仮説(Y)」を立て、「具体的に何をするか(Z)」まで考えてみましょう。
学んだだけでは身につきません。実際に手を動かすのが最強の学習方法です。本論文のスクリプトをベースに、以下のチャレンジに挑戦してみてください。難易度別に5つ用意しました。
本論文で学んだ手法は、研究の世界だけでなく、行政・企業・NPO の現場でも様々に活用されています。具体的なシーンを紹介します。
この論文を読んで初心者が抱きやすい疑問に、教育的観点から答えます。