Cobertura da Educação Infantil no Amazonas (2014–2020): Uma Análise de Clusterização K-Means dos Indicadores da Meta 1 do PNE

Autor
Afiliação

[Autor]

[Instituição]

Data de Publicação

13 de maio de 2026

Nota

Este artigo foi elaborado com auxílio de ferramentas de inteligência artificial sob direção humana. No momento da geração, o conteúdo não foi revisado de forma abrangente por um analista humano.

Ver código
library(readr)
library(dplyr)
library(tidyr)
library(ggplot2)
library(cluster)
library(purrr)
library(scales)
library(factoextra)
library(gridExtra)
library(ggalluvial)
library(knitr)
library(kableExtra)
library(geobr)
library(sf)
library(stringr)
Ver código
df_raw <- read_csv(
  "data/Meta1.csv",
  col_types = cols(
    .default    = col_character(),
    ano         = col_double(),
    indicador1a = col_double(),
    indicador1b = col_double()
  ),
  show_col_types = FALSE
)
Ver código
set.seed(4871)

# Parâmetros
uf_alvo          <- "Amazonas"
ano_inicio       <- 2014
ano_fim          <- 2020
variaveis_cluster <- c("indicador1a", "indicador1b")
cap_indicadores  <- 1.0
limiar_fronteira <- 0.85
k_final          <- 2

# Filtrar, limpar e winsorizar
df_clean <- df_raw |>
  filter(nome_uf == uf_alvo, ano >= ano_inicio, ano <= ano_fim) |>
  select(nome_municipio, nome_mesorregiao, ano,
         all_of(variaveis_cluster)) |>
  drop_na(all_of(variaveis_cluster)) |>
  mutate(
    indicador1a_orig = indicador1a,
    indicador1b_orig = indicador1b,
    indicador1a      = pmin(indicador1a, cap_indicadores),
    indicador1b      = pmin(indicador1b, cap_indicadores)
  )

n_total       <- nrow(df_clean)
n_municipios  <- n_distinct(df_clean$nome_municipio)
n_winsorizados <- sum(df_clean$indicador1a_orig != df_clean$indicador1a |
                      df_clean$indicador1b_orig != df_clean$indicador1b)

# Padronização
df_scaled  <- df_clean |>
  mutate(across(all_of(variaveis_cluster), \(x) scale(x) |> as.vector()))
mat_cluster <- df_scaled |> select(all_of(variaveis_cluster))
Ver código
set.seed(4871)
km_final <- kmeans(mat_cluster, centers = k_final, nstart = 25, iter.max = 100)

# Silhueta e DBI
sil_k2 <- silhouette(km_final$cluster, dist(mat_cluster))
sil_medio <- round(mean(sil_k2[, 3]), 3)

calc_dbi <- function(data, labels) {
  data <- as.matrix(data); ul <- sort(unique(labels)); k <- length(ul)
  cents <- sapply(ul, \(c) colMeans(data[labels == c, , drop = FALSE]))
  s <- sapply(ul, \(c) {
    pts <- data[labels == c, , drop = FALSE]
    mean(sqrt(rowSums(sweep(pts, 2, cents[, match(c, ul)])^2)))
  })
  db_sum <- 0
  for (i in seq_len(k)) {
    max_r <- 0
    for (j in seq_len(k)) {
      if (i != j) {
        d_ij <- sqrt(sum((cents[, i] - cents[, j])^2))
        max_r <- max(max_r, (s[i] + s[j]) / d_ij)
      }
    }
    db_sum <- db_sum + max_r
  }
  db_sum / k
}
dbi_k2 <- round(calc_dbi(mat_cluster, km_final$cluster), 3)

# Rotular clusters
label_map <- tibble(cluster_raw = 1:k_final) |>
  mutate(media_1a = map_dbl(cluster_raw,
    \(c) mean(df_clean$indicador1a[km_final$cluster == c]))) |>
  arrange(media_1a) |>
  mutate(cluster      = factor(row_number()),
         cluster_desc = c("Baixa cobertura", "Alta cobertura"))

df_clust <- df_clean |>
  mutate(cluster_raw = km_final$cluster) |>
  left_join(label_map |> select(cluster_raw, cluster, cluster_desc),
            by = "cluster_raw") |>
  mutate(cluster = factor(cluster, levels = c("1","2")))

# Análise de fronteira
cents_ord <- km_final$centers[label_map$cluster_raw, ]
calc_dist <- function(mat, c) sqrt(rowSums(sweep(as.matrix(mat), 2, c)^2))
df_clust  <- df_clust |>
  mutate(
    d1         = calc_dist(mat_cluster, cents_ord[1, ]),
    d2         = calc_dist(mat_cluster, cents_ord[2, ]),
    d_proprio  = if_else(cluster == "1", d1, d2),
    d_outro    = if_else(cluster == "1", d2, d1),
    razao_dist = round(d_proprio / d_outro, 3),
    fronteira  = razao_dist >= limiar_fronteira
  ) |> select(-d1, -d2)

# Transições
df_trans <- df_clust |>
  arrange(nome_municipio, ano) |>
  group_by(nome_municipio) |>
  mutate(
    cluster_ant   = lag(cluster),
    desc_ant      = lag(cluster_desc),
    ind1a_ant     = lag(indicador1a),
    ind1b_ant     = lag(indicador1b),
    fronteira_ant = lag(fronteira),
    transicao     = !is.na(cluster_ant) & cluster != cluster_ant,
    direcao       = case_when(
      transicao & as.integer(cluster) > as.integer(cluster_ant) ~ "Melhora",
      transicao & as.integer(cluster) < as.integer(cluster_ant) ~ "Piora",
      TRUE ~ NA_character_
    ),
    trans_ambigua = transicao & (fronteira | replace_na(fronteira_ant, FALSE))
  ) |> ungroup()

tabela_trans <- df_trans |>
  filter(transicao) |>
  mutate(delta_1a = round(indicador1a - ind1a_ant, 3),
         delta_1b = round(indicador1b - ind1b_ant, 3))

n_transicoes      <- nrow(tabela_trans)
n_mun_trans       <- n_distinct(tabela_trans$nome_municipio)
n_trans_ambiguas  <- sum(tabela_trans$trans_ambigua)
n_trans_claras    <- n_transicoes - n_trans_ambiguas

Resumo

Este artigo analisa a evolução da cobertura da educação infantil nos municípios do estado do Amazonas entre 2014 e 2020, a partir dos indicadores da Meta 1 do Plano Nacional de Educação (PNE 2014–2024). Utilizando técnicas de aprendizado de máquina não supervisionado — especificamente o algoritmo K-Means —, os 401 registros de 61 municípios foram agrupados em dois perfis distintos: Baixa cobertura e Alta cobertura, validados pelos índices de silhueta (0.47) e Davies-Bouldin (0.958). A análise revela que 14 municípios experimentaram ao menos uma transição de cluster ao longo do período, porém 13 das 21 transições detectadas (62%) ocorreram em zona de fronteira estatística, indicando oscilação próxima ao limiar decisório em vez de mudança estrutural. O estudo evidencia desigualdades persistentes entre mesorregiões e aponta 2020 como ano de deterioração concentrada, possivelmente associada à pandemia de COVID-19. Os resultados reforçam a necessidade de políticas de monitoramento municipalizado e de revisão das projeções demográficas para municípios pequenos e remotos.

Palavras-chave: Educação Infantil; Plano Nacional de Educação; Clusterização K-Means; Amazonas; Meta 1.


1 Introdução

A educação infantil ocupa posição central nas políticas educacionais contemporâneas. Evidências robustas da economia comportamental e das neurociências demonstram que os primeiros anos de vida constituem o período de maior plasticidade cerebral e de formação das competências cognitivas e socioemocionais que influenciarão toda a trajetória educacional e profissional de um indivíduo (Cunha; Heckman, 2007; Heckman, 2006). Nesse contexto, a ampliação do acesso à creche (0–3 anos) e à pré-escola (4–5 anos) não é apenas uma demanda social, mas um imperativo de eficiência econômica e de equidade.

No Brasil, o reconhecimento dessa relevância se materializou na Meta 1 do Plano Nacional de Educação (PNE 2014–2024), aprovado pela Lei n.º 13.005/2014 (Brasil, 2014), que estabelece dois objetivos complementares: (a) universalizar o acesso à pré-escola para crianças de 4 a 5 anos até 2016 e (b) ampliar a oferta de vagas em creche para atender, no mínimo, 50% das crianças de até 3 anos até 2024. O monitoramento periódico dessas metas pelo Instituto Nacional de Estudos e Pesquisas Educacionais Anísio Teixeira (INEP) revela progressos significativos, mas também evidencia disparidades regionais acentuadas (Instituto Nacional de Estudos e Pesquisas Educacionais Anísio Teixeira, 2020, 2022).

O estado do Amazonas apresenta um contexto particularmente desafiador para a implementação dessas metas. Com o segundo maior território do país (1,5 milhão de km²), logística fluvial predominante, elevada dispersão populacional e 62 municípios — muitos deles com menos de 10 mil habitantes —, o Amazonas enfrenta obstáculos estruturais que não se refletem adequadamente nas médias nacionais ou regionais (Instituto Brasileiro de Geografia e Estatística, 2020). Compreender como e por que municípios amazonenses diferem em sua trajetória de cobertura educacional é, portanto, uma questão tanto científica quanto de formulação de políticas públicas.

Este artigo tem como objetivo analisar a evolução da cobertura da Meta 1 do PNE nos municípios do Amazonas entre 2014 e 2020, utilizando o algoritmo K-Means para identificar agrupamentos municipais e rastrear as transições entre esses grupos ao longo do tempo. Especificamente, busca-se: (i) caracterizar o perfil dos clusters de cobertura; (ii) identificar municípios que transitaram entre clusters e avaliar a robustez dessas transições; (iii) examinar a distribuição geográfica dos grupos; e (iv) discutir implicações para o monitoramento do PNE.

2 Revisão da literatura

2.1 Educação infantil como política pública

A literatura econômica documenta consistentemente que os retornos sociais do investimento em educação infantil são superiores aos de qualquer outro nível educacional. O trabalho seminal de Heckman (2006) estima retornos de 7% a 12% ao ano para programas de desenvolvimento na primeira infância voltados a populações vulneráveis. Cunha; Heckman (2007) aprofundam essa perspectiva ao demonstrar que competências formadas na infância são complementares à aprendizagem futura — ou seja, déficits precoces são cumulativos e progressivamente mais custosos de remediar.

No plano internacional, a United Nations Educational, Scientific and Cultural Organization (2020) reafirma o acesso à educação infantil como componente fundamental do direito à educação e alerta que a pandemia de COVID-19 reverteu avanços conquistados na última década, com impactos desproporcionais em países de baixa e média renda. No Brasil, Campos et al. (2011) demonstraram que crianças matriculadas em educação infantil de qualidade apresentam desempenho superior no início do ensino fundamental, efeito especialmente pronunciado em contextos de vulnerabilidade socioeconômica.

2.2 Monitoramento do PNE e desigualdades regionais

O PNE 2014–2024 institucionaliza um sistema de monitoramento bienal conduzido pelo INEP, com divulgação de indicadores municipalizados (Instituto Nacional de Estudos e Pesquisas Educacionais Anísio Teixeira, 2022). Os relatórios de monitoramento evidenciam que, embora a pré-escola tenha alcançado níveis próximos à universalização no agregado nacional, a cobertura de creche permanece heterogênea, com estados da região Norte e Nordeste sistematicamente abaixo da meta (Instituto Nacional de Estudos e Pesquisas Educacionais Anísio Teixeira, 2020). Silveira; Schneider (2020) discutem os desafios institucionais para a implementação do PNE, destacando a fragilidade dos sistemas municipais de gestão educacional como fator limitante, em especial em municípios de pequeno porte.

Um problema metodológico pouco explorado na literatura é a instabilidade das projeções populacionais intercensitárias do IBGE para municípios pequenos (Instituto Brasileiro de Geografia e Estatística, 2020). Como os indicadores da Meta 1 são razões entre matrículas e população estimada, erros nas projeções demográficas geram distorções nos indicadores — fenômeno diretamente observado neste estudo.

2.3 Clusterização K-Means em análises educacionais

O algoritmo K-Means, proposto originalmente por MacQueen (1967) e formalizado por Lloyd (1982), é uma das técnicas de agrupamento não supervisionado mais amplamente empregadas em ciências sociais aplicadas. O algoritmo particiona um conjunto de observações em k grupos, minimizando iterativamente a soma dos quadrados das distâncias intra-cluster (Hartigan; Wong, 1979). James et al. (2013) descrevem o K-Means como adequado para identificar estruturas latentes em dados multivariados, com a ressalva de que a escolha de k e a sensibilidade a outliers demandam análise cuidadosa.

A validação da solução de clusterização pode ser feita por meio do coeficiente de silhueta (Rousseeuw, 1987), que mede a coesão intra-cluster e a separação inter-cluster em uma escala de −1 a 1 — valores acima de 0,50 indicam estrutura razoável, segundo Kaufman; Rousseeuw (1990) —, e do Índice Davies-Bouldin (Davies; Bouldin, 1979), que expressa a razão entre dispersão intra-cluster e separação entre centróides (valores menores indicam melhor separação). Kassambara (2017) discutem o uso combinado dessas métricas como boas práticas para a seleção de k.

3 Metodologia

3.1 Fonte de dados

Os dados utilizados provêm do sistema de monitoramento da Meta 1 do PNE, disponibilizado pelo INEP. A base de dados (Meta1.csv) contém informações anuais de 2014 a 2020 sobre matrículas e população em faixa etária para todos os municípios brasileiros, organizadas em dois indicadores:

  • Indicador 1A (indicador1a): taxa de cobertura da pré-escola, calculada como a razão entre o número de matrículas de crianças de 4 a 5 anos (qtdeMatPre) e a população estimada nessa faixa etária (popFaixa4e5);
  • Indicador 1B (indicador1b): taxa de cobertura da creche, calculada como a razão entre matrículas de crianças de 0 a 3 anos (qtdeMatCreche) e a população estimada (popFaixa0a3).

O recorte da análise compreende os 61 municípios do estado do Amazonas, totalizando 401 observações município-ano (2014–2020).

3.2 Pré-processamento e tratamento de outliers

Após a filtragem e seleção das variáveis, foi realizada verificação de valores ausentes — não foram encontrados registros faltantes nas variáveis de interesse. Entretanto, 18 registros (4.5%) apresentaram indicador1a > 1,0, configurando taxas de cobertura superiores a 100% — matematicamente impossível para uma proporção genuína.

A investigação revelou que esses valores resultam da combinação de dois fatores: (a) queda acentuada nas estimativas populacionais intercensitárias do IBGE para municípios pequenos e (b) número de matrículas que, em alguns casos, inclui crianças fora da faixa etária oficial ou oriundas de municípios vizinhos. O município de Japurá foi o caso mais extremo, com indicador1a = 3,92 em 2020 (525 matrículas para uma população estimada de apenas 134 crianças de 4–5 anos). Foram identificados seis municípios afetados: Japurá (todos os 7 anos), Jutaí (3 anos), Fonte Boa (2 anos), Itamarati (2 anos), Santo Antônio do Içá (2 anos) e São Gabriel da Cachoeira (2 anos).

A estratégia adotada foi a winsorização em cap = 1,0: valores acima de 1,0 foram substituídos por 1,0 (cobertura plena), preservando todos os municípios e registros na análise. Nenhum registro foi removido.

3.3 Padronização e clusterização

Dado que o K-Means utiliza distâncias euclidianas, a diferença de escala entre os indicadores pode enviesar os resultados: o Indicador 1A tem média de 0,65 enquanto o Indicador 1B tem média de 0,12. Para garantir contribuição igualitária de ambas as variáveis, foi aplicada padronização Z-score a cada indicador antes da clusterização.

O número ótimo de clusters k foi determinado por três critérios complementares:

  1. Método do cotovelo (Elbow method): análise da variação da soma dos quadrados intra-cluster (WSS) para \(k \in \{1, \ldots, 10\}\);
  2. Coeficiente de silhueta médio (Rousseeuw, 1987): calculado para \(k \in \{2, \ldots, 10\}\);
  3. Índice Davies-Bouldin (Davies; Bouldin, 1979): calculado para \(k \in \{2, \ldots, 10\}\).

O algoritmo K-Means foi executado com os parâmetros nstart = 25 (inicializações aleatórias) e iter.max = 100, utilizando a implementação de Hartigan; Wong (1979) disponível no software R (R Core Team, 2024). Todas as análises foram realizadas em R com os pacotes tidyverse (Wickham et al., 2019) e factoextra (Kassambara, 2017).

3.4 Análise de fronteira e transições

Para distinguir transições de cluster substantivas de meras oscilações estatísticas próximas ao limite decisório, foi calculada para cada observação a razão de distâncias \(r = d_{\text{próprio}} / d_{\text{outro}}\), onde \(d_{\text{próprio}}\) é a distância euclidiana ao centróide do cluster atribuído e \(d_{\text{outro}}\) é a distância ao centróide alternativo. Observações com \(r \geq 0{,}85\) foram classificadas como pertencentes à zona de fronteira. Uma transição foi considerada ambígua quando ao menos um dos dois anos envolvidos (antes ou depois da mudança) estava na zona de fronteira.

Para a análise temporal, cada observação foi tratada como unidade município-ano. A evolução dos clusters foi rastreada individualmente para cada município, identificando os anos de transição e a direção da mudança (melhora ou piora).

4 Resultados

4.1 Seleção do número de clusters

Ver código
set.seed(4871)
wss_vals <- map_dbl(1:10, \(k) kmeans(mat_cluster, k, nstart=25)$tot.withinss)
sil_vals <- map_dbl(2:10, \(k) {
  km <- kmeans(mat_cluster, k, nstart=25)
  mean(silhouette(km$cluster, dist(mat_cluster))[,3])
})
dbi_vals <- map_dbl(2:10, \(k) {
  km <- kmeans(mat_cluster, k, nstart=25)
  calc_dbi(mat_cluster, km$cluster)
})

p1 <- ggplot(tibble(k=1:10, wss=wss_vals), aes(k, wss)) +
  geom_line(color="#1f78b4") + geom_point(color="#e31a1c") +
  geom_vline(xintercept=2, linetype="dashed", color="grey50") +
  scale_x_continuous(breaks=1:10) +
  labs(title="Método do cotovelo", x="k", y="WSS intra-cluster") +
  theme_minimal()

p2 <- ggplot(tibble(k=2:10, sil=sil_vals), aes(k, sil)) +
  geom_line(color="#33a02c") + geom_point(color="#ff7f00") +
  geom_vline(xintercept=2, linetype="dashed", color="grey50") +
  scale_x_continuous(breaks=2:10) +
  labs(title="Silhueta média", x="k", y="Largura média (↑ melhor)") +
  theme_minimal()

p3 <- ggplot(tibble(k=2:10, dbi=dbi_vals), aes(k, dbi)) +
  geom_line(color="#984ea3") + geom_point(color="#a65628") +
  geom_vline(xintercept=2, linetype="dashed", color="grey50") +
  scale_x_continuous(breaks=2:10) +
  labs(title="Índice Davies-Bouldin", x="k", y="DBI (↓ melhor)") +
  theme_minimal()

grid.arrange(p1, p2, p3, ncol=3)
Figura 1: Métricas de validação para seleção do número ótimo de clusters k. À esquerda, método do cotovelo (WSS); ao centro, coeficiente de silhueta médio; à direita, Índice Davies-Bouldin. A linha tracejada vertical indica k = 2.

As três métricas convergem para k = 2 como solução preferencial (Figura 1). O método do cotovelo apresenta uma inflexão pronunciada em k = 2. O coeficiente de silhueta atinge seu máximo em k = 2 (0.47), decrescendo monotonicamente até k = 6. O Índice Davies-Bouldin também é minimizado em k = 2 (0.958). A opção por k = 3, testada preliminarmente, resultou em um cluster isolado formado exclusivamente pelo município de Japurá — cujos registros, após winsorização, ficaram com indicador1a = 1,0 em todos os anos —, configurando um artefato estatístico sem interpretabilidade substantiva.

É importante registrar que o coeficiente de silhueta de 0.47 situa-se no limiar entre estrutura fraca (< 0,50) e razoável (0,50–0,70), segundo os critérios de Kaufman; Rousseeuw (1990). Isso indica que, embora os dois clusters sejam distinguíveis, a separação não é nítida — existem municípios cujos valores se aproximam da fronteira decisória, o que motiva a análise de robustez descrita na seção de metodologia.

4.2 Perfil dos clusters

Ver código
df_clust |>
  group_by(`Cluster` = cluster_desc) |>
  summarise(
    `Observações`         = n(),
    `Municípios distintos` = n_distinct(nome_municipio),
    `Ind. 1A — média (DP)` = sprintf("%.3f (± %.3f)", mean(indicador1a), sd(indicador1a)),
    `Ind. 1B — média (DP)` = sprintf("%.3f (± %.3f)", mean(indicador1b), sd(indicador1b)),
    .groups = "drop"
  ) |>
  kable(align = c("l","r","r","c","c")) |>
  kable_styling(bootstrap_options = c("striped","hover"), full_width = FALSE)
Tabela 1: Perfil dos clusters identificados pelo K-Means (k = 2). Valores expressos como média ± desvio padrão dos indicadores winsorizados.
Cluster Observações Municípios distintos Ind. 1A — média (DP) Ind. 1B — média (DP)
Alta cobertura 99 23 0.856 (± 0.098) 0.222 (± 0.209)
Baixa cobertura 302 52 0.576 (± 0.112) 0.091 (± 0.055)

A Tabela 1 revela perfis bastante distintos entre os dois grupos. O Cluster Baixa cobertura agrupa 302 observações de 52 municípios distintos, com taxa média de cobertura de pré-escola de 0.576 e de creche de apenas 0.091. O Cluster Alta cobertura, com 99 observações de 23 municípios, apresenta média de 0.856 para pré-escola e 0.222 para creche.

A diferença é especialmente marcante no Indicador 1B (creche): municípios de Alta cobertura oferecem, em média, mais do que o dobro da taxa de atendimento em creche em comparação com os de Baixa cobertura, refletindo que a expansão de vagas para crianças de 0–3 anos é um diferenciador crítico entre os grupos.

Ver código
fviz_cluster(
  km_final, data = mat_cluster,
  geom = "point", ellipse.type = "norm",
  palette = c("#d9534f","#5cb85c"),
  ggtheme = theme_minimal(),
  main = "K-Means (k = 2) — Municípios do Amazonas"
)
Figura 2: Dispersão dos municípios no espaço padronizado dos dois indicadores. Elipses representam a distribuição normal de cada cluster (nível 68%).

4.3 Distribuição geográfica

Ver código
df_clust |>
  count(Mesorregião = nome_mesorregiao, cluster_desc) |>
  pivot_wider(names_from = cluster_desc, values_from = n, values_fill = 0L) |>
  mutate(
    Total    = `Baixa cobertura` + `Alta cobertura`,
    `% Alta` = percent(`Alta cobertura` / Total, accuracy = 1)
  ) |>
  arrange(desc(`Alta cobertura`)) |>
  kable(align = c("l","r","r","r","r")) |>
  kable_styling(bootstrap_options = c("striped","hover"), full_width = FALSE)
Tabela 2: Distribuição das observações por mesorregião e cluster. A coluna ‘% Alta’ indica a proporção de observações município-ano classificadas como Alta cobertura.
Mesorregião Alta cobertura Baixa cobertura Total % Alta
Centro Amazonense 43 148 191 23%
Sudoeste Amazonense 34 71 105 32%
Norte Amazonense 18 21 39 46%
Sul Amazonense 4 62 66 6%

A Tabela 2 evidencia desigualdades geográficas expressivas. A mesorregião Centro Amazonense concentra o maior número absoluto de observações de Alta cobertura, seguida pelo Sudoeste Amazonense. A mesorregião Sul Amazonense apresenta a menor proporção de Alta cobertura. Essa distribuição reflete, em parte, a maior capacidade administrativa e de investimento de municípios mais próximos à capital Manaus (Centro Amazonense), contrastando com a vulnerabilidade logística das regiões mais remotas.

4.3.1 Mapas coropléticos

Ver código
# Baixar shapefile dos municípios do Amazonas (IBGE 2020, via geobr)
shp_am <- read_municipality(code_muni = "AM", year = 2020, showProgress = FALSE)

# Dicionário de normalização de nomes (PNE → geobr Title Case)
dict_nomes <- tibble(
  nome_pne = c("ri", "Atalaia do Norte", "Boa Vista do Ramos",
               "Boca do Acre", "Careiro da Várzea", "Nova Olinda do Norte",
               "Rio Preto da Eva", "Santa Isabel do Rio Negro",
               "Santo Antônio do Içá", "São Gabriel da Cachoeira",
               "São Paulo de Olivença"),
  nome_shp = c("Anori", "Atalaia Do Norte", "Boa Vista Do Ramos",
               "Boca Do Acre", "Careiro Da Várzea", "Nova Olinda Do Norte",
               "Rio Preto Da Eva", "Santa Isabel Do Rio Negro",
               "Santo Antônio Do Içá", "São Gabriel Da Cachoeira",
               "São Paulo De Olivença")
)

# Mapear nomes PNE → nomes do shapefile
df_clust_map <- df_clust |>
  mutate(
    nome_shp = case_when(
      nome_municipio %in% dict_nomes$nome_pne ~
        dict_nomes$nome_shp[match(nome_municipio, dict_nomes$nome_pne)],
      TRUE ~ str_to_title(nome_municipio)
    )
  )

# Agregados por município: proporção de anos em Alta cobertura
cluster_dominante <- df_clust_map |>
  group_by(nome_shp) |>
  summarise(
    pct_alta      = mean(cluster_desc == "Alta cobertura"),
    cluster_dom   = if_else(pct_alta >= 0.5, "Alta cobertura", "Baixa cobertura"),
    tem_transicao = any(nome_shp %in% str_to_title(unique(tabela_trans$nome_municipio))),
    .groups = "drop"
  )

# Cluster em 2020
cluster_2020 <- df_clust_map |>
  filter(ano == 2020) |>
  select(nome_shp, cluster_desc_2020 = cluster_desc)

# Junção com shapefile
shp_dados <- shp_am |>
  left_join(cluster_dominante, by = c("name_muni" = "nome_shp")) |>
  left_join(cluster_2020,      by = c("name_muni" = "nome_shp")) |>
  mutate(
    categoria = case_when(
      is.na(cluster_desc_2020)   ~ "Sem dado",
      cluster_desc_2020 == "Alta cobertura"  &  tem_transicao ~ "Alta (com transição)",
      cluster_desc_2020 == "Alta cobertura"  & !tem_transicao ~ "Alta (estável)",
      cluster_desc_2020 == "Baixa cobertura" &  tem_transicao ~ "Baixa (com transição)",
      cluster_desc_2020 == "Baixa cobertura" & !tem_transicao ~ "Baixa (estável)"
    ),
    categoria = factor(categoria, levels = c(
      "Alta (estável)", "Alta (com transição)",
      "Baixa (estável)", "Baixa (com transição)", "Sem dado"
    ))
  )
Ver código
ggplot(shp_dados) +
  geom_sf(aes(fill = pct_alta), color = "white", linewidth = 0.3) +
  scale_fill_gradient2(
    low      = "#d9534f",
    mid      = "#ffffbf",
    high     = "#2c7bb6",
    midpoint = 0.5,
    limits   = c(0, 1),
    labels   = percent_format(accuracy = 1),
    name     = "Proporção de\nanos em\nAlta cobertura",
    na.value = "grey80"
  ) +
  labs(
    title   = "Cobertura de Pré-Escola — Amazonas (2014–2020)",
    subtitle = "Proporção de anos-município classificados como Alta cobertura pelo K-Means (k = 2)",
    caption  = "Fonte: INEP/MEC (Meta 1 PNE). Shapefiles: geobr/IBGE (2020). Elaboração própria."
  ) +
  theme_void(base_size = 11) +
  theme(
    plot.title    = element_text(face = "bold", size = 13),
    plot.subtitle = element_text(color = "grey40", size = 9),
    plot.caption  = element_text(color = "grey50", size = 7),
    legend.position = "right"
  )
Figura 3: Proporção de anos-município classificados como ‘Alta cobertura’ pelo K-Means, 2014–2020. Municípios em verde intenso apresentaram Alta cobertura em todos os anos analisados; em vermelho intenso, nunca alcançaram esse patamar. O município de São Sebastião do Uatumã (cinza claro) não possui dados na base do INEP para o período.
Ver código
ggplot(shp_dados) +
  geom_sf(aes(fill = categoria), color = "white", linewidth = 0.3) +
  scale_fill_manual(
    values = c(
      "Alta (estável)"        = "#2c7bb6",
      "Alta (com transição)"  = "#abd9e9",
      "Baixa (estável)"       = "#d7191c",
      "Baixa (com transição)" = "#fdae61",
      "Sem dado"              = "grey80"
    ),
    name = NULL,
    drop = FALSE
  ) +
  labs(
    title    = "Cluster de Cobertura em 2020 e Histórico de Transições — Amazonas",
    subtitle = "Municípios com transição = ao menos uma mudança de cluster entre 2014 e 2020",
    caption  = "Fonte: INEP/MEC (Meta 1 PNE). Shapefiles: geobr/IBGE (2020). Elaboração própria."
  ) +
  theme_void(base_size = 11) +
  theme(
    plot.title      = element_text(face = "bold", size = 13),
    plot.subtitle   = element_text(color = "grey40", size = 9),
    plot.caption    = element_text(color = "grey50", size = 7),
    legend.position  = "right",
    legend.key.size  = unit(0.5, "cm"),
    legend.text      = element_text(size = 9)
  )
Figura 4: Cluster de cobertura em 2020 com identificação de municípios que apresentaram ao menos uma transição de cluster entre 2014 e 2020. Azul escuro = Alta cobertura estável; azul claro = Alta cobertura com transição histórica; vermelho = Baixa cobertura estável; laranja = Baixa cobertura com transição histórica. Beruri, Novo Airão e São Sebastião do Uatumã (cinza claro) não possuem registro de matrículas para 2020 na base do INEP.

A visualização espacial (Figura 3 e Figura 4) revela padrões geográficos que não são aparentes nas tabelas agregadas. O noroeste e oeste do estado — correspondendo às mesorregiões Norte e Sudoeste Amazonense — concentram os municípios de Alta cobertura persistente (verde/azul intenso), enquanto o leste, sudeste e sul apresentam predominância de Baixa cobertura ao longo de todo o período.

Esse padrão espacial é consistente com a presença de municípios de maior porte relativo e com acesso a programas federais de apoio à educação indígena e de fronteira nessas regiões. A Figura 4 adiciona uma camada informativa relevante: municípios em azul claro (Alta com transição) concentram-se na faixa central do estado, indicando que essa região é a mais dinâmica em termos de mobilidade entre clusters — mas também a mais vulnerável a retrocessos.

Três municípios aparecem sem dado em 2020: Beruri e Novo Airão não possuem registros de matrículas nesse ano específico (embora apareçam com dados em anos anteriores), enquanto São Sebastião do Uatumã não possui registros em nenhum ano do período, possivelmente em razão de características administrativas ou de cobertura do Censo Escolar.

4.4 Evolução temporal dos clusters

Ver código
df_aluvial <- df_trans |>
  count(ano, cluster_desc, name = "n") |>
  mutate(ano = factor(ano))

ggplot(df_aluvial,
  aes(x=ano, y=n, alluvium=cluster_desc, stratum=cluster_desc, fill=cluster_desc)) +
  geom_flow(alpha=0.5) +
  geom_stratum(width=0.45, color="white") +
  geom_text(stat="stratum", aes(label=after_stat(stratum)),
            size=2.8, color="white", fontface="bold") +
  scale_fill_manual(
    values=c("Baixa cobertura"="#d9534f","Alta cobertura"="#5cb85c"),
    guide="none") +
  labs(title="Fluxo de municípios entre clusters — Amazonas (2014–2020)",
       subtitle="Espessura proporcional ao nº de municípios em cada cluster",
       x="Ano", y="Nº de municípios") +
  theme_minimal(base_size=12)
Figura 5: Diagrama aluvial do fluxo de municípios entre os clusters ao longo de 2014–2020. A espessura das faixas é proporcional ao número de municípios em cada grupo. A expansão de Alta cobertura em 2017–2018 e a retração em 2019–2020 são visíveis.

O diagrama aluvial (Figura 5) revela uma trajetória não-linear: o grupo de Alta cobertura cresce de forma consistente entre 2014 e 2018, atingindo seu pico neste último ano, seguido de retração em 2019 e manutenção estável em 2020. Este padrão sugere que os ganhos de cobertura observados no período de intensificação do PNE (2014–2018) sofreram reversão parcial nos anos finais do período analisado.

Ver código
mun_ord <- df_trans |>
  group_by(nome_municipio) |>
  summarise(tem_trans = any(transicao, na.rm=TRUE),
            media_num = mean(as.integer(cluster)), .groups="drop") |>
  arrange(desc(tem_trans), media_num) |> pull(nome_municipio)

anos_trans_plot <- df_trans |>
  filter(transicao) |>
  select(nome_municipio, ano, direcao, trans_ambigua)

ggplot(
  df_trans |> mutate(nome_municipio = factor(nome_municipio, levels=mun_ord)),
  aes(x=ano, y=nome_municipio, fill=cluster_desc)
) +
  geom_tile(color="white", linewidth=0.35) +
  geom_point(
    data = anos_trans_plot |>
      mutate(nome_municipio = factor(nome_municipio, levels=mun_ord)),
    aes(x=ano, y=nome_municipio, shape=direcao, color=direcao),
    size=2.8, inherit.aes=FALSE
  ) +
  scale_fill_manual(
    values=c("Baixa cobertura"="#d9534f","Alta cobertura"="#5cb85c"),
    name="Cluster") +
  scale_color_manual(
    values=c("Melhora"="#003087","Piora"="#8B0000"), name="Transição") +
  scale_shape_manual(
    values=c("Melhora"=24,"Piora"=25), name="Transição") +
  scale_x_continuous(breaks=2014:2020) +
  labs(title="Evolução dos clusters — Municípios do Amazonas (2014–2020)",
       subtitle="Triângulos marcam o ano da transição | municípios com transição aparecem primeiro",
       x="Ano", y=NULL) +
  theme_minimal(base_size=10) +
  theme(axis.text.y=element_text(size=7), legend.position="bottom",
        legend.box="vertical", panel.grid.major=element_blank(),
        plot.subtitle=element_text(color="grey40", size=8))
Figura 6: Mapa de calor da pertença a cluster por município e ano. Municípios com ao menos uma transição aparecem nas linhas superiores, ordenados por proporção de observações em Alta cobertura. Triângulos apontando para cima (▲) indicam melhora (Baixa → Alta); triângulos apontando para baixo (▽) indicam piora (Alta → Baixa).

4.5 Análise de transições

Ver código
tabela_trans |>
  count(`Direção` = direcao, `Ambígua` = trans_ambigua, name = "N") |>
  mutate(
    `Ambígua` = if_else(`Ambígua`, "Sim", "Não"),
    `%` = percent(N / sum(N), accuracy = 1)
  ) |>
  arrange(`Direção`, `Ambígua`) |>
  kable(align = c("l","c","r","r")) |>
  kable_styling(bootstrap_options = c("striped","hover"), full_width = FALSE)
Tabela 3: Resumo das transições de cluster. Transições ‘ambíguas’ são aquelas em que ao menos um dos dois anos envolvidos estava na zona de fronteira (razão de distâncias ≥ 0,85).
Direção Ambígua N %
Melhora Não 4 19%
Melhora Sim 9 43%
Piora Não 4 19%
Piora Sim 4 19%
Ver código
df_trans |>
  filter(transicao) |>
  count(Ano = ano, Direção = direcao) |>
  pivot_wider(names_from = Direção, values_from = n, values_fill = 0L) |>
  mutate(Total = rowSums(across(where(is.integer)))) |>
  arrange(Ano) |>
  kable(align = c("c","r","r","r")) |>
  kable_styling(bootstrap_options = c("striped","hover"), full_width = FALSE)
Tabela 4: Distribuição das transições por ano. O ano de 2020 concentra 3 deteriorações (Piora), padrão consistente com impactos da pandemia de COVID-19 sobre os registros educacionais.
Ano Piora Melhora Total
2015 3 0 3
2016 2 0 2
2017 0 4 4
2018 0 3 3
2019 0 4 4
2020 3 2 5

Foram identificadas 21 transições de cluster ao longo do período, distribuídas entre 14 municípios. Desse total, 13 foram melhorias (Baixa → Alta) e 8 foram deteriorações (Alta → Baixa). Entretanto, 13 transições (62%) foram classificadas como ambíguas — os municípios estavam próximos à fronteira estatística entre os clusters, tornando incerta a interpretação como mudança substantiva de cobertura (Tabela 3). Apenas 8 transições (38%) ocorreram em municípios claramente alocados em seus clusters, configurando evidência mais robusta de mudança estrutural.

A distribuição temporal das transições (Tabela 4) revela que o ano de 2020 concentrou 3 das 8 deteriorações totais, padrão possivelmente relacionado à pandemia de COVID-19.

Ver código
tabela_trans |>
  select(
    Município = nome_municipio,
    Ano = ano,
    `De` = desc_ant,
    `Para` = cluster_desc,
    `Direção` = direcao,
    `Ambígua` = trans_ambigua,
    `ind1a antes` = ind1a_ant,
    `ind1a depois` = indicador1a,
    `Δ ind1a` = delta_1a
  ) |>
  mutate(`Ambígua` = if_else(`Ambígua`, "Sim", "Não")) |>
  arrange(Ano, Município) |>
  kable(digits = 3, align = c("l","c","l","l","l","c","r","r","r")) |>
  kable_styling(bootstrap_options = c("striped","hover","condensed"),
                font_size = 11, full_width = TRUE)
Tabela 5: Tabela detalhada das transições de cluster. A coluna Δ ind1a indica a variação do Indicador 1A (pré-escola) entre o ano anterior e o ano da transição. Transições marcadas como ‘Ambígua=Sim’ ocorreram na zona de fronteira estatística.
Município Ano De Para Direção Ambígua ind1a antes ind1a depois Δ ind1a
Guajará 2015 Alta cobertura Baixa cobertura Piora Não 0.769 0.630 -0.138
Maraã 2015 Alta cobertura Baixa cobertura Piora Sim 0.668 0.623 -0.045
Silves 2015 Alta cobertura Baixa cobertura Piora Sim 0.863 0.750 -0.113
Tefé 2016 Alta cobertura Baixa cobertura Piora Não 0.751 0.731 -0.019
Tonantins 2016 Alta cobertura Baixa cobertura Piora Não 0.734 0.608 -0.126
Fonte Boa 2017 Baixa cobertura Alta cobertura Melhora Sim 0.742 0.875 0.133
Itamarati 2017 Baixa cobertura Alta cobertura Melhora Sim 0.665 0.905 0.241
Silves 2017 Baixa cobertura Alta cobertura Melhora Sim 0.777 0.890 0.113
Tapauá 2017 Baixa cobertura Alta cobertura Melhora Não 0.477 0.808 0.331
Boa Vista do Ramos 2018 Baixa cobertura Alta cobertura Melhora Sim 0.723 0.681 -0.042
Maraã 2018 Baixa cobertura Alta cobertura Melhora Sim 0.627 0.667 0.040
Tefé 2018 Baixa cobertura Alta cobertura Melhora Sim 0.734 0.819 0.085
Alvarães 2019 Baixa cobertura Alta cobertura Melhora Não 0.670 0.736 0.066
Caapiranga 2019 Baixa cobertura Alta cobertura Melhora Não 0.675 0.786 0.111
Tabatinga 2019 Baixa cobertura Alta cobertura Melhora Não 0.721 0.791 0.070
Tonantins 2019 Baixa cobertura Alta cobertura Melhora Sim 0.661 0.706 0.045
Alvarães 2020 Alta cobertura Baixa cobertura Piora Sim 0.736 0.704 -0.032
Benjamin Constant 2020 Baixa cobertura Alta cobertura Melhora Sim 0.756 0.771 0.014
Boa Vista do Ramos 2020 Alta cobertura Baixa cobertura Piora Não 0.722 0.645 -0.077
Carauari 2020 Baixa cobertura Alta cobertura Melhora Sim 0.767 0.778 0.011
Tonantins 2020 Alta cobertura Baixa cobertura Piora Sim 0.706 0.681 -0.025

5 Discussão

5.1 Persistência da desigualdade de cobertura

O fato de que, no período analisado, entre 40 e 302 municípios por ano permaneceram no grupo de Baixa cobertura — representando consistentemente mais de 60% das observações — revela a persistência de déficits estruturais. Esses déficits não refletem apenas escassez de vagas, mas frequentemente a combinação de problemas de infraestrutura física, carência de professores habilitados, dificuldades logísticas de acesso a comunidades ribeirinhas e limitações na capacidade de gestão municipal (Instituto Nacional de Estudos e Pesquisas Educacionais Anísio Teixeira, 2022; Silveira; Schneider, 2020).

A diferença mais expressiva entre os clusters ocorre no Indicador 1B (creche): municípios de Alta cobertura apresentam taxa média de 0.222, comparada a 0.091 nos de Baixa cobertura. Isso é consistente com o padrão nacional observado pelo INEP: a creche é historicamente o componente mais deficitário da Meta 1, e as disparidades regionais são amplificadas em estados com municípios de difícil acesso como o Amazonas (Instituto Nacional de Estudos e Pesquisas Educacionais Anísio Teixeira, 2020).

5.2 Robustez das transições e implicações metodológicas

Um dos resultados mais relevantes desta análise é a constatação de que 62% das transições detectadas ocorreram em zona de fronteira estatística. Isso tem implicações metodológicas significativas para estudos de monitoramento educacional baseados em clusterização: a atribuição de um município a um grupo distinto pode ser consequência de oscilações aleatórias nos indicadores — ou mesmo de imprecisões nas estimativas populacionais do IBGE —, e não necessariamente de uma mudança real na política local de oferta educacional.

Essa limitação é inerente ao K-Means aplicado a dados com estrutura de separação fraca (silhueta = 0.47). Abordagens alternativas, como o clustering hierárquico com ligação de Ward ou modelos de mistura gaussiana (Gaussian Mixture Models), podem fornecer estimativas de probabilidade de pertença a cada cluster, permitindo quantificar a incerteza de classificação de forma mais explícita (James et al., 2013).

5.3 O efeito COVID-19 em 2020

A concentração de deteriorações em 2020 merece atenção. O fechamento de escolas durante a pandemia de COVID-19, embora tenha afetado primariamente o ensino fundamental e médio, também impactou o registro e o funcionamento de unidades de educação infantil, em especial creches — muitas delas operadas por entidades privadas sem fins lucrativos com contratos municipais (Instituto Nacional de Estudos e Pesquisas Educacionais Anísio Teixeira, 2020). A United Nations Educational, Scientific and Cultural Organization (2020) documenta que países com menor capacidade institucional sofreram impactos desproporcionais sobre o acesso à educação infantil durante a pandemia.

Contudo, é necessário cautela ao atribuir causalmente as deteriorações de 2020 à pandemia. Mudanças nos critérios de coleta de dados do Censo Escolar naquele ano e eventuais distorções nas estimativas populacionais do IBGE em função do adiamento do Censo Demográfico (originalmente previsto para 2020) também podem ter contribuído para os valores observados.

5.4 Desigualdades geográficas e implicações para políticas

A distribuição por mesorregião confirma que o problema não é homogêneo no território amazonense. A maior concentração de municípios de Alta cobertura no Centro Amazonense sugere um efeito de transbordamento da capacidade institucional da capital Manaus para os municípios do entorno, enquanto as mesorregiões mais distantes — especialmente o Sul Amazonense — carecem de estratégias específicas de indução.

Esses resultados corroboram as recomendações dos relatórios de monitoramento do INEP (Instituto Nacional de Estudos e Pesquisas Educacionais Anísio Teixeira, 2022) no sentido de que o alcance das metas do PNE em estados com grandes heterogeneidades internas requer políticas diferenciadas por território, e não apenas metas globais de expansão.

5.5 Limitações

Esta análise apresenta as seguintes limitações que devem ser consideradas na interpretação dos resultados:

  1. Cobertura temporal: os dados disponíveis vão até 2020, não cobrindo o período pós-pandemia (2021–2024);
  2. Dimensionalidade: apenas dois indicadores foram utilizados; variáveis de contexto (IDH municipal, distância da capital, porte populacional) poderiam enriquecer a tipologia dos clusters;
  3. Estrutura de clusters fraca: silhueta de 0.47 indica sobreposição entre os grupos — os clusters descrevem tendências centrais, não fronteiras absolutas;
  4. Instabilidade das projeções populacionais: a winsorização dos 18 registros com indicador1a > 1,0 resolve parcialmente o problema, mas não elimina a incerteza subjacente nas estimativas do IBGE para municípios pequenos;
  5. Independência temporal assumida: o K-Means trata cada município-ano como observação independente, desconsiderando a autocorrelação temporal inerente a dados longitudinais.

6 Conclusão

Este estudo analisou a cobertura da educação infantil nos municípios do Amazonas ao longo de 2014–2020, utilizando o algoritmo K-Means para identificar dois perfis municipais distintos: Baixa cobertura e Alta cobertura. Os principais achados são:

  1. A estrutura de dois clusters é validada pelas métricas de silhueta (0.47) e Davies-Bouldin (0.958), embora a separação seja apenas fraca a moderada, evidenciando um continuum de desempenho entre municípios;

  2. A maioria dos municípios permaneceu no mesmo cluster ao longo de todo o período (apenas 14 de 61 municípios apresentaram ao menos uma transição), sugerindo que os padrões de cobertura têm determinantes estruturais estáveis que transcendem variações políticas de curto prazo;

  3. 62% das transições detectadas são estatisticamente ambíguas, reforçando que oscilações de indicadores próximas à fronteira decisória não devem ser interpretadas automaticamente como avanços ou retrocessos na política educacional;

  4. A distribuição geográfica revela concentração de Alta cobertura no Centro Amazonense e déficits persistentes no Sul Amazonense, indicando necessidade de políticas territorializadas;

  5. O ano de 2020 concentrou deteriorações de forma atípica, provavelmente refletindo impactos da pandemia de COVID-19 sobre os sistemas de registro e funcionamento da educação infantil.

Do ponto de vista de políticas públicas, os resultados indicam que a superação do déficit de cobertura — especialmente na creche — no Amazonas exige não apenas ampliação de recursos, mas estratégias diferenciadas para municípios remotos, investimento continuado em capacidade de gestão municipal e revisão das metodologias de estimativa populacional utilizadas no cálculo dos indicadores.

Direções futuras: Recomenda-se (i) atualizar a análise com dados de 2021–2024, quando disponibilizados pelo INEP; (ii) incorporar variáveis socioeconômicas e geográficas para enriquecer a tipologia dos clusters; (iii) explorar métodos de clustering longitudinal ou de mistura gaussiana para lidar explicitamente com a incerteza de classificação; (iv) replicar a metodologia para as demais metas do PNE e para outros estados com heterogeneidade interna similar ao Amazonas.


Referências

BRASIL. Lei n 13.005, de 25 de junho de 2014. Aprova o Plano Nacional de Educação – PNE e dá outras providências. BrasíliaDiário Oficial da União, Brasília, DF, 26 jun. 2014, Seção 1, p. 1, 2014.
CAMPOS, Maria Malta et al. A contribuição da educação infantil de qualidade e seus impactos no início do ensino fundamental. Educação e Pesquisa, v. 37, n. 1, p. 15–33, 2011.
CUNHA, Flavio; HECKMAN, James J. The technology of skill formation. American Economic Review, v. 97, n. 2, p. 31–47, 2007.
DAVIES, David L.; BOULDIN, Donald W. A cluster separation measure. IEEE Transactions on Pattern Analysis and Machine Intelligence, v. PAMI-1, n. 2, p. 224–228, 1979.
HARTIGAN, J. A.; WONG, M. A. Algorithm AS 136: A K-means clustering algorithm. Journal of the Royal Statistical Society. Series C (Applied Statistics), v. 28, n. 1, p. 100–108, 1979.
HECKMAN, James J. Skill formation and the economics of investing in disadvantaged children. Science, v. 312, n. 5782, p. 1900–1902, 2006.
INSTITUTO BRASILEIRO DE GEOGRAFIA E ESTATÍSTICA. Estimativas da população residente no Brasil e Unidades da Federação com data de referência em 1 de julho de 2020. Rio de Janeiro: IBGE, 2020. Disponível em: <https://www.ibge.gov.br/estatisticas/sociais/populacao/9103-estimativas-de-populacao.html>
INSTITUTO NACIONAL DE ESTUDOS E PESQUISAS EDUCACIONAIS ANÍSIO TEIXEIRA. Relatório do 3 Ciclo de Monitoramento das Metas do Plano Nacional de Educação – 2020. Brasília: INEP, 2020.
INSTITUTO NACIONAL DE ESTUDOS E PESQUISAS EDUCACIONAIS ANÍSIO TEIXEIRA. Relatório do 4 Ciclo de Monitoramento das Metas do Plano Nacional de Educação – 2022. Brasília: INEP, 2022.
JAMES, Gareth et al. An introduction to statistical learning: with applications in R. New York: Springer, 2013.
KASSAMBARA, Alboukadel. Practical guide to cluster analysis in R: Unsupervised machine learning. [S.l.]: STHDA, 2017. v. 1
KAUFMAN, Leonard; ROUSSEEUW, Peter J. Finding groups in data: An introduction to cluster analysis. New York: John Wiley & Sons, 1990.
LLOYD, Stuart P. Least squares quantization in PCM. IEEE Transactions on Information Theory, v. 28, n. 2, p. 129–137, 1982.
MACQUEEN, James. Some methods for classification and analysis of multivariate observations. In: Berkeley: University of California Press, 1967.
R CORE TEAM. R: A language and environment for statistical computing. Vienna, Austria: R Foundation for Statistical Computing, 2024.
ROUSSEEUW, Peter J. Silhouettes: A graphical aid to the interpretation and validation of cluster analysis. Journal of Computational and Applied Mathematics, v. 20, p. 53–65, 1987.
SILVEIRA, Adriana Dragone; SCHNEIDER, Gabriela. Desafios para a implementação do PNE 2014-2024: uma análise das metas e estratégias. Jornal de Políticas Educacionais, v. 14, p. e072220, 2020.
UNITED NATIONS EDUCATIONAL, SCIENTIFIC AND CULTURAL ORGANIZATION. Global education monitoring report 2020: Inclusion and education: All means all. Paris: UNESCO, 2020.
WICKHAM, Hadley et al. Welcome to the tidyverse. Journal of Open Source Software, v. 4, n. 43, p. 1686, 2019.