"""
教育用再現コード: 2022年 統計データ分析コンペティション 審査員奨励賞 [大学生・一般の部]
=================================================================
論文タイトル：東日本大震災後の避難生活と健康影響
受賞：審査員奨励賞（大学生・一般の部）

【分析概要】
  データ：SSDSE-B-2026.csv（都道府県別データ, 2012〜2023年度）
  対象：東北3県（岩手・宮城・福島）vs その他44都道府県
  方法：時系列分析、断絶時系列（ITS: Interrupted Time Series）的アプローチ、
        地域差比較

  分析軸
  ・保健医療費（二人以上の世帯）の時系列推移：東北 vs 全国平均
  ・東北3県の人口変化率（転入−転出差）の推移
  ・一般病院数の変化：東北 vs 全国
  ・転出率 vs 保健医療費の散布図（東北強調）

【期間区分】
  早期復興期（被災直後）：2012〜2014年度
  回復期          ：2019〜2023年度
  ※ SSDSE-Bの収録開始は2012年度のため、2012-2014を震災直後の参照期間とする

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

【データサイエンス学習ポイント】
  1. 時系列データにおける視覚的断絶時系列分析
  2. 地域差比較（東北3県 vs 全国平均）
  3. パネルデータの整形と集計
  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_U5_2_shorei.py
# ============================================================


import pandas as pd
import matplotlib
matplotlib.use('Agg')
import matplotlib.pyplot as plt
import numpy as np
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_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()

# 数値変換
num_cols = [
    '総人口', '保健医療費（二人以上の世帯）', '消費支出（二人以上の世帯）',
    '一般病院数', '転出者数（日本人移動者）', '転入者数（日本人移動者）',
]
for c in num_cols:
    df_b[c] = pd.to_numeric(df_b[c], errors='coerce')

# 東北3県フラグ
TOHOKU_CODES = ['R03000', 'R04000', 'R07000']
TOHOKU_NAMES = {'R03000': '岩手県', 'R04000': '宮城県', 'R07000': '福島県'}
df_b['東北フラグ'] = df_b['地域コード'].isin(TOHOKU_CODES)

# 東北3県・その他に分割
df_tohoku = df_b[df_b['東北フラグ']].copy()
df_other  = df_b[~df_b['東北フラグ']].copy()

years = sorted(df_b['年度'].unique())

print("=" * 60)
print("■ データ概要")
print("=" * 60)
print(f"  総観測数: {len(df_b)} 行 ({df_b['都道府県'].nunique()} 都道府県 × {len(years)} 年度)")
print(f"  期間    : {years[0]}〜{years[-1]} 年度")
print(f"  東北3県 : {', '.join(TOHOKU_NAMES.values())}")
print(f"  その他  : {df_b['都道府県'].nunique() - 3} 都道府県")
print()

# ── 各年度の集計 ────────────────────────────────────────────────
def yearly_stats(df, col):
    """年度ごとに集計（平均）"""
    return df.groupby('年度')[col].mean()

# 東北3県の年度別平均
tohoku_health  = yearly_stats(df_tohoku, '保健医療費（二人以上の世帯）')
tohoku_hosp    = yearly_stats(df_tohoku, '一般病院数')
tohoku_pop     = yearly_stats(df_tohoku, '総人口')

# 全国平均（東北含む47都道府県平均）
nation_health  = yearly_stats(df_b, '保健医療費（二人以上の世帯）')
nation_hosp    = yearly_stats(df_b, '一般病院数')

# その他44都道府県の年度別平均
other_health   = yearly_stats(df_other, '保健医療費（二人以上の世帯）')
other_hosp     = yearly_stats(df_other, '一般病院数')

# ── 人口変化率（転入−転出）: 東北3県個別 ────────────────────────
def net_migration_rate(df):
    """転入超過数 / 総人口 × 1000（千人あたり）"""
    g = df.groupby('年度')
    net = g['転入者数（日本人移動者）'].mean() - g['転出者数（日本人移動者）'].mean()
    pop = g['総人口'].mean()
    return (net / pop * 1000)

net_rate = {}
for code in TOHOKU_CODES:
    df_pref = df_b[df_b['地域コード'] == code]
    net_move = df_pref['転入者数（日本人移動者）'] - df_pref['転出者数（日本人移動者）']
    rate = (net_move / df_pref['総人口'] * 1000).values
    net_rate[TOHOKU_NAMES[code]] = pd.Series(rate, index=df_pref['年度'].values)

# ── 期間統計サマリ ───────────────────────────────────────────────
early_yrs    = [2012, 2013, 2014]
recovery_yrs = [2019, 2020, 2021, 2022, 2023]

print("  【保健医療費（二人以上の世帯）年度別平均（円）】")
print(f"  {'年度':<8} {'東北3県':>10} {'全国平均':>10} {'差':>10}")
print("  " + "-" * 42)
for yr in years:
    t_val = tohoku_health.get(yr, float('nan'))
    n_val = nation_health.get(yr, float('nan'))
    diff  = t_val - n_val
    marker = " ←早期" if yr in early_yrs else " ←回復" if yr in recovery_yrs else ""
    print(f"  {yr:<8} {t_val:>10,.0f} {n_val:>10,.0f} {diff:>+10,.0f}{marker}")
print()

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

# 色設定
COLOR_IWATE   = '#1565C0'   # 岩手：青
COLOR_MIYAGI  = '#2E7D32'   # 宮城：緑
COLOR_FUKUSHIMA = '#E65100' # 福島：オレンジ
COLOR_NATION  = '#9E9E9E'   # 全国平均：グレー
COLOR_OTHER   = '#BDBDBD'   # その他：薄グレー
SHADE_EARLY   = '#FFF9C4'   # 早期復興期（黄）
SHADE_RECOVER = '#E8F5E9'   # 回復期（緑）

# ────────────────────────────────────────────────────────────────
# 図1: 保健医療費の時系列（東北3県 vs 全国平均）
# ────────────────────────────────────────────────────────────────
fig1, ax1 = plt.subplots(figsize=(11, 6))

# 期間帯シェーディング
ax1.axvspan(2011.7, 2014.3, color=SHADE_EARLY,   alpha=0.7, label='早期復興期（2012-2014）', zorder=0)
ax1.axvspan(2018.7, 2023.3, color=SHADE_RECOVER, alpha=0.7, label='回復期（2019-2023）',    zorder=0)

# 東北3県個別
for code, color in zip(TOHOKU_CODES,
                        [COLOR_IWATE, COLOR_MIYAGI, COLOR_FUKUSHIMA]):
    df_pref = df_b[df_b['地域コード'] == code].sort_values('年度')
    ax1.plot(df_pref['年度'], df_pref['保健医療費（二人以上の世帯）'],
             color=color, linewidth=2.5, marker='o', markersize=5,
             label=TOHOKU_NAMES[code], zorder=3)

# 全国平均
ax1.plot(nation_health.index, nation_health.values,
         color=COLOR_NATION, linewidth=2.0, linestyle='--',
         marker='s', markersize=4, label='全国平均（47都道府県）', zorder=2)

ax1.set_xlabel('年度', fontsize=12)
ax1.set_ylabel('保健医療費（円 / 月 / 世帯）', fontsize=12)
ax1.set_title('保健医療費の時系列推移：東北3県 vs 全国平均\n'
              '（SSDSE-B 2012〜2023年度, 二人以上世帯）',
              fontsize=13, fontweight='bold')
ax1.set_xticks(years)
ax1.legend(fontsize=10, loc='upper left')
ax1.grid(True, alpha=0.3, axis='y')
ax1.yaxis.set_major_formatter(plt.FuncFormatter(lambda x, _: f'{x:,.0f}'))

plt.tight_layout()
fig1.savefig(os.path.join(FIG_DIR, '2022_U5_2_fig1_ts_health.png'),
             bbox_inches='tight', dpi=150)
plt.close(fig1)
print("図1保存: 2022_U5_2_fig1_ts_health.png")

# ────────────────────────────────────────────────────────────────
# 図2: 東北3県の人口変化率（転入−転出差）
# ────────────────────────────────────────────────────────────────
fig2, ax2 = plt.subplots(figsize=(11, 6))

ax2.axvspan(2011.7, 2014.3, color=SHADE_EARLY,   alpha=0.7, label='早期復興期（2012-2014）', zorder=0)
ax2.axvspan(2018.7, 2023.3, color=SHADE_RECOVER, alpha=0.7, label='回復期（2019-2023）',    zorder=0)
ax2.axhline(0, color='black', linewidth=1.0, linestyle='-', alpha=0.5)

for pref, color in zip(['岩手県', '宮城県', '福島県'],
                        [COLOR_IWATE, COLOR_MIYAGI, COLOR_FUKUSHIMA]):
    s = net_rate[pref].sort_index()
    ax2.plot(s.index, s.values, color=color, linewidth=2.5,
             marker='o', markersize=5, label=pref, zorder=3)
    ax2.fill_between(s.index, s.values, 0,
                     color=color, alpha=0.12, zorder=1)

ax2.set_xlabel('年度', fontsize=12)
ax2.set_ylabel('転入超過率（人 / 千人）', fontsize=12)
ax2.set_title('東北3県の人口移動：転入超過率の推移\n'
              '（転入者数 − 転出者数） / 総人口 × 1000',
              fontsize=13, fontweight='bold')
ax2.set_xticks(years)
ax2.legend(fontsize=10, loc='upper right')
ax2.grid(True, alpha=0.3, axis='y')

# 2012年の値にラベル付与
for pref, color, code in zip(['岩手県', '宮城県', '福島県'],
                              [COLOR_IWATE, COLOR_MIYAGI, COLOR_FUKUSHIMA],
                              TOHOKU_CODES):
    s = net_rate[pref].sort_index()
    ax2.annotate(f'{s.iloc[0]:+.1f}',
                 xy=(s.index[0], s.iloc[0]),
                 xytext=(-18, 8), textcoords='offset points',
                 fontsize=8.5, color=color, fontweight='bold')

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

# ────────────────────────────────────────────────────────────────
# 図3: 病院数の変化（東北3県 vs 全国平均、インデックス化）
# ────────────────────────────────────────────────────────────────
fig3, (ax3a, ax3b) = plt.subplots(1, 2, figsize=(13, 6))
fig3.suptitle('一般病院数の変化：東北3県 vs 全国\n（SSDSE-B 2012〜2023年度）',
              fontsize=13, fontweight='bold')

# --- 左パネル: 実数値（東北3県個別） ---
ax3a.axvspan(2011.7, 2014.3, color=SHADE_EARLY,   alpha=0.6, zorder=0)
ax3a.axvspan(2018.7, 2023.3, color=SHADE_RECOVER, alpha=0.6, zorder=0)

for code, color in zip(TOHOKU_CODES,
                        [COLOR_IWATE, COLOR_MIYAGI, COLOR_FUKUSHIMA]):
    df_pref = df_b[df_b['地域コード'] == code].sort_values('年度')
    ax3a.plot(df_pref['年度'], df_pref['一般病院数'],
              color=color, linewidth=2.5, marker='o', markersize=5,
              label=TOHOKU_NAMES[code], zorder=3)

ax3a.set_xlabel('年度', fontsize=11)
ax3a.set_ylabel('一般病院数（施設）', fontsize=11)
ax3a.set_title('東北3県の一般病院数', fontsize=11, fontweight='bold')
ax3a.set_xticks(years)
ax3a.legend(fontsize=10)
ax3a.grid(True, alpha=0.3, axis='y')

# --- 右パネル: 2012年基準のインデックス（東北 vs 全国） ---
ax3b.axvspan(2011.7, 2014.3, color=SHADE_EARLY,   alpha=0.6, zorder=0)
ax3b.axvspan(2018.7, 2023.3, color=SHADE_RECOVER, alpha=0.6, zorder=0)
ax3b.axhline(100, color='black', linewidth=1.0, linestyle='--', alpha=0.5)

# 東北3県の合計をインデックス化
tohoku_hosp_sum = df_tohoku.groupby('年度')['一般病院数'].sum()
nation_hosp_sum = df_b.groupby('年度')['一般病院数'].sum()
other_hosp_sum  = df_other.groupby('年度')['一般病院数'].sum()

base_yr = 2012
t_idx = tohoku_hosp_sum / tohoku_hosp_sum[base_yr] * 100
n_idx = nation_hosp_sum / nation_hosp_sum[base_yr] * 100
o_idx = other_hosp_sum  / other_hosp_sum[base_yr]  * 100

ax3b.plot(t_idx.index, t_idx.values, color='#C62828', linewidth=2.5,
          marker='o', markersize=5, label='東北3県（合計）', zorder=3)
ax3b.plot(n_idx.index, n_idx.values, color=COLOR_NATION, linewidth=2.0,
          linestyle='--', marker='s', markersize=4,
          label='全国（47都道府県合計）', zorder=2)
ax3b.plot(o_idx.index, o_idx.values, color=COLOR_OTHER, linewidth=1.5,
          linestyle=':', marker='^', markersize=4,
          label='東北以外（44都道府県合計）', zorder=2)

ax3b.set_xlabel('年度', fontsize=11)
ax3b.set_ylabel('病院数インデックス（2012年=100）', fontsize=11)
ax3b.set_title('病院数インデックス（2012年基準）', fontsize=11, fontweight='bold')
ax3b.set_xticks(years)
ax3b.legend(fontsize=9)
ax3b.grid(True, alpha=0.3, axis='y')

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

# ────────────────────────────────────────────────────────────────
# 図4: 転出率 vs 保健医療費 散布図（東北3県強調）
# ────────────────────────────────────────────────────────────────
# 全都道府県・全年度のデータを使用（2012〜2023）
fig4, (ax4a, ax4b) = plt.subplots(1, 2, figsize=(14, 6))
fig4.suptitle('転出率 vs 保健医療費：東北3県 vs その他\n'
              '（SSDSE-B 全47都道府県, 2012〜2023年度）',
              fontsize=13, fontweight='bold')

# 転出率（%）= 転出者数 / 総人口 × 100
df_b['転出率'] = df_b['転出者数（日本人移動者）'] / df_b['総人口'] * 100

# 左パネル: 早期復興期（2012-2014）
df_early = df_b[df_b['年度'].isin(early_yrs)].dropna(
    subset=['転出率', '保健医療費（二人以上の世帯）'])
df_early_other   = df_early[~df_early['東北フラグ']]
df_early_tohoku  = df_early[df_early['東北フラグ']]

ax4a.scatter(df_early_other['転出率'], df_early_other['保健医療費（二人以上の世帯）'],
             color=COLOR_OTHER, s=25, alpha=0.4, label='その他44都道府県', zorder=2)

# 東北3県を個別プロット（強調）
for code, color in zip(TOHOKU_CODES,
                        [COLOR_IWATE, COLOR_MIYAGI, COLOR_FUKUSHIMA]):
    df_pref = df_early[df_early['地域コード'] == code]
    ax4a.scatter(df_pref['転出率'], df_pref['保健医療費（二人以上の世帯）'],
                 color=color, s=120, alpha=0.9, zorder=5,
                 label=TOHOKU_NAMES[code], edgecolors='white', linewidth=0.5,
                 marker='D')
    # ラベル（都道府県名を点の右側に）
    for _, row in df_pref.iterrows():
        ax4a.annotate(f"{row['都道府県']}\n({int(row['年度'])})",
                      xy=(row['転出率'], row['保健医療費（二人以上の世帯）']),
                      xytext=(5, 0), textcoords='offset points',
                      fontsize=7, color=color, alpha=0.85)

ax4a.set_xlabel('転出率（%）', fontsize=11)
ax4a.set_ylabel('保健医療費（円 / 月 / 世帯）', fontsize=11)
ax4a.set_title('早期復興期（2012〜2014年度）', fontsize=11, fontweight='bold')
ax4a.legend(fontsize=9, loc='upper right')
ax4a.grid(True, alpha=0.3)
ax4a.yaxis.set_major_formatter(plt.FuncFormatter(lambda x, _: f'{x:,.0f}'))

# 右パネル: 回復期（2019-2023）
df_recov = df_b[df_b['年度'].isin(recovery_yrs)].dropna(
    subset=['転出率', '保健医療費（二人以上の世帯）'])
df_recov_other  = df_recov[~df_recov['東北フラグ']]
df_recov_tohoku = df_recov[df_recov['東北フラグ']]

ax4b.scatter(df_recov_other['転出率'], df_recov_other['保健医療費（二人以上の世帯）'],
             color=COLOR_OTHER, s=25, alpha=0.4, label='その他44都道府県', zorder=2)

for code, color in zip(TOHOKU_CODES,
                        [COLOR_IWATE, COLOR_MIYAGI, COLOR_FUKUSHIMA]):
    df_pref = df_recov[df_recov['地域コード'] == code]
    ax4b.scatter(df_pref['転出率'], df_pref['保健医療費（二人以上の世帯）'],
                 color=color, s=120, alpha=0.9, zorder=5,
                 label=TOHOKU_NAMES[code], edgecolors='white', linewidth=0.5,
                 marker='D')
    for _, row in df_pref.iterrows():
        ax4b.annotate(f"{row['都道府県']}\n({int(row['年度'])})",
                      xy=(row['転出率'], row['保健医療費（二人以上の世帯）']),
                      xytext=(5, 0), textcoords='offset points',
                      fontsize=7, color=color, alpha=0.85)

ax4b.set_xlabel('転出率（%）', fontsize=11)
ax4b.set_ylabel('保健医療費（円 / 月 / 世帯）', fontsize=11)
ax4b.set_title('回復期（2019〜2023年度）', fontsize=11, fontweight='bold')
ax4b.legend(fontsize=9, loc='upper right')
ax4b.grid(True, alpha=0.3)
ax4b.yaxis.set_major_formatter(plt.FuncFormatter(lambda x, _: f'{x:,.0f}'))

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

# ================================================================
# ■ 数値サマリ出力
# ================================================================
print()
print("=" * 60)
print("■ 期間別サマリ統計")
print("=" * 60)
print()
print("  【早期復興期 (2012-2014) vs 回復期 (2019-2023)】")
print("  保健医療費（東北3県平均, 円）:")
early_val   = df_b[df_b['年度'].isin(early_yrs) & df_b['東北フラグ']]['保健医療費（二人以上の世帯）'].mean()
recover_val = df_b[df_b['年度'].isin(recovery_yrs) & df_b['東北フラグ']]['保健医療費（二人以上の世帯）'].mean()
print(f"    早期復興期: {early_val:,.0f}円")
print(f"    回復期    : {recover_val:,.0f}円")
print(f"    変化率    : {(recover_val-early_val)/early_val*100:+.1f}%")
print()

print("  転入超過率（東北3県平均, 人/千人）:")
for pref in ['岩手県', '宮城県', '福島県']:
    s = net_rate[pref].sort_index()
    e_val = s[s.index.isin(early_yrs)].mean()
    r_val = s[s.index.isin(recovery_yrs)].mean()
    print(f"    {pref}: 早期 {e_val:+.2f} → 回復 {r_val:+.2f} (人/千人)")
print()

print("  一般病院数（東北3県合計）:")
print(f"    2012年: {tohoku_hosp_sum[2012]:.0f} 施設")
print(f"    2023年: {tohoku_hosp_sum[2023]:.0f} 施設")
print(f"    変化  : {tohoku_hosp_sum[2023]-tohoku_hosp_sum[2012]:+.0f} 施設")
print()

print("全図の生成完了（4枚）")
print("  2022_U5_2_fig1_ts_health.png  : 保健医療費の時系列（東北3県 vs 全国平均）")
print("  2022_U5_2_fig2_population.png : 東北3県の人口変化率（転入超過率）")
print("  2022_U5_2_fig3_hospital.png   : 病院数の変化（東北 vs 全国）")
print("  2022_U5_2_fig4_scatter.png    : 転出率 vs 保健医療費 散布図（東北強調）")
