Este documento apresenta uma análise exploratória de dados e discussões acerca do acesso de estudantes de escolas públicas do Ceará à internet em suas respectivas instituições de ensino. Este trabalho é um requisito para aprovação na disciplina de Fundamentos de Estatística da Universidade de Fortaleza, no âmbito do curso de Inteligência Artificial.

Autor: Pedro Florencio de Almeida Neto | Cientista de Dados


Objetivo Geral:

Objetivos Específicos:

Perguntas Norteadoras:

  1. Qual o percentual de escolas municipais, estaduais e federais no Estado do Ceará?

  2. Qual o percentual de escolas rurais e urbanas no Estado?

  3. Qual o panorama das escolas que tem laboratório de informática no Ceará?

1. Bibliotecas

# install.packages("readxl")
# install.packages("leaflet")
# install.packages("echarts4r")
# install.packages("BAMMtools")

2. Aquisição dos Dados

Os dados foram baixados de . O script “01-filtra-base-ceara.R” é responsável por

df <- read_excel('data/processed-data/base_ceara_validada.xlsx')
df <- df[!is.na(df$escolar_co_municipio), ]
head(df)
## # A tibble: 6 × 59
##   escolar_co_entidade escolar_nu_ano_censo escolar_no_entidade              
##                 <dbl>                <dbl> <chr>                            
## 1            23000465                 2024 JOAO LOURENCO PEREIRA ROCHA EEIEF
## 2            23000660                 2024 MARIA NAZARE VIANA EEIEF         
## 3            23000708                 2024 HIGINO DE SOUZA BRANDAO EEIEF    
## 4            23001119                 2024 RAIMUNDO ROSA DO NASCIMENTO EEIEF
## 5            23003014                 2024 MURILO ROCHA AGUIAR EEF DEP      
## 6            23003359                 2024 ANTONIO TEIXEIRA DE FRANCA EEF   
## # ℹ 56 more variables: escolar_tp_situacao_funcionamento <chr>,
## #   escolar_co_uf <dbl>, escolar_co_municipio <dbl>, escolar_co_distrito <dbl>,
## #   escolar_tp_dependencia <chr>, escolar_tp_localizacao <chr>,
## #   escolar_qt_desktop_aluno <dbl>, escolar_qt_comp_portatil_aluno <dbl>,
## #   escolar_qt_tablet_aluno <dbl>, escolar_in_laboratorio_informatica <chr>,
## #   escolar_in_internet <chr>, escolar_in_internet_alunos <chr>,
## #   escolar_in_internet_aprendizagem <chr>, escolar_tp_rede_local <chr>, …

3. Pré-Processamento dos Dados

3.1. Tratamento de dados ausentes

# quantidade de codigos de municipio ausentes
sum(is.na(df$escolar_co_municipio))
## [1] 0

4. Análise Exploratória dos Dados

4.1. Qual o percentual de escolas municipais e estaduais no Estado do Ceará?

# selecao das colunas necessarias
cols <- c("escolar_co_entidade", "escolar_no_entidade", "escolar_tp_dependencia")
df_dependencias <- df %>% select(all_of(cols))

# valores absolutos
df_freq <- as.data.frame(table(df_dependencias$escolar_tp_dependencia))
colnames(df_freq) <- c("TP_DEPENDENCIA","QUANTIDADE")

# percentual
df_freq$PERCENTUAL <- round(df_freq$QUANTIDADE/sum(df_freq$QUANTIDADE), 2)
# visualizacao
df_freq %>%
  e_charts(TP_DEPENDENCIA) %>%
  e_pie(
    QUANTIDADE,
    radius = c("45%", "75%"),
    label = list(
      show = TRUE,
      position = "outside",
      formatter = "{d}%",
      fontSize = 12,
      color = "black"
    )
  ) %>%
  e_legend(right = "25%") %>%
  e_title(
    text = "Gráfico 01: Dependência Administrativa das Escolas Públicas do Ceará",
    textStyle = list(
      color = "black",
      fontSize = 14
    )) %>% 
  e_theme("macarons")

Observa-se uma predominância da quantidade de escolas municipais, isto é, de educação básica no estado do Ceará. Pode-se ressaltar que o número total de instituições não reflete necessariamente um alta taxa de escolarização, necessitando portanto de uma análise do número de matriculados em cada dependência administrativa no Estado.

4.2. Qual o percentual de escolas rurais e urbanas no Estado do Ceará?

# colunas necessarias
cols_necessary <- c('escolar_co_entidade',
                    'escolar_co_entidade',
                    'nm_municipio',
                    'escolar_tp_localizacao')

df_localizacao <- df %>% select(all_of(cols_necessary))

head(df_localizacao)
## # A tibble: 6 × 3
##   escolar_co_entidade nm_municipio escolar_tp_localizacao
##                 <dbl> <chr>        <chr>                 
## 1            23000465 ACARAÚ       Rural                 
## 2            23000660 ACARAÚ       Rural                 
## 3            23000708 ACARAÚ       Urbana                
## 4            23001119 ACARAÚ       Rural                 
## 5            23003014 CAMOCIM      Urbana                
## 6            23003359 CAMOCIM      Rural
# valores absolutos
df_freq_loc <- as.data.frame(table(df_localizacao$escolar_tp_localizacao))
colnames(df_freq_loc) <- c("TP_LOCALIZACAO","QUANTIDADE")

df_freq_loc
##   TP_LOCALIZACAO QUANTIDADE
## 1          Rural       2509
## 2         Urbana       3462
df_freq_loc %>% 
  e_charts(TP_LOCALIZACAO) %>%  
  e_bar(QUANTIDADE, name = "Área da instituição") %>% 
  e_labels(show = TRUE) %>% 
  e_title(text='Gráfico 02: Localização das Escolas Cearenses',
          textStyle = list(color = "black", fontSize = 14)) %>% 
  e_theme('macarons')

Há uma predominância de escolas em zona urbana, embora, a quantidade de instituições em zonas rurais apresenta-se com um valor relevante.

4.3. Qual o panorama das escolas que tem laboratórios de informática no Ceará?

Adicionando dataframe com os limites do Estado do Ceará

gdf_ceara <- st_read('data/processed-data/limites_ceara.geojson')
## Reading layer `limites_ceara' from data source 
##   `/Users/pedroflorencio/Documents/conecta-ceara/data/processed-data/limites_ceara.geojson' 
##   using driver `GeoJSON'
## Simple feature collection with 184 features and 6 fields
## Geometry type: POLYGON
## Dimension:     XY
## Bounding box:  xmin: -41.42352 ymin: -7.858182 xmax: -37.25329 ymax: -2.784323
## Geodetic CRS:  WGS 84

Selecionando as colunas necessárias

cols_join <- c('escolar_no_entidade',
               'escolar_co_municipio',
               'nm_municipio',
               'escolar_tp_localizacao',
               'escolar_in_laboratorio_informatica',
               'escolar_in_internet',
               'escolar_tp_rede_local',
               'escolar_tipo_tecnologia',
               'escolar_in_internet_alunos',
               'escolar_in_internet_aprendizagem') 

df_filtered <- df %>% select(all_of(cols_join)) 
# substituindo coluna por variavel booleana
df_filtered <- df_filtered %>%
  mutate(escolar_in_laboratorio_informatica = ifelse(escolar_in_laboratorio_informatica == "Sim", 1, 0))
# agrupando por municipio e somando a quantidade de laboratorios de informatica
df_filtered <- df_filtered %>%
  group_by(escolar_co_municipio) %>%
  summarise(
    quantidade_escolas_laboratorios = sum(escolar_in_laboratorio_informatica),
    quantidade_escolas = n())

Adicionando coluna com os valores relativos de escolas que contêm laboratórios de informática

df_filtered <- mutate(df_filtered,
                      percentual_laboratorio = quantidade_escolas_laboratorios / quantidade_escolas)

Adicionando a coluna geometry no dataframe df_filtered

# padronizando tipo dos IDs dos municipios
df_filtered$escolar_co_municipio <- as.character(df_filtered$escolar_co_municipio)

df_join <- gdf_ceara %>% 
  left_join(df_filtered, by = c("codigo_ibge"="escolar_co_municipio"))

dim(df_join)
## [1] 184  10

Mapa Coroplético do Percentual de Laboratórios nas Cearenses

A definição de quantidade de categorias seguiu-se a regra de Freedman-Diaconis1, em que:

\[ w = 2*IQR*n^{-\frac{1}{3}} \]

\[ k = \frac{max-min}{w} \]

Onde:

  • IQR: amplitude interquartil

  • n: número de observações

  • k: quantidade de categorias (bins)

Para escolha dos valores que limitam cada categoria, adotou-se o método Jenks-Caspall.

Q1 <- quantile(df_join$percentual_laboratorio, probs = 0.25)
Q2 <- quantile(df_join$percentual_laboratorio, probs = 0.50)
Q3 <- quantile(df_join$percentual_laboratorio, probs = 0.75)

IQR <- (Q3-Q1)

IQR
##       75% 
## 0.1794872
n = nrow(df_join)
n
## [1] 184
w = 2*IQR*(n**(-1/3))
w
##        75% 
## 0.06311377
min = min(df_join$percentual_laboratorio)
max = max(df_join$percentual_laboratorio)

k = (max - min)/w

k
##      75% 
## 15.01049

15 classes serão adotadas.

Aplicando o algoritmo de Jenks-Caspall, temos:

categories <- getJenksBreaks(df_join$percentual_laboratorio, 15)
categories
##  [1] 0.05263158 0.10000000 0.14285714 0.18750000 0.22916667 0.27272727
##  [7] 0.30434783 0.33333333 0.39130435 0.45555556 0.54166667 0.64285714
## [13] 0.71457490 0.80357143 1.00000000

Visualização do mapa

# bins <- categories
bins <- 5 # Natural Breaks (Intervalos iguais)
pal <- colorRampPalette(brewer.pal(9, "YlOrRd"))(15)
pal_fun <- colorBin(
  palette = pal,
  domain = df_join$percentual_laboratorio,
  bins = 5,
  na.color = "transparent"
)

labels <- sprintf(
  "<strong>%s</strong><br/>%.1f%%",
  df_join$municipio, df_join$percentual_laboratorio*100
) %>% lapply(htmltools::HTML)

m <- leaflet(df_join) %>%
  setView(lng = -39.5, lat = -5.2, zoom = 6) %>%
  addProviderTiles(providers$CartoDB.Positron) %>% 
  addPolygons(
  fillColor = ~pal_fun(percentual_laboratorio),
  weight = 2,
  opacity = 1,
  color = "white",
  dashArray = "3",
  fillOpacity = 0.7,
   highlightOptions = highlightOptions(
    weight = 5,
    color = "#666",
    dashArray = "",
    fillOpacity = 0.7,
    bringToFront = TRUE),
  label = labels,
  labelOptions = labelOptions(
    style = list("font-weight" = "normal", padding = "3px 8px"),
    textsize = "15px",
    direction = "auto")) %>% 
  addLegend(pal = pal_fun, values = ~percentual_laboratorio, opacity = 0.7, title = "Percentuais", position = "bottomright")

m

Municípios com menor percentual de escolas com laboratórios

df_order <- df_join %>% arrange(percentual_laboratorio)
head(select(as.data.frame(df_order),
                 municipio,
                 percentual_laboratorio,
                 quantidade_escolas_laboratorios,
                 quantidade_escolas),10)
##      municipio percentual_laboratorio quantidade_escolas_laboratorios
## 1        Graça             0.05263158                               1
## 2     Catarina             0.05882353                               1
## 3       Aurora             0.05882353                               1
## 4  Barroquinha             0.06250000                               1
## 5   Capistrano             0.06666667                               1
## 6      Quixelô             0.06666667                               1
## 7      Meruoca             0.07142857                               1
## 8     Ipueiras             0.07272727                               4
## 9    Paraipaba             0.07407407                               2
## 10      Croatá             0.07500000                               3
##    quantidade_escolas
## 1                  19
## 2                  17
## 3                  17
## 4                  16
## 5                  15
## 6                  15
## 7                  14
## 8                  55
## 9                  27
## 10                 40

Avaliação da disparidade entre os municípios

ggplot(data=df_join) +
  geom_histogram(mapping = aes(x = percentual_laboratorio), 
                 bins = 15, 
                 binwidth = 0.063158,
                 fill = "steelblue", 
                 color = "white", 
                 alpha=0.8,
                 boundary=0) +
  scale_x_continuous(breaks = seq(0, 1, 0.063158),
                     labels = label_number(accuracy = 0.01)) +
  scale_y_continuous(breaks = seq(0, 40, 10)) +
  labs(x='Percentual de escolas com laboratório',y='') + 
  geom_text(
    stat = "bin",
    aes(
      x = percentual_laboratorio,
      y = after_stat(count),
      label = after_stat(count)
    ),
    binwidth = 0.063158,
    boundary = 0,
    vjust = -0.3,
    size=3
  )

summary(df_join$percentual_laboratorio)
##    Min. 1st Qu.  Median    Mean 3rd Qu.    Max. 
## 0.05263 0.15385 0.22822 0.26431 0.33333 1.00000

  1. https://geographicdata.science/book/intro.html↩︎