# 데이터 형태: 인구피라미드(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*
'MySTATA > 그래프 다루기' 카테고리의 다른 글
graph bar 정렬 문제 (0) | 2021.08.10 |
---|---|
텍스트 + 음영 넣기 (38개 국가 고령화 비교) (0) | 2021.08.09 |
인구피라미드(population pyramid) 3. (0) | 2021.08.04 |
인구피라미드(population pyramid) 2. (0) | 2021.08.04 |
인구피라미드(population pyramid) 1. (0) | 2021.08.04 |