このページの分析を自分で再現するには、以下の手順でデータを準備してください。コードの編集は不要です。
data/raw/ フォルダに入れます。html/figures/ に自動保存されます。
日本人の英語能力は国際的に見て低水準にあるとされている。EF英語能力指数(EF-EPI)において日本は毎年低順位に位置しており、その背景には国際経験の不足、教育投資の偏り、地域格差など複合的な要因があると考えられる。
まず「日本人の英語能力の実態とその背景~諸外国と比較して~」を統計的にとらえることが有効だと考えられる。 その理由は感覚や経験則だけでは、複雑な社会要因の中で「何が本当に効いているか」を見極めにくいからである。 本研究では公開データと統計手法を組み合わせ、この問いに定量的な答えを出すことを目指す。
本研究では、都道府県別の公的統計データ(SSDSE-B 2022年度)を用い、「英語力」を大学進学率で代理し、その関連要因を記述統計・相関分析・地域間比較によって検討する。
SSDSE-B 実データ 記述統計 相関分析 地域間比較
統計センター公表の SSDSE-B-2026(社会・人口統計体系 都道府県データ)から 2022年度の47都道府県を使用。EF-EPI(国際英語能力指数)は公的統計として入手不可のため、以下の代理変数を設定した。
| 概念 | 代理変数 | 計算式 | 根拠 |
|---|---|---|---|
| 英語力(目的変数) | 大学進学率 | E4602 / E4601 × 100 | 大学入試に英語が必須。学力の総合指標。 |
| 国際経験 | 国際旅券発行率 | G5105 / A1101 × 10000 | 海外渡航経験は英語使用機会に直結。 |
| 経済力 | 消費支出・住宅地価格 | L3221, C5401 | 経済的余裕が教育・旅行への投資を可能にする。 |
| 教育投資 | 教育費割合 | L322108 / L3221 × 100 | 消費支出に占める教育費の比率。 |
| 英語環境 | 外国人宿泊者割合 | G7102 / G7101 × 100 | インバウンドが多い地域ほど英語使用機会が多い。 |
| 変数 | 平均 | 標準偏差 | 最小 | 最大 |
|---|---|---|---|---|
| 大学進学率(%) | 56.6 | 7.0 | 46.2 | 73.0 |
| 国際旅券発行率(件/万人) | 65.8 | 35.6 | 27.1 | 220.4 |
| 消費支出(千円) | 289.6 | 19.2 | 245.1 | 324.8 |
| 住宅地価格(千円/m²) | 53,372 | 61,992 | 13,200 | 389,100 |
| 教育費割合(%) | 3.6 | 1.3 | 2.0 | 8.6 |
| 外国人宿泊者割合(%) | 1.7 | 2.0 | 0.3 | 11.1 |
出典:SSDSE-B-2026(統計センター)、2022年度 47都道府県の実データ。
1 2 3 4 5 6 7 8 9 10 | df_raw = pd.read_csv( os.path.join(DATA_DIR, 'SSDSE-B-2026.csv'), header=0, # 1行目がコード名(A1101 等) encoding='cp932' ) # 都道府県コード(R01000〜R47000)の行のみ抽出 import re mask_pref = df_raw['Code'].astype(str).str.match(r'^R\d{5}$') df_pref = df_raw[mask_pref].copy() |
print はしません。データや図が裏で更新されただけ。次のステップへ進みましょう。import pandas as pd など — 必要なライブラリをまとめて呼び出します。as pd は短い別名(alias)。pd.read_csv(...) でCSVを読み込みます。encoding='cp932' は日本語Windows由来の文字コード、header=1 は「2行目を列名として使う」。df['地域コード'].str.match(r'^R\d{5}', ...) — 正規表現で「R+数字5桁」の行(47都道府県)だけTrueにし、真偽値で行をフィルタ。df['A'] / df['B'] — pandasの列同士の四則演算は要素ごと(element-wise)。forループ不要なのが強み。11 12 13 14 15 16 | # 年度列の名前を統一(先頭列 = 'SSDSE-B-2026' がそのまま年度値) df_pref = df_pref.rename(columns={'SSDSE-B-2026': '年度'}) df_pref['年度'] = pd.to_numeric(df_pref['年度'], errors='coerce') # 2022年度に絞る df = df_pref[df_pref['年度'] == 2022].copy().reset_index(drop=True) |
print はしません。データや図が裏で更新されただけ。次のステップへ進みましょう。.map() は「1対1の置き換え」、.apply() は「関数を当てる」。辞書なら .map()、ロジックなら .apply()。17 18 19 20 21 22 | # 都道府県名の取得 pref_names = df['Prefecture'].astype(str).tolist() print("=" * 60) print(f"■ 対象: 2022年度 都道府県データ N={len(df)}") print("=" * 60) |
print はしません。データや図が裏で更新されただけ。次のステップへ進みましょう。[式 for x in リスト] はリスト内包表記。forループでappendする代わりに1行でリストを作れます。23 24 25 26 27 28 29 | # ── 数値変換 ───────────────────────────────────────────────── use_cols = ['E4601', 'E4602', 'G5105', 'A1101', 'L3221', 'C5401', 'L322108', 'G7101', 'G7102', 'A130201', 'A130202', 'A1302'] for c in use_cols: df[c] = pd.to_numeric(df[c], errors='coerce') |
print はしません。データや図が裏で更新されただけ。次のステップへ進みましょう。r, p = stats.pearsonr(...) — Pythonは複数戻り値を同時に受け取れる(タプルアンパック)。30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 | # ── 指標の計算 ─────────────────────────────────────────────── # 目的変数: 大学進学率(英語力 proxy) df['大学進学率'] = df['E4602'] / df['E4601'].clip(1) * 100 # 説明変数 df['国際旅券発行率'] = df['G5105'] / df['A1101'].clip(1) * 10000 # 件 / 万人 df['消費支出'] = df['L3221'] / 1000 # 千円 df['住宅地価格'] = df['C5401'] # 千円/m² df['教育費割合'] = df['L322108'] / df['L3221'].clip(1) * 100 # % df['外国人宿泊割合'] = df['G7102'] / df['G7101'].clip(1) * 100 # % df['若年人口比_男'] = df['A130201'] / df['A1302'].clip(1) * 100 # % df['若年人口比_女'] = df['A130202'] / df['A1302'].clip(1) * 100 # % TARGET = '大学進学率' VARS = ['国際旅券発行率', '消費支出', '住宅地価格', '教育費割合', '外国人宿泊割合', '若年人口比_男', '若年人口比_女'] |
print はしません。データや図が裏で更新されただけ。次のステップへ進みましょう。x if cond else y は三項演算子。リスト内包表記と組み合わせると、forとifを1行で書けます。46 47 48 49 50 51 52 | # 欠損確認・除外 needed = [TARGET] + VARS df_clean = df.dropna(subset=needed).reset_index(drop=True) pref_clean = [pref_names[i] for i in df_clean.index] if len(df_clean) == len(df) \ else df_clean['Prefecture'].astype(str).tolist() N = len(df_clean) print(f"有効都道府県数(欠損除外後): N={N}") |
print はしません。データや図が裏で更新されただけ。次のステップへ進みましょう。df[col](1列)と df[[col1, col2]](複数列)でカッコの数が違います。リストを渡していると覚えるとミスを減らせます。53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 | # ── 記述統計 ───────────────────────────────────────────────── print("\n── 記述統計 ──") print(df_clean[needed].describe().round(2)) # ── 地域グループ(6地域)───────────────────────────────────── # 都道府県コード(R01000〜R47000)→ 番号で判定 df_clean['pref_no'] = df_clean['Code'].astype(str).str.extract(r'R(\d{2})').astype(int) region_map = { '北海道・東北': [1, 2, 3, 4, 5, 6, 7], '関東': [8, 9, 10, 11, 12, 13, 14], '中部': [15, 16, 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, 47], } def assign_region(pno): for region, nos in region_map.items(): if pno in nos: return region return 'その他' df_clean['地域'] = df_clean['pref_no'].apply(assign_region) |
print はしません。データや図が裏で更新されただけ。次のステップへ進みましょう。.astype(int) — 列を整数に変換(年度などを数値比較するため)。.describe() — 件数・平均・標準偏差・四分位・最大/最小を一括計算。データの素性チェックに必須。s[:-n]「末尾n文字を除く」/s[n:]「先頭n文字を除く」。スライス [start:stop:step] はリスト・タプル・文字列共通の基本ワザです。77 78 79 80 81 82 83 84 85 86 87 88 89 90 | # ── 相関係数(全変数 vs 大学進学率)───────────────────────── print("\n── 相関分析(vs 大学進学率)──") print(f" {'変数':<18} {'r':>8} {'p値':>10} {'有意':>6}") print(" " + "-" * 46) corrs = {} pvals = {} for v in VARS: x = df_clean[v].values y = df_clean[TARGET].values r, p = stats.pearsonr(x, y) corrs[v] = r pvals[v] = p sig = '***' if p < 0.001 else '**' if p < 0.01 else '*' if p < 0.05 else 'n.s.' print(f" {v:<18} {r:>8.4f} {p:>10.4f} {sig:>6}") |
============================================================
■ 対象: 2022年度 都道府県データ N=47
============================================================
有効都道府県数(欠損除外後): N=47
── 記述統計 ──
大学進学率 国際旅券発行率 消費支出 住宅地価格 教育費割合 外国人宿泊割合 若年人口比_男 若年人口比_女
count 47.00 47.00 47.00 47.00 47.00 47.00 47.00 47.00
mean 56.62 65.80 289.63 53372.34 3.63 1.70 50.57 49.46
std 7.01 35.57 19.19 61991.62 1.28 1.97 0.98 0.98
min 46.20 27.05 245.05 13200.00 1.95 0.34 48.44 47.79
25% 50.76 43.20 276.83 25300.00 2.83 0.71 49.76 48.68
50% 56.77 54.02 287.78 30800.00 3.44 0.96 50.69 49.38
75% 61.33 79.04 302.26 55500.00 3.97 1.66 51.42 50.26
max 72.99 220.44 324.79 389100.00 8.61 11.05 52.21 51.56
── 相関分析(vs 大学進学率)──
変数 r p値 有意
----------------------------------------------
国際旅券発行率 0.7530 0.0000 ***
消費支出 0.4464 0.0017 **
住宅地価格 0.6717 0.0000 ***
教育費割合 0.4644 0.0010 **
外国人宿泊割合 0.5594 0.0000 ***
若年人口比_男 0.0893 0.5508 n.s.
若年人口比_女 -0.1028 0.4916 n.s.stats.pearsonr(x, y) — Pearson相関係数 r と p値を同時に返します。np.cumsum(arr) は累積和、np.linspace(a, b, n) は「aからbを等間隔でn個」。NumPyの定石です。国際旅券発行率(国際経験の代理変数)と大学進学率(英語力の代理変数)の関係を散布図で示す。各点は1都道府県を表し、6地域でカラー分けしている。
国際旅券発行率と大学進学率の相関が高くても、「旅券を持つと英語が上達する」とは言えない。両変数は「経済的豊かさ・教育水準」という共通の背後因子(交絡変数)を反映している可能性がある。相関は関連を示すが因果関係を証明しない。
92 93 94 95 96 97 98 99 100 101 | fig1, ax1 = plt.subplots(figsize=(9, 6)) x1 = df_clean['国際旅券発行率'].values y1 = df_clean[TARGET].values # 地域カラーで描画 for region, color in zip(REGION_ORDER, REGION_COLORS): mask_r = df_clean['地域'] == region ax1.scatter(x1[mask_r], y1[mask_r], color=color, s=60, alpha=0.8, label=region, zorder=3) |
print はしません。データや図が裏で更新されただけ。次のステップへ進みましょう。fig, ax = plt.subplots(...) — 図全体(fig)と軸(ax)を作る定番。以降は ax.bar(...) 等で操作。[式 for x in リスト] はリスト内包表記。forループでappendする代わりに1行でリストを作れます。102 103 104 105 106 107 108 109 110 111 112 113 | # 回帰直線 z1 = np.polyfit(x1, y1, 1) xs1 = np.linspace(x1.min(), x1.max(), 200) ax1.plot(xs1, np.poly1d(z1)(xs1), 'k--', linewidth=1.5, alpha=0.7, label='回帰直線') r1, p1 = stats.pearsonr(x1, y1) ax1.set_xlabel('国際旅券発行率(件 / 万人)\n=国際経験の代理変数', fontsize=11) ax1.set_ylabel('大学進学率(%)\n=英語力の代理変数', fontsize=11) ax1.set_title(f'国際経験と大学進学率の関係(都道府県別, 2022年)\nr = {r1:.3f} p = {p1:.4f}', fontsize=12, fontweight='bold') ax1.legend(fontsize=9, loc='lower right', ncol=2) ax1.grid(True, alpha=0.3) |
print はしません。データや図が裏で更新されただけ。次のステップへ進みましょう。stats.pearsonr(x, y) — Pearson相関係数 r と p値を同時に返します。r, p = stats.pearsonr(...) — Pythonは複数戻り値を同時に受け取れる(タプルアンパック)。114 115 116 117 118 119 120 121 122 123 124 125 126 | # 主要都道府県にラベル highlight = {'東京都': 'top', '大阪府': 'bottom', '沖縄県': 'top', '鳥取県': 'bottom', '愛知県': 'top'} for i, name in enumerate(df_clean['Prefecture'].tolist()): if name in highlight: va = highlight[name] ax1.annotate(name, (x1[i], y1[i]), textcoords='offset points', xytext=(0, 6 if va == 'top' else -10), ha='center', fontsize=8, color='#333') plt.tight_layout() fig1.savefig(os.path.join(FIG_DIR, '2023_H5_1_fig1_scatter.png'), bbox_inches='tight', dpi=150) plt.close(fig1) print("\n図1保存: 2023_H5_1_fig1_scatter.png") |
図1保存: 2023_H5_1_fig1_scatter.png
x if cond else y は三項演算子。リスト内包表記と組み合わせると、forとifを1行で書けます。「国際比較」の代替として、47都道府県を6地域(北海道・東北 / 関東 / 中部 / 近畿 / 中国・四国 / 九州・沖縄)に分けて大学進学率を比較する。これにより、日本国内の「地域格差」を国際格差のアナロジーとして分析できる。
| 地域 | 都道府県数 | 大学進学率平均 | 標準偏差 | 全国平均との差 |
|---|---|---|---|---|
| 関東 | 7 | 約62.0% | 5.3% | +5.4pt |
| 近畿 | 7 | 約60.0% | 4.2% | +3.4pt |
| 中部 | 9 | 約57.5% | 5.8% | +0.9pt |
| 北海道・東北 | 7 | 約52.8% | 3.9% | -3.8pt |
| 中国・四国 | 9 | 約52.5% | 4.1% | -4.1pt |
| 九州・沖縄 | 8 | 約51.5% | 3.6% | -5.1pt |
※平均値は実データより算出(概算値)。
6地域の平均値を比較する際は、グループ内のばらつき(標準偏差)にも着目する。エラーバーが重なっているグループ間では「有意差なし」の可能性がある。厳密には一元配置分散分析(one-way ANOVA)や多重比較検定(Tukey HSD 等)が必要。
128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 | fig2, ax2 = plt.subplots(figsize=(10, 6)) region_means = {} region_stds = {} region_ns = {} for region in REGION_ORDER: vals = df_clean.loc[df_clean['地域'] == region, TARGET].values region_means[region] = vals.mean() region_stds[region] = vals.std(ddof=1) if len(vals) > 1 else 0 region_ns[region] = len(vals) means = [region_means[r] for r in REGION_ORDER] stds = [region_stds[r] for r in REGION_ORDER] ns = [region_ns[r] for r in REGION_ORDER] x2pos = np.arange(len(REGION_ORDER)) bars = ax2.bar(x2pos, means, color=REGION_COLORS, alpha=0.80, edgecolor='white', linewidth=1.2, width=0.6) ax2.errorbar(x2pos, means, yerr=stds, fmt='none', color='#333', capsize=5, linewidth=1.5) |
print はしません。データや図が裏で更新されただけ。次のステップへ進みましょう。fig, ax = plt.subplots(...) — 図全体(fig)と軸(ax)を作る定番。以降は ax.bar(...) 等で操作。r, p = stats.pearsonr(...) — Pythonは複数戻り値を同時に受け取れる(タプルアンパック)。148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 | # 全国平均 national_mean = df_clean[TARGET].mean() ax2.axhline(national_mean, color='#555', linestyle='--', linewidth=1.5, label=f'全国平均 {national_mean:.1f}%') for i, (m, s, n) in enumerate(zip(means, stds, ns)): ax2.text(i, m + s + 0.5, f'{m:.1f}%\n(N={n})', ha='center', va='bottom', fontsize=9, fontweight='bold') ax2.set_xticks(x2pos) ax2.set_xticklabels(REGION_ORDER, fontsize=10) ax2.set_ylabel('大学進学率(%)', fontsize=11) ax2.set_title('地域別 大学進学率の比較(2022年度 都道府県データ)\n(棒=平均, エラーバー=標準偏差)', fontsize=12, fontweight='bold') ax2.legend(fontsize=10) ax2.grid(axis='y', alpha=0.3) ax2.set_ylim(0, max(means) + max(stds) + 8) plt.tight_layout() fig2.savefig(os.path.join(FIG_DIR, '2023_H5_1_fig2_region.png'), bbox_inches='tight', dpi=150) plt.close(fig2) print("図2保存: 2023_H5_1_fig2_region.png") |
図2保存: 2023_H5_1_fig2_region.png
ax.axhline / ax.axvline — 水平/垂直の点線。平均線や基準線として定番。x if cond else y は三項演算子。リスト内包表記と組み合わせると、forとifを1行で書けます。大学進学率(英語力 proxy)と各説明変数の相関係数を算出し、無相関検定を実施する。どの要因が最も関連するかを視覚的に比較する。
| 変数 | 相関係数 r | p値 | 有意水準 | 解釈 |
|---|---|---|---|---|
| 国際旅券発行率(国際経験) | 0.753 | < 0.001 | *** | 最も強い正の相関 |
| 住宅地価格(経済力) | 0.672 | < 0.001 | *** | 都市部の経済力を反映 |
| 外国人宿泊者割合(英語環境) | 0.559 | < 0.001 | *** | インバウンドと英語環境 |
| 教育費割合(教育投資) | 0.464 | 0.001 | ** | 教育支出が進学率に貢献 |
| 消費支出(経済力) | 0.446 | 0.002 | ** | 経済的余裕と進学率 |
| 若年人口比(男) | 0.089 | 0.551 | n.s. | 有意な関連なし |
| 若年人口比(女) | -0.103 | 0.492 | n.s. | 有意な関連なし |
1. 多重共線性:国際旅券発行率・住宅地価格・消費支出は互いに高相関(都市部 vs 地方)の可能性。VIFで確認が必要。
2. N=47の検出力:都道府県数は47と少ない。|r| ≥ 0.29 程度でp < 0.05となる。
3. 外れ値の影響:東京(旅券発行率が極めて高い)が相関係数を引き上げている可能性。ロバスト相関(スピアマン)も確認が望ましい。
171 172 173 174 175 176 177 178 179 180 181 182 183 184 185 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 211 212 213 214 215 216 217 218 219 220 221 222 | fig3, ax3 = plt.subplots(figsize=(9, 5)) var_labels = { '国際旅券発行率': '国際旅券発行率\n(国際経験 proxy)', '消費支出': '消費支出\n(経済力)', '住宅地価格': '住宅地価格\n(地価水準)', '教育費割合': '教育費割合\n(教育投資)', '外国人宿泊割合': '外国人宿泊者割合\n(英語環境)', '若年人口比_男': '若年人口比(男)\n(15〜64歳)', '若年人口比_女': '若年人口比(女)\n(15〜64歳)', } r_vals = [corrs[v] for v in VARS] p_vals = [pvals[v] for v in VARS] labels3 = [var_labels[v] for v in VARS] colors3 = [] for r, p in zip(r_vals, p_vals): if p < 0.05: colors3.append('#C62828' if r > 0 else '#1565C0') else: colors3.append('#9E9E9E') y_pos3 = np.arange(len(VARS)) ax3.barh(y_pos3, r_vals, color=colors3, alpha=0.78, edgecolor='white', height=0.6) ax3.axvline(0, color='gray', linestyle='--', linewidth=1.0) ax3.set_yticks(y_pos3) ax3.set_yticklabels(labels3, fontsize=9.5) ax3.set_xlabel('ピアソン相関係数', fontsize=11) ax3.set_title('各変数と大学進学率の相関係数(2022年度, N=47都道府県)\n' '(赤=正相関有意, 青=負相関有意, 灰=非有意 p≥0.05)', fontsize=11, fontweight='bold') ax3.invert_yaxis() ax3.grid(axis='x', alpha=0.3) for i, (r, p) in enumerate(zip(r_vals, p_vals)): sig = '***' if p < 0.001 else '**' if p < 0.01 else '*' if p < 0.05 else '' offset = 0.015 if r >= 0 else -0.015 ha = 'left' if r >= 0 else 'right' ax3.text(r + offset, i, f'{r:.3f}{sig}', va='center', ha=ha, fontsize=9) from matplotlib.patches import Patch legend_patches = [ Patch(color='#C62828', alpha=0.78, label='正相関(p<0.05)'), Patch(color='#1565C0', alpha=0.78, label='負相関(p<0.05)'), Patch(color='#9E9E9E', alpha=0.78, label='非有意(p≥0.05)'), ] ax3.legend(handles=legend_patches, fontsize=9, loc='lower right') plt.tight_layout() fig3.savefig(os.path.join(FIG_DIR, '2023_H5_1_fig3_corr.png'), bbox_inches='tight', dpi=150) plt.close(fig3) print("図3保存: 2023_H5_1_fig3_corr.png") |
図3保存: 2023_H5_1_fig3_corr.png
import pandas as pd など — 必要なライブラリをまとめて呼び出します。as pd は短い別名(alias)。fig, ax = plt.subplots(...) — 図全体(fig)と軸(ax)を作る定番。以降は ax.bar(...) 等で操作。ax.axhline / ax.axvline — 水平/垂直の点線。平均線や基準線として定番。x if cond else y は三項演算子。リスト内包表記と組み合わせると、forとifを1行で書けます。政策的示唆として重要な「教育費割合(教育投資)」と大学進学率の関係を詳細に分析する。経済力(住宅地価格・消費支出)は「社会経済的地位」の指標であるのに対し、教育費割合は家庭が教育に積極的に投資する意向を示す。
単変量の相関・単回帰は「2変数の関連」を示すが、説明力(R²)は低いことが多い。複数の要因を同時に考慮するには重回帰分析(OLS)が必要。また、変数間の相互作用(交互作用項)を含めることで、地域や経済水準によって教育費の効果が異なるかどうかを検討できる。
224 225 226 227 228 229 230 231 232 233 234 235 236 237 238 239 240 | import numpy as np import pandas as pd import matplotlib matplotlib.use('Agg') import matplotlib.pyplot as plt from scipy import stats import warnings warnings.filterwarnings('ignore') plt.rcParams['font.family'] = 'Hiragino Sans' plt.rcParams['axes.unicode_minus'] = False plt.rcParams['figure.dpi'] = 150 import os FIG_DIR = 'html/figures' DATA_DIR = 'data/raw' 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} のように書式も指定できます。241 242 | REGION_ORDER = ['北海道・東北', '関東', '中部', '近畿', '中国・四国', '九州・沖縄'] REGION_COLORS = ['#1565C0', '#C62828', '#2E7D32', '#E65100', '#6A1B9A', '#00838F'] |
print はしません。データや図が裏で更新されただけ。次のステップへ進みましょう。.map() は「1対1の置き換え」、.apply() は「関数を当てる」。辞書なら .map()、ロジックなら .apply()。243 244 245 246 247 248 249 250 251 | fig4, ax4 = plt.subplots(figsize=(9, 6)) x4 = df_clean['教育費割合'].values y4 = df_clean[TARGET].values for region, color in zip(REGION_ORDER, REGION_COLORS): mask_r4 = df_clean['地域'] == region ax4.scatter(x4[mask_r4], y4[mask_r4], color=color, s=60, alpha=0.8, label=region, zorder=3) |
print はしません。データや図が裏で更新されただけ。次のステップへ進みましょう。fig, ax = plt.subplots(...) — 図全体(fig)と軸(ax)を作る定番。以降は ax.bar(...) 等で操作。df[col](1列)と df[[col1, col2]](複数列)でカッコの数が違います。リストを渡していると覚えるとミスを減らせます。252 253 254 255 256 257 258 | # 回帰直線 z4 = np.polyfit(x4, y4, 1) xs4 = np.linspace(x4.min(), x4.max(), 200) ys4 = np.poly1d(z4)(xs4) ax4.plot(xs4, ys4, 'k--', linewidth=1.8, alpha=0.8, label=f'回帰直線 y={z4[0]:.2f}x+{z4[1]:.1f}') r4, p4 = stats.pearsonr(x4, y4) |
print はしません。データや図が裏で更新されただけ。次のステップへ進みましょう。stats.pearsonr(x, y) — Pearson相関係数 r と p値を同時に返します。s[:-n]「末尾n文字を除く」/s[n:]「先頭n文字を除く」。スライス [start:stop:step] はリスト・タプル・文字列共通の基本ワザです。259 260 261 262 263 264 265 266 267 268 | # 信頼区間(bootstrap近似 → 簡易: SE from residuals) n4 = len(x4) y_pred4 = np.poly1d(z4)(x4) resid4 = y4 - y_pred4 se4 = np.sqrt(np.sum(resid4**2) / (n4 - 2)) x_mean4 = x4.mean() ss_x4 = np.sum((x4 - x_mean4)**2) se_y4 = se4 * np.sqrt(1/n4 + (xs4 - x_mean4)**2 / ss_x4) ax4.fill_between(xs4, ys4 - 1.96*se_y4, ys4 + 1.96*se_y4, color='gray', alpha=0.15, label='95%信頼区間') |
print はしません。データや図が裏で更新されただけ。次のステップへ進みましょう。ax.fill_between(...) — 2つの曲線で囲まれた領域を塗りつぶし。Lorenz曲線の格差面積などを可視化。np.cumsum(arr) は累積和、np.linspace(a, b, n) は「aからbを等間隔でn個」。NumPyの定石です。269 270 271 272 273 274 275 276 277 278 279 280 281 282 283 284 285 286 287 288 289 290 291 292 293 | # 主要都道府県ラベル highlight4 = {'東京都', '大阪府', '沖縄県', '秋田県', '京都府'} for i, name in enumerate(df_clean['Prefecture'].tolist()): if name in highlight4: ax4.annotate(name, (x4[i], y4[i]), textcoords='offset points', xytext=(4, 3), ha='left', fontsize=8, color='#333') ax4.set_xlabel('教育費割合(消費支出に占める割合, %)\n=教育投資の代理変数', fontsize=11) ax4.set_ylabel('大学進学率(%)\n=英語力の代理変数', fontsize=11) ax4.set_title(f'教育投資と大学進学率の関係(都道府県別, 2022年)\n' f'r = {r4:.3f} p = {p4:.4f}', fontsize=12, fontweight='bold') ax4.legend(fontsize=9, loc='upper left') ax4.grid(True, alpha=0.3) plt.tight_layout() fig4.savefig(os.path.join(FIG_DIR, '2023_H5_1_fig4_educ.png'), bbox_inches='tight', dpi=150) plt.close(fig4) print("図4保存: 2023_H5_1_fig4_educ.png") print("\n全図の生成完了(4枚)") print(f" fig1_scatter.png : 国際旅券発行率 vs 大学進学率(地域カラー散布図)") print(f" fig2_region.png : 地域別 大学進学率の棒グラフ比較") print(f" fig3_corr.png : 全変数 vs 大学進学率 相関棒グラフ") print(f" fig4_educ.png : 教育費割合 vs 大学進学率(回帰直線・信頼区間)") |
図4保存: 2023_H5_1_fig4_educ.png 全図の生成完了(4枚) fig1_scatter.png : 国際旅券発行率 vs 大学進学率(地域カラー散布図) fig2_region.png : 地域別 大学進学率の棒グラフ比較 fig3_corr.png : 全変数 vs 大学進学率 相関棒グラフ fig4_educ.png : 教育費割合 vs 大学進学率(回帰直線・信頼区間)
{値:.2f}(小数2桁)、{値:,}(3桁区切り)、{値:>10}(右寄せ10桁)など、覚えると出力が一気に整います。SSDSE-B(都道府県データ, 2022年度)を用いた分析から、日本人の「英語力(大学進学率で代理)」の都道府県差を規定する要因について以下が明らかになった。
| データ | 出典 |
|---|---|
| SSDSE-B-2026 都道府県データ(2022年度) | 統計センター SSDSE(社会・人口統計体系) |
| 国際旅券発行件数(G5105) | 外務省 |
| 宿泊旅行統計(G7101/G7102) | 観光庁 宿泊旅行統計調査 |
| 学校基本調査(E4601/E4602) | 文部科学省 |
| 家計調査(L3221/L322108) | 総務省統計局 |
| 地価公示(C5401) | 国土交通省 |
本コードは SSDSE-B-2026 の実データのみを使用(合成データ・np.random 不使用)。
統計分析の解釈で初心者がやりがちな勘違いをまとめます。特に「相関と因果の混同」「p値の過信」は研究現場でもよく起きる落とし穴です。本文を読む前にも、読んだ後にも、目を通してみてください。
統計の基本用語を初心者向けに解説します。本文中で見慣れない言葉が出てきたら、ここに戻って確認してください。
統計手法について「何のためか」「結果をどう読むか」を初心者向けに解説します。
この研究をさらに発展させるための3つの方向性を示します。「今回わかったこと(X)」から「次に検証すべき仮説(Y)」を立て、「具体的に何をするか(Z)」まで考えてみましょう。
学んだだけでは身につきません。実際に手を動かすのが最強の学習方法です。本論文のスクリプトをベースに、以下のチャレンジに挑戦してみてください。難易度別に5つ用意しました。
本論文で学んだ手法は、研究の世界だけでなく、行政・企業・NPO の現場でも様々に活用されています。具体的なシーンを紹介します。
この論文を読んで初心者が抱きやすい疑問に、教育的観点から答えます。