library(tidyverse)
library(here)
library(scales)
library(ggridges)
library(ggbeeswarm)
library(patchwork)
library(knitr)
theme_set(theme_bw())
cores <- c("Campina Grande" = "#2196F3", "João Pessoa" = "#F44336")
df <- read_csv(here::here("data/clima_cg_jp-semanal.csv"),
col_types = "cTdddddd")
resumo_geral <- df %>%
group_by(cidade) %>%
summarise(tmedia = mean(tmedia), tmax = mean(tmax), tmin = mean(tmin))
resumo_jf <- df %>%
filter(mes %in% c(1, 2)) %>%
group_by(cidade) %>%
summarise(tmedia = mean(tmedia), tmax = mean(tmax), tmin = mean(tmin))
kable(bind_rows(
mutate(resumo_geral, periodo = "Período completo"),
mutate(resumo_jf, periodo = "Jan–Fev")
) %>% select(periodo, everything()), digits = 2,
caption = "Temperatura média por cidade e período")
| periodo | cidade | tmedia | tmax | tmin |
|---|---|---|---|---|
| Período completo | Campina Grande | 24.69 | 30.32 | 19.33 |
| Período completo | João Pessoa | 27.65 | 30.67 | 22.50 |
| Jan–Fev | Campina Grande | 25.86 | 31.87 | 20.44 |
| Jan–Fev | João Pessoa | 28.65 | 31.51 | 23.58 |
p_box <- df %>%
mutate(periodo = if_else(mes %in% c(1, 2), "Jan–Fev", "Período completo")) %>%
ggplot(aes(x = cidade, y = tmedia, fill = cidade)) +
geom_boxplot(alpha = 0.6, coef = 1000, width = 0.4) +
facet_wrap(~periodo) +
scale_fill_manual(values = cores) +
labs(title = "Boxplot da temperatura média semanal",
x = NULL, y = "Temperatura média (°C)") +
theme(legend.position = "none")
p_dens <- df %>%
ggplot(aes(x = tmedia, fill = cidade)) +
geom_density(alpha = 0.45) +
geom_vline(data = resumo_geral, aes(xintercept = tmedia, color = cidade),
linetype = "dashed", linewidth = 0.9) +
scale_fill_manual(values = cores) +
scale_color_manual(values = c("Campina Grande" = "#1565C0",
"João Pessoa" = "#B71C1C")) +
labs(title = "Densidade da temperatura (período completo)",
x = "Temperatura média (°C)", y = "Densidade", fill = "Cidade") +
guides(color = "none") +
theme(legend.position = "bottom")
p_box + p_dens
Conclusão: João Pessoa é consistentemente mais quente que Campina Grande — tanto no período completo (27.7°C vs 24.7°C) quanto no pico do verão em jan/fev (28.7°C vs 25.9°C). A altitude de ~550 m de CG explica a diferença. A densidade evidencia que JP tem menor variabilidade — o calor é mais uniforme ao longo do ano.
resumo_mes <- df %>%
group_by(cidade, mes) %>%
summarise(tmedia = mean(tmedia), tmax = mean(tmax), tmin = mean(tmin),
.groups = "drop")
ggplot(resumo_mes, aes(x = mes, y = tmedia, color = cidade, group = cidade)) +
geom_ribbon(aes(ymin = tmin, ymax = tmax, fill = cidade),
alpha = 0.12, color = NA) +
geom_line(linewidth = 1.2) +
geom_point(size = 2.5) +
annotate("rect", xmin = 5.5, xmax = 6.5, ymin = -Inf, ymax = Inf,
alpha = 0.13, fill = "#FFD600") +
annotate("text", x = 6, y = Inf, label = "Juninas",
vjust = 1.8, size = 3.2, color = "#9A7000") +
scale_x_continuous(breaks = 1:12,
labels = c("Jan","Fev","Mar","Abr","Mai","Jun",
"Jul","Ago","Set","Out","Nov","Dez")) +
scale_color_manual(values = c("Campina Grande" = "#1565C0",
"João Pessoa" = "#B71C1C")) +
scale_fill_manual(values = cores) +
labs(title = "Sazonalidade da temperatura (banda = tmin–tmax médios)",
x = NULL, y = "Temperatura (°C)", color = "Cidade", fill = "Cidade") +
theme(legend.position = "bottom")
df %>%
mutate(mes_fct = fct_reorder(month(mes, label = TRUE, abbr = FALSE), mes)) %>%
ggplot(aes(x = tmedia, y = mes_fct, fill = cidade)) +
geom_density_ridges(alpha = 0.6, scale = 1.1, rel_min_height = 0.01) +
facet_wrap(~cidade) +
scale_fill_manual(values = cores) +
labs(title = "Distribuição da temperatura por mês",
x = "Temperatura média semanal (°C)", y = NULL) +
theme(legend.position = "none")
Conclusão: Os meses mais quentes são novembro a fevereiro e os mais frios julho e agosto em ambas as cidades. As festas juninas (junho) ocorrem na transição para o frio: CG registra ~22.8°C em junho — clima ameno que reforça a identidade cultural do evento — enquanto JP tem ~26.4°C, ainda quente, mas com noites mais frescas. O ridge plot evidencia que a variação sazonal é mais ampla em CG.
A distribuição de chuvas é muito mais assimétrica que a de temperaturas — com cauda longa à direita, típica de variáveis que acumulam zeros e eventos extremos.
resumo_chuva <- df %>%
group_by(cidade) %>%
summarise(
media = mean(chuva),
mediana = median(chuva),
dp = sd(chuva),
p90 = quantile(chuva, 0.90),
pct_sem_chuva = mean(chuva == 0) * 100
)
kable(resumo_chuva, digits = 2,
caption = "Estatísticas do volume de chuva semanal (mm)")
| cidade | media | mediana | dp | p90 | pct_sem_chuva |
|---|---|---|---|---|---|
| Campina Grande | 14.00 | 4.9 | 21.65 | 41.57 | 18.63 |
| João Pessoa | 32.65 | 14.1 | 44.47 | 92.50 | 6.43 |
# Histograma + densidade lado a lado para chuva e temperatura em CG
# (compara formas de distribuição: assimétrica vs. aproximadamente simétrica)
cg <- df %>% filter(cidade == "Campina Grande")
p_h_ch <- cg %>%
ggplot(aes(x = chuva)) +
geom_histogram(binwidth = 10, color = "#1565C0", fill = "#1565C0") +
labs(title = "Chuva — CG", x = "Chuva (mm)", y = "Contagem")
p_h_tm <- cg %>%
ggplot(aes(x = tmedia)) +
geom_histogram(binwidth = 0.5, color = "#F6511D", fill = "#F6511D") +
labs(title = "Temperatura — CG", x = "Temperatura média (°C)", y = "Contagem")
p_h_ch + p_h_tm
# Comparação entre cidades: distribuição da chuva com pontos individuais
p_qr <- df %>%
ggplot(aes(x = cidade, y = chuva, color = cidade)) +
geom_quasirandom(alpha = 0.35, size = 0.8) +
scale_color_manual(values = c("Campina Grande" = "#1565C0",
"João Pessoa" = "#B71C1C")) +
labs(title = "Distribuição individual da chuva semanal",
x = NULL, y = "Chuva (mm)") +
theme(legend.position = "none")
p_saz <- df %>%
group_by(cidade, mes) %>%
summarise(chuva = mean(chuva), .groups = "drop") %>%
ggplot(aes(x = mes, y = chuva, fill = cidade)) +
geom_col(position = "dodge", alpha = 0.85) +
scale_x_continuous(breaks = 1:12,
labels = c("Jan","Fev","Mar","Abr","Mai","Jun",
"Jul","Ago","Set","Out","Nov","Dez")) +
scale_fill_manual(values = cores) +
labs(title = "Chuva média semanal por mês",
x = NULL, y = "mm/semana", fill = "Cidade") +
theme(legend.position = "bottom")
p_qr + p_saz
Conclusão: A distribuição das chuvas é fortemente assimétrica à direita — ao contrário da temperatura, que é aproximadamente simétrica. A maioria das semanas é seca (~19% em CG e ~6% em JP), mas eventos intensos puxam a média bem acima da mediana. JP chove mais (32.6 mm/semana) do que CG (14 mm/semana) pela influência costeira. O gráfico de pontos individuais deixa clara a concentração em zero e a presença de outliers extremos em ambas as cidades.
df_lag <- df %>%
arrange(cidade, semana) %>%
group_by(cidade) %>%
mutate(tmedia_ant = lag(tmedia)) %>%
filter(!is.na(tmedia_ant)) %>%
ungroup()
cor_lag <- df_lag %>%
group_by(cidade) %>%
summarise(pearson = cor(tmedia, tmedia_ant),
spearman = cor(tmedia, tmedia_ant, method = "spearman"))
kable(cor_lag, digits = 3,
caption = "Correlação entre temperatura desta semana e da semana anterior")
| cidade | pearson | spearman |
|---|---|---|
| Campina Grande | 0.880 | 0.856 |
| João Pessoa | 0.859 | 0.860 |
p_sc <- ggplot(df_lag, aes(x = tmedia_ant, y = tmedia, color = cidade)) +
geom_point(alpha = 0.2, size = 0.9) +
geom_smooth(method = "lm", se = TRUE, linewidth = 1.2) +
facet_wrap(~cidade, scales = "free") +
scale_color_manual(values = c("Campina Grande" = "#1565C0",
"João Pessoa" = "#B71C1C")) +
labs(title = "Temperatura desta semana vs. semana anterior",
x = "Temperatura anterior (°C)", y = "Temperatura atual (°C)") +
theme(legend.position = "none")
acf_df <- df %>%
arrange(cidade, semana) %>%
group_by(cidade) %>%
reframe(
lag = 1:8,
acf_value = map_dbl(1:8, ~ cor(tmedia[(.x + 1):n()],
tmedia[1:(n() - .x)],
use = "complete.obs"))
)
p_acf <- ggplot(acf_df, aes(x = lag, y = acf_value, fill = cidade)) +
geom_col(alpha = 0.8) +
geom_hline(yintercept = 0) +
facet_wrap(~cidade) +
scale_fill_manual(values = cores) +
scale_x_continuous(breaks = 1:8) +
labs(title = "Autocorrelação da temperatura (lags 1–8 semanas)",
x = "Lag (semanas)", y = "Correlação") +
theme(legend.position = "none")
p_sc / p_acf
Conclusão: A autocorrelação entre semanas consecutivas é forte em ambas as cidades (Pearson: CG = 0.88, JP = 0.86), indicando que a temperatura muda gradualmente ao longo do tempo. O gráfico de ACF mostra que essa memória persiste por até 5–6 semanas. JP tem correlação ligeiramente superior, reflexo da inércia térmica do oceano que amorte variações bruscas.
df_chuva <- df %>% filter(chuva > 0)
cor_tc <- df_chuva %>%
group_by(cidade) %>%
summarise(pearson = cor(tmedia, chuva),
spearman = cor(tmedia, chuva, method = "spearman"))
kable(cor_tc, digits = 3,
caption = "Correlação entre temperatura e chuva (semanas com chuva > 0)")
| cidade | pearson | spearman |
|---|---|---|
| Campina Grande | -0.335 | -0.448 |
| João Pessoa | -0.424 | -0.459 |
p_sc5 <- ggplot(df_chuva, aes(x = tmedia, y = chuva, color = cidade)) +
geom_point(alpha = 0.25, size = 1) +
geom_rug(alpha = 0.1) +
geom_smooth(method = "lm", se = TRUE, linewidth = 1.2) +
scale_y_log10(labels = label_number()) +
facet_wrap(~cidade, scales = "free_y") +
scale_color_manual(values = c("Campina Grande" = "#1565C0",
"João Pessoa" = "#B71C1C")) +
labs(title = "Temperatura vs. chuva — semanas chuvosas (log Y)",
x = "Temperatura média (°C)", y = "Chuva (mm, log)") +
theme(legend.position = "none")
p_bx5 <- df_chuva %>%
group_by(cidade) %>%
mutate(faixa = cut(tmedia,
breaks = quantile(tmedia, c(0, .25, .5, .75, 1),
na.rm = TRUE),
labels = c("Q1\nfrio","Q2","Q3","Q4\nquente"),
include.lowest = TRUE)) %>%
ggplot(aes(x = faixa, y = chuva, fill = cidade)) +
geom_boxplot(alpha = 0.6, coef = 1000, outlier.size = 0.8) +
scale_y_log10(labels = label_number()) +
scale_fill_manual(values = cores) +
facet_wrap(~cidade) +
labs(title = "Chuva por quartil de temperatura (log Y)",
x = "Quartil de temperatura", y = "Chuva (mm, log)") +
theme(legend.position = "none")
p_sc5 / p_bx5
Conclusão: A relação temperatura–chuva é
negativa em ambas as cidades (CG: -0.34, JP: -0.42):
semanas chuvosas tendem a ser mais frias. Isso é fisicamente esperado —
nebulosidade e sistemas frontais reduzem a insolação. O efeito é mais
forte em CG, onde as chuvas se concentram nos meses mais frios
(mar–jul). O geom_rug() no scatter evidencia a concentração
de pontos nas temperaturas médias típicas de cada cidade, e o boxplot
por quartis confirma que os maiores volumes de chuva ocorrem nas semanas
mais frias.