{
 "cells": [
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "# niq_brand_elast.py\n",
    "\n",
    "NIQ 맥주 브랜드단위 자체가격탄력성 — 수입프리미엄 정밀재현 (MALT 104개월, 가정용)\n",
    " 논문의 큰 수입 탄력성(−4.8~−6.0)은 '좁은 재화정의(브랜드)'에서 발생(브랜드 전환).\n",
    " ln(Q_brand) ~ ln(P_brand) + ln(P_국산코어) + ln(P_타수입) + 계절 + 추세 + 코로나\n"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "metadata": {},
   "outputs": [],
   "source": [
    "# -*- coding: utf-8 -*-\n",
    "\"\"\"NIQ 맥주 브랜드단위 자체가격탄력성 — 수입프리미엄 정밀재현 (MALT 104개월, 가정용)\n",
    " 논문의 큰 수입 탄력성(−4.8~−6.0)은 '좁은 재화정의(브랜드)'에서 발생(브랜드 전환).\n",
    " ln(Q_brand) ~ ln(P_brand) + ln(P_국산코어) + ln(P_타수입) + 계절 + 추세 + 코로나\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",
    "OUT='C:/Temp/주류세/공개데이터/닐슨'\n",
    "df=pd.read_csv(OUT+'/_malt_raw.csv'); df['brand']=df.brand.astype(str).str.upper().str.strip()\n",
    "DOM_EXACT={'HITE','KLOUD','KELLY','MAX','FITZ','HANMAC','JEJU','MALPYO','KOMPYO','KABREW','PLATINUM','STOUT','OB LAGER','THE PREMIER OB','DRY FINISH D','GOMPYO'}\n",
    "DOM_PREFIX=('CASS','CAFRI','TERRA','FILITE','FILGOOD','HITE','KLOUD','DRY FINISH','OB ','HAND','SEVEN','THE BOOTH','GORILLA','GOLDEN LAGER','QUEX')\n",
    "df['dom']=df.brand.map(lambda b: b in DOM_EXACT or b.startswith(DOM_PREFIX))\n",
    "# 브랜드×월 value/volume\n",
    "bv=df.pivot_table(index=['brand','ym'],columns='met',values='v',aggfunc='sum').reset_index()\n",
    "bv['price']=bv['value']*1e6/(bv['volume']*10); bv['liters']=bv['volume']*10\n",
    "# 국산코어 가격지수 & 수입 가격지수(월별)\n",
    "agg=df.groupby(['ym','dom','met']).v.sum().unstack('met').reset_index()\n",
    "agg['price']=agg['value']*1e6/(agg['volume']*10)\n",
    "pdom=agg[agg.dom].set_index('ym')['price']; pimp=agg[~agg.dom].set_index('ym')['price']\n",
    "# 대상: 상위 수입 브랜드\n",
    "IMP_BRANDS=['HEINEKEN','ASAHI','TSINGTAO','BUDWEISER','HOEGAARDEN','KRONENBOURG 1664','STELLA ARTOIS','GUINNESS','KIRIN','SAPPORO']\n",
    "rows=[]\n",
    "for b in IMP_BRANDS:\n",
    "    s=bv[bv.brand==b].copy()\n",
    "    if len(s)<40: continue\n",
    "    s['ln_q']=np.log(s.liters); s['ln_p']=np.log(s.price)\n",
    "    s['ln_pdom']=np.log(s.ym.map(pdom)); s['ln_pimp']=np.log(s.ym.map(pimp))\n",
    "    s['month']=s.ym%100; s['t']=(s.ym//100-2017)*12+s.ym%100; s['covid']=(s.ym//100).isin([2020,2021]).astype(int)\n",
    "    try:\n",
    "        m=smf.ols('ln_q ~ ln_p + ln_pdom + C(month) + t + covid',data=s).fit(cov_type='HAC',cov_kwds={'maxlags':6})\n",
    "        rows.append((b,len(s),m.params['ln_p'],m.tvalues['ln_p'],m.params.get('ln_pdom',np.nan)))\n",
    "    except Exception as e: print(b,'ERR',e)\n",
    "R=pd.DataFrame(rows,columns=['brand','n','own_elast','t','cross_dom'])\n",
    "print('===== 수입 브랜드단위 자체가격탄력성 (MALT 월별) =====')\n",
    "print(R.round(2).to_string(index=False))\n",
    "print('\\n  평균 수입브랜드 자체탄력성: %.2f (유의 brand 중앙값 %.2f)'%(R.own_elast.mean(),R[R.t<-1.5].own_elast.median()))\n",
    "# 비교: 국산 대형 브랜드\n",
    "for b in ['CASS FRESH','TERRA','HITE','KLOUD']:\n",
    "    s=bv[bv.brand==b].copy()\n",
    "    if len(s)<40: continue\n",
    "    s['ln_q']=np.log(s.liters); s['ln_p']=np.log(s.price); s['ln_pimp']=np.log(s.ym.map(pimp))\n",
    "    s['month']=s.ym%100; s['t']=(s.ym//100-2017)*12+s.ym%100; s['covid']=(s.ym//100).isin([2020,2021]).astype(int)\n",
    "    m=smf.ols('ln_q ~ ln_p + ln_pimp + C(month) + t + covid',data=s).fit(cov_type='HAC',cov_kwds={'maxlags':6})\n",
    "    print('  [국산] %-12s 자체탄력성 %+.2f (t=%.2f, n=%d)'%(b,m.params['ln_p'],m.tvalues['ln_p'],len(s)))\n",
    "R.round(3).to_csv(OUT+'/beer_niq_brand_elast.csv',index=False,encoding='utf-8-sig')\n",
    "json.dump({'import_brand_own_elast_mean':round(float(R.own_elast.mean()),2),\n",
    "           'import_brands':{r.brand:round(r.own_elast,2) for r in R.itertuples()}},\n",
    "          open(OUT+'/beer_niq_brand_elast.json','w',encoding='utf-8'),ensure_ascii=False,indent=2)\n",
    "print('\\n[원논문] 수입프리미엄 -4.8~-6.0 (브랜드/세그먼트 단위) · 저장: beer_niq_brand_elast.*')\n"
   ]
  }
 ],
 "metadata": {
  "kernelspec": {
   "display_name": "Python 3",
   "language": "python",
   "name": "python3"
  },
  "language_info": {
   "name": "python",
   "version": "3.12"
  }
 },
 "nbformat": 4,
 "nbformat_minor": 5
}