{
 "cells": [
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "# aggregate_passthrough.py\n",
    "\n",
    "전체/주종 수준 전가 — (A) 국세 세후 출고가 복원  (B) PPI(세전=원가)→CPI(소비자가) 전이\n",
    " 요지: PPI는 세전(원가·생산자가) → '원가 proxy'. 출고가(세후)=과표+세금. 소비자가=CPI.\n",
    " 전가사슬: 원가(PPI) → 출고가(국세 세후) → 소비자가(CPI)\n"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "metadata": {},
   "outputs": [],
   "source": [
    "# -*- coding: utf-8 -*-\n",
    "\"\"\"전체/주종 수준 전가 — (A) 국세 세후 출고가 복원  (B) PPI(세전=원가)→CPI(소비자가) 전이\n",
    " 요지: PPI는 세전(원가·생산자가) → '원가 proxy'. 출고가(세후)=과표+세금. 소비자가=CPI.\n",
    " 전가사슬: 원가(PPI) → 출고가(국세 세후) → 소비자가(CPI)\n",
    "\"\"\"\n",
    "import sys,io,json\n",
    "sys.stdout=io.TextIOWrapper(sys.stdout.buffer,encoding='utf-8')\n",
    "import numpy as np, pandas as pd, statsmodels.formula.api as smf\n",
    "B='C:/Temp/주류세/공개데이터'\n",
    "def num(s): return pd.to_numeric(pd.Series(s).astype(str).str.replace(',',''),errors='coerce')\n",
    "\n",
    "# ---------- (A) 국세 세후 출고가 복원 (주종별, 연간, 종가세 구간) ----------\n",
    "print('===== (A) 국세청 기반 세후 출고가 복원 (원/L) =====')\n",
    "print('  세후출고가 = (과세표준 + 주세 + 교육세0.3×주세 + 부가세0.1×(과표+주세+교육세)) / 출고량')\n",
    "g=pd.read_csv(B+'/국세청_국세통계/주세신고_주종별_제조수입_2006_2025.csv'); g['값']=num(g['값'])\n",
    "for 주종 in ['희석식소주','맥주']:\n",
    "    s=g[(g.주종==주종)&(g.구분=='합계')].pivot_table(index='연도',columns='지표',values='값')\n",
    "    s=s.rename(columns={'과세표준_종가세':'과표','납부할세액':'주세','출고량':'Q'})\n",
    "    s=s.dropna(subset=['과표','주세','Q'])\n",
    "    s=s[s.과표>0]\n",
    "    s['교육세']=0.3*s.주세; s['부가세']=0.1*(s.과표+s.주세+s.교육세)\n",
    "    s['출고가_세후_백만원']=s.과표+s.주세+s.교육세+s.부가세\n",
    "    # 과표·세액 단위=백만원, 출고량=㎘ → 원/L = 백만원*1e6 / (㎘*1000)\n",
    "    s['출고가_세후_원L']=s['출고가_세후_백만원']*1e6/(s.Q*1000)\n",
    "    s['세전출고가_원L']=s.과표*1e6/(s.Q*1000)\n",
    "    s['세금비중']=(s.주세+s.교육세+s.부가세)/s.출고가_세후_백만원\n",
    "    out=s[['세전출고가_원L','출고가_세후_원L','세금비중']].round(1)\n",
    "    print(f'\\n[{주종}] (종가세 구간)'); print(out.to_string())\n",
    "\n",
    "# ---------- (B) PPI(원가)→CPI(소비자가) 전이, 월별 ----------\n",
    "print('\\n\\n===== (B) PPI(세전=원가) → CPI(소비자가) 전이 회귀, 월별 =====')\n",
    "cpi=pd.read_csv(B+'/한국은행_ECOS/CPI_품목별_소주맥주_200601_202512.csv')\n",
    "ppi=pd.read_csv(B+'/한국은행_ECOS/PPI_품목별_소주맥주_200601_202512.csv')\n",
    "imp=pd.read_csv(B+'/한국은행_ECOS/수입물가_맥주_200601_202512.csv')\n",
    "imp=imp.groupby('시점',as_index=False).값.mean().rename(columns={'시점':'ym','값':'impp'})\n",
    "def series(df,item):\n",
    "    d=df[df.품목==item][['시점','값']].groupby('시점',as_index=False).값.mean()\n",
    "    return d.rename(columns={'시점':'ym','값':item})\n",
    "res={}\n",
    "for 주종 in ['소주','맥주']:\n",
    "    c=series(cpi,주종).rename(columns={주종:'cpi'}); p=series(ppi,주종).rename(columns={주종:'ppi'})\n",
    "    m=c.merge(p,on='ym').sort_values('ym')\n",
    "    if 주종=='맥주': m=m.merge(imp,on='ym',how='left')\n",
    "    m['ln_cpi']=np.log(m.cpi); m['ln_ppi']=np.log(m.ppi)\n",
    "    m['d_cpi']=m.ln_cpi.diff(); m['d_ppi']=m.ln_ppi.diff(); m['d_ppi_l1']=m.d_ppi.shift(1)\n",
    "    if 주종=='맥주': m['d_impp']=np.log(m.impp).diff()\n",
    "    m=m.dropna(subset=['d_cpi','d_ppi','d_ppi_l1'])\n",
    "    # 단기 전가(당월) + 누적(당월+1시차)\n",
    "    f='d_cpi ~ d_ppi + d_ppi_l1'+(' + d_impp' if 주종=='맥주' else '')\n",
    "    mm=m.dropna(subset=(['d_impp'] if 주종=='맥주' else []))\n",
    "    r=smf.ols(f,data=mm).fit(cov_type='HAC',cov_kwds={'maxlags':6})\n",
    "    cum=r.params['d_ppi']+r.params['d_ppi_l1']\n",
    "    # 장기(수준 공적분형): ln_cpi ~ ln_ppi\n",
    "    lr=smf.ols('ln_cpi ~ ln_ppi',data=m).fit(cov_type='HAC',cov_kwds={'maxlags':12})\n",
    "    print(f'\\n[{주종}] n={int(r.nobs)}')\n",
    "    print(f'  단기 전가(당월) β={r.params[\"d_ppi\"]:+.2f} (t={r.tvalues[\"d_ppi\"]:.2f})')\n",
    "    print(f'  누적 전가(당월+1개월) = {cum:+.2f}')\n",
    "    print(f'  장기(수준) 탄력 ln_cpi~ln_ppi = {lr.params[\"ln_ppi\"]:+.2f} (t={lr.tvalues[\"ln_ppi\"]:.1f})')\n",
    "    if 주종=='맥주': print(f'  (수입물가 통제계수 {r.params.get(\"d_impp\",float(\"nan\")):+.2f})')\n",
    "    res[주종]=dict(n=int(r.nobs),short=round(float(r.params['d_ppi']),3),cum=round(float(cum),3),long=round(float(lr.params['ln_ppi']),3))\n",
    "json.dump(res,open(B+'/문헌/ppi_cpi_passthrough.json','w',encoding='utf-8'),ensure_ascii=False,indent=2)\n",
    "print('\\n해석: PPI(원가) 상승이 CPI(소비자가)로 전이되는 정도. 1이면 완전전가, <1이면 부분전가/마진흡수.')\n",
    "print('저장: 문헌/ppi_cpi_passthrough.json')\n"
   ]
  }
 ],
 "metadata": {
  "kernelspec": {
   "display_name": "Python 3",
   "language": "python",
   "name": "python3"
  },
  "language_info": {
   "name": "python",
   "version": "3.12"
  }
 },
 "nbformat": 4,
 "nbformat_minor": 5
}