library(tidyverse)
library(lubridate)
library(here)
library(scales)
library(ggridges)
library(patchwork)
library(knitr)df <- read_csv(
here::here("data/clima_cg_jp-semanal.csv"),
col_types = cols(
cidade = col_character(),
semana = col_datetime(),
tmedia = col_double(),
tmax = col_double(),
tmin = col_double(),
chuva = col_double(),
mes = col_integer(),
ano = col_integer()
)
) %>%
mutate(semana = as.Date(semana))
glimpse(df)## Rows: 2,748
## Columns: 8
## $ cidade <chr> "Campina Grande", "Campina Grande", "Campina Grande", "Campina …
## $ semana <date> 1992-12-27, 1993-01-03, 1993-01-10, 1993-01-31, 1993-02-07, 19…
## $ tmedia <dbl> 26.13333, 26.11905, 25.76667, 25.74000, 26.31429, 26.28571, 26.…
## $ tmax <dbl> 30.4, 32.4, 32.2, 32.0, 32.7, 32.7, 32.3, 32.3, 32.1, 31.2, 32.…
## $ tmin <dbl> 20.7, 19.3, 19.7, 19.9, 19.6, 20.0, 20.4, 21.2, 19.0, 19.0, 19.…
## $ chuva <dbl> 0.0, 0.0, 0.0, 0.4, 0.3, 0.0, 4.9, 0.0, 0.0, 6.1, 0.4, 1.2, 0.0…
## $ mes <int> 12, 1, 1, 1, 2, 2, 2, 2, 10, 11, 11, 11, 11, 12, 12, 12, 12, 1,…
## $ ano <int> 1992, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 199…
resumo_geral <- df %>%
group_by(cidade) %>%
summarise(
tmedia_media = mean(tmedia, na.rm = TRUE),
tmax_media = mean(tmax, na.rm = TRUE),
tmin_media = mean(tmin, na.rm = TRUE),
n = n()
)
kable(resumo_geral, digits = 2,
caption = "Temperatura média, máxima e mínima por cidade (período completo)")| cidade | tmedia_media | tmax_media | tmin_media | n |
|---|---|---|---|---|
| Campina Grande | 24.69 | 30.32 | 19.33 | 1224 |
| João Pessoa | 27.65 | 30.67 | 22.50 | 1524 |
p1a <- df %>%
ggplot(aes(x = tmedia, fill = cidade, color = cidade)) +
geom_density(alpha = 0.4, linewidth = 0.8) +
geom_vline(data = resumo_geral,
aes(xintercept = tmedia_media, color = cidade),
linetype = "dashed", linewidth = 1) +
scale_fill_manual(values = c("Campina Grande" = "#2196F3",
"João Pessoa" = "#F44336")) +
scale_color_manual(values = c("Campina Grande" = "#1565C0",
"João Pessoa" = "#B71C1C")) +
labs(title = "Distribuição da temperatura média semanal",
subtitle = "Linhas tracejadas = média histórica",
x = "Temperatura média (°C)", y = "Densidade",
fill = "Cidade", color = "Cidade") +
theme_minimal(base_size = 13) +
theme(legend.position = "bottom")
p1b <- df %>%
ggplot(aes(x = cidade, y = tmedia, fill = cidade)) +
geom_boxplot(alpha = 0.7, outlier.shape = 21, outlier.size = 1.5) +
scale_fill_manual(values = c("Campina Grande" = "#2196F3",
"João Pessoa" = "#F44336")) +
labs(title = "Boxplot da temperatura média semanal",
x = NULL, y = "Temperatura média (°C)") +
theme_minimal(base_size = 13) +
theme(legend.position = "none")
p1a + p1b +
plot_annotation(title = "Q1 — Comparação de temperatura entre as cidades (período completo)")resumo_jf <- df %>%
filter(mes %in% c(1, 2)) %>%
group_by(cidade) %>%
summarise(
tmedia_media = mean(tmedia, na.rm = TRUE),
tmax_media = mean(tmax, na.rm = TRUE),
tmin_media = mean(tmin, na.rm = TRUE),
n = n()
)
kable(resumo_jf, digits = 2,
caption = "Janeiro e fevereiro — temperatura média, máxima e mínima por cidade")| cidade | tmedia_media | tmax_media | tmin_media | n |
|---|---|---|---|---|
| Campina Grande | 25.86 | 31.87 | 20.44 | 217 |
| João Pessoa | 28.65 | 31.51 | 23.58 | 254 |
p1c <- df %>%
filter(mes %in% c(1, 2)) %>%
ggplot(aes(x = tmedia, fill = cidade, color = cidade)) +
geom_density(alpha = 0.4, linewidth = 0.8) +
geom_vline(data = resumo_jf,
aes(xintercept = tmedia_media, color = cidade),
linetype = "dashed", linewidth = 1) +
scale_fill_manual(values = c("Campina Grande" = "#2196F3",
"João Pessoa" = "#F44336")) +
scale_color_manual(values = c("Campina Grande" = "#1565C0",
"João Pessoa" = "#B71C1C")) +
labs(title = "Distribuição da temperatura — Jan/Fev (pico do verão)",
x = "Temperatura média (°C)", y = "Densidade",
fill = "Cidade", color = "Cidade") +
theme_minimal(base_size = 13) +
theme(legend.position = "bottom")
p1d <- df %>%
filter(mes %in% c(1, 2)) %>%
ggplot(aes(x = cidade, y = tmedia, fill = cidade)) +
geom_boxplot(alpha = 0.7, outlier.shape = 21, outlier.size = 1.5) +
scale_fill_manual(values = c("Campina Grande" = "#2196F3",
"João Pessoa" = "#F44336")) +
labs(title = "Boxplot — Jan/Fev",
x = NULL, y = "Temperatura média (°C)") +
theme_minimal(base_size = 13) +
theme(legend.position = "none")
p1c + p1d +
plot_annotation(title = "Q1 — Comparação de temperatura: Janeiro e Fevereiro")Conclusão Q1: Considerando o período completo, João Pessoa é a cidade mais quente, com temperatura média semanal de 27.7°C contra 24.7°C de Campina Grande. Essa diferença é explicada pela altitude de Campina Grande (~550 m) versus a posição costeira de João Pessoa, onde a influência oceânica eleva a temperatura média. No pico do verão (jan/fev), o padrão se mantém: João Pessoa permanece mais quente (28.7°C vs 25.9°C), com diferença ligeiramente maior, pois as noites são mais quentes no litoral nessa época. A densidade e o boxplot evidenciam que a distribuição de JP é deslocada para a direita e com menor variabilidade, indicando que o calor é mais constante ao longo do ano.
resumo_mes <- df %>%
group_by(cidade, mes) %>%
summarise(
tmedia_media = mean(tmedia, na.rm = TRUE),
tmax_media = mean(tmax, na.rm = TRUE),
tmin_media = mean(tmin, na.rm = TRUE),
.groups = "drop"
)ggplot(resumo_mes, aes(x = mes, y = tmedia_media,
color = cidade, group = cidade)) +
geom_ribbon(aes(ymin = tmin_media, ymax = tmax_media, fill = cidade),
alpha = 0.15, color = NA) +
geom_line(linewidth = 1.2) +
geom_point(size = 3) +
annotate("rect", xmin = 5.5, xmax = 6.5,
ymin = -Inf, ymax = Inf, alpha = 0.12, fill = "#FFD600") +
annotate("text", x = 6, y = Inf, label = "Jun\n(Juninas)",
vjust = 1.5, size = 3.5, color = "#B8860B") +
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 = c("Campina Grande" = "#2196F3",
"João Pessoa" = "#F44336")) +
labs(title = "Temperatura média mensal histórica (banda = intervalo tmin–tmax médios)",
x = "Mês", y = "Temperatura (°C)",
color = "Cidade", fill = "Cidade") +
theme_minimal(base_size = 13) +
theme(legend.position = "bottom")df_juninas <- df %>%
filter(mes == 6, ano >= 2015) %>%
group_by(cidade, ano) %>%
summarise(
tmedia_media = mean(tmedia, na.rm = TRUE),
.groups = "drop"
)
ggplot(df_juninas, aes(x = ano, y = tmedia_media,
color = cidade, group = cidade)) +
geom_line(linewidth = 1.1) +
geom_point(size = 3) +
geom_smooth(method = "lm", se = TRUE, alpha = 0.15, linewidth = 0.8) +
scale_color_manual(values = c("Campina Grande" = "#1565C0",
"João Pessoa" = "#B71C1C")) +
labs(title = "Temperatura média em junho (festas juninas) — últimos anos",
subtitle = "Linha de tendência linear com intervalo de confiança",
x = "Ano", y = "Temperatura média (°C)", color = "Cidade") +
theme_minimal(base_size = 13) +
theme(legend.position = "bottom")df %>%
mutate(mes_fct = fct_reorder(
factor(month(mes, label = TRUE, abbr = FALSE)), mes
)) %>%
ggplot(aes(x = tmedia, y = mes_fct, fill = cidade)) +
geom_density_ridges(alpha = 0.6, scale = 1.2, rel_min_height = 0.01) +
facet_wrap(~cidade) +
scale_fill_manual(values = c("Campina Grande" = "#2196F3",
"João Pessoa" = "#F44336")) +
labs(title = "Distribuição da temperatura média por mês (ridge plot)",
x = "Temperatura média semanal (°C)", y = NULL) +
theme_minimal(base_size = 12) +
theme(legend.position = "none")Conclusão Q2: Para ambas as cidades, os meses mais quentes são novembro a fevereiro (pico do verão austral) e os mais frios são julho e agosto (inverno). O gráfico de sazonalidade mostra uma curva bem definida, mais acentuada em Campina Grande pela maior continentalidade e altitude. As festas juninas (junho) ocorrem justamente na transição para o frio: em CG, junho registra temperatura média histórica de ~22.8°C, o que explica o clima ameno e a famosa “friagem” das festas; em JP, a média de junho é ~26.4°C — ainda quente, mas com noites mais frescas. A análise dos últimos anos revela que a temperatura de junho em ambas as cidades não apresenta tendência de aquecimento marcante, mantendo o padrão tradicional, especialmente o clima mais fresco de Campina Grande que é parte da identidade cultural do evento.
resumo_chuva <- df %>%
group_by(cidade) %>%
summarise(
media_semanal = mean(chuva, na.rm = TRUE),
mediana = median(chuva, na.rm = TRUE),
dp = sd(chuva, na.rm = TRUE),
p75 = quantile(chuva, 0.75, na.rm = TRUE),
p90 = quantile(chuva, 0.90, na.rm = TRUE),
prop_sem_chuva = mean(chuva == 0, na.rm = TRUE),
n = n()
)
kable(resumo_chuva, digits = 2,
caption = "Estatísticas do volume de chuva semanal por cidade")| cidade | media_semanal | mediana | dp | p75 | p90 | prop_sem_chuva | n |
|---|---|---|---|---|---|---|---|
| Campina Grande | 14.00 | 4.9 | 21.65 | 18.65 | 41.57 | 0.19 | 1224 |
| João Pessoa | 32.65 | 14.1 | 44.47 | 46.40 | 92.50 | 0.06 | 1524 |
p3a <- df %>%
ggplot(aes(x = chuva, fill = cidade)) +
geom_histogram(binwidth = 5, alpha = 0.7, position = "identity") +
scale_fill_manual(values = c("Campina Grande" = "#2196F3",
"João Pessoa" = "#F44336")) +
labs(title = "Todas as semanas (incluindo sem chuva)",
x = "Chuva (mm)", y = "Contagem", fill = "Cidade") +
theme_minimal(base_size = 12) +
theme(legend.position = "bottom")
p3b <- df %>%
filter(chuva > 0) %>%
ggplot(aes(x = chuva, fill = cidade)) +
geom_histogram(binwidth = 10, alpha = 0.7, position = "identity") +
scale_fill_manual(values = c("Campina Grande" = "#2196F3",
"João Pessoa" = "#F44336")) +
labs(title = "Apenas semanas chuvosas (chuva > 0)",
x = "Chuva (mm)", y = "Contagem", fill = "Cidade") +
theme_minimal(base_size = 12) +
theme(legend.position = "bottom")
p3a + p3b +
plot_annotation(title = "Q3 — Distribuição do volume semanal de chuvas")df %>%
filter(chuva > 0) %>%
ggplot(aes(x = chuva, color = cidade)) +
stat_ecdf(linewidth = 1.2) +
scale_color_manual(values = c("Campina Grande" = "#1565C0",
"João Pessoa" = "#B71C1C")) +
scale_x_log10(labels = label_number()) +
labs(title = "ECDF das chuvas semanais (semanas com chuva > 0, escala log)",
x = "Chuva (mm, log)", y = "Probabilidade acumulada",
color = "Cidade") +
theme_minimal(base_size = 13) +
theme(legend.position = "bottom")df %>%
group_by(cidade, mes) %>%
summarise(chuva_media = mean(chuva, na.rm = TRUE), .groups = "drop") %>%
ggplot(aes(x = mes, y = chuva_media, fill = cidade)) +
geom_col(position = "dodge", alpha = 0.8) +
scale_x_continuous(breaks = 1:12,
labels = c("Jan","Fev","Mar","Abr","Mai","Jun",
"Jul","Ago","Set","Out","Nov","Dez")) +
scale_fill_manual(values = c("Campina Grande" = "#2196F3",
"João Pessoa" = "#F44336")) +
labs(title = "Chuva média semanal por mês",
x = "Mês", y = "Chuva média (mm/semana)", fill = "Cidade") +
theme_minimal(base_size = 13) +
theme(legend.position = "bottom")Conclusão Q3: A distribuição das chuvas é fortemente assimétrica à direita em ambas as cidades — a maioria das semanas tem pouca ou nenhuma chuva, mas eventos extremos puxam a média acima da mediana. João Pessoa chove significativamente mais (32.6 mm/semana em média) do que Campina Grande (14 mm/semana), reflexo da proximidade do litoral e da maior umidade. A proporção de semanas sem chuva é elevada nas duas cidades (~19% em CG e ~6% em JP), caracterizando o regime semiárido/subúmido. A ECDF em escala log confirma que JP produz eventos chuvosos mais intensos com maior frequência. A análise sazonal revela que CG tem pico entre março e julho (quadra chuvosa do Nordeste interior), enquanto JP tem chuvas mais bem distribuídas, com pico deslocado para junho–agosto.
df_lag <- df %>%
arrange(cidade, semana) %>%
group_by(cidade) %>%
mutate(tmedia_lag1 = lag(tmedia, 1)) %>%
filter(!is.na(tmedia_lag1)) %>%
ungroup()
cor_lag <- df_lag %>%
group_by(cidade) %>%
summarise(
pearson = cor(tmedia, tmedia_lag1, use = "complete.obs"),
spearman = cor(tmedia, tmedia_lag1, method = "spearman",
use = "complete.obs"),
n = n()
)
kable(cor_lag, digits = 4,
caption = "Correlação entre temperatura desta semana e da semana anterior")| cidade | pearson | spearman | n |
|---|---|---|---|
| Campina Grande | 0.8802 | 0.8563 | 1223 |
| João Pessoa | 0.8594 | 0.8601 | 1523 |
ggplot(df_lag, aes(x = tmedia_lag1, y = tmedia, color = cidade)) +
geom_point(alpha = 0.25, size = 1.2) +
geom_smooth(method = "lm", se = TRUE, linewidth = 1.3) +
facet_wrap(~cidade, scales = "free") +
scale_color_manual(values = c("Campina Grande" = "#1565C0",
"João Pessoa" = "#B71C1C")) +
labs(title = "Q4 — Temperatura desta semana vs. temperatura da semana anterior",
x = "Temperatura média — semana anterior (°C)",
y = "Temperatura média — semana atual (°C)",
color = "Cidade") +
theme_minimal(base_size = 13) +
theme(legend.position = "none")# Função de autocorrelação manual para até 8 lags
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"))
)
ggplot(acf_df, aes(x = lag, y = acf_value, fill = cidade)) +
geom_col(alpha = 0.8) +
geom_hline(yintercept = 0, color = "black") +
facet_wrap(~cidade) +
scale_fill_manual(values = c("Campina Grande" = "#2196F3",
"João Pessoa" = "#F44336")) +
labs(title = "Autocorrelação da temperatura média semanal (lags 1 a 8 semanas)",
x = "Lag (semanas)", y = "Correlação", fill = "Cidade") +
theme_minimal(base_size = 13) +
theme(legend.position = "none")Conclusão Q4: Há uma forte autocorrelação positiva entre a temperatura de uma semana e a da semana seguinte. As correlações de Pearson são de 0.88 para Campina Grande e 0.86 para João Pessoa. Isso indica que a temperatura muda gradualmente de semana a semana — semanas quentes tendem a ser seguidas de semanas quentes, e vice-versa. Esse padrão é típico de séries climáticas com sazonalidade suave e inércia térmica. A correlação é ligeiramente maior em JP, onde a influência oceânica amorte mudanças bruscas. O gráfico de autocorrelação mostra que o efeito de memória persiste por várias semanas (até lag 4–6), confirmando que a estrutura temporal é relevante para ambas as cidades.
df_chuva <- df %>% filter(chuva > 0)
cor_tc <- df_chuva %>%
group_by(cidade) %>%
summarise(
pearson = cor(tmedia, chuva, use = "complete.obs"),
spearman = cor(tmedia, chuva, method = "spearman",
use = "complete.obs"),
n = n()
)
kable(cor_tc, digits = 4,
caption = "Correlação entre temperatura e chuva (semanas com chuva > 0)")| cidade | pearson | spearman | n |
|---|---|---|---|
| Campina Grande | -0.3355 | -0.4483 | 996 |
| João Pessoa | -0.4244 | -0.4593 | 1426 |
ggplot(df_chuva, aes(x = tmedia, y = chuva, color = cidade)) +
geom_point(alpha = 0.3, size = 1.5) +
geom_smooth(method = "lm", se = TRUE, linewidth = 1.2,
linetype = "solid") +
geom_smooth(method = "loess", se = FALSE, linewidth = 1,
linetype = "dashed", color = "gray40") +
facet_wrap(~cidade, scales = "free_y") +
scale_color_manual(values = c("Campina Grande" = "#1565C0",
"João Pessoa" = "#B71C1C")) +
labs(title = "Q5 — Temperatura vs. volume de chuva (semanas chuvosas)",
subtitle = "Linha sólida = regressão linear | Tracejada = LOESS",
x = "Temperatura média (°C)",
y = "Chuva semanal (mm)",
color = "Cidade") +
theme_minimal(base_size = 13) +
theme(legend.position = "none")ggplot(df_chuva, aes(x = tmedia, y = chuva, color = cidade)) +
geom_point(alpha = 0.3, size = 1.5) +
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 = "Q5 — Temperatura vs. volume de chuva (log no eixo Y)",
x = "Temperatura média (°C)",
y = "Chuva semanal (mm, log)",
color = "Cidade") +
theme_minimal(base_size = 13) +
theme(legend.position = "none")df_chuva %>%
group_by(cidade) %>%
mutate(
faixa_temp = cut(
tmedia,
breaks = quantile(tmedia, probs = c(0, .25, .5, .75, 1), na.rm = TRUE),
include.lowest = TRUE,
labels = c("Q1\n(mais frio)", "Q2", "Q3", "Q4\n(mais quente)")
)
) %>%
ggplot(aes(x = faixa_temp, y = chuva, fill = cidade)) +
geom_boxplot(alpha = 0.7, outlier.shape = 21, outlier.size = 1) +
scale_y_log10(labels = label_number()) +
scale_fill_manual(values = c("Campina Grande" = "#2196F3",
"João Pessoa" = "#F44336")) +
facet_wrap(~cidade) +
labs(title = "Volume de chuva por quartil de temperatura (semanas chuvosas, log Y)",
x = "Quartil de temperatura", y = "Chuva (mm, log)",
fill = "Cidade") +
theme_minimal(base_size = 12) +
theme(legend.position = "none")Conclusão Q5: A relação entre temperatura e chuva nas semanas chuvosas é negativa em ambas as cidades — mais forte em Campina Grande (Pearson ≈ -0.34) e mais suave em João Pessoa (≈ -0.42). Isso significa que semanas com maior volume de chuva tendem a ser mais frias, o que é fisicamente esperado: a precipitação está associada à nebulosidade e à entrada de sistemas frontais (frentes frias, ZCIT), que reduzem a insolação e a temperatura. Em CG, onde as chuvas se concentram nos meses mais frescos (mar–jul), a correlação negativa é mais marcante. Em JP, o efeito existe mas é atenuado pela distribuição mais uniforme das chuvas ao longo do ano. O boxplot por quartis de temperatura confirma essa tendência: os maiores volumes de chuva se concentram nas semanas mais frias, especialmente em Campina Grande, onde o contraste entre estação seca/quente e chuvosa/fria é mais acentuado. ```