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")

Q1: Qual cidade é mais quente?

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")
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.


Q2: Meses mais quentes e mais frios — e as festas juninas

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.


Q3: Volume de chuvas por semana

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)")
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.


Q4: Relação entre temperatura de semanas consecutivas

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")
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.


Q5: Relação entre temperatura e chuva nas semanas chuvosas

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)")
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.