Este relatório apresenta uma análise exploratória e inferencial da pós-graduação stricto sensu brasileira entre 2021 e 2024, com base nos dados públicos da CAPES/Sucupira. Foram analisadas 28,977 entradas de cursos e 1,705,745 registros de discentes, distribuídos em cinco regiões e nove grandes áreas do conhecimento.
prop_ano <- cursos |>
count(ano_base, tipo_ies) |>
group_by(ano_base) |>
mutate(prop = n / sum(n),
label = scales::percent(prop, accuracy = 0.1)) |>
ungroup()
prop_ano |>
select(ano_base, tipo_ies, n, label) |>
pivot_wider(names_from = tipo_ies,
values_from = c(n, label)) |>
kableExtra::kbl(
caption = "Número e proporção de cursos por tipo de IES e ano",
col.names = c("Ano", "N Privada", "N Pública",
"% Privada", "% Pública")
) |>
kableExtra::kable_styling(
bootstrap_options = c("striped", "hover", "condensed")
)| Ano | N Privada | N Pública | % Privada | % Pública |
|---|---|---|---|---|
| 2021 | 1254 | 5907 | 17.5% | 82.5% |
| 2022 | 1217 | 5812 | 17.3% | 82.7% |
| 2023 | 1251 | 6048 | 17.1% | 82.9% |
| 2024 | 1271 | 6217 | 17.0% | 83.0% |
ggplot(prop_ano, aes(x = factor(ano_base), y = prop, fill = tipo_ies)) +
geom_col(position = "fill", width = 0.6) +
geom_text(aes(label = label),
position = position_fill(vjust = 0.5),
color = "white", fontface = "bold", size = 4) +
scale_y_continuous(labels = scales::percent_format()) +
scale_fill_manual(values = c("Pública" = "#2C7BB6", "Privada" = "#D7191C")) +
labs(title = "Proporção de cursos de pós-graduação stricto sensu",
subtitle = "Públicas × Privadas por ano (2021–2024)",
x = "Ano", y = "Proporção", fill = "Tipo de IES") +
theme_minimal(base_size = 13) +
theme(legend.position = "bottom")Proporção de cursos por tipo de IES (2021–2024)
prop_regiao <- cursos |>
count(regiao, tipo_ies) |>
group_by(regiao) |>
mutate(prop = n / sum(n),
label = scales::percent(prop, accuracy = 0.1))
ggplot(prop_regiao,
aes(x = reorder(regiao, prop), y = prop, fill = tipo_ies)) +
geom_col(position = "fill", width = 0.6) +
geom_text(aes(label = label),
position = position_fill(vjust = 0.5),
color = "white", fontface = "bold", size = 3.5) +
coord_flip() +
scale_y_continuous(labels = scales::percent_format()) +
scale_fill_manual(values = c("Pública" = "#2C7BB6", "Privada" = "#D7191C")) +
labs(title = "Proporção de cursos por região (acumulado 2021–2024)",
x = NULL, y = "Proporção", fill = "Tipo de IES") +
theme_minimal(base_size = 13) +
theme(legend.position = "bottom")Proporção de cursos por região
prop_area <- cursos |>
filter(!is.na(grande_area)) |>
count(grande_area, tipo_ies) |>
group_by(grande_area) |>
mutate(prop = n / sum(n),
label = scales::percent(prop, accuracy = 0.1))
ggplot(prop_area,
aes(x = reorder(grande_area, prop), y = prop, fill = tipo_ies)) +
geom_col(position = "fill", width = 0.6) +
geom_text(aes(label = label),
position = position_fill(vjust = 0.5),
color = "white", fontface = "bold", size = 3.5) +
coord_flip() +
scale_y_continuous(labels = scales::percent_format()) +
scale_fill_manual(values = c("Pública" = "#2C7BB6", "Privada" = "#D7191C")) +
labs(title = "Proporção de cursos por grande área do conhecimento",
subtitle = "Acumulado 2021–2024",
x = NULL, y = "Proporção", fill = "Tipo de IES") +
theme_minimal(base_size = 13) +
theme(legend.position = "bottom")Proporção de cursos por grande área
A pós-graduação stricto sensu brasileira é predominantemente pública. Em 2021, 82,5% dos cursos pertenciam a IES públicas, proporção que cresceu levemente até 83,0% em 2024, indicando uma leve retração da participação privada ao longo do período. A variação regional é expressiva: o Norte concentra 95,9% dos cursos em IES públicas, enquanto o Sul apresenta a maior participação privada (26,7%). Por área, Ciências Sociais Aplicadas destaca-se com 37,0% de cursos privados, reflexo do peso de programas de Administração, Direito e Economia nesse segmento.
q2_df |>
group_by(conceito) |>
summarise(
`Programas` = n(),
`Tempo médio (anos)` = round(mean(tempo_med_anos, na.rm = TRUE), 2),
`Tempo mediano` = round(median(tempo_med_anos, na.rm = TRUE), 2),
`Evasão média` = scales::percent(mean(taxa_evasao, na.rm = TRUE),
accuracy = 0.1),
`Evasão mediana` = scales::percent(median(taxa_evasao, na.rm = TRUE),
accuracy = 0.1),
.groups = "drop"
) |>
kableExtra::kbl(caption = "Indicadores por conceito CAPES") |>
kableExtra::kable_styling(
bootstrap_options = c("striped", "hover", "condensed")
)| conceito | Programas | Tempo médio (anos) | Tempo mediano | Evasão média | Evasão mediana |
|---|---|---|---|---|---|
| 3 | 3884 | 0.57 | 0.55 | 6.1% | 3.4% |
| 4 | 7142 | 0.60 | 0.58 | 4.4% | 3.0% |
| 5 | 4179 | 0.65 | 0.64 | 3.4% | 2.6% |
| 6 | 1646 | 0.67 | 0.66 | 3.0% | 2.2% |
| 7 | 1048 | 0.69 | 0.68 | 2.9% | 2.1% |
ggplot(q2_df |> filter(!is.na(tempo_med_anos)),
aes(x = factor(conceito), y = tempo_med_anos)) +
geom_boxplot(fill = "#4393C3", alpha = 0.7,
outlier.shape = 16, outlier.alpha = 0.3) +
stat_summary(fun = mean, geom = "point",
shape = 18, size = 3, color = "#D6604D") +
labs(
title = "Tempo médio de titulação por conceito CAPES",
subtitle = paste0("r = ", round(cor_tempo$estimate, 3),
" | p < 0,001"),
x = "Conceito CAPES",
y = "Tempo médio de titulação (anos)",
caption = "Losango vermelho = média"
) +
theme_minimal(base_size = 13)Tempo médio de titulação por conceito CAPES
ggplot(q2_df, aes(x = factor(conceito), y = taxa_evasao)) +
geom_boxplot(fill = "#D6604D", alpha = 0.7,
outlier.shape = 16, outlier.alpha = 0.3) +
stat_summary(fun = mean, geom = "point",
shape = 18, size = 3, color = "#2C7BB6") +
scale_y_continuous(labels = scales::percent_format(accuracy = 0.1)) +
labs(
title = "Taxa de evasão por conceito CAPES",
subtitle = paste0("r = ", round(cor_evasao$estimate, 3),
" | p < 0,001"),
x = "Conceito CAPES",
y = "Taxa de evasão",
caption = "Losango azul = média"
) +
theme_minimal(base_size = 13)Taxa de evasão por conceito CAPES
Existe relação estatisticamente significativa entre o conceito CAPES e ambos os indicadores analisados. Programas com conceito mais alto apresentam maior tempo médio de titulação (r = 0.152, p < 0,001), o que reflete maior exigência acadêmica. A relação com a taxa de evasão é negativa (r = -0.161, p < 0,001): programas mais bem avaliados retêm melhor seus alunos. Ambos os coeficientes são fracos em magnitude, o que é esperado em bases grandes, ou seja, a significância estatística não implica efeito prático forte, mas confirma tendências reais no sistema.
discentes |>
filter(modalidade %in% c("Acadêmico", "Profissional")) |>
group_by(modalidade) |>
summarise(
N = scales::comma(n()),
`Idade média` = round(mean(idade, na.rm = TRUE), 1),
`Idade mediana` = round(median(idade, na.rm = TRUE), 1),
`Tempo médio (anos)` = round(mean(tempo_titulacao_anos, na.rm = TRUE), 2),
`% Titulado` = paste0(round(mean(situacao == "Titulado") * 100, 1), "%"),
`% Evadido` = paste0(round(mean(situacao == "Evadido") * 100, 1), "%"),
`% Matriculado` = paste0(round(mean(situacao == "Matriculado") * 100, 1), "%"),
.groups = "drop"
) |>
kableExtra::kbl(caption = "Perfil discente por modalidade") |>
kableExtra::kable_styling(
bootstrap_options = c("striped", "hover", "condensed")
)| modalidade | N | Idade média | Idade mediana | Tempo médio (anos) | % Titulado | % Evadido | % Matriculado |
|---|---|---|---|---|---|---|---|
| Acadêmico | 1,422,194 | 34.2 | 32 | 0.63 | 20.2% | 3.7% | 76% |
| Profissional | 283,551 | 38.8 | 38 | 0.54 | 22.1% | 4.9% | 72.9% |
cores <- c("Acadêmico" = "#4393C3", "Profissional" = "#F4A582")
p1 <- discentes |>
filter(!is.na(idade),
modalidade %in% c("Acadêmico", "Profissional")) |>
ggplot(aes(x = idade, fill = modalidade)) +
geom_density(alpha = 0.6) +
scale_fill_manual(values = cores) +
labs(title = "Distribuição de idade",
subtitle = paste0("Wilcoxon p < 0,001"),
x = "Idade (anos)", y = "Densidade", fill = NULL) +
theme_minimal(base_size = 12) +
theme(legend.position = "bottom")
p2 <- discentes |>
filter(!is.na(tempo_titulacao_anos), tempo_titulacao_anos > 0,
modalidade %in% c("Acadêmico", "Profissional")) |>
ggplot(aes(x = tempo_titulacao_anos, fill = modalidade)) +
geom_density(alpha = 0.6) +
scale_fill_manual(values = cores) +
labs(title = "Tempo de titulação",
subtitle = paste0("Wilcoxon p < 0,001"),
x = "Anos", y = "Densidade", fill = NULL) +
theme_minimal(base_size = 12) +
theme(legend.position = "bottom")
p3 <- discentes |>
filter(situacao %in% c("Titulado", "Evadido", "Matriculado"),
modalidade %in% c("Acadêmico", "Profissional")) |>
count(modalidade, situacao) |>
group_by(modalidade) |>
mutate(prop = n / sum(n),
label = scales::percent(prop, accuracy = 0.1)) |>
ggplot(aes(x = modalidade, y = prop, fill = situacao)) +
geom_col(position = "fill", width = 0.6) +
geom_text(aes(label = label),
position = position_fill(vjust = 0.5),
color = "white", fontface = "bold", size = 4) +
scale_y_continuous(labels = scales::percent_format()) +
scale_fill_manual(values = c("Titulado" = "#2C7BB6",
"Matriculado" = "#ABD9E9",
"Evadido" = "#D7191C")) +
labs(title = "Situação discente por modalidade",
x = NULL, y = "Proporção", fill = "Situação") +
theme_minimal(base_size = 12) +
theme(legend.position = "bottom")
patchwork::wrap_plots(p1, p2, p3, ncol = 1)As diferenças entre modalidades acadêmica e profissional são estatisticamente significativas em todos os indicadores analisados (Wilcoxon, p < 0,001). Discentes profissionais são em média 4,6 anos mais velhos (38,8 vs 34,2 anos), reflexo do perfil de quem já está inserido no mercado de trabalho. O tempo médio de titulação é levemente menor nos programas profissionais (0,54 vs 0,63 anos), coerente com a natureza mais aplicada desses cursos. A taxa de evasão é ligeiramente maior no segmento profissional (4,9% vs 3,7%).
p1 <- ggplot(evolucao_cursos,
aes(x = ano_base, y = n_cursos,
color = regiao, group = regiao)) +
geom_line(linewidth = 1.2) +
geom_point(size = 3) +
scale_x_continuous(breaks = 2021:2024) +
scale_y_continuous(labels = scales::comma_format()) +
scale_color_manual(values = cores_regiao) +
labs(title = "Número de cursos por região",
x = "Ano", y = "Cursos", color = "Região") +
theme_minimal(base_size = 12) +
theme(legend.position = "bottom")
p2 <- ggplot(evolucao_discentes,
aes(x = ano_base, y = n_discentes,
color = regiao, group = regiao)) +
geom_line(linewidth = 1.2) +
geom_point(size = 3) +
scale_x_continuous(breaks = 2021:2024) +
scale_y_continuous(labels = scales::comma_format()) +
scale_color_manual(values = cores_regiao) +
labs(title = "Número de discentes por região",
x = "Ano", y = "Discentes", color = "Região") +
theme_minimal(base_size = 12) +
theme(legend.position = "bottom")
patchwork::wrap_plots(p1, p2, ncol = 1)variacao |>
arrange(desc(variacao_pct)) |>
mutate(variacao_pct = paste0(variacao_pct, "%"),
discentes_2021 = scales::comma(discentes_2021),
discentes_2024 = scales::comma(discentes_2024)) |>
kableExtra::kbl(
caption = "Variação no número de discentes por região (2021→2024)",
col.names = c("Região", "Discentes 2021", "Discentes 2024", "Variação (%)")
) |>
kableExtra::kable_styling(
bootstrap_options = c("striped", "hover", "condensed")
)| Região | Discentes 2021 | Discentes 2024 | Variação (%) |
|---|---|---|---|
| Norte | 23,608 | 26,821 | 13.6% |
| Nordeste | 82,376 | 90,103 | 9.4% |
| Centro-Oeste | 33,246 | 35,523 | 6.8% |
| Sudeste | 195,378 | 195,488 | 0.1% |
| Sul | 85,297 | 84,953 | -0.4% |
O período 2021–2024 revela uma tendência de descentralização da pós-graduação brasileira. Norte (+13,6%), Nordeste (+9,4%) e Centro-Oeste (+6,8%) registraram crescimento expressivo no número de discentes, enquanto Sudeste (+0,1%) e Sul (-0,4%) praticamente estagnaram. O volume absoluto ainda é dominado pelo Sudeste, mas o dinamismo está nas regiões historicamente menos atendidas, sugerindo expansão do acesso à pesquisa de pós-graduação no interior do país.
q5_df |>
arrange(desc(n_programas)) |>
mutate(
n_discentes = scales::comma(n_discentes),
tempo_medio = paste0(tempo_medio, " anos"),
taxa_evasao = paste0(taxa_evasao, "%"),
prop_estrangeiros = paste0(prop_estrangeiros, "%"),
discentes_por_programa = scales::comma(discentes_por_programa)
) |>
kableExtra::kbl(
caption = "Indicadores por grande área do conhecimento (2021–2024)",
col.names = c("Grande área", "Programas", "Discentes",
"Tempo médio", "Evasão", "Estrangeiros",
"Discentes/programa")
) |>
kableExtra::kable_styling(
bootstrap_options = c("striped", "hover", "condensed"),
font_size = 12
)| Grande área | Programas | Discentes | Tempo médio | Evasão | Estrangeiros | Discentes/programa |
|---|---|---|---|---|---|---|
| Multidisciplinar | 872 | 273,830 | 0.58 anos | 4.06% | 0.9% | 314.0 |
| Ciências Da Saúde | 755 | 251,285 | 0.65 anos | 2.46% | 1.29% | 332.8 |
| Ciências Humanas | 711 | 296,257 | 0.61 anos | 2.58% | 1.01% | 416.7 |
| Ciências Sociais Aplicadas | 676 | 243,925 | 0.6 anos | 3.79% | 0.81% | 360.8 |
| Engenharias | 473 | 172,367 | 0.56 anos | 6.51% | 1.92% | 364.4 |
| Ciências Agrárias | 450 | 121,735 | 0.67 anos | 4.03% | 2.29% | 270.5 |
| Ciências Exatas E Da Terra | 363 | 143,060 | 0.59 anos | 7.02% | 2.68% | 394.1 |
| Ciências Biológicas | 323 | 92,994 | 0.68 anos | 3.03% | 2.13% | 287.9 |
| Lingüística, Letras E Artes | 245 | 110,292 | 0.6 anos | 2.54% | 1.04% | 450.2 |
q5_heat <- q5_df |>
select(grande_area, tempo_medio, taxa_evasao,
prop_estrangeiros, discentes_por_programa) |>
mutate(across(where(is.numeric), ~ scale(.x)[, 1])) |>
pivot_longer(-grande_area, names_to = "indicador", values_to = "z")
ggplot(q5_heat, aes(x = indicador, y = grande_area, fill = z)) +
geom_tile(color = "white", linewidth = 0.5) +
geom_text(aes(label = round(z, 1)),
size = 3.5, fontface = "bold") +
scale_fill_gradient2(low = "#D73027",
mid = "white",
high = "#4575B4",
midpoint = 0,
name = "z-score") +
scale_x_discrete(labels = c(
"tempo_medio" = "Tempo\ntitulação",
"taxa_evasao" = "Taxa\nevasão",
"prop_estrangeiros" = "Prop.\nestrangeiros",
"discentes_por_programa" = "Discentes\npor programa"
)) +
labs(title = "Heatmap de indicadores por grande área",
subtitle = "Azul = acima da média | Vermelho = abaixo da média",
x = NULL, y = NULL) +
theme_minimal(base_size = 12) +
theme(panel.grid = element_blank(),
axis.text.x = element_text(hjust = 0.5),
legend.position = "right")Heatmap de indicadores por área (z-score)
As áreas diferem substancialmente em todos os indicadores. Ciências Biológicas e Ciências Agrárias lideram no tempo de titulação (0,68 e 0,67 anos), reflexo de pesquisas experimentais mais longas. Ciências Exatas e da Terra apresentam a maior taxa de evasão (7,02%), seguidas de Engenharias (6,51%). A internacionalização é maior em Ciências Exatas (2,68%) e Ciências Agrárias (2,29%). Linguística, Letras e Artes destaca-se pela maior densidade de discentes por programa (450), sugerindo programas maiores e mais abrangentes.
As análises revelam um sistema de pós-graduação em transformação. A predominância pública permanece estável, mas há sinais claros de descentralização regional. A qualidade dos programas, medida pelo conceito CAPES, associa-se positivamente ao tempo de formação e negativamente à evasão. As diferenças entre modalidades acadêmica e profissional são consistentes e significativas. Por fim, as áreas do conhecimento apresentam perfis bastante distintos, o que reforça a necessidade de políticas diferenciadas para cada segmento da pós-graduação brasileira.
## R version 4.6.0 (2026-04-24 ucrt)
## Platform: x86_64-w64-mingw32/x64
## Running under: Windows 11 x64 (build 26200)
##
## Matrix products: default
## LAPACK version 3.12.1
##
## locale:
## [1] LC_COLLATE=Portuguese_Portugal.utf8 LC_CTYPE=Portuguese_Portugal.utf8
## [3] LC_MONETARY=Portuguese_Portugal.utf8 LC_NUMERIC=C
## [5] LC_TIME=Portuguese_Portugal.utf8
##
## time zone: America/Fortaleza
## tzcode source: internal
##
## attached base packages:
## [1] stats graphics grDevices utils datasets methods base
##
## other attached packages:
## [1] broom_1.0.13 rstatix_0.7.3 patchwork_1.3.2 kableExtra_1.4.0
## [5] scales_1.4.0 janitor_2.2.1 lubridate_1.9.5 forcats_1.0.1
## [9] stringr_1.6.0 dplyr_1.2.1 purrr_1.2.2 readr_2.2.0
## [13] tidyr_1.3.2 tibble_3.3.1 ggplot2_4.0.3 tidyverse_2.0.0
##
## loaded via a namespace (and not attached):
## [1] sass_0.4.10 generics_0.1.4 xml2_1.5.2 stringi_1.8.7
## [5] hms_1.1.4 digest_0.6.39 magrittr_2.0.5 evaluate_1.0.5
## [9] grid_4.6.0 timechange_0.4.0 RColorBrewer_1.1-3 fastmap_1.2.0
## [13] jsonlite_2.0.0 backports_1.5.1 Formula_1.2-5 viridisLite_0.4.3
## [17] textshaping_1.0.5 jquerylib_0.1.4 abind_1.4-8 cli_3.6.6
## [21] rlang_1.2.0 withr_3.0.2 cachem_1.1.0 yaml_2.3.12
## [25] otel_0.2.0 tools_4.6.0 tzdb_0.5.0 vctrs_0.7.3
## [29] R6_2.6.1 lifecycle_1.0.5 snakecase_0.11.1 car_3.1-5
## [33] pkgconfig_2.0.3 bslib_0.11.0 pillar_1.11.1 gtable_0.3.6
## [37] glue_1.8.1 systemfonts_1.3.2 xfun_0.57 tidyselect_1.2.1
## [41] rstudioapi_0.18.0 knitr_1.51 farver_2.1.2 htmltools_0.5.9
## [45] labeling_0.4.3 carData_3.0-6 rmarkdown_2.31 svglite_2.2.2
## [49] compiler_4.6.0 S7_0.2.2