人口ピラミッドの作成 (2020年国勢調査)

概要

2020年の国勢調査の結果から,人口ピラミッドを作成する。データはe-statのAPIで取得可能。

  • 年齢不詳の人口は無視(気になる場合は,不詳補完結果を用いると良い)。
  • 人口ピラミッドはggplotだけで描き,追加のパッケージは使わない。
  • 男女・年齢別人口のデータを整理して,男性については数値をマイナスにすることで,人口ピラミッドのグラフを作成する。
  • 人口ピラミッドの作成には,pyramidsというパッケージを用いる方法もある。多分,そっちの方が簡単にできる。

コードと実行結果

library(tidyverse)
── 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
library(estatapi)
このサービスは、政府統計総合窓口(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() # グラフの回転 (縦軸と横軸の入替)