概要
2020年の国勢調査の結果から,人口ピラミッドを作成する。データはe-statのAPIで取得可能。
- 年齢不詳の人口は無視(気になる場合は,不詳補完結果を用いると良い)。
- 人口ピラミッドはggplotだけで描き,追加のパッケージは使わない。
- 男女・年齢別人口のデータを整理して,男性については数値をマイナスにすることで,人口ピラミッドのグラフを作成する。
- 人口ピラミッドの作成には,pyramidsというパッケージを用いる方法もある。多分,そっちの方が簡単にできる。
コードと実行結果
── Attaching core tidyverse packages ──────────────────────── tidyverse 2.0.0 ──
✔ dplyr 1.1.4 ✔ readr 2.1.5
✔ forcats 1.0.0 ✔ stringr 1.5.1
✔ ggplot2 3.5.1 ✔ tibble 3.2.1
✔ lubridate 1.9.3 ✔ tidyr 1.3.1
✔ purrr 1.0.2
── Conflicts ────────────────────────────────────────── tidyverse_conflicts() ──
✖ dplyr::filter() masks stats::filter()
✖ dplyr::lag() masks stats::lag()
ℹ Use the conflicted package (<http://conflicted.r-lib.org/>) to force all conflicts to become errors
このサービスは、政府統計総合窓口(e-Stat)のAPI機能を使用していますが、サービスの内容は国によって保証されたものではありません。
# e-statのappIDが必要
# 利用申請(無料)をすればだれでも入手できる
# appID = "入手したappIDをここに設定(行頭の#を外す)"
# e-statからデータ取得 statID 0003445133
# 国勢調査 令和2年国勢調査 人口等基本集計
# (主な内容:男女・年齢・配偶関係,世帯の構成,
# 住居の状態,母子・父子世帯,国籍など)
# 表番号2-1-1
# 男女,年齢(各歳),国籍総数か日本人別人口
# -全国,都道府県,21大都市,特別区,人口50万以上の市
estat_census2020 <- estat_getStatsData(
appId = appID,
statsDataId = "0003445133",
cdCat01 = "0", # 総人口
cdCat02 = c("1", "2"), # 男・女
cdArea = "00000" # 全国
)
Fetching record 1-240... (total: 240 records)
# 人口ピラミッドを描くためのデータの整理
pop2020 <- estat_census2020 %>%
filter(str_detect(cat03_code, "00[1-9]|0[1-9][0-9]|100|R6")) %>%
mutate(
cat03_code = str_replace(cat03_code, "R6", "101"), # 100歳以上は100歳に
age = as.numeric(cat03_code) - 1,
value =case_when(
`男女` == "男" ~ -value / 1000, # 男性の人口はマイナス(人口ピラミッドを描くため)
`男女` == "女" ~ value / 1000 # 人口は1000人単位に
)
) %>%
select(age, `男女`, value)
# 人口ピラミッドの描画
pop2020 %>%
ggplot(aes(x = age, y = value, fill = `男女`)) + # x軸に年齢,y軸に人口をとり性別で塗り分け(縦横は入れ替える)
geom_bar(stat = "identity", color = "black") +
scale_x_continuous(n.breaks = 10) +
scale_y_continuous(
breaks = seq(-1000, 1000, 500),
labels = abs(seq(-1000, 1000, 500))
) +
scale_fill_hue(name = "", labels = c("F" = "女", "M" = "男")) +
labs(y = "人口(単位:1,000人)", x = "年齢") +
coord_flip() # グラフの回転 (縦軸と横軸の入替)