Lab 02 - FPCC 2

Com base no arquivo de dados (no diretório data) responda as questões abaixo, gerando um relatório final com as respostas. Cada resposta deve gerar tabelas e/ou gráficos para apresentar os resultados obtidos, além de uma justificativa para a escolha de métricas, estatísticas e visualizações. Vocês podem se basear no arquivo R Markdown gerado em sala (no diretório reports). O relatório final deve ser adicionado ao repositório do seu lab (por exemplo, um arquivo PDF).

library(tidyverse)
## ── Attaching core tidyverse packages ──────────────────────── tidyverse 2.0.0 ──
## ✔ dplyr     1.1.4     ✔ readr     2.1.5
## ✔ forcats   1.0.0     ✔ stringr   1.5.1
## ✔ ggplot2   3.5.0     ✔ tibble    3.2.1
## ✔ lubridate 1.9.3     ✔ tidyr     1.3.1
## ✔ purrr     1.0.2     
## ── Conflicts ────────────────────────────────────────── tidyverse_conflicts() ──
## ✖ dplyr::filter() masks stats::filter()
## ✖ dplyr::lag()    masks stats::lag()
## ℹ Use the conflicted package (<http://conflicted.r-lib.org/>) to force all conflicts to become errors
library(here)
## here() starts at C:/Users/s701257454/Documents/Mestrado/FPCC2/Lab 02/fpcc2-lab-2-matheusarauj
library(lubridate)
library(ggbeeswarm)
theme_set(theme_bw())

climas = read_csv(here::here("data/clima_cg_jp-semanal.csv"), 
                  col_types = "cTdddddd")

glimpse(climas)
## Rows: 2,748
## Columns: 8
## $ cidade <chr> "Campina Grande", "Campina Grande", "Campina Grande", "Campina …
## $ semana <dttm> 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    <dbl> 12, 1, 1, 1, 2, 2, 2, 2, 10, 11, 11, 11, 11, 12, 12, 12, 12, 1,…
## $ ano    <dbl> 1992, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 199…
climas = climas %>% 
    mutate(temp_anterior = lag(tmedia, n = 1))

agrupa_resultados_por_cidade <- function(dff) {
    dpr <- dff %>% 
        group_by(cidade) %>% 
        summarise(mens_media = mean(tmedia),
                  mens_median = median(tmedia))
    
    return(dpr)
}

filtra_climas_por_temporada <- function (dff, conjunto) {
    dpr <- filter(dff, mes %in% conjunto)
    return(dpr)
}

monta_grafico_por_cidade <- function(dff) {
    dpr <- ggplot(dff, aes(reorder(cidade, mens_media), mens_media, fill=cidade)) + 
        geom_bar(stat = 'identity') + 
        geom_point(aes(y=mens_median)) + 
        theme_bw() + 
        theme(legend.position = "none") + 
        xlab('Região') + ylab('Temperatura média') +
        labs(title = "Temperatura média e mediana por região")
    
    return(dpr)
}

monta_boxplot_por_cidade <- function(dados, categoria, valor_numerico, categoria1, categoria2, tituloy, reducao = 0.5) {
    # Criar o gráfico de boxplot
    p <- ggplot(dados, aes_string(x = categoria, y = valor_numerico, fill = categoria)) +
        geom_boxplot(width = reducao) +
        labs(x = "Cidade", y = tituloy, fill = categoria) +
        scale_fill_manual(values = c("Campina Grande" = "lightblue", "João Pessoa" = "lightgreen")) +
        theme_minimal()
    
    return(p)
}

monta_boxplot_por_mes <- function(dados, categoria, valor_numerico, reducao = 0.5) {
    dados[[categoria]] <- factor(dados[[categoria]], levels = c("Janeiro", "Fevereiro", "Março", "Abril", "Maio", "Junho",
                                                      "Julho", "Agosto", "Setembro", "Outubro", "Novembro", "Dezembro"))
    
    cores <- c("#FBB4AE", "#FDCDAC", "#FED9A6", "#FFFFCC", "#F2F2F2", "#E5D8BD", 
               "#CCEBC5", "#B3E2CD", "#B3CDE3", "#CBD5E8", "#CBD0E8", "#DECBE4")
    
    
    # Criar o gráfico de boxplot
    p <- ggplot(dados, aes_string(x = categoria, y = valor_numerico, fill = categoria)) +
        geom_boxplot(width = reducao) +
        labs(x = "Mês", y = "Temperatura (°C)", fill = categoria) +
        scale_fill_manual(values =  cores) +
        guides(fill = "none") +
        theme_minimal() +
        theme(axis.text.x = element_text(angle = 45, hjust = 1))
    
    return(p)
}

adiciona_coluna_nome_mes <- function(dff) {
    dpr <- dff %>%
        mutate(nome_mes = case_when(
            mes %in% c("1") ~ "Janeiro",
            mes %in% c("2") ~ "Fevereiro",
            mes %in% c("3") ~ "Março",
            mes %in% c("4") ~ "Abril",
            mes %in% c("5") ~ "Maio",
            mes %in% c("6") ~ "Junho",
            mes %in% c("7") ~ "Julho",
            mes %in% c("8") ~ "Agosto",
            mes %in% c("9") ~ "Setembro",
            mes %in% c("10") ~ "Outubro",
            mes %in% c("11") ~ "Novembro",
            mes %in% c("12") ~ "Dezembro"
        ))
    return(dpr)
}

monta_grafico_linha <- function(dff) {
    dpr <- ggplot(dff, aes(x = semana, y = chuva, color = cidade)) +
        geom_line() +
        labs(x = "", y = "Chuva (mm)", title = "Índice Pluviométrico por Cidade") +
        theme_minimal() +
        theme(legend.position = "top") + # Posição da legenda
        guides(color = guide_legend(title = NULL))
    
    return(dpr)
}

filtra_climas_por_ano <- function (dff, conjunto) {
    dpr <- filter(dff, ano %in% conjunto)
    return(dpr)
}

monta_grafico_correlacao <- function(dff) {
    dpr <- ggplot(dff, aes(x = temp_anterior, y = tmedia)) +
        geom_point() +
        geom_smooth(method = "lm", se = FALSE, color = "red") +
        labs(x = "Temperatura Semana Anterior (°C)", y = "Temperatura Semana Atual (°C)", title = "Correlação entre Temperatura Semana Atual e Temperatura Semana Anterior") +
        theme_minimal()
    
    return(dpr)
}

monta_grafico_correlacao_chuva_temp <- function(dff) {
    dpr <- ggplot(dff, aes(x = chuva, y = tmedia)) +
        geom_point() +
        geom_smooth(method = "lm", se = FALSE, color = "red") +
        labs(x = "Chuva (mm)", y = "Temperatura (°C)", title = "Correlação entre Chuva e Temperatura nas semanas em que choveu") +
        theme_minimal()
    
    return(dpr)
}

filtra_climas_por_cidade <- function (dff, conjunto) {
    dpr <- filter(dff, cidade %in% conjunto)
    return(dpr)
}

filtra_climas_por_chuva <- function (dff) {
    dpr <- filter(dff, chuva > 0.0)
    return(dpr)
}

Questão 01

Qual a cidade é mais quente? Isso muda se considerarmos apenas o período de janeiro e fevereiro (pico do verão)?

Considerando apenas temperaturas médias e medianas podemos observar os seguintes valores:

agrupamento_por_cidade <- agrupa_resultados_por_cidade(climas)

print(agrupamento_por_cidade)
## # A tibble: 2 × 3
##   cidade         mens_media mens_median
##   <chr>               <dbl>       <dbl>
## 1 Campina Grande       24.7        25.0
## 2 João Pessoa          27.7        27.8
print(monta_grafico_por_cidade(agrupamento_por_cidade))

Analisando uma distribuição mais precisa, e sem o viés de outliers, podemos observar os seguintes box-plots:

print(monta_boxplot_por_cidade(climas, "cidade", "tmedia", "João Pessoa", "Campina Grande", "Temperatura (°C)"))
## Warning: `aes_string()` was deprecated in ggplot2 3.0.0.
## ℹ Please use tidy evaluation idioms with `aes()`.
## ℹ See also `vignette("ggplot2-in-packages")` for more information.
## This warning is displayed once every 8 hours.
## Call `lifecycle::last_lifecycle_warnings()` to see where this warning was
## generated.

Com isso, podemos considerar que João Pessoa é a cidade mais quente.

Analisando agora apenas o pico de verão (Janeiro e Fevereiro):

climas_verao <- filtra_climas_por_temporada(climas, c("1", "2"))

agrupamento_por_cidade_verao <- agrupa_resultados_por_cidade(climas_verao)

print(agrupamento_por_cidade_verao)
## # A tibble: 2 × 3
##   cidade         mens_media mens_median
##   <chr>               <dbl>       <dbl>
## 1 Campina Grande       25.9        25.9
## 2 João Pessoa          28.7        28.7
print(monta_grafico_por_cidade(agrupamento_por_cidade_verao))

Novamente, sem o viés de outliers, podemos observar os seguintes box-plots:

print(monta_boxplot_por_cidade(climas_verao, "cidade", "tmedia", "João Pessoa", "Campina Grande", "Temperatura (°C)"))

Com isso, podemos concluir que João Pessoa é uma cidade ainda mais quente no pico de verão.

Questão 02

Quais os meses mais quentes e mais frios? Como você descreveria a temperatura das festas juninas das cidades nos últimos anos?

Podemos observar a distribuição de temperaturas com os seguintes box-plots:

climas_com_nome_mes <- adiciona_coluna_nome_mes(climas)

print(monta_boxplot_por_mes(climas_com_nome_mes, "nome_mes", "tmedia"))

Os meses de Dezembro, Janeiro, Fevereiro e Março podem ser definidos como os mais quentes; enquanto os meses de Junho, Julho e Agosto podem ser considerados os mais frios.

Historicamente, as festas juninas acontecem entre os meses de Junho e Julho, o que indica que 75% das temperaturas médias das semanas desses meses atingem até 26 °C.

Questão 03

Quanto chove por semana em JP e CG? Descreva a distribuição do volume de chuvas para as cidades?

Podemos observar o índice pluviométrico por semana ao longo do tempo nas cidades de João Pessoa e Campina Grande no gráfico a serguir:

print(monta_grafico_linha(climas))

Realizando um agrupamento desses dados, podemos ter outra observação com os seguintes box-plots:

print(monta_boxplot_por_cidade(climas, "cidade", "chuva", "João Pessoa", "Campina Grande", "Chuva (mm)"))

Pode-se afirmar que há uma maior concentração de chuvas na cidade de João Pessoa.

Questão 04

Qual a relação entre a temperatura de uma semana e a temperatura da semana anterior (descreva para as duas cidades)?

A correlação entre o índice pluviométrico da semana atual e o índice pluviométrico da semana anterior na cidade de Campina Grande pode ser observado no seguinte gráfico:

temperatura_campina_grande <- filtra_climas_por_cidade(climas, c("Campina Grande"))
temperatura_campina_grande <- temperatura_campina_grande[-1, ]

resultado_campina_grande <- monta_grafico_correlacao(temperatura_campina_grande)
print(resultado_campina_grande)
## `geom_smooth()` using formula = 'y ~ x'

Utilizando o método de Spearman, por não se observar uma distribuição normal entre os dados, conseguimos definir a correlação como forte.

print(paste("Correlacao:", cor(temperatura_campina_grande$temp_anterior, temperatura_campina_grande$tmedia, method = "spearman")))
## [1] "Correlacao: 0.856283925237571"

Realizando o mesmo método para a cidade de João Pessoa:

temperatura_joao_pessoa <- filtra_climas_por_cidade(climas, c("João Pessoa"))
temperatura_joao_pessoa <- temperatura_joao_pessoa[-1, ]

resultado_joao_pessoa <- monta_grafico_correlacao(temperatura_joao_pessoa)
print(resultado_joao_pessoa)
## `geom_smooth()` using formula = 'y ~ x'

Utilizando o método de Spearman, por não se observar uma distribuição normal entre os dados, conseguimos definir a correlação como forte.

print(paste("Correlacao:", cor(temperatura_joao_pessoa$temp_anterior, temperatura_joao_pessoa$tmedia, method = "spearman")))
## [1] "Correlacao: 0.860062308643224"

Questão 05

Qual a relação entre temperatura e chuvas nas semanas em que choveu (descreva para as duas cidades)?

A correlação entre o índice pluviométrico e temperatura nas semanas em que choveu na cidade de Campina Grande pode ser observado no seguinte gráfico:

temperatura_campina_grande_com_chuva <- filtra_climas_por_chuva(temperatura_campina_grande)
resultado_campina_grande_com_chuva <- monta_grafico_correlacao_chuva_temp(temperatura_campina_grande_com_chuva)
print(resultado_campina_grande_com_chuva)
## `geom_smooth()` using formula = 'y ~ x'

Utilizando o método de Spearman, por não se observar uma distribuição normal entre os dados, conseguimos definir a correlação como negativa moderada.

print(paste("Correlacao:", cor(temperatura_campina_grande_com_chuva$chuva, temperatura_campina_grande_com_chuva$tmedia, method = "spearman")))
## [1] "Correlacao: -0.448274589326887"

Realizando o mesmo método para a cidade de João Pessoa:

temperatura_joao_pessoa_com_chuva <- filtra_climas_por_chuva(temperatura_joao_pessoa)
resultado_joao_pessoa_com_chuva <- monta_grafico_correlacao_chuva_temp(temperatura_joao_pessoa_com_chuva)
print(resultado_joao_pessoa_com_chuva)
## `geom_smooth()` using formula = 'y ~ x'

Utilizando o método de Spearman, por não se observar uma distribuição normal entre os dados, conseguimos definir a correlação como negativa moderada.

print(paste("Correlacao:", cor(temperatura_joao_pessoa_com_chuva$chuva, temperatura_joao_pessoa_com_chuva$tmedia, method = "spearman")))
## [1] "Correlacao: -0.45928635996829"