โ‘ก ๊ฐ€๊ตฌ๊ณ ์ •ํšจ๊ณผ(within) ๋ถ„์„ + 2020 ์ข…๋Ÿ‰์„ธ ์„œ์ˆ ์  DiDยถ

ํ†ตํ•ฉ ๊ฐ€๊ตฌํŒŒ์ผ NaSTaBHW.csv(์ง€์† ๊ฐ€๊ตฌID hid ร— 17์ฐจ wide). 2์› ๊ณ ์ •ํšจ๊ณผ(๊ฐ€๊ตฌ+์—ฐ๋„)๋กœ within ์†Œ๋“-์ฃผ๋ฅ˜ ๊ด€๊ณ„๋ฅผ ์‹๋ณ„.

Inย [1]:
import pandas as pd, numpy as np, csv, os
import statsmodels.formula.api as smf
D=r"D:\Project\2026_2\์ฃผ๋ฅ˜์„ธ\data\nastab"; INT=os.path.join(D,"NaSTaBHW.csv")
MISS={-1,-9,-8,-99,-999,999999}
with open(INT,encoding="utf-8-sig") as f: hdr=set(next(csv.reader(f)))
need=["hid"]; percols={}
for w in range(1,18):
    ww=f"{w:02d}"
    d={"con":f"h{ww}ca002","inc":f"h{ww}ca004","alc1":f"h{ww}cd002","alc2":f"h{ww}cd004",
       "wt":f"h{ww}cwt","wine":f"h{ww}cd006","mak":f"h{ww}cd008"}
    d={k:v for k,v in d.items() if v in hdr}; percols[w]=d; need+=list(d.values())
df=pd.read_csv(INT,usecols=need,encoding="utf-8-sig",low_memory=False)
print("๊ฐ€๊ตฌ์ˆ˜:",len(df),"| ์ฝ์€ ์—ด:",len(need))
๊ฐ€๊ตฌ์ˆ˜: 15559 | ์ฝ์€ ์—ด: 107

long ํŒจ๋„ ๊ตฌ์„ฑ (๊ฐ€๊ตฌร—์ฐจ์ˆ˜)ยถ

Inย [2]:
def clean(s):
    s=pd.to_numeric(s,errors="coerce"); return s.where(~s.isin(MISS))
recs=[]
for w in range(1,18):
    c=percols[w]
    if "inc" not in c or "con" not in c: continue
    sub=pd.DataFrame({"hid":df["hid"]}); sub["wave"]=w; sub["year"]=2006+w
    sub["con"]=clean(df[c["con"]]).where(lambda x:x>0)
    sub["inc"]=clean(df[c["inc"]]).where(lambda x:x>0)
    sub["alc"]=clean(df[c["alc1"]]).fillna(0)+clean(df[c["alc2"]]).fillna(0)
    sub["wt"]=clean(df[c["wt"]]) if "wt" in c else 1.0
    sub["wine"]=clean(df[c["wine"]]).fillna(0) if "wine" in c else np.nan
    sub["mak"]=clean(df[c["mak"]]).fillna(0) if "mak" in c else np.nan
    recs.append(sub)
p=pd.concat(recs,ignore_index=True)
p=p[p["inc"].notna()&p["con"].notna()&p["wt"].notna()&(p["wt"]>0)]
p["share"]=p["alc"]/p["con"]*100; p["linc"]=np.log(p["inc"]); p["lincsq"]=p["linc"]**2
nobs=p.groupby("hid").size(); p=p[p["hid"].isin(nobs[nobs>=2].index)]
print(f"๊ด€์ธก {len(p):,} ยท ๊ฐ€๊ตฌ {p['hid'].nunique():,} ยท ํ‰๊ท  {len(p)/p['hid'].nunique():.1f}ํšŒ")
๊ด€์ธก 66,307 ยท ๊ฐ€๊ตฌ 5,706 ยท ํ‰๊ท  11.6ํšŒ

๊ฐ€๊ตฌ within ๋””๋ฏผ ํ›„ 2์› ๊ณ ์ •ํšจ๊ณผ ํšŒ๊ท€ (๊ฐ€๊ตฌํด๋Ÿฌ์Šคํ„ฐ SE)ยถ

Inย [3]:
g=p.groupby("hid")
for c in ["share","linc","lincsq"]: p[c+"_w"]=p[c]-g[c].transform("mean")
m1=smf.ols("share_w ~ linc_w + C(year)",data=p).fit(cov_type="cluster",cov_kwds={"groups":p["hid"]})
m2=smf.ols("share_w ~ linc_w + lincsq_w + C(year)",data=p).fit(cov_type="cluster",cov_kwds={"groups":p["hid"]})
print(f"[์„ ํ˜•] log์†Œ๋“ = {m1.params['linc_w']:+.4f} (p{m1.pvalues['linc_w']:.1e})")
print(f"[2์ฐจ] log์†Œ๋“={m2.params['linc_w']:+.3f}(p{m2.pvalues['linc_w']:.2g}), (log์†Œ๋“)^2={m2.params['lincsq_w']:+.4f}(p{m2.pvalues['lincsq_w']:.2g})")
[์„ ํ˜•] log์†Œ๋“ = -0.0902 (p6.2e-05)
[2์ฐจ] log์†Œ๋“=+0.162(p0.24), (log์†Œ๋“)^2=-0.0233(p0.058)

ํ•ด์„: ๊ฐ™์€ ๊ฐ€๊ตฌ์—์„œ ์†Œ๋“์ด ์˜ค๋ฅด๋ฉด ์ฃผ๋ฅ˜ ์ง€์ถœ๋น„์ค‘์€ ์†Œํญ ๊ฐ์†Œ(โˆ’0.09/log์†Œ๋“, p<0.001). โ†’ ํšก๋‹จ๋ฉด ์—ญU์ž์˜ "์ €์†Œ๋“ ์ตœ์ €" ๊ตฌ๊ฐ„์€ ๊ฐ€๊ตฌ ๊ตฌ์„ฑํšจ๊ณผ(์ €์†Œ๋“=๊ณ ๋ นยท๋น„์Œ์ฃผ)์ด๊ณ , ๊ฐ€๊ตฌ ๋‚ด ํ–‰๋™์€ ์†Œ๋“ํƒ„๋ ฅ์„ฑ<1. ์ค‘์‚ฐ์ธต ์ตœ๋‹ค๋ถ€๋‹ด์€ ๊ฐ€๊ตฌ ๊ฐ„ ๊ตฌ์กฐ์  ์‚ฌ์‹ค.

2020 ์ข…๋Ÿ‰์„ธ ์„œ์ˆ ์  DiD โ€” ๋ง‰๊ฑธ๋ฆฌยท์ „ํ†ต์ฃผ(์ฒ˜์น˜) vs ์™€์ธ(๋Œ€์กฐ)ยถ

2024 ๊ธฐ์ค€ํŒ๋งค๋น„์œจ์€ ์•„์ง ๋ฐ์ดํ„ฐ ๋ฐ–(์ตœ์‹  2023). 2020 ์ข…๋Ÿ‰์„ธ๋Š” ์ฝ”๋กœ๋‚˜ ์ค‘์ฒฉยท๋งฅ์ฃผ ๋ถ„๋ฆฌ๋ถˆ๊ฐ€ โ†’ ์„œ์ˆ ์  ์ฐธ๊ณ ์น˜.

Inย [4]:
dd=p[p["wine"].notna()&p["mak"].notna()].copy(); dd=dd[(dd.year>=2016)&(dd.year<=2023)]
dd["post"]=(dd.year>=2020).astype(int)
A=dd[["hid","post","wt","mak"]].rename(columns={"mak":"exp"}); A["treat"]=1
B=dd[["hid","post","wt","wine"]].rename(columns={"wine":"exp"}); B["treat"]=0
dl=pd.concat([A,B],ignore_index=True)
m3=smf.ols("exp ~ treat*post",data=dl).fit(cov_type="cluster",cov_kwds={"groups":dl["hid"]})
print(f"DiD ์ƒํ˜ธ์ž‘์šฉ(treat:post) = {m3.params['treat:post']:+.4f}  (p {m3.pvalues['treat:post']:.3g})")
print("โ†’ ํ†ต๊ณ„์  ์œ ์˜์„ฑ ์—†์Œ. ์„ธ์ œ ์ธ๊ณผ DiD๋Š” 18์ฐจ(2025์กฐ์‚ฌ)ยท2024 ๊ธฐ์ค€ํŒ๋งค๋น„์œจ๋กœ ์žฌ์ถ”์ • ๊ถŒ์žฅ.")
DiD ์ƒํ˜ธ์ž‘์šฉ(treat:post) = -0.0207  (p 0.167)
โ†’ ํ†ต๊ณ„์  ์œ ์˜์„ฑ ์—†์Œ. ์„ธ์ œ ์ธ๊ณผ DiD๋Š” 18์ฐจ(2025์กฐ์‚ฌ)ยท2024 ๊ธฐ์ค€ํŒ๋งค๋น„์œจ๋กœ ์žฌ์ถ”์ • ๊ถŒ์žฅ.