library(nycflights13)
library(dplyr)
library(stringr)
library(kableExtra)
library(janitor)
library(ggplot2)\[ \star \]
Informações sobre o conjunto de dados clicando aqui.
ny_voos <- nycflights13::flightsglimpse(ny_voos)## Rows: 336,776
## Columns: 19
## $ year <int> 2013, 2013, 2013, 2013, 2013, 2013, 2013, 2013, 2013...
## $ month <int> 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1...
## $ day <int> 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1...
## $ dep_time <int> 517, 533, 542, 544, 554, 554, 555, 557, 557, 558, 55...
## $ sched_dep_time <int> 515, 529, 540, 545, 600, 558, 600, 600, 600, 600, 60...
## $ dep_delay <dbl> 2, 4, 2, -1, -6, -4, -5, -3, -3, -2, -2, -2, -2, -2,...
## $ arr_time <int> 830, 850, 923, 1004, 812, 740, 913, 709, 838, 753, 8...
## $ sched_arr_time <int> 819, 830, 850, 1022, 837, 728, 854, 723, 846, 745, 8...
## $ arr_delay <dbl> 11, 20, 33, -18, -25, 12, 19, -14, -8, 8, -2, -3, 7,...
## $ carrier <chr> "UA", "UA", "AA", "B6", "DL", "UA", "B6", "EV", "B6"...
## $ flight <int> 1545, 1714, 1141, 725, 461, 1696, 507, 5708, 79, 301...
## $ tailnum <chr> "N14228", "N24211", "N619AA", "N804JB", "N668DN", "N...
## $ origin <chr> "EWR", "LGA", "JFK", "JFK", "LGA", "EWR", "EWR", "LG...
## $ dest <chr> "IAH", "IAH", "MIA", "BQN", "ATL", "ORD", "FLL", "IA...
## $ air_time <dbl> 227, 227, 160, 183, 116, 150, 158, 53, 140, 138, 149...
## $ distance <dbl> 1400, 1416, 1089, 1576, 762, 719, 1065, 229, 944, 73...
## $ hour <dbl> 5, 5, 5, 5, 6, 5, 6, 6, 6, 6, 6, 6, 6, 6, 6, 5, 6, 6...
## $ minute <dbl> 15, 29, 40, 45, 0, 58, 0, 0, 0, 0, 0, 0, 0, 0, 0, 59...
## $ time_hour <dttm> 2013-01-01 05:00:00, 2013-01-01 05:00:00, 2013-01-0...
ny_voos %>% filter(arr_delay >= 120)## # A tibble: 10,200 x 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 811 630 101 1047 830
## 2 2013 1 1 848 1835 853 1001 1950
## 3 2013 1 1 957 733 144 1056 853
## 4 2013 1 1 1114 900 134 1447 1222
## 5 2013 1 1 1505 1310 115 1638 1431
## 6 2013 1 1 1525 1340 105 1831 1626
## 7 2013 1 1 1549 1445 64 1912 1656
## 8 2013 1 1 1558 1359 119 1718 1515
## 9 2013 1 1 1732 1630 62 2028 1825
## 10 2013 1 1 1803 1620 103 2008 1750
## # ... with 10,190 more rows, and 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>
Portanto, 10200 voos tiveram atraso de duas horas ou mais.
\[ \cdots \]
ny_voos %>% filter(dest == "HOU" | dest == "IAH")## # A tibble: 9,313 x 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 623 627 -4 933 932
## 4 2013 1 1 728 732 -4 1041 1038
## 5 2013 1 1 739 739 0 1104 1038
## 6 2013 1 1 908 908 0 1228 1219
## 7 2013 1 1 1028 1026 2 1350 1339
## 8 2013 1 1 1044 1045 -1 1352 1351
## 9 2013 1 1 1114 900 134 1447 1222
## 10 2013 1 1 1205 1200 5 1503 1505
## # ... with 9,303 more rows, and 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>
O uso do operador %in% pode facilitar o código nesses casos.
ny_voos %>% filter(dest %in% c("HOU", "IAH"))## # A tibble: 9,313 x 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 623 627 -4 933 932
## 4 2013 1 1 728 732 -4 1041 1038
## 5 2013 1 1 739 739 0 1104 1038
## 6 2013 1 1 908 908 0 1228 1219
## 7 2013 1 1 1028 1026 2 1350 1339
## 8 2013 1 1 1044 1045 -1 1352 1351
## 9 2013 1 1 1114 900 134 1447 1222
## 10 2013 1 1 1205 1200 5 1503 1505
## # ... with 9,303 more rows, and 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>
Portanto, 9313 voos tiveram como destino Houston.
\[ \cdots \]
Quero descobrir primeiro as siglas dessas companhias aéreas.
airlines %>%
filter(name %in% c("American Airlines Inc.",
"United Air Lines Inc.",
"Delta Air Lines Inc.")) %>%
knitr::kable(col.names = c("Sigla","Companhia aérea")) %>%
kable_styling(full_width = FALSE,
bootstrap_options = c("striped", "hover", "condensed", "responsive")) | Sigla | Companhia aérea |
|---|---|
| AA | American Airlines Inc. |
| DL | Delta Air Lines Inc. |
| UA | United Air Lines Inc. |
Sabendo as siglas das companhias podemos filtrar pela coluna carrier.
ny_voos %>% filter(carrier %in% c("AA", "DL", "UA"))## # A tibble: 139,504 x 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 554 600 -6 812 837
## 5 2013 1 1 554 558 -4 740 728
## 6 2013 1 1 558 600 -2 753 745
## 7 2013 1 1 558 600 -2 924 917
## 8 2013 1 1 558 600 -2 923 937
## 9 2013 1 1 559 600 -1 941 910
## 10 2013 1 1 559 600 -1 854 902
## # ... with 139,494 more rows, and 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>
Portanto, 139504 voos foram realizados por essas empresas.
\[ \cdots \]
Como a coluna month está como numérica, vamos filtar pelo número correspondente de cada mês.
ny_voos %>%
filter(month %in% c(7, 8, 9))## # A tibble: 86,326 x 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 7 1 1 2029 212 236 2359
## 2 2013 7 1 2 2359 3 344 344
## 3 2013 7 1 29 2245 104 151 1
## 4 2013 7 1 43 2130 193 322 14
## 5 2013 7 1 44 2150 174 300 100
## 6 2013 7 1 46 2051 235 304 2358
## 7 2013 7 1 48 2001 287 308 2305
## 8 2013 7 1 58 2155 183 335 43
## 9 2013 7 1 100 2146 194 327 30
## 10 2013 7 1 100 2245 135 337 135
## # ... with 86,316 more rows, and 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>
Portanto, 86326 voos partiram no verão.
\[ \cdots \]
ny_voos %>% filter(dep_delay <= 0 &
arr_delay >= 120)## # A tibble: 29 x 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 27 1419 1420 -1 1754 1550
## 2 2013 10 7 1350 1350 0 1736 1526
## 3 2013 10 7 1357 1359 -2 1858 1654
## 4 2013 10 16 657 700 -3 1258 1056
## 5 2013 11 1 658 700 -2 1329 1015
## 6 2013 3 18 1844 1847 -3 39 2219
## 7 2013 4 17 1635 1640 -5 2049 1845
## 8 2013 4 18 558 600 -2 1149 850
## 9 2013 4 18 655 700 -5 1213 950
## 10 2013 5 22 1827 1830 -3 2217 2010
## # ... with 19 more rows, and 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>
Portanto, 29 voos não partirar atrasados, porém chegaram com mais de duas horas de atraso.
\[ \cdots \]
ny_voos %>% filter(dep_time == 2400 |
dep_time <= 600)## # A tibble: 9,373 x 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
## 7 2013 1 1 555 600 -5 913 854
## 8 2013 1 1 557 600 -3 709 723
## 9 2013 1 1 557 600 -3 838 846
## 10 2013 1 1 558 600 -2 753 745
## # ... with 9,363 more rows, and 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>
Portanto, 9373 voos partirar entre meia noite e 6 horas da manhã.
\[ \cdots \]
Classificando os voos para encontrarmos os mais atrasados.
ny_voos %>% arrange(desc(dep_delay)) ## # A tibble: 336,776 x 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 9 641 900 1301 1242 1530
## 2 2013 6 15 1432 1935 1137 1607 2120
## 3 2013 1 10 1121 1635 1126 1239 1810
## 4 2013 9 20 1139 1845 1014 1457 2210
## 5 2013 7 22 845 1600 1005 1044 1815
## 6 2013 4 10 1100 1900 960 1342 2211
## 7 2013 3 17 2321 810 911 135 1020
## 8 2013 6 27 959 1900 899 1236 2226
## 9 2013 7 22 2257 759 898 121 1026
## 10 2013 12 5 756 1700 896 1058 2020
## # ... with 336,766 more rows, and 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>
\[ \cdots \]
Conforme descrito pelas informações do banco de dados, a distância está com a unidade de medida em milhas, e tempo no ar está em minutos. Vamos criar uma coluna com a velocidade em km/h. Vou criar um novo tbl_df modificado e classificar pelos voos mais rápidos.
ny_voos_mdf <- ny_voos %>% mutate(vel = (distance / 0.62137) / (air_time / 60))
ny_voos_mdf %>% arrange(desc(vel))## # A tibble: 336,776 x 20
## 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 5 25 1709 1700 9 1923 1937
## 2 2013 7 2 1558 1513 45 1745 1719
## 3 2013 5 13 2040 2025 15 2225 2226
## 4 2013 3 23 1914 1910 4 2045 2043
## 5 2013 1 12 1559 1600 -1 1849 1917
## 6 2013 11 17 650 655 -5 1059 1150
## 7 2013 2 21 2355 2358 -3 412 438
## 8 2013 11 17 759 800 -1 1212 1255
## 9 2013 11 16 2003 1925 38 17 36
## 10 2013 11 16 2349 2359 -10 402 440
## # ... with 336,766 more rows, and 12 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>,
## # vel <dbl>
\[ \cdots \]
Apesar de incluir várias vezes o nome de uma variável dentre de select a função seleciona a variável apenas uma única vez.
ny_voos %>% select(month, month, month)## # A tibble: 336,776 x 1
## month
## <int>
## 1 1
## 2 1
## 3 1
## 4 1
## 5 1
## 6 1
## 7 1
## 8 1
## 9 1
## 10 1
## # ... with 336,766 more rows
\[ \cdots \]
ny_voos %>%
arrange(desc(dep_delay)) %>%
mutate(rank_dpdelay = min_rank(-dep_delay)) %>%
filter(rank_dpdelay %in% seq(1, 10)) %>%
select(dep_delay, rank_dpdelay) %>%
knitr::kable(col.names = c("Atraso na saÃda*","Rank")) %>%
kable_styling(full_width = FALSE,
bootstrap_options = c("striped", "hover", "condensed", "responsive")) | Atraso na saÃda* | Rank |
|---|---|
| 1301 | 1 |
| 1137 | 2 |
| 1126 | 3 |
| 1014 | 4 |
| 1005 | 5 |
| 960 | 6 |
| 911 | 7 |
| 899 | 8 |
| 898 | 9 |
| 896 | 10 |
\[ \cdots \]
ny_voos <- ny_voos %>%
mutate(air_time_mean = mean(air_time, na.rm = TRUE))Portanto, o tempo médio no ar é de 150.6864602 minutos.
\[ \cdots \]
Como a coluna dep_time está em um formato HH:MM resolvi separar essa coluna como uma string e ir selecionando cada caracter do vetor de caracteres para realizar as operações matemáticas.
vet <- c(ny_voos_mdf$dep_time) %>% as.character()
vet2 <- list()
for (i in 1:length(vet)) {
if (is.na(vet[i])) {
s <- NA
vet2[i] <- s
} else if (as.numeric(str_length(vet[i])) == 4) {
s <- (as.numeric(str_sub(vet[i], end = 2)) * 60) + as.numeric(str_sub(vet[i], start = 3))
vet2[i] <- s
} else if (as.numeric(str_length(vet[i])) == 3) {
s <- (as.numeric(str_sub(vet[i], end = 1)) * 60) + as.numeric(str_sub(vet[i], start = 2))
vet2[i] <- s
} else {
s <- as.numeric(str_sub(vet[i], start = 1))
vet2[i] <- s
}
}Acrescentando uma coluna de tempo contÃnuo em minutos no dataframe.
ny_voos_mdf <- ny_voos_mdf %>% mutate(dep_time_min = vet2)Outra maneira de resolver
ny_voos_teste <- ny_voos %>%
mutate(dp_tm_min = ((dep_time %/% 100) * 60) + dep_time %% 100)
vet_teste <- c(ny_voos_teste$dp_tm_min)
for(i in 1:length(vet_teste)) {
if(is.na(vet_teste[i])) {
vet_teste[i] <- NA
}else if(vet_teste[i] == 1440) {
vet_teste[i] <- 0
}
}
ny_voos_teste <- ny_voos_teste %>%
mutate(dp_tm_min = vet_teste)Terceira maneira de resolver
ny_voos_teste2 <- ny_voos %>%
mutate(dp_tm_min = (hour * 60) + minute + dep_delay)
vet_teste2 <- c(ny_voos_teste2$dp_tm_min)
for(i in 1:length(vet_teste2)) {
if(is.na(vet_teste2[i])) {
vet_teste2[i] <- NA
}else if(vet_teste2[i] == 1440) {
vet_teste2[i] <- 0
}else if(vet_teste2[i] > 1440) {
vet_teste2[i] <- vet_teste2[i] - 1440
}
}
ny_voos_teste2 <- ny_voos_teste2 %>%
mutate(dp_tm_min = vet_teste2)Em um novo dataframe resolvi deixar a coluna como um valor numérico e depois apresentar uma tabela, comparando os 20 primeiros dados, do tempo contÃnuo e tempo em HH:MM.
ny_voos_mdf2 <- ny_voos_mdf %>%
mutate_at(c("dep_time_min"), as.numeric)
ny_voos_mdf2 %>% select(dep_time_min, dep_time) %>% head(20) %>%
knitr::kable(col.names = c("Em minutos", "HH:MM")) %>%
kable_styling(full_width = FALSE,
bootstrap_options = c("striped", "hover", "condensed", "responsive")) | Em minutos | HH:MM |
|---|---|
| 317 | 517 |
| 333 | 533 |
| 342 | 542 |
| 344 | 544 |
| 354 | 554 |
| 354 | 554 |
| 355 | 555 |
| 357 | 557 |
| 357 | 557 |
| 358 | 558 |
| 358 | 558 |
| 358 | 558 |
| 358 | 558 |
| 358 | 558 |
| 359 | 559 |
| 359 | 559 |
| 359 | 559 |
| 360 | 600 |
| 360 | 600 |
| 361 | 601 |
\[ \cdots \]
cia <- airlinesny_voos %>%
tabyl(carrier) %>%
adorn_pct_formatting() %>%
knitr::kable(col.names = c("Companhias aéreas","Observações","Porcentagem")) %>%
kable_styling(full_width = FALSE,
bootstrap_options = c("striped", "hover", "condensed", "responsive"))| Companhias aéreas | Observações | Porcentagem |
|---|---|---|
| 9E | 18460 | 5.5% |
| AA | 32729 | 9.7% |
| AS | 714 | 0.2% |
| B6 | 54635 | 16.2% |
| DL | 48110 | 14.3% |
| EV | 54173 | 16.1% |
| F9 | 685 | 0.2% |
| FL | 3260 | 1.0% |
| HA | 342 | 0.1% |
| MQ | 26397 | 7.8% |
| OO | 32 | 0.0% |
| UA | 58665 | 17.4% |
| US | 20536 | 6.1% |
| VX | 5162 | 1.5% |
| WN | 12275 | 3.6% |
| YV | 601 | 0.2% |
atraso_cia <- ny_voos %>% group_by(carrier)
atraso_cia <- atraso_cia %>%
summarise(atr_mean = mean(dep_delay, na.rm = TRUE),
atr_med = median(dep_delay, na.rm = TRUE),
atr_sd = sd(dep_delay, na.rm = TRUE))
atraso_cia %>%
arrange(desc(atr_mean)) %>%
knitr::kable(col.names = c("Companhias aéreas", "Média de atrasos", "Mediana de Atrasos", "DP")) %>%
kable_styling(full_width = FALSE,
bootstrap_options = c("striped", "hover", "condensed", "responsive")) | Companhias aéreas | Média de atrasos | Mediana de Atrasos | DP |
|---|---|---|---|
| F9 | 20.215543 | 0.5 | 58.36265 |
| EV | 19.955390 | -1.0 | 46.55235 |
| YV | 18.996330 | -2.0 | 49.17227 |
| FL | 18.726075 | 1.0 | 52.66160 |
| WN | 17.711744 | 1.0 | 43.34435 |
| 9E | 16.725769 | -2.0 | 45.90604 |
| B6 | 13.022522 | -1.0 | 38.50337 |
| VX | 12.869421 | 0.0 | 44.81510 |
| OO | 12.586207 | -6.0 | 43.06599 |
| UA | 12.106073 | 0.0 | 35.71660 |
| MQ | 10.552041 | -3.0 | 39.18457 |
| DL | 9.264504 | -2.0 | 39.73505 |
| AA | 8.586016 | -3.0 | 37.35486 |
| AS | 5.804775 | -3.0 | 31.36303 |
| HA | 4.900585 | -4.0 | 74.10990 |
| US | 3.782418 | -4.0 | 28.05633 |
i_acumulada1 <- ggplot(ny_voos, aes(dep_delay)) +
stat_ecdf(geom = "step",
color = "blue") +
labs(x = "Atraso de voos na saÃda (em minutos)",
y = "F(x)",
title = "ECDF Atraso na saÃda de voos em Nova York")
i_acumulada1quantile(ny_voos$dep_delay, c(.60, .74, .92, .97), na.rm = TRUE) ## 60% 74% 92% 97%
## 0 10 61 120
Pelo gráfico e pelos valores da mediana podemos perceber que a maioria dos voos não tem muito atraso, o que acontece é que voos que atrasam, influenciam a média não estar próximo de 0, por serem outliers.
\[ \star \]