2014의 게시물 표시

자릿수가 다른 일련번호 다루기

// 국내 패널자료들을 보면, 각 연차별 데이터를 일련번호를 붙이는데 01 02 03 .... 10 11 12 .... 이런 경우 순차적으로 작업하기 루프문을 돌리려면 여간 까다롭지가 않다....ㅠㅠ 이럴때 한 번 사용해 보기를....ㅋ foreach ss in 01 02 03 04 05 06 07 08 09 10 11 12 13 14 15 {   di  "1을 곱한 결과 == `=`ss'*1'  ,  그렇지 않은 경우  `ss'    " } // 예를 들어,  01인 경우,   `=`ss'*1'  의   의미는  01*1=1 // 따라서 그 결과로 숫자 1을 받을 수 있다. (stata returns 1 ).... ㅋ // 별거 아닌거 같지만, 나름 유용할 듯....

STATA: Loop문의 중요성..

* 지금 아래의 코드처럼, 간혹 이렇게 길고 지루한 코드를 짜기 위해서 머리가 아픈 적은 누구나 있겠죠...  그 밑에 축약된 코드문이 있는데,.쭉 한 번 내려가 보도록 하죠, 내려가면서 그 규칙성을 한 번 생각해보면 좋아요!! ...gogo //28 replace income2031=0 if age_1999==28 //29 replace income2031=0 if age_1999==29 replace income2030=0 if age_1999==29 //30 replace income2031=0 if age_1999==30 replace income2030=0 if age_1999==30 replace income2029=0 if age_1999==30 //31 replace income2031=0 if age_1999==31 replace income2030=0 if age_1999==31 replace income2029=0 if age_1999==31 replace income2028=0 if age_1999==31 //32 replace income2031=0 if age_1999==32 replace income2030=0 if age_1999==32 replace income2029=0 if age_1999==32 replace income2028=0 if age_1999==32 replace income2027=0 if age_1999==32 //33 replace income2031=0 if age_1999==33 replace income2030=0 if age_1999==33 replace income2029=0 if age_1999==33 replace income2028=0 if age_1999==33 replace income2027=0 if age_1999==33 replace income2026=0 if age_1999==33 //34 replace income2031...

최근 연구 정보

1. Measuring Well-being and Progress     : OECD에서 최근 5-6년 전부터 주목하고 있는 주제 2. International Association for Research on Income and Wealth (IARIW)    http://www.iariw.org/  http://www.iariw.org/c2011oecd.php  2011 IARIW-OECD Conference on Economic Insecurity: Measurement, Causes, and Policy Implications  November 22-23, 2011

그래프 그리기 08:= 값라벨을 하나의 관측치에만 붙이기

이미지
// 단독직입적으로 시작합니다.... // 다음과 같은 자료가 있습니다. // 21개 등급(grd)별로 그 순위(gwon)가 있습니다. 여기서 보여지는 것은 한 개인만을 보여주고 있지만, 예를 들어 여러 명의 각 등급별 순위가 있는 그래프를 그리기 위한 것이 오늘 소개하는 내용입니다. 사실, 이러한 경우 범례(legend)를 이용하여 구분하는 것은 아래와 같이 매우 복잡합니다. 무슨 지하철 노선도 같네요...그게 아닌데 ㅠㅠ 그래서 각 관측치별로 값을 라벨로 넣어서 구분하는 방법도 있습니다... twoway  (connected gwon grd if model == "BASE" , sort mlabel(model) mlabp(12))  하지만, 이것도 여러 개를 그리면 너무 복잡해서리~~   twoway (connected gwon grd if model == "BASE" , sort mlabel(model) mlabp(12)) (connected gwon grd if model == "S1-21", sort mlabel(model)) ........ 그런데 이렇게 그리면 어떤가요?!!^.^  이렇게 하기 위해선 하나의 새로운 변수를 만듭니다. 이때, 21개 등급에 해당하는 관측치에만 값을 넣는게 핵심입니다. gen mymod = model if grd == 21 보시는 바와 같이, grd가 21인 경우에만 그래프의 라벨로 사용하고 싶은 값을 넣으면 됩니다.   그런다음, 다음과 같이 라벨로 쓸 변수로 새롭게 만든 변수를 이용하면 되죠^^ twoway   (connected gwon grd if model == "BASE", mlabel( mymod )  mlabp(3) sort)  (connected gwon grd if model == "S1-21", mlabel( ...

인용부호가 있는 목록 처리: 값라벨 매크로

// 목록을 처리할때, 가장(?) 어려운 것이 아마도 인용부호가 있는 경우일 것입니다. // 이러한 경우가 발생하는 경우는 스타타에서 값라벨이 여기에 해당합니다.      // 값라벨과 유사한 경우가 그래프의 레전드인데, 예전에 처리한 적이 있죠!!^^ // 여튼, 값라벨과 그래프의 레전드는 다음과 같은 형식입니다..   숫자1 "문자1" 숫자2 "문자2" ...... ==> 1 "임금" 2 "비임금" 3 "전체" ....... //다음과 같은 상황을 생각해 봅시다. // 값이 1 2 3 이 있는 변수 sim이 있는데  각각의 값라벨로 // 1일때, "모형1", 2일때 "모형2" 3일때 "모형3"을 설정해야하는 경우.... // 이런 경우 매크로를 짜봅시다....ㅋ   loc sname = ""   loc Model = "모형1 모형2 모형3"   loc ii 0   // 모델순번   foreach mysim of loc Model {     loc ++ii     loc sname = `"`sname' `ii' "`mysim'""'   // 이 부분이 어렵죠....ㅋ   }      // 이 루프가 끝나면, 목록이 만들어져 있을터이고, 그 목록을 확인하고 싶으면,  di `"`sname'"'      // 다음으로 그 목록을 값라벨로 설정해서, 변수 sim에 적용하고 싶다면....   lab def myname `sname'    // 여기서 위의 di `"`sname'"' 와 다르다는 것이 핵심..ㅋ   lab val sim myname 

파일목록 다루기

// 특정 폴더 안의 특정 혹은 모든 파일들의 목록을 구하거나 작업하고자 할때가 있죠.... // 물론, 모든 사람들이 그런 것은 아니지만....^^; // 아래의 syntax는 "D:\myfolder"라는 폴더 안에 Final_ 로 시작하는 모든 파일들의 이름들을 datafilez라는 로컬변수에 담으라는 말입니다. local datafilez: dir "D:\myfolder\" files "Final_*.dta" , respectcase  // dir 함수는 대소문자를 구분하지 못함. 그래서 respectcase이라는 옵션을 사용할 수 있습니다. di `"`datafiles'"'   // 이건 그 결과를 보여달라는 것이고.....  // 이 아래는 그 파일들을 모두 세로로 결합하라는 것입니다. clear foreach myfile of local datafiles {   di "`myfile'"   append using "D:\myfolder\\`myfile'" }

특정 문자열을 포함한 변수들만 처리하기

// 예를 들어, 이런 경우가 있죠... // e_k 라는 문자열이 들어간 변수는 모두 금액변수인데, 그 단위가 "원"인데, 이런 변수들을 모두 "만원"단위로 바꾸고 싶은 경우.. 일일히 그 변수를 찾아서 바꾸기 귀찮을때.... lookfor e_k   // 이렇게 실행하면, 그 결과, 정확하게는 변수목록을 스타타는 macros로 문자열로 반환함..... return list   // 요걸로 확인해도 되고... 여기서 확인해 보면, 매크로 이름은  r(varlist) loc mylist = r(varlist)    // 결과를 받아서 로컬로 지정하고..           if "`mylist'" == "." {  // 해당변수가 아주 없는 경우의 결과값....               di  "찾는 문자열을 포함한 변수가 없습니다."           }           else {        // 최소 1개 이상 있는 경우             foreach myitem of loc mylist {                 replace `myitem' = `myitem'/10000             }           } ~~ 끝...ㅋ 즐거운 여름 휴가를 보내시길....~~

데이터의 변수이름과 라벨을 받아서 목록으로 만들기

* 오늘은 내가 갖고 있는 데이터에 있는 변수명과 그 설명인 라벨을 하나의 목록으로 만드는 것을 해 보겠습니다. * 사실, 이것은 스타타 프로그램에서는 언제든 확인할 수 있는 것이기에 큰 필요성이 없어 보이지만, 가끔은 여러 개의 파일의 통합작업을 위해 필요한 경우가 있습니다. * 여튼 필요한 것 같으면 내용을 보시길~~ ㅋ // 먼저, 파일명이 mydata.dta // 그 안에 있는 변수로  var1 var2 var3 이 있다고 하자...(없으면 말고...ㅋ) // 변수라벨로 각각  변수하나, 변수둘, 변수셋 이라고 하자.... loc myvarname = ""   // 변수명 목록을 만들기 위한 loc myvarlabel = "" foreach vv of varlist  _all  {   // 위에서 포함된 변수를 알고 있지 못한 경우 모든 변수를 지정     loc mylab :   var lab `vv'     loc myvar = "`vv'"      // 이건 사실 불필요할 수도 있지만.....    loc myvarname = "`myvarname' `myvar'"    loc myvarlabel = "`myvarlabel' `mylab'" }    // 이러면 끝~~ // 확인해보고 싶죠...!! di  "`myvarname'" di "`myvarlabel'" // 이렇게 해서 만든 목록으로 필요한 곳에 뿌릴수도 있고, 어떤 작업을 할 수도 있겠죠!! // 참고로 변수의 저장유형을 목록으로 만들고자 한다면... loc mytype: type 변수명 // 포맷목록도 원한다면,,, loc myfmt: format 변수명   * 쉽죠 잉~~!

불규칙한 값들인 경우를 고려한 Loop 작업 1.

사실, 오늘 말할 것은 제목 뽑기가 가장 어려운 일이네요....그러니까 오늘 무엇을 할 것이냐하면, 예를 들어 이런 데이터와 작업이 있다고 하죠.... 한국, 중국, 미국의 기업매출 자료가 각각 세개의 파일로 나뉘어 있다. 한국은 1990년 10개 기업, 91년 20개 기업, 92년 30개 기업 중국은 90년 20개 기업, 91년 14개 기업 미국은 90년 10개, 91년 8개, 92년 30개, 93년 50개 기업 이때, 각 국가 파일별로 각연도별 매출액 평균액을 계산한다고 하자.. 당연히 이러한 작업은 각 연도별로 평균액을 계산하는 것은 루프문으로 작성하는 것이 효율적이다. 그러나 문제는 국가별로 시작연도는 같은데, 마지막 연도가 다르다는 점...이걸 어떻게 자동(?)으로 연동할까? 먼저, 한국파일을 열어서 아래의 실행문을 돌리면, 연도의 기초통계가 나올 것이고....     su year 스타타는 이러한 기초통계결과를 임시로 저장한다. 무엇을 저장하는지는 return list 를 실행해 보길.... 여튼 위와 같은 경우 실행한다고 가정하면, r(max) = 1992   이라는 부분이 있다...바로 이걸 이용하면 각 국가별 파일마다 마지막연도를 특정값으로 지정하지 않고 쓸 수 있다....     su year     forvalues yy = 1990(1)`r(max)' {        su  매출액변수 if year == `yy'     } 완전 자동화하려면, 3개의 파일을 append로 합치고  각 국가별 작업도 루프로 작성하면 됨. foreach cc in 한국 중국 미국 {     su year if countryname == "`cc'"     forvalues yy = 1990(1)`r(max)' {   ...

라벨 다루기: 라벨내 문자열 바꾸기: macro 활용

// 스타타를 사용하다보면, 새로운 변수들을 생성한다. // 또한 변수명은 축약해서 쓰지만, 변수가 의미하는 바를 구분하기 위해 라벨을 사용한다. // 오늘 해 볼 것은 기존 유사한 변수들에 대한 유사한 작업을 반복해서 하는 경우가 있다. // 이때, 새로운 변수들을 구분하기 위해 라벨을 붙이게 되는데, 기존 변수들의 라벨과 일부 문자만 다르고 내용은 동일한 경우 일일이 라벨문을 작성하는 것은 짜증나는 일이다. 왜냐면 단순작업이니까..... // 먼저, 다음과 같은 변수들이 이미 있다.      lab var rgn_base "납세지역(기초)"           lab var taxrev "세수(기초)"     lab var prn_all "납세인원(전체,기초)"     lab var prn_part "납세인원(세액>0,기초)"            gen rgn_larg = int(rgn_base/100)       // rgn_base는 총 네자리 숫자인데, 이중 앞의 두자리는 광역을 의미하는 코드이고, 뒤의 2자리는 기초지역을 의미하는 코드이다. 그래서 앞의 두자리를 떼내어  rgn_larg이라는 광역지역을 의미하는 변수를 새로 만들었다...      lab var rgn_larg "납세지역(광역)"         sort  rgn_larg    // 광역코드를 기준으로 정렬하고... // 기초단위의 세수,납세인원1,2변수의 합계값들에 대한 새로운 변수를 생성하고, 기초지역 관련 변수의 라벨에 있는 "기초"라는 문자를 "광역"으로 바꾸려고 한다....     foreach myvar of varlist taxrev...

그래프 그리기 07:= OECD 국가들의 개인소득세 최고세율의 변화: 1981~2010:= 막대그래프

이미지
아래의 그래프는 OECD 국가들의 개인소득세의 최고세율 변화(1981,1990,2000, 2010)를 보여주고 있는데요.... 와!! 대단하죠...예전에는 최고세율이 상당히 높았군요...근데 지금은 많이 떨어졌네요... 이것이 양극화의 원인일까요? 적어도 부분적으로는 그래 보입니다.... 여하튼 이것은 엑셀에서 작성한 것입니다.... 엑셀도 좋은 프로그램이죠..ㅋ 좀 더 구체적으로 말하면, 국가별로 4개 연도씩 묶어서 막대그래프를 그려야 하고, 평균치를 의미하는 선과, 화살표, 설명이 있습니다. Source: OECD(2012), "Trends in personal income tax and employee social security contribution schedules" // 동일한 데이터에 대해 스타타를 이용해서 작성한 것입니다. // 먼저,  국가별로 4개 연도씩 묶어서 막대그래프는 graph bar [ 각연도별 변수 ], over( groupbar ) 를 이용해 그립니다. #delimit ;   graph bar incometax1981  incometax1990 incometax2000 incometax2010  ,    over(country,gap(*2.5) label(angle(ninety) labsize(vsmall)) sort(incometax1981) descending)     ylabel(0(10)100, grid angle(horizontal) labsize(vsmall))      legend(order(1 "1981" 2 "1990" 3 "2000" 4 "2010") row(1) size(small) position(12) ring(0) region(lcolor(none)) fcolor(none) )   scheme(economist) ...

그래프 그리기 06:= 등탄력적 효용함수 그래프 그리기

이미지
// 스타타를 이용하여 일반 함수, 즉 y=x ,  y=x^2 + x + 3 와 같은 함수를 그리고 싶을때 // 오늘은 경제학에서 자주 사용되는 등탄력적 효용함수를 그려보도록 하겠습니다. 이때, 탄력도의 차이에 따른 함수 형태의 차이를 보고자 합니다. // 그리고 탄력도의 차이에 따른 함수에 따라 소득수준에 따른 한계효용의 변화 역시 비교합니다. // 등탄력적 효용함수의 일반적 형태...         // 이러한 효용함수의 특징은 소득수준에 따라 탄력도가 항상  ε 로 같다는 것입니다. // 즉,  ε 값에 따라 그 함수를 그리면 됩니다. // 함수를 그리는 기본적인 코드는 다음과 같습니다. twoway (function y = (x^(1-0) - 1)/(1-0),     range(0 5)     // ε=0일때, x값 범위를 0과 5로하여 그래프를 그리시오....    // 즉,  ε=0일때, 위 함수는 y=x-1이 됩니다...    // 이건 스타타 명령어 줄에서 아무런 자료가 없어도 그려집니다... 위의 function이라는 부분땜시...ㅋ // 여하튼,  ε 가 0 , 0.5, 1, 2, 5일때 각 함수를 하나의 그래프로 그리려면.... #delimit ; twoway (function y = (x^(1-0) - 1)/(1-0),     ra(0 5) lcolor(black) lwidth(medium) lpattern(solid))        (function y = (x^(1-0.5) - 1)/(1-0.5), ra(0 5) lcolor(blue) lwidth(medium) lpattern(solid))        (function y = (x^(1-1...

그래프 그리기 05:= EU-15 국가들의 GDP 대비 사회지출 비중과 사회지출 대비 사회보장기여금의 비중:= 4사분면 만들기

이미지
// 이번에 간단하게 그래프에 4사분면을 구획하는 방법입니다. // 이를 위해 사용한 자료는 2010년 기준  "EU-15 국가들의 GDP 대비 사회지출 비중과 사회지출 대비 사회보장기여금의 비중"입니다. // 이것은 국가별로 사회지출에 필요한 재원조달에 있어서 사회보장기여금(=사회보험료)이 어느 정도 역할하는가에 대한 국가간 비교를 통해  복지모델 유형화를 하거나 혹은 유형을 확인하는 것입니다. // 1999년 Bonoli가 처음 시도했다고 해서, 일명 "Bonoli Matrix"라고도 합니다. // 자, 보면, 중간에 선이 들어가 있는데, 이 선은 15개 국가들만의 평균값입니다.. 즉, 각 평균값을 기준으로 선을 그으면 4사분면이 생기죠....^^ // 변수: ser  (사회지출비중),  sc_se (사회지출 대비 사회보장기여금의 비중) #delimit ;  twoway (scatter ser sc_se , mlabel(wid) mlabposition(3)) if yr == 2010   , xlabel(3 61 , grid )   ylabel(23 33  , angle(horizontal))  xline(41.6 ,  lwidth(thick) lpattern(solid) lcolor(gs13) )  yline(26.9 ,  lwidth(thick) lpattern(solid) lcolor(gs13) )    ; // 보시면, 이해하실거란 생각해서 별 다른 설명은 하지 않겠습니다. // 다만, 2010년이 아니라 여러 연도에 대해서 동일한 그래프를 반복해서 그리고 싶죠?!^^ // 그러러면, 횡축과 종축의 최대값과 최소값, 그리고 각각의 평균값들을  로컬변수로 받아내서 반복문을 만들면 되겠죠!!

그래프 그리기 04:= 특정 시기에 음영 넣기:= OECD 국가들의 총조세와 사회지출이 GDP에서 차지하는 비중(1980~2012)

이미지
// 간혹, 아니 어찌보면 자주 그래프에 특정 시기를 음영으로 넣고 싶을 때가 있죠!! // 예를 들어, 각 정권 기간 동안 거시변수가 어떤 추이를 비교하거나, 특정 사건 전후로 달라지는 추이를 비교하는 경우...  // 오늘의 사례는 "2007년 금융위기 이후 OECD 국가들의 총조세와 사회지출이 GDP에서 차지하는 비중(1980~2012)"으로서, 2007년 금융위기 이후 기간을 음영으로 표시하는 것입니다.  // 먼저, 자료에 대한 간단한 설명을 하자면, // 기간은 1980~2012년 // 변수: 1) ser (복지지출 비중),  2) tax (총조세 비중) , 3) yr  (연도) , 4) country (국가명 및 OECD 평균) // 보통 두 시계열 변수에 대한 선그래프는 다음과 같이 하면 되죠... twoway     /// (line ser yr if country == "OECD - Total",lpattern(solid))  /// (line tax yr if country == "OECD - Total",lpattern(dash)) // 자 이제 여기에 음영을 넣어볼까요.... twoway /// (function y=26.9, range(2007 2013) recast(area) color(gs13) base(15.5) ) // 이게 무슨 말인가 하면, y=26.9 라는 직선을 그려라... 이때, x축의 범위는 2007~2013이고, 그래프는 영역형태이며  recast(area) ,  색깔은 회색이고, 최소값은 15.5이다. // 당연히 그리려는 그래프마다 바꿔줘야 하는 것은  26.9와 15.5라는 숫자이고, 기간 연도 역시 바꾸면 되겠죠... // 그런데 문제는 이렇게 음영을 그리면 회색영역이 생뚱맞게 있다는 점...그래서 회색영역에 눈금을 알 수 있는 선(grid)을 그어줘야 품질좋은 ...

pdf 문자 인식(OCR)

acrobat을 이용하면 대부분 pdf문서의 문자들을 인식하여(OCR기능), 한글, 워드 및 엑셀에서 유용하게 사용할 수 있다. 그러나, 종종 렌더링(rendering)문제가 생겨 문자를 인식하지 못하는 경우가 있다. 이때, 해결방법은 두 가지가 같다. 첫째, 1) pdf문서 인쇄 시 프린터를  microsoft XPS document writer로 인쇄해서 xps문서 만들기 2) xps문서를 pdf로 전환 3) 전환된 pdf문서에서 OCR 기능 실행하면  ~~ 끝!! 둘째, 1) pdf문서를 다른 이름으로 저장할 때, 그 형식으로 tif 혹은 tiff로 저장 2) 페이지별로 생성된 그림파일들을 pdf문서로 결합 3)결합된 pdf문서에서 OCR 기능 실행하면 ~~끝!! (다른 그림 파일들은 안됨!! 사실, 해보지는 않았음 ~ㅋ)