본문 바로가기

MySTATA/그래프 다루기

인구피라미드(population pyramid) 4.

인구 피라미드의 변화: 1960-1990-2020-2060, 한국

# 데이터 형태: 인구피라미드(population pyramid) 2. 

# 여러 연도의 인구 피라미드를 막대그래프로 그리면 특징이 분명하게 드러나지 않고 복잡하기만 함.

# 실제 코드문 

**1. 5세 간격 변수  
gen agez = int(age/5)*5, before(age)

*2. 각 연도별 인구수 변수(yr???? 형식임)를 5세단위로 합산 및 단위 변환 
foreach myvari of numlist 1960(1)2067 {
   by esthypo gender agez (age), sort: replace yr`myvari' = sum(yr`myvari')
   by esthypo gender agez (age), sort: replace yr`myvari' = yr`myvari'[_N]
   replace yr`myvari' = yr`myvari'/10000 if gender=="남자"
   replace yr`myvari' = -1*yr`myvari'/10000 if gender=="여자"
}
by esthypo gender agez (age), sort: keep if _n==1 // 연령대별 관측치 하나만 남김.

*3. agez 변수 값 라벨 생성 
lab def lbla 1000 "그냥"
forvalues ii = 0(5)95 {
   lab def lbla `ii' "`ii'~`=`ii'+4'세" , add 
}
   lab def lbla 100 "100세이상", add 
   lab val agez lbla 

*4. twoway문 단순화를 위해...  인용부호가 들어간 경우 이를 연결하기가 까다로움. 
gen mygnd = 1 if gender=="남자" 
replace mygnd=2 if gender=="여자"

**5. 중간에 흰공백 간격을 고려한 실제 값 변환  
loc ww = 20
foreach myvar of varlist yr* {
   replace `myvar' = `myvar' + `ww' if gender=="남자"
   replace `myvar' = `myvar' - `ww' if gender=="여자"
}

*6. 중간 흰공백으로 할 변수 
gen mywhite = `ww' if gender=="남자"    //  선을 가려줄 변수 
replace mywhite = - `ww' if gender=="여자" 

gen myzero = 0     // 가운데 축으로 사용할 변수 

by esthypo gender (agez age), sort: gen agegrp = _n   // 간격을 밀착되도록 

order agegrp, after(agez)

** x-라벨을 조정크기만큼 변환 ww
loc sname = ""  // xlabel 목록 
foreach mynum of numlist -270(50)-70   {
   loc mynum2 = abs(`mynum') - 20 
   loc sname = `"`sname' `mynum' "`mynum2' ""'  // 범례 목록 
}
loc sname2 = ""  // xlabel 목록 
foreach mynum of numlist 70(50)270   {
   loc mynum3 = `mynum' - 20 
   loc sname2 = `"`sname2' `mynum' "`mynum3' ""'  // 범례 목록 
}

** twoway-line 만들고 
loc glist = ""  // line-graph 목록
loc ii 0 
foreach cc of numlist 1960(30)2040 2067 {
   loc ii = `ii' + 3
   loc glist = "`glist' (connected agegrp  yr`cc' if mygnd==1, ms(none) lwidth(thick) lcolor(gs`=17-`ii''))"
   loc glist = "`glist' (connected agegrp  yr`cc' if mygnd==2, ms(none) lwidth(thick) lcolor(gs`=17-`ii''))" 

   // 값라벨 (연도를 식별하기 위한 라벨)

     capture: lab drop lbly`cc'
     lab def lbly`cc' `cc' "`cc'년"
     gen yrlab`cc':lbly`cc' = `cc'  
  } 


#delimit ; 
twoway     `glist' 
   (bar mywhite agegrp if gender=="남자", horizontal bcolor(white)  ) 
   (bar mywhite agegrp if gender=="여자", horizontal bcolor(white) ) 
   (scatter agegrp myzero if gender=="남자", msymbol(none) mlabel(agez) mlabcolor(black) mlabposition(0)) 
   /* 연도표시 */
   (scatter agegrp yr1960 if gender=="남자" & agez==0, msymbol(none) mlabel(yrlab1960) mlabcolor(black) mlabposition(0) mlabsize(small)) 
   (scatter agegrp yr1990 if gender=="남자" & agez==15, msymbol(none) mlabel(yrlab1990) mlabcolor(black) mlabposition(3) mlabsize(small)) 
   (scatter agegrp yr2020 if gender=="남자" & agez==45, msymbol(none) mlabel(yrlab2020) mlabcolor(black) mlabposition(3) mlabsize(small)) 
   (scatter agegrp yr2067 if gender=="남자" & agez==70, msymbol(none) mlabel(yrlab2067) mlabcolor(black) mlabposition(3) mlabsize(small)) 

   (scatter agegrp yr1960 if gender=="여자" & agez==0, msymbol(none) mlabel(yrlab1960) mlabcolor(black) mlabposition(0) mlabsize(small)) 
   (scatter agegrp yr1990 if gender=="여자" & agez==15, msymbol(none) mlabel(yrlab1990) mlabcolor(black) mlabposition(9) mlabsize(small)) 
   (scatter agegrp yr2020 if gender=="여자" & agez==45, msymbol(none) mlabel(yrlab2020) mlabcolor(black) mlabposition(9) mlabsize(small)) 
   (scatter agegrp yr2067 if gender=="여자" & agez==70, msymbol(none) mlabel(yrlab2067) mlabcolor(black) mlabposition(9) mlabsize(small)) 

if esthypo=="중위 추계(기본 추계: 출산율-중위 / 기대수명-중위 / 국제순이동-중위)" & inrange(agegrp,1,21) , 

yscale(off)      ylabel(minmax, nogrid) 
legend(off)     xlabel(`sname' -20 "0"   20 "0" `sname2', nogrid)
title("<여 자>                                         <남 자>", size(medium) ring(0)) 
scheme(white_cividis) ;

#delimit cr 

drop yrlab*