# -*- coding: utf-8 -*-
r"""브리프 05 — 「우리 동네 물가」를 확인할 수 있는 경기도민은 절반뿐이다 (2006~2025)

    py prep.py            (run.py 가 analysis/ 를 cwd로 잡고 실행한다)

무엇을 보는가
  소비자물가는 **조사 도시**에서만 따로 집계된다. 경기 31개 시군 중 9곳뿐이다.
  나머지 22곳 사람은 「경기도 평균」이나 「전국」으로만 자기 동네 물가를 짐작한다.
  그러면 조사되는 곳은 실제로 다른가? — 안산 20년치로 확인한다.

쓰는 표
  DT_1YL20581  소비자물가 등락률(시도/시)          2000~2025 · 지역prefix 31
  DT_1B04005N  행정구역별/5세별 주민등록인구        2011~2025 · 지역prefix **41**

★ 두 표의 **지역 코드 체계가 다르다** (31 vs 41). 코드로 결합하지 않는다 —
  이 파일은 두 표를 각각 라벨로 뽑아 **이름으로만** 맞춘다. (ds_wiki L008)

★ 밟은 함정 (전부 실제로 밟았다 · 2026-08-06)
  ① 조사 도시가 시점마다 다르다 — 안산 2006~ · 용인 2016~ · 화성 2021~.
     11곳을 한 번에 넣으면 구간이 2021~2025 다섯 시점으로 줄어든다.
     → 여기서는 **안산·경기도·전국 세 곳만** 쓴다(2006~2025 균형패널).
  ② 인구 표에 **여주군**(2013 폐지) 코드가 남아 있다. 빼지 않으면 32개가 되어 가드가 멈춘다.
  ③ 물가 값은 **등락률(%)** 이다. 연도끼리 더하지 않는다 — 누적은 복리로 곱한다.
"""
import csv, math, statistics, sys
from pathlib import Path

sys.path.insert(0, str(Path(__file__).resolve().parents[2]))
import kosis

import matplotlib
matplotlib.use("Agg")
import matplotlib.pyplot as plt
# ⛔ 그림 저장은 정본(`chartkit.save`)을 지난다 〔2026-09-21〕 — 그래야
#   ⑴ 폰용 그림이 같이 나가고(`analysis/폰/`) ⑵ 「폰에서 읽히나」 관문이 돈다.
#   `plt.savefig` 를 직접 부르면 그 둘이 통째로 꺼진다.
import chartkit as ck

try:
    sys.stdout.reconfigure(encoding="utf-8")
except Exception:
    pass

plt.rcParams["font.family"] = ["Malgun Gothic", "sans-serif"]
plt.rcParams["axes.unicode_minus"] = False

CPI, POP = "DT_1YL20581", "DT_1B04005N"
ORG = "101"
Y0, Y1 = "2006", "2025"                 # 안산이 조사에 들어온 해부터
조사도시 = ["수원시", "성남시", "의정부시", "안양시", "부천시", "안산시", "고양시", "용인시", "화성시"]
조사시작 = {"안산시": "2006", "용인시": "2016", "화성시": "2021"}   # 나머지는 2000~

C_ON, C_OFF, C_HL = "#c8482a", "#c9d1d9", "#2f6fb5"

# ── ① 물가: 전국·경기도·안산 20년 ────────────────────────────────────
rec = kosis.fetch_rows(ORG, CPI, (Y0, Y1), sel={"SGG": ["전국", "경기도", "안산시"]},
                       prefix={"SGG": "31"}, itm="T10")
cpi = {}
for r in rec:
    cpi.setdefault(r["SGG"], {})[r["연도"]] = r["값"]
yrs = sorted(cpi["전국"])
kr, gg, an = cpi["전국"], cpi["경기도"], cpi["안산시"]
print(f"[대장] 물가 원문위치 → {kosis.cite(ORG, CPI, 'SGG', ['안산시'], '31')}")

cum = lambda v: (math.prod(1 + v[y] / 100 for y in yrs) - 1) * 100
누적 = {"전국": cum(kr), "경기도": cum(gg), "안산시": cum(an)}
높은해 = sum(1 for y in yrs if an[y] > kr[y])
같은해 = sum(1 for y in yrs if an[y] == kr[y])
낮은해 = sum(1 for y in yrs if an[y] < kr[y])

# ── ② 인구: 경기 31개 시군 (여주군 제외) ──────────────────────────────
m = kosis.meta(ORG, POP)["A"]
시군 = [n for c, n in m.items()
       if c.startswith("41") and len(c) == 5 and (n.endswith("시") or n.endswith("군"))
       and n != "여주군"]                                   # ★ 2013 폐지 — 함정 ②
prec = kosis.fetch_rows(ORG, POP, "2025", sel={"A": 시군, "B": ["계"]},
                        prefix={"A": "41"}, itm="T2")
pop = {r["A"]: r["값"] for r in prec}
print(f"[대장] 인구 원문위치 → {kosis.cite(ORG, POP, 'A', ['안산시'], '41')}")

총인구 = sum(pop.values())
조사인구 = sum(v for k, v in pop.items() if k in 조사도시)
미조사 = sorted(((k, v) for k, v in pop.items() if k not in 조사도시), key=lambda x: -x[1])

# ── raw.csv ─────────────────────────────────────────────────────────
rows = []
for y in yrs:
    rows.append({"구분": "물가", "연도": y, "지역": "전국", "값": kr[y]})
    rows.append({"구분": "물가", "연도": y, "지역": "경기도", "값": gg[y]})
    rows.append({"구분": "물가", "연도": y, "지역": "안산시", "값": an[y]})
for nm, v in sorted(pop.items(), key=lambda x: -x[1]):
    rows.append({"구분": "인구2025", "연도": "2025", "지역": nm, "값": v,
                 "물가조사": 1 if nm in 조사도시 else 0,
                 "조사시작": 조사시작.get(nm, "2000" if nm in 조사도시 else "")})
with open("raw.csv", "w", encoding="utf-8-sig", newline="") as f:
    w = csv.DictWriter(f, fieldnames=["구분", "연도", "지역", "값", "물가조사", "조사시작"])
    w.writeheader()
    w.writerows(rows)

# ── 차트 (웹) ── 누가 자기 동네 물가 통계를 갖고 있나
order = sorted(pop.items(), key=lambda x: x[1])
fig, ax = plt.subplots(figsize=(7.6, 9.0))
ys = range(len(order))
cols = [C_ON if nm in 조사도시 else C_OFF for nm, _ in order]
ax.barh(list(ys), [v / 10000 for _, v in order], color=cols, height=.72)
ax.set_yticks(list(ys))
ax.set_yticklabels([nm for nm, _ in order], fontsize=10.5)
for i, (nm, v) in enumerate(order):
    if nm in 조사도시:
        tag = f"  조사 {조사시작.get(nm,'2000')}~"
        ax.text(v / 10000 + 1.2, i, tag, va="center", fontsize=9, color=C_ON, fontweight="bold")
ax.set_xlabel("2025년 인구 (만 명)", fontsize=10.5)
ax.set_title(f"경기 31개 시군 중 소비자물가를 따로 조사하는 곳은 {len(조사도시)}곳\n"
             f"나머지 {len(미조사)}곳 {(총인구-조사인구)/10000:,.0f}만 명은 자기 도시 물가 통계가 없다",
             fontsize=12.5, fontweight="bold", loc="left", pad=14)
for s in ("top", "right", "left"):
    ax.spines[s].set_visible(False)
ax.spines["bottom"].set_color("#cfd4de")
ax.grid(axis="x", color="#eef0f4", lw=.8)
ax.set_axisbelow(True)
fig.tight_layout()
ck.save(fig, "chart.png", dpi=130)
plt.close(fig)

# ── 카드용 ── 폰에서 본다. 20년 추이 한 장.
fig, ax = plt.subplots(figsize=(8.4, 6.0))
xs = [int(y) for y in yrs]
ax.plot(xs, [kr[y] for y in yrs], color="#8b95a1", lw=2.4, label="전국", zorder=2)
ax.plot(xs, [an[y] for y in yrs], color=C_ON, lw=3.0, label="안산", zorder=3)
ax.fill_between(xs, [kr[y] for y in yrs], [an[y] for y in yrs],
                color=C_ON, alpha=.14, zorder=1)
ax.set_title(f"조사되는 도시는 실제로 달랐나 — 안산 vs 전국\n"
             f"20년 누적 안산 {누적['안산시']:.1f}% · 전국 {누적['전국']:.1f}%",
             fontsize=14, fontweight="bold", loc="left", pad=12)
ax.set_ylabel("소비자물가 등락률 (%)", fontsize=11)
ax.legend(fontsize=11, frameon=False, loc="upper right")
ax.grid(axis="y", color="#eef0f4", lw=.9)
ax.set_axisbelow(True)
for s in ("top", "right", "left"):
    ax.spines[s].set_visible(False)
ax.spines["bottom"].set_color("#cfd4de")
fig.tight_layout()
fig.savefig("chart_card.png", dpi=130)
plt.close(fig)

print(f"[저장] raw.csv {len(rows)}행 · chart.png · chart_card.png")

# ── 대장에 옮길 값 ───────────────────────────────────────────────────
print("\n[대장] 수치대장.csv 에 옮길 값 ─────────────────")
print(f"  경기시군수              {len(시군)}")
print(f"  물가조사도시수           {len(조사도시)}")
print(f"  물가미조사시군수          {len(미조사)}")
print(f"  경기시군인구합           {총인구:,}")
print(f"  물가조사도시인구          {조사인구:,}")
print(f"  물가미조사인구           {총인구-조사인구:,}")
print(f"  물가미조사인구비율        {100*(총인구-조사인구)/총인구:.1f} %")
for nm, v in 미조사[:4]:
    print(f"  미조사인구_{nm:<8} {v:,}")
print(f"  화성시인구              {pop['화성시']:,}   (조사 시작 2021)")
print(f"  안산누적물가상승          {누적['안산시']:.1f} %  (2006~2025 복리)")
print(f"  전국누적물가상승          {누적['전국']:.1f} %")
print(f"  경기누적물가상승          {누적['경기도']:.1f} %")
print(f"  안산전국누적차            {누적['안산시']-누적['전국']:.1f} %p")
print(f"  안산평균등락률           {statistics.mean(an.values()):.2f} %")
print(f"  전국평균등락률           {statistics.mean(kr.values()):.2f} %")
print(f"  안산전국상회연수          {높은해}  (같음 {같은해} · 하회 {낮은해})")
print(f"  관측연수               {len(yrs)}")
