Pirâmides Demográficas no R

Visualizando Estrutura Etária e de Gênero da População

Aprenda a criar pirâmides demográficas usando ggplot2 para visualizar estrutura populacional, fornecendo insights sobre tendências e padrões demográficos.
visualizacao-dados
ggplot2
demografia
dados-brasileiros
Autor

Equipe EKIO Academy

Data de Publicação

20 de janeiro de 2024

Introdução às Pirâmides Demográficas

Uma pirâmide demográfica é uma representação gráfica da distribuição etária e de gênero de uma população. Tipicamente mostra a população em barras horizontais, com homens representados à esquerda e mulheres à direita. Cada barra representa um grupo etário específico, e o comprimento da barra indica o número de pessoas naquele grupo.

As pirâmides demográficas são amplamente utilizadas em análises demográficas para visualizar a estrutura de uma população, fornecendo insights valiosos sobre tendências como crescimento populacional, envelhecimento e distribuição de gênero.

Essas pirâmides são cruciais para entender as dinâmicas socioeconômicas de um país, pois destacam as proporções de populações jovens versus idosas e revelam padrões relacionados a taxas de fertilidade, expectativa de vida e migração.

Ao analisar pirâmides demográficas, formuladores de políticas, empresas e pesquisadores podem tomar decisões informadas relacionadas à saúde, educação e planejamento da força de trabalho.

Pacotes Necessários

library(ggplot2)
library(dplyr)
library(tidyr)
library(stringr)
library(showtext)

# Opcional para melhor plotagem
font_add_google("Open Sans", "Open Sans")
showtext_auto()

Criação de Dados Exemplo

Como dados demográficos podem ser sensíveis ao acesso, criaremos dados amostrais realistas que demonstram os conceitos principais da criação de pirâmides demográficas:

# Criar dados demográficos amostrais para estrutura populacional tipo Brasil
set.seed(42)

create_demo_data <- function(country, year, pattern = "young") {
  # Grupos etários
  age_groups <- 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+")

  # Criar diferentes padrões populacionais
  if (pattern == "young") {
    # População jovem - país em desenvolvimento típico
    base_pop <- c(8.5, 8.2, 7.8, 7.5, 7.0, 6.8, 6.5, 6.2, 5.8, 5.5,
                  5.0, 4.5, 4.0, 3.5, 2.8, 2.0, 1.2, 0.7)
  } else if (pattern == "aging") {
    # População envelhecida - país desenvolvido
    base_pop <- c(4.5, 4.8, 5.2, 5.5, 5.8, 6.2, 6.8, 7.2, 7.5, 7.0,
                  6.5, 6.2, 5.8, 5.5, 5.0, 4.2, 3.0, 1.8)
  } else {
    # População balanceada
    base_pop <- c(6.5, 6.2, 6.0, 6.5, 7.0, 7.2, 7.0, 6.8, 6.5, 6.0,
                  5.5, 5.0, 4.5, 4.0, 3.5, 2.5, 1.5, 0.8)
  }

  # Adicionar variação aleatória
  male_pop <- base_pop + rnorm(length(base_pop), 0, 0.2)
  female_pop <- base_pop + rnorm(length(base_pop), 0, 0.2)

  # Garantir valores positivos
  male_pop <- pmax(male_pop, 0.1)
  female_pop <- pmax(female_pop, 0.1)

  # Criar data frame
  data.frame(
    country = country,
    year = year,
    age_group = rep(age_groups, 2),
    sex = rep(c("Male", "Female"), each = length(age_groups)),
    population = c(male_pop, female_pop)
  )
}

# Criar dados amostrais para diferentes países e anos
brazil_1990 <- create_demo_data("Brasil", 1990, "young")
brazil_2020 <- create_demo_data("Brasil", 2020, "balanced")
japan_2020 <- create_demo_data("Japão", 2020, "aging")

# Combinar dados
demo_data <- bind_rows(brazil_1990, brazil_2020, japan_2020)

# Processar os dados para plotagem da pirâmide
demo_data <- demo_data |>
  mutate(
    sex = case_when(
      sex == "Male" ~ "Masculino",
      sex == "Female" ~ "Feminino"
    ),
    sex = factor(sex, levels = c("Masculino", "Feminino")),
    age_group = factor(age_group, 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+"))
  ) |>
  group_by(country, year) |>
  mutate(
    share = population / sum(population) * 100,
    share = if_else(sex == "Masculino", -share, share)
  ) |>
  ungroup()

Pirâmide Demográfica Básica

Vamos começar com uma pirâmide populacional básica usando dados demográficos do Brasil de 1990. Cada barra mostra que porcentagem da população total pertence a um grupo etário e sexo específico.

A visualização é chamada de “pirâmide” devido à sua forma distintiva: larga na base (muitos jovens), gradualmente estreitando pelas idades médias (menos adultos) e menor no topo (muito poucos idosos). Esta forma triangular era típica da maioria dos países no passado e ainda é comum em nações em desenvolvimento.

# Filtrar dados para Brasil 1990
brazil_90 <- demo_data |>
  filter(country == "Brasil", year == 1990)

# Gráfico básico da pirâmide
ggplot(brazil_90, aes(x = age_group, y = share)) +
  geom_col(aes(fill = sex, color = sex)) +
  coord_flip() +
  guides(fill = "none", color = "none") +
  scale_y_continuous(
    breaks = seq(-8, 8, 2),
    labels = c("8", "6", "4", "2", "0", "2", "4", "6", "8")
  ) +
  labs(x = "Grupo Etário", y = "Participação da População (%)")

Pirâmide Melhorada com Cores e Rótulos

Vamos melhorar nossa pirâmide com melhores cores e rótulos explicativos. Para representação de gênero, usaremos verde para homens e roxo para mulheres, evitando estereótipos tradicionais enquanto garantimos que as cores sejam claramente distinguíveis e acessíveis.

colors <- c("#1B9E77", "#7570B3")  # Verde para homens, roxo para mulheres
font <- "Open Sans"

ggplot(brazil_90, aes(x = age_group, y = share)) +
  geom_col(aes(fill = sex, color = sex)) +
  coord_flip() +
  guides(fill = "none", color = "none") +
  geom_hline(yintercept = 0, color = "black", linewidth = 0.5) +
  annotate(
    "text",
    x = 16,
    y = -6,
    label = "Masculino",
    color = colors[1],
    family = font,
    size = 4,
    fontface = "bold"
  ) +
  annotate(
    "text",
    x = 16,
    y = 6,
    label = "Feminino",
    color = colors[2],
    family = font,
    size = 4,
    fontface = "bold"
  ) +
  scale_y_continuous(
    breaks = seq(-8, 8, 2),
    labels = c("8", "6", "4", "2", "0", "2", "4", "6", "8")
  ) +
  scale_color_manual(values = colors) +
  scale_fill_manual(values = colors) +
  labs(
    title = "Pirâmide Populacional do Brasil - 1990",
    x = "Grupo Etário",
    y = "Participação da População (%)"
  ) +
  theme_minimal(base_size = 12, base_family = font) +
  theme(
    panel.grid.minor = element_blank(),
    panel.grid.major.x = element_line(linetype = 2, color = "grey70"),
    plot.title = element_text(hjust = 0.5, size = 14, face = "bold")
  )

Comparação Temporal

Um dos usos mais poderosos das pirâmides demográficas é mostrar como a estrutura populacional muda ao longo do tempo. Vamos comparar o Brasil em 1990 versus 2020:

# Comparar Brasil ao longo dos períodos
brazil_comparison <- demo_data |>
  filter(country == "Brasil")

ggplot(brazil_comparison, aes(x = age_group, y = share)) +
  geom_col(aes(fill = sex, color = sex)) +
  coord_flip() +
  facet_wrap(~ year, labeller = label_both) +
  guides(fill = "none", color = "none") +
  geom_hline(yintercept = 0, color = "black", linewidth = 0.3) +
  scale_y_continuous(
    breaks = seq(-8, 8, 4),
    labels = c("8", "4", "0", "4", "8")
  ) +
  scale_color_manual(values = colors) +
  scale_fill_manual(values = colors) +
  labs(
    title = "Transição Demográfica do Brasil: 1990 vs 2020",
    x = "Grupo Etário",
    y = "Participação da População (%)",
    caption = "Note a mudança de uma população jovem (formato pirâmide) para uma estrutura mais balanceada"
  ) +
  theme_minimal(base_size = 12, base_family = font) +
  theme(
    panel.grid.minor = element_blank(),
    panel.grid.major.x = element_line(linetype = 2, color = "grey80"),
    plot.title = element_text(hjust = 0.5, size = 14, face = "bold"),
    strip.text = element_text(size = 12, face = "bold")
  )

Comparação Entre Países

Vamos comparar diferentes países para ver como as estruturas demográficas variam. Compararemos Brasil (balanceado) com Japão (população envelhecida):

# Comparar diferentes países em 2020
country_comparison <- demo_data |>
  filter(year == 2020)

ggplot(country_comparison, aes(x = age_group, y = share)) +
  geom_col(aes(fill = sex, color = sex)) +
  coord_flip() +
  facet_wrap(~ country) +
  guides(fill = "none", color = "none") +
  geom_hline(yintercept = 0, color = "black", linewidth = 0.3) +
  scale_y_continuous(
    breaks = seq(-8, 8, 4),
    labels = c("8", "4", "0", "4", "8")
  ) +
  scale_color_manual(values = colors) +
  scale_fill_manual(values = colors) +
  labs(
    title = "Comparação da Estrutura Populacional: 2020",
    x = "Grupo Etário",
    y = "Participação da População (%)",
    caption = "O Brasil mostra estrutura balanceada enquanto o Japão exibe padrão de população envelhecida"
  ) +
  theme_minimal(base_size = 12, base_family = font) +
  theme(
    panel.grid.minor = element_blank(),
    panel.grid.major.x = element_line(linetype = 2, color = "grey80"),
    plot.title = element_text(hjust = 0.5, size = 14, face = "bold"),
    strip.text = element_text(size = 12, face = "bold")
  )

Comparação por Sobreposição

Para uma comparação mais direta entre períodos, podemos sobrepor diferentes anos usando linhas e barras:

brazil_overlay <- demo_data |>
  filter(country == "Brasil")

breaks_share <- seq(-8, 8, 2)
labels_share <- c("8", "6", "4", "2", "0", "2", "4", "6", "8")

ggplot() +
  geom_col(
    data = filter(brazil_overlay, year == 2020),
    aes(age_group, share, fill = sex, color = sex),
    alpha = 0.8
  ) +
  geom_step(
    data = filter(brazil_overlay, year == 1990),
    aes(age_group, share, group = sex),
    color = "black",
    alpha = 0.9,
    linewidth = 1
  ) +
  coord_flip() +
  guides(fill = "none", color = "none") +
  scale_y_continuous(
    breaks = breaks_share,
    labels = labels_share
  ) +
  labs(
    title = "Evolução Demográfica do Brasil: 1990 → 2020",
    subtitle = "Linhas pretas mostram estrutura de 1990, barras coloridas mostram estrutura de 2020",
    x = "Grupo Etário",
    y = "Participação da População (%)"
  ) +
  scale_color_manual(values = colors) +
  scale_fill_manual(values = colors) +
  theme_minimal(base_size = 12, base_family = font) +
  theme(
    panel.grid.minor = element_blank(),
    panel.grid.major.x = element_line(linetype = 2, color = "grey80"),
    plot.title = element_text(hjust = 0.5, size = 14, face = "bold"),
    plot.subtitle = element_text(hjust = 0.5, size = 11)
  )

Trabalhando com Fontes de Dados Brasileiros

Para dados demográficos brasileiros reais, você pode usar várias fontes oficiais:

IBGE (Instituto Brasileiro de Geografia e Estatística)

O pacote {sidrar} fornece acesso ao sistema SIDRA do IBGE:

library(sidrar)

# Exemplo: População por grupos etários e sexo
# Tabela 6579 - Estimativas da população por sexo e grupos de idade
dados_populacao <- sidrar::get_sidra(
  api = "/t/6579/n1/all/v/9324/p/last%201/c2/all/c287/all"
)

Usando o Pacote geobr

O pacote {geobr} inclui alguns dados demográficos e pode ser combinado com informações do Censo:

library(geobr)

# Dados populacionais para municípios podem ser combinados com dados geográficos
# para criar mapas com informações demográficas
municipios <- read_municipality(year = 2020)

Principais Insights das Pirâmides Demográficas

Ao analisar pirâmides demográficas, procure por estes padrões principais:

  1. População Jovem (Formato Pirâmide): Base larga indica altas taxas de natalidade e baixa expectativa de vida
  2. População Envelhecida (Pirâmide Invertida): Base estreita com topo mais largo mostra declínio nas taxas de natalidade e aumento da longevidade
  3. População Estável (Formato Barril): Distribuição relativamente equilibrada entre grupos etários
  4. Bônus Demográfico: Pode indicar baby booms, padrões migratórios ou eventos históricos

Resumo

As pirâmides demográficas são ferramentas poderosas para visualizar estrutura populacional e entender tendências demográficas. Pontos principais:

  • Use esquemas de cores consistentes que evitem estereótipos de gênero
  • Considere comparações temporais e entre países
  • Técnicas de sobreposição podem mostrar efetivamente transições demográficas
  • Dados demográficos brasileiros estão disponíveis através do IBGE via pacote sidrar
  • Sempre forneça rótulos claros e contexto para suas visualizações

A mudança de formatos tradicionais de pirâmide para estruturas mais balanceadas ou até invertidas reflete transições demográficas globais e tem implicações importantes para planejamento de políticas, desenvolvimento econômico e serviços sociais.


Pronto para explorar mais visualizações de dados brasileiros? Confira nosso tutorial sobre Fontes de Dados Brasileiros ou aprenda sobre Mapas Interativos.