library(tidyverse)
library(kableExtra)
library(lubridate)
library(ggforce)
library(here)
theme_set(theme_bw())
# SEMPRE read_csv NUNCA read.csv
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 < 2021)
Hoje iremos responder mais algumas das nossas perguntas acerca do clima de João Pessoa, Campina Grande e Patos, os quais usaremos para entender o da Paraíba. Isso por serem cidades localizadas em zonas bastante distintas (Litoral, Serra da borborema e Sertão, respectivamente). A grande diferença nessa análise é que iremos considerar também resumos dos nossos dados (médias, medianas, boxplots, …).
Para a análise climática, usaremos 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.
Para responder nossa primeira pergunta, iremos usar dados das chuvas de 2010 até 2020. Tanto por termos poucos dados em 2009, como só termos dados até a metade do ano em 2021. Com eles em mãos, vamos observar como as médias semanais de chuvas estão distribuidas nos meses desses últimos 10 anos, e também a distribuição das intensidades dessas chuvas.
Logo abaixo está a visualização dos últimos anos:
# Overwriting the month names from R
month.name <- c("Jan", "Fev", "Mar", "Abr", "Mai", "Jun",
"Jul", "Ago", "Set", "Out", "Nov", "Dez")
clima %>%
mutate(mes = factor(month.name[mes], level=rev(month.name))) %>%
ggplot(aes(x = mes, y = chuva, group = mes)) +
facet_wrap(~cidade) +
geom_boxplot(outlier.colour = NA, color = "darkgray") +
geom_jitter(alpha = 0.2, width = .2, aes(color = cidade)) +
labs(
y = "Chuva (mm)",
x = "Mês",
title = "Médias semanais de chuva por mês (2010 - 2020)"
) +
coord_flip()
Como podemos ver, JP tem as chuvas menos concentradas em meses específicos, historicamente falando, do que todas as outras cidades. Também é notável que JP apresenta uma maior variabilidade (faixa de valores maior) em praticamente todos os meses e é onde ocorre as chuvas mais extremas (a maior sendo de 398.9 mm), enquanto Patos e CG não ultrapassaram os 200mm semanais médios.
Olhando mais de perto o caso de Patos, as chuvas parecem estar mais concentradas nos primeiros 4 meses, decaindo rapidamente de frequência a posteriori. Mais especificamente, vemos que 90% das médias semanais de chuvas após abril, seja qual for o mês, não ultrapassa 29mm médios. E surpreendentemente em agosto e setembro dos últimos 10 anos não choveu em pelo menos 90% das suas semanas. Como vemos na tabela abaixo:
clima %>%
filter(cidade == "Patos", mes > 4) %>%
mutate(mes = factor(month.name[mes], level=month.name)) %>%
group_by(cidade, mes) %>%
summarize("90% dos valores ficam abaixo de" = sprintf(quantile(chuva, 0.90), fmt = '%#.2f mm')) %>%
rename("Cidade" = cidade, "Mês" = mes) %>%
kable() %>%
kable_styling(full_width = FALSE, position = "center", bootstrap_options = "striped") %>%
column_spec(1, bold = TRUE, border_right = TRUE, color = "black", background = "#1b788533")
| Cidade | Mês | 90% dos valores ficam abaixo de |
|---|---|---|
| Patos | Mai | 28.74 mm |
| Patos | Jun | 8.76 mm |
| Patos | Jul | 9.36 mm |
| Patos | Ago | 0.00 mm |
| Patos | Set | 0.00 mm |
| Patos | Out | 7.65 mm |
| Patos | Nov | 4.16 mm |
| Patos | Dez | 21.70 mm |
Visto isso, para complementar o raciocínio entender melhor a frequência dessas chuvas utilizaremos um histograma construído a partir dos dados (chuvas semanais médias) que usamos anteriormente.
clima %>%
ggplot(aes(x = chuva)) +
facet_wrap(~cidade, ncol = 3) +
geom_histogram(aes(fill = cidade), boundary = 0) +
geom_rug(alpha = 0.5, aes(color = cidade)) +
labs(
x = "Chuva (mm)",
y = "Frequência",
title = "Distribuição das chuvas (2010 - 2020)"
)
Como podemos ver, a cauda à direita de JP se prolonga mais que as outras cidades (demontrando mais chuvas intensas, apesar de frequência baixa). Enquanto também apresenta menos semanas de pouca chuva, em comparação com as outras cidades.
Quanto aos formatos das distribuições, todas são bem assimétricas e concentradas à esquerda, ou seja, semanas menos chuvosas são a regra (tem frequência maior) do que mais chuvosas (em níveis diferentes em cada cidade).
Após termos conseguido adquirir uma melhor ideia geral das chuvas, para responder a segunda pergunta usaremos as 20% maiores médias de chuvas de cada cidade com o objetivo de compará-las e caracterizá-las melhor através de um gráfico de pontos com essas medições:
clima %>%
mutate(mes = factor(month.name[mes], level=rev(month.name))) %>%
group_by(cidade) %>%
filter(chuva > quantile(chuva, 0.80)) %>%
ggplot(aes(x = mes, y = chuva, group = mes)) +
facet_wrap(~cidade) +
geom_boxplot(outlier.colour = NA, color = "darkgray") +
geom_jitter(alpha = 0.3, width = .2, aes(color = cidade)) +
labs(
y = "Chuva (mm)",
x = "Mês",
title = "Médias semanais de chuva por mês (2010 - 2020) - 20% maiores"
) +
coord_flip()
Como tinhamos observado antes com as chuvas no geral, JP possue a maior variação das chuvas, mas não só isso, também apresenta as maiores chuvas. Como esperávamos, Patos em agosto e setembro não tem nenhuma das suas maiores chuvas, enquanto 76.5% delas estão localizadas nos primeiros 4 meses do ano. E interessantemente, JP também não possue chuvas das mais fortes em outubro e novembro (o que também poderíamos ter previsto pelo nosso primeiro gráfico). Enquanto CG, tem observações que variam menos por mês e são menores.
Quanto à nossa terceira pergunta, uniremos o conhecimento que já temos com os nossos outros gráficos e agora queremos saber com que frequência as cidades passam sem chuva. E para isso, usaremos um gráfico que nos mostra exatamente isso (proporção de semanas naquele determinado mês em que choveu ou não):
clima %>%
mutate(choveu = ifelse(chuva != 0, "choveu", "não choveu")) %>%
group_by(cidade, mes, choveu) %>%
summarise(n = n()) %>%
mutate(perc = n*100/sum(n)) %>%
ggplot(aes(x = factor(month.name[mes], month.name), y = perc, fill = choveu, group=choveu)) +
facet_wrap(~cidade, ncol = 1) +
geom_col(position = position_stack(reverse = TRUE)) +
scale_fill_manual(values = c("dodgerblue", "gray")) +
labs(
x = "Mês",
y = "%",
title = "% de semanas em que choveu em determinado mês (2010-2020)",
fill = "Semanas em que:"
)
Como tinhamos visto antes, a maior parte das chuvas é de baixa intensidade, entretanto, apesar da intensidade se aproximar de zero, ainda é diferente, por isso a consideramos como chuva.
Tendo isso em mente, JP e CG raramente passam uma semana sem chuva, já que chuvas de baixa intensidade são comuns. Enquanto que em Patos a situação é um pouco diferente, é comum de julho até novembro ocorrerem semanas sem chuvas sendo registradas.
Em CG, mais especificamente, aparenta uma tendência de queda nos finais de ano, ainda apresentando chuvas em mais da metade das semanas. Já em JP há uma queda bem leve em outubro e novembro. Enquanto em Patos, além da brusca queda, dá para notar uma certa bimodalidade na frequência das chuvas e também na falta delas.
Agora estamos preocupados em distinguir os meses mais quentes dos mais frios. E para isso usaremos a temperatura média como o indicador. Todavia, não consideramos 2020 nessa análise, só 2010-2019, visto que há mais de 40 dados faltantes em Patos e isso pode comprometer a nossa avaliação.
Já o gráfico que escolhemos nos dará bastante informação. Ele é um sinaplot, que basicamente é um gráfico de pontos especial que nos dará indicativos da quantidade de medições, sua densidade, pontos extremos, etc. Os pontos vermelhos maiores no meio dele representam a média das médias semanais de temperatura.
sumarios <- clima_tudo %>%
filter(ano > 2009, ano < 2020) %>%
group_by(cidade, mes) %>%
summarise(temp_media_monthly = mean(temp_media, na.rm = TRUE),
temp_mediana_monthly = median(temp_media, na.rm = TRUE),
.groups = "drop")
clima %>%
filter(ano < 2019) %>%
mutate(mes = factor(month.name[mes], level=month.name)) %>%
ggplot(mapping = aes(x = mes, y = temp_media, group=mes)) +
facet_wrap(~cidade, ncol=3) +
geom_violin(alpha = .3, color="gray") +
geom_sina(alpha=0.3, color = "indianred1") +
geom_point(data = sumarios, aes(y = temp_media_monthly), color = "firebrick3", size = 3) +
labs(
x = "Mês",
y = "Temperatura média (ºC)",
title = "Temperaturas semanais médias por mês (2010 - 2019)"
)
Temos alguns poucos dados faltantes (três semanas em CG) - não presentes no INMET, mas temos medições o suficiente para interpretá-las. O que vemos principalmente é que parece existir uma tendência presente em todas as cidades de no começo e fim do ano serem mais quentes que no meio, ou seja, junho e julho se apresentam como os meses mais frios, enquanto o primeiro e terceiro trimestres aparecem como mais quentes.
Já para decidir a cidade com maior diferença entre meses, irei utilizar a diferença entre a maior média e a menor média, e como critério de desempate usarei a diferença entre as medianas. E o resultado está na tabela abaixo:
clima %>%
filter(!is.na(temp_media)) %>%
group_by(cidade, mes) %>%
summarize(mean = mean(temp_media), median = median(temp_media)) %>%
group_by(cidade) %>%
summarise(
mean_diff = round(max(mean) - min(mean), 2),
median_diff = round(max(median) - min(median), 2)
) %>%
rename("Diferença da média máxima e mínima" = mean_diff,
"Diferença da mediana máxima e mínima" = median_diff) %>%
kable() %>%
kable_styling(full_width = FALSE, position = "center", bootstrap_options = "striped") %>%
column_spec(1, bold = TRUE, border_right = TRUE, color = "black", background = "#1b788533")
| cidade | Diferença da média máxima e mínima | Diferença da mediana máxima e mínima |
|---|---|---|
| Campina Grande | 3.72 | 3.59 |
| João Pessoa | 3.18 | 3.14 |
| Patos | 4.24 | 4.12 |
Concluímos com isso que Patos tem os meses mais distintos em média e também mediana (valor que concentra 50% dos outros valores abaixo e acima dele). Com diferenças maiores do que 4ºC, o que já é bem considerável (lembrando que a distância entre os extremos é muito mais alta).
Para responder a primeira pergunta são utilizadas as umidades semanais médias dos anos de 2010 a 2019. O conjunto de médias é agrupado de acordo com cidade e mês. No gráfico são mostradas as médias de umidade nas semanas em pontos azuis, a concentração dos valores, que é indicada pelo contorno ao redor do conjunto de pontos de cada mês, e em vermelho a média de umidade mensal.
library(lubridate)
library(ggforce)
sumarios <- clima_tudo %>%
filter(ano > 2009, ano < 2020) %>%
group_by(cidade, mes) %>%
summarise(umidade_monthly = mean(umidade, na.rm = TRUE), .groups = "drop")
clima_tudo %>%
filter(ano > 2009, ano < 2020, !is.na(temp_media)) %>%
mutate(mes = factor(month.name[mes], level=month.name)) %>%
ggplot(mapping = aes(x = mes, y = umidade, group=mes)) +
facet_wrap(~cidade, ncol=3) +
geom_violin(alpha = .3, color="gray") +
geom_sina(alpha=0.3, color = "dodgerblue") +
geom_point(data = sumarios, aes(y = umidade_monthly), color = "indianred3", size = 2) +
labs(
x = "Mês",
y = "Umidade (%)",
title = "Umidades semanais médias por mês (2010 - 2019)"
)
É possível notar que o conjunto de valores de umidade para cada mês em João pessoa tem uma variação menor do que os conjuntos das outras cidades. E Campina Grande, além de ter uma variação total durante o ano maior que em João Pessoa, mostra um aumento da variação também nos primeiros e nos últimos meses, não apenas no meio do ano como ocorre em João Pessoa. Já em Patos se aparenta ter a maior variação, que se concentra principalmente nos meses iniciais. Existem 2 valores faltantes nas medições de Campina Grande e mais de 10 em Patos. Para averiguar de forma mais precisa em qual cidade a variação é de fato maior, vamos mostrar apenas a amplitude das médias de umidade para as cidades.
variacao = clima_tudo %>%
filter(ano > 2009, ano < 2020, !is.na(temp_media)) %>%
mutate(mes = factor(month.name[mes], level=month.name)) %>%
group_by(cidade, mes) %>%
summarise(amplitude = max(umidade, na.rm = TRUE) - min(umidade, na.rm = TRUE), .groups = "drop")
variacao %>%
ggplot(aes(x = mes, y = amplitude, color = cidade, group)) +
geom_point() +
geom_line(aes(group = cidade)) +
labs(
x = "Mês",
y = "Amplitude da Umidade",
title = "Amplitude das umidades semanais médias por mês (2010 - 2019)"
)
Com essa visualização final podemos ver mais claramente que Patos possui a maior variação da umidade por mês na maior parte do ano, sendo superada apenas por JP no mês de Junho e por CG nos meses de Agosto e Setembro. Nos demais meses a maior variação é em Patos, a segunda maior é em CG e a menor em JP.
O valor que calculamos para a porcentagem de chuvas que ocorreram nos primeiros 4 meses do ano em Patos foi:
# Chuvas no começo do ano em Patos
chuvasComecoAno <- nrow(clima %>%
group_by(cidade) %>%
filter(cidade == "Patos", mes %in% c(1, 2, 3, 4), chuva > quantile(chuva, 0.80)))
totalChuvas <- nrow(clima %>%
group_by(cidade) %>%
filter(cidade == "Patos", chuva > quantile(chuva, 0.80)))
chuvasComecoAno * 100 / totalChuvas
## [1] 76.52174