Manipulação de Dados

Conjunto de dados utilizado

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.

# Carrega o dataset
dados <- airquality

# Exibe as primeiras linhas
head(dados, 5)
##   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 do dataset
cat("Dimensões:", nrow(dados), "linhas e", ncol(dados), "colunas\n")
## 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.


Passo 1: Criação de novas variáveis

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 brasileiro
  • faixa_temp: categorização qualitativa do clima em Ameno, Moderado ou Quente
  • nome_mes: substituição do número do mês pelo nome por extenso em português, facilitando a leitura dos gráficos e tabelas

Passo 2: Filtragem

# 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
cat("Dias acima da mediana:", nrow(dados_filtrados), "de", nrow(dados_limpos), "\n")
## 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.


Passo 3: Ordenação e seleção

# 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")
Dias com maior concentração de ozônio (acima da mediana)
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.


Resumo estatístico por faixa de temperatura

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


Tabela Interativa

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.


Equações e Conceitos

1. Distribuição Normal (Gaussiana)

\[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.


2. Gradiente Descendente

\[\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\).


3. Transformada de Fourier Discreta (DFT)

\[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.


4. Divergência de Kullback-Leibler

\[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.


5. Índice de Silhueta

\[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.


Figuras

Figura 1: Concentração de Ozônio por Faixa de Temperatura

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.

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.


Figura 2: Relação entre Radiação Solar e Ozônio ao Longo dos Meses

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.

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.


Referências

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.