Estudante relação entre Nível Socioeconômico (INSE) e desempenho na nota de matemática do SAEB

Contexto

Essa atividade foi desenvolvida na disciplina de Ciência de Dados Educacionais ministrado numa pós-graduação.
A atividade tratava-se de desenvolver uma análise de dados sobre alguma(s) base(s) de dados educacional(is) aberta(s).

A atividade aqui realizada foi de identificar uma possível relação entre o desempenho dos estudantes do 9º ano das escolas públicas de Pernambuco nas notas de matemática do SAEB e o seu nível socioeconômico disponibilizado pelo INSE. A base do SAEB foi obtida através do site: https://basedosdados.org/, e os dados do INSE foram obtido pelo link: https://www.gov.br/inep/pt-br/acesso-a-informacao/dados-abertos/indicadores-educacionais/nivel-socioeconomico

O desempenho dos estudantes é representado pela média em matemática da escola na prova do SAEB, e o nível socioeconômico da mesma forma, o INSE é dado por escola.

As notas do SAEB são referentes aos anos de 2011, 2013, 2015, 2017 e 2019. Enquanto que os dados do INSE foram publicados em 2011, 2015 e 2019. Levou-se em consideração que o INSE é válido para o ano da publicação e em diante, até a publicação da próxima edição do INSE.

Limpeza e organização dos dados

Inicialmente precisou-se limpar e organizar as bases e juntá-las por ano.

A seguir é descrito o processo feito com as bases do SAEB 2011 e INSE 2011-2013, e esse processo é replicado com os outros anos.

Carregando pacotes

library(tidyverse)
library(readr)
library(readxl)
library(rstatix)
library(ggpubr)

Carregando bases

As bases já foram carregadas filtrando por dados apenas de Pernambuco e por escolas estaduais e municipais (públicas). Na base do SAEB base também filtrou-se pelas notas apenas dos 9º anos. E por fim, dá-se um select() para captar apenas o que será usado, e retira-se os valores não avaliáveis (NA).

base <- read_csv2("base de dados/TS_ESCOLA_2011.csv") %>% filter(ID_UF == 26) %>% filter(ID_DEPENDENCIA_ADM == 2 | ID_DEPENDENCIA_ADM == 3) %>% filter(ID_SERIE == "9") %>% select(ID_SAEB, ID_ESCOLA, ID_DEPENDENCIA_ADM, MEDIA_MT) %>% na.omit()

base_inse <- read_excel("base de dados/INSE_2011-2013.xlsx", range = "A10:O73582") %>% filter(COD_ESTADO == "26") %>% filter(ID_REDE == "2" | ID_REDE == "3") %>% select (COD_ESCOLA, `INSE - CLASSIFICAÇÃO`) %>% na.omit()

Segue um resumo dos dados carregados.

glimpse(base)
## Rows: 1,360
## Columns: 4
## $ ID_SAEB            <dbl> 2011, 2011, 2011, 2011, 2011, 2011, 2011, 2011, 201~
## $ ID_ESCOLA          <dbl> 26106582, 26106612, 26106698, 26106701, 26106728, 2~
## $ ID_DEPENDENCIA_ADM <dbl> 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 3, 3, 3, 3, 3, ~
## $ MEDIA_MT           <dbl> 221.91, 232.53, 244.20, 241.24, 208.44, 220.05, 218~
glimpse(base_inse)
## Rows: 2,958
## Columns: 2
## $ COD_ESCOLA             <dbl> 26106450, 26106477, 26106582, 26106612, 2610665~
## $ `INSE - CLASSIFICAÇÃO` <chr> "Médio", "Médio", "Médio", "Médio", "Médio", "M~

Limpeza e organização

Renomeou-se as colunas. As informações sobre a rede da escola é trazida pelas bases como números, sendo assim também corrige-se esse problema em base. Em base_inse é necessário transformar o nível socioeconômico em fator e estabelecer uma relação de nível.

names(base) <- c("ano", "id_escola", "rede", "nota_saeb_matematica")

names(base_inse) <- c("id_escola", "inse")

base$rede <- gsub(2, "estadual", base$rede)

base$rede <- gsub(3, "municipal", base$rede)

base_inse$inse <- factor(base_inse$inse, levels= c("Muito Baixo", "Baixo", "Médio Baixo", "Médio", "Médio Alto", "Alto", "Muito Alto"))

E, por último, une-se as duas bases.

base <- left_join(base, base_inse, by = "id_escola")
base_2011 <- base %>% na.omit()
remove(base_inse)
remove(base)

Fazendo uma análise micro

Essa análise também foi replicada para os outros anos.

Estatística descritiva

Plotou-se um boxplot, com ggplot, para visualizar a estatística descritiva dos dados e um summary.

##       ano         id_escola            rede           nota_saeb_matematica
##  Min.   :2011   Min.   :26000024   Length:1360        Min.   :175.5       
##  1st Qu.:2011   1st Qu.:26051553   Class :character   1st Qu.:216.3       
##  Median :2011   Median :26089930   Mode  :character   Median :226.5       
##  Mean   :2011   Mean   :26086359                      Mean   :227.6       
##  3rd Qu.:2011   3rd Qu.:26121506                      3rd Qu.:237.3       
##  Max.   :2011   Max.   :26548720                      Max.   :341.3       
##                                                                           
##           inse    
##  Muito Baixo:  2  
##  Baixo      :154  
##  Médio Baixo:658  
##  Médio      :513  
##  Médio Alto : 31  
##  Alto       :  1  
##  Muito Alto :  1

É possível ver uma discrepância considerável entre os resultados dos estudantes de nível socioeconômico Médio Alto e os inferiores. Nos INSEs inferiores, têm-se medianas muito próximas na rede estadual, e medianas parecidas entre o Médio e o Médio Baixo, mas estas ainda são superiores os níveis Baixo e Muito Baixo.

Verificando pressupostos para a posterior verificação de relação entre essas variáveis

O teste que será aplicado é o de Kruskal-Wallis, com um grau de confiança de 95%, para verificar se existe relação entre a variável nota_saeb_matematica e inse. Dessa forma, é necessário analisar se os pressupostos são atendidos para tal. Os pressupostos são: Os dados precisam ser independentes e não podem ter uma distribuição normal

Os dados são independentes, pois a nossa hipótese é de que o nível socioeconômico influencia na nota de matematica da prova do SAEB, e não há nada que comprove isso nos dados brutos.

Normalidade

Utilizou-se o teste de kolmogorov para verificar a normalidade.

ks.test(base_2011$nota_saeb_matematica, rnorm(1360))
## Warning in ks.test(base_2011$nota_saeb_matematica, rnorm(1360)): p-value will be
## approximate in the presence of ties
## 
##  Two-sample Kolmogorov-Smirnov test
## 
## data:  base_2011$nota_saeb_matematica and rnorm(1360)
## D = 1, p-value < 2.2e-16
## alternative hypothesis: two-sided

Como p-value < 2.2e-16 então nega-se a hipótese nula (dados normais) e aceita-se a alternativa (dados não-normais).

Teste de Kruskal-Wallis

res_teste_kruskal <- base_2011 %>% kruskal_test(nota_saeb_matematica ~ inse)
res_teste_kruskal
## # A tibble: 1 x 6
##   .y.                      n statistic    df        p method        
## * <chr>                <int>     <dbl> <int>    <dbl> <chr>         
## 1 nota_saeb_matematica  1360      72.7     6 1.13e-13 Kruskal-Wallis

Note que o p-valor é inferior a 0.05, então nega-se a hipótese nula (todos os grupos apresentam medianas são iguais) e aceita-se a alternativa (existem grupos que apresentam medianas diferentes). Logo, alguns grupos com níveis socioeconômicos diferentes, apresentam notas de matemática diferentes.

Tamanho do efeito

res_efeito_kruskal <- base_2011 %>% kruskal_effsize(nota_saeb_matematica ~ inse)
res_efeito_kruskal
## # A tibble: 1 x 5
##   .y.                      n effsize method  magnitude
## * <chr>                <int>   <dbl> <chr>   <ord>    
## 1 nota_saeb_matematica  1360  0.0493 eta2[H] small

A magnitude, ou o tamanho, do efeito é pequeno, isso significa que a relação entre as duas variáveis não é tão forte, mas o teste de Kruskal-Wallis verificou a existência de relação. O tamanho do efeito resultou em moderado quando aplicado no ano de 2015s.

Verificando onde está a relação encontrada pelo teste

res_dunn_test <- base_2011 %>% dunn_test(nota_saeb_matematica ~ inse, p.adjust.method = "bonferroni") %>% filter(p.adj.signif != "ns") %>% select(group1, group2, n1, n2, p.adj, p.adj.signif)
res_dunn_test
## # A tibble: 6 x 6
##   group1      group2         n1    n2    p.adj p.adj.signif
##   <chr>       <chr>       <int> <int>    <dbl> <chr>       
## 1 Muito Baixo Médio Alto      2    31 9.22e- 3 **          
## 2 Baixo       Médio Baixo   154   658 1.20e- 6 ****        
## 3 Baixo       Médio         154   513 3.53e- 6 ****        
## 4 Baixo       Médio Alto    154    31 1.13e-11 ****        
## 5 Médio Baixo Médio Alto    658    31 7.73e- 6 ****        
## 6 Médio       Médio Alto    513    31 7.89e- 6 ****

Utilizou-se o teste de Dunn, com o método de ajuste Bonferroni, para verificar entre quais grupos havia diferença estatisticamente significativa. O resultado indica 6 relações entre os grupos.

Visualizando diferenças num boxplot

my_comparisons <- list( c("Muito Baixo", "Médio Alto"), c("Baixo", "Médio Baixo"), c("Baixo", "Médio"), c("Baixo", "Médio Alto"), c("Médio Baixo", "Médio Alto"), c("Médio", "Médio Alto"))

base_2011 %>% filter(inse != "Alto" & inse != "Muito Alto") %>% ggboxplot(x = "inse", y = "nota_saeb_matematica", color = "inse", bxp.errorbar = TRUE, facet.by = "rede") + stat_compare_means(comparisons = my_comparisons) + labs(subtitle = get_test_label(res_teste_kruskal, type = "expression", detailed = TRUE), caption = get_pwc_label(res_dunn_test, type = "expression"), x = "INSE", y = "Nota SAEB Matematica") + theme(axis.text.x = element_text(size = 6 ,angle = 60, hjust = 1))

Em my_comparisons indica-se quais relações serão expostas no boxplot. Pode-se observar no plot que há diferença significativa na nota de matemática entre a maior parte dos níveis socioeconômicos, e que os níveis socioeconômicos maiores tendem a ter uma nota de matemática maior.