Criar tableas usando R e obter consultas sobre as variáveis, principalmente fiscalização e multas, gerando visualizações dos dados
library(readxl)
library(ggplot2)
library(tidyverse)
library(sf)
library(tmap)
library(tmaptools)
library(knitr)
library(ggsflabel)
library(gghighlight)Fiscalizacao <- read_excel("Relatorio_Fiscalizacao_Completo.xlsx",
sheet = "Fiscalização")
Dados_Municipios <- read_excel("Dados Municípios.xlsx")
Atividades_de_Supressao_de_Vegetacao <- read_excel("Atividades de Supressão de Vegetação.xlsx")
Atividades <- read_excel("Relatorio_Fiscalizacao_Completo.xlsx",
sheet = "Atividades")
Infracoes <- read_excel("Relatorio_Fiscalizacao_Completo.xlsx",
sheet = "Infrações", col_types = c("numeric",
"text", "text", "text", "text", "text",
"text", "text", "text", "text",
"text", "text", "numeric"))Unindo os bancos de dados para posteriormente gerar mapas
#Arquivo com os polígonos dos municípios a partir do IBGE
mg <- read_sf("MG_Municipios_2020.shp")
names(mg)[1] <- "geocodigo"
#Merge com dados dos municípios via SEMAD
mg2<- full_join(mg,Dados_Municipios, by="geocodigo")Qual a diferença entre o número de fiscalizações de pessoa física e empresas:
Fiscalizacao$`Tipo de documento` %>% table() %>% kable() | . | Freq |
|---|---|
| CNPJ | 36434 |
| CPF | 130350 |
3,6 vezes mais pessoas físicas do que empresas sendo fiscalizadas As primeiras perguntas seriam se essa proporção se manteve constante ao longo dos anos? Há diferenças entre o número de fiscalizações entre os biomas?
#Alterando as datas para formato padrão yyyy-mm-dd
Fiscalizacao$`Data da fiscalização` <-dmy(Fiscalizacao$`Data da fiscalização`)
#Selecionando apenas o ano e salvando
Fiscalizacao$`Data da fiscalização` <-format(Fiscalizacao$`Data da fiscalização`,format ="%Y")
#Plotando a evolução das fiscalizações
Fiscalizacao$Bioma <-as.factor(Fiscalizacao$Bioma)
Fiscalizacao %>%
group_by(`Tipo de documento`,Data=`Data da fiscalização`,Bioma) %>%
summarise(Fiscalizações=length(Bioma))%>%
ggplot()+
geom_col(aes(Fiscalizações, Data,fill=`Tipo de documento` ))+
xlab("Número de Fiscalizações")+facet_wrap(~Bioma)Aparentemente há uma aumento de CNPJs entre os Biomas. É relevante ou apenas coincidencia? Todas as fiscalizações serão agrupadas pro bioma e por tipo de documento
Fiscalizacao %>%
group_by(Doc=`Tipo de documento`,Bioma) %>%
summarise(Fiscalizações=length(Bioma)) ->dados
dados = na.omit(dados)
# Subset the data frame to include only CNPJ and CPF rows
cnpj_data <- subset(dados, dados$Doc=="CNPJ")
cpf_data <- subset(dados, dados$Doc=="CPF")
# Calculate the sum of column 3 for each biome and data type
cnpj_biome_sum <- cnpj_data %>% group_by(Bioma) %>% summarise(CNPJ_sum = sum(Fiscalizações))
cpf_biome_sum <- cpf_data %>% group_by(Bioma) %>% summarise(CPF_sum = sum(Fiscalizações))
# Merge the two data frames on biome name
merged_data <- merge(cnpj_biome_sum, cpf_biome_sum, by = "Bioma")
# Calculate the ratio of CNPJ_sum to CPF_sum
merged_data <- merged_data %>% mutate(razão = CNPJ_sum / (CPF_sum+CNPJ_sum))
merged_data %>% kable()| Bioma | CNPJ_sum | CPF_sum | razão |
|---|---|---|---|
| Caatinga | 80 | 1054 | 0.0705467 |
| Cerrado | 8680 | 48552 | 0.1516634 |
| Mata Atlântica | 18409 | 67092 | 0.2153074 |
21% das fiscalizações foram em CNPJ para o Bioma Mata Atlantica, 15% para Cerrado e 7% para Caatinga.
Apenas 6% do valor total, porém é claramente constante ao longo dos anos.
Isso pode ser notado normalizando os eixos do gráfico acima:
Fiscalizacao$Bioma <-as.factor(Fiscalizacao$Bioma)
Fiscalizacao %>%
group_by(`Tipo de documento`,Data=`Data da fiscalização`,Bioma) %>%
summarise(Fiscalizações=length(Bioma))%>%
ggplot()+
geom_col(aes(Fiscalizações, Bioma,fill=`Tipo de documento` ))+
xlab("Fiscalizações")Há um aumento do número de CNPJs nos bioma Mata Atlântica, mas as multas são maiores?
Primeiramente os valores em UFEMG serão transformados para Real:
#Sem sucesso usando o arquivo via readxl, lendo a partir do CSV exportado do excel:
library(readr)
infracoes <- read_csv("infrações.csv",
col_types = cols(Multa = col_number()),
locale = locale(date_names = "br", decimal_mark = ","))
#Retirando NA
infracoes <- infracoes[!is.na(infracoes$Multa),]
infracoes <- infracoes[!is.na(infracoes$Moeda),]
count(infracoes) %>% kable()| n |
|---|
| 66329 |
#Trocando os valores de UFEMG pelo valor medio entre 2019 e 2023
infracoes$Multa[infracoes$Moeda =="UFEMG"] <-infracoes$Multa[infracoes$Moeda =="UFEMG"]*4Após a conversão aproximada de UFEMG para Real temos 66329 Multas no período de 2019-2023
Agora será feita a união dos dados de infrações com a base de dados principal:
names(infracoes)[1] <-"ID"
Fiscalizacao <- merge(Fiscalizacao, infracoes[,c(1,7)], by= "ID")Vamos buscar a mediana das multas
length(Fiscalizacao$Multa[Fiscalizacao$Multa>=1])[1] 65403
median(Fiscalizacao$Multa)[1] 5600
Do total de 166887 fiscalizações foram emitidas 65403 multas com uma mediana de R$5600 Reais
E há diferença entre as medianas entre CPFs e CNPJs?
Fiscalizacao %>% group_by(`Tipo de documento`) %>% summarise(median(Multa)) %>% kable()| Tipo de documento | median(Multa) |
|---|---|
| CNPJ | 13000.00 |
| CPF | 4877.88 |
| NA | 1502.54 |
Sim, os valores para CNPJs são 2,5 vezes maiores do que os para CPFs
Veremos agora como os valores se distribuiem ao longo da faixa, mas antes identificar possíveis valores outliers
Fiscalizacao %>% filter(Multa>100000000.00) %>% count()Temos 45 multas acima de 100 milhões. Será feito um sumário somente das multas abaixo desse valor:
#Retirando multasmaiores que 100 milhões de Reais
Fiscalizacao <-subset(Fiscalizacao,Multa<100000000.00)
#Plotando
summary(Fiscalizacao$Multa) Min. 1st Qu. Median Mean 3rd Qu. Max.
0 2000 5600 57932 15000 90000000
Fazendo a Análise dos quartis, 25% das multas são de até R$ 2.000, 50% delas, valor referente a mediana são de até R$5.600 reais. Temos 75% das Multas abaixo de R$15.000, a média ainda é alta apesar da exclusão de 45 multas acima de R$100 milhões (Algumas foram excluídas por possível erro de digitação, como valores na casa de Bilhões).
Outros faixas podem ser investigadas:
quantile(Fiscalizacao$Multa, 0.90) 90%
41755.5
quantile(Fiscalizacao$Multa, 0.95) 95%
86749.41
90% das multas estão abaixo de R$ 41.800 e apenas 5% estaria acima de R$86.800.
Visulazaremos agora os Valores de multas distribuidos ao longo do período estudado, iniciando pelos valores abaixo de 100 milhões de reais:
ggplot(Fiscalizacao)+geom_col(aes(`Data do Auto de Fiscalização`,(Multa/1000000),fill=`Tipo de documento` ),)+
theme(axis.text.x=element_blank(), axis.ticks.x=element_blank())+
ylim(c(0,100))+
ylab("Multa(Milhões de Reais)")+
ggtitle("Multas (em Milhões de R$) durante o \n período de 2019 a 2023")+
xlab("Período de fiscalização 2019-2023")
Nota-se varias multas com valores entre 10 100 milhões de reais, a maior
parte, CNPJs (em vermelho).
Agora dando ênfase a multas abaixo de 10 Milhões de Reis:
ggplot(Fiscalizacao)+
geom_col(aes(`Data do Auto de Fiscalização`,Multa/1000000,fill=`Tipo de documento` ))+
theme(axis.text.x=element_blank(),axis.ticks.x=element_blank())+
ylim(c(0,10))+
ylab("Multa(Milhões de Reais)")+
ggtitle("Multas (em Milhões de R$) durante o período de \n 2019 a 2023 e abaixo de 10 milhões" )+
xlab("Período de fiscalização 2019-2023")Números de mutlas é bem distribuído no período, lembrando que 95% das multas são inferiores a R$ 80.000.
Vemos abaixo a distribuição das multas por ano no período de 2019 a 2023:
Fiscalizacao %>%
ggplot()+
geom_col(aes( `Data da fiscalização`, Multa/1000000,fill=`Tipo de documento`))+
ylab("Valor total de multas")+
xlab("Ano")+
theme_classic()+
ggtitle(("Valores totais de multas emitidos \n listado por ano (2019 a 2023). "))
Diminuição considerável no valore emitido de multas entre 2019 e 2020.
Agora com uma visualização estilo boxplot:
Fiscalizacao %>% filter(Multa %in% 1000:10000000) %>%
ggplot()+
geom_jitter(aes( `Data da fiscalização`, Multa,color=`Tipo de documento`),alpha=0.2)+
ylab("Valor total de multas (escala log)")+
xlab("Período 2019-2022")+
scale_y_log10()+
theme_classic()+
geom_hline(yintercept = 86749, linetype = 3, colour = 'red', size = 2)+
ggtitle(("Valores totais de multas emitidos \n listado por ano (2019 a 2023). "))Mesmo com grande variação dos valores (ponto acima e abaixo das caixas são outliers), nota-se que a médiana se mantêm ao longo do tempo (linha central de cada caixa, referente a 50% das fiscalizações). Eixo do valor das multas está em escala logarítmica para facilitar visualização. A linha vermelha representa 95% das fiscalizações, todas abaixo de R$ 86749.
Quais são as áreas de Caatinga no Estado, e Mata Atlantica e Cerrado e o respectivo número de fiscalizações?
#Adicionando o Bioma ao objeto mg2
Fiscalizacao %>% select(Município,Bioma) ->d
table(d) ->d
mg2 <- merge(mg2,d, by= "Município")Gerando cada gráfico de bioma:
mg2 %>% filter(Bioma=="Caatinga") %>%
ggplot()+geom_sf(aes(fill=Freq))+
scale_fill_gradient(low='lightcyan',high='red')+
ggtitle("Caatinga")
As fiscalizações na Caatinga se concentram no norte do Estado, próximo a
divisa com a Bahia.
mg2 %>% filter(Bioma=="Caatinga") %>% select(Município,Freq) %>% arrange(desc(Freq)) %>% .[1:5,] %>% kable()| Município | Freq | geometry |
|---|---|---|
| Jaíba | 108 | POLYGON ((-43.5475 -14.968,… |
| Espinosa | 57 | POLYGON ((-43.18759 -14.654… |
| São João da Ponte | 50 | POLYGON ((-43.62158 -15.710… |
| Gameleiras | 45 | POLYGON ((-43.39285 -14.777… |
| Pai Pedro | 35 | POLYGON ((-43.29197 -15.090… |
Os municípios de Jaíba aparece primeiro com 108 fiscalizações e Espinosa em segundo com quase a metade disso.
Fazendo o mesmo processo com a Mata Atlântica:
mg2 %>% filter(Bioma=="Mata Atlântica") %>%
ggplot()+geom_sf(aes(fill=Freq))+
scale_fill_gradient(low='lightcyan',high='red')+
ggtitle("Mata Atlântica")mg2 %>% filter(Bioma=="Mata Atlântica") %>% select(Município,Freq) %>% arrange(desc(Freq))%>% .[1:5,] %>% kable()| Município | Freq | geometry |
|---|---|---|
| Formiga | 469 | POLYGON ((-45.46905 -20.312… |
| Governador Valadares | 438 | POLYGON ((-42.0099 -18.5515… |
| Itamarandiba | 374 | POLYGON ((-42.68769 -17.545… |
| Marliéria | 345 | POLYGON ((-42.52396 -19.557… |
| Mutum | 319 | POLYGON ((-41.38509 -19.670… |
Formiga e Governador Valadares tem aproximadamente 4 vezes mais fiscalizações do que a cidade mais fiscalizada na Caatinga.
Pode se considerar que esse fato é devido a densidade da Mata Atlantica, tanto em flora como em fauna.
Avaliação do Cerrado:
mg2 %>% filter(Bioma=="Cerrado") %>%
ggplot()+geom_sf(aes(fill=Freq))+
scale_fill_gradient(low='lightcyan',high='red')+
ggtitle("Cerrado")o Cerrado se concentra mais no Triângulo e Oeste do estado.
mg2 %>% filter(Bioma=="Cerrado") %>% select(Município,Freq) %>% arrange(desc(Freq))%>% .[1:5,] %>% kable()| Município | Freq | geometry |
|---|---|---|
| Paracatu | 635 | POLYGON ((-47.01726 -16.596… |
| Sete Lagoas | 484 | POLYGON ((-44.16401 -19.292… |
| Diamantina | 431 | POLYGON ((-43.27507 -17.390… |
| Unaí | 412 | POLYGON ((-46.63338 -15.791… |
| Montes Claros | 360 | POLYGON ((-43.78019 -16.085… |
Paracatu Concentrou até 6 vezes mais fiscalizações do que a cidade com mais fiscalizações da Caating e quase 50% a mais que a da Mata Atlântica.
Visualizando as 10 cidades com mais fiscalizações:
mg2 %>% filter(Bioma=="Cerrado") %>%
ggplot()+geom_sf(aes(fill=Freq))+
scale_fill_gradient(low='lightcyan',high='red')+
ggtitle("Cerrado")+
gghighlight(Freq>300)+
geom_sf_label(aes(label = Município),position = position_jitter())
Afastando a identificação das cidades pois Divinópolis não ficou
visível:
mg2 %>% filter(Bioma=="Cerrado") %>%
ggplot()+geom_sf(aes(fill=Freq))+
scale_fill_gradient(low='lightcyan',high='red')+
ggtitle("Cerrado")+
gghighlight(Freq>300)+
geom_sf_label_repel(aes(label = Município),force = 10000, nudge_x = 1, seed = 100)