๋ณธ๋ฌธ ๋ฐ”๋กœ๊ฐ€๊ธฐ
1๏ธโƒฃ AI•DS/๐ŸฅŽ Casual inference

[The Brave and True] 14. Panel data and fixed effects

by isdawell 2023. 7. 26.
728x90

 

 

 

๐Ÿ‘€ ์ธ๊ณผ์ถ”๋ก  ๊ฐœ์ธ ๊ณต๋ถ€์šฉ ํฌ์ŠคํŠธ ๊ธ€์ž…๋‹ˆ๋‹ค. ์ถœ์ฒ˜๋Š” ์ฒจ๋ถ€ํ•œ ๋งํฌ๋ฅผ ์ฐธ๊ณ ํ•ด์ฃผ์„ธ์š”!

 

 

 

 

 

๐Ÿ“œ ์ •๋ฆฌ 

 

•   ํŒจ๋„ ๋ฐ์ดํ„ฐ : ์—ฌ๋Ÿฌ ๊ธฐ๊ฐ„์— ๊ฑธ์ณ ๋™์ผํ•œ ๋Œ€์ƒ์— ๋Œ€ํ•ด ์ธก์ •๊ฐ’์ด ์žˆ๋Š” ๋ฐ์ดํ„ฐ 
•   Entity (๊ฐœ์ฒด) ๋ฅผ ์ œ์–ดํ•˜๋Š” ๊ณ ์ •ํšจ๊ณผ ๋ชจ๋ธ์„ ์‚ฌ์šฉํ•ด ๋ชจ๋“  ๋Œ€์ƒ๊ณผ, ์‹œ๊ฐ„์ด ๋ณ€ํ•˜์ง€ ์•Š๋Š” ๋ณ€์ˆ˜๋ฅผ ๊ณ ์ •ํ•  ์ˆ˜ ์žˆ๋‹ค. ๊ณ ์ •ํšจ๊ณผ ๋ชจ๋ธ์€ ๊ต๋ž€๋ณ€์ˆ˜๋ฅผ ํ†ต์ œํ•˜๋Š” ๊ฐ•๋ ฅํ•˜๊ณ  ์„ค๋“๋ ฅ์žˆ๋Š” ๋ฐฉ๋ฒ•์ด๋‹ค. 
•   ๊ทธ๋Ÿฌ๋‚˜ ์—ญ์ธ๊ณผ๊ด€๊ณ„๊ฐ€ ์žˆ๊ฑฐ๋‚˜ ๊ด€์ธก๋˜์ง€ ์•Š์€ ๊ต๋ž€๋ณ€์ˆ˜๊ฐ€ ์‹œ๊ฐ„์— ๋”ฐ๋ผ ๋ณ€ํ•  ๋•Œ ๊ณ ์ •ํšจ๊ณผ ๋ชจ๋ธ์ด ์ธ๊ณผํšจ๊ณผ๋ฅผ ๋„์ถœํ•˜๊ธฐ ์–ด๋ ค์šธ ์ˆ˜ ์žˆ๋‹ค. 

 

 

 

 

 

 

โ‘   Intro 


 

โ—ฏ   Panel data 

 

•   Panel : ์—ฌ๋Ÿฌ๊ธฐ๊ฐ„์— ๊ฑธ์ณ ๋™์ผํ•œ ๋‹จ์œ„ (unit) ์„ ๋ฐ˜๋ณต์ ์œผ๋กœ ๊ด€์ฐฐํ•œ ๊ฒฝ์šฐ 

•   ํŒจ๋„ ๋ฐ์ดํ„ฐ๋Š” ์—ฌ๋Ÿฌ ํ•ด์— ๊ฑธ์ณ ์—ฌ๋Ÿฌ ๋„์‹œ ๋˜๋Š” ์ฃผ์— ๋Œ€ํ•œ ๋ฐ์ดํ„ฐ๋ฅผ ์ถ”์ ํ•  ์ˆ˜ ์žˆ๋Š” ์ •๋ถ€ ์ •์ฑ… ํ‰๊ฐ€์—์„œ ๋งŽ์ด ๋ฐœ์ƒํ•œ๋‹ค. ๊ธฐ์—…๋“ค์ด ๋ช‡ ์ฃผ ๋˜๋Š” ๋ช‡ ๋‹ฌ์— ๊ฑธ์ณ ์œ ์ € ๋ฐ์ดํ„ฐ๋ฅผ ์ถ”์ ํ•˜๋Š” ์‚ฐ์—…์—์„œ๋„ ๋งค์šฐ ์ผ๋ฐ˜์ ์œผ๋กœ ๋ณผ ์ˆ˜ ์žˆ๋‹ค. 

 

์ง€๋‚œ DiD ์˜ˆ์ œ : ๋ฐ˜์‚ฌ์‹ค ๊ฒฐ๊ณผ ์ถ”์ •

 

•   Y0(1) : ๊ธฐ๊ฐ„์ด 1์ผ ๋•Œ, ๋Œ€์กฐ๊ตฐ์— ๋Œ€ํ•œ ๊ฒฐ๊ณผ 

•   counterfactual ์— ๋Œ€ํ•œ potential outcome 

 

POA ์— ๋Œ€ํ•œ ATT

 

•   ๊ด‘๊ณ ํŒ์„ PA ์ง€์—ญ์— ๋ฐฐ์น˜ํ•˜๋Š” ํšจ๊ณผ = (๊ด‘๊ณ ํŒ์„ ๋ฐฐ์น˜ ํ›„, POA ์—์„œ ์ธก์ •ํ•œ ๊ฒฐ๊ณผ) - (๊ด‘๊ณ ํŒ์„ ๋ฐฐ์น˜ํ•˜์ง€ ์•Š์•˜๋‹ค๋ฉด ์ผ์–ด๋‚  ์ผ์— ๋Œ€ํ•œ ์ถ”์ •์น˜, counterfactual) 

 

 

 

 

 

 

 

 

โ‘ก  Parallel trends 


 

โ—ฏ  Independence assumption 

 

•   ๋…๋ฆฝ์„ฑ ๊ฐ€์ •์„ ํ†ตํ•ด parallel trends assumption ์„ ํ™•์ธํ•ด๋ณผ ์ˆ˜ ์žˆ๋‹ค : Yd ⊥ D

•   treatment assign ์ด ์ž ์žฌ์  ๊ฒฐ๊ณผ๋กœ๋ถ€ํ„ฐ ๋…๋ฆฝ์ ์ด์–ด์•ผ ํ•œ๋‹ค. 

โ†ช ๋…๋ฆฝ์„ฑ ๊ฐ€์ •์ด ์œ„๋ฐฐ๋˜๋Š” ex. ๋งˆ์ผ€ํŒ… ๋งค๋‹ˆ์ €๊ฐ€ ์ด๋ฏธ ์€ํ–‰ ์˜ˆ๊ธˆ์ด ๋งค์šฐ ๋†’์€ ๋„์‹œ์—๋งŒ ๊ด‘๊ณ ํŒ์„ ์ถ”๊ฐ€ํ•˜๊ธฐ๋กœ ๊ฒฐ์ •ํ•œ ๊ฒฝ์šฐ, ๋งˆ์ผ€ํŒ… ํšจ๊ณผ์™€ ์ƒ๊ด€์—†์ด ์บ ํŽ˜์ธ์€ ์„ฑ๊ณตํ•  ๊ฐ€๋Šฅ์„ฑ์ด ๋†’๋‹ค. ์ฆ‰, Y0 ๊ฐ€ ๋†’์€ ๋„์‹œ์— treatment ๋ฅผ ์ฃผ๋Š” ๊ฒƒ์ด๋‹ค. 

 

 

โ—ฏ  Independence assumption ๊ณผ parallel trends 

 

 

 

 

 

 

 

โ‘ข  Controlling what you cannot see


 

โ—ฏ  unconfoundedness 

 

•   ์„ฑํ–ฅ ์ ์ˆ˜, ์„ ํ˜•ํšŒ๊ท€ ๋ฐ ๋งค์นญ ๋ฐฉ๋ฒ•์€ ๋žœ๋คํ•˜์ง€ ์•Š์€ ๋ฐ์ดํ„ฐ์˜ ๊ต๋ž€๋ณ€์ˆ˜๋ฅผ ํ†ต์ œํ•˜๋Š”๋ฐ ๋งค์šฐ ์ข‹์€ ๋ฐฉ๋ฒ•์ด๋‹ค. ๊ทธ๋Ÿฌ๋‚˜ ํ•ด๋‹น ๋ฐฉ๋ฒ•๋“ค์€ ์ค‘์š”ํ•œ ๊ฐ€์ •์ธ conditional unconfoundedness ์— ์˜์กดํ•œ๋‹ค. ์ฆ‰, ๋ชจ๋“  ๊ต๋ž€๋ณ€์ˆ˜๋ฅผ ์•Œ๊ณ ์žˆ๊ณ  ์ธก์ •์ด ๋˜์–ด์•ผ ๊ต๋ž€๋ณ€์ˆ˜๋ฅผ ์กฐ๊ฑด๋ถ€๋กœ ๋‘๊ณ , random assignment ์™€ ๊ฐ™์ด treatment ๋ฅผ ๊ตฌ์„ฑํ•  ์ˆ˜ ์žˆ๋‹ค. 

 

 

•   ๋ฌธ์ œ๋Š” ๊ต๋ž€๋ณ€์ˆ˜๋ฅผ ํ•ญ์ƒ ์ธก์ •(๊ด€์ธก) ํ•  ์ˆ˜ ์—†๋Š” ๊ฒฝ์šฐ๊ฐ€ ์กด์žฌํ•˜๋Š” ๊ฒƒ์ด๋‹ค. 

•   ์ธก์ •๋˜์ง€ ์•Š์€ ๊ต๋ž€๋ณ€์ˆ˜๊ฐ€ ์žˆ์œผ๋ฉด bias ๊ฐ€ ์กด์žฌํ•˜๊ธฐ ๋•Œ๋ฌธ์— ์ธ๊ณผํšจ๊ณผ ์ถ”์ •์— ์–ด๋ ค์šด ์ƒํ™ฉ์— ๋†“์ด๊ฒŒ ๋œ๋‹ค. ๊ต๋ž€๋ณ€์ˆ˜๋ฅผ ํšจ๊ณผ์ ์œผ๋กœ ์ฒ˜๋ฆฌํ•˜๋Š” ๋ฐฉ๋ฒ•์€ ๋„๊ตฌ๋ณ€์ˆ˜๋ฅผ ์‚ฌ์šฉํ•˜๋Š” ๊ฒƒ์ด๋‹ค. ๊ทธ๋Ÿฌ๋‚˜ ์ข‹์€ ๋„๊ตฌ๋ณ€์ˆ˜๋ฅผ ๋งŒ๋“œ๋Š” ๊ฒƒ์€ ์‰ฝ์ง€ ์•Š์œผ๋ฉฐ, ๋งŽ์€ ์ฐฝ์˜์„ฑ์„ ์š”๊ตฌํ•œ๋‹ค. ๋Œ€์‹  ํŒจ๋„ ๋ฐ์ดํ„ฐ ๊ตฌ์กฐ๋ฅผ ํ™œ์šฉํ•ด๋ณผ ์ˆ˜ ์žˆ๋‹ค. 

 

 

 

โ—ฏ  unconfoundedness and panel data

 

•   ํŒจ๋„๊ตฌ์กฐ์—์„œ ๊ต๋ž€ ๋ณ€์ˆ˜๋ฅผ ๋ฐ”๋ผ๋ณด๋Š” ๋ฐฉ๋ฒ•์€ ์‹œ๊ฐ„์— ๊ณ ์ •๋œ time fixed ๊ต๋ž€๋ณ€์ˆ˜๋ฅผ ๊ฐ ์‹คํ—˜๋Œ€์ƒ์— ๊ณ ์œ ํ•œ ์†์„ฑ์œผ๋กœ ์ƒ๊ฐํ•˜๋Š” ๊ฒƒ์ด๋‹ค. 

 

 

๊ฒฐํ˜ผ์ด ์†Œ๋“์— ๋ฏธ์น˜๋Š” ์˜ํ–ฅ

 

 

•   ์‚ฌ๋žŒ์˜ ์™ธ๋ชจ๋‚˜ ์ง€์„ฑ๊ณผ ๊ฐ™์€ ์†์„ฑ์„ ์ธก์ •ํ•  ์ˆ˜๋Š” ์—†์ง€๋งŒ, ๊ทธ ํŠน์ง•์„ ์ง€๋‹Œ ์‚ฌ๋žŒ์€ ์‹œ๊ฐ„์ด ํ˜๋Ÿฌ๋„ ๊ฐ™์€ ๊ฐœ์ธ์ด๋‹ค. ์—ฌ๊ธฐ์„œ ์šฐ๋ฆฌ๊ฐ€ ํ•  ์ˆ˜ ์žˆ๋Š” ๊ฒƒ์€ ํŠน์ • ์‚ฌ๋žŒ์„ ๋‚˜ํƒ€๋‚ด๋Š” ๋”๋ฏธ ๋ณ€์ˆ˜๋ฅผ ๋งŒ๋“ค๊ณ  ์„ ํ˜• ๋ชจ๋ธ์— ์ถ”๊ฐ€ํ•˜๋Š” ๊ฒƒ์ด๋‹ค. ํ•ด๋‹น ๋”๋ฏธ๋ณ€์ˆ˜๋ฅผ ์ถ”๊ฐ€ํ•จ์œผ๋กœ ์‚ฌ๋žŒ ์ž์ฒด๋ฅผ ์ œ์–ดํ•  ์ˆ˜ ์žˆ๋‹ค. 

 

•   ์‚ฌ๋žŒ์— ๋Œ€ํ•œ ๋”๋ฏธ๋ณ€์ˆ˜์™€ ํ•จ๊ป˜ ๊ฒฐํ˜ผ์ด ์†Œ๋“์— ๋ฏธ์น˜๋Š” ์˜ํ–ฅ์„ ์ถ”์ •ํ•  ๋•Œ, ํšŒ๊ท€๋ถ„์„์€ ์‚ฌ๋žŒ์— ๋Œ€ํ•œ ๋ณ€์ˆ˜๋ฅผ ๊ณ ์ •๋œ ์ƒํƒœ๋กœ ์œ ์ง€ํ•˜๋ฉฐ ๊ฒฐํ˜ผ์˜ ํšจ๊ณผ๋ฅผ ์ฐพ๋Š”๋‹ค. 

 

•   ์‹คํ—˜๋Œ€์ƒ์— ๋Œ€ํ•œ ๋”๋ฏธ๋ณ€์ˆ˜๋ฅผ ์ถ”๊ฐ€ํ•˜๋Š” ๊ฒƒ์„ Fixed effect model ์ด๋ผ๊ณ  ํ•œ๋‹ค. 

 

 

 

 

 

โ‘ฃ  Fixed effects


 

โ—ฏ   ์˜ˆ์ œ. ๊ฒฐํ˜ผ์ด ์†Œ๋“์— ๋ฏธ์น˜๋Š” ์ธ๊ณผ์  ์˜ํ–ฅ 

 

•   nr : ๊ฐœ์ธ 

•   year : ์—ฐ๋„ 

•   married : ๊ธฐํ˜ผ์—ฌ๋ถ€ 

•   lwage : ์†Œ๋“์˜ ๋กœ๊ทธ๋ณ€ํ™˜ 

•   expersq : ํ•ด๋‹น ์—ฐ๋„์˜ ๊ทผ๋ฌด ์‹œ๊ฐ„ 

•   occupation : ๊ต์œก ๋…„์ˆ˜ 

 

 

 

โ—ฏ   ๊ณ ์ •ํšจ๊ณผ ๋ชจ๋ธ 

 

 

•   y_it : ์‹œ๊ฐ„ t์—์„œ ๊ฐ ์‹คํ—˜๋Œ€์ƒ i ์˜ ๊ฒฐ๊ณผ 

•   X_it : ์‹œ๊ฐ„ t์—์„œ ์‹คํ—˜๋Œ€์ƒ i ์— ๋Œ€ํ•œ ๋ณ€์ˆ˜๋“ค์˜ ๋ฒกํ„ฐ

  โ†ช  ์‹œ๊ฐ„์— ๋”ฐ๋ผ ๋ณ€ํ•˜๋Š” ๊ด€์ฐฐ ๊ฐ€๋Šฅํ•œ ๋ณ€์ˆ˜ ex. ๊ฒฐํ˜ผ,๊ฒฝ๋ ฅ

•   Ui : ์‹คํ—˜๋Œ€์ƒ i ์— ๋Œ€ํ•ด ๊ด€์ธก ๋ถˆ๊ฐ€๋Šฅํ•œ ๋ณ€์ˆ˜์˜ ์ง‘ํ•ฉ 

  โ†ช  ๊ด€์ธกํ•  ์ˆ˜ ์—†๋Š” ๋ณ€์ˆ˜๋“ค์€ ์‹œ๊ฐ„์ด ์ง€๋‚จ์— ๋”ฐ๋ผ ๋ณ€ํ•˜์ง€ ์•Š๊ธฐ ๋•Œ๋ฌธ์— ์‹œ๊ฐ„์ฒจ์ž๊ฐ€ ์—†๋‹ค. ex. ์™ธ๋ชจ, ์ง€์„ฑ 

•   e_it : ์˜ค์ฐจํ•ญ 

•   y_it : ์ž„๊ธˆ์— ๋Œ€ํ•œ ๋กœ๊ทธ๋ณ€ํ™˜ 

 

 

 

โ—ฏ   fixed effect ๊ตฌํ˜„ 

 

•   ์‹คํ—˜๋Œ€์ƒ์— ๋Œ€ํ•œ ๋”๋ฏธ๋ณ€์ˆ˜๋ฅผ ์ถ”๊ฐ€ํ•˜๋Š” ๊ฒƒ์€ ์—ด์˜ ๊ฐœ์ˆ˜๊ฐ€ ๋งค์šฐ ๋งŽ์ด ์ถ”๊ฐ€๋˜๊ธฐ ๋•Œ๋ฌธ์— ์„ ํ˜•ํšŒ๊ท€๋ฅผ 2๊ฐœ์˜ ๊ฐœ๋ณ„๋ชจ๋ธ๋กœ ๋ถ„ํ• ํ•˜๋Š” ํŠธ๋ฆญ์„ ํ™œ์šฉํ•œ๋‹ค. 

 

 

•   ์—ฐ๋„ year ๋”๋ฏธ๋ณ€์ˆ˜์— ๋Œ€ํ•œ ํ•จ์ˆ˜๋กœ ์ž„๊ธˆ์„ ์˜ˆ์ธกํ•˜๋Š” ๋ชจ๋ธ 

 

mod = smf.ols("lwage ~ C(year)", data=data).fit()
mod.summary().tables[1]

baseline : 1980์—ฐ๋„

 

โ†ช  1981๋…„ : 1.3935 + 0.1194  

 

 

data.groupby("year")["lwage"].mean()

 

โ†ช  ์—ฐ๋„๋ณ„ ์ž„๊ธˆ ํ‰๊ท  ๊ฒฐ๊ณผ์™€ ํšŒ๊ท€ ๋ชจ๋ธ ๊ฒฐ๊ณผ๊ฐ€ ๊ฐ™๋‹ค. ์ฆ‰, ํŒจ๋„ ๋ฐ์ดํ„ฐ์˜ ๋ชจ๋“  ์‚ฌ๋žŒ์— ๋Œ€ํ•œ ํ‰๊ท ์„ ์–ป์œผ๋ ค๋ฉด, ๋ณธ์งˆ์ ์œผ๋กœ ๋‹ค๋ฅธ ๋ณ€์ˆ˜์— ๋Œ€ํ•œ ๊ฐœ๋ณ„ ๋”๋ฏธ์— ํšŒ๊ท€๋ฅผ ํ•ด์•ผ ํ•œ๋‹ค. 

 

 

•   ๊ฐœ์ธ๋ณ„๋กœ ๋ฐ์ดํ„ฐ๋ฅผ ๊ทธ๋ฃนํ™”ํ•˜์—ฌ ํ‘œ์ค€ํŽธ์ฐจ์˜ ํ•ฉ๊ณ„๋ฅผ ์–ป์„ ์ˆ˜ ์žˆ๋‹ค. ๋งŒ์•ฝ ํ•ฉ๊ณ„๊ฐ€ 0์ด๋ฉด ๋ณ€์ˆ˜๊ฐ€ ๊ฐœ๋ณ„ ๋Œ€์ƒ์— ๋Œ€ํ•ด ์‹œ๊ฐ„์ด ์ง€๋‚จ์— ๋”ฐ๋ผ ๋ณ€ํ•˜์ง€ ์•Š์Œ์„ ์˜๋ฏธํ•œ๋‹ค. 

 

data.groupby("nr").std().sum()

 

โ†ช  ์ธ์ข…๊ณผ ๊ด€๋ จ๋œ ๋”๋ฏธ๋ณ€์ˆ˜ black, hisp ์™€ ๊ต์œก ๋ณ€์ˆ˜๊ฐ€ ๊ฐœ๋ณ„ ์‹คํ—˜๋Œ€์ƒ์— ๋Œ€ํ•ด ์ผ์ •ํ•˜๊ธฐ ๋•Œ๋ฌธ์— ์ œ๊ฑฐํ•  ํ•„์š”๊ฐ€ ์žˆ๋‹ค. ๋˜ํ•œ occupation (์ง์—…) ๋ณ€์ˆ˜๋ฅผ ์‚ฌ์šฉํ•˜์ง€ ์•Š๋Š”๋‹ค. ์ง์—… ๋ณ€์ˆ˜๋Š” ๊ฒฐํ˜ผ์ด ์ž„๊ธˆ์— ๋ฏธ์น˜๋Š” ์˜ํ–ฅ์„ ์ค‘์žฌ (mediated) ํ•˜๊ธฐ ๋•Œ๋ฌธ์ด๋‹ค. ๋ฏธํ˜ผ ๋‚จ์„ฑ์ด ๋” ๋งŽ์€ ์‹œ๊ฐ„์„ ์š”๊ตฌํ•˜๋Š” ์ง์—…์„ ๊ฐ€์งˆ ์ˆ˜ ์žˆ๊ธฐ ๋•Œ๋ฌธ์ด๋‹ค. 

 

 

 

 

โ—ฏ   fixed effect ๊ตฌํ˜„ 

 

โ‘ด   ์‹คํ—˜ ๋Œ€์ƒ ๋ณ„ ํ‰๊ท  ๋ฐ์ดํ„ฐ ์ƒ์„ฑ 

 

Y = "lwage"
T = "married"
X = [T, "expersq", "union", "hours"]

mean_data = data.groupby("nr")[X+[Y]].mean()
mean_data.head()

 

 

โ‘ต  ํ‰๊ท  ๋ฐ์ดํ„ฐ์—์„œ ๊ธฐ์กด ๋ฐ์ดํ„ฐ๋ฅผ ์ฐจ๋ถ„ํ•˜๊ธฐ 

 

demeaned_data = (data
               .set_index("nr") # set the index as the person indicator
               [X+[Y]]
               - mean_data) # subtract the mean data

demeaned_data.head()

 

 

โ‘ถ ํ‰๊ท ์„ ๋บ€ ๋ฐ์ดํ„ฐ์— ๋Œ€ํ•ด ๊ณ ์ •ํšจ๊ณผ ๋ชจ๋ธ ์ ์šฉ 

 

mod = smf.ols(f"{Y} ~ {'+'.join(X)}", data=demeaned_data).fit()
mod.summary().tables[1]

 

โ†ช  ๊ฒฐํ˜ผ์ด ๋‚จ์„ฑ์˜ ์ž„๊ธˆ์„ 11% ์ฆ๊ฐ€์‹œํ‚จ๋‹ค๋Š” ๊ฒƒ์„ ์˜๋ฏธ 

 

 

 

โ‘ท  ๊ณ ์ •ํšจ๊ณผ ๋ชจ๋ธ์˜ ๊ฒฝ์šฐ, ํ‘œ์ค€์˜ค์ฐจ๊ฐ€ clustered ๋˜์–ด์•ผ ํ•œ๋‹ค. linearmodels๋ฅผ ์‚ฌ์šฉ ๋ฐ ํ•ด๋‹น cluster_entity ์ธ์ž๋ฅผ True๋กœ ์„ค์ •ํ•˜๋ฉด ๋œ๋‹ค. 

 

from linearmodels.panel import PanelOLS
mod = PanelOLS.from_formula("lwage ~ expersq+union+married+hours+EntityEffects",
                            data=data.set_index(["nr", "year"]))

result = mod.fit(cov_type='clustered', cluster_entity=True)
result.summary.tables[1]

 

 

 

 

โ—ฏ   ๋ฐ์ดํ„ฐ์˜ ์‹œ๊ฐ„๋ถ€๋ถ„์„ ๊ณ ๋ คํ•˜์ง€ ์•Š์€ ๊ฐ„๋‹จํ•œ OLS ๋ชจ๋ธ 

 

•  ์‹œ๊ฐ„์— ์ผ์ •ํ•œ ๋ณ€์ˆ˜๋“ค์„ ๋‹ค์‹œ ์ถ”๊ฐ€ 

 

mod = smf.ols("lwage ~ expersq+union+married+hours+black+hisp+educ", data=data).fit()
mod.summary().tables[1]

 

โ†ช  ๊ฒฐํ˜ผ์ด ๋‚จ์„ฑ์˜ ์ž„๊ธˆ์„ 14% ์ฆ๊ฐ€์‹œํ‚จ๋‹ค๋Š” ๊ฒƒ์„ ์˜๋ฏธ 

โ†ช  intelligence, beauty ๋ณ€์ˆ˜์™€ ๊ฐ™์€ ๊ณ ์ •๋œ ๊ฐœ๋ณ„ ์š”์ธ์œผ๋กœ ์ผ๋ถ€ ์ƒ๋žต๋œ ๋ณ€์ˆ˜์˜ ํŽธํ–ฅ์ด ๋ชจ๋ธ์— ๋ฐ˜์˜๋˜์ง€ ์•Š์Œ์„ ์˜๋ฏธ 

 

 

 

 

 

 

 

 

โ‘ค  Visualizing fixed effects


 

โ—ฏ   Visualizing fixed effects 

 

•   ๊ณ ์ •ํšจ๊ณผ ๋ชจ๋ธ์ด ์–ด๋–ป๊ฒŒ ๋™์ž‘ํ•˜๋Š”์ง€ ์ง๊ด€์ ์œผ๋กœ ์‚ดํŽด๋ณด๊ธฐ 

•   ์˜ˆ์ œ. ๊ด‘๊ณ ํŒ ๋งˆ์ผ€ํŒ… ์บ ํŽ˜์ธ์ด ์ธ์•ฑ ๊ตฌ๋งค์— ๋ฏธ์น˜๋Š” ์˜ํ–ฅ์„ ์ถ”์ •

 

toy_panel = pd.DataFrame({
    "mkt_costs":[5,4,3.5,3, 10,9.5,9,8, 4,3,2,1, 8,7,6,4],
    "purchase":[12,9,7.5,7, 9,7,6.5,5, 15,14.5,14,13, 11,9.5,8,5],
    "city":["C0","C0","C0","C0", "C2","C2","C2","C2", "C1","C1","C1","C1", "C3","C3","C3","C3"]
})

m = smf.ols("purchase ~ mkt_costs", data=toy_panel).fit()

plt.scatter(toy_panel.mkt_costs, toy_panel.purchase)
plt.plot(toy_panel.mkt_costs, m.fittedvalues, c="C5", label="Regression Line")
plt.xlabel("Marketing Costs (in 1000)")
plt.ylabel("In-app Purchase (in 1000)")
plt.title("Simple OLS Model")
plt.legend();

 

โ†ช  ๊ณผ๊ฑฐ ๋ฐ์ดํ„ฐ๋ฅผ ์‚ดํŽด๋ณด์•˜๋Š”๋ฐ, ๊ตฌ๋งค์ˆ˜์ค€์ด ๋‚ฎ์€ ๋„์‹œ (์• ์ดˆ์— ์ธ์•ฑ ๊ตฌ๋งค๋ฅผ ๊ฑฐ์˜ ์•ˆํ•˜๋Š” ๊ณณ)์— ๊ด‘๊ณ ํŒ์„ ๋ฐฐ์น˜ํ•˜๋Š”๋ฐ ๋” ๋งŽ์€ ๋งˆ์ผ€ํŒ… ๋น„์šฉ์„ ์ง€์ถœํ•˜๋Š” ๊ฒฝํ–ฅ์ด ์žˆ์Œ์„ ํ™•์ธํ•˜์˜€๋‹ค. ํ•ด๋‹น ๋ฐ์ดํ„ฐ๋กœ ํšŒ๊ท€๋ถ„์„์„ ์ง„ํ–‰ํ•˜๋ฉด, ๋งˆ์ผ€ํŒ… ๋น„์šฉ์ด ๋†’์„์ˆ˜๋ก ์ธ์•ฑ ๊ตฌ๋งค๊ฐ€ ๊ฐ์†Œํ•˜๋Š” ๊ฒƒ์ฒ˜๋Ÿผ ๋ณด์ผ ๊ฒƒ์ด๋‹ค. ๊ทธ๋Ÿฌ๋‚˜ ์ด๋Š” ์ง€์ถœ์ด ์ ์€ ์ง€์—ญ์— ํˆฌ์ž๊ฐ€ ํŽธ์ค‘๋˜์—ˆ๊ธฐ ๋•Œ๋ฌธ์— ๋ฐœ์ƒํ•œ ๊ฒฐ๊ณผ์ด๋‹ค. 

 

 

fe = smf.ols("purchase ~ mkt_costs + C(city)", data=toy_panel).fit()
# ๐ŸŸก C(city)

fe_toy = toy_panel.assign(y_hat = fe.fittedvalues)

plt.scatter(toy_panel.mkt_costs, toy_panel.purchase, c=toy_panel.city)
for city in fe_toy["city"].unique():
    plot_df = fe_toy.query(f"city=='{city}'")
    plt.plot(plot_df.mkt_costs, plot_df.y_hat, c="C5")

plt.title("Fixed Effect Model")
plt.xlabel("Marketing Costs (in 1000)")
plt.ylabel("In-app Purchase (in 1000)");

 

โ†ช  ๋”ฐ๋ผ์„œ ๊ณ ์ •ํšจ๊ณผ๋ชจ๋ธ์„ ์‹คํ–‰ํ•˜๊ธฐ๋กœ ๊ฒฐ์ •ํ•˜๊ณ , ๋„์‹œ์˜ ์ง€ํ‘œ๋ฅผ ๋ชจ๋ธ์— ๋”๋ฏธ๋ณ€์ˆ˜๋กœ ์ถ”๊ฐ€ํ•œ๋‹ค. ๊ณ ์ •ํšจ๊ณผ๋ชจ๋ธ์€ ์‹œ๊ฐ„์— ๋”ฐ๋ผ ์ผ์ •ํ•œ ๋„์‹œ ๊ณ ์œ ์˜ ํŠน์„ฑ์„ ํ†ต์ œํ•˜๊ธฐ ๋•Œ๋ฌธ์— ๋„์‹œ๊ฐ€ ์ƒํ’ˆ์— ๋Œ€ํ•ด ๊ตฌ๋งค์ˆ˜์ค€์ด ๋‚ฎ์œผ๋ฉด ์ด๋ฅผ ํฌ์ฐฉํ•ด ๋ฐ˜์˜ํ•˜๊ฒŒ ๋œ๋‹ค. 

 

โ†ช  ๊ณ ์ •ํšจ๊ณผ๋Š” ๋„์‹œ๋‹น ํ•˜๋‚˜์˜ ํšŒ๊ท€์„ ์„ fitting ํ•œ๋‹ค๋Š” ์ ๊ณผ ์ ํ•ฉ๋œ ํšŒ๊ท€์„ ์ด ํ‰ํ–‰ํ•˜๋‹ค๋Š” ์ ์„ ์ฃผ๋ชฉํ•ด์•ผ ํ•œ๋‹ค. ํšŒ๊ท€์„ ์˜ ๊ธฐ์šธ๊ธฐ๋Š” ์ธ์•ฑ ๊ตฌ๋งค์— ๋Œ€ํ•œ ๋งˆ์ผ€ํŒ… ๋น„์šฉ์˜ ํšจ๊ณผ๋ฅผ ์„ค๋ช…ํ•œ๋‹ค. ๊ณ ์ •ํšจ๊ณผ๋Š” ์ธ๊ณผํšจ๊ณผ๊ฐ€ ๋ชจ๋“  ๊ฐœ์ฒด (ํ•ด๋‹น ์˜ˆ์‹œ์—์„œ๋Š” ๋„์‹œ) ์— ๊ฑธ์ณ ์ผ์ •ํ•˜๋‹ค๊ณ  ๊ฐ€์ •ํ•œ๋‹ค. 

 

โ†ช  ๊ทธ๋Ÿฌ๋‚˜ ์ด๋Ÿฌํ•œ ๊ฐ€์ •์€ ๋งŒ์•ฝ ๋„์‹œ๋ณ„ ์ธ๊ณผํšจ๊ณผ๋ฅผ ์ถ”์ •ํ•˜๋Š”๋ฐ ๊ด€์‹ฌ์ด ์žˆ๋Š” ๊ฒƒ์ด๋ผ๋ฉด ์•ฝ์ ์ด ๋  ์ˆ˜ ์žˆ๋‹ค. ๊ณ ์ •ํšจ๊ณผ ๋ชจ๋ธ์€ ํ•ด๋‹น ํšจ๊ณผ๊ฐ€ ๊ฐœ์ฒด (๋„์‹œ) ๊ฐ„ ์ผ์ •ํ•˜๋‹ค๊ณ  ๊ฐ€์ •ํ•˜๊ธฐ ๋•Œ๋ฌธ์— ๋„์‹œ์— ๋”ฐ๋ฅธ ์ธ๊ณผํšจ๊ณผ ์ฐจ์ด๋ฅผ ์ฐพ์ง€ ๋ชปํ•œ๋‹ค. ์ธ์•ฑ๊ตฌ๋งค์— ๋Œ€ํ•œ ๋งˆ์ผ€ํŒ…์˜ ์ „๋ฐ˜์ ์ธ ํšจ๊ณผ๋ฅผ ์ฐพ๊ณ ์ž ํ•œ๋‹ค๋ฉด ํ•ด๋‹น ๋ฐ์ดํ„ฐ์˜ ํŒจ๋„ ํ˜•ํƒœ๊ฐ€ ๊ณ ์ • ํšจ๊ณผ๋ฅผ ํƒ์ƒ‰ํ•  ์ˆ˜ ์žˆ๊ฒŒ ๋„์›€์„ ์ค€๋‹ค. 

 

 

 

 

 

โ‘ฅ  Time effects 


 

โ—ฏ   Time effects

 

•   ๊ฐœ๋ณ„ ์ˆ˜์ค€์— ๋Œ€ํ•ด ๊ณ ์ •ํšจ๊ณผ๋ฅผ ์ˆ˜ํ–‰ํ•œ ๊ฒƒ์ฒ˜๋Ÿผ ์‹œ๊ฐ„ ์ˆ˜์ค€์— ๋Œ€ํ•ด์„œ๋„ ๊ณ ์ •ํšจ๊ณผ๋ฅผ ์„ค๊ณ„ํ•  ์ˆ˜ ์žˆ๋‹ค. 

•   ์‹œ๊ฐ„ ๋”๋ฏธ๋ฅผ ์ถ”๊ฐ€ํ•˜๋Š” ๊ฒƒ์€ ๊ฐ ๊ธฐ๊ฐ„๋™์•ˆ ๊ณ ์ •๋˜๋Š” ๋ณ€์ˆ˜๋“ค์— ๋Œ€ํ•ด ํ†ต์ œํ•  ์ˆ˜ ์žˆ์ง€๋งŒ ์‹œ๊ฐ„์ด ์ง€๋‚จ์— ๋”ฐ๋ผ ๋ฐ”๋€” ์ˆ˜ ์žˆ๋‹ค. 

•  ์ธํ”Œ๋ ˆ์ด์…˜์€ ์‹œ๊ฐ„์ด ์ง€๋‚จ์— ๋”ฐ๋ผ ๊ธ‰์—ฌ๋ฅผ ์ฆ๊ฐ€์‹œํ‚ฌ ์ˆ˜ ์žˆ์œผ๋ฏ€๋กœ, ๊ฒฐํ˜ผ๊ณผ ๊ธ‰์—ฌ ์‚ฌ์ด์— ๊ธ์ •์ ์ธ ์—ฐ๊ด€์„ฑ์ด ์žˆ๋Š” ๊ฒƒ์€ ๋‹จ์ˆœํžˆ ์‹œ๊ฐ„์ด ์ง€๋‚จ์— ๋”ฐ๋ผ ๋‘ ๊ฐ€์ง€ ๋ณ€์ˆ˜๊ฐ€ ๋ชจ๋‘ ์ฆ๊ฐ€ํ•˜๊ธฐ ๋•Œ๋ฌธ์ผ ๊ฒƒ์ด๋‹ค. ํ•ด๋‹น ๊ต๋ž€ํšจ๊ณผ๋ฅผ ๋ณด์ •ํ•˜๊ธฐ ์œ„ํ•ด ๊ฐ ๊ธฐ๊ฐ„์— ๋Œ€ํ•œ ๋”๋ฏธ ๋ณ€์ˆ˜๋ฅผ ์ถ”๊ฐ€ํ•  ์ˆ˜ ์žˆ๋‹ค.  ํŒจํ‚ค์ง€ 'linearmodels'์—์„œ๋Š” ์ˆ˜์‹์— 'TimeEffects'๋ฅผ ์ถ”๊ฐ€ํ•˜๊ณ  'cluster_time'์„ true๋กœ ์„ค์ •ํ•  ์ˆ˜ ์žˆ์–ด์„œ, ๋งค์šฐ ๊ฐ„๋‹จํ•˜๊ฒŒ ํ•ด๊ฒฐ์ด ๊ฐ€๋Šฅํ•˜๋‹ค. 

 

mod = PanelOLS.from_formula("lwage ~ expersq+union+married+hours+EntityEffects+TimeEffects",
                            data=data.set_index(["nr", "year"]))

result = mod.fit(cov_type='clustered', cluster_entity=True, cluster_time=True) #๐ŸŸก
result.summary.tables[1]

 

โ†ช  ๊ฒฐํ˜ผ์ด ์ž„๊ธˆ์— ๋ฏธ์น˜๋Š” ์˜ํ–ฅ์ด '0.1147'์—์„œ '0.0476'์œผ๋กœ ํฌ๊ฒŒ ๊ฐ์†Œ. ๊ทธ๋ž˜๋„ ํ•ด๋‹น ๊ฒฐ๊ณผ๋Š” 99% ์‹ ๋ขฐ ์ˆ˜์ค€์—์„œ ์œ ์˜๋ฏธํ•˜๋ฏ€๋กœ ๋‚จ์ž๋Š” ์—ฌ์ „ํžˆ ๊ฒฐํ˜ผ์œผ๋กœ ์ธํ•œ ์ˆ˜์ž… ์ฆ๊ฐ€๋ฅผ ๊ธฐ๋Œ€ํ•  ์ˆ˜ ์žˆ๋‹ค.

 

 

 

 

 

โ‘ฆ  When panel data won't help you 


 

โ—ฏ   ํŒจ๋„ ๋ฐ์ดํ„ฐ์˜ ์ ‘๊ทผ์ด ์–ด๋ ค์šด ๊ฒฝ์šฐ 

 

•   ๋žœ๋ค ๋ฐ์ดํ„ฐ๋‚˜ ์ธ๊ณผ์ถ”๋ก ์„ ์œ„ํ•œ ๋งˆ๋•…ํ•œ ๋ฐฉ๋ฒ•์ด ์—†์„ ๋•Œ, fixed effects ๋Š” ๋น„์‹คํ—˜ ๋ฐ์ดํ„ฐ๋กœ ์ธ๊ณผ์ถ”๋ก ์„ ํ•  ๋•Œ๋งŒํผ ์„ค๋“๋ ฅ์ด ์กด์žฌํ•œ๋‹ค. ๊ทธ๋ž˜๋„ ์–ธ์ œ๋‚˜ ์ ์šฉ๋  ์ˆ˜ ์žˆ๋Š” ๋งŒ๋ณ‘ ํ†ต์น˜์•ฝ์€ ์•„๋‹ˆ๋‹ค. ํŒจ๋„ ๋ฐ์ดํ„ฐ์กฐ์ฐจ ๋„์›€์ด ๋˜์ง€ ์•Š๋Š” ์ƒํ™ฉ์ด ์žˆ๊ธฐ ๋งˆ๋ จ์ด๋‹ค. ๋ถ„๋ช…ํ•œ ๊ฒƒ์€ ์‹œ๊ฐ„์ด ์ง€๋‚จ์— ๋”ฐ๋ผ ๋ณ€ํ•˜๋Š” ๊ด€์ธก๋˜์ง€ ์•Š๋Š” ๊ต๋ž€๋ณ€์ˆ˜ (ex. ์ง€๋Šฅ) ๊ฐ€ ์žˆ์„ ๋•Œ์ด๋‹ค. ๊ณ ์ • ํšจ๊ณผ๋Š” ๊ฐ ๋Œ€์ƒ์˜ ์ผ์ •ํ•œ ์†์„ฑ์— ๋Œ€ํ•ด์„œ๋งŒ ํŽธํ–ฅ์„ ์ œ๊ฑฐํ•  ์ˆ˜ ์žˆ๋‹ค.

 

•   ๊ณ ์ • ํšจ๊ณผ๊ฐ€ ์‹คํŒจํ•˜๋Š” ๋˜ ๋‹ค๋ฅธ ๊ฒฝ์šฐ๋Š” ์—ญ์ธ๊ณผ๊ด€๊ณ„๊ฐ€ ์žˆ๋Š” ๊ฒฝ์šฐ๋‹ค. ์˜ˆ๋ฅผ๋“ค์–ด ๊ฒฐํ˜ผ์„ ํ•œ๋‹ค๊ณ  ํ•ด์„œ ์ˆ˜์ž…์ด ๋Š˜์–ด๋‚˜๋Š” ๊ฒƒ์€ ์•„๋‹ˆ๋ผ๊ณ  ๊ฐ€์ •ํ•ด๋ณด์ž. ์ˆ˜์ž…์ด ๋Š˜์–ด๋‚˜๋ฉด ๊ฒฐํ˜ผํ•  ํ™•๋ฅ ์ด ๋†’์•„์ง„๋‹ค. ์–‘์˜ ์ƒ๊ด€์„ฑ์ด ์žˆ๋Š” ๊ฒƒ์ฒ˜๋Ÿผ ๋ณด์ด์ง€๋งŒ ์ˆ˜์ž…์ด ๋จผ์ € ์„ ํ–‰๋˜์–ด์•ผ ํ•œ๋‹ค. ํ•ด๋‹น ๋ณ€์ˆ˜๋“ค์€ ์‹œ๊ฐ„์— ๋”ฐ๋ผ ๊ฐ™์€ ๋ฐฉํ–ฅ์œผ๋กœ ๋ณ€ํ•  ๊ฒƒ์ด๋ฏ€๋กœ, ๊ณ ์ • ํšจ๊ณผ๋กœ๋Š” ์‹œ๊ฐ„์— ๋ณ€ํ™”์— ๋Œ€ํ•œ ํ†ต์ œ๋ฅผ ํ•  ์ˆ˜ ์—†๋‹ค. 

 

 

 

 

 

 

 

728x90

๋Œ“๊ธ€