2014. 5. 31.socialpharm.skku.edu/erp/erpmenus/lesson_pds/uploadfiles... · 2014-05-28 ·...

47
패널자료의 구조 데이터 관리 2014. 5. 31.

Upload: others

Post on 17-Jan-2020

21 views

Category:

Documents


0 download

TRANSCRIPT

패널자료의 구조 및 데이터 관리

2014. 5. 31.

STATA로 통계분석하기

2

Stata 프로그램의 파일 저장

• 주 실행 프로그램은 C:\Program Files\Stata10 폴더에 설치된다.

• 많은 명령어들이 C:\Program Files\Stata10\ado\base 폴더에 설치된 ado 파일로 정의된다.

• 업데이트 할 경우 새로운 ado 파일이나 수정된 파일이 C:\Program Files\Stata10\ado\update 폴더에 설치된다.

3

Stata 파일 종류

• .dta 파일: Stata 데이터 • .do 파일: 명령문 파일 • .ado 파일: 프로그램 • .sthlp 파일: 도움말 • .gph 파일: 그래프 • .txt 파일: 표준 ASCII 포맷 (일반 텍스트 파

일) • .scheme: 그래프 설정

4

명령어의 일반 구문 • [접두어:] 명령어 [변수 목록] [if] [in] [가중값] [, 옵션] • 명령어에 대한 온라인 도움말은 help 명령어를 사용하여 볼 수

있다. • 데이터셋에 있는 모든 변수를 선택할 경우 _all을 사용한다. • 명령문에 종속변수를 지정하는 경우, 변수 목록의 맨 앞에 위치

시킨다. • 숫자 목록은 줄여서 쓸 수 있는 숫자의 목록이다.

– 1(3)11은 1 4 7 10 을 의미한다. – 1/5는 1 2 3 4 5를 의미한다. – 예) 연령을 0-4, 5-14, 15-24, …, 75-84, 85+로 구분한 변수만들기 egen agegrp=cut(age), at(0 5(10)85 200) – 연령을 0-24, 25-44, 45+로 구분한 변수 만들기 recode age (0/24=1)(25/44=2)(45/max=3), generate(agegr)

5

명령어의 일반 구문 • if 한정어는 어떤 명령어가 적용될 관찰값을 선택하는

논리식에서 사용한다. keep if sex==1|age<=25

• in 한정어는 명령어가 적용될 관찰값을 선택하기 위해 사용한다. list sex age weight in 23 23번째 관찰값

• by 변수목록: 접두어를 이용하면 데이터를 여러 층으로 나누어 계산을 수행하고 결과를 출력한다. 반드시 데이터를 층을 이루는 변수로 미리 정렬시켜야 한다. sort sex by sex: summarize age height weight

6

명령어의 일반 구문 • do-파일과 ado-파일에 다음 세가지로 주석(comment)

를 적을 수 있다. – *로 시작하는 행 – /*과 */로 둘러싸인 텍스트 – //로 시작하는 텍스트

• do-파일과 ado-파일에 명령어가 한 줄에 끝나면 명령을 끝내기 위한 구분기호가 필요없다. ///을 입력하여 명령문이 다음 행에 계속됨을 지정할 수 없다.

• 결측값은 어떤 유효한 숫자보다 큰 값으로 취급된다.

7

변수명

• 변수 이름은 1-32 글자가 가능하다. (최대 10글자 이내로 붙이는 것이 바람직)

• 알파벳, 숫자, _(밑줄)은 변수 이름으로 사용 가능하다.

• 비영어권 문자는 사용이 불가능할 수도 있다.

• 변수 이름은 반드시 문자로 시작되어야 한다.

8

오류와 오류 메시지

• 대소문자 구별: STATA는 명령어, 변수에서 대소문자를 구별한다.

• 관계식 등호: 지식 등호(=)와 관계식 등호 (==)를 구별한다.

• 쉼표와 옵션: 쉼표 다음에 나오는 모든 것을 옵션으로 해석한다.

• 옵션 이름과 설명 사이의 빈칸: 옵션 이름과 이어지는 괄호 사이에 빈칸이 있으면 안된다.

9

Stata로 데이터 가져오기와 내보내기

• cd C:\docs\proj1 디렉토리를 변경한다. • use example1.dta 현재 디렉터리에 example.dta를

불러온다. • use c:\docs\proj1\example1.data • sysuse auto Stata 설치시 함께 설치된 데이터셋

불러오기 • webuse lwb.dta 인터넷에서 이용 가능한 데이터

셋 불러오기 • save example2.dta 현재 디렉터리에 example2.dt

a를 저장한다. • clear 메모리에 있는 데이터를 지운다.

10

데이터 입력하기

• 작은 데이터셋인 경우 input 명령어로 변수를 정의하고 값을 입력한다.

input case expose pop 0 0 100 0 1 30 1 1 21 end

11

엑셀데이타 가져오기

• 엑셀에서 데이터파일을 연다 • 엑셀 메뉴에서 [파일 > 다른 이름으로 저

장]을 선택한 후 파일형식 텍스트(탭으로 분리)를 선택한 후 저장한다.

• STATA 프로그램 메뉴바 [File > Import > ASCII data created by a spreadsheet]를 선택한다.

12

엑셀데이타 가져오기

13

엑셀데이타 가져오기

• 명령문을 사용하여 텍스트 파일을 불러들일 수 있다.

insheet using “c:\ejpark\stata\pharm.txt”, clear

• 명령문을 사용하여 엑셀 파일을 불러들일 수 있다. xmluse pharm.xml, doctype(excel) sheet(“sheet1”) firstrow

firstrow 옵션은 스프레드시트의 첫째 줄을 변수 이름으로 가져온다.

14

엑셀로 데이터 변환하기

xmslave pharm.xml, doctype(excel)

15

패널자료의 구조 및 데이터 관리

패널자료의 구조 • 패널구조는 기본적으로 같은 응답자가 여러 해에 걸쳐

서 반복적으로 응답을 한 것을 기록한 구조이다. • 개인식별자(ID)를 중심으로 해서 연간 자료가 붙어있

는 모습을 갖는다.

17

패널데이터의 정렬

• 패널분석을 하기전 tsset, xtset을 사용하여 데이터를 정렬한다. – tsset 패널변수명(개체) 시간변수명(시간) – xtset 패널변수명 시간변수명

☼ xtset 다음에 오는 패널변수는 반드시 숫자변

수이어야 한다. ☼ 문자변수 → 숫자변수: encode ☼ 숫자변수 → 문자변수: decode

18

use P_data1_1

tsset state_code year

panel variable: state_code (strongly balanced) time variable: year, 1970 to 2000, but with gaps delta: 1 unit xtset state_code year

panel variable: state_code (strongly balanced) time variable: year, 1970 to 2000, but with gaps delta: 1 unit encode state, gen(state_code1)

label list

state_code1: 1 CT 2 MA 3 ME 4 NH 5 RI 6 VT decode state_code1, gen(state1)

19

패널데이터의 유형

• 균형패널 vs. 불균형패널 – 균형패널: 각 개체의 데이터 포괄기간이 서로

동일한 경우 – 불균형패널: 각 개체의 데이터 포괄기간이 서

로 동일하지 않은 경우

• 시간갭(time gap)이 있는 패널 vs. 시간갭이 없는 패널

20

시간갭이 없는 균형패널

use P_data1_2

tsset state_code year

panel variable: state_code (strongly balanced) time variable: year, 1970 to 1973 delta: 1 year

21

시간갭이 있는 균형패널 use P_data1_1 tsset state_code year panel variable: state_code (strongly balanced) time variable: year, 1970 to 2000, but with gaps delta: 1 unit *시간갭이 없는 데이터로 인식 by state_code, sort: gen time=_n tsset state_code time

panel variable: state_code (strongly balanced) time variable: time, 1 to 4 delta: 1 unit

22

시간갭이 없는 불균형패널

use P_data1_3

tsset state_code year

panel variable: state_code (unbalanced) time variable: year, 1970 to 1973 delta: 1 year

23

시간갭이 있는 불균형패널

use P_data1_4

tsset hhid year

panel variable: hhid (unbalanced) time variable: year, 2000 to 2006, but with gaps delta: 1 unit

24

시간변수 생성

25

use P_data2_1 /* 시간변수(연도, year) 생성*/ by company, sort: gen year=1929+_n /* 시간변수(분기, quarter) 생성*/ by company, sort: gen quarter=yq(1929,4)+_n format quarter %tq /* 시간변수(월별, monthly) 생성*/ by company, sort: gen month=ym(1929, 12)+_n format month %tm /* 시간변수(일별, daily) 생성*/ by company, sort: gen day=mdy(12,31, 1929)+_n format day %td

시간변수 생성

26

use P_data2_1 /* 시간갭이 있는 시간변수 생성 */ by company, sort: gen year2=1920+10*_n

시간변수 주기변환

27

구분 STATA 명령어

일별주기 → 월별주기 mofd( )

일별주기 → 분기별주기 qofd( )

일별주기 → 연도별주기 yofd( )

월별주기 → 일별주기 dofm( )

분기별주가 → 일별주기 dofq( )

연도별주기 → 일별주기 dofy( )

시간변수 주기변환

28

use P_data2_2 /* 일별주기 -> 월별주기 */ gen dm=mofd(date) format dm %tm /* 월별주기 -> 일별주기 */ gen day1=dofm(dm) format day1 %td /* 월별주기 -> 분기별주기 */ gen mq=qofd(dofm(dm)) format mq %tq

시간변수 주기변환: 데이터 주기변환

29

use P_data2_2 /* 일별 데이터 -> 월평균 데이타 */ gen dm1=mofd(date) format dm1 %tm collapse (mean) dowclose, by(dm1)

시간변수 주기변환: 데이터 주기변환

30

/* 월별 데이터 -> 분기별 합산 데이터 */ use P_data2_3, clear gen m_q=qofd(dofm(month)) format m_q %tq collapse (sum) invest mvalue /// kstock, by(company m_q)

시간변수 주기변환: 시간변수 관리

31

use P_data2_4, clear /* 시간변수의 연월일 분리 */ gen date1=dofm(dm) /* 월별주기 -> 일별 주기 */ format date1 %td gen year1=year(date1) * 시간변수의 연월일 분리는 오직 일별주기에서만 가능 gen month1=month(date1) gen day1=day(date1) /* 년, 월, 일로 분리된 시간변수 하나로 합치기 */ gen date2=mdy(month1, day1, year1) format date2 %td /* 날짜에 해당하는 요일변수 만들기 */ gen week_d=dow(date1)

egen 명령어

32

ssc install egenmore use P_data2_2, clear /* 월의 첫째 날(1일)을 변수로 생성 */ egen bom1=bom(1, 1953) format bom1 %td /* 월을 첫째 날이 휴일이면 그 다음날을 변수로 지정 */ egen bom2=bom(2, 1953), work format(%td) /* 일별주기 시간변수의 월의 첫째 날을 변수로 생성 */ egen bom3=bomd(date), format(%td) /* 월의 첫째 날부터 날짜 세기 */ egen ela_bom=date-bom3

egen 명령어

33

/* 월의 마지막 날짜를 변수로 생성 */ egen eom1=eom(1, 1953), format(%td) /* 일별주기 시간변수의 월의 마지막 날을 변수로 생성 */ egen eom2=eomd(date), format(%td) /* 그 해의 1월 1일부터 날짜 세기 */ egen day1=dayofyear(date) /* 3월 1일부터 날짜 세기 */ egen day2=dayofyear(date), month(3)

egen 명령어

34

use P_data2_5, clear /* 각 시점까지의 최대값을 변수로 생성 */ egen maxtodate=record(invest), by(company) order(time) /* 각 회사의 최대값을 변수로 생성 */ by company, sort : egen float max1=max(invest) /* 각 시점까지의 최소값을 변수로 생성 */ egen mintodate=record(invest), by(company) order(time) min

시계열 연산자

35

• 시계열 연산자(operator) − 래그(lag, 과거값) − 리드(lead, 미래값) − 차분(difference)

use P_data2_6, clear /* 한국노동패널데이터, 가구용 패널자료 */ tsset hhid year panel variable: hhid (strongly balanced) time variable: year, 2000 to 2006 delta: 1 unit

시계열 연산자: lag

36

/* L 연산자를 사용하여 1기 래그(lag)값 만들기 */ gen total_income1=L.total_income /* [_n-1]을 사용하여 1기 래그(lag)값 만들기 */ by hhid, sort: gen total_income11=total_income[_n-1] /* L 연산자를 사용하여 2기 래그(lag)값 만들기 */ gen total_income2=L2.total_income /* [_n-1]을 사용하여 2기 래그(lag)값 만들기 */ by hhid, sort: gen total_income22=total_income[_n-2]

시계열 연산자: lead

37

/* F 연산자를 사용하여 1기 리드(lead)값 만들기 */ gen total_income3=F.total_income /* [_n+1]을 사용하여 1기 리드(lead)값 만들기 */ by hhid, sort: gen total_income33=total_income[_n+1]

시간갭이 있는 자료의 래그와 리드값 만들기

38

use P_data2_7, clear tsset hhid year panel variable: hhid (unbalanced) time variable: year, 2000 to 2006, but with gaps delta: 1 unit

시간갭이 있는 자료의 래그와 리드값 만들기

39

gen fin_asset1=L.fin_asset by hhid, sort: gen fin_asset11=fin_asset[_n-1] gen fin_asset2=F.fin_asset by hhid, sort: gen fin_asset22=fin_asset[_n+1] L 연산자는 해당년도의 값이 없을 경우 결측치로 처리하나 [_n+1]은 관측치가 있는 것 중에서 래그값을 취한다.

시계열 연산자: 차분

40

use P_data2_9, clear tsset company quarter panel variable: company (strongly balanced) time variable: quarter, 1930q1 to 1934q4 delta: 1 quarter

시계열 연산자: 차분

41

use P_data2_9, clear tsset company quarter /* D연산자를 사용하여 1차 차분(first-difference) 만들기 */ gen dinvest=D.invest /* [_n-1]을 사용하여 1차 차분 만들기 */ by company, sort: gen dinvest1=invest-invest[_n-1] /* D연산자를 사용하여 2차 차분(first-difference) 만들기 */ gen d2invest=D2.invest /* 계절 차분 만들기 */ gen s2invest=S2.invest

패널데이터 관리: xtdes

42

use P_data3_1 tsset hhid year panel variable: hhid (strongly balanced) time variable: year, 2000 to 2006 delta: 1 unit Xtdes hhid: 64, 113, ..., 5307 n= 142 year: 2000, 2001, ..., 2006 T= 7 (시간변수 관측개체 중 개수가 가장 긴 것이 7년) Delta(year) = 1 unit Span(year) = 7 periods (hhid*year uniquely identifies each observation) Distribution of T_i: min 5% 25% 50% 75% 95% max 7 7 7 7 7 7 7 Freq. Percent Cum. Pattern ---------------------------+--------- 142 100.00 100.00 1111111 ---------------------------+--------- 142 100.00 XXXXXXX

2000년에 데이터 값이 존재

패널데이터 관리: xtdes

43

use P_data3_2, clear tsset hhid year panel variable: hhid (unbalanced) time variable: year, 2000 to 2006, but with gaps delta: 1 unit xtdes hhid: 12, 64, ..., 6949 n = 306 year: 2000, 2001, ..., 2006 T = 7 Delta(year) = 1 unit Span(year) = 7 periods (hhid*year uniquely identifies each observation) Distribution of T_i: min 5% 25% 50% 75% 95% max 1 1 3 6 7 7 7 Freq. Percent Cum. Pattern ---------------------------+--------- 142 46.41 46.41 1111111 16 5.23 51.63 .111111 15 4.90 56.54 ....111 12 3.92 60.46 .....11 10 3.27 63.73 ......1 10 3.27 66.99 ...1111 10 3.27 70.26 1...... 7 2.29 72.55 11..... 6 1.96 74.51 ..11111 78 25.49 100.00 (other patterns) ---------------------------+--------- 306 100.00 XXXXXXX

306개 개체의 데이터 포괄기간을 오름차순 정렬시 한가운데 위치한 개체의 데이터 포괄기간이 6년임.

패널데이터 관리: xpattern

44

use P_data3_4, clear (NLS Women 14-24 in 1968) qui tsset idcode year xtdes idcode: 1, 2, ..., 10 n = 8 year: 70, 71, ..., 88 T = 12 Delta(year) = 1 unit Span(year) = 19 periods (idcode*year uniquely identifies each observation) Distribution of T_i: min 5% 25% 50% 75% 95% max 5 5 6 8 10 12 12 Freq. Percent Cum. | Pattern ---------------------------+--------------------- 1 12.50 12.50 | ..1....1..1..1.1.11 1 12.50 25.00 | .1.....11.1.11.1.11 1 12.50 37.50 | .111...11.1.11.1.11 1 12.50 50.00 | 11.....1..1.1...... 1 12.50 62.50 | 111..............11 1 12.50 75.00 | 111.......1.11.1.11 1 12.50 87.50 | 1111...1..1.1...... 1 12.50 100.00 | 1111...11.1.11.1.11 ---------------------------+--------------------- 8 100.00 | XXXX...XX.X.XX.X.XX

해당 시점에 관측개체가 전혀 존재하지 않음

패널데이터 관리: xpattern

45

use P_data3_4, clear (NLS Women 14-24 in 1968) findit xtpattern xtpattern, gen(pattern)

패널데이터 관리: xpattern

46

use P_data3_4, clear (NLS Women 14-24 in 1968) xtpattern, gen(pattern) egen byte tag1=tag(idcode) tab pattern if tag1==1

pattern Freq. Percent Cum. ..1.1.1.1111 1 12.50 12.50 .1..11111111 1 12.50 25.00 .11111111111 1 12.50 37.50 11..1.11.... 1 12.50 50.00 111.......11 1 12.50 62.50 111...111111 1 12.50 75.00 11111.11.... 1 12.50 87.50 111111111111 1 12.50 100.00 Total 8 100.00

패널데이터 관리: reshape

47

use P_data3_5, clear (NLS Women 14-24 in 1968) db reshape reshape long pop, i(state) j(year) * Stata에서 패널데이터분석을 위해서는 데이터 구조가 반드시 long type이어야 한다.