Reflexos das Ações Afirmativas no ENADE: Formação de Professoras/es de Física

1. Carregamento da base de dados

Iniciamos a importação da base de dados do ENADE, utilizando um arquivo .csv que já recebeu um pré-processamento para reunir dados das edições de 2014, 2017 e 2021.

#importando a base de dados
dados <- fread("C:/Users/manoe/Documents/PROJETO ENADE/1. Dados/dados_lic_enade_14_17_21.csv")

2. Pré-processamento dos dados

Aqui reduzimos o número de respostas das/os estudantes àquelas/es que fizeram Física Licenciatura em Universidades Públicas (Federais, Estaduais ou Municipais) na modalidade Presencial. Além disso, selecionamos as respostas de pessoas presentes e com resultado válido. Por fim, reduzimos nossa amostra às variáveis que julgamos importantes após extensa análise estatística e reflexões teóricas.

Essas variáveis foram: Ano, Categoria Administrativa da IES, Modalidade de Ensino, Estado, Região, Idade, Sexo, Tipo de Presença, Curso, Nota do Componente Específico, Cor ou Raça, Ações Afirmativas e Modalidade do Ensino Médio.

#reduz os dados para apenas o curso de Física Licenciatura 1402
dados <- dados |> filter(CO_GRUPO == 1402)

#reduz os dados às pessoas presentes e com resultados considerados
dados <- dados |> filter(TP_PRES == 555)

#seleciona as instituições públicas e presenciais
dados_pub <- dados |> filter(CO_CATEGAD == 1|CO_CATEGAD == 2|CO_CATEGAD == 3)

#seleciona os resultados dos cursos presenciais
dados_pub <- dados_pub |> filter(CO_MODALIDADE == 1)

dados_pub <- dados_pub |> select(NU_ANO, CO_CATEGAD, CO_MODALIDADE, CO_UF_CURSO,
                                 CO_REGIAO_CURSO, NU_IDADE, TP_SEXO, TP_PRES,
                                 CO_GRUPO, NT_CE, QE_I02, QE_I15, QE_I18
                                 )

Também modificamos as categorias das respostas para melhor se adequarem a nossa análise estatística. Por exemplo, as variáveis Ano (NU_ANO) e Região (CO_REGIAO) eram do tipo numérica, mas para nossa análise precisamos que sejam categóricas.

#Mudando a categoria das respostas ####
dados_pub <- dados_pub |>
  mutate(
    CO_REGIAO_CURSO = case_when(
      CO_REGIAO_CURSO == 1 ~ "N",
      CO_REGIAO_CURSO == 2 ~ "NE",
      CO_REGIAO_CURSO == 3 ~ "SE",
      CO_REGIAO_CURSO == 4 ~ "S",
      CO_REGIAO_CURSO == 5 ~ "CO"
      )
  )

dados_pub <- dados_pub |>
mutate(
  NU_ANO = case_when(
    NU_ANO == 2014 ~ "2014",
    NU_ANO == 2017 ~ "2017",
    NU_ANO == 2021 ~ "2021"
    )
  )
dados_pub <- dados_pub |>
mutate(
    CO_UF_CURSO = case_when(
      CO_UF_CURSO == 11 ~ "Rondônia (RO)",
      CO_UF_CURSO == 12 ~ "Acre (AC)",
      CO_UF_CURSO == 13 ~ "Amazonas (AM)",
      CO_UF_CURSO == 14 ~ "Roraima (RR)",
      CO_UF_CURSO == 15 ~ "Pará (PA)",
      CO_UF_CURSO == 16 ~ "Amapá (AP)",
      CO_UF_CURSO == 17 ~ "Tocantins (TO)",
      CO_UF_CURSO == 21 ~ "Maranhão (MA)",
      CO_UF_CURSO == 22 ~ "Piauí (PI)",
      CO_UF_CURSO == 23 ~ "Ceará (CE)",
      CO_UF_CURSO == 24 ~ "Rio Grande do Norte (RN)",
      CO_UF_CURSO == 25 ~ "Paraíba (PB)",
      CO_UF_CURSO == 26 ~ "Pernambuco (PE)",
      CO_UF_CURSO == 27 ~ "Alagoas (AL)",
      CO_UF_CURSO == 28 ~ "Sergipe (SE)",
      CO_UF_CURSO == 29 ~ "Bahia (BA)",
      CO_UF_CURSO == 31 ~ "Minas Gerais (MG)",
      CO_UF_CURSO == 32 ~ "Espírito Santo (ES)",
      CO_UF_CURSO == 33 ~ "Rio de Janeiro (RJ)",
      CO_UF_CURSO == 35 ~ "São Paulo (SP)",
      CO_UF_CURSO == 41 ~ "Paraná (PR)",
      CO_UF_CURSO == 42 ~ "Santa Catarina (SC)",
      CO_UF_CURSO == 43 ~ "Rio Grande do Sul (RS)",
      CO_UF_CURSO == 50 ~ "Mato Grosso do Sul (MS)",
      CO_UF_CURSO == 51 ~ "Mato Grosso (MT)",
      CO_UF_CURSO == 52 ~ "Goiás (GO)",
      CO_UF_CURSO == 53 ~ "Distrito Federal (DF)"
    )
  )

Por fim, ao analisarmos alguns testes de hipóteses observamos a importância de que não existam valores nulos. Utilizamos um método não otimizado para encontrar quais variáveis continham esses valores, sendo elas: Notas do Componente Específico (NT_CE) e as questões 2, 15 e 18 (QE_I02, QE_I15 e QE_I18) do Questionário do Estudante. Ambas indicando 9 respostas nulas.

table(dados_pub$NU_ANO)
table(dados_pub$CO_CATEGAD)
table(dados_pub$CO_MODALIDADE)
table(dados_pub$CO_UF_CURSO)
table(dados_pub$CO_REGIAO_CURSO)
table(dados_pub$NU_IDADE)
table(dados_pub$TP_SEXO)
table(dados_pub$TP_PRES)
table(dados_pub$CO_GRUPO)
table(dados_pub$NT_CE)
table(dados_pub$QE_I02) #existiram
table(dados_pub$QE_I15) #existiram
table(dados_pub$QE_I18) #existiram

Estas respostas com valores nulos ou inexistentes foram excluídos de maneira simples e geral a partir da função “na.omit”. Sendo tais variáveis fundamentais para nossa análise posterior e compondo um número reduzido, não haverá impacto na amplitude dos resultados.

#Filtrar as pessoas que não responderam os itens QE_I02,15, 18 e tiveram NT_CE = NA
dados_pub <- na.omit(dados_pub)

3. Análise Descritiva

Nesta seção mostraremos as tabela de contingência para as variáveis qualitativas, expressar alguns comportamentos importantes graficamente, bem como testes de relação entre as variáveis.

3.1 Base de dados

3.2 Agrupamento das Notas do Componente Específico

Nota do CE por Região

#Para agrupar e sumarisar com a média, desvio padrão, mínima e máxima
nt_ce_regiao <- dados_pub |>
  group_by(CO_REGIAO_CURSO) |>
  summarise(
    Média = mean(NT_CE, na.rm = TRUE),
    SD = sd(NT_CE, na.rm = TRUE),
    Mínima = min(NT_CE, na.rm = TRUE),
    Máxima = max(NT_CE, na.rm = TRUE)
  )
#para colocar em ordem crescente das médias
nt_ce_regiao <- nt_ce_regiao |> arrange(Média)
#embelezando a tabela
formattable(nt_ce_regiao,
            list(Máxima = color_tile("lightblue", "lightgreen"),Mínima = color_tile("orange","red"))
            )
CO_REGIAO_CURSO Média SD Mínima Máxima
CO 35.55232 20.17231 0.0 76.2
N 38.59257 17.17320 0.0 84.8
SE 39.07882 17.92505 0.0 87.1
S 39.92838 19.41922 3.0 84.7
NE 41.02119 16.38708 8.5 89.4

Nota do CE por Estado

#Para agrupar e sumarisar com a média, desvio padrão, mínima e máxima
nt_ce_estado <- dados_pub |>
  group_by(CO_UF_CURSO) |>
  summarise(
    Média = mean(NT_CE, na.rm = TRUE),
    SD = sd(NT_CE, na.rm = TRUE),
    Mínima = min(NT_CE, na.rm = TRUE),
    Máxima = max(NT_CE, na.rm = TRUE)
  )
nt_ce_estado <- nt_ce_estado |> arrange(Média)
formattable(nt_ce_estado,
            list(Máxima = color_tile("lightblue", "lightgreen"),Mínima = color_tile("orange","red"))
            )
CO_UF_CURSO Média SD Mínima Máxima
Distrito Federal (DF) 15.96449 17.210348 0.0 57.0
Paraíba (PB) 28.91733 10.683527 9.7 75.7
Sergipe (SE) 30.08462 7.578375 17.9 51.6
Rondônia (RO) 30.19149 11.593061 0.0 51.5
Roraima (RR) 34.43750 9.238427 19.3 50.2
Rio de Janeiro (RJ) 34.82537 15.132060 8.9 83.2
Pará (PA) 35.09874 12.745499 7.7 74.4
Mato Grosso do Sul (MS) 35.59425 12.895595 14.8 57.2
Alagoas (AL) 35.84396 14.113924 8.6 59.8
Amazonas (AM) 37.53916 21.341641 3.5 69.2
Paraná (PR) 37.97251 20.156946 5.1 84.7
Bahia (BA) 38.35084 13.878834 15.2 81.3
Ceará (CE) 38.68859 16.002009 16.6 89.4
Mato Grosso (MT) 39.03462 19.117769 0.0 60.9
Minas Gerais (MG) 39.41994 18.861534 3.8 85.9
São Paulo (SP) 40.26918 18.143601 0.0 78.8
Rio Grande do Sul (RS) 40.51023 17.066631 3.0 83.5
Santa Catarina (SC) 42.46735 19.928137 3.8 83.1
Maranhão (MA) 43.04306 18.771705 8.5 87.5
Pernambuco (PE) 44.15613 17.716354 8.5 85.6
Goiás (GO) 44.33452 17.520613 8.9 76.2
Rio Grande do Norte (RN) 46.09467 13.341872 10.7 72.2
Tocantins (TO) 47.43457 17.042206 14.7 71.1
Piauí (PI) 47.63511 15.699831 17.4 89.0
Amapá (AP) 53.14638 20.312272 25.5 84.8
Espírito Santo (ES) 54.72657 16.553809 19.4 87.1
Acre (AC) 55.66615 20.344885 23.8 82.2

3.3 Gráficos Descritivos

Histogramas

Histograma em planos mostrando uma possível normalidade da relação

ggplot(dados_pub, aes(x = NT_CE, fill = TP_SEXO)) + geom_histogram(binwidth = 1, alpha = 0.5) + facet_grid(TP_SEXO ~ .)

ggplot(dados_pub, aes(x = NT_CE, fill = QE_I02)) + geom_histogram(binwidth = 1, alpha = 0.5) + facet_grid(QE_I02 ~ .)

ggplot(dados_pub, aes(x = NT_CE, fill = QE_I15)) + geom_histogram(binwidth = 1, alpha = 0.5) + facet_grid(QE_I15 ~ .)

ggplot(dados_pub, aes(x = NT_CE, fill = QE_I18)) + geom_histogram(binwidth = 1, alpha = 0.5) + facet_grid(QE_I18 ~ .)

BoxPlot

ggplot(dados_pub, aes(x = TP_SEXO, y = NT_CE)) + geom_boxplot()

ggplot(dados_pub, aes(x = interaction(TP_SEXO, QE_I02, QE_I15, QE_I18),
                      y = NT_CE)) + geom_boxplot()

Barras

ggplot(dados_pub,aes(QE_I02)) + geom_bar()

ggplot(dados_pub,aes(QE_I15)) + geom_bar()

ggplot(dados_pub,aes(QE_I18)) + geom_bar()

3.4 Testes de Normalidade

Shapiro-Wilk

set.seed(123) # Para reprodutibilidade escolher uma semente 123
subsample_NT <- sample(dados_pub$NT_CE, 5000)

shapiro.test(subsample_NT) #não funcionou
## 
##  Shapiro-Wilk normality test
## 
## data:  subsample_NT
## W = 0.97592, p-value < 2.2e-16

ANOVA

anova <- aov(NT_CE ~ TP_SEXO * QE_I02 * QE_I15 * QE_I18, data = dados_pub)
summary(anova)
##                  Df  Sum Sq Mean Sq   F value   Pr(>F)    
## TP_SEXO           1 1357058 1357058 22764.470  < 2e-16 ***
## QE_I02            3  507362  169121  2836.974  < 2e-16 ***
## QE_I15            4   99601   24900   417.700  < 2e-16 ***
## QE_I18            3   12724    4241    71.146  < 2e-16 ***
## TP_SEXO:QE_I02    1     379     379     6.351 0.011749 *  
## QE_I02:QE_I15     3    1089     363     6.087 0.000392 ***
## QE_I02:QE_I18     2     571     286     4.790 0.008341 ** 
## QE_I15:QE_I18     1     268     268     4.493 0.034070 *  
## Residuals      7914  471777      60                       
## ---
## Signif. codes:  0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1

Welch ANOVA

oneway.test(NT_CE ~ interaction(TP_SEXO, QE_I02, QE_I15, QE_I18),
            data = dados_pub, var.equal = FALSE)
## 
##  One-way analysis of means (not assuming equal variances)
## 
## data:  NT_CE and interaction(TP_SEXO, QE_I02, QE_I15, QE_I18)
## F = 2648.5, num df = 18.00, denom df = 389.33, p-value < 2.2e-16

Indicou variações significativas

Teste de Levene

leveneTest(NT_CE ~ TP_SEXO * QE_I02 * QE_I15 * QE_I18, data = dados_pub)
## Levene's Test for Homogeneity of Variance (center = median)
##         Df F value    Pr(>F)    
## group   18  52.567 < 2.2e-16 ***
##       7914                      
## ---
## Signif. codes:  0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1

As variâncias não são homogêneas, rejeitando a hipótese muito necessária para usar na ANOVA

Teste de Kruskal-Wallis

kruskal.test(NT_CE ~ TP_SEXO, data = dados_pub)
## 
##  Kruskal-Wallis rank sum test
## 
## data:  NT_CE by TP_SEXO
## Kruskal-Wallis chi-squared = 4035.2, df = 1, p-value < 2.2e-16

4. Análise Inferencial

4.1 Binarização

Cria uma variável binária que indica se a nota está entre as 25% maiores notas

Encontra a menor nota necessária para estar nas 25% maiores notas

quartis_pub <- quantile(dados_pub$NT_CE, 0.75, na.rm = TRUE)
print(quartis_pub)
## 75% 
##  54

Cria uma nova variável binária indicando se a Nota do Componente Específico foi menor que o encontrado, valorando 0 ou maior/igual valorando 1.

dados_pub <- dados_pub |>
  mutate(atingiu = ifelse(NT_CE >= 54,1,0))

4.2 Modelo de Regressão Logística

reg_log_pub <- glm(atingiu ~ TP_SEXO + QE_I02 + QE_I15 + QE_I18,
                   data = dados_pub, family = binomial)

summary(reg_log_pub)
## 
## Call:
## glm(formula = atingiu ~ TP_SEXO + QE_I02 + QE_I15 + QE_I18, family = binomial, 
##     data = dados_pub)
## 
## Coefficients:
##             Estimate Std. Error z value Pr(>|z|)    
## (Intercept)  -8.4407     1.0001  -8.440  < 2e-16 ***
## TP_SEXOM      0.5483     0.1224   4.480 7.46e-06 ***
## QE_I02B       4.3299     1.0617   4.078 4.54e-05 ***
## QE_I02C       6.7527     1.0116   6.675 2.47e-11 ***
## QE_I02D       8.4799     1.0032   8.453  < 2e-16 ***
## QE_I15B       1.1138     0.2849   3.910 9.24e-05 ***
## QE_I15C       0.5922     0.2830   2.092   0.0364 *  
## QE_I15D      15.4782   342.0817   0.045   0.9639    
## QE_I15E      13.7510   918.2000   0.015   0.9881    
## QE_I18B       1.1311     0.1929   5.864 4.51e-09 ***
## QE_I18C       2.9048     0.4181   6.948 3.71e-12 ***
## QE_I18D       4.2277   745.4034   0.006   0.9955    
## ---
## Signif. codes:  0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
## 
## (Dispersion parameter for binomial family taken to be 1)
## 
##     Null deviance: 8925.9  on 7932  degrees of freedom
## Residual deviance: 2410.9  on 7921  degrees of freedom
## AIC: 2434.9
## 
## Number of Fisher Scoring iterations: 17

4.3 Tabela dos Coeficientes do Modelo

tbl_regression(reg_log_pub,
               label = list(TP_SEXO ~ "SEXO",
                            QE_I02 ~ "COR OU RAÇA",
                            QE_I15 ~ "AFIRMATIVAS",
                            QE_I18 ~ "MODALIDADE EM")
               )
Characteristic log(OR)1 95% CI1 p-value
SEXO


    F
    M 0.55 0.31, 0.79 <0.001
COR OU RAÇA


    A
    B 4.3 2.6, 7.3 <0.001
    C 6.8 5.2, 9.6 <0.001
    D 8.5 7.0, 11 <0.001
AFIRMATIVAS


    A
    B 1.1 0.57, 1.7 <0.001
    C 0.59 0.04, 1.2 0.036
    D 15 233, 186 >0.9
    E 14 642, 666 >0.9
MODALIDADE EM


    A
    B 1.1 0.76, 1.5 <0.001
    C 2.9 2.1, 3.7 <0.001
    D 4.2 0.51, 7.7 >0.9
1 OR = Odds Ratio, CI = Confidence Interval
tbl_regression(reg_log_pub, exponentiate = TRUE,
               label = list(TP_SEXO ~ "SEXO",
                            QE_I02 ~ "COR OU RAÇA",
                            QE_I15 ~ "AFIRMATIVAS",
                            QE_I18 ~ "MODALIDADE EM")
               )
Characteristic OR1 95% CI1 p-value
SEXO


    F
    M 1.73 1.36, 2.20 <0.001
COR OU RAÇA


    A
    B 75.9 13.9, 1,410 <0.001
    C 856 187, 15,183 <0.001
    D 4,817 1,083, 84,715 <0.001
AFIRMATIVAS


    A
    B 3.05 1.76, 5.41 <0.001
    C 1.81 1.05, 3.18 0.036
    D 5,273,566 168,414,516,919,503,358,630,488,866,602,642,022,008,600,282,848,480,202,682,062,482,664,666,484,688,842,464,022,244,064,484,808,004,888, 396,292,211,345,452,538,208,484,866,860,864,648,000,802,886,244,426,668,620,464,026,062,088,604,848,600,622 >0.9
    E 937,556 757,955,472,074,415,115,362,484,222,460,020,864,464,042,002,840,020,224,424,886,406,446,406,880,064,608,080,642,284,262,666,402,224,684,428,280,444,444,064,622,800,444,426,680,624,060,824,404,688,820,488,666,280,222,624,066,426,260,240,684,080,606,886,448,604,462,264,466,646,468,486,260,008,684,860,826,446,008,086,220,068,406,022,282,622,068,642,668,688,200,640,444,044, 14,248,878,681,955,483,592,064,462,682,288,802,408,680,440,828,648,464,448,840,688,020,882,662,042,468,088,466,048,220,820,028,062,268,464,228,880,860,802,660,060,624,222,644,400,866,842,604,242,404,208,022,844,022,688,686,462,244,420,204,864,040,006,682,448,680,220,248,060,822,268,088,466,062,208,686,602,880,840,628,480,846,664,288,488,604,486,808,640,480,686,002,408,622,086,484,064 >0.9
MODALIDADE EM


    A
    B 3.10 2.13, 4.54 <0.001
    C 18.3 8.17, 42.2 <0.001
    D 68.6 1.66, 2,251 >0.9
1 OR = Odds Ratio, CI = Confidence Interval

4.4 Gráfico dos Coeficientes

plot_model(reg_log_pub)