This vignette covers FUNDEB (Fundo de Manutencao e Desenvolvimento da Educacao Basica), the main funding mechanism for basic education in Brazil. educabR provides two functions to access FUNDEB data: resource distribution and enrollment counts.
Overview
FUNDEB redistributes tax revenues to fund basic education across states and municipalities. The data is split into two components:
| Function | Source | Description |
|---|---|---|
get_fundeb_distribution() |
STN (National Treasury) | Monthly transfers by state/municipality and funding source |
get_fundeb_enrollment() |
FNDE (OData API) | Enrollment counts used for funding calculation |
FUNDEB Distribution
Resource distribution data shows how much money was transferred to each state and municipality, broken down by funding source and month.
Funding sources
FUNDEB aggregates revenue from multiple tax sources:
| Source | Description |
|---|---|
| FPE | State Participation Fund |
| FPM | Municipal Participation Fund |
| IPI | Tax on Industrialized Products |
| ITR | Rural Property Tax |
| VAAF | Fiscal Value-Added (state portion) |
| VAAT | Total Value-Added |
| VAAR | FUNDEB Complementation |
| ICMS | State Sales Tax |
| IPVA | Vehicle Tax |
| ITCMD | Inheritance and Donation Tax |
Downloading distribution data
# All distribution data for 2023
dist_2023 <- get_fundeb_distribution(year = 2023)
# Filter by state
dist_sp <- get_fundeb_distribution(year = 2023, uf = "SP")
# Filter by funding source
dist_fpm <- get_fundeb_distribution(year = 2023, source = "FPM")
# Filter by destination (states or municipalities)
dist_estados <- get_fundeb_distribution(
year = 2023,
destination = "estados"
)Data structure
dist <- get_fundeb_distribution(2023, uf = "SP")
glimpse(dist)Example analysis: Monthly transfers by source
dist <- get_fundeb_distribution(2023, uf = "SP")
# Total monthly transfers by funding source
monthly <-
dist |>
group_by(fonte, mes) |>
summarise(total = sum(valor, na.rm = TRUE), .groups = "drop")
ggplot(monthly, aes(x = mes, y = total / 1e6, fill = fonte)) +
geom_col() +
labs(
title = "FUNDEB Transfers to Sao Paulo by Source (2023)",
x = "Month",
y = "Total (millions R$)",
fill = "Source"
) +
theme_minimal() +
theme(legend.position = "bottom")Example analysis: Comparing states
dist <- get_fundeb_distribution(2023)
# Total annual transfers by state
by_state <-
dist |>
group_by(uf) |>
summarise(total = sum(valor, na.rm = TRUE), .groups = "drop") |>
arrange(desc(total)) |>
head(10)
ggplot(by_state, aes(x = reorder(uf, total), y = total / 1e9)) +
geom_col(fill = "darkgreen") +
coord_flip() +
labs(
title = "Top 10 States by FUNDEB Transfers (2023)",
x = NULL,
y = "Total (billions R$)"
) +
theme_minimal()FUNDEB Enrollment
Enrollment data shows the number of students considered for FUNDEB funding calculation, broken down by municipality, education type, school network, and location.
Downloading enrollment data
# All enrollment data for 2023
mat_2023 <- get_fundeb_enrollment(year = 2023)
# Filter by state (applied at the API level for efficiency)
mat_sp <- get_fundeb_enrollment(year = 2023, uf = "SP")
# Limited rows for exploration
mat_sample <- get_fundeb_enrollment(year = 2023, n_max = 5000)Available years
Data is available from 2007 to 2026. Data is fetched from the FNDE OData API with automatic pagination.
Data structure
The enrollment data contains these columns:
| Column | Description |
|---|---|
ano_censo |
Census year |
uf |
State code |
municipio |
Municipality name |
tipo_rede_educacao |
Education network type |
descricao_tipo_educacao |
Education type description |
descricao_tipo_ensino |
Teaching type description |
descricao_tipo_turma |
Class type description |
descricao_tipo_carga_horaria |
Class hours type |
descricao_tipo_localizacao |
Location type (urban/rural) |
qtd_matricula |
Number of enrollments |
mat <- get_fundeb_enrollment(2023, uf = "RJ")
glimpse(mat)Example analysis: Enrollment by education type
mat <- get_fundeb_enrollment(2023, uf = "SP")
# Total enrollment by education type
by_type <-
mat |>
group_by(descricao_tipo_educacao) |>
summarise(total = sum(qtd_matricula, na.rm = TRUE), .groups = "drop") |>
arrange(desc(total))
ggplot(by_type, aes(x = reorder(descricao_tipo_educacao, total), y = total / 1e3)) +
geom_col(fill = "coral") +
coord_flip() +
labs(
title = "FUNDEB Enrollment by Education Type - SP (2023)",
x = NULL,
y = "Enrollments (thousands)"
) +
theme_minimal()Example analysis: Urban vs rural enrollment
mat <- get_fundeb_enrollment(2023)
# Compare urban vs rural
by_location <-
mat |>
group_by(uf, descricao_tipo_localizacao) |>
summarise(total = sum(qtd_matricula, na.rm = TRUE), .groups = "drop")
ggplot(by_location, aes(x = uf, y = total / 1e3, fill = descricao_tipo_localizacao)) +
geom_col(position = "dodge") +
labs(
title = "FUNDEB Enrollment: Urban vs Rural by State (2023)",
x = "State",
y = "Enrollments (thousands)",
fill = "Location"
) +
theme_minimal() +
theme(axis.text.x = element_text(angle = 45, hjust = 1))Combining distribution and enrollment
You can combine both datasets to analyze per-student funding across states.
# Total transfers by state
dist <- get_fundeb_distribution(2023)
transfers <-
dist |>
group_by(uf) |>
summarise(total_transfer = sum(valor, na.rm = TRUE), .groups = "drop")
# Total enrollment by state
mat <- get_fundeb_enrollment(2023)
enrollment <-
mat |>
group_by(uf) |>
summarise(total_students = sum(qtd_matricula, na.rm = TRUE), .groups = "drop")
# Per-student funding
funding <-
inner_join(transfers, enrollment, by = "uf") |>
mutate(per_student = total_transfer / total_students) |>
arrange(desc(per_student))
ggplot(funding, aes(x = reorder(uf, per_student), y = per_student)) +
geom_col(fill = "steelblue") +
coord_flip() +
labs(
title = "FUNDEB Per-Student Funding by State (2023)",
x = NULL,
y = "R$ per Student"
) +
theme_minimal()