โ ์ฌ์ ํจ๋ ์๋๋ถ์๋ณ ๊ฐ์ ์ฉ ์ฃผ๋ฅ์ง์ถ โ ์ญ์ง์ฑ ํจ๋ยถ
์ฃผ์ธ ์ ์ฑ ์ด ๊ฒฝ์ ยท๋ฏผ์์ ๋ฏธ์น๋ ์ํฅ ์ฐ๊ตฌ ยท ์ฌ์ ํจ๋(NaSTaB) 1~17์ฐจ(2008~2024) ๊ฐ๊ตฌ๋ฐ์ดํฐ
๊ฐ์ ์ฉ ์ฃผ๋ฅ๋น = cd002(๋งฅ์ฃผยท์์ฃผยท์์ฃผ) + cd004(์์ธยท๋ง๊ฑธ๋ฆฌยท์ ํต์ฃผ), ์ํ๊ท ๋ง์.
๊ฐ๊ตฌ ํก๋จ๊ฐ์ค์น h{์ฐจ}cwt ์ ์ฉ. ๊ฒฐ์ธก(-9 ๋ฑ) ์ ์ธ, ๋ฏธ๊ตฌ์
=0.
์์๋ฃ๋ KIPF ์ ์ฒญยท๋ค์ด๋ก๋๋ถ์ด๋ฉฐ ๊ณต๊ฐ ๋์์ด ์๋๋ค. ๋ณธ ๋ ธํธ๋ถ์ ์ฌํ ์ ์ฐจ ๋ฌธ์์ฉ์ด๋ค.
import pandas as pd, numpy as np, csv, os
D=r"D:\Project\2026_2\์ฃผ๋ฅ์ธ\data\nastab"; OUT=r"D:\Project\2026_2\์ฃผ๋ฅ์ธ\data"
MISS={-1,-9,-8,-99,-999,999999}
def wcols(ww):
with open(os.path.join(D,f"NaSTaB{ww}H.csv"),encoding="utf-8-sig") as f: return set(next(csv.reader(f)))
def weighted_decile(vals,wts):
d=pd.DataFrame({"v":pd.to_numeric(vals,errors="coerce"),"w":pd.to_numeric(wts,errors="coerce")},index=vals.index)
d=d[d["v"].notna()&d["w"].notna()&(d["w"]>0)].sort_values("v")
cw=d["w"].cumsum(); frac=(cw-d["w"]*0.5)/d["w"].sum()
d["dec"]=np.clip(np.ceil(frac*10),1,10).astype(int)
return d["dec"].reindex(vals.index)
def wmean(x,w):
m=x.notna()&w.notna()
return np.average(x[m],weights=w[m]) if (m.sum() and w[m].sum()) else np.nan
17๊ฐ ์ฐจ์ ์ํ โ ์๋๋ถ์๋ณ ๋น์ค ์ฐ์ถยถ
rows=[]
for w in range(1,18):
ww=f"{w:02d}"; have=wcols(ww)
inc=f"h{ww}ca004" if f"h{ww}ca004" in have else None
con=f"h{ww}ca002"; cd2=f"h{ww}cd002"; cd4=f"h{ww}cd004"
wt=f"h{ww}cwt" if f"h{ww}cwt" in have else None
use=[c for c in [inc,con,cd2,cd4,wt] if c]
df=pd.read_csv(os.path.join(D,f"NaSTaB{ww}H.csv"),usecols=use,encoding="utf-8-sig")
for c in use: df[c]=pd.to_numeric(df[c],errors="coerce")
if inc: df[inc]=df[inc].where(~df[inc].isin(MISS)).where(df[inc]>0)
df[con]=df[con].where(~df[con].isin(MISS)).where(df[con]>0)
for c in [cd2,cd4]: df[c]=df[c].where(~df[c].isin(MISS))
W=df[wt] if wt else pd.Series(1.0,index=df.index)
alc=df[cd2].fillna(0)+df[cd4].fillna(0)
rec={"wave":w,"survey_year":2007+w,"n":len(df),
"alc_share_con_pct_all":round(wmean(alc,W)/wmean(df[con],W)*100,3),
"purchase_rate_pct":round(wmean((alc>0).astype(float),W)*100,1)}
if inc:
sub=df[df[inc].notna()].copy(); sub["dec"]=weighted_decile(sub[inc],W[sub.index])
for d in range(1,11):
g=sub[sub["dec"]==d]; a=wmean(alc[g.index],W[g.index]); c=wmean(g[con],W[g.index])
rec[f"D{d:02d}_alc_con_pct"]=round(a/c*100,3) if c else np.nan
rows.append(rec)
res=pd.DataFrame(rows); res.to_csv(os.path.join(OUT,"nastab_alcohol_panel.csv"),index=False,encoding="utf-8-sig")
print("์๋ฃ:",len(res),"๊ฐ ์ฐจ์")
๊ฒฐ๊ณผ 1 โ 17์ฐจ(2024) ์๋๋ถ์๋ณ ๋น์ค: ์ญU์ยถ
r=res[res.wave==17].iloc[0]
pd.DataFrame({"๋ถ์":[f"D{d:02d}" for d in range(1,11)],
"์ฃผ๋ฅ/์๋น(%)":[r[f"D{d:02d}_alc_con_pct"] for d in range(1,11)]})
D01(์ต์ ) 0.25% โ D07 0.90%(์ ์ ) โ D10(์ต๊ณ ) 0.75% โ ์ค์ฐ์ธต ์ต๋ค๋ถ๋ดยท์ต๊ณ ์๋ ์๋จ ์ญ์ง. ์ ๋์ก์ ์๋๋ฐ๋ผ ์ฆ๊ฐํ๋ ๋น์ค์ ์ญU์.
๊ฒฐ๊ณผ 2 โ ๊ตฌ์กฐ์ ๊ฐ์(17๋ ๋ฐ๊ฐ)ยถ
res[["survey_year","alc_share_con_pct_all","purchase_rate_pct"]]
๊ฐ์ ์ฉ ์ฃผ๋ฅ/์๋น ๋น์ค 2008๋ 1.54% โ 2024๋ 0.75%๋ก ๋ฐ๊ฐ, ๊ตฌ์ ๊ฐ๊ตฌ์จ 50%โ37%. ๊ตฌ์กฐ์ ์์ ๊ฐ์๋ฅผ ๊ฐ๊ตฌํจ๋๋ก ํ์ธ.