{
 "cells": [
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "# han_aids_3good.py\n",
    "\n",
    "3재화 LA-AIDS — 소주·국산맥주·수입맥주 (종가세기 2006~2019, 국세 물량·과세표준)\n",
    " 동차성 부과(소주=numeraire), Marshallian 자체/교차/지출 탄력성. 소주 수입분은 무시(연 수십L).\n",
    " 주의: n=14 연간·집계 → 정밀도 한계. 제품·용기·월별·기온통제 완전판은 스캐너 필요.\n"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "metadata": {},
   "outputs": [],
   "source": [
    "# -*- coding: utf-8 -*-\n",
    "\"\"\"3재화 LA-AIDS — 소주·국산맥주·수입맥주 (종가세기 2006~2019, 국세 물량·과세표준)\n",
    " 동차성 부과(소주=numeraire), Marshallian 자체/교차/지출 탄력성. 소주 수입분은 무시(연 수십L).\n",
    " 주의: n=14 연간·집계 → 정밀도 한계. 제품·용기·월별·기온통제 완전판은 스캐너 필요.\n",
    "\"\"\"\n",
    "import sys,io,json; 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",
    "g=pd.read_csv(B+'/국세청_국세통계/주세신고_주종별_제조수입_2006_2025.csv')\n",
    "g['값']=pd.to_numeric(g['값'].astype(str).str.replace(',',''),errors='coerce')\n",
    "def P(주종,지표): return g[(g.주종==주종)&(g.지표==지표)].pivot_table(index='연도',columns='구분',values='값')\n",
    "vB,xB=P('맥주','출고량'),P('맥주','과세표준_종가세')\n",
    "vS,xS=P('희석식소주','출고량'),P('희석식소주','과세표준_종가세')\n",
    "d=pd.DataFrame(index=vB.index)\n",
    "d['q_impb']=vB['수입분']; d['q_domb']=vB['합계']-vB['수입분']; d['q_soju']=vS['합계']\n",
    "d['x_impb']=xB['수입분']; d['x_domb']=xB['합계']-xB['수입분']; d['x_soju']=xS['합계']\n",
    "d=d.dropna(); d=d[(d.index>=2006)&(d.index<=2019)]\n",
    "for k in ['soju','domb','impb']:\n",
    "    d['p_'+k]=d['x_'+k]/d['q_'+k]\n",
    "d['X']=d.x_soju+d.x_domb+d.x_impb\n",
    "for k in ['soju','domb','impb']: d['w_'+k]=d['x_'+k]/d.X\n",
    "d['lnP']=sum(d['w_'+k]*np.log(d['p_'+k]) for k in ['soju','domb','impb'])\n",
    "d['ln_XP']=np.log(d.X)-d.lnP\n",
    "d['r_domb']=np.log(d.p_domb/d.p_soju); d['r_impb']=np.log(d.p_impb/d.p_soju)\n",
    "print('===== 지출몫 2006~2019 (소주/국산맥주/수입맥주) =====')\n",
    "for yr in [d.index.min(), d.index.max()]:\n",
    "    r=d.loc[yr]; print(f'  {yr}: 소주 {r.w_soju:.3f} · 국산맥주 {r.w_domb:.3f} · 수입맥주 {r.w_impb:.3f}')\n",
    "print(f'  평균: 소주 {d.w_soju.mean():.3f} · 국산맥주 {d.w_domb.mean():.3f} · 수입맥주 {d.w_impb.mean():.3f}')\n",
    "\n",
    "goods=['soju','domb','impb']; names={'soju':'소주','domb':'국산맥주','impb':'수입맥주'}\n",
    "G={}; Bc={}\n",
    "for i in goods:\n",
    "    m=smf.ols(f'w_{i} ~ r_domb + r_impb + ln_XP', data=d).fit()\n",
    "    g_domb=m.params['r_domb']; g_impb=m.params['r_impb']; g_soju=-(g_domb+g_impb)\n",
    "    G[i]={'soju':g_soju,'domb':g_domb,'impb':g_impb}; Bc[i]=m.params['ln_XP']\n",
    "wbar={k:d['w_'+k].mean() for k in goods}\n",
    "def elas(i,j): return (-1.0 if i==j else 0.0)+(G[i][j]-Bc[i]*wbar[j])/wbar[i]\n",
    "print('\\n===== Marshallian 가격탄력성 행렬 (행=수요, 열=가격) =====')\n",
    "hdr='수요\\\\가격     '+''.join(f'{names[j]:>10}' for j in goods)\n",
    "print(hdr)\n",
    "for i in goods:\n",
    "    row=f'{names[i]:<10}'+''.join(f'{elas(i,j):>10.2f}' for j in goods)\n",
    "    print(row)\n",
    "print('\\n===== 자체가격·지출 탄력성 요약 =====')\n",
    "res={}\n",
    "for i in goods:\n",
    "    own=elas(i,i); eta=1+Bc[i]/wbar[i]\n",
    "    res[names[i]]=dict(own=round(own,2),expenditure=round(eta,2))\n",
    "    print(f'  {names[i]}: 자체가격 {own:+.2f} · 지출 {eta:+.2f}')\n",
    "print('\\n[원논문 대조] 수입프리미엄 -4.8~-6.0 / 국산코어 -1.8~-1.9 / (소주는 원논문 대상 아님)')\n",
    "print('[선행 소주탄력성 문헌범위] 대략 -0.3~-0.9 (증류주)')\n",
    "json.dump({'own_expend':res,'elast_matrix':{names[i]:{names[j]:round(elas(i,j),3) for j in goods} for i in goods},\n",
    "           'wbar':{names[k]:round(wbar[k],3) for k in goods},'n':len(d)},\n",
    "          open(B+'/문헌/han2018_aids_3good.json','w',encoding='utf-8'),ensure_ascii=False,indent=2)\n",
    "print('\\n저장: 문헌/han2018_aids_3good.json')\n"
   ]
  }
 ],
 "metadata": {
  "kernelspec": {
   "display_name": "Python 3",
   "language": "python",
   "name": "python3"
  },
  "language_info": {
   "name": "python",
   "version": "3.12"
  }
 },
 "nbformat": 4,
 "nbformat_minor": 5
}