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.
# 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)
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.
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.
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:
categoria_atraso para classificar os
atrasos em 4 categoriasvelocidade_media que estima a velocidade do voo
considerando o atrasoVamos 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.
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)”.
# 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.
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:
\[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.
\[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\).
\[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.
\[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.
\[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.
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:
Descrição: Esta figura apresenta a classificação dos principais algoritmos de machine learning em três categorias fundamentais:
A análise revelou que dos 5967 voos para Los Angeles com atraso:
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).