Avaliação final - MBA em IA, Data Sience e Big Data para Negócios - Estatística para Ciência de dados - IBMEC (Turma 1)

# geralmente o chunk de setup é feito c "include=FALSE" p ficar oculto 

knitr::opts_chunk$set(
  message = FALSE,      # oculta mensagens
  warning = FALSE,      # oculta avisos
  fig.align = 'center', # centraliza gráficos
  fig.width = 8,
  fig.height = 5
)

Apresentação

Avaliação final - MBA em IA, Data Science e Big Data para Negócios - Estatística para Ciência de dados - IBMEC (Turma 1)

Professor: Thiago Marques

Carregar os Pacotes

library(tidyverse)
library(data.table)
library(readr)
library(knitr)
library(kableExtra)
library(Hmisc)
library(DescTools)
library(e1071)
library(dplyr)
library(ggplot2)
library(plotly)
library(rmdformats)
library(esquisse)
library(gridExtra)
library(devtools)

ITEM A

Importar o Banco de Dados

enade2017 <- read_csv2("MICRODADOS_ENADE_2017.txt")

ITEM B

Selecionar e classificar as variáveis

Selecionar as Variáveis

microdados_item_B <- enade2017 %>% 
  select(
    NT_OBJ_FG,
    CO_GRUPO, 
    CO_REGIAO_CURSO, 
    QE_I02, 
    CO_TURNO_GRADUACAO,
    NT_GER
)
rm(enade2017)

Criar a tabela de classificação

tabela_classificacao <- data.frame(
  Variavel = c(
    "NT_OBJ_FG",
    "CO_GRUPO", 
    "CO_REGIAO_CURSO", 
    "QE_I02", 
    "CO_TURNO_GRADUACAO"
  ),
  Descricao_ENADE = c(
    "Nota bruta na formação geral", 
    "Código da área de enquadramento do curso no Enade", 
    "Código da região de funcionamento do curso", 
    "Cor/Raça do Aluno", 
    "Código do turno de graduação"
  ),
  Classificacao_Estatistica = c(
    "Quantitativa Continua", 
    "Qualitativa Nominal", 
    "Qualitativa Nominal", 
    "Qualitativa Nominal", 
    "Qualitativa Nominal"
  ),
  stringsAsFactors = FALSE
)
tabela_classificacao %>% 
    kbl() %>% 
    kable_styling(bootstrap_options = c("striped", "hover", "condensed"), 
                  full_width = FALSE)
Variavel Descricao_ENADE Classificacao_Estatistica
NT_OBJ_FG Nota bruta na formação geral Quantitativa Continua
CO_GRUPO Código da área de enquadramento do curso no Enade Qualitativa Nominal
CO_REGIAO_CURSO Código da região de funcionamento do curso Qualitativa Nominal
QE_I02 Cor/Raça do Aluno Qualitativa Nominal
CO_TURNO_GRADUACAO Código do turno de graduação Qualitativa Nominal

ITEM C

Selecionar o curso

** Escolhido pela equipe: Engenharia de Controle e Automação = 5814 **

df_automacao = microdados_item_B %>% filter(CO_GRUPO==5814)

ITEM D

Transformar as variáveis (renomeação das colunas)

df_automacao = df_automacao %>%
  mutate(Região = case_when(
    CO_REGIAO_CURSO == 1 ~ "Norte",
    CO_REGIAO_CURSO == 2 ~ "Nordeste",
    CO_REGIAO_CURSO == 3 ~ "Sudeste",
    CO_REGIAO_CURSO == 4 ~ "Sul",
    CO_REGIAO_CURSO == 5 ~ "Centro-Oeste"
  )
)

df_automacao = df_automacao %>%
  mutate(Turno = case_when(
    CO_TURNO_GRADUACAO == 1 ~ "Matutino",
    CO_TURNO_GRADUACAO == 2 ~ "Vespertino",
    CO_TURNO_GRADUACAO == 3 ~ "Integral",
    CO_TURNO_GRADUACAO == 4 ~ "Noturno"
  )
)

df_automacao = df_automacao %>%
  mutate(Cor_ou_raça = case_when(
    QE_I02 == "A" ~ "Branca",
    QE_I02 == "B" ~ "Preta",
    QE_I02 == "C" ~ "Amarela",
    QE_I02 == "D" ~ "Parda",
    QE_I02 == "E" ~ "Indígena",
    QE_I02 == "F" ~ "Não quero declarar"
  )
)

ITEM E

Eliminar a NAs

Visualizar a quantidade de NAs (pré-exclusão de NAs)

resumo_nas_antes = df_automacao %>% summarise_all(~sum(is.na(.)))
resumo_nas_antes %>% 
  kbl() %>% 
  kable_styling(bootstrap_options = c("striped", "hover", "condensed"),
                full_width = FALSE)
NT_OBJ_FG CO_GRUPO CO_REGIAO_CURSO QE_I02 CO_TURNO_GRADUACAO NT_GER Região Turno Cor_ou_raça
654 0 0 502 6 654 0 6 502

Excluir e visualizar a quantidade de NAs (pós-exclusão de NAs)

df_automacao_sem_na = df_automacao %>% na.omit()
resumo_nas_depois = df_automacao_sem_na %>% summarise_all(~sum(is.na(.)))
resumo_nas_depois %>% 
  kbl() %>% 
  kable_styling(bootstrap_options = c("striped", "hover", "condensed"),
                full_width = FALSE)
NT_OBJ_FG CO_GRUPO CO_REGIAO_CURSO QE_I02 CO_TURNO_GRADUACAO NT_GER Região Turno Cor_ou_raça
0 0 0 0 0 0 0 0 0

ITEM F

Análises Gráficas

Estatística descritiva dos dados

df_automacao_sem_na %>%
 summarise(
 quantidade = n(),
 media = mean(NT_GER),
 mediana = median(NT_GER),
 moda = Mode(NT_GER),
 cv = sd(NT_GER) / media * 100, # Coeficiente de Variação
 assimetria = skewness(NT_GER),
 curtose = kurtosis(NT_GER)) %>%
 kbl() %>% kable_styling(bootstrap_options = c("striped", "hover", "condensed"),
                full_width = FALSE)
quantidade media mediana moda cv assimetria curtose
4770 42.15971 41.5 34.3 31.15111 0.2540156 -0.051687
g_hist <- ggplot(df_automacao_sem_na, aes(x = NT_GER)) + 
  geom_histogram(color = "black", fill = "lightblue", bins = 50, aes(y = ..count../sum(..count..))) +
  ggtitle("Histograma da nota dos alunos de Engenharia de Controle e Automação") +
  xlab("Nota") +
  ylab("Frequência relativa")

g_densidade <- ggplot(df_automacao_sem_na, aes(x = NT_GER)) +
  geom_density(col = 2, size = 1, aes(y = 27 * ..count../sum(..count..))) +
  ggtitle("Curva de densidade da nota dos alunos de Engenharia de Controle e Automação") +
  xlab("Nota dos alunos de Engenharia de Controle e Automação") +
  ylab("Frequência relativa")

g_hist_densidade <- ggplot(df_automacao_sem_na, aes(x = NT_GER)) +
  geom_histogram(color = "black", fill = "lightblue", bins = 50, aes(y = ..count../sum(..count..))) +
  geom_density(col = 2, size = 1, aes(y = 27 * ..count../sum(..count..))) +
  ggtitle("Histograma e curva de densidade da nota dos alunos de Engenharia de Controle e Automação") +
  xlab("Nota dos alunos de Engenharia de Controle e Automação") +
  ylab("Frequência relativa")

grid.arrange(g_hist, g_densidade, g_hist_densidade, nrow = 3)

CONCLUSÃO A análise apresentou média de 42,16 pontos, mediana de 41,5 e moda de 34,3, em uma escala de 0 a 100, com 4.770 alunos analisados. O coeficiente de variação de 31,15% sugere heterogeneidade de desempenho entre os estudantes. A assimetria positiva (0,25) e a curtose ligeiramente negativa (-0,05) apontam para uma distribuição aproximadamente normal, mas com leve concentração de notas abaixo da média e uma cauda alongada à direita, indicando poucos alunos com notas mais elevadas.

Gráfico pizza de Frequência Relativa por Cor/Raça

df_pizza_raca = data.frame(table(df_automacao_sem_na$Cor_ou_raça))

df_pizza_raca = df_pizza_raca %>% mutate(
  Freq_Relat = paste(format(round((((df_pizza_raca$Freq/sum(df_pizza_raca$Freq)) * 100)),
  2), nsmall = 2), "%"))

kable(df_pizza_raca) %>% kable_styling()
Var1 Freq Freq_Relat
Amarela 144 3.02 %
Branca 2913 61.07 %
Indígena 11 0.23 %
Não quero declarar 176 3.69 %
Parda 1235 25.89 %
Preta 291 6.10 %
graf_pizza_raca = plot_ly(df_pizza_raca,
                          labels = ~Var1,
                          values = ~Freq,
                          type = 'pie') %>%
                          layout(title = 'Frequência relativa por Raça/Cor (%)')

graf_pizza_raca

CONCLUSÃO Há uma predominância de alunos brancos (61,1%) no curso de Engenharia de Controle e Automação, seguidos por alunos pardos (25,9%). Juntos, esses dois grupos representam quase 87% do total da amostra analisada. A presença de alunos pretos (6,1%), amarelos (3%) e indígenas (0,2%) é consideravelmente menor, revelando baixa diversidade racial entre os participantes.

Gráfico Barra - Número de alunos por Cor/Raça

graf_col_vert_raca =
  ggplot(df_automacao_sem_na, aes(Cor_ou_raça, fill = Cor_ou_raça)) +
  geom_bar(position = "dodge") +
  ggtitle("Número de alunos por cor ou raça") +
  xlab("Cor ou Raça") +
  ylab("Frequência")

graf_col_vert_raca

graf_col_horiz_raca = graf_col_vert_raca + coord_flip()

graf_col_horiz_raca

#ggplot(graf_col_horiz_raca)

Tabela da nota geral agrupado por cor/raça

análise_raça = df_automacao_sem_na %>%
 group_by(Cor_ou_raça) %>%
 summarise(
 quantidade = n(),
 media = mean(NT_GER),
 mediana = median(NT_GER),
 moda = Mode(NT_GER),
 cv = sd(NT_GER) / media * 100, # Coeficiente de Variação
 assimetria = skewness(NT_GER),
 curtose = kurtosis(NT_GER),
 .groups = 'drop' # Remove o agrupamento após o resumo
 ) %>%
 arrange(desc(media)) # Ordena pela maior média

análise_raça %>% 
  kbl() %>% 
  kable_styling(bootstrap_options = c("striped", "hover", "condensed"),
                full_width = FALSE)
Cor_ou_raça quantidade media mediana moda cv assimetria curtose
Não quero declarar 176 44.57045 44.95 48.4 31.87483 -0.1905650 0.0230452
Branca 2913 42.92736 42.40 44.6 31.05890 0.2339094 -0.1074355
Amarela 144 42.83611 42.30 43.8 28.46567 0.1825376 0.1011963
Parda 1235 40.80146 40.10 34.3 31.19088 0.3247685 0.0082977
Preta 291 38.64192 38.50 41.8 29.89635 0.2493645 0.1783808
Indígena 11 37.00000 39.40 NA 24.12925 -0.3069603 -1.4250617

Boxplot da nota geral por raça

boxplot_nota_geral_por_raça = ggplot(df_automacao_sem_na, aes(x = Cor_ou_raça, y = NT_GER, fill = Cor_ou_raça)) +
 geom_boxplot() +
 ggtitle("Box-Plot da Nota Geral (NT_GER) por Cor/Raça") +
 xlab("Cor ou Raça") +
 ylab("Nota Geral do ENADE") +
 # Ajusta o ângulo do texto no eixo X para melhor leitura
 theme(axis.text.x = element_text(angle = 45, hjust = 1))

 # Torna o gráfico interativo
ggplotly(boxplot_nota_geral_por_raça)

CONCLUSÃO Os alunos brancos e amarelos obtiveram notas médias próximas da média geral (≈42), enquanto os pardos e especialmente os pretos apresentaram médias mais baixas, indicando possíveis desigualdades de desempenho acadêmico. O grupo “Não quero declarar” teve o melhor desempenho médio (44,6), o que pode refletir características socioeconômicas distintas.

Boxplot da nota geral por região

boxplot_nota_geral_por_região = ggplot(df_automacao_sem_na,
 # Eixo X é a Região; Eixo Y é a Nota
 aes(x = Região, y = NT_GER, fill = Região)) +
 geom_boxplot() +
 ggtitle("Box-Plot da Nota Geral por Região") +
 xlab("Região do Curso") +
 ylab("Nota Geral do ENADE (NT_GER)") +

 # Ajusta o texto do eixo X para que não se sobreponha
 theme(axis.text.x = element_text(angle = 45, hjust = 1))

 # Torna o gráfico interativo
ggplotly(boxplot_nota_geral_por_região)

CONCLUSÃO As regiões Sul e Sudeste apresentam maiores medianas e distribuições mais amplas, indicando tanto melhor desempenho médio quanto maior diversidade de resultados. As regiões Centro-Oeste e Nordeste possuem notas medianas intermediárias, enquanto a região Norte registra as menores medianas e menor amplitude, refletindo desempenho mais concentrado em faixas baixas de nota. A presença de outliers positivos no Sudeste e Sul sugere que nessas regiões há alunos e instituições com resultados excepcionalmente altos.

Boxplot da nota por região, dividido por raça

boxplot_nota_geral_por_região_dividido_raça = ggplot(df_automacao_sem_na,
 # Eixo X é a Região; Eixo Y é a Nota
 aes(x = Região, y = NT_GER, fill = Região)) +
 geom_boxplot() +
 ggtitle("Nota geral por região, separada por raça") +
 xlab("Região do Curso") +
 ylab("Nota Geral (NT_GER)") +
 # Facetamento principal: cria um painel (gráfico) para cada Cor/Raça
 facet_wrap(~ Cor_ou_raça, ncol = 3) +
 # Ajusta o texto do eixo X (Região) para que não se sobreponha
 theme(axis.text.x = element_text(angle = 45, hjust = 1))

 # Torna o gráfico interativo
ggplotly(boxplot_nota_geral_por_região_dividido_raça)

Boxplot da nota geral por raça, dividido por região

boxplot_nota_geral_por_raça_dividido_região = ggplot(df_automacao_sem_na,
 # Eixo X é a Raça; Eixo Y é a Nota
 aes(x = Cor_ou_raça, y = NT_GER, fill = Cor_ou_raça)) +
 geom_boxplot() +
 ggtitle("Nota Geral por Raça, separada por região") +
 xlab("Cor ou Raça") +
 ylab("Nota Geral (NT_GER)") +

 # Facetamento principal: cria um painel (gráfico) para cada Região
 facet_wrap(~ Região) +

 # Ajusta o texto do eixo X para que não se sobreponha
 theme(axis.text.x = element_text(angle = 45, hjust = 1))

 # Torna o gráfico interativo
ggplotly(boxplot_nota_geral_por_raça_dividido_região)

CONCLUSÃO Em todas as raças, as regiões Sul e Sudeste concentram as maiores medianas e a maior dispersão de notas, indicando melhor desempenho e maior heterogeneidade entre os estudantes. Os alunos brancos e amarelos mantêm as maiores médias em todas as regiões, enquanto os pardos e pretos registram as menores notas medianas, especialmente nas regiões Norte e Nordeste. O grupo “não quero declarar” apresenta desempenho relativamente alto em todas as regiões. Esses resultados reforçam a existência de diferenças de desempenho associadas tanto à localização geográfica quanto ao perfil racial, sugerindo desigualdades estruturais no acesso e na qualidade do ensino.