William Amorim

6 minutos de leitura

Seguindo a análise do último post, vamos continuar estudando a sazonalidade da série de concentração do ozônio na cidade de São Paulo. Vamos utilizar dados de 2008 a 2013.

Os dados

Os dados originais utilizados neste post foram disponibilizados pelos autores do artigo Reduced ultrafine particle levels in São Paulo’s atmosphere during shifts from gasoline to ethanol use, que podem ser acessados pelo link https://goo.gl/9tNzvj. Utilizaremos aqui uma versão enxuta dessa base, disponível em aqui.

O código abaixo salva os dados no objeto df_O3.

df_O3 <- readr::read_rds("data/df_O3_2008_2013.rds")

Análise exploratória

A base tem informação de 12 estações medidoras de ozônio ao longo da Grande São Paulo. Vamos focar, inicialmente, na estação “Dom Pedro II”.

# A estação "Dom Pedro II" está codificada com id igual a 1.

library(magrittr)

df_DPII <- df_O3 %>%
  dplyr::filter(siteid == 1)

Vamos visualizar o gráfico da série:

library(ggplot2)

df_DPII %>% 
  ggplot(aes(x = date, y = o3_mass_conc)) +
  geom_line() +
  geom_smooth() +
  labs(x = "Year", y = expression(paste(O[3], " (", mu, "g/", m^3, ")"))) +
  theme_bw()

Pelo gráfico, podemos observar vários períodos sem informação. Também observamos indícios de sazonalidade anual, com concentrações mais altas no começo/fim de cada ano, provavelmente devido à maior incidência de luz solar.

Como temos dados horários, podemos analisar o comportamento da concentração ao longo do dia.

df_DPII %>% 
  dplyr::group_by(hour) %>% 
  dplyr::summarise(mean_O3 = mean(o3_mass_conc, na.rm = TRUE)) %>% 
  ggplot(aes(x = hour, y = mean_O3)) +
  geom_line() + 
  labs(x = "Hour", y = expression(paste("Average ozone", " (", mu, "g/", m^3, ")"))) +
  theme_bw()

Não temos medidas para as 6 horas da manhã pois é o horário de manutenção dos equipamentos. Pelo gráfico, observamos que o ozônio também apresenta sazonalidade diária, com pico, em geral, no meio da tarde, entre meio-dia e 17 horas.

df_DPII %>% 
  dplyr::group_by(hour) %>% 
  dplyr::summarise(mean_O3 = mean(o3_mass_conc, na.rm = TRUE)) %>% 
  ggplot(aes(x = hour, y = mean_O3)) +
  geom_line() +
  geom_vline(xintercept = 12, color = "blue", linetype = 2) +
  geom_vline(xintercept = 17, color = "blue", linetype = 2) +
  labs(x = "Hour", y = expression(paste("Average ozone", " (", mu, "g/", m^3, ")"))) +
  theme_bw()

Vamos pegar então a média diária dentro desse período para avaliar apenas o horário em que o ozônio está normalmente em alta.

df_tarde_DPII <- df_DPII %>% 
  dplyr::filter(hour %in% 12:16)

Refazendo o gráfico da série:

df_tarde_DPII %>%
  dplyr::group_by(date) %>%
  dplyr::summarise(o3_mass_conc = mean(o3_mass_conc, na.rm = TRUE)) %>% 
  ggplot(aes(x = date, y = o3_mass_conc)) +
  geom_line() +
  geom_smooth(se = FALSE) +
  labs(x = "Year", y = expression(paste(O[3], " (", mu, "g/", m^3, ")"))) +
  theme_bw()

Agora é mais fácil observar o padrão sazonal. Esse padrão parece ser diferente para 2009, mas provavelmente se deve à falta de informação no período.

Já vimos que a série de ozônio apresenta sazonalidade diária e anual. Vamos analisar agora as diferenças entre os dias da semana.

df_tarde_DPII %>%
  dplyr::group_by(dayofweek) %>%
  dplyr::summarise(`Average O3` = mean(o3_mass_conc, na.rm = TRUE),
                   `Std. Dev.` = sd(o3_mass_conc, na.rm = TRUE)) %>%
  dplyr::mutate_if(is.numeric, dplyr::funs(round), digits = 2) %>% 
  dplyr::mutate(dayofweek = forcats::lvls_revalue(factor(dayofweek), 
                                                  new_levels = readr::locale()[[1]][3]$day)) %>% 
  dplyr::rename(Day = dayofweek) %>% 
  knitr::kable(align = "c")
Day Average O3 Std. Dev.
Sunday 72.04 37.01
Monday 56.75 38.00
Tuesday 54.48 38.14
Wednesday 57.39 36.56
Thursday 55.83 36.88
Friday 58.23 38.42
Saturday 68.04 39.90
df_tarde_DPII %>%
  dplyr::group_by(date, dayofweek) %>% 
  dplyr::summarise(o3_mass_conc = mean(o3_mass_conc, na.rm = TRUE)) %>%
  dplyr::ungroup() %>% 
  dplyr::mutate(dayofweek = forcats::lvls_revalue(factor(dayofweek), 
                                                  new_levels = readr::locale()[[1]][3]$day)) %>% 
  ggplot(aes(x = as.factor(dayofweek), y = o3_mass_conc)) +
  geom_boxplot() + 
  labs(x = "Day", y = expression(paste("Average ozone", " (", mu, "g/", m^3, ")"))) +
  theme_bw()

As concentrações médias são maiores no fim de semana. Como a única variável ligada a formação de ozônio que varia durante a semana é o tráfego, é razoável supor que há um associação negativa entre ozônio e trânsito (considerando que o trânsito no fim de semana é consideravelmente menor do que durante a semana).

Também podemos analisar se esse padrão se repete quando comparamos dias úteis vs fim de semana e feriados.

df_tarde_DPII %>%
  dplyr::group_by(dv_weekday_regular) %>%
  dplyr::summarise(`Average O3` = mean(o3_mass_conc, na.rm = TRUE),
                   `Std. Dev.` = sd(o3_mass_conc, na.rm = TRUE)) %>%
  dplyr::mutate_if(is.numeric, dplyr::funs(round), digits = 2) %>% 
  dplyr::mutate(dv_weekday_regular = forcats::lvls_revalue(factor(dv_weekday_regular), 
                                                  new_levels = c("Not workday", "Workday"))) %>% 
  dplyr::rename(Day = dv_weekday_regular) %>% 
  knitr::kable(align = "c")
Day Average O3 Std. Dev.
Not workday 68.80 38.50
Workday 55.79 37.51
df_tarde_DPII %>%
  dplyr::group_by(date, dv_weekday_regular) %>% 
  dplyr::summarise(o3_mass_conc = mean(o3_mass_conc, na.rm = TRUE)) %>%
  dplyr::ungroup() %>%
  dplyr::mutate(dv_weekday_regular = forcats::lvls_revalue(factor(dv_weekday_regular), 
                                                  new_levels = c("Not workday", "Workday"))) %>% 
  ggplot(aes(x = as.factor(dv_weekday_regular), y = o3_mass_conc)) +
  geom_boxplot() + 
  labs(x = "Day", y = expression(paste("Average ozone", " (", mu, "g/", m^3, ")"))) +
  theme_bw()

Encontramos o mesmo padrão, reforçando a hipótese de que dias de menor tráfego veicular estão associados a maiores concentrações de ozônio.

Vamos avaliar agora se os padrões encontrados para a estação Dom Pedro II se repetem para as outras estações. Primeiro a sazonalidade diária:

df_O3 %<>%
    dplyr::mutate(stationname =  
           forcats::lvls_revalue(as.factor(siteid),
                        c("Dom Pedro II", "Santana", "Mooca", "Ibirapuera", 
                          "Nossa Senhora do O", "Sao Caetano", "Congonhas", 
                          "Cerqueira Cesar",
                          "Diadema", "Santo Andre", 
                          "Maua", "Pinheiros", 
                          "Parelheiros", "IPEN"))) %>% 
  dplyr::filter(siteid %in% c(1, 2, 3, 5, 6, 7, 15, 18, 22, 27, 29, 31)) 

df_O3 %>%
  dplyr::group_by(stationname, hour) %>%
  dplyr::summarise(o3_mass_conc = mean(o3_mass_conc, na.rm = TRUE)) %>% 
  ggplot(aes(x = hour, y = o3_mass_conc)) +
  facet_wrap(~stationname) +
  geom_line() +
  labs(x = "Hour", y = expression(paste("Average concentration", 
                                        " (", mu, "g/", m^3, ")"))) +
  theme_bw()

A diferença entre dias úteis e feriados/fins de semanas:

df_O3 %>%
  dplyr::group_by(stationname, dv_weekday_regular) %>%
  dplyr::summarise(o3_mass_conc = mean(o3_mass_conc, na.rm = TRUE)) %>% 
  dplyr::ungroup() %>%
  dplyr::mutate(dv_weekday_regular = forcats::lvls_revalue(factor(dv_weekday_regular), 
                                                  new_levels = c("Not workday", "Workday"))) %>%
  ggplot(aes(x = dv_weekday_regular, y = o3_mass_conc, fill = dv_weekday_regular)) +
  facet_wrap(~stationname) +
  geom_bar(stat = "identity") +
  labs(fill = "Day", y = expression(paste("Average ozone", " (", mu, "g/", m^3, ")")),
       x = "") +
  theme_bw() +
  theme(legend.position = "bottom", axis.text.x = element_blank(), 
        axis.ticks.x = element_blank())

E a sazonalidade anual:

df_O3 %>%
  dplyr::filter(hour %in% 12:16) %>%
  dplyr::group_by(stationname, date) %>%
  dplyr::summarise(o3_mass_conc = mean(o3_mass_conc, na.rm = TRUE)) %>%
  ggplot(aes(x = date, y = o3_mass_conc)) +
  facet_wrap(~stationname) +
  geom_line() +
  geom_smooth(se = FALSE) +
  labs(x = "Year", y = expression(paste("Average concentration", " (", mu, "g/", m^3, ")"))) +
  theme_bw()

Os padrões encontrados se repetem para as outra estações. Como já vimos no último post, a magnitude da concentração diária de ozônio de cada estação depende dos níveis de NO ao pela manhã.

Nos próximo posts, vamos associar a série de ozônio com séries climáticas e de tráfego veicular.

Conclusões

  • O ozônio apresenta sazonalidade anual, semanal e diária.

  • As concentrações de ozônio são maiores nos meses quentes.

  • Os picos de ozônio em cada dia ocorrem entre 12h e 17h.

  • Dias de menor tráfego veicular parecem estar associados a maiores concentrações de ozônio.

Referência

Salvo et al. (2017). “Reduced ultrafine particle levels in São Paulo’s atmosphere during shifts from gasoline to ethanol use”. Nature communications 8:77.

comments powered by Disqus