Exploração climática da Paraíba - Correlações
library(tidyverse)
library(viridis)
library(kableExtra)
library(gganimate)
library(ggridges)
library(here)
theme_set(theme_bw())
clima_tudo = read_csv(
here("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()
)
)
clima <- clima_tudo %>%
filter(ano > 2009, ano < 2020) %>%
mutate(temp_anterior = lag(temp_media, n = 1),
diff = temp_media - lag(temp_media, n = 1)) %>%
filter(!is.na(temp_media), !is.na(temp_anterior))Hoje seguiremos a nossa série de descobertas sobre o clima da Paraíba a partir do tempo em João Pessoa, Campina Grande e Patos. Nosso foco será tentar entender as relações entre diferentes aspectos do tempo nessas cidades (como a chuva se relaciona com a temperatura e como a temperatura média de uma semana se relaciona com a da próxima).
Para a análise climática, continuaremos usando dados de estações convencionais do instituto nacional de meteorologia (INMET). Os quais são compostos por 1803 medições no grão de semanas (601 por cidade) do final de 2009 até junho de 2021, e incluem velocidades média e máximas dos ventos, temperaturas mínimas, médias e máximas, umidade e chuva.
Como a temperatura média de uma semana se relaciona com a da próxima ?
Primeiro, estamos interessados em entender as relações (se existirem) entre os pares de temperaturas médias adjacentes, nas três cidades. De antemão, acredito ser razoável pensarmos que ela existe, pois não deve haver muita diferença entre as duas.
E para confirmamos ou não nossa suspeita, como também quantificá-la, vamos tanto observar um gráfico de pontos entre a temperatura média de uma semana e da imediatamente posterior, quanto um índice de correlação. Serão analisadas as temperaturas média de 2010 até 2019 por serem os anos com dados mais completos nas três cidades.
clima %>%
ggplot(aes(x = temp_media, y = temp_anterior)) +
facet_wrap(~cidade) +
geom_point(alpha = 0.4, aes(color = cidade), size = 2) +
labs(
x = "Temperatura média (ºC)",
y = "Temperatura média anterior (ºC)",
title = "Relação entre temperaturas médias de semanas adjacentes",
subtitle = "Semana posterior x Semana anterior"
) +
scale_color_viridis(discrete=TRUE, option = "D")Como suspeitávamos, as mudanças aparentemente são pequenas entre os pares, e consequentemente temos uma nuvem de pontos concentrada numa reta. O que nos diz que há uma relação linear positiva entre as temperaturas (aumento na temperatura média de uma semana normalmente acompanha aumento na temperatura da semana posterior). Com poucos pontos extremos, como um que ocorreu em Campina Grande, onde em uma semana marcou cerca de 28ºC, enquanto na anterior havia marcado menos de 25ºC.
E já que sabemos que se trata de uma relação linear e existem poucos pontos extremos (muito diferentes dos demais), podemos tentar quantificar a correlação entre essas variáveis a partir do método de Pearson. Basicamente, uma medida que nos mostrará a intensidade e natureza da relação entre elas, negativa ou positiva. Quanto mais próxima de 1, mais forte é a relação linear positiva; 0 indica não relação e -1 uma relação linear forte negativa.
Nesse contexto de relações lineares, negativa significa que enquanto o valor de uma variável aumenta, a outra diminui ou vice-versa. Enquanto na positiva, se uma variável aumenta ou diminui a outra também diminui ou aumenta.
Aqui estão os valores para as três cidades:
clima %>%
group_by(cidade) %>%
summarise(correlacoes = cor(temp_media, temp_anterior)) %>%
rename("Correlação de Pearson" = correlacoes,
"Cidade" = cidade) %>%
kable() %>%
kable_paper(full_width = FALSE, position = "center")| Cidade | Correlação de Pearson |
|---|---|
| Campina Grande | 0.8524486 |
| João Pessoa | 0.8283237 |
| Patos | 0.8226250 |
Essa tabela indica que há uma correlação linear forte e positiva em todas as cidades. Isto é, aumentos ou diminuições nas temperaturas médias de uma semana geralmente acompanham o aumento ou diminuição de temperatura da próxima semana. Sendo que em Campina Grande a relação é a mais forte.
Todavia, não sabemos da magnitude dessas diferenças em temperaturas e nem como ela varia, apesar de ser algo bastante interessante de se observar. Para isso, usaremos uma visualização da frequência dessas diferenças do ano de 2010 até 2019 ao mesmo tempo que vemos um gráfico animado mostrando a distribuição anual.
clima %>%
group_by(cidade) %>%
ggplot(aes(x = diff)) +
geom_density(aes(fill = cidade), alpha = 0.4) +
scale_fill_viridis(discrete=TRUE, option = "D") +
labs(
title = "Diferença de temperatura entre semanas adjacentes (2010 - 2019)",
subtitle = "Diferença x Densidade",
x = "Diferença entre a média atual e da semana anterior",
y = "Densidade"
)clima %>%
group_by(cidade) %>%
ggplot(aes(x = diff)) +
geom_density(aes(fill = cidade), alpha = 0.4) +
scale_fill_viridis(discrete=TRUE, option = "D") +
labs(
title = "Diferença de temperatura entre semanas adjacentes",
subtitle = "Ano: {closest_state}",
x = "Diferença entre a média atual e da semana anterior",
y = "Densidade"
) +
transition_states(ano, transition_length = 3, state_length = 1) +
ease_aes('linear')Pelo que dá para ver no primeiro gráfico, historicamente falando, não há grande diferença de temperatura média entre os pares de semana, sendo a maioria bem próxima de 0. Vemos ainda que essa frequência de baixas diferenças é maior em JP, logo depois em CG e por fim Patos que tem as semanas com diferenças mais altas (menos concentrada em 0 e com caudas maiores, as quais indicam mais semanas com diferenças substanciais).
Por outro lado, vemos na animação que essa ordem nem sempre corresponde a realidade. Patos geralmente teve semanas consecutivas mais diferentes, com caudas maiores, mas nem sempre a distância entre as cidades é tão grande (como podemos ver em 2019). Enquanto que JP nem sempre apresenta o maior número de semanas com pouca diferença, por exemplo, CG teve as diferenças baixas mais concentradas em 2011 e 2018.
É também interessante visualizar algumas medidas desses dados acumulados:
clima %>%
group_by(cidade) %>%
summarize("Média " = round(mean(diff[diff < 0]), 2),
"Mediana " = round(median(diff[diff < 0]), 2),
"Desvio Padrão " = round(sd(diff[diff < 0]), 2),
"10th percentil" = round(quantile(diff, 0.1), 2),
"Média " = round(mean(diff[diff > 0]), 2),
"Mediana " = round(median(diff[diff > 0]), 2),
"Desvio Padrão " = round(sd(diff[diff > 0]), 2),
"90th percentil " = round(quantile(diff, 0.9), 2)) %>%
rename("Cidade" = cidade) %>%
kable() %>%
kable_paper(full_width = FALSE, position = "center") %>%
add_header_above(header = c(" " = 1,
"Semanas em que esfria" = 4,
"Semanas em que esquenta" = 4)) %>%
add_header_above(header = c("Diferenças entre a semana atual e anterior" = 9))|
Diferenças entre a semana atual e anterior
|
||||||||
|---|---|---|---|---|---|---|---|---|
|
Semanas em que esfria
|
Semanas em que esquenta
|
|||||||
| Cidade | Média | Mediana | Desvio Padrão | 10th percentil | Média | Mediana | Desvio Padrão | 90th percentil |
| Campina Grande | -0.64 | -0.49 | 0.54 | -0.98 | 0.61 | 0.52 | 0.53 | 0.94 |
| João Pessoa | -0.55 | -0.42 | 0.51 | -0.87 | 0.48 | 0.35 | 0.43 | 0.75 |
| Patos | -0.79 | -0.58 | 0.66 | -1.25 | 0.70 | 0.56 | 0.55 | 1.20 |
Omitimos a média e mediana globais, porque são bem próximas de 0 (visto que temos um gráfico relativamente simétrico em torno de 0). Mas nas semanas em que esfria (em comparação a semana anterior) vemos que em média se diminui em torno de 0.6 graus em CG e JP, enquanto em Patos vemos 0.8, o que é um cenário parecido nas que esquenta, com Patos ainda apresentando aumento maior. Patos também apresenta as maiores variações de temperatura (como já tinhamos visto), outras conclusões são que CG e JP tiveram variações próximas quando esfria, enquanto Patos e CG tem variações maiores e mais semelhantes quando esquenta.
Qual a relação entre temperatura e chuvas nas semanas em que choveu nas 3 cidades ?
Agora queremos analisar as relações entre as temperaturas e chuvas nas semanas em que choveu. E para isso continuaremos usando um gráfico de pontos das chuvas e temperaturas, entretanto ele não nos mostraria uma relação linear (mais fácil de se lidar). Como forma de remediar isso, podemos modificar a escala das chuvas para uma logarítmica de base 10 (que diminui a distância entre valores que, de outra maneira, estariam mais longes uns dos outros):
clima %>%
filter(chuva != 0) %>%
ggplot(aes(x = temp_media, y = log10(chuva))) +
facet_wrap(~cidade) +
geom_point(alpha = 0.4, aes(color = cidade), size = 3) +
labs(
x = "Temperatura média (ºC)",
y = "log(Chuvas (mm))",
title = "Relação entre chuvas e temperatura",
subtitle = "Temperatura média x log(chuvas)"
) +
scale_color_viridis(discrete=TRUE, option = "D")Aparentemente há uma relação linear fraca e negativa entre a temperatura e a chuva transformada, ou seja, chuvas exponencialmente mais baixas estão associadas a temperaturas maiores em certo grau, com exceção de Patos em que não parece haver inclinação. Por vermos uma tendência linear e praticamente não haver pontos extremos, podemos aplicar a correlação de Pearson:
clima %>%
filter(ano < 2020, !is.na(temp_media), chuva != 0) %>%
group_by(cidade) %>%
summarise(correlacoes = cor(temp_media, log(chuva), method = "pearson")) %>%
rename("Correlação" = correlacoes,
"Cidade" = cidade) %>%
kable() %>%
kable_paper(full_width = FALSE, position = "center")| Cidade | Correlação |
|---|---|
| Campina Grande | -0.4282364 |
| João Pessoa | -0.4601567 |
| Patos | -0.0718159 |
Como suspeitávamos é uma relação linear fraca-média negativa, enquanto em Patos é quase inexistente. Em JP sendo a mais forte. Entretanto, temos que lembrar que tivemos que transformar os dados da chuva, e se quisermos analisar se há relação sem essa preocupação podemos usar outro método além do de Pearson. Usando o de Spearman acontece que não há grande mudança, mas aqui está a tabela:
clima %>%
filter(ano < 2020, !is.na(temp_media), chuva != 0) %>%
group_by(cidade) %>%
summarise(correlacoes = cor(temp_media, chuva, method = "spearman")) %>%
rename("Correlação de Spearman" = correlacoes,
"Cidade" = cidade) %>%
kable() %>%
kable_paper(full_width = FALSE, position = "center")| Cidade | Correlação de Spearman |
|---|---|
| Campina Grande | -0.4231036 |
| João Pessoa | -0.4561390 |
| Patos | -0.0784050 |
Podemos ainda tentar visualizar a distribuição das temperaturas com base na intensidade das chuvas. E ver se realmente há tendência de diminuição delas quando aumentamos as chuvas:
# Inverse of quantile function
quantileInv <- function(dist, value) {
ecdf(dist)(value)
}
# Truncate to a certain decimal precision
# Ex: truncDec(3.14159, 3) = 3.141
truncDec <- function(number, precision) {
floor(number * 10^precision) / 10^precision
}
clima %>%
mutate(chuvaLevels = factor(truncDec(quantileInv(log10(chuva), log10(chuva)), 1) * 100)) %>%
group_by(cidade) %>%
ggplot(aes(x = temp_media, fill=..x.., y = "")) +
facet_wrap(~cidade) +
geom_density_ridges_gradient() +
scale_fill_viridis(option = "C") +
transition_states(chuvaLevels, transition_length = 3, state_length = 1) +
theme(plot.caption = element_text(hjust = 0)) +
labs(
title = "Relação entre intensidade da chuva e temperatura",
subtitle = "Intensidade da chuva: ~{closest_state}%",
caption = "A intensidade aproximada significa que estamos considerando chuvas que concentram desde
o percentil X até o percentil X+10 (não inclusivo). Ex: ~90% indica as chuvas que concentram
desde 90% até 99.99% das outras chuvas abaixo delas",
x = "Temperatura média (ºC)",
y = "Densidade"
)Obs: O gráfico começa de ~20%, porque existem muitas semanas sem chuva, e não mostra 100%, por existirem pouquíssimas chuvas com essa intensidade.
Pelo que parece, em Patos não há uma diminuição ou aumento claro, o que nós esperávamos pela correlação próxima de 0. Já em JP e CG é visível que a temperatura diminui com o aumento das chuvas.