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:

  1. Pesagens de Resíduos
  2. Rotas de Coletas

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.