stata 와함께춤을 김병권 July 14, 2015
table of contents Chapter1 - STATA 화면구성 Chapter2 - 데이터를 STATA 로 Chapter3 - 체험삶의현장 ; OLS Chapter4 - 체험삶의현장 ; PANEL Chapter5 - 알면유용한 Chapter5-1, help and findit and google Chapter5-2, 가계소득계산 Chapter5-3, 루프 Chapter5-4, user-written 1
chapter1 - stata 화면구성
stata 화면구성 1 3
stata 화면구성 2 4
stata 화면구성 3-1 5
stata 화면구성 3-2 6
stata 화면구성 3-3 7
stata 화면구성 3-4 8
stata 화면구성 4-1 9
stata 화면구성 4-2 10
stata 화면구성5 11
시작전확인사항 STATA 로무언가를하기전확인및준비사항 do-file과작업폴더위치확인 작업폴더확인을안하면파일을분실할수있음 pwd와 cd cd 작업폴더 cd D:\etc\2015\stata_15s\example 12
chapter2 - 데이터를 stata 로
이상과현실 자료구성의시작, 하지만대다수의책에서다루지않음 STATA 전용 (.dta) 으로제공되는경우는큰문제가없으나 현실은스프레드시트 (.txt, csv), 엑셀 (.xlsx,.xls), SPSS(.sav) 등으로제공됨 경제분석을위한 STATA, 우석진 14
첫번째현실, 스프레드시트 스프레드시트 (txt, csv) 는보통 non-fixed 와 fixed 로구분 non-fixed 는각변수가구분자 (delimiter) 로구분된경우 구분자는다양한값이존재하며, 대표적으로콤마혹은탭이있음 (a) 콤마 (b) 15
첫번째현실, non-fixed csv 혹은엑셀은복사 - 붙여넣기도가능함 insheet [varlist] using filename [, options] 구분자콤마 : insheet using auto1 구분자콤마 : insheet using auto1.txt 구분자 : insheet using auto2.txt 구분자 : insheet using auto2.txt, delimiter( ) clear 16
두번째현실, fixed-format 경제활동인구조사등데이터의위치가미리정해져있는경우 000219320610021894000077593600001976470000212463 000319810513021981000005729000005986120000021093 000419161124021437000080242800004843950000489279 코드북을꼭함께받아야함 17
두번째현실, fixed-format infile using fixedformat.dct, clear 핵심은 fixedformat.dct, 딕셔너리파일 딕셔너리파일에데이터를불러오는데필요한규칙이포함 18
알고만가자, 엑셀 STATA12 에서부터기능을제공 import excel 파일주소, sheet( 시트명 ) firstrow clear import excel auto_excel.xlsx, sheet( sheet1 ) firstrow clear 19
이상 -stata 용데이터 dta 파일, STATA 에서저장하거나, Stattransfer 로변환한파일 use 파일명 use auto, clear 20
현실에맞서는 tip 원자료를불러오면, stata 에서저장하고시작하자 21
chapter3 - 체험삶의현장 ; ols
체험삶의현장 - (pooled)ols mincer equation 추정 자료불러오고 -> 다듬고, 대화하고 -> 회귀분석 (pooled)ols 목표는아래의추정식에대한회귀분석결과도출 ln (wage) = α + β 1 edu + β 2 exp + β 3 exp 2 + β 4 male + β 5 region + ϵ 23
체험삶의현장 - (pooled)ols do-file 을열고, 작업폴더위치를확인! 자료를불러오자! use wage_1980, clear 위의명령어로단년도자료를불러온것 다년도자료를불러와하나로만들어야함 24
체험삶의현장 - (pooled)ols 1 차년도 2 차년도 3 차년도 4 차년도 5 차년도 2 가지방법을사용가능함 아래로쌓는 append 명령어를이용 옆으로붙이는 merge 와모양을바꾸는 reshape 을이용 25
체험삶의현장 - (pooled)ols 아래로쌓는 append 를이용 append using 파일명 현재데이터파일명데이터 1 파일명데이터 2 파일명데이터 3 26
체험삶의현장 - (pooled)ols 먼저각년도데이터가잘쌓일수있도록손을봐야함 변수명을통일시켜야함 wage_1980.dta : wage1980 -> wage wage_1981.dta : wage1981 -> wage wage_1982.dta : wage1982 -> wage 27
체험삶의현장 - (pooled)ols 변수명변경은 rename rename 현재변수명새변수명 rename wage1980 wage rename nr1980 nr rename exper1980 exper rename hours1980 hours 28
체험삶의현장 - (pooled)ols rename *1980 * nr 1980 exper 1980 hours 1980 educ 1980 male 1980 wage 1980 occ 1980 -> nr exper hours educ male wage occ 29
체험삶의현장 - (pooled)ols 연도를식별할수있는변수생성하기 generate [type] newvar[:lblname] = exp [if] [in] generate 변수명 = 값 generate year = 1980 30
체험삶의현장 - (pooled)ols 다음년도작업을위해 1 차년도자료를저장 save 파일명 save temp1980 save temp1980, replace 31
체험삶의현장 - (pooled)ols 2 차년도자료를준비할차례 동일한형태의데이터임. 따라서절차와방법도동일함 자료불러오기 - 변수명변경 - 연도변수생성 32
체험삶의현장 - (pooled)ols 자료를아래쪽으로붙이는명령어 append append using 파일명 append using 파일명파일명 append using temp1980 temp1981 33
체험삶의현장 - (pooled)ols 파일이잘붙었나확인 샘플수를세는 count 변수의빈도수를보여주는 tabulate count tabulate year 34
자료와대화하기 데이터의외형을살펴보는 describe stata 변수종류는크게숫자, 문자로나뉨 간혹숫자인데문자로취급되는경우도있음 문자를숫자로변경시켜주는 destring destring hours, replace 반대는 tostring tostring 변수, replace tostring hours, generate(hours1) 35
keep & drop 남기고싶으면 keep 버리고싶으면 drop keep nr exper hours hours1 educ male wage region year occ 연근로시간이 4500 시간미만만남기고싶다면 keep if hours < 4500 drop occ 연근로시간 700 시간미만을버리고싶다면 drop if hours < 700 36
요약 : summarize 변수를요약해주는 summarize summarize sum sum wage sum wage, detail sum wage, de 37
자료와대화하기 : 조건문 if 조건에해당하는경우만걸러주는 if sum if male == 1 sum wage if hours > 1000 sum wage if hours < 1000, detail sum wage if hours < 1000, de 38
자료와대화하기 : tabulate 성별, 학력, 거주지, 종사상지위등 tabulate 변수 tabulate educ tabulate male tabluate male, nolabel tab educ male 39
자료와대화하기 : 조건문 if 조건에해당하는경우만살펴보는 if tabulate educ if male == 1 tab educ male if hours > 3000 40
분석에필요한변수를만들자 회귀분석을위한 2 개의변수생성 시간당임금, 로그시간당임금변수를생성 gen hwage = wage / hours gen ln_hwage = ln(hwage) 바이너리변수를만드는 2가지방법 gen exper_5 = 1 if exper > 5 replace exper_5 = 0 if replace ==. gen exper1_5 = (exper > 5) 41
변수에설명을넣는 label 변수에설명넣기 label 변수명 설명 label ln_hwage 로그시간당임금 label values 변수명레이블명 위의명령어를사용하기전에먼저레이블을정의해야함 label define cha 1980 1차 1981 2차 1982 3차 label values year cha label values year 42
자료와대화하기 : 그래프 - 히스토그램 histogram ln_wage 남성의임금분포만보고싶다면 histogram ln_hwage if male == 1 여성의임금분포만보고싶다면 hist ln_hwage if male == 0 43
자료와대화하기 : 그래프 - 히스토그램 그래프를저장하는옵션 saving( 파일명 ) hist ln_hwage if male == 1, saving(wage_m, replace) hist ln_hwage if male == 0, saving(wage_f) 44
자료와대화하기 : 그래프다듬기 45
자료와대화하기 : 두변수의관계를보자 scatter y 변수 x 변수 scatter ln_wage exper 히스토그램과마찬가지로그래프옵션을사용가능 46
자료와대화하기 : 그래프다듬기 47
자료와대화하기 : 이도저도귀찮을때 scheme default s1color ln_hwage 1 0 1 2 3 0 5 10 15 labor mkt experience ln_hwage 1 0 1 2 3 0 5 10 15 labor mkt experience ln_hwage 1 0 1 2 3 s2mono 0 5 10 15 labor mkt experience economist 1 0 5 10 15 labor mkt experience 3 2 1 0 ln_hwage 48
자료와대화하기 : 여러그래프를한장에 graph combine 으로여러그래프를한화면에배치 twoway 는여러그래프를겹쳐서보여주는방식 경우에따라 graph combine 이나 twoway 를이용 49
자료와대화하기 : 여러그래프를한장에 1 Density 0.2.4.6.8 1 1 0 1 2 3 ln_hwage Density 0.2.4.6.8 2 0 2 4 ln_hwage 50
자료와대화하기 : 여러그래프를한장에 1 graph combine 은저장된그래프를한그래프로그려줌 단, 그래프를먼저저장해야함 histogram ln_hwage if male == 1, saving(wage_m, replace) histogram ln_hwage if male == 0, saving(wage_f, replace) graph combine wage_m.gph wage_f.gph 51
자료와대화하기 : 여러그래프를한장에 1 이번에는 scatter 를저장, graph combine 으로한화면에 scatter ln_wage exper if male == 1, saving(wage_m, replace) msymbol(oh) scatter ln_wage exper if male == 0, saving(wage_f, replace) m(th) graph combine wage_m.gph wage_f.gph 52
자료와대화하기 : 여러그래프를한장에 1 ln_hwage 1 0 1 2 3 0 5 10 15 labor mkt experience ln_hwage 2 0 2 4 0 5 10 15 labor mkt experience 53
자료와대화하기 : 여러그래프를한장에 2 여러그래프를오버랩시키는명령어는 twoway 54
자료와대화하기 : 여러그래프를한장에 2 twoway (1 번그래프 ) (2 번그래프 ), 옵션 twoway /// (hist ln_hwage if male == 1, lcolor(gs13) color(gs13) ) /// (hist ln_hwage if male == 0, lcolor(black) lpattern(dash) lwidth(2) color(none)) ///, legend(off) graphregion(color(white)) 55
자료와대화하기 : 여러그래프를한장에 2 Density 0.2.4.6.8 1 1 0 1 2 3 ln_hwage 56
자료와대화하기 : 여러그래프를한장에 2 twoway (1 번그래프 ) (2 번그래프 ), 옵션 twoway /// (scatter ln_hwage exper if male == 1, msymbol(oh) mcolor(black) msize(4)) /// (scatter ln_hwage exper if male == 0, msymbol(th) mcolor(red) msize(1)) ///, graphregion(color(white)) legend(label(1 male ) label(2 female )) xtitle( mkt experience ) ytitle( log hourly wage ) 57
자료와대화하기 : 여러그래프를한장에 2 log hourly wage 2 0 2 4 0 5 10 15 mkt experience male female 58
자료와대화하기 : 여러그래프를한장에 2 59
결전! 회귀분석 데이터도완성하고, 요약과그래프로큰그림도봤으니, 회귀분석을할차례 ln (wage) = α + β 1 edu + β 2 exp + β 3 exp 2 + β 4 male + β 5 region + ϵ xi: regress ln_hwage edu exper expersq i.male i.region 60
결전! 회귀분석 61
결전! 회귀분석 xi: regress ln_hwage edu exper expersq i.male i.region outreg2 using regress.txt, replace br VARIABLES -1 ln_hwage educ 0.105*** [0.00873] exper 0.115*** [0.0227] expersq -0.00414* [0.00221] male -0.0439* [0.0251] Constant -0.0975 [0.120] Observations 1,635 R-squared 0.1 Standard errors in brackets *** p<0.01, ** p<0.05, * p<0.1 62
결전! 회귀분석 xi: regress ln_hwage edu exper expersq i.male outreg2 using regress.txt, replace br xi: regress ln_hwage edu exper expersq i.male i.region outreg2 using regress.txt, append br xi: regress ln_hwage edu exper expersq i.male i.region, vce(robust) outreg2 using regress.txt, append br 63
결전! 회귀분석 MS 워드로저장도가능함 xi: regress ln_hwage edu exper expersq i.male outreg2 using regress, replace br word xi: regress ln_hwage edu exper expersq i.male i.region outreg2 using regress, append br word xi: regress ln_hwage edu exper expersq i.male i.region, vce(robust) outreg2 using regress, append br word 64
post estimation 회귀분석후오차 (e i ) 혹은예측치 (ŷ i ) 를구하고싶은경우 예측치 : predict 변수명 오차 : predict 변수명, r predict yhat predict res list ln_hwage yhat res 65
chapter4 - 체험삶의현장 ; panel
1 년전, 2 년전, 3 년전... 패널혹은종단면자료는한대상을여러번관찰한자료 조세재정패널, 여성가족패널, 노동패널등 67
목표 이번챕터목표 OLS 로추정했던 mincer euqation 을패널모형으로추정 ln (wage) = α + β 1 edu + β 2 exp + β 3 exp 2 + β 4 male + β 5 region + ϵ 노동패널을이용, merge & reshape 을이용 68
merge & reshape Do-file 을열고, 작업폴더를확인 13 차자료 klips13p 를불러오기 use klips13p, clear 69
merge & reshape pid 13차 14차 15차 18970 19847 27167 35328 47855 49443 50888 56050 70411 79508 80841 83496 88601 90374 98277 데이터 데이터 데이터 70
merge & reshape 필요한변수만남기고 reshape 을위한정리 keep pid p131642 p131006 p131012 p131013 p130110 p130101 p130107 p130121 p130102 rename jobtype jobtype13 14 차자료를머지 merge m:m pid using klips14p, /// keepusing( jobtype p141642 p141006 p141012 p141013 p140110 p140101 p140107 p140121 p140102) 71
merge & reshape Result # of obs. not matched 81 from master 10 (_merge==1) from using 71 (_merge==2) matched 143 (_merge==3) 머지후에는꼭결과를유심히봐야함 not matched는 pid를기준으로한쪽에만데이터가있는경우 from master는기존 stata에불러와있던자료 from using은 merge로불러온자료 matched는양쪽데이터에모두있는경우 72
merge & reshape 다음머지를위해생성된변수 _merge 를드랍 & 변수명변경 drop _merge rename jobtype jobtype14 15 차데이터도머지 merge m:m pid using klips15p, /// keepusing( jobtype p151642 p151006 p151012 p151013 p150110 p150101 p150107 p150121 p150102) drop _merge rename jobtype jobtype15 73
merge & reshape reshape 을위한조건에맞춰변수이름을정리해야함 ID 가있고변수 1 숫자 1 변수 1 숫자 2 변수 1 숫자 3 가령, PID var13 var14 var15 rename p13* p*13 rename p14* p*14 rename p15* p*15 74
merge & reshape merge 한데이터는 wide-form reshape 을통해 long-form 으로변환 reshape long jobtype p0101 p0102 p0107 p0110 p0121 p1006 p1012 p1013 p1642 pa5102, i(pid) j(year) 75
merge & reshape long-form 으로데이터형태가바뀌었는지확인 list pid year p1642, sepby(pid) 76
merge & reshape 패널분석을위한데이터작업이끝남 여기서다룬방법은한가지예시에불과 panel_1.do 파일을열어서다른예를사용 방법이다소다르지만결과는같음 77
패널은 xt 와함께 패널용명령어는일반명령어에 xt 를붙임 xtdescribe, xtsummarize, xtregress 등 위명령어를사용하기위해서는먼저패널선언을해줘야함 xtset panelvar timevar xtset pid year 78
패널은 xt 와함께 패널데이터의패턴을보여주는 xtdescribe xtdes 79
패널은 xt 와함께 변수를요약해주는 xtsummarize xtsum xtsum hours 80
분석에필요한변수생성 ge hours = p1006 * 4 label var hours 월정규근로시간 drop if hours ==. xtsum hours ge hwage = p1642 hours label var hwage 시간당임금 drop if hwage ==. ge ln_hwage = ln(hwage) label var ln_hwage 로그시간당임금 rename p0107 age ge agesqr = age*age 81
패널은 xt 와함께 패널모형은 xtregress 와 fe, be, re 등옵션에따라바뀜 xi : reg ln_hwage age agesqr i.p0101 i.p0110 Between Effects xi : xtreg ln_hwage age agesqr i.p0101 i.p0110, be Random Effects xi : xtreg ln_hwage age agesqr i.p0101 i.p0110, re Fixed Effects xi : xtreg ln_hwage age agesqr i.p0101 i.p0110, fe 82
패널은 xt 와함께 xi : reg ln_hwage age agesqr i.p0101 i.p0110 outreg2 using panel.txt, replace br 83
패널은 xt 와함께 xi : xtreg ln_hwage age agesqr i.p0101 i.p0110, be outreg2 using panel.txt, append br 84
패널은 xt 와함께 xi : xtreg ln_hwage age agesqr i.p0101 i.p0110,re outreg2 using panel.txt, append br 85
패널은 xt 와함께 xi : xtreg ln_hwage age agesqr i.p0101 i.p0110, fe outreg2 using panel.txt, append br 86
chapter5 - 알면유용한
도와줘요헬프, 구글 help reshape stata 에내장된다소불친절한설명 findit outreg2 stata 와웹등에서해당하는부분을검색해줌 google 에서 stata 블라블라검색 88
가계소득계산 4 흔히패널은가구조사, 개인조사, 특별조사로이루어져있음 가계소득이주어지는경우도있지만개인별소득으로만이루어져있는경우가구데이터를불러와직접계산해야함 소비, 저축도마찬가지의경우 reshape, egen, merge, keep, drop, bysort, generate 을이용 89
가계소득계산 테크닉 1; 임의의가구원번호생성 bysort hhid15: gen famnum = _n prefix by 를사용하기위해서는먼저 sort 를사용해야함 bysort 는두명령어를한번에처리해줌 _n 은시스템변수 (system variables) 로순번을매겨줌 _N 은전체관측수를의미 90
가계소득계산 long form 에서 wide form 으로 reshape wide p151703, i(hhid15) j(famnum) 앞서임의로생성한가구원번호가 4 장패널분석에서 year 변수의역할을함 stata 는가로합계산은쉬우나세로합계산이어려움 91
가계소득계산 함수와 generate 명령어의콜라보레이션 egen labor_income_fam = rowtotal(p1517031-p15170310) rowtotal 은괄호안의변수들의합을계산하는함수 egen 사용시주의할점 egen 으로변수생성후필히의도한대로변수가생성되었는지확인 92
도전! ( 특정조건에해당하는 ) 가구원수계산 25 세미만자녀수, 근로소득이있는가구원수 실습 : 만 25 세미만가구원수를계산하시오 egen 함수는 rownonmiss 를사용 자료불러오기 - 필요한변수만남기기 - 조건에부합하는경우만남기기 - 임의의가구원번호생성 - reshape - egen - 확인 93
독이거나약이거나 잘쓰면노가다를줄일수있는 loop foreach, while 94
독이거나약이거나 loop 는같은명령어를반복해서적용시켜야할경우유용함 가령 10 개년패널데이터를동일하게만들거나 10 개년패널을불러계산해야하는경우 여기서핵심은같은명령어와반복임 A+B+C=D 를계산하다고가정하면 10 개년모두동일한변수를가지고계산 7 차년에는 B 변수가없다면꽝 이럴경우는 7 차년을불러와 B 변수를 0 의값을갖는변수로생성 95
독이거나약이거나 loop 문을잘짜는방법은 1 개년자료만가지고테스트후적용시키는것 1 차년에서잘작동했다면 10 개년에적용시키는것은상대적으로쉬움 앞서만들었던패널자료를 foreach 를이용해제작 자료를불러오고 - 필요한변수만남기고 - 변수명을변경 - 저장 96
독이거나약이거나 foreach num of numlist 10 11 12 13 14 15 { u klips num p, clear keep pid jobtype p num 1642 p num 1006 p num 1012 p num 1013 /// p num 0110 p num 0101 p num 0107 p num 0121 p num 0102 rename p num * p* num rename jobtype jobtype num sa temp num, replace } 97
독이거나약이거나 foreach num of numlist 10 11 12 13 14 15 { u klips num p, clear keep pid jobtype p num 1642 p num 1006 p num 1012 p num 1013 /// p num 0110 p num 0101 p num 0107 p num 0121 p num 0102 rename p num * p* num rename jobtype jobtype num sa temp num, replace } 98
독이거나약이거나 foreach num of numlist 1 3/6 8 10 { display num } foreach cha in aa bb cc dd { display cha } 99
user-written STATA 는유저들이제작한명령어를추가할수있음 앞서사용한 outreg2 가 user-written program 에해당함 여기서는 user-written 을찾는방법과그래프와관련된한가지프로그램을사용 user-written 을찾는방법은크게구글과지인으로나뉨 구글에서키워드를이용해검색하거나지인에게이런게있느냐고물어봐야함 100
user-written user-written을설치하는방법은 ssc install outreg2 ssc install oaxaca findit outreg2 101
user-written graph combine 인데 legend 를 1 개만사용하는 user-written 명령어는 grc1leg findit grc1leg 가장위에검색되는내용을클릭. (click here to install) 을눌러설치 102
user-written syntax 및사용방법은 graph combine 과동일 그래프여러개를그려저장한후 grc1leg 그래프 1.gph 그래프 2.gph 그래프 3.gph 학력별시간당임금 - 연령의 scatter 를 1 개그래프로 do-file grc1leg 을이용 103