Objetivos:

Criar tableas usando R e obter consultas sobre as variáveis, principalmente fiscalização e multas, gerando visualizações dos dados

Bibliotecas utilizadas:

library(readxl)
library(ggplot2)
library(tidyverse)
library(sf)
library(tmap)
library(tmaptools)
library(knitr)
library(ggsflabel)
library(gghighlight)

Carregando os dados

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")

Análise dos dados agrupados:

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")

Os valores de multa aplicado são maiores?

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"]*4

Após a conversão aproximada de UFEMG para Real temos 66329 Multas no período de 2019-2023

Análise usando os valores de multa

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.

Criando Mapas com fiscalizações em cada Bioma:

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)