William Amorim

5 minutos de leitura

Neste post, vamos analisar a série do monóxido de carbono (CO), de 2008 a 2018, na cidade de São Paulo.

O que precisamos saber sobre o CO?

  • O CO é um gás sem cor, sem cheiro, insípido, inflamável e tóxico para humanos, animais e plantas.

  • A exposição ao CO pode causar dor de cabeça, tontura, fraqueza, náusea e, em altas concentrações, desorientação, coma e morte por asfixia.

  • Segundo a CETESB, cerca de 97% do CO liberado na atmosfera em São Paulo é gerada por emissões veiculares.

Entre as estações da CETESB que medem a concentração horária de CO, selecionamos para essa análise aquelas com informação de janeiro de 2008 a maio de 2018. Ao total, foram 10 estações, cuja localidade está apresentada no mapa a seguir:


Dados

Os dados dessa análise foram extraídos do sistema Qualar, como discutido neste post.

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.

Para carregar os dados, rodamos os seguintes comandos.

df_carbon <- read_rds("data/df-carbon-2008-2018.rds")
station_coord <- readxl::read_excel("utils/cetesb_station_geoposition.xlsx")

EDA

Como temos dados de 10 estações, para facilitar a análise, focaremos inicialmente na estação de Pinheiros, que, pela localização (próxima à marginal Pinheiros), é uma boa representante da circulação de veículos na cidade de São Paulo.

No gráfico a seguir, apresentamos a média da concentração de CO em cada hora do dia, separado por dia da semana. Podemos observar que:

  • durante a semana, há dois picos de CO durante o dia, um de manhã, ~7h às ~11h, e outro à noite, ~18h à ~0h, períodos de maior congestionamento na cidade;

  • nos fins de semana, os picos da noite são mais acentuados, sendo que no domingo nem mesmo existe um pico pela manhã;

  • em média, os níveis máximos de CO parecem estar por volta de 1.2 ppm (partes por milhão) em todos os dias da semana.

df_carbon %>%
  filter(stationname == "Pinheiros") %>% 
  group_by(dayofweek, hour) %>% 
  summarise(co_mass_conc = mean(co_mass_conc)) %>% 
  ggplot(aes(x = hour, y = co_mass_conc)) +
  geom_line() +
  facet_wrap(~dayofweek, nrow = 2) +
  theme_bw() +
  labs(x = "Hora", y = "CO (ppm)") +
  scale_x_continuous(breaks = c(1, 6, 11, 16, 21, 24))

Vamos agora considerar apenas os picos matinais, excluindo os fins de semana. A série horária da estação de Pinheiros está apresentada abaixo. Pela curva suavizada, observamos que a concentração de CO está diminuindo levemente ao longo dos anos. Isso é explicado pela redução das emissões veiculares devido a novas tecnologias (como motores menos poluentes) e leis de proteção ambiental que obrigam os fabricantes a cumprir com padrões de emissões estabelecidos pelo governo (Variations of Carbon Monoxide Concentrations in the Megacity of São Paulo from 2000 to 2015 in Different Time Scales).

df_carbon %>%
  filter(
    stationname == "Pinheiros", 
    !dayofweek %in% c("sáb","dom"),
    hour %in% 7:11
  ) %>%
  group_by(date) %>% 
  summarise(co_mass_conc = mean(co_mass_conc)) %>% 
  ggplot(aes(x = date, y = co_mass_conc)) +
  geom_line() +
  geom_smooth() +
  theme_bw() +
  labs(x = "Ano", y = "CO (ppm)")

A seguir, apresentamos a distribuição da concentração de CO na estação de Pinheiros para cada mês do ano. Observamos que os meses mais frios e secos, de maio a setembro, apresentam maior variabilidade e maior concentração em valores altos do que o restante do ano.

df_carbon %>%
  filter(
    stationname == "Pinheiros",
    !dayofweek %in% c("sáb","dom"),
    hour %in% 7:11
  ) %>%
  group_by(date) %>% 
  summarise(co_mass_conc = mean(co_mass_conc, na.rm = TRUE)) %>%
  mutate(month = lubridate::month(date, label = TRUE),
         month = forcats::fct_rev(as.factor(month)),
         co_mass_conc = co_mass_conc + 1) %>% 
  ggplot(aes(x = co_mass_conc, y = month)) +
  geom_density_ridges(aes(fill = month), show.legend = FALSE) +
  xlim(0.3, 5) +
  theme_bw() +
  labs(x = "CO (ppm)", y = "Mês")

Avaliando agora as outras estações, podemos observar que o padrão encontrado no gráfico da série da estação Pinheiros parece ser o mesmo na maioria dos casos.

df_carbon %>%
  filter(
    !stationname %in% c("IPEN-USP", "Pinheiros"),
    !dayofweek %in% c("sáb","dom"),
    hour %in% 7:11
  ) %>%
  group_by(stationname, date) %>% 
  summarise(co_mass_conc = mean(co_mass_conc)) %>%
  filter(co_mass_conc < 10, co_mass_conc > 0) %>% 
  ggplot(aes(x = date, y = co_mass_conc)) +
  geom_line() +
  geom_smooth() +
  facet_wrap(~stationname, scales = "free_y", nrow = 3) +
  theme_bw() +
  labs(x = "Ano", y = "CO (ppm)") +
  scale_x_date(date_breaks = "3 years", date_labels = "%Y")

Pela distribuição das concentrações de cada estação, Osasco apresenta a maior variabilidade e, em média, níveis mais elevados de CO.

df_carbon %>%
  filter(
    !dayofweek %in% c("sáb","dom"),
    !stationname %in% c("IPEN-USP"),
    hour %in% 7:11
  ) %>%
  mutate(
    co_mass_conc = co_mass_conc + 1,
    stationname = forcats::fct_rev(as.factor(stationname))
  ) %>%
  ggplot(aes(x = co_mass_conc, y = stationname)) +
  geom_density_ridges(aes(fill = stationname), show.legend = FALSE) +
  xlim(0.8, 5.5) +
  theme_bw() +
  labs(x = "CO (ppm)", y = "Mês")

As médias anuais por estação ratificam essa informação. Congonhas está em segundo lugar, como estação com maiores médias anuais. Também podemos observar como as médias anuais diminuem ao longo dos anos.

df_carbon %>%
  filter(
    !dayofweek %in% c("sáb","dom"),
    hour %in% 7:11
  ) %>%
  mutate(year = lubridate::year(date)) %>% 
  group_by(stationname, year) %>% 
  summarise(co_mass_conc = mean(co_mass_conc, na.rm = TRUE)) %>%
  ggplot(aes(x = stationname, y = co_mass_conc)) +
  geom_bar(aes(fill = stationname), stat = "identity") +
  facet_wrap(~year) +
  theme_bw() +
  labs(y = "CO (ppm)", fill = "Estações") +
  scale_x_discrete(breaks = element_blank()) +
  theme(legend.position = "bottom", axis.title.x = element_blank())

Por fim, apresentamos um mapa de calor da concentração de CO para os dados de 2018, sendo que as regiões mais quentes são aquelas com maior concentração média ao longo do ano.

df_carbon %>%
  filter(
    !dayofweek %in% c("sáb","dom"),
    hour %in% 7:11,
    lubridate::year(date) == 2018
  ) %>%
  group_by(stationname) %>% 
  summarise(co_mass_conc = mean(co_mass_conc, na.rm = TRUE)) %>% 
  left_join(station_coord, by = "stationname") %>% 
  leaflet() %>%
  addProviderTiles(providers$CartoDB.Positron) %>%
  leaflet.extras::addHeatmap(
    lng = ~long, 
    lat = ~lat, 
    intensity = ~co_mass_conc,
    blur = 30,
    radius = 30
  )


comments powered by Disqus