---
title: "Gerações no Brasil"
date: "2025-02-05"
categories: ["Demografia", "Mercado Imobiliário", "Brasil"]
description: "Quase metade dos brasileiros tem entre 12 e 43 anos, o maior contingente de jovens da história do país. Este fator demográfico, junto com a redução do tamanho das famílias deve sustentar a demanda imobiliária no país pelos próximos 15 a 20 anos. A educação e o acesso desigual a oportunidades. contudo, limitam esse ganho: um em cada cinco jovens não estuda nem trabalha."
image: "/static/images/art/hokusai-series-2026-09/insight-apartment-balconies.webp"
image-alt: "Ilustração de varandas e terraços em edifícios residenciais"
format:
html:
code-tools: true
toc: false # uma seção só; o painel "Nesta página" não ajuda
---
```{r}
#| label: setup
library(ggplot2)
library(dplyr)
library(stringr)
library(gt)
library(ekioplot)
library(gtExtras)
import::from(sidrar, get_sidra)
import::from(forcats, fct_reorder)
source(here::here("insights/posts/_ekio-style.R"))
```
```{r}
#| label: Import data
pop <- get_sidra(9514)
unemp <- get_sidra(6397, variable = 4099, period = "202202-202401")
```
```{r}
#| label: clean-pop
tbl_pop <- pop |>
as_tibble() |>
janitor::clean_names()
```
```{r}
#| label: classify-generations
codes <- 6558:6659
tbl_gen <- tbl_pop |>
filter(
forma_de_declaracao_da_idade == "Total",
idade_codigo %in% codes
) |>
select(sexo, idade, valor) |>
mutate(
age = as.numeric(str_remove(idade, "(ano$)|(anos$)|(anos ou mais$)")),
generation = case_when(
age < 12 ~ "Alpha",
age >= 12 & age < 28 ~ "Gen Z",
age >= 28 & age < 44 ~ "Millennial",
age >= 44 & age < 60 ~ "Gen X",
age >= 60 & age < 80 ~ "Boomers",
age >= 80 ~ "Elder"
),
generation = factor(generation),
generation = fct_reorder(generation, age)
)
ek_caption_pnad <- "Fonte: IBGE (PNADC/T) • EKIO"
ek_caption_censo <- "Fonte: IBGE (Censo, 2022) • EKIO"
```
```{r}
#| label: summarize-generations
gen_share <- tbl_gen |>
filter(sexo == "Total") |>
mutate(share = valor / sum(valor) * 100)
tbl_text <- gen_share |>
summarise(
age_min = min(age),
age_max = max(age),
share_total = sum(share),
total_pop = sum(valor),
.by = "generation"
) |>
mutate(
age_med = age_min + (age_max - age_min) / 2,
num_label = paste0(round(share_total, 1), "%")
)
```
```{r}
#| label: build-generation-chart
ekblue <- unname(ekioplot::ekio_pal("blue", n = 36))
palette <- ekblue[c(6, 10, 13, 16, 20, 26)]
p_col <- ggplot() +
geom_col(
data = gen_share,
aes(age, share, fill = generation),
color = "white",
width = 0.8
) +
geom_label(
data = tbl_text,
aes(x = age_med, y = 2.1, label = num_label, color = generation),
size = 4,
family = "Lato"
) +
geom_text(
data = tbl_text,
aes(x = age_med, y = 2.3, label = generation, color = generation),
size = 4,
family = "Lato"
) +
geom_segment(
data = tibble(x = tbl_text$age_max + 0.5, xend = x, y = 0, yend = 2),
aes(x = x, xend = xend, y = y, yend = yend),
color = "gray80",
linetype = 2
) +
scale_x_continuous(breaks = seq(0, 100, 10)) +
scale_y_continuous(
breaks = seq(0, 1.5, 0.5),
limits = c(NA, 2.3),
expand = expansion(c(0, 0.05))
) +
scale_color_manual(name = NULL, values = palette) +
scale_fill_manual(name = NULL, values = palette) +
guides(color = "none", fill = "none") +
labs(
title = "A maior geração de jovens do Brasil: Millennials e Gen-Z",
subtitle = str_wrap(
"Percentual da população por idade no Brasil. Apesar do envelhecimento populacional e queda na taxa de fecundidade, o Brasil tem cerca de 100 milhões de habitantes na faixa de 12 a 43 anos de idade.",
81
),
x = NULL,
y = "Participação (%)",
caption = ek_caption_censo
) +
theme_ekio_site()
```
```{r}
#| label: build-generation-table
tbl_generations <- tbl_text |>
mutate(
age_range = str_c(age_min, "-", age_max),
share_acum = cumsum(share_total),
total_pop = round(total_pop, -5)
) |>
select(generation, age_range, total_pop, share_total, share_acum)
gt_gen <- gt(tbl_generations) |>
tab_header(
title = "A última grande geração jovem do Brasil",
subtitle = "Estimativa populacional por grupo geracional: valores absolutos e relativos."
) |>
tab_footnote(
footnote = paste0(
ek_caption_censo,
". População arredondada para a centena de milhar mais próxima para facilitar a visualização. Valores de participação calculados a partir dos valores exatos."
)
) |>
cols_label(
generation = "Geração",
age_range = "Faixa etária",
total_pop = "População",
share_total = "Participação (%)",
share_acum = "Part. acumulada (%)"
) |>
fmt_number(3, decimals = 0, sep_mark = ".") |>
fmt_percent(4:5, scale_values = FALSE, dec_mark = ",", decimals = 1) |>
gt_theme_hokusai(stripe = TRUE, reversed = TRUE)
```
```{r, get_unemp_data}
tbl_unemp <- unemp |>
janitor::clean_names() |>
as_tibble() |>
mutate(
date = zoo::as.Date(zoo::as.yearqtr(trimestre_codigo, format = "%Y%q")),
age_group = str_remove(grupo_de_idade, "(anos$)|(anos ou mais$)"),
age_group = str_trim(age_group),
age_group = str_replace(age_group, " a ", "-"),
age_group = str_replace(age_group, "60", "60+"),
age_group = factor(
age_group,
levels = c("14-17", "18-24", "25-39", "40-59", "60+", "Total")
)
) |>
select(date, age_group, value = valor)
```
```{r, plot_unemp}
tbl_unemp <- tbl_unemp |>
filter(age_group != "14-17")
ekblue <- unname(ekioplot::ekio_pal("blue", n = 36))
ekred <- unname(ekioplot::ekio_pal("red", n = 36))
p_unemp <- ggplot(tbl_unemp, aes(date, value, color = age_group)) +
geom_line(linewidth = 0.8) +
geom_point() +
geom_label(
data = filter(tbl_unemp, date == max(date)),
aes(date, value, label = round(value, 1), color = age_group),
family = "Lato",
size = 3,
nudge_x = 25,
nudge_y = c(0.5, 0, -0.5, 0, 0),
show.legend = FALSE
) +
scale_y_continuous(labels = scales::label_percent(scale = 1)) +
scale_color_manual(
name = NULL,
values = c(
"18-24" = ekred[19],
"25-39" = ekblue[6],
"40-59" = ekblue[15],
"60+" = ekblue[24],
"Total" = ekblue[36]
)
) +
labs(
title = "Desemprego alto entre os jovens",
subtitle = "Taxa de desemprego trimestral por grupo de idade",
x = NULL,
y = NULL,
caption = ek_caption_pnad
) +
theme_ekio_site()
```
O Brasil está envelhecendo, assim como tantos outros países no mundo. A combinação do aumento consistente da expectativa de vida com as seguidas quedas na taxa de fecundidade vai, indubitavelmente, modificar a distribuição etária do país. O percentual de idosos na população vai aumentar, relativamente ao número de jovens e de adultos; além disso, a população, em termos absolutos, também deve começar a diminuir por volta da década de 2040.
Apesar dessa tendência, o quadro demográfico de hoje revela o maior contingente de jovens na história do país. Quase 100 milhões de pessoas, perto de metade da população, formam a Geração Z e a Geração Y (millennials), com idades entre 12 e 43 anos. Para o mercado imobiliário há duas consequências imediatas. A primeira, aproveitar a última onda do bônus demográfico, que forma a base da demanda imobiliária: os mais jovens formando famílias e comprando o sonho da casa própria. A segunda, ainda pouco explorada: adaptar o produto imobiliário ao público idoso.
```{r}
p_col
```
Os cortes de cada geração no gráfico acima seguem a definição da [Beresford Research](https://www.beresfordresearch.com/age-range-by-generation/), que adapta a classificação do [Pew Research Center](https://www.pewresearch.org/short-reads/2019/01/17/where-millennials-end-and-generation-z-begins/). Os dados vêm do [Censo de 2022](https://censo2022.ibge.gov.br/). Vale comentar que não há consenso sobre os anos de corte para delimitar uma geração da outra.
[{fig-align="center"}](https://www.pewresearch.org/short-reads/2019/01/17/where-millennials-end-and-generation-z-begins/)
Como afirmado anteriormente, esta deve ser a última grande geração jovem do Brasil, e o país precisa aproveitá-la economicamente. O envelhecimento da população vai elevar a razão de dependência, pressionando o sistema previdenciário que segue frágil, mesmo após a reforma. Com menos adultos em idade para trabalhar, o Brasil vai precisar produzir ganhos de produtividade para manter seu crescimento.
Os sinais do envelhecimento vão chegar antes nas cidades do Sul e do Sudeste, mas o Brasil inteiro deve passar pelo mesmo processo de transição demográfica.
```{r}
gt_gen
```
Entre os jovens brasileiros, porém, cresce o contingente que não trabalha nem estuda. Os números recentes da PNAD ainda mostram uma distância grande entre as taxas de desemprego por idade, sobretudo para a Geração Z, que chega agora ao mercado de trabalho.
```{r}
p_unemp
```
O IBGE, na [Síntese de Indicadores Sociais](https://agenciadenoticias.ibge.gov.br/en/agencia-news/2184-news-agency/news/38570-um-em-cada-cinco-brasileiros-com-15-a-29-anos-nao-estudava-e-nem-estava-ocupado-em-2023), mostra que 22,3% dos brasileiros de 15 a 29 anos não estudavam nem trabalhavam em 2022. São quase 11 milhões de jovens.
Um [relatório da OCDE](https://www.oecd-ilibrary.org/sites/3197152b-en/1/3/2/2/index.html?itemId=/content/publication/3197152b-en&_csp_=7702d7a2844b0c49180e6b095bf85459&itemIGO=oecd&itemContentType=book) também aponta uma parcela muito alta de nem-nem (jovens que não trabalham nem estudam) na faixa de 18 a 24 anos no Brasil. Esses jovens são majoritariamente negros, mulheres e de baixa renda, o que expõe o acesso desigual a oportunidades no país.
{fig-align="center"}
---
A oportunidade é grande, mas a janela é pequena. O componente demográfico deve sustentar a demanda imobiliária nos próximos 15 anos; mas o crescimento econômico do país e até a própria realização desta demanda imobiliária dependem também da inserção das novas gerações no mercado de trabalho. Transformar a maior geração jovem da história do país em compradores e inquilinos será o teste para colher os últimos frutos do bônus demográfico.
{{< include ../../_post-cta.qmd >}}