Fonte: Dados extraídos do SIAFE (Sistema Integrado de Administração Financeira), referentes aos contratos da SEAPPA, e do IBGE (Instituto Brasileiro de Geografia e Estatística).
Observação: Os valores de contratos somados por CNPJ não incluem eventuais aditivos contabilizados separadamente; a coluna qtd_aditivos está disponível na base para análises futuras.
Análise por município: Quando um contrato lista mais de um município, seu valor foi rateado para cada um deles, ou seja, não representa os valores reais destinados a cada município, mas uma aproximação para fins analíticos.
População e valor per capita: os dados populacionais são do Censo Demográfico do IBGE de 2022 para os 92 municípios do estado do Rio de Janeiro
Estradas Agro RJ: Os dados de área rural e quantidade de estabelecimentos rurais são do Censo Agropecuário do IBGE de 2017. Foram utilizados apenas os contratos de compra de brita corrida para esta análise. O valor total de cada contrato foi dividido igualmente entre os municípios envolvidos, exclusivamente para permitir análises agregadas em nível municipal. Assim, os valores municipais devem ser interpretados como estimativas analíticas, e não como a alocação financeira efetivamente realizada.
Juliana Tardem
Leandro Peres de Oliveira
Assessores na Comissão de Avaliação em Políticas Públicas da Casa Civil
Painel gerado em 31/07/2026 .
---
title: "Painel de Análise de Contratos SEAPPA"
output:
flexdashboard::flex_dashboard:
orientation: rows
vertical_layout: fill
theme:
version: 4
bootswatch: flatly
self_contained: true
source_code: embed
---
<style>
/* ---------------------------------------------------------------------
CORES
--------------------------------------------------------------------- */
body > .navbar.navbar-inverse.navbar-fixed-top {
background: #0B3D2E !important;
background-image: none !important;
border-color: #0B3D2E !important;
}
body > .navbar.navbar-inverse.navbar-fixed-top .container-fluid {
background: #0B3D2E !important;
}
body > .navbar.navbar-inverse.navbar-fixed-top .navbar-brand,
body > .navbar.navbar-inverse.navbar-fixed-top .navbar-nav > li > a {
color: #EDF3EE !important;
}
body > .navbar.navbar-inverse.navbar-fixed-top .navbar-nav > .active > a,
body > .navbar.navbar-inverse.navbar-fixed-top .navbar-nav > li > a:hover {
background: #145A43 !important;
color: #FFFFFF !important;
}
.chart-title {
background-color: #EDF3EE;
color: #0B3D2E;
border-bottom: 1px solid #cfe0d5;
font-weight: 600;
}
.section > h1 {
color: #0B3D2E;
}
.dataTables_wrapper .pagination .page-item .page-link {
color: #0B3D2E !important;
background-color: #ffffff !important;
border-color: #cfe0d5 !important;
}
.dataTables_wrapper .pagination .page-item.active .page-link {
color: #ffffff !important;
background-color: #0B3D2E !important;
border-color: #0B3D2E !important;
}
.dataTables_wrapper .pagination .page-item .page-link:hover {
color: #ffffff !important;
background-color: #145A43 !important;
border-color: #145A43 !important;
}
.dataTables_wrapper .pagination .page-item.disabled .page-link {
color: #9aa5a0 !important;
}
</style>
```{r setup, include=FALSE}
knitr::opts_chunk$set(echo = FALSE, warning = FALSE, message = FALSE)
library(flexdashboard)
library(dplyr)
library(tidyr)
library(stringr)
library(stringi)
library(readxl)
library(janitor)
library(DT)
library(plotly)
library(scales)
library(forcats)
library(visNetwork)
library(geobr)
library(sidrar)
pal_dark <- "#0B3D2E" # verde institucional (base, mais escuro)
pal_mid <- "#1F6E4C" # verde médio
pal_soft <- "#3C8A66" # verde suave
pal_light <- "#7FA88D" # verde claro / sálvia
pal_pale <- "#BFDCC9" # verde bem claro / pastel
pal_neutral <- "#1A2620" # verde-carvão (neutro escuro, texto/nós)
pal_bg <- "#EDF3EE" # verde-esbranquiçado (fundo neutro)
pal_categorico <- c(pal_dark, pal_mid, pal_soft, pal_light, pal_pale, pal_neutral)
setwd("C:/Users/jatardem/Documents/Agricultura")
seappadi <- read_excel("seappadi2_com_proprietarios.xlsx") %>%
clean_names()
seappadi_clean <- seappadi %>%
mutate(
ano_original = str_extract(numero_original, "20\\d{2}") %>% as.integer(),
valor_num = valor %>%
str_remove_all("R\\$|\\s") %>%
str_replace_all("\\.", "") %>%
str_replace(",", ".") %>%
as.numeric(),
cnpj_extraido = str_pad(str_remove_all(as.character(cnpj_extraido), "[^0-9]"),
width = 14, side = "left", pad = "0"),
cnpj_extraido_fmt = str_replace(
cnpj_extraido,
"^(\\d{2})(\\d{3})(\\d{3})(\\d{4})(\\d{2})$",
"\\1.\\2.\\3/\\4-\\5"
)
) %>%
filter(!is.na(ano_original), ano_original >= 2021) %>%
filter(is.na(objeto) | !str_detect(str_to_upper(objeto), "CONTRATO MIGRADO DO SIAFEM")) %>%
filter(is.na(municipios) |
!str_detect(str_to_upper(municipios), "NORTE FLUMINENSE|M[ÉE]DIO PARA[ÍI]BA"))
# ---------------------------------------------------------------------------
# Análises
# ---------------------------------------------------------------------------
top_contratados <- seappadi_clean %>%
filter(!is.na(cnpj_extraido), cnpj_extraido != "", cnpj_extraido != "00000000000000") %>%
group_by(cnpj_extraido) %>%
summarise(
empresa = first(na.omit(contratado)),
cnpj_fmt = first(na.omit(cnpj_extraido_fmt)),
valor_total = sum(valor_num, na.rm = TRUE),
n_contratos = n(),
.groups = "drop"
) %>%
arrange(desc(valor_total))
# Sócios -----------------------------------------------------------------------
holdings_de_para <- c(
"POLUX PARTICIPACOES LTDA" = "RODOLFO OLIVIER DE PAULA",
"BAHAM PARTICIPACOES LTDA" = "FREDERICO OLIVIER DE PAULA",
"ADHARA PARTICIPACOES LTDA" = "EMANUELA BIAZOTTO BATTAGLINI; IARA HELENA BIAZOTTO BATTAGLINI; ROBERVAL BECHARA BATTAGLINI; THAISA BIAZOTTO BATTAGLINI",
"BROTTAO CONTROLE E PARTICIPACOES LTDA" = "ERIC PLATENIK GONCALVES; HENRIQUE VIANA GONCALVES PLATENIK",
"AFV EMPREENDIMENTOS E PARTICIPACOES LTDA" = "CARLOS ALBERTO DE SOUZA VEIGA; MARCO ANDRE DE SOUZA VEIGA; PAULO EDUARDO DE SOUSA VEIGA",
"DTB NEGOCIOS E PARTICIPACOES LTDA" = "JULIANA LAVALL BARCELLOS; MARCO ANTONIO BARCELLOS; MARCO ANTONIO BARCELLOS JUNIOR",
"FGM NEGOCIOS E PARTICIPACOES LTDA" = "FELIPE BARCELOS OTTONI GUEDES; JULIANA LAVALL BARCELLOS",
"ASPEN PARTICIPACOES LTDA" = "THIAGO DE CASTRO GOMES",
"PARTNERS AUTOMOTORES LTDA." = "MARCELO KALIM; ROBERTO BALLS SALLOUTI; RENATO ANTONIO SECONDO MAZZOLA; RODRIGO SANTOS COUTINHO ALVES; ALESSANDRO CARVALHO DE MIRANDA",
"IRMAOS PIANNA LTDA" = "BRAZ PIANA; LEONARDO SILVA PIANNA",
"P V C L PARTICIPACOES LTDA" = "ANTHENOR PIANNA; CHRISTIANE SILVA PIANNA; LEONARDO SILVA PIANNA; PAULO HENRIQUE SILVA PIANNA; VIVIANE SILVA PIANNA",
"B. PIANA PARTICIPACOES LTDA" = "ANGELO RIGONI PIANA; BRAZ PIANA; RICARDO RIGONI PIANA; SANDRA RIGONI PIANA MACHADO",
"PALINI & ALVES PARTICIPACOES LTDA" = "CARLOS HENRIQUE PALINI; CARLOS ROBERTO PALINI; FABIO FACANALI ALVES; FERNANDA FACANALI ALVES REZENDE; FLAVIO PEREIRA ALVES; JOSEANE DE CASSIA PALINI DE MORAES SALLES; JULIA LETICIA PALINI ROMAO; MARCELO FACANALI ALVES",
"BIONDO - INVESTIMENTOS E PARTICIPACOES LTDA" = "DIOGO REGINATO BIONDO; ELIAS REGINATO BIONDO; FELIPE REGINATO BIONDO; IVO BIONDO; TERESINHA REGINATO BIONDO",
"EQUAGRIL EQUIPAMENTOS AGRICOLAS LTDA." = "DARCI LOCATELLI JUNIOR; CESAR MARTIN DI LUCA; CRISTINE LOCATELLI DE QUADROS; DARLINE LOCATELLI RENAULT DE CASTRO; LUCIANO RAVEGNANI; OSVALDO TERUO KOBAYASHI",
"BLUE WATER ADMINISTRACAO, EMPREENDIMENTOS E PARTICIPACOES LTDA." = "CESAR MARTIN DI LUCA; CRISTINE LOCATELLI DE QUADROS; DARCI LOCATELLI JUNIOR; DARLINE LOCATELLI RENAULT DE CASTRO; ELEMAR JORGE DRISNER; FERNANDA SCHMITT LOCATELLI; LUCIANO RAVEGNANI; MAURICIO DA COSTA GOUVEIA; OSVALDO TERUO KOBAYASHI; SIRIO FRANCISCO BARAZETTI",
"CAMBUI GESTAO E INVESTIMENTOS LTDA" = "MILTON RODRIGUES JUNIOR"
)
socios_long <- seappadi_clean %>%
filter(!is.na(proprietario), proprietario != "") %>%
distinct(cnpj_extraido, contratado, proprietario) %>%
mutate(proprietario = str_replace_all(proprietario, holdings_de_para)) %>%
separate_rows(proprietario, sep = ";") %>%
mutate(proprietario = str_squish(proprietario)) %>%
filter(proprietario != "") %>%
distinct(cnpj_extraido, contratado, proprietario)
socios_multi_empresas <- socios_long %>%
left_join(
seappadi_clean %>% select(cnpj_extraido, valor_num),
by = "cnpj_extraido",
relationship = "many-to-many"
) %>%
group_by(proprietario) %>%
summarise(
n_empresas = n_distinct(cnpj_extraido),
empresas = paste(unique(contratado), collapse = " | "),
valor_total = sum(valor_num, na.rm = TRUE),
.groups = "drop"
) %>%
filter(n_empresas > 1) %>%
arrange(desc(valor_total))
# Municípios ------------------------------------------------------------------
populacao_rj <- read_excel("populacao_rj.xlsx") %>%
transmute(
municipio_nome = str_remove(municipio, " \\(RJ\\)$"),
populacao_2022 = populacao
) %>%
mutate(
municipio_chave = stri_trans_general(
str_to_upper(str_squish(municipio_nome)),
"Latin-ASCII"
)
)
municipios_long <- seappadi_clean %>%
mutate(municipios = as.character(municipios)) %>%
filter(!is.na(municipios), str_squish(municipios) != "") %>%
filter(str_to_upper(str_squish(municipios)) != "NA") %>%
mutate(
qtd_mun_contrato = str_count(municipios, ",") + 1,
valor_num = valor_num / qtd_mun_contrato
) %>%
separate_rows(municipios, sep = ",") %>%
mutate(municipio_nome_bruto = str_squish(municipios)) %>%
filter(municipio_nome_bruto != "", str_to_upper(municipio_nome_bruto) != "NA") %>%
mutate(municipio_chave = stri_trans_general(str_to_upper(municipio_nome_bruto), "Latin-ASCII"))
municipios_long <- municipios_long %>%
left_join(populacao_rj %>% select(municipio_chave, municipio_nome_oficial = municipio_nome),
by = "municipio_chave") %>%
mutate(municipio_nome = coalesce(municipio_nome_oficial, str_to_title(municipio_nome_bruto)))
municipios_sem_match <- municipios_long %>%
filter(!municipio_chave %in% populacao_rj$municipio_chave) %>%
group_by(municipio_nome_bruto) %>%
summarise(valor_total = sum(valor_num, na.rm = TRUE), n_contratos = n(), .groups = "drop") %>%
arrange(desc(valor_total)) %>%
rename(municipio_nome = municipio_nome_bruto)
municipios_long <- municipios_long %>%
filter(municipio_chave %in% populacao_rj$municipio_chave)
#
municipios_valor <- municipios_long %>%
group_by(municipio_chave) %>%
summarise(
municipio_nome = first(municipio_nome),
valor_total = sum(valor_num, na.rm = TRUE),
n_contratos = n(),
n_fornecedores = n_distinct(cnpj_extraido),
.groups = "drop"
) %>%
left_join(populacao_rj %>% select(municipio_chave, populacao_2022), by = "municipio_chave") %>%
mutate(valor_per_capita = valor_total / populacao_2022) %>%
arrange(desc(valor_total))
municipios_valor_pc <- municipios_valor %>%
filter(!is.na(valor_per_capita)) %>%
arrange(desc(valor_per_capita))
#
municip_contratado <- municipios_long %>%
filter(!is.na(cnpj_extraido), cnpj_extraido != "", cnpj_extraido != "00000000000000") %>%
group_by(municipio_chave, municipio_nome, cnpj_extraido) %>%
summarise(
empresa = first(na.omit(contratado)),
valor = sum(valor_num, na.rm = TRUE),
n_contratos = n(),
.groups = "drop"
)
#
treemap_municipios <- municipios_valor %>% slice_max(valor_total, n = 10, with_ties = FALSE)
treemap_dados <- municip_contratado %>%
semi_join(treemap_municipios, by = "municipio_chave") %>%
group_by(municipio_chave) %>%
slice_max(valor, n = 6, with_ties = FALSE) %>%
ungroup()
treemap_nos_municipio <- treemap_dados %>%
distinct(municipio_chave, municipio_nome) %>%
transmute(ids = municipio_nome, labels = municipio_nome, parents = "", values = NA_real_)
treemap_nos_empresa <- treemap_dados %>%
transmute(
ids = paste(municipio_nome, empresa, sep = " — "),
labels = str_trunc(empresa, 30),
parents = municipio_nome,
values = valor
)
treemap_full <- bind_rows(treemap_nos_municipio, treemap_nos_empresa)
# Estradas Agro RJ -------------------------------------------------------------
municipios_long_brita <- municipios_long %>%
filter(str_to_lower(str_squish(tipo)) == "brita")
area_rural_rj <- read_excel("arearural.xlsx", sheet = "Tabela") %>%
transmute(
municipio_nome = str_remove(municipio, " \\(RJ\\)$"),
area_ha = as.numeric(area_ha)
) %>%
mutate(
municipio_chave = stri_trans_general(
str_to_upper(str_squish(municipio_nome)), "Latin-ASCII"
)
)
#
municipios_valor_brita <- municipios_long_brita %>%
group_by(municipio_chave) %>%
summarise(
municipio_nome = first(municipio_nome),
valor_total = sum(valor_num, na.rm = TRUE),
n_contratos = n(),
n_fornecedores = n_distinct(cnpj_extraido),
.groups = "drop"
) %>%
arrange(desc(valor_total))
#
municipios_area_rural <- municipios_valor_brita %>%
left_join(
area_rural_rj %>% select(municipio_chave, area_ha),
by = "municipio_chave"
) %>%
mutate(
valor_por_ha = valor_total / area_ha,
contratos_por_ha = n_contratos / area_ha,
area_km2 = area_ha / 100
)
municipios_sem_area <- municipios_area_rural %>%
filter(is.na(area_ha)) %>%
select(municipio_nome, valor_total, n_contratos)
municipios_sem_contrato_brita <- area_rural_rj %>%
anti_join(municipios_valor_brita, by = "municipio_chave") %>%
select(municipio_nome, area_ha)
#
ranking_valor_por_ha <- municipios_area_rural %>%
filter(!is.na(valor_por_ha), area_ha > 0) %>%
arrange(desc(valor_por_ha)) %>%
select(municipio_nome, valor_total, area_ha, valor_por_ha)
#
ranking_contratos_por_ha <- municipios_area_rural %>%
filter(!is.na(contratos_por_ha), area_ha > 0) %>%
arrange(desc(contratos_por_ha)) %>%
select(municipio_nome, n_contratos, area_ha, contratos_por_ha)
#
cor_valor_area <- cor(
municipios_area_rural$area_ha,
municipios_area_rural$valor_total,
use = "complete.obs"
)
cor_contratos_area <- cor(
municipios_area_rural$area_ha,
municipios_area_rural$n_contratos,
use = "complete.obs"
)
#
menor_area <- municipios_area_rural %>%
filter(area_ha > 0) %>%
summarise(min = min(area_ha, na.rm = TRUE)) %>%
pull(min)
dados_grafico <- municipios_area_rural %>%
filter(valor_total > 0) %>%
mutate(
sem_area_rural = is.na(area_ha) | area_ha == 0,
area_plot = if_else(
sem_area_rural,
menor_area / 2,
area_ha
),
hover = if_else(
sem_area_rural,
paste0(
municipio_nome,
"<br><b>Sem área rural*</b>",
"<br>Valor total (brita): R$ ",
format(round(valor_total, 0),
big.mark = ".",
decimal.mark = ",")
),
paste0(
municipio_nome,
"<br>Área rural: ",
format(round(area_ha, 0),
big.mark = ".",
decimal.mark = ","),
" ha",
"<br>Valor total (brita): R$ ",
format(round(valor_total, 0),
big.mark = ".",
decimal.mark = ",")
)
)
)
grafico_area_valor <- plot_ly(
data = dados_grafico,
x = ~area_plot,
y = ~valor_total,
type = "scatter",
mode = "markers",
color = ~sem_area_rural,
colors = c("#0B3D2E", "#D95F02"),
text = ~hover,
hoverinfo = "text",
marker = list(size = 10, opacity = 0.75),
showlegend = FALSE
) %>%
layout(
xaxis = list(
title = "Área rural (ha)",
type = "log"
),
yaxis = list(
title = "Valor total de contratos - brita (R$)",
type = "log"
),
annotations = list(
list(
x = menor_area / 2,
y = min(dados_grafico$valor_total),
text = "* Pontos à esquerda representam municípios sem área rural.",
showarrow = FALSE,
xanchor = "left",
yanchor = "bottom"
)
)
)
#
estabelecimentos_maquinas <- read_excel("estabelecimentos_tratores.xlsx") %>%
transmute(
municipio_nome_maq = str_remove(str_squish(municipio), " \\(RJ\\)$"),
estabelecimentos = as.numeric(estabelecimentos)
) %>%
mutate(
municipio_chave = stri_trans_general(
str_to_upper(municipio_nome_maq), "Latin-ASCII"
)
)
#
estradas_agro_long <- municipios_long %>%
filter(
str_detect(
stri_trans_general(str_to_upper(str_squish(tipo)), "Latin-ASCII"),
"BRITA"
)
)
#
estradas_agro_municipio <- estradas_agro_long %>%
group_by(municipio_chave) %>%
summarise(
valor_total_brita = sum(valor_num, na.rm = TRUE),
n_contratos_brita = n(),
n_fornecedores_brita = n_distinct(cnpj_extraido),
.groups = "drop"
)
#
estradas_agro_municipio <- populacao_rj %>%
select(municipio_chave, municipio_nome, populacao_2022) %>%
left_join(
estabelecimentos_maquinas %>% select(municipio_chave, estabelecimentos),
by = "municipio_chave"
) %>%
left_join(estradas_agro_municipio, by = "municipio_chave") %>%
mutate(
valor_total_brita = replace_na(valor_total_brita, 0),
n_contratos_brita = replace_na(n_contratos_brita, 0),
n_fornecedores_brita = replace_na(n_fornecedores_brita, 0),
valor_por_estabelecimento = if_else(
estabelecimentos > 0, valor_total_brita / estabelecimentos, NA_real_
),
contratos_por_estabelecimento = if_else(
estabelecimentos > 0, n_contratos_brita / estabelecimentos, NA_real_
)
) %>%
arrange(desc(valor_total_brita))
#
estabelecimentos_sem_match <- estabelecimentos_maquinas %>%
filter(!municipio_chave %in% populacao_rj$municipio_chave)
#
estradas_agro_cor_valor <- cor(
estradas_agro_municipio$estabelecimentos,
estradas_agro_municipio$valor_total_brita,
method = "spearman", use = "complete.obs"
)
estradas_agro_cor_contratos <- cor(
estradas_agro_municipio$estabelecimentos,
estradas_agro_municipio$n_contratos_brita,
method = "spearman", use = "complete.obs"
)
#
estradas_agro_ranking <- estradas_agro_municipio %>%
filter(!is.na(estabelecimentos)) %>%
mutate(
rank_estabelecimentos = min_rank(desc(estabelecimentos)),
rank_valor_brita = min_rank(desc(valor_total_brita)),
defasagem = rank_valor_brita - rank_estabelecimentos
) %>%
arrange(desc(defasagem)) %>%
select(
municipio_nome, estabelecimentos, valor_total_brita, n_contratos_brita,
rank_estabelecimentos, rank_valor_brita, defasagem
)
#
estradas_agro_scatter <- estradas_agro_municipio %>%
filter(!is.na(estabelecimentos))
```
# Visão Geral
## Row {data-height=120}
### Total de contratos analisados
```{r}
valueBox(scales::number(nrow(seappadi_clean), big.mark = "."), color = pal_dark)
```
### Valor total contratado (R$)
```{r}
valueBox(scales::dollar(sum(top_contratados$valor_total, na.rm = TRUE),
prefix = "R$ ", big.mark = ".", decimal.mark = ","),
color = pal_dark)
```
### Empresas distintas (CNPJ)
```{r}
valueBox(scales::number(nrow(top_contratados), big.mark = "."), color = pal_dark)
```
## Row
### Top 15 contratados por valor do contrato
```{r}
top15 <- top_contratados %>% slice_head(n = 15) %>%
mutate(empresa = fct_reorder(str_trunc(empresa, 40), valor_total))
plot_ly(
top15,
x = ~valor_total,
y = ~empresa,
type = "bar",
orientation = "h",
text = ~scales::dollar(valor_total, prefix = "R$ ", big.mark = ".", decimal.mark = ","),
hovertemplate = "%{y}<br>%{text}<extra></extra>",
marker = list(color = "#0B3D2E")
) %>%
layout(
xaxis = list(title = "Valor do contrato (R$)"),
yaxis = list(title = ""),
margin = list(l = 10)
)
```
## Row
### Ranking completo de contratados (por CNPJ)
```{r}
top_contratados %>%
transmute(
CNPJ = cnpj_fmt,
Empresa = empresa,
`Valor do contrato` = valor_total,
`Nº de contratos` = n_contratos
) %>%
datatable(
rownames = FALSE,
options = list(pageLength = 10, order = list(list(2, "desc")))
) %>%
formatCurrency(
columns = "Valor do contrato",
currency = "R$ ",
interval = 3,
mark = ".",
dec.mark = ",",
digits = 2
)
```
# Empresas Ligadas por Sócios
## Row {data-height=120}
### Sócios que aparecem em mais de uma empresa contratada
```{r}
socios_multi_empresas %>%
transmute(
`Sócio/Proprietário` = proprietario,
`Valor total dos contratos` = valor_total,
`Empresas ligadas` = gsub("\\s*\\|\\s*", "<br>", empresas)
) %>%
datatable(
rownames = FALSE,
escape = FALSE,
options = list(pageLength = 10, order = list(list(1, "desc")))
) %>%
formatCurrency(
columns = 2,
currency = "R$ ",
interval = 3,
mark = ".",
dec.mark = ",",
digits = 2
)
```
# Análise por Município
## Row {data-height=110}
### Municípios com contrato identificado
```{r}
valueBox(scales::number(nrow(municipios_valor), big.mark = "."), color = pal_dark)
```
### Município com maior valor estimado
```{r}
top_mun <- municipios_valor %>% slice_head(n = 1)
valueBox(paste0(top_mun$municipio_nome, " — ", scales::dollar(top_mun$valor_total, prefix = "R$ ", big.mark = ".", decimal.mark = ",")),
color = pal_dark)
```
### Maior valor per capita estimado
```{r}
top_pc1 <- municipios_valor_pc %>% slice_head(n = 1)
valueBox(paste0(top_pc1$municipio_nome, " — ", scales::dollar(top_pc1$valor_per_capita, prefix = "R$ ", big.mark = ".", decimal.mark = ",")),
color = pal_dark)
```
## Row
### Top 15 municípios por valor total estimado
```{r}
top15_mun <- municipios_valor %>% slice_head(n = 15) %>%
mutate(municipio_nome = fct_reorder(municipio_nome, valor_total))
plot_ly(
top15_mun,
x = ~valor_total,
y = ~municipio_nome,
type = "bar",
orientation = "h",
text = ~scales::dollar(valor_total, prefix = "R$ ", big.mark = ".", decimal.mark = ","),
hovertemplate = "%{y}<br>%{text}<extra></extra>",
marker = list(color = pal_dark)
) %>%
layout(
xaxis = list(title = "Valor total contratado (R$)"),
yaxis = list(title = ""),
margin = list(l = 10)
)
```
### Top 15 municípios por valor per capita estimado
```{r}
top15_pc <- municipios_valor_pc %>% slice_head(n = 15) %>%
mutate(municipio_nome = fct_reorder(municipio_nome, valor_per_capita))
plot_ly(
top15_pc,
x = ~valor_per_capita,
y = ~municipio_nome,
type = "bar",
orientation = "h",
text = ~scales::dollar(valor_per_capita, prefix = "R$ ", big.mark = ".", decimal.mark = ","),
hovertemplate = "%{y}<br>%{text}/hab.<extra></extra>",
marker = list(color = pal_dark)
) %>%
layout(
xaxis = list(title = "Valor per capita contratado (R$ por habitante)"),
yaxis = list(title = ""),
margin = list(l = 10)
)
```
## Row
### Análise por município com dados populacionais
```{r}
municipios_valor %>%
transmute(
Município = municipio_nome,
`Valor total contratado` = valor_total,
`Nº de contratos` = n_contratos,
`Nº de fornecedores` = n_fornecedores,
`População (Censo 2022)` = populacao_2022,
`Valor per capita (R$/hab.)` = valor_per_capita
) %>%
datatable(
rownames = FALSE,
options = list(pageLength = 15, order = list(list(1, "desc")))
) %>%
formatCurrency(
columns = c("Valor total contratado", "Valor per capita (R$/hab.)"),
currency = "R$ ",
interval = 3,
mark = ".",
dec.mark = ",",
digits = 2
) %>%
formatRound(
columns = "População (Censo 2022)",
digits = 0,
interval = 3,
mark = "."
)
```
```{r, eval=nrow(municipios_sem_match) > 0, echo=FALSE}
htmltools::tags$div(
style = paste0("background-color:", pal_bg, "; border-left: 4px solid ", pal_dark, "; padding: 8px 14px; margin-top: 6px; font-size: 0.9em;"),
htmltools::tags$b("Observação: "),
paste0(nrow(municipios_sem_match), " registro(s) na coluna de município não correspondem a nenhum dos 92 municípios do RJ ",
"(ex.: \"Não Informado\", grafias divergentes ou nomes de região) e por isso foram excluídos dos gráficos e da tabela acima. ",
"Valor total desses registros: ", scales::dollar(sum(municipios_sem_match$valor_total), prefix = "R$ ", big.mark = ".", decimal.mark = ","), ". ",
"Principais rótulos encontrados: "),
paste(head(municipios_sem_match$municipio_nome, 10), collapse = "; ")
)
```
# Estradas Agro RJ
## Row
### Análise de contratos e valores estimados por área rural de cada município
```{r}
municipios_area_rural %>%
mutate(
sem_area_rural = is.na(area_ha) | area_ha == 0,
area_ha_tab = coalesce(area_ha, 0),
valor_ordenacao = if_else(
sem_area_rural,
valor_total,
valor_por_ha
),
valor_por_ha_exib = if_else(
sem_area_rural,
paste0(
"R$ ",
format(
round(valor_total, 2),
big.mark = ".",
decimal.mark = ",",
nsmall = 2
),
"*"
),
paste0(
"R$ ",
format(
round(valor_por_ha, 2),
big.mark = ".",
decimal.mark = ",",
nsmall = 2
)
)
)
) %>%
transmute(
Município = municipio_nome,
`Valor total` = valor_total,
`Nº de contratos` = n_contratos,
`Nº de fornecedores` = n_fornecedores,
`Área rural (ha)` = area_ha_tab,
`Valor por hectare (R$/ha)` = valor_por_ha_exib,
valor_ordenacao,
sem_area_rural
) %>%
datatable(
rownames = FALSE,
caption = htmltools::tags$caption(
style = "caption-side: bottom; text-align: left;",
"* Municípios sem área rural. Nesses casos, o valor exibido corresponde ao valor estimado total."
),
options = list(
pageLength = 15,
order = list(list(6, "desc")),
columnDefs = list(
list(visible = FALSE, targets = c(6, 7)),
list(orderData = 6, targets = 5)
)
)
) %>%
formatCurrency(
columns = "Valor total",
currency = "R$ ",
interval = 3,
mark = ".",
dec.mark = ",",
digits = 2
) %>%
formatRound(
columns = "Área rural (ha)",
digits = 0,
interval = 3,
mark = "."
) %>%
formatStyle(
columns = "sem_area_rural",
target = "row",
backgroundColor = styleEqual(c(TRUE, FALSE), c("#BFDCC9", "white")),
fontWeight = styleEqual(c(TRUE, FALSE), c("bold", "normal"))
)
```
### Área rural x valor total de contratos de compra de brita corrida por município
```{r}
grafico_area_valor
```
## Row
### Valor investido x nº de estabelecimentos rurais
```{r}
plot_ly(
estradas_agro_scatter,
x = ~estabelecimentos,
y = ~valor_total_brita,
size = ~n_contratos_brita,
text = ~paste0(municipio_nome, "<br>Estabelecimentos: ", estabelecimentos,
"<br>Valor brita: ", scales::dollar(valor_total_brita, prefix = "R$ ")),
hoverinfo = "text",
type = "scatter",
mode = "markers",
marker = list(
color = "#0B3D2E",
opacity = 0.75
)
) %>%
layout(
xaxis = list(title = "Estabelecimentos rurais"),
yaxis = list(title = "Valor estimado em contratos (R$)")
)
```
### Defasagem de valor recebido por quantidade de estabelecimentos rurais
```{r}
DT::datatable(
estradas_agro_ranking,
colnames = c("Município", "Estabelecimentos", "Valor brita", "Contratos",
"Rank estab.", "Rank valor", "Defasagem"),
options = list(pageLength = 15, dom = "tp")
) %>%
DT::formatCurrency(
columns = "valor_total_brita",
currency = "R$ ",
mark = ".",
dec.mark = ",",
digits = 2
)
```
# Fonte e Metodologia
## Row
### Sobre esta análise
```{r}
htmltools::tags$div(
htmltools::tags$p(htmltools::tags$b("Fonte: "),
"Dados extraídos do SIAFE (Sistema Integrado de Administração Financeira), ",
"referentes aos contratos da SEAPPA, e do IBGE (Instituto Brasileiro de Geografia e Estatística)."),
htmltools::tags$p(htmltools::tags$b("Observação: "),
"Os valores de contratos somados por CNPJ não incluem eventuais aditivos contabilizados",
"separadamente; a coluna qtd_aditivos está disponível na base para análises futuras."),
htmltools::tags$p(htmltools::tags$b("Análise por município: "),
"Quando um contrato lista mais de um município, seu valor foi rateado para cada um deles,",
"ou seja, não representa os valores reais destinados a cada município, mas uma aproximação para fins analíticos."),
htmltools::tags$p(htmltools::tags$b("População e valor per capita: "),
"os dados populacionais são do Censo Demográfico do IBGE de 2022 para os 92 municípios do estado do Rio de Janeiro"),
htmltools::tags$p(htmltools::tags$b("Estradas Agro RJ: "),
"Os dados de área rural e quantidade de estabelecimentos rurais são do Censo Agropecuário do IBGE de 2017.",
"Foram utilizados apenas os contratos de compra de brita corrida para esta análise.",
"O valor total de cada contrato foi dividido igualmente entre os municípios envolvidos,", "exclusivamente para permitir análises agregadas em nível municipal. Assim, os valores", "municipais devem ser interpretados como estimativas analíticas, e não como a alocação", "financeira efetivamente realizada."
),
htmltools::tags$p(
htmltools::tags$b("Juliana Tardem"), htmltools::tags$br(),
htmltools::tags$b("Leandro Peres de Oliveira"), htmltools::tags$br(),
htmltools::tags$em("Assessores na Comissão de Avaliação em Políticas Públicas da Casa Civil")
),
htmltools::tags$p(htmltools::tags$em(
paste("Painel gerado em", format(Sys.Date(), "%d/%m/%Y"), "."))
)
)
```