"""
教育用再現コード: 2022年 統計データ分析コンペティション 審査員奨励賞 [高校生の部]
=================================================================
論文タイトル：地域の学力差と教育環境：教員配置・教育費の影響分析
受賞：審査員奨励賞（高校生の部）

【分析概要】
  データ：SSDSE-B-2026.csv（都道府県別パネルデータ, 2012〜2023年度）
  対象：47都道府県 × 12年間（時系列・横断面）

  学力データの代理変数として「大学進学率」を用い、教員配置充実度・
  家計教育費・高齢化率などとの関連をOLS回帰・散布図・時系列・
  地域比較で多角的に分析する。

  分析の流れ
  Fig1. 大学進学率の地域別時系列（2012〜2023年）
  Fig2. 教育費 vs 大学進学率 散布図（2022年・47都道府県ラベル付き）
  Fig3. OLS回帰係数プロット（大学進学率の決定要因）
  Fig4. 教員配置充実度の地域別箱ひげ図（小学校・中学校並列）

【変数設計】
  大学進学率（%）           = 高等学校卒業者のうち進学者数 / 高等学校卒業者数 × 100
  教員配置充実度（小）（%） = 小学校教員数 / 小学校児童数 × 100
  教員配置充実度（中）（%） = 中学校教員数 / 中学校生徒数 × 100
  教育費_万円               = 教育費（二人以上の世帯）/ 10000
  高齢化率（%）             = 65歳以上人口 / 総人口 × 100
  消費支出_log              = log(消費支出（二人以上の世帯）)

【データ出典】
  SSDSE-B-2026.csv: 社会・人口統計体系（都道府県データ）
  統計数理研究所・統計センター公表の実データ

【データサイエンス学習ポイント】
  1. 学力データがない場合の代理変数（進学率の限界）
  2. 教員配置指標の設計（逆数変換の意味）
  3. 教育費の解釈（家計の教育投資 vs 公教育支出の違い）
  4. 教育機会の均等化（地域格差縮小への政策的示唆）
=================================================================
"""

# ============================================================
# 【データの準備】実行前に以下のデータファイルを用意してください
#
#   必要ファイル:
#     ・SSDSE-B-2026.csv
#       → data/raw/SSDSE-B-2026.csv に配置
#
#   ダウンロード先:
#     https://www.nstac.go.jp/use/literacy/ssdse/
#     （SSDSE-B（社会・人口統計体系 都道府県データ） の CSV をダウンロード）
#
#   フォルダ配置（プロジェクトルートからの相対パス）:
#     code/                ← このスクリプトの場所
#     data/raw/            ← CSV ファイルをここに配置
#     html/figures/        ← 図の出力先（自動生成）
#
#   実行方法（ファイルを一切編集せず実行可能）:
#     python3 code/2022_H5_9_shorei.py
# ============================================================


import numpy as np
import pandas as pd
import matplotlib
matplotlib.use('Agg')
import matplotlib.pyplot as plt
from matplotlib.patches import Patch
import statsmodels.api as sm
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_B  = 'data/raw/SSDSE-B-2026.csv'
os.makedirs(FIG_DIR, exist_ok=True)

# ================================================================
# ■ 実データ読み込み（SSDSE-B-2026: 都道府県データ）
# ================================================================
df_raw = pd.read_csv(DATA_B, encoding='cp932', header=1)

# 都道府県のみ（地域コードが R + 5桁数字）
pref_mask = df_raw['地域コード'].str.match(r'^R\d{5}$', na=False)
df_all = df_raw[pref_mask].copy().reset_index(drop=True)

# 数値変換
num_cols = [
    '総人口', '65歳以上人口',
    '小学校教員数', '小学校児童数',
    '中学校教員数', '中学校生徒数',
    '高等学校卒業者数', '高等学校卒業者のうち進学者数',
    '教育費（二人以上の世帯）',
    '消費支出（二人以上の世帯）',
]
for c in num_cols:
    df_all[c] = pd.to_numeric(df_all[c], errors='coerce')

# ── 派生変数を計算 ─────────────────────────────────────────────
df_all['大学進学率']        = (df_all['高等学校卒業者のうち進学者数']
                                / df_all['高等学校卒業者数'] * 100)
df_all['教員配置充実度_小'] = (df_all['小学校教員数']
                                / df_all['小学校児童数'] * 100)
df_all['教員配置充実度_中'] = (df_all['中学校教員数']
                                / df_all['中学校生徒数'] * 100)
df_all['教育費_万円']       = df_all['教育費（二人以上の世帯）'] / 10000
df_all['高齢化率']          = df_all['65歳以上人口'] / df_all['総人口'] * 100
df_all['消費支出_log']      = np.log(df_all['消費支出（二人以上の世帯）'])

print("=" * 65)
print(f"■ 全データ: {len(df_all)}行（47都道府県 × 12年間）")
print("=" * 65)

# 2022年断面
df2022 = df_all[df_all['年度'] == 2022].copy().reset_index(drop=True)
print(f"  2022年データ: {len(df2022)}都道府県")

# 欠損除外（2022年）
key_vars = ['大学進学率', '教員配置充実度_小', '教員配置充実度_中',
            '教育費_万円', '高齢化率', '消費支出_log']
df2022_clean = df2022.dropna(subset=key_vars).reset_index(drop=True)
N = len(df2022_clean)
print(f"  欠損除外後: N={N}都道府県")
print()
print(df2022_clean[['都道府県'] + key_vars].describe().round(3))

# ── 地域ブロック区分（全国6ブロック）────────────────────────────
region_map = {
    '北海道': '北海道・東北', '青森県': '北海道・東北', '岩手県': '北海道・東北',
    '宮城県': '北海道・東北', '秋田県': '北海道・東北', '山形県': '北海道・東北',
    '福島県': '北海道・東北',
    '茨城県': '関東', '栃木県': '関東', '群馬県': '関東',
    '埼玉県': '関東', '千葉県': '関東', '東京都': '関東', '神奈川県': '関東',
    '新潟県': '中部', '富山県': '中部', '石川県': '中部', '福井県': '中部',
    '山梨県': '中部', '長野県': '中部', '岐阜県': '中部', '静岡県': '中部',
    '愛知県': '中部',
    '三重県': '近畿', '滋賀県': '近畿', '京都府': '近畿',
    '大阪府': '近畿', '兵庫県': '近畿', '奈良県': '近畿', '和歌山県': '近畿',
    '鳥取県': '中国・四国', '島根県': '中国・四国', '岡山県': '中国・四国',
    '広島県': '中国・四国', '山口県': '中国・四国',
    '徳島県': '中国・四国', '香川県': '中国・四国', '愛媛県': '中国・四国',
    '高知県': '中国・四国',
    '福岡県': '九州・沖縄', '佐賀県': '九州・沖縄', '長崎県': '九州・沖縄',
    '熊本県': '九州・沖縄', '大分県': '九州・沖縄', '宮崎県': '九州・沖縄',
    '鹿児島県': '九州・沖縄', '沖縄県': '九州・沖縄',
}
region_order = ['北海道・東北', '関東', '中部', '近畿', '中国・四国', '九州・沖縄']
region_colors = {
    '北海道・東北': '#1565C0',
    '関東':         '#C62828',
    '中部':         '#2E7D32',
    '近畿':         '#E65100',
    '中国・四国':   '#6A1B9A',
    '九州・沖縄':   '#00838F',
}

df_all['地域ブロック']       = df_all['都道府県'].map(region_map)
df2022_clean['地域ブロック'] = df2022_clean['都道府県'].map(region_map)

# ── 時系列用データ（全年度）────────────────────────────────────
df_ts = df_all.dropna(subset=['大学進学率', '地域ブロック']).copy()

# ── 相関確認（2022年）────────────────────────────────────────
print("\n■ 2022年 主要変数間の相関（vs 大学進学率）")
for v in ['教員配置充実度_小', '教員配置充実度_中', '教育費_万円', '高齢化率', '消費支出_log']:
    r, p = stats.pearsonr(df2022_clean[v], df2022_clean['大学進学率'])
    sig = '***' if p < 0.001 else '**' if p < 0.01 else '*' if p < 0.05 else 'n.s.'
    print(f"  {v:<22} r={r:>7.4f}  p={p:.4f}  {sig}")

# ================================================================
# ■ OLS回帰（大学進学率 の決定要因）
# ================================================================
y_ols = df2022_clean['大学進学率'].values
ols_varnames = ['教員配置充実度_小', '教員配置充実度_中', '教育費_万円', '高齢化率', '消費支出_log']
X_ols = df2022_clean[ols_varnames].values
X_ols_c = sm.add_constant(X_ols)
ols_model = sm.OLS(y_ols, X_ols_c).fit()

print("\n■ OLS回帰結果（目的変数: 大学進学率）")
print(ols_model.summary2())

coefs = ols_model.params[1:]
ses   = ols_model.bse[1:]
pvals = ols_model.pvalues[1:]

# ================================================================
# ■ 図の生成（4枚）
# ================================================================

# ────────────────────────────────────────────────────────────────
# 図1: 大学進学率の地域別時系列（2012〜2023年）
# ────────────────────────────────────────────────────────────────
fig1, ax1 = plt.subplots(figsize=(11, 6))

for region in region_order:
    df_r = (df_ts[df_ts['地域ブロック'] == region]
            .groupby('年度')['大学進学率'].mean().sort_index())
    if len(df_r) == 0:
        continue
    ax1.plot(df_r.index, df_r.values,
             color=region_colors[region], linewidth=2.0,
             marker='o', markersize=5, label=region)

# 全国平均を太破線で重ね書き
df_nat = df_ts.groupby('年度')['大学進学率'].mean().sort_index()
ax1.plot(df_nat.index, df_nat.values,
         color='black', linewidth=2.5, linestyle='--',
         marker='D', markersize=5, label='全国平均', zorder=10)

ax1.set_xlabel('年度', fontsize=12)
ax1.set_ylabel('大学進学率（%）\n[高校卒業者のうち進学者 / 卒業者 × 100]', fontsize=11)
ax1.set_title('大学進学率の地域別推移（2012〜2023年）\n'
              '6地域ブロック平均値（SSDSE-B実データ）',
              fontsize=13, fontweight='bold')
ax1.legend(fontsize=10, loc='upper left')
ax1.grid(True, alpha=0.3)
ax1.set_xticks(range(2012, 2024, 2))

plt.tight_layout()
fig1_path = os.path.join(FIG_DIR, '2022_H5_9_fig1_timeseries.png')
fig1.savefig(fig1_path, bbox_inches='tight', dpi=150)
plt.close(fig1)
print(f"\n図1保存: {os.path.basename(fig1_path)}")

# ────────────────────────────────────────────────────────────────
# 図2: 教育費 vs 大学進学率 散布図（2022年・都道府県ラベル付き）
# ────────────────────────────────────────────────────────────────
fig2, ax2 = plt.subplots(figsize=(12, 8))

for region in region_order:
    mask = df2022_clean['地域ブロック'] == region
    ax2.scatter(df2022_clean.loc[mask, '教育費_万円'],
                df2022_clean.loc[mask, '大学進学率'],
                color=region_colors[region], s=65, alpha=0.85,
                label=region, zorder=3)

# 都道府県ラベル
for _, row in df2022_clean.iterrows():
    ax2.annotate(row['都道府県'],
                 (row['教育費_万円'], row['大学進学率']),
                 fontsize=7.5, alpha=0.85,
                 xytext=(3, 3), textcoords='offset points')

# 単回帰直線
x_vals = df2022_clean['教育費_万円'].values
y_vals = df2022_clean['大学進学率'].values
z = np.polyfit(x_vals, y_vals, 1)
xs = np.linspace(x_vals.min() - 0.05, x_vals.max() + 0.05, 200)
ax2.plot(xs, np.poly1d(z)(xs), color='gray', linewidth=1.8,
         linestyle='--', alpha=0.7, zorder=2)

r2, p2 = stats.pearsonr(x_vals, y_vals)
ax2.set_xlabel('教育費（万円/月）[家計の二人以上世帯]', fontsize=12)
ax2.set_ylabel('大学進学率（%）', fontsize=12)
ax2.set_title(f'家計教育費 vs 大学進学率（2022年・47都道府県）\n'
              f'Pearson r = {r2:.3f}（p = {p2:.4f}）',
              fontsize=13, fontweight='bold')
ax2.legend(fontsize=10, loc='lower right')
ax2.grid(True, alpha=0.3)

plt.tight_layout()
fig2_path = os.path.join(FIG_DIR, '2022_H5_9_fig2_scatter.png')
fig2.savefig(fig2_path, bbox_inches='tight', dpi=150)
plt.close(fig2)
print(f"図2保存: {os.path.basename(fig2_path)}")

# ────────────────────────────────────────────────────────────────
# 図3: OLS回帰係数プロット（大学進学率の決定要因）
# ────────────────────────────────────────────────────────────────
fig3, ax3 = plt.subplots(figsize=(9, 5))

n_vars = len(ols_varnames)
y_pos  = np.arange(n_vars)
bar_colors = ['#C62828' if p < 0.01 else '#FF8F00' if p < 0.05 else '#9E9E9E'
              for p in pvals]

ax3.barh(y_pos, coefs, color=bar_colors, alpha=0.78,
         edgecolor='white', height=0.55)
ax3.errorbar(coefs, y_pos, xerr=1.96 * ses,
             fmt='none', color='#333333', capsize=5, linewidth=1.4)
ax3.axvline(0, color='gray', linestyle='--', linewidth=1.0)
ax3.set_yticks(y_pos)
ax3.set_yticklabels(ols_varnames, fontsize=11)
ax3.set_xlabel('回帰係数（±1.96×SE）', fontsize=12)
ax3.set_title(f'大学進学率（%）の決定要因 — OLS回帰係数\n'
              f'R² = {ols_model.rsquared:.3f}、N = {N}都道府県（2022年）',
              fontsize=12, fontweight='bold')
ax3.invert_yaxis()
ax3.grid(axis='x', alpha=0.3)

legend_handles = [
    Patch(color='#C62828', alpha=0.78, label='p < 0.01（高有意）'),
    Patch(color='#FF8F00', alpha=0.78, label='p < 0.05（有意）'),
    Patch(color='#9E9E9E', alpha=0.78, label='n.s.（非有意）'),
]
ax3.legend(handles=legend_handles, fontsize=9, loc='lower right')

for i, (c, p) in enumerate(zip(coefs, pvals)):
    sig = '***' if p < 0.001 else '**' if p < 0.01 else '*' if p < 0.05 else ''
    if sig:
        offset = max(abs(coefs)) * 0.03
        ax3.text(c + (offset if c >= 0 else -offset), i, sig,
                 va='center', ha='left' if c >= 0 else 'right',
                 fontsize=10, fontweight='bold')

plt.tight_layout()
fig3_path = os.path.join(FIG_DIR, '2022_H5_9_fig3_coef.png')
fig3.savefig(fig3_path, bbox_inches='tight', dpi=150)
plt.close(fig3)
print(f"図3保存: {os.path.basename(fig3_path)}")

# ────────────────────────────────────────────────────────────────
# 図4: 教員配置充実度の地域別箱ひげ図（小学校・中学校並列）
# ────────────────────────────────────────────────────────────────
fig4, axes4 = plt.subplots(1, 2, figsize=(13, 6), sharey=False)

for ax_idx, (var, label) in enumerate(
        [('教員配置充実度_小', '小学校'), ('教員配置充実度_中', '中学校')]):
    ax = axes4[ax_idx]
    box_data   = []
    box_labels = []
    for region in region_order:
        vals = (df2022_clean.loc[df2022_clean['地域ブロック'] == region, var]
                .dropna().values)
        box_data.append(vals)
        box_labels.append(f'{region}\n(n={len(vals)})')

    bp = ax.boxplot(
        box_data, patch_artist=True, notch=False,
        medianprops=dict(color='black', linewidth=2.0),
        flierprops=dict(marker='o', markersize=5, alpha=0.6),
        whiskerprops=dict(linewidth=1.4),
        capprops=dict(linewidth=1.4),
    )

    for patch, region in zip(bp['boxes'], region_order):
        patch.set_facecolor(region_colors[region])
        patch.set_alpha(0.65)

    # 全国平均線
    nat_mean = df2022_clean[var].mean()
    ax.axhline(nat_mean, color='black', linestyle='--', linewidth=1.5,
               label=f'全国平均 {nat_mean:.2f}%')

    ax.set_xticklabels(box_labels, fontsize=8)
    ax.set_ylabel(f'教員配置充実度（%）\n[教員数 / 生徒数 × 100]', fontsize=11)
    ax.set_title(f'{label}の教員配置充実度（2022年）', fontsize=12, fontweight='bold')
    ax.grid(axis='y', alpha=0.3)
    ax.legend(fontsize=9)

fig4.suptitle('地域別 教員配置充実度の分布（2022年・6地域ブロック）\n'
              '左: 小学校、右: 中学校（SSDSE-B実データ）',
              fontsize=13, fontweight='bold', y=1.01)

plt.tight_layout()
fig4_path = os.path.join(FIG_DIR, '2022_H5_9_fig4_boxplot.png')
fig4.savefig(fig4_path, bbox_inches='tight', dpi=150)
plt.close(fig4)
print(f"図4保存: {os.path.basename(fig4_path)}")

# ================================================================
# ■ 要約統計の出力
# ================================================================
print("\n" + "=" * 65)
print("■ 分析完了サマリー")
print("=" * 65)
print(f"  全データ行数       : {len(df_all)}（47都道府県 × 12年間）")
print(f"  2022年 N           : {N}都道府県")
print(f"  OLS R²             : {ols_model.rsquared:.4f}")
print(f"  OLS Adj.R²         : {ols_model.rsquared_adj:.4f}")
print(f"  OLS F-stat p値     : {ols_model.f_pvalue:.4f}")
print()
print("  ── 2022年 相関係数 vs 大学進学率 ──")
for v in ['教員配置充実度_小', '教員配置充実度_中', '教育費_万円', '高齢化率', '消費支出_log']:
    r, p = stats.pearsonr(df2022_clean[v], df2022_clean['大学進学率'])
    sig = '***' if p < 0.001 else '**' if p < 0.01 else '*' if p < 0.05 else 'n.s.'
    print(f"  {v:<22} r={r:>7.4f}  {sig}")
print()
print("  ── OLS 回帰係数（標準化なし）──")
for name, c, s, p in zip(ols_varnames, coefs, ses, pvals):
    sig = '***' if p < 0.001 else '**' if p < 0.01 else '*' if p < 0.05 else 'n.s.'
    print(f"  {name:<22} β={c:>8.4f}  SE={s:.4f}  {sig}")
print()
print("  保存図:")
for path in [fig1_path, fig2_path, fig3_path, fig4_path]:
    print(f"    {os.path.basename(path)}")
print()
print("処理正常終了。合成データは一切使用していません。")
