Neste relatório, utilizo o dataset airquality,
disponível nativamente no R. Ele registra medições diárias de qualidade
do ar na cidade de Nova York entre maio e setembro de 1973. O dataset
conta com 153 observações e 6 variáveis.
## Ozone Solar.R Wind Temp Month Day
## 1 41 190 7.4 67 5 1
## 2 36 118 8.0 72 5 2
## 3 12 149 12.6 74 5 3
## 4 18 313 11.5 62 5 4
## 5 NA NA 14.3 56 5 5
## Dimensões: 153 linhas e 6 colunas
As variáveis presentes são: Ozone (concentração de
ozônio em ppb), Solar.R (radiação solar em lang),
Wind (velocidade do vento em mph), Temp
(temperatura em °F), além de Month e Day
indicando a data da medição.
dados <- dados %>%
mutate(
# Conversão de Fahrenheit para Celsius
Temp_C = round((Temp - 32) * 5 / 9, 1),
# Classificação da temperatura em Celsius
faixa_temp = case_when(
Temp_C < 20 ~ "Ameno",
Temp_C >= 20 & Temp_C < 28 ~ "Moderado",
Temp_C >= 28 ~ "Quente"
),
# Nome do mês por extenso
nome_mes = case_when(
Month == 5 ~ "Maio",
Month == 6 ~ "Junho",
Month == 7 ~ "Julho",
Month == 8 ~ "Agosto",
Month == 9 ~ "Setembro"
)
)
# Visualiza amostra com novas variáveis
head(dados[, c("Month", "Temp", "Temp_C", "faixa_temp", "nome_mes")], 5)## Month Temp Temp_C faixa_temp nome_mes
## 1 5 67 19.4 Ameno Maio
## 2 5 72 22.2 Moderado Maio
## 3 5 74 23.3 Moderado Maio
## 4 5 62 16.7 Ameno Maio
## 5 5 56 13.3 Ameno Maio
Foram criadas três novas variáveis derivadas:
Temp_C: temperatura convertida de Fahrenheit para
Celsius, unidade mais familiar no contexto brasileirofaixa_temp: categorização qualitativa do clima em
Ameno, Moderado ou Quentenome_mes: substituição do número do mês pelo nome por
extenso em português, facilitando a leitura dos gráficos e tabelas# Remove linhas com valores ausentes em Ozone
dados_limpos <- dados %>%
filter(!is.na(Ozone))
# Calcula a mediana do ozônio
mediana_oz <- median(dados_limpos$Ozone)
# Filtra apenas dias com ozônio acima da mediana
dados_filtrados <- dados_limpos %>%
filter(Ozone > mediana_oz)
cat("Mediana de Ozônio (ppb):", mediana_oz, "\n")## Mediana de Ozônio (ppb): 31.5
## Dias acima da mediana: 58 de 116
Antes de filtrar, foi necessário remover as 37 linhas com valores
ausentes (NA) na variável Ozone. Em seguida, a
filtragem preserva apenas os dias em que a concentração de ozônio
superou a mediana, representando os episódios de maior poluição
atmosférica.
# Seleciona, renomeia e ordena as variáveis de interesse
dados_final <- dados_filtrados %>%
transmute(
Mes = nome_mes,
Dia = Day,
Ozonio_ppb = Ozone,
Radiacao = Solar.R,
Vento_mph = Wind,
Temperatura_C = Temp_C,
Clima = faixa_temp
) %>%
arrange(desc(Ozonio_ppb))
# Exibe os 6 primeiros registros
kable(head(dados_final, 6),
caption = "Dias com maior concentração de ozônio (acima da mediana)",
align = "lcccccc")| Mes | Dia | Ozonio_ppb | Radiacao | Vento_mph | Temperatura_C | Clima |
|---|---|---|---|---|---|---|
| Agosto | 25 | 168 | 238 | 3.4 | 27.2 | Moderado |
| Julho | 1 | 135 | 269 | 4.1 | 28.9 | Quente |
| Agosto | 7 | 122 | 255 | 4.0 | 31.7 | Quente |
| Agosto | 29 | 118 | 225 | 2.3 | 34.4 | Quente |
| Maio | 30 | 115 | 223 | 5.7 | 26.1 | Moderado |
| Agosto | 9 | 110 | 207 | 8.0 | 32.2 | Quente |
A tabela apresenta os 6 dias com maior concentração de ozônio registrada, após a limpeza e filtragem dos dados. A ordenação decrescente permite identificar rapidamente os piores episódios de qualidade do ar no período.
dados_limpos %>%
group_by(faixa_temp) %>%
summarise(
N = n(),
Ozonio_medio = round(mean(Ozone, na.rm = TRUE), 1),
Vento_medio_mph = round(mean(Wind), 1),
Temp_media_C = round(mean(Temp_C), 1),
.groups = "drop"
) %>%
arrange(Temp_media_C) %>%
kable(
col.names = c("Faixa de Temperatura", "N", "Ozônio médio (ppb)",
"Vento médio (mph)", "Temperatura média (°C)"),
caption = "Estatísticas por faixa de temperatura"
)| Faixa de Temperatura | N | Ozônio médio (ppb) | Vento médio (mph) | Temperatura média (°C) |
|---|---|---|---|---|
| Ameno | 20 | 17.8 | 12.3 | 17.2 |
| Moderado | 59 | 29.5 | 10.5 | 24.7 |
| Quente | 37 | 75.4 | 7.6 | 31.2 |
O agrupamento evidencia que dias mais quentes tendem a apresentar concentrações de ozônio mais elevadas, enquanto dias mais amenos registram menor poluição. Isso é esperado: o ozônio troposférico é formado por reações fotoquímicas que se intensificam com o calor e a luz solar.
A tabela abaixo foi construída com o pacote DT,
permitindo busca em tempo real, ordenação por qualquer coluna e
paginação dos registros.
DT::datatable(
dados_final,
rownames = FALSE,
caption = "Dataset airquality — Dias acima da mediana de ozônio",
filter = "top",
extensions = c("Buttons"),
options = list(
pageLength = 8,
dom = "Bfrtip",
buttons = c("csv", "excel", "print"),
language = list(
url = "//cdn.datatables.net/plug-ins/1.10.11/i18n/Portuguese-Brasil.json"
)
)
) %>%
DT::formatStyle(
"Ozonio_ppb",
background = DT::styleColorBar(dados_final$Ozonio_ppb, "#e67e22"),
backgroundSize = "100% 80%",
backgroundRepeat = "no-repeat",
backgroundPosition = "center"
)Destaques: A coluna Ozonio_ppb
apresenta barras de progresso que facilitam a comparação visual entre os
dias. Os botões no topo permitem exportar os dados para CSV, Excel ou
imprimir diretamente.
\[f(x) = \frac{1}{\sigma\sqrt{2\pi}}\, e^{-\frac{(x - \mu)^2}{2\sigma^2}}\]
Descreve a densidade de probabilidade de uma variável aleatória contínua em torno de sua média \(\mu\), com desvio padrão \(\sigma\). É a distribuição mais importante em estatística, fundamentando testes de hipóteses, intervalos de confiança e regressão linear clássica.
\[\theta_{j} \leftarrow \theta_{j} - \alpha \frac{\partial}{\partial \theta_{j}} \mathcal{L}(\theta)\]
Algoritmo iterativo de otimização amplamente utilizado no treinamento de modelos de aprendizado de máquina. A cada iteração, os parâmetros \(\theta_j\) são atualizados na direção oposta ao gradiente da função de custo \(\mathcal{L}\), com passo controlado pela taxa de aprendizado \(\alpha\).
\[X[k] = \sum_{n=0}^{N-1} x[n]\, e^{-i\,2\pi kn/N}, \quad k = 0, 1, \ldots, N-1\]
Converte um sinal discreto no domínio do tempo para o domínio da frequência. Em ciência de dados e processamento de séries temporais, é utilizada para detectar padrões sazonais, periodicidades ocultas e componentes de ruído em dados sequenciais.
\[D_{\mathrm{KL}}(P \,\|\, Q) = \sum_{x} P(x) \log \frac{P(x)}{Q(x)}\]
Mede o quanto uma distribuição de probabilidade \(Q\) diverge de uma distribuição de referência \(P\). Amplamente empregada em modelos generativos (como VAEs) e em teoria da informação para quantificar a perda ao aproximar uma distribuição verdadeira por outra.
\[s(i) = \frac{b(i) - a(i)}{\max\{a(i),\, b(i)\}}\]
Avalia a qualidade de agrupamentos (clusters). O valor \(a(i)\) representa a distância média do ponto \(i\) aos demais pontos do seu próprio cluster, enquanto \(b(i)\) é a menor distância média ao cluster vizinho mais próximo. O índice varia de \(-1\) a \(1\): valores próximos de \(1\) indicam agrupamento bem definido; próximos de \(0\) ou negativos sugerem sobreposição entre clusters.
ggplot(dados_limpos, aes(x = faixa_temp, y = Ozone, fill = faixa_temp)) +
geom_boxplot(alpha = 0.65, outlier.colour = "darkred", outlier.shape = 17) +
geom_jitter(width = 0.18, alpha = 0.35, size = 1.8) +
scale_fill_manual(values = c("Ameno" = "#3498db",
"Moderado" = "#f1c40f",
"Quente" = "#e74c3c")) +
labs(
title = "Ozônio Atmosférico por Faixa de Temperatura",
x = "Faixa de Temperatura",
y = "Concentração de Ozônio (ppb)",
fill = "Clima"
) +
theme_light(base_size = 12) +
theme(
legend.position = "bottom",
plot.title = element_text(face = "bold", size = 13),
panel.grid.minor = element_blank()
)Figura 1: Distribuição da concentração de ozônio (ppb) agrupada por faixa de temperatura. Dias quentes apresentam maior variabilidade e mediana mais elevada.
ggplot(dados_limpos, aes(x = Solar.R, y = Ozone, color = nome_mes, size = Temp_C)) +
geom_point(alpha = 0.55) +
geom_smooth(method = "lm", se = FALSE, color = "gray40",
linetype = "dashed", linewidth = 0.8) +
scale_color_brewer(palette = "Set1") +
scale_size(range = c(1.5, 5), name = "Temperatura (°C)") +
labs(
title = "Radiação Solar vs. Concentração de Ozônio",
x = "Radiação Solar (lang)",
y = "Ozônio (ppb)",
color = "Mês"
) +
theme_light(base_size = 12) +
theme(
legend.position = "bottom",
plot.title = element_text(face = "bold", size = 13),
panel.grid.minor = element_blank()
)Figura 2: Dispersão entre radiação solar (lang) e concentração de ozônio (ppb), colorida por mês. Observe que meses de verão (julho e agosto) tendem a combinar alta radiação e altos níveis de ozônio.
U.S. Environmental Protection Agency (EPA). Air Quality Data Collected at Monitoring Sites. Disponível em: https://www.epa.gov/outdoor-air-quality-data. Acesso em: maio 2026.
IBM. What is Gradient Descent? Disponível em: https://www.ibm.com/topics/gradient-descent. Acesso em: maio 2026.
Britannica. Normal Distribution. Disponível em: https://www.britannica.com/science/normal-distribution. Acesso em: maio 2026.
Encord. KL Divergence in Machine Learning. Disponível em: https://encord.com/blog/kl-divergence-in-machine-learning/. Acesso em: maio 2026.
Scikit-learn Documentation. Clustering Performance Evaluation — Silhouette Score. Disponível em: https://scikit-learn.org/stable/modules/clustering.html. Acesso em: maio 2026.