{
 "cells": [
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "# niq_beer_aids.py\n",
    "\n",
    "NIQ 맥주 스캐너(가정용) 월별 2재화 AIDS — 한치록 완전재현 (국산 vs 수입, 2017~2025)\n",
    " 분류: 브랜드 원산지(국산 대표브랜드 사전, 그 외 수입). 지역브랜드 라이선스생산(버드와이저 등)은 '수입'(원산지), 민감도 별도.\n"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "metadata": {},
   "outputs": [],
   "source": [
    "# -*- coding: utf-8 -*-\n",
    "\"\"\"NIQ 맥주 스캐너(가정용) 월별 2재화 AIDS — 한치록 완전재현 (국산 vs 수입, 2017~2025)\n",
    " 분류: 브랜드 원산지(국산 대표브랜드 사전, 그 외 수입). 지역브랜드 라이선스생산(버드와이저 등)은 '수입'(원산지), 민감도 별도.\n",
    "\"\"\"\n",
    "import sys,io,json,os\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",
    "OUT='C:/Temp/주류세/공개데이터/닐슨'\n",
    "df=pd.read_csv(OUT+'/_malt_raw.csv')\n",
    "df['brand']=df.brand.astype(str).str.upper().str.strip()\n",
    "\n",
    "DOM_EXACT={'HITE','KLOUD','KELLY','MAX','FITZ','HANMAC','JEJU','MALPYO','KOMPYO','KABREW',\n",
    "           'PLATINUM','STOUT','OB LAGER','THE PREMIER OB','DRY FINISH D','GOMPYO'}\n",
    "DOM_PREFIX=('CASS','CAFRI','TERRA','FILITE','FILGOOD','HITE','KLOUD','DRY FINISH','OB ',\n",
    "            'HAND','SEVEN','THE BOOTH','GORILLA','GOLDEN LAGER','QUEX')\n",
    "# 라이선스 국내생산(원산지는 해외) — 민감도용\n",
    "LICENSED={'BUDWEISER','HOEGAARDEN','STELLA ARTOIS'}\n",
    "def origin(b, licensed_as_dom=False):\n",
    "    if licensed_as_dom and b in LICENSED: return '국산'\n",
    "    if b in DOM_EXACT or b.startswith(DOM_PREFIX): return '국산'\n",
    "    return '수입'\n",
    "\n",
    "def build(licensed_as_dom):\n",
    "    d=df.copy(); d['grp']=d.brand.map(lambda b:origin(b,licensed_as_dom))\n",
    "    a=d.groupby(['ym','grp','met']).v.sum().unstack('met').reset_index()\n",
    "    a['sales']=a['value']*1e6; a['liters']=a['volume']*10; a['price']=a.sales/a.liters\n",
    "    w=a.pivot(index='ym',columns='grp',values=['sales','liters','price'])\n",
    "    w.columns=[f'{x}_{y}' for x,y in w.columns]; w=w.reset_index().dropna()\n",
    "    w['X']=w['sales_국산']+w['sales_수입']; w['w_imp']=w['sales_수입']/w.X; w['w_dom']=1-w.w_imp\n",
    "    return w\n",
    "\n",
    "def aids(w,ctrl):\n",
    "    d=w.copy()\n",
    "    d['lnP']=d.w_imp*np.log(d['price_수입'])+d.w_dom*np.log(d['price_국산'])\n",
    "    d['ln_XP']=np.log(d.X)-d.lnP; d['ln_rel']=np.log(d['price_수입']/d['price_국산'])\n",
    "    d['month']=d.ym%100; d['t']=np.arange(len(d)); d['covid']=(d.ym//100).isin([2020,2021]).astype(int)\n",
    "    m=smf.ols('w_imp ~ ln_rel + ln_XP'+ctrl,data=d).fit(cov_type='HAC',cov_kwds={'maxlags':6})\n",
    "    g=m.params['ln_rel']; b=m.params['ln_XP']; wi=d.w_imp.mean(); wd=d.w_dom.mean()\n",
    "    return dict(gamma=round(g,3),tg=round(m.tvalues['ln_rel'],2),beta=round(b,3),tb=round(m.tvalues['ln_XP'],2),\n",
    "      e_imp=round(-1+(g-b*wi)/wi,2), e_dom=round(-1+(g+b*wd)/wd,2),\n",
    "      cross_imp_on_dom=round((-g+b*wi)/wd,2), cross_dom_on_imp=round((-g-b*wd)/wi,2),\n",
    "      eta_imp=round(1+b/wi,2), eta_dom=round(1-b/wd,2), wi=round(wi,3), n=int(m.nobs))\n",
    "\n",
    "w=build(False); w.to_csv(OUT+'/beer_niq_dom_imp_monthly.csv',index=False,encoding='utf-8-sig')\n",
    "print('월별관측',len(w),int(w.ym.min()),'~',int(w.ym.max()))\n",
    "print('수입 지출몫 w_imp: %.3f(2017초)→%.3f(2025말), 평균 %.3f'%(w.w_imp.iloc[0],w.w_imp.iloc[-1],w.w_imp.mean()))\n",
    "# 연도별 수입몫\n",
    "w['yr']=w.ym//100\n",
    "print('연도별 수입 지출몫:')\n",
    "print('  '+', '.join('%d:%.1f%%'%(y,g.w_imp.mean()*100) for y,g in w.groupby('yr')))\n",
    "print('가격 원/L: 국산 %.0f, 수입 %.0f'%(w['price_국산'].mean(),w['price_수입'].mean()))\n",
    "\n",
    "res={}\n",
    "for lab,ctrl in [('계절통제',' + C(month)'),('계절+추세+코로나',' + C(month)+t+covid')]:\n",
    "    r=aids(w,ctrl); res['main_'+lab]=r\n",
    "    print(f'\\n===== AIDS(원산지분류) [{lab}] n={r[\"n\"]} =====')\n",
    "    print(f'  γ={r[\"gamma\"]}(t={r[\"tg\"]}) β={r[\"beta\"]}(t={r[\"tb\"]})')\n",
    "    print(f'  자체가격탄력성: 수입 {r[\"e_imp\"]:+} | 국산 {r[\"e_dom\"]:+}')\n",
    "    print(f'  교차: 국산가↑→수입 {r[\"cross_imp_on_dom\"]:+} · 수입가↑→국산 {r[\"cross_dom_on_imp\"]:+}')\n",
    "    print(f'  지출탄력성: 수입 {r[\"eta_imp\"]:+} | 국산 {r[\"eta_dom\"]:+} (수입몫 {r[\"wi\"]})')\n",
    "# 민감도: 라이선스 국내생산을 국산으로\n",
    "r2=aids(build(True),' + C(month)+t+covid'); res['sens_licensed_as_dom']=r2\n",
    "print(f'\\n[민감도: 버드와이저·호가든·스텔라를 국산 처리] 수입 ε={r2[\"e_imp\"]:+}, 국산 ε={r2[\"e_dom\"]:+}, 수입몫 {r2[\"wi\"]}')\n",
    "json.dump(res,open(OUT+'/beer_niq_aids.json','w',encoding='utf-8'),ensure_ascii=False,indent=2)\n",
    "print('\\n[대조] 원논문 수입프리미엄 -4.8~-6.0/국산코어 -1.8~-1.9 · 국세접합 수입 -3.6/국산 -1.1')\n",
    "print('저장: beer_niq_dom_imp_monthly.csv, beer_niq_aids.json')\n"
   ]
  }
 ],
 "metadata": {
  "kernelspec": {
   "display_name": "Python 3",
   "language": "python",
   "name": "python3"
  },
  "language_info": {
   "name": "python",
   "version": "3.12"
  }
 },
 "nbformat": 4,
 "nbformat_minor": 5
}