O objetivo desta análise é entender, se houver, a correlação entre features climáticas - em especial, temperatura média e chuva - em cidades da Paraíba: Campina Grande (CG), João Pessoa (JP) e Patos (PT). Para tanto foram utilizados dados climáticos, dos anos de 2010 a 2019, agregados ao nível de semana.
clima_tudo <- read_csv(
here("l1p3/data/tempo-jp-cg-pt.csv"),
col_types = cols(
.default = col_double(),
cidade = col_character(),
semana = col_date(format = ""),
ano = col_integer(),
mes = col_integer()
)
) %>% filter(ano > 2009, ano < 2020)
Nesta seção queremos entender se existe autocorrelação na temperatura média de uma semana, para isso iremos avaliar a correlação entre a temperatura de uma semana e: a temperatura da semana anterior, a temperatura de oito semanas atrás e a de um ano atrás (52 semanas).
Para as análises que seguem dados faltantes decorrentes de falta de registros de temperatura e ou da inexistência de uma semana anterior (considerando o intervalo de tempo), serão removidos da visualização.
clima <- clima_tudo %>%
select(cidade, semana, ano, mes, temp_media) %>%
arrange(cidade, semana) %>%
mutate(temp_anterior = lag(temp_media, n = 1),
temp_anterior_2m = lag(temp_media, n = 8),
temp_anterior_1a = lag(temp_media, n = 52))
Comecemos avaliando a correlação com a semana anterior. É possível ver que as três cidades apresentam uma correlação linear positiva. E ainda que esta aparenta ser mais forte para a cidade Campina Grande, na qual vemos uma menor dispersão dos pontos e menor quantidade de pontos extremos.
clima %>%
filter(!is.na(temp_media), !is.na(temp_anterior)) %>%
ggplot(aes(y = temp_media, x = temp_anterior)) +
geom_point(alpha = .6) +
facet_wrap(~ cidade, ncol = 1, strip.position = "right", scales = "free") +
labs(
title = "Autocorrelação em dados de temperatura média para cidades da Paraíba",
subtitle = "Intervalo de 1 semana",
y = "Temperatura média (ºC)",
x = "Temperatura média anterior (ºC)"
)
Vejamos agora considerando os dados de oito semanas antes. É fácil de ver que, diferente do caso anterior, temos pouca ou nenhuma correlação entre as temperaturas. Isso é de se esperar, pois oito semanas é suficiente para mudar a estação do ano e por sua vez trazer mudanças de temperatura. Nas três cidades, é possível ver que para uma mesma temperatura anterior uma ampla faixa de temperaturas foi obtida na semana corrente, assim é esperado que os sumários de correlação indiquem uma correlação fraca.
clima %>%
filter(!is.na(temp_media), !is.na(temp_anterior_2m)) %>%
ggplot(aes(y = temp_media, x = temp_anterior_2m)) +
geom_point(alpha = .6) +
facet_wrap(~ cidade, ncol = 1, strip.position = "right", scales = "free") +
labs(
title = "Autocorrelação em dados de temperatura média para cidades da Paraíba",
subtitle = "Intervalo de 8 semanas",
y = "Temperatura média (ºC)",
x = "Temperatura média anterior (ºC)"
)
Por último, vejamos a autocorrelação com a temperatura do ano anterior. Aqui podemos novamente ver que existe uma correlação linear positiva, para as três cidades. Porém, em comparação com o que vimos nos gráficos comparando com a semana anterior, os pontos aqui são bem mais dispersos e temos mais pontos extremos.
Campina Grande mais uma vez se mostra como tendo a maior força na correlação ao ter uma menor dispersão que as demais. João Pessoa tem muitos pontos extremos para temperatura abaixo dos 25 ºC, um indicativo que os anos em que essas temperaturas foram atingidas foram atípicos, porém ao observamos as temperaturas acima de 26 ºC vemos que a correlação se torna mais forte. Já Patos aprensenta uma dispersão mais uniforme ao longo de todo o histórico, não havendo uma faixa a partir da qual a correlação se fortalece como a anterior, além disso seus pontos extremos são menos extremos que os de João Pessoa.
Essa correlação mais forte do que quando comparamos com oito semanas, também pode ser causada pelas estações do ano, uma vez que voltar um ano no tempo nos colocará na mesma estação, ou seja, em dias com temperaturas semelhantes as atuais.
clima %>%
filter(!is.na(temp_media), !is.na(temp_anterior_1a)) %>%
ggplot(aes(y = temp_media, x = temp_anterior_1a)) +
geom_point(alpha = .6) +
facet_wrap(~ cidade, ncol = 1, strip.position = "right", scales = "free") +
labs(
title = "Autocorrelação em dados de temperatura média para cidades da Paraíba",
subtitle = "Intervalo de 1 ano",
y = "Temperatura média (ºC)",
x = "Temperatura média anterior (ºC)"
)
Vejamos por fim, os valores de correlação sumarizados. A sumarização foi feita utilizando o Coeficiente de Pearson, dado que para a maioria dos casos tivemos uma correlação com formato linear. Pelos valores, podemos confirmar o que deduzimos pelos gráficos: Campina teve a correlação mais forte para uma semana e um ano, além disso as três cidades tiveram uma correlação fraca observando oito semanas atrás. Para o terceiro caso (um ano antes), vemos que a faixa mais forte em João Pessoa acabou levando-a a uma correlação maior que a de Patos.
clima %>%
pivot_longer(cols = starts_with("temp_anterior"), names_to = "time_span", values_to = "value") %>%
filter(!is.na(value), !is.na(temp_media)) %>%
group_by(cidade, time_span) %>%
summarise(pearson_cor = cor(temp_media, value, method = "pearson"), .groups = "drop") %>%
mutate(time_span = case_when(
time_span == "temp_anterior" ~ "1 semana",
time_span == "temp_anterior_2m" ~ "8 semanas",
time_span == "temp_anterior_1a" ~ "1 ano",
TRUE ~ ""
),
time_span = factor(time_span, levels = c("1 semana", "8 semanas", "1 ano"))) %>%
arrange(cidade, time_span) %>%
pivot_wider(names_from = "time_span", values_from = "pearson_cor") %>%
rename(Cidade = cidade) %>%
knitr::kable(caption = "Correlações obtidas com Coef. de Pearson", digits = 2)
| Cidade | 1 semana | 8 semanas | 1 ano |
|---|---|---|---|
| Campina Grande | 0.85 | 0.35 | 0.70 |
| João Pessoa | 0.83 | 0.36 | 0.61 |
| Patos | 0.82 | 0.31 | 0.60 |
Nesta segunda seção nos aprofundaremos nos dados de chuvas e iremos avaliar sua correlação com a temperatura média, assim como sua autocorrelação. Como semanas sem chuva são muito mais comuns que semanas com chuva, nessa análise iremos utilizar apenas as semanas em que choveu acima de 1 mm.
clima <- clima_tudo %>%
select(cidade, semana, ano, mes, temp_media, chuva) %>%
filter(across(where(is.double), function(x) !is.na(x)), chuva > 1)
Iniciemos com a observação da relação entre chuva e temperatura média. Vemos pelo gráfico abaixo que a distribuição de valores de chuva é muito concentrada em valores abaixo de 25 mm, percebemos daí que não há uma correlação linear entre essas variáveis. Porém vejamos o que acontece quando aplicamos uma transformação aos dados de chuva.
clima %>%
ggplot(aes(y = chuva, x = temp_media)) +
geom_point(alpha = .6) +
facet_wrap(~ cidade, ncol = 1, strip.position = "right", scales = "free") +
labs(title = "Gráfico de dispersão temperatura média por chuva em cidades da PB",
x = "Temperatura média (ºC)",
y = "Chuva (mm)")
Aplicamos uma transformação logarítmica sobre os dados de chuva, e com ela podemos ver que surge uma relação linear negativa com a temperatura. Entretanto, essa relação mostra-se fraca, em especial para a cidade de Patos em que temos a maior dispersão dos dados.
clima %>%
ggplot(aes(y = log10(chuva), x = temp_media)) +
geom_point(alpha = .6) +
scale_y_continuous(limits = c(0, 2.75)) +
facet_wrap(~ cidade, ncol = 1, strip.position = "right", scales = "free") +
labs(title = "Gráfico de dispersão temperatura média por chuva em cidades da PB",
x = "Temperatura média (ºC)",
y = "log10(Chuva (mm))")
Vejamos então o que os coeficientes de correlação podem nos dizer sobre estes dados. Para este caso iremos aplicar três coeficientes de correlação: o de Pearson (considerando o logaritmo da chuva) e os de Kendall e Spearman que são mais apropriados para correlação não-lineares como é o caso. Os dados abaixo confirmam o que observamos acima: a cidade de Patos apresenta quase nenhuma correlação, enquanto que que as demais cidades tem uma correlação indo de fraca a moderada. Temos também que a relação é negativa conforme observamos.
clima %>%
group_by(cidade) %>%
summarise(pearson_cor = cor(temp_media, log10(chuva), method = "pearson"),
kendall_cor = cor(temp_media, chuva, method = "kendall"),
spearman_cor = cor(temp_media, chuva, method = "spearman")) %>%
knitr::kable(col.names = c("Cidade", "Coef. Pearson", "Coef. Kendall", "Coef. Spearman"),
caption = "Correlação entre os dados de chuva e temperatura",
digits = 2)
| Cidade | Coef. Pearson | Coef. Kendall | Coef. Spearman |
|---|---|---|---|
| Campina Grande | -0.39 | -0.25 | -0.37 |
| João Pessoa | -0.44 | -0.28 | -0.42 |
| Patos | -0.09 | -0.06 | -0.09 |
Para finalizar, vejamos, se assim como a temperatura, a chuva apresenta alguma autocorrelação com a semana anterior. Entretanto, neste caso não iremos considerar a semana imediatamente anterior, mas a semana imediatamente anterior em que também choveu. Por razões similares as anteriores, transformações logarítmicas foram aplicadas em ambos os eixos.
Não é possível ver muita correlação para nenhuma das três cidades. Em todos os casos a dispersão dos pontos é muito grande.
clima %>%
mutate(chuva_anterior = lag(chuva, n = 1)) %>%
filter(!is.na(chuva), !is.na(chuva_anterior)) %>%
ggplot(aes(y = log10(chuva), x = log10(chuva_anterior))) +
geom_point(alpha = .6) +
facet_wrap(~ cidade, ncol = 1, strip.position = "right", scales = "free") +
labs(
title = "Autocorrelação em dados de chuva para cidades da Paraíba",
subtitle = "Considerando a última semana chuvosa",
y = "log10(Chuva (mm)) ",
x = "log10(Chuva anterior (mm)) "
)
Para concluir, vejamos o que os coeficientes de correlação nos dizem. Como não é possível identificar nenhum padrão linear, iremos desconsiderar o coeficiente de Pearson, pois seu resultado não poderia ser corretamente interpretado mesmo usando as transformações logarítmicas. Ambos os coeficientes confirmam o observado e nos mostram que a chuva diferentemente da temperatura não apresenta uma boa autocorrelação. Porém, temos que levar em conta que neste caso desconsideramos as semanas sem chuva, assim nossa afirmação se limita a afirmar que a última semana de chuva tem pouca correlação com a seguinte semana chuvosa.
clima %>%
mutate(chuva_anterior = lag(chuva, n = 1)) %>%
filter(!is.na(chuva),!is.na(chuva_anterior)) %>%
group_by(cidade) %>%
summarise(
kendall_cor = cor(chuva_anterior, chuva, method = "kendall"),
spearman_cor = cor(chuva_anterior, chuva, method = "spearman")
) %>%
knitr::kable(col.names = c("Cidade", "Coef. Kendall", "Coef. Spearman"),
caption = "Correlação entre os dados de chuva e temperatura",
digits = 2)
| Cidade | Coef. Kendall | Coef. Spearman |
|---|---|---|
| Campina Grande | 0.16 | 0.23 |
| João Pessoa | 0.25 | 0.37 |
| Patos | 0.15 | 0.22 |