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…

Q1: Qual a cidade é mais quente?

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


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

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.


Q3: Volume de chuvas por semana

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


Q4: Relação entre temperatura de semanas consecutivas

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


Q5: Relação entre temperatura e chuva nas semanas em que choveu

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