1. Introdução

O cenário da educação superior no Brasil é um ecossistema dinâmico, marcado por profundas transformações, especialmente na última década com a consolidação da Educação a Distância (EAD) e os impactos socioeconômicos recentes. Compreender as tendências de desempenho dos cursos, notadamente as taxas de evasão e conclusão, é fundamental para o planejamento estratégico de instituições de ensino e para a formulação de políticas públicas eficazes. Este projeto se propõe a realizar uma análise exploratória detalhada dos microdados do Censo da Educação Superior, abrangendo o período de 2019 a 2023. O objetivo é identificar padrões, visualizar tendências e, por fim, construir modelos de machine learning para destacar os principais fatores mais associados a altas taxas de evasão, fornecendo insights valiosos para gestores acadêmicos e para a sociedade.


2. Pacotes e Ambiente

Carregamos aqui todos os pacotes R necessários para a execução completa do projeto.

# Define um "espelho" (mirror) do CRAN para baixar os pacotes.
options(repos = c(CRAN = "[https://cran.r-project.org](https://cran.r-project.org)"))

# Lista de pacotes para o projeto
required_packages <- c(
  "tidyverse", "data.table", "plotly", "janitor", "viridis", "scales",
  "sf", "DT", "treemapify", "rpart", "rpart.plot", "caret", "randomForest"
)

# Instala (se necessário) e carrega os pacotes
invisible(lapply(required_packages, function(pkg) {
  if (!require(pkg, character.only = TRUE)) install.packages(pkg, dependencies = TRUE)
  library(pkg, character.only = TRUE)
}))
## Carregando pacotes exigidos: 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.2     ✔ tibble    3.2.1
## ✔ lubridate 1.9.4     ✔ tidyr     1.3.1
## ✔ purrr     1.0.4     
## ── 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
## Carregando pacotes exigidos: data.table
## 
## 
## Anexando pacote: 'data.table'
## 
## 
## Os seguintes objetos são mascarados por 'package:lubridate':
## 
##     hour, isoweek, mday, minute, month, quarter, second, wday, week,
##     yday, year
## 
## 
## Os seguintes objetos são mascarados por 'package:dplyr':
## 
##     between, first, last
## 
## 
## O seguinte objeto é mascarado por 'package:purrr':
## 
##     transpose
## 
## 
## Carregando pacotes exigidos: plotly
## 
## 
## Anexando pacote: 'plotly'
## 
## 
## O seguinte objeto é mascarado por 'package:ggplot2':
## 
##     last_plot
## 
## 
## O seguinte objeto é mascarado por 'package:stats':
## 
##     filter
## 
## 
## O seguinte objeto é mascarado por 'package:graphics':
## 
##     layout
## 
## 
## Carregando pacotes exigidos: janitor
## 
## 
## Anexando pacote: 'janitor'
## 
## 
## Os seguintes objetos são mascarados por 'package:stats':
## 
##     chisq.test, fisher.test
## 
## 
## Carregando pacotes exigidos: viridis
## 
## Carregando pacotes exigidos: viridisLite
## 
## Carregando pacotes exigidos: scales
## 
## 
## Anexando pacote: 'scales'
## 
## 
## O seguinte objeto é mascarado por 'package:viridis':
## 
##     viridis_pal
## 
## 
## O seguinte objeto é mascarado por 'package:purrr':
## 
##     discard
## 
## 
## O seguinte objeto é mascarado por 'package:readr':
## 
##     col_factor
## 
## 
## Carregando pacotes exigidos: sf
## 
## Linking to GEOS 3.13.0, GDAL 3.10.3, PROJ 9.6.0; sf_use_s2() is TRUE
## 
## Carregando pacotes exigidos: DT
## 
## Carregando pacotes exigidos: treemapify
## 
## Carregando pacotes exigidos: rpart
## 
## Carregando pacotes exigidos: rpart.plot
## 
## Carregando pacotes exigidos: caret
## 
## Carregando pacotes exigidos: lattice
## 
## 
## Anexando pacote: 'caret'
## 
## 
## O seguinte objeto é mascarado por 'package:purrr':
## 
##     lift
## 
## 
## Carregando pacotes exigidos: randomForest
## 
## randomForest 4.7-1.2
## 
## Type rfNews() to see new features/changes/bug fixes.
## 
## 
## Anexando pacote: 'randomForest'
## 
## 
## O seguinte objeto é mascarado por 'package:dplyr':
## 
##     combine
## 
## 
## O seguinte objeto é mascarado por 'package:ggplot2':
## 
##     margin

3. Preparação dos Dados

O processo de carregamento e tratamento dos dados, utilizando os nomes de colunas corretos, para criar um dataset limpo e com as métricas necessárias para a análise.

# 1. Carregamento dos Dados
pasta_dos_dados <- "/home/ianlucasalmeida/Mestrado/projeto2_2va_ian/Dados/"
nomes_dos_arquivos <- c(
  "MICRODADOS_CADASTRO_CURSOS_2019.CSV", "MICRODADOS_CADASTRO_CURSOS_2020.CSV",
  "MICRODADOS_CADASTRO_CURSOS_2021.CSV", "MICRODADOS_CADASTRO_CURSOS_2022.CSV",
  "MICRODADOS_CADASTRO_CURSOS_2023.CSV"
)
caminhos_completos <- paste0(pasta_dos_dados, nomes_dos_arquivos)
arquivos_existentes <- caminhos_completos[file.exists(caminhos_completos)]
if (length(arquivos_existentes) < 5) stop("ERRO: Não foi possível encontrar todos os 5 arquivos de dados.")

lista_de_dataframes <- lapply(arquivos_existentes, fread, encoding = "Latin-1", na.strings = c("", "NA", "N/A"))
dados_completos <- rbindlist(lista_de_dataframes, fill = TRUE)

# 2. Limpeza e Engenharia de Features
dados_cursos <- dados_completos %>%
  clean_names() %>%
  mutate(across(c(qt_mat, qt_conc, qt_sit_desvinculado), as.numeric)) %>%
  filter(qt_mat > 0) %>%
  mutate(
    ano = as.factor(nu_ano_censo),
    abbrev_state = as.factor(sg_uf),
    modalidade = factor(ifelse(tp_modalidade_ensino == 1, "Presencial", "EAD")),
    rede = factor(ifelse(tp_rede == 1, "Pública", "Privada")),
    area_geral = as.factor(no_cine_area_geral),
    taxa_conclusao = qt_conc / qt_mat,
    taxa_evasao = qt_sit_desvinculado / qt_mat
  ) %>%
  filter(taxa_evasao <= 1, taxa_conclusao <= 1) %>%
  select(
    ano, abbrev_state, modalidade, rede, area_geral,
    matriculados = qt_mat, concluintes = qt_conc, evadidos = qt_sit_desvinculado,
    taxa_conclusao, taxa_evasao
  )

4. Painel de Métricas Principais (KPIs)

Um resumo dos indicadores mais importantes para o ano mais recente disponível (2023).

kpis_2023 <- dados_cursos %>%
  filter(ano == 2023) %>%
  summarise(
    total_cursos = n(),
    total_matriculados = sum(matriculados, na.rm = TRUE),
    media_evasao = mean(taxa_evasao, na.rm = TRUE)
  )

cat(paste0(
  "### Cursos Ativos em 2023\n", "> # ", scales::number(kpis_2023$total_cursos, big.mark = "."), "\n\n",
  "### Total de Matriculados em 2023\n", "> # ", scales::number(kpis_2023$total_matriculados, big.mark = "."), "\n\n",
  "### Taxa Média de Evasão em 2023\n", "> # ", scales::percent(kpis_2023$media_evasao, accuracy = 0.1)
))
## ### Cursos Ativos em 2023
## > # 487.887
## 
## ### Total de Matriculados em 2023
## > # 9.707.425
## 
## ### Taxa Média de Evasão em 2023
## > # 26.5%

5. Análise Exploratória de Desempenho (2019-2023)

Nesta seção, os gráficos são organizados em abas para facilitar a navegação.

Tendências Gerais

print(
  dados_cursos %>%
    group_by(ano) %>%
    summarise(media_evasao = mean(taxa_evasao, na.rm = TRUE)) %>%
    ggplot(aes(x = ano, y = media_evasao, group = 1)) +
    geom_line(color = "#e41a1c", linewidth = 1.5) +
    geom_point(color = "#e41a1c", size = 3) +
    scale_y_continuous(labels = scales::percent_format(accuracy = 0.1)) +
    labs(title = "Evolução da Taxa Média de Evasão dos Cursos no Brasil", x = "Ano do Censo", y = "Taxa Média de Evasão") +
    theme_minimal(base_size = 14)
)

Análise do Gráfico: A análise da tendência nacional revela um panorama preocupante na retenção de alunos. Conforme o gráfico, a taxa média de evasão apresentou uma trajetória de alta, atingindo um pico em 2021, seguida por uma leve queda nos anos subsequentes. Este comportamento sugere o impacto de fatores macroeconômicos e sociais, como a pandemia de COVID-19, que podem ter intensificado as dificuldades dos estudantes no período.

Análise por Modalidade

print(
  ggplot(dados_cursos, aes(x = modalidade, y = taxa_evasao, fill = modalidade)) +
    geom_violin(trim = FALSE, alpha = 0.8) +
    geom_boxplot(width = 0.1, fill = "white") +
    scale_y_continuous(labels = scales::percent_format()) +
    scale_fill_manual(values = c("Presencial" = "#377eb8", "EAD" = "#4daf4a")) +
    labs(title = "Distribuição da Taxa de Evasão por Modalidade de Ensino", x = "Modalidade", y = "Taxa de Evasão") +
    theme_minimal(base_size = 14) +
    theme(legend.position = "none")
)

Análise do Gráfico: Ao segmentar por modalidade de ensino, as diferenças se tornam evidentes. Os cursos de Educação a Distância (EAD) apresentam uma taxa de evasão mediana significativamente superior à dos cursos presenciais. Além disso, a maior dispersão dos dados no EAD (indicada pelo formato mais “largo” do gráfico de violino) sugere uma maior heterogeneidade no desempenho desses cursos, com alguns sendo muito eficientes na retenção e outros enfrentando desafios massivos.

Análise por Área

print(
  dados_cursos %>%
    filter(ano == 2023) %>%
    group_by(area_geral) %>%
    summarise(total_matriculados = sum(matriculados, na.rm = TRUE)) %>%
    ggplot(aes(area = total_matriculados, fill = area_geral, label = paste(area_geral, scales::number(total_matriculados, big.mark = "."), sep = "\n"))) +
    geom_treemap() +
    geom_treemap_text(fontface = "italic", colour = "white", place = "centre", grow = TRUE) +
    theme(legend.position = "none") +
    labs(title = "Distribuição de Matriculados por Área do Conhecimento em 2023")
)

Análise do Gráfico: O Treemap ilustra a distribuição do volume de alunos matriculados por área do conhecimento em 2023. Fica claro que áreas como Negócios, administração e direito e Educação concentram a maior parte dos estudantes. Essa concentração é um fator importante a ser considerado, pois as tendências de evasão nessas áreas de grande volume têm um impacto desproporcional na média nacional.

Análise Geográfica (Mapa)

# 1. Calcular a evasão média por estado em 2023
dados_mapa <- dados_cursos %>%
  filter(ano == 2023) %>%
  group_by(abbrev_state) %>%
  summarise(media_evasao_uf = mean(taxa_evasao, na.rm = TRUE), .groups = 'drop')

# 2. Carregar o arquivo GeoJSON que você salvou localmente
caminho_mapa_local <- "/home/ianlucasalmeida/Mestrado/projeto2_2va_ian/Dados/br_states.json"

if(file.exists(caminho_mapa_local)) {
  brasil_estados <- st_read(caminho_mapa_local)
  
  # 3. Unir os dados da análise com os dados geográficos
  # Usando 'SIGLA' (do arquivo do mapa) e 'abbrev_state' (dos nossos dados).
  mapa_final_data <- left_join(brasil_estados, dados_mapa, by = c("SIGLA" = "abbrev_state"))

  # 4. Plotar o mapa interativo
  # Usando 'Estado' para o tooltip, conforme o nome da coluna no seu arquivo.
  mapa_plot <- ggplot(data = mapa_final_data) +
    geom_sf(aes(fill = media_evasao_uf, text = paste("Estado:", Estado, "\nEvasão Média:", scales::percent(media_evasao_uf, accuracy = 0.1))), color = "white", size = 0.1) +
    scale_fill_viridis_c(option = "plasma", name = "Taxa de Evasão", labels = scales::percent) +
    labs(title = "Taxa de Evasão Média por Estado em 2023") +
    theme_void()

  ggplotly(mapa_plot, tooltip = "text")
  
} else {
  cat("AVISO: Arquivo do mapa 'br_states.json' não foi encontrado. Verifique se o caminho está correto:", caminho_mapa_local)
}
## Reading layer `States of brazil feature collection converted from projection SIRGAS_2000_UTM_Zone_22S to WGS 84 datum' from data source `/home/ianlucasalmeida/Mestrado/projeto2_2va_ian/Dados/br_states.json' 
##   using driver `GeoJSON'
## Simple feature collection with 27 features and 13 fields
## Geometry type: MULTIPOLYGON
## Dimension:     XY
## Bounding box:  xmin: -73.99132 ymin: -33.75201 xmax: -32.39247 ymax: 5.27179
## Geodetic CRS:  WGS 84

Análise do Gráfico: A dimensão geográfica revela um retrato desigual do Brasil. O mapa coroplético de 2023 indica que os estados da região Norte e Nordeste concentram as maiores taxas de evasão, enquanto a região Sul e Sudeste apresenta um desempenho médio mais positivo. Essa disparidade regional é um fator crucial para a formulação de políticas públicas educacionais, que devem considerar as particularidades socioeconômicas de cada localidade.

Análise 3D

dados_3d <- dados_cursos %>%
  filter(ano == 2023) %>%
  group_by(area_geral) %>%
  summarise(
    media_matriculados = mean(matriculados, na.rm = TRUE),
    media_evasao = mean(taxa_evasao, na.rm = TRUE),
    media_conclusao = mean(taxa_conclusao, na.rm = TRUE),
    total_cursos = n(),
    .groups = 'drop'
  ) %>%
  filter(total_cursos > 100) %>%
  mutate(
    texto_tooltip = paste(
      "<b>Área:</b>", area_geral,
      "<br><b>Taxa Média de Evasão:</b>", scales::percent(media_evasao, accuracy = 0.1),
      "<br><b>Taxa Média de Conclusão:</b>", scales::percent(media_conclusao, accuracy = 0.1),
      "<br><b>Média de Matriculados:</b>", round(media_matriculados)
    )
  )

plot_ly(
  data = dados_3d,
  x = ~media_matriculados, y = ~media_evasao, z = ~media_conclusao,
  color = ~area_geral, size = ~total_cursos, text = ~texto_tooltip,
  hoverinfo = 'text', type = 'scatter3d', mode = 'markers'
) %>% layout(
    title = "Desempenho dos Cursos por Área do Conhecimento em 2023",
    scene = list(
      xaxis = list(title = 'Média de Matriculados'),
      yaxis = list(title = 'Taxa Média de Evasão'),
      zaxis = list(title = 'Taxa Média de Conclusão')
    )
  )

Análise do Gráfico: Sintetizando os principais indicadores, o gráfico de dispersão 3D permite uma visão holística do ecossistema de cursos. Nele, observamos a formação de clusters distintos. Por um lado, um grupo de cursos caracterizados por alto volume de matrículas e alta evasão, tipicamente na área de Negócios. Por outro, um cluster de cursos de baixa evasão e alta conclusão, mesmo com menos matrículas, como os da área de Saúde. Esta visualização multidimensional é poderosa para identificar perfis de cursos que necessitam de estratégias de intervenção específicas.

Tabela de Dados

tabela_resumo <- dados_cursos %>%
  filter(ano == 2023) %>%
  group_by(abbrev_state, rede) %>%
  summarise(
    `Total de Cursos` = n(),
    `Total de Matriculados` = sum(matriculados, na.rm = TRUE),
    `Taxa Média de Evasão` = mean(taxa_evasao, na.rm = TRUE),
    .groups = 'drop'
  ) %>%
  arrange(desc(`Taxa Média de Evasão`))

datatable(
  tabela_resumo,
  rownames = FALSE,
  filter = 'top',
  options = list(pageLength = 10, dom = 'Bfrtip', buttons = c('csv', 'excel')),
  extensions = 'Buttons',
  caption = 'Resumo de indicadores por estado e rede para o ano de 2023.'
) %>%
formatPercentage('Taxa Média de Evasão', digits = 1) %>%
formatCurrency('Total de Matriculados', currency = "", interval = 3, mark = ".")

Evolução por Rede

print(
  dados_cursos %>%
    group_by(ano, rede) %>%
    summarise(total_cursos = n(), .groups = 'drop') %>%
    ggplot(aes(x = ano, y = total_cursos, group = rede, color = rede)) +
    geom_line(linewidth = 1.5) +
    geom_point(size = 3) +
    geom_text(aes(label = scales::number(total_cursos, big.mark = ".")), vjust = -1) +
    scale_y_continuous(labels = label_number(big.mark = ".")) +
    scale_color_manual(values = c("Pública" = "#ff7f00", "Privada" = "#377eb8")) +
    labs(
      title = "Evolução do Número de Cursos por Rede de Ensino (2019-2023)",
      x = "Ano",
      y = "Número Total de Cursos",
      color = "Rede de Ensino"
    ) +
    theme_minimal(base_size = 14) +
    theme(legend.position = "bottom")
)

Análise do Gráfico: Este gráfico mostrará claramente se o crescimento de cursos no Brasil foi impulsionado pela rede privada, pública, ou ambas, e em que proporção ao longo do tempo.

Funil de Desempenho

# Calcula as 10 áreas com mais cursos para uma análise mais robusta
top_areas <- dados_cursos %>%
  count(area_geral, sort = TRUE) %>%
  top_n(10, n) %>%
  pull(area_geral)

# Calcula as taxas médias por área do conhecimento
dados_funil <- dados_cursos %>%
  group_by(area_geral) %>%
  summarise(
    media_evasao = mean(taxa_evasao, na.rm = TRUE),
    media_conclusao = mean(taxa_conclusao, na.rm = TRUE)
  ) %>%
  filter(area_geral %in% top_areas) %>%
  pivot_longer(
    cols = c(media_evasao, media_conclusao),
    names_to = "metrica",
    values_to = "taxa"
  ) %>%
  mutate(
    metrica = factor(metrica, levels = c("media_evasao", "media_conclusao"), labels = c("Evasão", "Conclusão"))
  )

# Gráfico de barras empilhadas
print(
  ggplot(dados_funil, aes(x = taxa, y = reorder(area_geral, taxa), fill = metrica)) +
    geom_col() +
    scale_x_continuous(labels = scales::percent_format()) +
    scale_fill_manual(values = c("Conclusão" = "#1f78b4", "Evasão" = "#e31a1c"), name = "Métrica") +
    labs(
      title = "Funil de Desempenho: Taxa Média de Conclusão vs. Evasão por Área",
      subtitle = "Para cada 100 alunos matriculados, qual o desfecho médio?",
      x = "Taxa Média",
      y = "Área do Conhecimento"
    ) +
    theme_minimal(base_size = 14)
)

Análise do Gráfico: Este gráfico mostra, de forma muito visual, quais áreas do conhecimento são mais “eficientes” em levar os alunos da matrícula à conclusão e quais possuem um “vazamento” maior no funil (alta evasão).

Índice de Eficiência

# Cria a nova variável e calcula a média por modalidade e rede
dados_eficiencia <- dados_cursos %>%
  mutate(
    indice_eficiencia = taxa_conclusao - taxa_evasao
  ) %>%
  group_by(modalidade, rede) %>%
  summarise(
    media_eficiencia = mean(indice_eficiencia, na.rm = TRUE),
    .groups = 'drop'
  )

# Gráfico de barras para comparar o índice
print(
  ggplot(dados_eficiencia, aes(x = modalidade, y = media_eficiencia, fill = rede)) +
    geom_col(position = "dodge") +
    geom_text(aes(label = round(media_eficiencia, 2)), position = position_dodge(width = 0.9), vjust = -0.5) +
    scale_fill_manual(values = c("Pública" = "#ff7f00", "Privada" = "#377eb8")) +
    labs(
      title = "Índice de Eficiência Média por Modalidade e Rede",
      subtitle = "Calculado como (Taxa de Conclusão - Taxa de Evasão)",
      x = "Modalidade de Ensino",
      y = "Índice de Eficiência Médio",
      fill = "Rede"
    ) +
    theme_minimal(base_size = 14)
)

Análise do Gráfico: Este gráfico responde a uma pergunta mais complexa: qual combinação de modalidade e rede é mais eficiente em reter e formar alunos? Um índice alto é bom (alta conclusão, baixa evasão), um índice baixo/negativo é ruim.


6. Bônus: Modelo Preditivo Simples (Árvore de Decisão)

Para ir além da exploração, construímos um modelo simples de machine learning para identificar quais características estão mais associadas a uma alta taxa de evasão.

6.1 Preparando os Dados para os Modelos

dados_modelo_prep <- dados_cursos %>%
  filter(ano == 2023) %>%
  select(modalidade, rede, area_geral, matriculados, taxa_evasao) %>%
  na.omit()

mediana_evasao <- median(dados_modelo_prep$taxa_evasao, na.rm = TRUE)

dados_modelo <- dados_modelo_prep %>%
  mutate(
    alta_evasao = factor(ifelse(taxa_evasao >= mediana_evasao, "Sim", "Nao"))
  ) %>%
  select(-taxa_evasao)

set.seed(123)
train_index <- createDataPartition(dados_modelo$alta_evasao, p = 0.7, list = FALSE)
train_data <- dados_modelo[train_index, ]
test_data  <- dados_modelo[-train_index, ]

6.2 Modelo Simples: Árvore de Decisão

arvore_modelo <- rpart(alta_evasao ~ ., data = train_data, method = "class")
rpart.plot(arvore_modelo, box.palette = "RdBu", shadow.col = "gray", nn = TRUE, main = "Árvore de Decisão para Prever Alta Taxa de Evasão")

cat("--- Avaliação da Árvore de Decisão ---\n")
## --- Avaliação da Árvore de Decisão ---
predicoes_arvore <- predict(arvore_modelo, newdata = test_data, type = "class")
print(confusionMatrix(predicoes_arvore, test_data$alta_evasao, positive = "Sim"))
## Confusion Matrix and Statistics
## 
##           Reference
## Prediction   Nao   Sim
##        Nao 61078 24932
##        Sim 12104 48252
##                                           
##                Accuracy : 0.747           
##                  95% CI : (0.7447, 0.7492)
##     No Information Rate : 0.5             
##     P-Value [Acc > NIR] : < 2.2e-16       
##                                           
##                   Kappa : 0.4939          
##                                           
##  Mcnemar's Test P-Value : < 2.2e-16       
##                                           
##             Sensitivity : 0.6593          
##             Specificity : 0.8346          
##          Pos Pred Value : 0.7995          
##          Neg Pred Value : 0.7101          
##              Prevalence : 0.5000          
##          Detection Rate : 0.3297          
##    Detection Prevalence : 0.4124          
##       Balanced Accuracy : 0.7470          
##                                           
##        'Positive' Class : Sim             
## 

6.3 Modelo Avançado: Random Forest

set.seed(123)
floresta_modelo <- randomForest(
  alta_evasao ~ .,
  data = train_data,
  ntree = 100,
  mtry = 2
)
cat("--- Avaliação do Random Forest ---\n")
## --- Avaliação do Random Forest ---
predicoes_floresta <- predict(floresta_modelo, newdata = test_data)
print(confusionMatrix(predicoes_floresta, test_data$alta_evasao, positive = "Sim"))
## Confusion Matrix and Statistics
## 
##           Reference
## Prediction   Nao   Sim
##        Nao 56120 19789
##        Sim 17062 53395
##                                          
##                Accuracy : 0.7482         
##                  95% CI : (0.746, 0.7504)
##     No Information Rate : 0.5            
##     P-Value [Acc > NIR] : < 2.2e-16      
##                                          
##                   Kappa : 0.4965         
##                                          
##  Mcnemar's Test P-Value : < 2.2e-16      
##                                          
##             Sensitivity : 0.7296         
##             Specificity : 0.7669         
##          Pos Pred Value : 0.7578         
##          Neg Pred Value : 0.7393         
##              Prevalence : 0.5000         
##          Detection Rate : 0.3648         
##    Detection Prevalence : 0.4814         
##       Balanced Accuracy : 0.7482         
##                                          
##        'Positive' Class : Sim            
## 
varImpPlot(floresta_modelo, main = "Importância das Variáveis (Random Forest)")

Análise dos Modelos: Para complementar a análise exploratória, desenvolvemos modelos de machine learning para identificar os principais fatores preditivos de uma alta taxa de evasão. A Árvore de Decisão, por sua alta interpretabilidade, nos mostra um fluxo de regras claras. A primeira e mais importante divisão da árvore (o nó raiz) indica que a variável area_geral é o fator mais decisivo para separar cursos com alta e baixa evasão.

Para buscar uma maior acurácia preditiva, um modelo Random Forest foi treinado, atingindo uma acurácia superior à da árvore única. O gráfico de Importância de Variáveis confirma e quantifica os achados: area_geral e matriculados são os fatores mais determinantes. Isso reforça os insights da análise exploratória de forma estatisticamente mais robusta, mostrando que não apenas a área do conhecimento, mas também o porte do curso (em número de alunos) são cruciais para prever seu desempenho de retenção.


7. Conclusões

Com base na análise exploratória e nos modelos preditivos, este estudo chega às seguintes conclusões:

  • Resumo dos Achados: A taxa de evasão no ensino superior brasileiro apresentou uma tendência preocupante de alta entre 2019 e 2023. A modalidade EAD, apesar de sua expansão, enfrenta desafios de retenção significativamente maiores que a presencial. Regionalmente, as desigualdades são marcantes, e áreas do conhecimento como “Negócios, administração e direito” demandam atenção especial por seu volume e taxas de evasão.

  • Implicações Práticas: Os resultados fornecem um mapa para gestores acadêmicos, permitindo o desenvolvimento de estratégias de retenção focadas nos cursos e perfis de maior risco (ex: cursos de EAD em áreas de alta competição). Para políticas públicas, os dados reforçam a necessidade de ações que considerem as disparidades regionais.

  • Contribuição dos Modelos: Enquanto a análise exploratória descreveu “o quê”, os modelos de machine learning ajudaram a responder “o porquê”. A Árvore de Decisão e o Random Forest quantificaram a importância de cada fator, confirmando que a área do conhecimento e o número de matriculados são os preditores mais fortes de uma alta evasão.

  • Limitações do Estudo: A principal limitação desta análise é a ausência de dados socioeconômicos dos alunos vinculados a cada curso, o que enriqueceria a análise dos fatores de evasão. Além disso, a análise não captura as razões subjetivas para a desvinculação.

  • Trabalhos Futuros: Como próximos passos, sugere-se a aplicação de modelos mais complexos (como Gradient Boosting - XGBoost) e a incorporação de dados externos (como indicadores de mercado de trabalho por região) para criar um modelo preditivo ainda mais acurado e com maior poder explicativo.