A poluição do ar durante a greve dos caminhoneiros

Com a greve dos caminhoneiros no final do mês de maio, muitas cidades tiveram uma redução atípica no tráfego de caminhões e, posteriormente, com a falta de combustível, de veículos em geral.

Como as emissões veiculares são a principal fonte de diversos poluentes em centros urbanos, faz todo o sentido analisarmos o impacto das paralisações nos níveis de poluição.

Neste post, vamos analisar descritivamente as concentrações de alguns poluentes um pouco antes, durante e um pouco depois da greve dos caminhoneiros.

Como aperitivo, veja a variação dos poluentes durante as paralisações:

pollutant Ibirapuera Osasco Parque D.Pedro II Pinheiros
CO (manhã) -48.02% -32.78% -51.16% -65.9%
CO (noite) -61.18% -50.81% -60.77% -62.96%
MP10 NaN% -19.1% -19.06% -20.06%
MP2.5 -10.26% -21.08% -20.98% -21.13%
NO -89.66% -50.9% -75.38% -83.09%
NO2 -42.49% -13.24% -38.73% -39.45%
O3 53.7% NaN% 68.43% 126%

Contextualizando

A greve dos caminhoneiros foi como ficou conhecida a paralisação de caminhoneiros autônomos em todo o território nacional em maio de 2018. As manifestações começaram no dia 21 de maio e duraram até o início de junho. Nesse período, muitas cidades sofreram com desabastecimento, principalmente de combustível.

Nesta análise, eu foquei a observação entre o dias 23 e 30 de maio, período em que as consequências da greve foram mais intensos. Os poluentes considerados foram:

  • Monóxido de carbono (CO), gás tóxico que pode causar dor de cabeça, tontura, náusea e, em altas concentrações, desorientação e morte por asfixia. Segundo a CETESB, 97% do CO liberado em São Paulo vem de emissões veiculares.

  • Ozônio (O3), na estratosfera, faz papel de herói, filtrando parte da radiação solar (camada de ozônio). Na troposfera, camada mais baixa da atmosfera, faz papel de vilão, sendo associado a diversas doenças respiratórias e cardiovasculares. Não é gerado diretamente pela queima de combustíveis, mas sim por reações químicas atmosféricas que envolvem diversos compostos e radiação solar.

  • Monóxido de nitrogênio (NO) e dióxido de nitrogênio (NO2), gases tóxicos que contribuem para a formação de chuva ácida e do ozônio troposférico. Estão associados a diversos problemas respiratórios, como enfisema pulmonar e bronquite.

  • Material particulado 2.5 (MP2.5) e material particulado 10 (MP10), partículas suspensas no ar com diâmetro menor que 2.5 \(\mu\)m (MP2.5) ou entre 2.5 e 10 \(\mu\)m (MP10). Estão associadas a diversas doenças respiratórias e câncer de pulmão.

As concentrações de cada poluente foram medidas em estações de monitoramento da CETESB. Considerei quatro estações na Grande São Paulo: Osasco, Pinheiros, Parque Dom Pedro II e Ibirapuera. O critério para a escolha foi a disponibilidade de dados para os poluentes escolhidos e o perfil do tráfego de veículos na região das estações. As estações Parque Dom Pedro II e Pinheiros ficam em regiões de tráfego intenso, a primeira no centro da cidade e a segunda próxima à marginal Pinheiros. A estação de Osasco também fica numa região de tráfego intenso e relativamente próxima a duas rodovias. A estação Ibirapuera não é muito afetada pelo tráfego pois fica dentro do Parque Ibirapuera e será utilizada como comparação.

A localização de cada uma delas está representada no mapa a seguir:


Como são muitos gráficos e tabelas, vou apresentar apenas alguns resultados aqui no post. O restante está disponível nesse flexdashboard.

Dados

Os dados desta análise foram extraídos do sistema Qualar, como discutido neste post. O período considerado foi 01/05/2018 a 14/06/2018. Também considerei esse mesmo período nos anos de 2016 e 2017 para pode comparar o comportamento dos poluentes com e sem a greve de caminhoneiros.

O código utilizado pode ser acessado aqui. Repare que, para facilitar o acompanhamento do processo, as requisições foram feitas separadamente para cada estação/ano, pois requisições com um volume muito grande de dados demoravam muito para serem concluídas. Após todos os arquivos serem baixados, os dados foram consolidados em uma única base, que pode ser acessada neste link.

Funções usadas para gerar os gráficos

Dado um poluente, um ano e um conjunto de horas, a função abaixo devolve um plot com os gráficos da série temporal das quatro estações, utilizando a média diária do poluente nas horas especificadas.

make_series_plot <- function(df, pollutant, year_, hours) {
  
  if(year_ == 2018) {
    p_lab <- labs(x = "Dia", y = pollutant)
  } else {
    p_lab <- labs(x = "", y = pollutant)
  }
  
  df %>% 
    filter(
      hour %in% hours
    ) %>% 
    group_by(date, stationname) %>%
    select(y = pollutant, everything()) %>% 
    summarise(conc = mean(y, na.rm = TRUE)) %>% 
    ungroup() %>% 
    mutate(year = lubridate::year(date)) %>%
    filter(year == year_) %>% 
    ggplot(aes(x = date, y = conc)) +
    geom_line() +
    geom_vline(
      xintercept = lubridate::dmy(paste0("23-05-", year_)),
      linetype = 2,
      color = "red"
    ) +
    geom_vline(
      xintercept = lubridate::dmy(paste0("30-05-", year_)),
      linetype = 2,
      color = "red"
    ) +
    facet_grid(year ~ stationname, scales = "free_y") +
    theme_bw() +
    scale_x_date(
      labels = scales::date_format("%d-%m"),
      breaks = c(
        lubridate::dmy(paste0("01-05-", year_)), 
        lubridate::dmy(paste0("01-06-", year_))
      ),
      date_breaks = "1 month"
    ) +
    p_lab
  
}

A função make_grid_plot() aplica a função acima e junta os gráficos dos três anos considerados.

make_grid_plot <- function(df, pollutant, hours) {
  
  map(
    2016:2018, 
    make_series_plot,
    df = df,
    pollutant = pollutant,
    hours = hours
  ) %>% 
    patchwork::wrap_plots(nrow = 3) %>% 
    print()
  
}

A função make_bar_plot() faz um gráfico de barras para a média dos poluentes para cada estação em diferentes períodos (antes, durante e após a greve).

make_bar_plot <- function(df, pollutant_, hours) {
  
  df %>% 
    mutate(period = case_when(
      date > dmy("09-05-2018") & date < dmy("16-05-2018") ~ 1,
      date > dmy("23-05-2018") & date < dmy("30-05-2018") ~ 2,
      date > dmy("06-06-2018") & date < dmy("14-06-2018") ~ 3,
      TRUE ~ 0
    )) %>%
    filter(period != 0) %>% 
    gather(pollutant, conc, CO:O3) %>% 
    group_by(pollutant, stationname, period) %>%
    filter(hour %in% hours, pollutant == pollutant_) %>% 
    summarise(conc = mean(conc, na.rm = TRUE)) %>%
    ggplot(aes(x = stationname, y = conc, fill = as.factor(period))) +
    geom_bar(stat = "identity", position = "dodge") +
    labs(y = pollutant_, fill = "Período", x = "Estação") +
    scale_fill_discrete(
      labels = c("09/05 a 16/05", "23/05 a 30/05",  "06/06 a 14/06")
    ) +
    theme(legend.position = "bottom")
}

Resultados

Para construir as séries, eu usei o gráfico abaixo para avaliar a média horária de cada poluente em cada dia da semana. Assim, em vez de usar as séries horárias, que, em geral, apresentam sazonalidade diária, eu usei contruí as séries da média diária nos horários de pico. O gráfico mostra, por exemplo, que os picos de CO acontecem de manhã e no começo da noite e que os níveis desse poluente são bem menores nos fins de semana.

df %>%
  group_by(dayofweek, hour) %>% 
  summarise_at(vars(CO:O3), funs(mean), na.rm = TRUE) %>%
  gather(polluent, conc, CO:O3) %>% 
  ggplot(aes(x = hour, y = conc)) +
  geom_line() +
  facet_grid(polluent ~ dayofweek, scales = "free_y") +
  theme_bw() +
  labs(x = "Hora", y = "Concentração")

Usando então a função make_grid_plot() e as informações do gráfico acima, podemos construir e analisar as séries de cada poluente. Nos gráficos abaixo, o intervalo entre as retas pontilhadas representa o período de greve.

O gráfico abaixo mostra as séries do monóxido de carbono (CO), utilizando a média diária das 7 às 11 horas. Os fins de semana foram retirados da amostra.

df %>% 
  filter(!dayofweek %in% c("sáb","dom")) %>% 
  make_grid_plot("CO", 7:11)

Agora, o gráfico do monóxido de nitrogênio (NO), também com média diária das 7 às 11 horas. Os domingos foram retirados da amostra.

df %>% 
  filter(!dayofweek %in% c("dom")) %>% 
  make_grid_plot("NO", 7:11)

E o gráfico do ozônio, com média diária das 12 às 17 horas. Osasco foi retirada pois não há dados de ozônio nessa estação.

df %>%
  filter(!stationname == "Osasco") %>% 
  make_grid_plot("O3", 12:17)

O gráfico abaixo apresenta a média das médias diárias de CO (das 7h às 11h) em um período anterior (09/05 a 16/05), durante (23/05 a 30/05) e em um período posterior à greve (06/06 a 14/06). Os três períodos têm o mesmo número de dias da semana e fins de semana.

make_bar_plot(df, "CO", 7:11)

Como comentei anteriormente, os gráficos restantes podem ser visualizados neste dashboard.

Por fim, eu juntei os períodos anterior (09/05 a 16/05) e posterior (06/06 a 14/06), calculei a média dos poluentes nesses dias e comparei com a média durante o período de greve. A variação dos poluentes para cada estação está apresentada na tabela abaixo. O CO pela manhã, por exemplo, diminuiu 58.62% em Pinheiros durante a greve, enquanto o ozônio aumentou 111.75%.

tab
pollutant Ibirapuera Osasco Parque D.Pedro II Pinheiros
CO (manhã) -48.02% -32.78% -51.16% -65.9%
CO (noite) -61.18% -50.81% -60.77% -62.96%
MP10 NaN% -19.1% -19.06% -20.06%
MP2.5 -10.26% -21.08% -20.98% -21.13%
NO -89.66% -50.9% -75.38% -83.09%
NO2 -42.49% -13.24% -38.73% -39.45%
O3 53.7% NaN% 68.43% 126%

Comentários

  • Com exceção do ozônio, a concentração média dos poluentes durante o período de paralisação diminuiu. A maior redução foi a de NO, que é diretamente produzido pela queima de combustíveis, principalmente gasolina e diesel. A greve não parece ter influenciado muito nos níveis de MP2.5.

  • O ozônio não é produzido diretamente pela combustão de combustíveis. Ele é produto de um complexo processo químico que ocorre ao longo do dia, envolvendo diversos compostos e a radiação solar. O aumento da concentração de ozônio durante a greve era esperada, pois o NO emitido pela queima de diesel e gasolina reage com o O3 troposférico, diminuindo a sua concentração ao longo da tarde. Como o NO diminuiu por causa do menor tráfego de veículos, o nível de ozônio foi maior durante a greve. Para mais detalhes sobre esse fenômeno, veja este post.

  • Esta análise só considera o período de greve e variáveis de calendário para explicar a variação da concentração dos poluentes. Uma análise mais completa deveria considerar também os efeitos climáticos (temperatura, precipitação, vento, radiação, entre outros). As conclusões aqui supõem que esses fatores se mantiveram homogêneos durante o período analisado, o que pode não ser razoável.

Tem sugestões? Alguma crítica? Está carente? Deixe seu comentário abaixo. :)

comments powered by Disqus