# ==========================================
# Atividade 4 - Visualização e Exploração de Dados
# ==========================================
# ==========================================
# 1. Boxplots: Temperatura Máxima (Maio a Setembro)
# ==========================================
# Carrega o dataset airquality (já vem com o R)
data(airquality)
# Converte a coluna 'Temp' de Fahrenheit para Celsius
# Fórmula: C = (F - 32) * 5/9
airquality$Temp_Celsius <- (airquality$Temp - 32) * 5/9
# Converte a coluna 'Month' para um fator com nomes de meses
# e garante a ordem correta
airquality$Month_Name <- factor(airquality$Month,
levels = c(5, 6, 7, 8, 9),
labels = c("Maio", "Junho", "Julho", "Agosto", "Setembro"))
# Filtra os dados para incluir apenas os meses de maio a setembro (todos já são, mas por segurança)
airquality_filtered <- subset(airquality, Month %in% c(5, 6, 7, 8, 9))
# Cria os boxplots da temperatura por mês
# Dica: No R Markdown, certifique-se de não usar opções como 'echo=FALSE' ou 'eval=FALSE'
# que escondam o plot. O código abaixo gera a imagem corretamente.
boxplot(Temp_Celsius ~ Month_Name,
data = airquality_filtered,
main = "Comparação da Temperatura Diária Máxima (Maio-Setembro)",
xlab = "Mês",
ylab = "Temperatura (°C)",
col = "lightblue",
border = "darkblue",
outline = TRUE)

# Calcula e exibe as medianas
median_temps_celsius <- aggregate(Temp_Celsius ~ Month_Name, data = airquality_filtered, FUN = median)
cat("\nMediana das Temperaturas por Mês (Celsius):\n")
##
## Mediana das Temperaturas por Mês (Celsius):
print(median_temps_celsius)
## Month_Name Temp_Celsius
## 1 Maio 18.88889
## 2 Junho 25.55556
## 3 Julho 28.88889
## 4 Agosto 27.77778
## 5 Setembro 24.44444
# Calcula e exibe as temperaturas máximas
max_temps_celsius <- aggregate(Temp_Celsius ~ Month_Name, data = airquality_filtered, FUN = max)
cat("\nTemperatura Máxima por Mês (Celsius):\n")
##
## Temperatura Máxima por Mês (Celsius):
print(max_temps_celsius)
## Month_Name Temp_Celsius
## 1 Maio 27.22222
## 2 Junho 33.88889
## 3 Julho 33.33333
## 4 Agosto 36.11111
## 5 Setembro 33.88889
# Identifica o mês com a maior mediana e o mês com o maior valor absoluto
highest_median <- median_temps_celsius[which.max(median_temps_celsius$Temp_Celsius), ]
highest_max <- max_temps_celsius[which.max(max_temps_celsius$Temp_Celsius), ]
cat(paste("\nO mês com a maior temperatura mediana foi:", highest_median$Month_Name,
"(", round(highest_median$Temp_Celsius, 2), "°C)\n"))
##
## O mês com a maior temperatura mediana foi: Julho ( 28.89 °C)
cat(paste("O mês com o maior valor de temperatura máxima foi:", highest_max$Month_Name,
"(", round(highest_max$Temp_Celsius, 2), "°C)\n"))
## O mês com o maior valor de temperatura máxima foi: Agosto ( 36.11 °C)
# ==========================================
# 2. Matriz de Correlação de Pearson
# ==========================================
# Seleciona as variáveis de interesse
variables_of_interest <- airquality[, c("Ozone", "Solar.R", "Wind", "Temp")]
# Calcula a matriz de correlação (ignorando NAs com pairwise)
correlation_matrix <- cor(variables_of_interest, use = "pairwise.complete.obs", method = "pearson")
cat("\nMatriz de Correlação de Pearson:\n")
##
## Matriz de Correlação de Pearson:
print(correlation_matrix)
## Ozone Solar.R Wind Temp
## Ozone 1.0000000 0.34834169 -0.60154653 0.6983603
## Solar.R 0.3483417 1.00000000 -0.05679167 0.2758403
## Wind -0.6015465 -0.05679167 1.00000000 -0.4579879
## Temp 0.6983603 0.27584027 -0.45798788 1.0000000
# ==========================================
# 3. Correlograma
# ==========================================
# Instale o pacote 'corrplot' se ainda não o tiver: install.packages("corrplot")
library(corrplot)
## corrplot 0.95 loaded
# Plota o correlograma
corrplot(correlation_matrix,
method = "circle",
type = "full",
order = "original",
tl.col = "black",
tl.srt = 45,
addCoef.col = "black",
col = COL2("RdBu", 200),
diag = TRUE,
title = "Correlograma das Variáveis de Qualidade do Ar",
mar = c(0, 0, 1, 0))

# ==========================================
# 4. Gráficos de Dispersão
# ==========================================
# Cria uma cópia da matriz para manipulação e remove a diagonal (para não pegar correlação de 1.0)
temp_matrix <- correlation_matrix
diag(temp_matrix) <- NA
# Posições das correlações
max_pos_coords <- which(temp_matrix == max(temp_matrix, na.rm = TRUE), arr.ind = TRUE)[1, ]
max_neg_coords <- which(temp_matrix == min(temp_matrix, na.rm = TRUE), arr.ind = TRUE)[1, ]
min_abs_coords <- which(abs(temp_matrix) == min(abs(temp_matrix), na.rm = TRUE), arr.ind = TRUE)[1, ]
var_names <- colnames(correlation_matrix)
# Configura o layout para mostrar 3 gráficos lado a lado
par(mfrow = c(1, 3))
# 1. Gráfico para maior correlação positiva (Ozone vs Temp)
plot(variables_of_interest[, var_names[max_pos_coords[2]]],
variables_of_interest[, var_names[max_pos_coords[1]]],
xlab = var_names[max_pos_coords[2]],
ylab = var_names[max_pos_coords[1]],
main = paste(var_names[max_pos_coords[2]], "vs", var_names[max_pos_coords[1]],
"\nCor =", round(correlation_matrix[max_pos_coords[1], max_pos_coords[2]], 2)),
pch = 19, col = "blue", cex.main = 1.2)
abline(lm(variables_of_interest[, var_names[max_pos_coords[1]]] ~ variables_of_interest[, var_names[max_pos_coords[2]]]), col = "red", lwd = 2)
# 2. Gráfico para maior correlação negativa (Ozone vs Wind)
plot(variables_of_interest[, var_names[max_neg_coords[2]]],
variables_of_interest[, var_names[max_neg_coords[1]]],
xlab = var_names[max_neg_coords[2]],
ylab = var_names[max_neg_coords[1]],
main = paste(var_names[max_neg_coords[2]], "vs", var_names[max_neg_coords[1]],
"\nCor =", round(correlation_matrix[max_neg_coords[1], max_neg_coords[2]], 2)),
pch = 19, col = "darkgreen", cex.main = 1.2)
abline(lm(variables_of_interest[, var_names[max_neg_coords[1]]] ~ variables_of_interest[, var_names[max_neg_coords[2]]]), col = "red", lwd = 2)
# 3. Gráfico para menor correlação em módulo (Solar.R vs Wind)
plot(variables_of_interest[, var_names[min_abs_coords[2]]],
variables_of_interest[, var_names[min_abs_coords[1]]],
xlab = var_names[min_abs_coords[2]],
ylab = var_names[min_abs_coords[1]],
main = paste(var_names[min_abs_coords[2]], "vs", var_names[min_abs_coords[1]],
"\nCor =", round(correlation_matrix[min_abs_coords[1], min_abs_coords[2]], 2)),
pch = 19, col = "darkorange", cex.main = 1.2)
abline(lm(variables_of_interest[, var_names[min_abs_coords[1]]] ~ variables_of_interest[, var_names[min_abs_coords[2]]]), col = "red", lwd = 2)

# Reseta o layout de gráficos para o padrão original
par(mfrow = c(1, 1))