人口ピラミッド

wpp2015,ggplot2,gganimate,scales,reshape2 パッケージ

(過去の記事)
世界人口統計

国名、国コードは
ISO 3166-1

日本の人口ピラミッド

wpp2015 パッケージからデータを読み込む

1
2
3
4
5
6
7
8
9
library(wpp2015) #国際連合「2015年版の世界の人口統計」
library(scales)
library(ggplot2)
library(reshape2)
#
#wpp2015パッケージから年齢別人口データを読み込む
data(popM)
data(popF)
#head(popF,1)

kuni<-“Japan” の部分を変えることで人口ピラミッドを作成する国を変える

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
#国名もしくは国コードを指定(ここでは日本のデータを抜粋)
kuni<-"Japan"
#code<-392
#
#男性のデータ
popdataM<-subset(popM,country==kuni)
#popdataM<-subset(popM,country_code==code)
#確認
head(popdataM,1)
#
popdataM<-popdataM[,-c(1,2)]
popdataM$Gender<-rep("Male",nrow(popdataM))
#
#女性のデータ
popdataF<-subset(popF,country==kuni)
#popdataF<-subset(popF,country_code==code)
#確認
head(popdataF,1)
#country_codeで指定した場合に備えて
kuni<-popdataF$country[1]
#
popdataF<-popdataF[,-c(1,2)]
popdataF$Gender<-rep("Female",nrow(popdataF))
#
#データをつなげる
popdata<-rbind(popdataF,popdataM)
#
#wide -> long
popdata2<-melt(popdata,id.vars=c("age","Gender"),variable.name="year",value.name="Population",na.rm=TRUE)
#
#factorの順序付け(これをしないと年齢順に並ばない)
popdata2$age<- factor(popdata2$age,
levels=c("0-4","5-9","10-14","15-19","20-24","25-29","30-34","35-39","40-44","45-49",
"50-54","55-59","60-64","65-69","70-74","75-79","80-84","85-89","90-94","95-99","100+"))
#
#"Female"の人口データを負の値にする("Male"の反対側に棒グラフを作成するため)
for (i in 1:nrow(popdata2)){
if (popdata2$Gender[i]=="Female"){popdata2$Population[i] = -abs(popdata2$Population[i]) }
}
#
#"Male"と"Female"の人口の軸の最大値を2つのデータの最大値に等しくする
yl=max(abs(popdata2$Population))
#
#人口ピラミッド作成
#png(paste0("pop_",kuni,".png"),width=800,height=1000)
ggplot(popdata2,aes(x = age, y = Population, fill = Gender)) +
geom_bar(stat="identity", colour="black", position="identity")+
ylim(-yl,yl)+
coord_flip()+
scale_y_continuous(labels = abs)+
theme(legend.position = "bottom")+
facet_wrap(~year)+
ggtitle(paste("Population Pyramid of",kuni))
#dev.off()
#
#アニメーション作成
library(gganimate)
popdataanime<-ggplot(popdata2,aes(x = age, y = Population, fill = Gender,frame=year)) +
geom_bar(stat="identity", colour="black", position="identity")+
ylim(-yl,yl)+
scale_y_continuous(labels = abs)+
theme(legend.position = "bottom")+
coord_flip()
#
gg_animate(popdataanime,filename = paste0(kuni,"anime.gif"), title_frame = TRUE)

kuni<-“India” #インドに変更

インドの人口ピラミッド