1. Introdução
A coleta de resíduos sólidos, ou popularmente conhecida como coleta de lixo, é uma questão imprescindível a ser tratada em qualquer âmbito social e nas diversas escalas da administração pública.
A cidade do Recife é responsável pela produção de 42% do lixo coletado em toda a Região Metropolitana do Recife (RMR), o que atribui à capital uma grande responsabilidade em gerenciar o descarte, a coleta e o destino que esses componentes tomarão.
Tendo em vista que a temática tem impacto social e é apontada pela legislação como dever de todos os cidadãos, a prefeitura conta com diversas empresas contratadas para auxiliar no desenvolvimento das ações e seus resultados. As secretarias especializadas também são empenhadas em garantir que as regulações sejam cumpridas e a sociedade geral possui seu papel em propagar a conscientização sobre o descarte e coleta.
Todavia, o descarte dos resíduos sólidos, quando realizado de forma indevida em estabelecimentos e ruas, causa significativos problemas ao meio social. Na cidade do Recife, por exemplo, alagamentos em períodos de chuvas, entupimentos dos esgotos e a degradação ambiental são consequências muitas vezes direta das iniciativas não eficientes. Logo, para que exemplos como esses diminuam ou parem de ocorrer, aprimoramentos devem ser propostos e novos planejamentos analisados por meio da verificação e estudos dos dados resultantes dessa atividade diária, haja vista que a população aumenta gradativamente e a cidade se desenvolve.
Por conseguinte, o relatório em questão tem por objetivo e foco a análise dos dados sobre como caminham as resoluções dessa questão buscando apontar melhorias nas ações de planejamento das rotas de coleta. Nesse contexto, é possível avaliar locais estratégicos de maior demanda no descarte para otimizar a alocação de trabalhadores e garantir que a maior quantidade de lixo possa ser coletada em um tempo hábil. Além disso, os resultados dessa análise podem ser aprimorados para utilização em treinamento de modelos de inteligência artificial (IA).
1.1 Fonte dos dados
Para fins de trabalho com dados específicos e de baixa escala, foi decidido focar nos dados fornecidos pela Prefitura do Recife no site Dados Abertos Recife.
Logo, foram selecionados dois datasets que combinandos podem ser utilizados para se ter uma visão abrangente do cenário trabalhado:
2. Pacotes Necessários
Os pacotes do R listados abaixo são essenciais para executar o código de forma eficiente e sem erros.
| Pacote | Propósito |
|---|---|
| DT | para criar tabelas funcionais em HTML |
| knitr | para geração de relatórios dinâmicos |
| kableExtra | para adicionar estilo em tabelas |
| tibble | para adicionar o índice de dataframe como uma nova coluna |
| ggplot2 | para gerar gráficos |
| dplyr | para realizar transformação de dados |
3. Preparar dados
Os dados aqui tratados, fazendo uma recapitulação, foram apanhados no site Dados Abertos da Prefitura do Recife. O site é de uso aberto e qualquer pessoa pode acessar para visualizar diversas informações sobre inúmeros aspectos da capital Recifense.
No entanto, neste trabalho focaremos nos números e detalhes informados sobre a coleta de resíduos sólidos na cidade.
Importando os dados
As bases de dados mencionadas na Introdução estão armazenadas no formato de arquivo CSV. Inicialmente, iremos fazer a importação de ambas para, então, poder visualizá-las sem tratamento prévio.
# Dataset Pesagens de Resíduos
df_pesagens <- read.csv(file=pesagens_csv,
header = T, na.strings = "", strip.white = T, sep = ",")
# Dataset Rotas de Coleta
df_rotas <- read.csv(file=rotas_csv,
header = T, na.strings = "", strip.white = T, sep = ";")
A seguir serão apresentados alguns detalhes sobre cada uma das duas.
Pesagens de Resíduos
O arquivo em questão possui 123750 linhas e 19 colunas. Os dados presentes nas colunas são majoritariamente de três tipos: numeric, text e timestamp.
Haja vista que estamos analisando a temática da coleta de lixo na cidade do Recife, as colunas são nomeadas da seguinte forma para apresentar as informações referentes:
- X_id
- PES_ID
- LOCALDESCARREGO_ID
- LOCALDESCARREGO_DESC
- EMP_ID
- EMP_NOME
- ROTA_ID
- TPVEICULO_DESC
- PES_DATAINI
- PES_HRINI
- PES_PESOINI
- PES_DATAFIM
- PES_HRFIM
- PES_PESOFIM
- PES_PESOUTIL
- COLETA_ID
- COLETA_DESC
- ESPECCOLETA_ID
- ESPECCOLETA_DESC
Abaixo visualizamos as primeiras 6 linhas do dataset.
Caso queria saber mais detalhes sobre cada coluna com sua descrição e tipo de dado, você consegue acessando este link.
Rotas de Coletas
Para o segundo dataset, os detalhes diferem um pouco, porém ainda mantêm aspectos em comum. O arquivo em questão possui 1228 linhas e 8 colunas. Os dados presentes nas colunas são majoritariamente de dois tipos: numeric e text.
As colunas são nomeadas da seguinte forma para apresentar as informações referentes:
- X_id
- PERCUSSO_I
- ROTA_ID
- EMP_ID
- LOCAL_ID
- ROTA_DESC
- TPCIRCUITO_DESC
- LOCAL_NOME
Abaixo visualizamos as primeiras 6 linhas do dataset.
Caso queria saber mais detalhes sobre cada coluna com sua descrição e tipo de dado, você consegue acessando este link.
Ao verificar ambas as bases, iremos iniciar os tratamentos para melhor exibir os dados visando o objetivo apresentado na seção de Introdução. Continuamos na subseção “Tratamento inicial”.
Tratamento inicial
Nesta subseção trabalharemos com os dois datasets ao mesmo tempo. Visando ao final do processo juntar ambos em uma única base de dados, é necessário, primeiramente, a realização da limpeza em informações que não iremos utilizar.
Índices duplicados
A fim de juntar as bases, é importante que não tenhamos índices duplicados nas duas. Tais duplicações de índices podem causar duplicações nos próprios dados. Logo, para corrigir será preciso remover esses índices para garantir que o dados sejam únicos quando unidos.
# Remoção do índice em Pesagens de Resíduos
df_pesagens <- df_pesagens %>% rowid_to_column("index") %>%
distinct(PES_ID, .keep_all = TRUE)
# Remoção do índice em Rotas de Coletas
df_rotas <- df_rotas %>% rowid_to_column("index") %>%
distinct(ROTA_ID, .keep_all = TRUE)
Agora que removemos as duplicações nos índices podemos juntar ambas
as bases com a função merge.
A junção deve ocorrer por meio de uma coluna em comum nos dois
datasets. No nosso caso em questão, ambas as bases possuem a coluna
ROTA_ID, a qual será a coluna “chave”.
# Juntando os datasets com base na coluna ROTA_ID
df <- merge(x=df_pesagens, y=df_rotas, by="ROTA_ID", all=FALSE)
Desta forma, temos a visualização do resultado abaixo.
Ao verificar a tabela acima é possível ver que há algumas colunas duplicadas. Logo, a partir daqui iremos para uma nova parte do tratamento desses dados.
Continuamos na subseção “Remoções e adaptações”.
Remoções e adaptações
Após tê-los unidos, vimos na subseção anterior que existem alguns
dados duplicados. Por exemplo, as colunas EMP_ID.x e
EMP_ID.y, index.x, index.y e
X_id, possuem o mesmo significado e por esse motivo iremos
tratá-las.
O grupo de colunas EMP_ID.x e EMP_ID.y será
tratado da seguinte forma: a primeira será renomeada para
EMP_ID e, então, a segunda será removida.
# Renomear EMP_ID.x
df <- df %>% rename(EMP_ID = EMP_ID.x)
# Remover EMP_ID.y
df <- df %>% select(-EMP_ID.y)
No caso do resto das colunas, nós apenas manteremos os atributos que apresentam dados reais para serem trabalhos aqui. Desse modo, as demais colunas mencionadas serão removidas diretamente.
df <- df %>% select(-index.x, -index.y, -X_id)
Com o primeiro tratamento finalizado, nós seguiremos para analisar as
seguintes colunas: PES_DATAINI, PES_DATAFIM,
PES_HRINIe PES_HRFIM.
O tipo de dados aqui é character, porém para fazer algum ajuste com esse dado será preciso formatá-lo para que possamos trabalhar com o tipo de data e hora.
Nesse sentido, seremos capazes de eliminar algumas dessas colunas e
atribuir seus valores a uma outra coluna distinta. Ou seja, criaremos
duas novas variáveis chamadas DATETIME_INI e
DATETIME_FIM para representar as informações de data e hora
inicial e data e hora final do procedimento de coleta,
respectivamente.
Por fim, teremos as colunas PES_DATAINI,
PES_DATAFIM, PES_HRINIe PES_HRFIM
removidas.
# Pegando os 10 primeiros caracteres de uma string
df$PES_DATAINI <- substr(df$PES_DATAINI, 1, 10)
df$PES_DATAFIM <- substr(df$PES_DATAFIM, 1, 10)
# Pegando os 8 últimos caracteres de uma string
df$PES_HRINI <- substr(df$PES_HRINI, 12, 19)
df$PES_HRFIM <- substr(df$PES_HRFIM, 12, 19)
# Juntando os dados anteriores em duas colunas no formato "YYYY-MM-DD HH:MM:SS"
df$DATETIME_INI <- as.POSIXct(paste(df$PES_DATAINI, df$PES_HRINI), format="%Y-%m-%d %H:%M:%S")
df$DATETIME_FIM <- as.POSIXct(paste(df$PES_DATAFIM, df$PES_HRFIM), format="%Y-%m-%d %H:%M:%S")
# Removendo as colunas `PES_DATAINI`, `PES_DATAFIM`, `PES_HRINI`e `PES_HRFIM`
df <- df %>% select(-PES_DATAINI, -PES_DATAFIM, -PES_HRINI, -PES_HRFIM)
Pré-processamento
Após termos finalizado a segunda etapa do tratamento, conseguimos avançar para mais um aprimoramento do dataset. Como informado na seção de Introdução, a base de dados resultante pode ser utilizada para treinamento com modelos de IA, logo, pensando nisso, é possível melhorar o tratamento feito até então.
Remoção de duplicatas
Verificando o dataset ainda percebemos algumas informações duplicadas
como nomes e descrições que já se encontram em outras colunas, por
exemplo: COLETA_DESC e COLETA_ID que possuem
as mesmas informações.
Além disso, é notório a duplicidade nas colunas abaixo. *
PES_PESOINI * PES_PESOFIM *
PES_PESOUTIL
Tendo em vista que
PES_PESOUTIL = PES_PESOFIM - PES_PESOINI, podemos remover e
manter apenas a coluna contendo o peso útil dos resíduos
(PES_PESOUTIL).
Uma outra observação que pode ser feita para corroborar a remoção da
variável PES_PESOINI é a referência que a própria faz ao
peso que um veículo de coleta possui descrito na coluna
TPVEICULO_DESC. Logo:
# Removendo colunas
df_final <- df %>% select(-PES_PESOFIM, -PES_PESOINI, -COLETA_DESC, -ESPECCOLETA_DESC, -ROTA_DESC)
Adaptações finais
No dataset existe a coluna TPCIRCUITO_DESC que informa
sobre a descrição dos tipos de circuitos realizados para a coleta, no
entanto esses valores são do tipo text e para não
precisarmos ter um trabalho maior, iremos substituir seus únicos três
valores por números.
df_final$TPCIRCUITO_DESC <- recode(df_final$TPCIRCUITO_DESC, '-REA' = 0, 'CIRCUITO' = 1, 'PONTUAL' = 2)
Continuamos na subseção “Dataset final” para o resultado final.
Dataset final
Após termos executados todos os passos nas subseções anteriores, temos como resultado final o dataset que será usado para análise nesse relatório.
Abaixo é possível conferir suas primeiras 6 linhas.
É verificando essa base de dados resultante que percebemos melhor como os dados podem ser utilizados para levantar ponderações e insights sobre a temática da coleta de lixo.
Para o estudo da eficiência desse trabalho algumas dessa variáveis podem ser analisadas mais afinco em conjunto com outras. Por exmeplo: podemos analisar a relação existente entre a quantidade de resíduos coletados e a rota de coleta seguida; como se dá a relação dos dias da semana de coleta e o peso total de lixo apanhado; entre outros insights que serão descritos ao longo da próxima seção.
4. Análise Exploratória
Nesta seção mostraremos os insights referentes aos objetivos desse relatório sobre a temática da coleta de lixo na cidade do Recife. No entanto, enquanto o dataset era verificado, outras análises consideradas importantes para o cenário foram levantadas. Todas serão exibidas e discutidas nas subseções abaixo.
Relação entre a quantidade de resíduos e as rotas de coleta
Já mencionada na seção anterior, a relação entre as variáveis
PES_PESOUTIL e ROTA_ID é importante para
entendermos como está a distribuição do lixo na cidade, ou seja, por
qual rota é coletado mais lixo?
Tal questionamento ajuda uma empresa ou instituição a designar melhor o tipo de veículo para aquele local e a quantidade de trabalhadores, por exemplo.
# Calcular a média de resíduos por rota
media_residuos_por_rota <- aggregate(PES_PESOUTIL ~ ROTA_ID, data = df_final, FUN = mean)
Para uma visualização mais didática, segue o gráfico com a disposição dos dados.
# Criar gráfico de barras para resíduos por rota
ggplot(media_residuos_por_rota, aes(x = ROTA_ID, y = PES_PESOUTIL)) +
geom_bar(stat = "identity", fill = "orange") +
theme_minimal() +
labs(title = "Média de Resíduos Coletados por Rota", x = "Rota", y = "Peso Médio dos Resíduos (ton)")
Tipo de veículo x Quantidade de resíduos coletados
Para os diversos tipos de coleta, existem tipos específicos de veículos que podem ser usados. Verificar se o tipo de veículo utilizado influencia na quantidade de resíduos coletados também é um ponto interessante, haja vista que alguns veículos podem ter maior capacidade de coleta ou serem mais eficientes para determinadas rotas.
Logo, com auxílio das colunas PES_PESOUTIL e
TPVEICULO_DESC será possível determinar esse cálculo e
gerar o gráfico para melhor visualização e entendimento.
# Calcular a média de resíduos por tipo de veículo
media_residuos_por_veiculo <- aggregate(PES_PESOUTIL ~ TPVEICULO_DESC, data = df_final, FUN = mean)
# Gráfico de barras para a média de resíduos por tipo de veículo
ggplot(media_residuos_por_veiculo, aes(x = TPVEICULO_DESC, y = PES_PESOUTIL)) +
geom_bar(stat = "identity", fill = "lightgreen") +
theme_minimal() +
labs(title = "Média de Resíduos por Tipo de Veículo", x = "Tipo de Veículo", y = "Peso Médio dos Resíduos (ton)") +
theme(axis.text.x = element_text(angle = 45, hjust = 1))
Análise de produtividade por empresa
Neste caso em específico, se houver mais de uma empresa envolvida na coleta de resíduos, conseguimos comparar a produtividade de cada uma em termos de peso de resíduos coletados. Isso pode ser útil para identificar se há disparidades entre as empresas e ajustar contratos ou recursos.
# Calcular a média de resísuos por empresa
media_residuos_por_empresa <- aggregate(PES_PESOUTIL ~ EMP_NOME, data = df_final, FUN = mean)
# Organizar os dados pela quantidade de resíduos coletados, de forma decrescente
media_residuos_por_empresa <- media_residuos_por_empresa[order(-media_residuos_por_empresa$PES_PESOUTIL), ]
# Ajustar os nomes das empresas para que sejam fatores e mantenham a ordem no gráfico
media_residuos_por_empresa$EMP_NOME <- factor(media_residuos_por_empresa$EMP_NOME, levels = media_residuos_por_empresa$EMP_NOME)
No gráfico abaixo podemos comparar a quantidade total de resíduos
coletados por cada empresa (EMP_NOME).
# Criar o gráfico de barras
g <- ggplot(media_residuos_por_empresa, aes(x = EMP_NOME, y = PES_PESOUTIL, fill = EMP_NOME)) +
geom_bar(stat = "identity") +
theme_minimal() +
labs(title = "Produtividade das Empresas na Coleta de Resíduos",
x = "Empresa",
y = "Peso Médio dos Resíduos (ton)") +
theme(axis.text.x = element_text(angle = 90, hjust = 1, vjust = 0.5),
legend.position = "none")
# Exibir o gráfico
print(g)
Coleta nos dias da semana
Com esse dataset também conseguimos detectar qual(is) o(s) dia(s) da semana e final de semana em que o número de resíduos coletados é maior. Esse dado pode ajudar a empresa, ou instituição, no caso de precisar alocar mais trabalhadores em um dia específico ou fazer um rodízio estratégico.
Entretanto, o dataset não possui um coluna informando os dias da semana de forma explícita, nesse caso é preciso fazer um pequeno ajuste.
A coluna DATETIME_INI possui as informações de data e
hora e com isso conseguiremos utilizar uma função específica chamada
weekdays a qual irá gerar os dias da semana como: domingo,
segunda, terça, quarta, quinta, sexta e sábado.
Por fim, é possível elaborar o cálculo da média e o gráfico com os dados corretos.
# Adicionar uma coluna com o dia da semana
df_final$dia_semana <- weekdays(df_final$DATETIME_INI)
# Definir a ordem correta dos dias da semana
df_final$dia_semana <- factor(df_final$dia_semana,
levels = c("domingo", "segunda-feira", "terça-feira",
"quarta-feira", "quinta-feira", "sexta-feira", "sábado"))
# Calcular a média de resíduos coletados por dia da semana
media_residuos_por_dia <- aggregate(PES_PESOUTIL ~ dia_semana, data = df_final, FUN = mean)
# Criar um gráfico de linhas
ggplot(media_residuos_por_dia, aes(x = dia_semana, y = PES_PESOUTIL, group = 1)) +
geom_line(color = "#b2d2a4", linewidth = 1) +
geom_point(color = "#167d7f", size = 3) +
theme_minimal() +
labs(title = "Quantidade de Resíduos por Dia da Semana",
x = "Dia da Semana",
y = "Quantidade Média de Resíduos (ton)")
5. Conclusão
Este relatório teve o intuito de elaborar uma análise exploratória sobre os dados referentes à coleta de resíduos na cidade do Recife, os quais também relacionam os tipos específicos de coletas que são feitos, as rotas e percurssos que são planejados, as datas e horas de execução da ativdade, entre outras informações.
Para realizar esse trabalho foram selecionadas duas bases de dados do
site Dados Abertos Recife para que, ao final, elas fossem unificadas em
um único dataset mais completo. Os dados possuem variáveis principais
como: ROTA_ID, PES_PESOUTIL,
TPVEICULO_DESC, PES_HRINI,
PES_HRFIM, PES_DATAINI e
PES_DATAFIM. Essas variáveis foram selecionadas para
levantar algumas informações que resultassem em identifação de
otimização do processo atual, além de outras colunas que foram sendo
melhor observadas durante o trabalho.
Alguns pontos de interesse, que ao final do projeto foram detectados,
tem a ver com as relações existentes entre as variáveis. A coluna chave
é PES_PESOUTIL e ao perceber isso conseguimos elaborar
insights que podem resultar no interesse de uma empresa ou instituição.
Tal coluna pode ser correlacionada com grande parte dos dados presentes
no dataset e, devido a isso, os insights mencionados na seção anterior,
podem se estender para aspectos transversais que não foram tratados
diretamente aqui.
Nesse contexto, um dos grandes pontos sobre a correlação é a possibilidade de utilizar a análise feita para ser treinada em modelos de IA. Com esse pensamento, utilizando dados históricos de pesagem e data/hora, é possível criar um modelo de previsão para estimar a quantidade de resíduos coletados em períodos futuros, o que auxilia a planejar rotas e alocar recursos de forma mais eficiente.
Por conseguinte, a fim de garantir clareza maior sobre os detalhes descritos, faz-se necessário uma análise aprofundada sobre o cenário da coleta de lixo em momentos atuais do ano de 2024, além de projetar a possibilidade de abranger o campo de estudo para outros municípios de Pernambuco.