Introdução

Este relatório apresenta uma análise de dados completa utilizando R Markdown, demonstrando técnicas de manipulação de dados, visualização interativa, formulações matemáticas e referências bibliográficas relevantes para ciência de dados.

Análise de Dados

1. Manipulação de Dados

Carregamento dos Pacotes

# Carregando pacotes necessários
library(tidyverse)
## ── Attaching core tidyverse packages ──────────────────────── tidyverse 2.0.0 ──
## ✔ dplyr     1.2.1     ✔ readr     2.2.0
## ✔ forcats   1.0.1     ✔ stringr   1.6.0
## ✔ ggplot2   4.0.3     ✔ tibble    3.3.1
## ✔ lubridate 1.9.5     ✔ tidyr     1.3.2
## ✔ purrr     1.2.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(DT)
library(nycflights13)
library(knitr)

Carregamento do Dataset

Para esta análise, utilizaremos o dataset flights do pacote nycflights13, que contém informações sobre voos que partiram de Nova York em 2013.

# Carregando os dados
dados <- flights

# Visualizando as primeiras linhas
head(dados)
## # A tibble: 6 × 19
##    year month   day dep_time sched_dep_time dep_delay arr_time sched_arr_time
##   <int> <int> <int>    <int>          <int>     <dbl>    <int>          <int>
## 1  2013     1     1      517            515         2      830            819
## 2  2013     1     1      533            529         4      850            830
## 3  2013     1     1      542            540         2      923            850
## 4  2013     1     1      544            545        -1     1004           1022
## 5  2013     1     1      554            600        -6      812            837
## 6  2013     1     1      554            558        -4      740            728
## # ℹ 11 more variables: arr_delay <dbl>, carrier <chr>, flight <int>,
## #   tailnum <chr>, origin <chr>, dest <chr>, air_time <dbl>, distance <dbl>,
## #   hour <dbl>, minute <dbl>, time_hour <dttm>

Descrição do dataset: O dataset contém 336776 observações e 19 variáveis relacionadas a voos.

Manipulação 1: Filtragem

Vamos filtrar apenas os voos com destino a Los Angeles (LA) que tiveram atraso na chegada.

# Filtrando voos para LAX com atraso
voos_la_atrasados <- dados %>%
  filter(dest == "LAX", arr_delay > 0) %>%
  select(month, day, carrier, dep_time, arr_delay, distance)

# Visualizando resultado
head(voos_la_atrasados, 10)
## # A tibble: 10 × 6
##    month   day carrier dep_time arr_delay distance
##    <int> <int> <chr>      <int>     <dbl>    <dbl>
##  1     1     1 UA           558         7     2475
##  2     1     1 UA           628        29     2454
##  3     1     1 VX           658         2     2475
##  4     1     1 B6           702        44     2475
##  5     1     1 AA           743         7     2475
##  6     1     1 UA           828         7     2454
##  7     1     1 AA           856         6     2475
##  8     1     1 DL           921        10     2475
##  9     1     1 B6           941         2     2475
## 10     1     1 UA           953        39     2454

Resultado: Foram encontrados 5967 voos para Los Angeles que chegaram com atraso.

Manipulação 2: Criação de Novas Variáveis

Vamos criar variáveis categóricas para classificar o tempo de atraso.

# Criando classificação de atraso
voos_classificados <- voos_la_atrasados %>%
  mutate(
    categoria_atraso = case_when(
      arr_delay <= 15 ~ "Pequeno (até 15 min)",
      arr_delay <= 60 ~ "Médio (15-60 min)",
      arr_delay <= 120 ~ "Grande (60-120 min)",
      TRUE ~ "Muito Grande (>120 min)"
    ),
    velocidade_media = distance / (arr_delay / 60) # milhas por hora
  )

# Visualizando resultado
head(voos_classificados, 10)
## # A tibble: 10 × 8
##    month   day carrier dep_time arr_delay distance categoria_atraso    
##    <int> <int> <chr>      <int>     <dbl>    <dbl> <chr>               
##  1     1     1 UA           558         7     2475 Pequeno (até 15 min)
##  2     1     1 UA           628        29     2454 Médio (15-60 min)   
##  3     1     1 VX           658         2     2475 Pequeno (até 15 min)
##  4     1     1 B6           702        44     2475 Médio (15-60 min)   
##  5     1     1 AA           743         7     2475 Pequeno (até 15 min)
##  6     1     1 UA           828         7     2454 Pequeno (até 15 min)
##  7     1     1 AA           856         6     2475 Pequeno (até 15 min)
##  8     1     1 DL           921        10     2475 Pequeno (até 15 min)
##  9     1     1 B6           941         2     2475 Pequeno (até 15 min)
## 10     1     1 UA           953        39     2454 Médio (15-60 min)   
## # ℹ 1 more variable: velocidade_media <dbl>

Interpretação:

  • Criamos a variável categoria_atraso para classificar os atrasos em 4 categorias
  • Criamos velocidade_media que estima a velocidade do voo considerando o atraso

Manipulação 3: Agregação e Sumarização

Vamos calcular estatísticas por companhia aérea.

# Estatísticas por companhia
resumo_companhias <- voos_classificados %>%
  group_by(carrier) %>%
  summarise(
    total_voos = n(),
    atraso_medio = mean(arr_delay, na.rm = TRUE),
    atraso_mediano = median(arr_delay, na.rm = TRUE),
    atraso_maximo = max(arr_delay, na.rm = TRUE),
    distancia_media = mean(distance, na.rm = TRUE)
  ) %>%
  arrange(desc(atraso_medio))

# Visualizando resultado
print(resumo_companhias)
## # A tibble: 5 × 6
##   carrier total_voos atraso_medio atraso_mediano atraso_maximo distancia_media
##   <chr>        <int>        <dbl>          <dbl>         <dbl>           <dbl>
## 1 AA            1160         38.4             20           361           2472.
## 2 VX             949         34.7             14           420           2469.
## 3 UA            2368         33.9             19           373           2461.
## 4 B6             670         33.4             20           235           2475 
## 5 DL             820         28.0             16           784           2475

Análise: A companhia AA apresentou o maior atraso médio (38.44 minutos) entre os voos para LA.

Manipulação 4: Ordenação

Vamos ordenar os voos por atraso decrescente.

# Ordenando por atraso
voos_ordenados <- voos_classificados %>%
  arrange(desc(arr_delay)) %>%
  select(month, day, carrier, arr_delay, categoria_atraso, distance)

# Top 10 maiores atrasos
head(voos_ordenados, 10)
## # A tibble: 10 × 6
##    month   day carrier arr_delay categoria_atraso        distance
##    <int> <int> <chr>       <dbl> <chr>                      <dbl>
##  1     3    18 DL            784 Muito Grande (>120 min)     2475
##  2     7    10 VX            420 Muito Grande (>120 min)     2475
##  3     5     1 VX            408 Muito Grande (>120 min)     2475
##  4     8    18 VX            404 Muito Grande (>120 min)     2475
##  5     4    10 UA            373 Muito Grande (>120 min)     2475
##  6    12    21 UA            362 Muito Grande (>120 min)     2454
##  7    12     8 AA            361 Muito Grande (>120 min)     2475
##  8     4    16 AA            338 Muito Grande (>120 min)     2475
##  9     7    10 UA            322 Muito Grande (>120 min)     2475
## 10     4    25 AA            319 Muito Grande (>120 min)     2475

Resultado: O maior atraso registrado foi de 784 minutos, classificado como “Muito Grande (>120 min)”.

Visualização dos Dados

# Gráfico de distribuição de atrasos por categoria
ggplot(voos_classificados, aes(x = categoria_atraso, fill = categoria_atraso)) +
  geom_bar() +
  labs(
    title = "Distribuição de Voos para LA por Categoria de Atraso",
    subtitle = paste("Total de", nrow(voos_classificados), "voos analisados"),
    x = "Categoria de Atraso",
    y = "Número de Voos"
  ) +
  theme_minimal() +
  theme(
    legend.position = "none",
    axis.text.x = element_text(angle = 45, hjust = 1),
    plot.title = element_text(face = "bold", size = 14)
  ) +
  scale_fill_brewer(palette = "Set2")

Interpretação do Gráfico: A maioria dos voos atrasados se concentra na categoria de “Pequeno” atraso (até 15 minutos), indicando que atrasos extremos são menos frequentes.

2. Tabela Interativa (DT)

Abaixo apresentamos uma tabela interativa com os dados manipulados, permitindo ordenação, busca e paginação.

# Criando tabela interativa com DT
datatable(
  voos_classificados,
  caption = "Tabela Interativa: Voos para Los Angeles com Atraso",
  options = list(
    pageLength = 10,
    lengthMenu = c(5, 10, 25, 50),
    searching = TRUE,
    ordering = TRUE,
    autoWidth = TRUE
  ),
  filter = 'top',
  rownames = FALSE,
  class = 'cell-border stripe'
) %>%
  formatRound(columns = c('arr_delay', 'distance', 'velocidade_media'), digits = 2) %>%
  formatStyle(
    'categoria_atraso',
    backgroundColor = styleEqual(
      c("Pequeno (até 15 min)", "Médio (15-60 min)", 
        "Grande (60-120 min)", "Muito Grande (>120 min)"),
      c('#d4edda', '#fff3cd', '#f8d7da', '#f5c6cb')
    )
  )

Funcionalidades da Tabela:

  • Busca: Campo de busca no topo de cada coluna
  • Ordenação: Clique nos cabeçalhos para ordenar
  • Paginação: Navegue entre páginas de dados
  • Cores: Categorias de atraso coloridas para melhor visualização

3. Equações Matemáticas

Equação 1: Modelo de Regressão Linear Múltipla

\[Y = \beta_0 + \beta_1 X_1 + \beta_2 X_2 + \cdots + \beta_p X_p + \epsilon\]

Significado: Esta é a equação fundamental da regressão linear múltipla, onde \(Y\) é a variável resposta, \(X_1, X_2, \ldots, X_p\) são as variáveis preditoras, \(\beta_0\) é o intercepto, \(\beta_1, \ldots, \beta_p\) são os coeficientes de regressão e \(\epsilon\) representa o erro aleatório. É amplamente utilizada em análise preditiva.

Equação 2: Função de Verossimilhança em Regressão Logística

\[L(\beta) = \prod_{i=1}^{n} p_i^{y_i}(1-p_i)^{1-y_i} \quad \text{onde} \quad p_i = \frac{1}{1 + e^{-(\beta_0 + \beta_1 x_i)}}\]

Significado: Esta equação representa a função de verossimilhança na regressão logística, utilizada para classificação binária. O termo \(p_i\) é a probabilidade predita usando a função logística (sigmoid), e a função é maximizada para encontrar os melhores parâmetros \(\beta\).

Equação 3: Teorema de Bayes

\[P(A|B) = \frac{P(B|A) \cdot P(A)}{P(B)}\]

Significado: O Teorema de Bayes é fundamental em probabilidade e estatística bayesiana. Ele permite calcular a probabilidade condicional de um evento \(A\) dado que \(B\) ocorreu, baseando-se na probabilidade de \(B\) dado \(A\) e nas probabilidades marginais. É a base dos classificadores bayesianos em machine learning.

Equação 4: Função de Custo da Regressão Ridge (L2)

\[J(\beta) = \sum_{i=1}^{n}(y_i - \hat{y}_i)^2 + \lambda\sum_{j=1}^{p}\beta_j^2\]

Significado: Esta é a função de custo da regressão Ridge, que adiciona uma penalização L2 (soma dos quadrados dos coeficientes) à função de erro quadrático tradicional. O parâmetro \(\lambda\) controla a intensidade da regularização, ajudando a prevenir overfitting ao “encolher” coeficientes grandes.

Equação 5: Métrica de Informação Mútua

\[I(X;Y) = \sum_{x \in X}\sum_{y \in Y} p(x,y) \log\frac{p(x,y)}{p(x)p(y)} = H(X) - H(X|Y)\]

Significado: A informação mútua mede a dependência estatística entre duas variáveis aleatórias \(X\) e \(Y\). Ela quantifica quanto a observação de uma variável reduz a incerteza sobre a outra. É expressa em termos de entropia \(H\) e é amplamente usada em seleção de features e teoria da informação.

4. Figuras de Ciência de Dados

Figura 1: Ciclo de Vida da Ciência de Dados

Ciclo de Vida da Ciência de Dados
Ciclo de Vida da Ciência de Dados

Descrição: Esta figura ilustra o ciclo completo de um projeto de ciência de dados, desde a definição do problema até a comunicação dos resultados. Os principais estágios incluem:

  1. Discovery: Definição do problema e objetivos
  2. Data Preparation: Coleta e limpeza de dados
  3. Model Planning: Seleção de técnicas e ferramentas
  4. Model Building: Construção e treinamento de modelos
  5. Communicate Results: Apresentação e storytelling
  6. Operationalize: Implementação em produção

Figura 2: Taxonomia de Algoritmos de Machine Learning

Taxonomia de Machine Learning
Taxonomia de Machine Learning

Descrição: Esta figura apresenta a classificação dos principais algoritmos de machine learning em três categorias fundamentais:

  • Aprendizado Supervisionado: Algoritmos que aprendem com dados rotulados (Regressão Linear, Árvores de Decisão, SVM, Redes Neurais)
  • Aprendizado Não-Supervisionado: Algoritmos que encontram padrões em dados não rotulados (K-Means, PCA, Clustering Hierárquico)
  • Aprendizado por Reforço: Algoritmos que aprendem por tentativa e erro através de recompensas (Q-Learning, Deep Q-Networks)

Insights da Análise

A análise revelou que dos 5967 voos para Los Angeles com atraso:

  • A maioria apresentou atrasos pequenos (até 15 minutos)
  • A companhia AA teve o pior desempenho médio
  • O maior atraso individual foi de 784 minutos

5. Referências

Este relatório foi elaborado consultando obras fundamentais em ciência de dados e análise estatística (Wickham and Grolemund 2016; James et al. 2013; Knaflic 2015; Hastie et al. 2009; VanderPlas 2016).

A manipulação e visualização de dados em R foi baseada em Wickham and Grolemund (2016). Para os fundamentos de aprendizado estatístico, consultamos James et al. (2013) e Hastie et al. (2009). As técnicas de storytelling foram inspiradas em Knaflic (2015), e VanderPlas (2016) ofereceu uma perspectiva complementar.

Hastie, Trevor, Robert Tibshirani, and Jerome Friedman. 2009. The Elements of Statistical Learning: Data Mining, Inference, and Prediction. Second. Springer.
James, Gareth, Daniela Witten, Trevor Hastie, and Robert Tibshirani. 2013. An Introduction to Statistical Learning: With Applications in r. Springer.
Knaflic, Cole Nussbaumer. 2015. Storytelling with Data: A Data Visualization Guide for Business Professionals. Wiley.
VanderPlas, Jake. 2016. Python Data Science Handbook: Essential Tools for Working with Data. O’Reilly Media.
Wickham, Hadley, and Garrett Grolemund. 2016. R for Data Science: Import, Tidy, Transform, Visualize, and Model Data. O’Reilly Media.