Extraacción y Manipulación de datos

Introducción

American Airlines está trabajando activamente en mejorar su posición competitiva en el mercado. Para lograr este objetivo, es fundamental llevar a cabo una evaluación exhaustiva de sus competidores. Esta evaluación ayudará a asegurar posiciones destacadas de liderazgo dentro del mercado. Nuestra empresa de Inteligencia de Negocios está preparada para realizar un análisis detallado de factores cruciales para la industria de las aerolíneas. Estos abarcan una comprensión detallada de distancias de vuelo, patrones de tráfico aéreo, rutas, duración de vuelos, así como orígenes y destinos de vuelos para cada aerolínea en particular.

El análisis se llevará a cabo utilizando comandos provenientes de la biblioteca nycflights13, integrada en nuestro software de análisis. Dentro de esta biblioteca, se empleará el completo paquete tidyverse, que incluye tibble, tidyr y dplyr. Especialmente, dplyr desempeñará un papel fundamental, permitiendo la transformación eficiente de objetos de datos y la obtención de resúmenes concisos de la información. Este proceso de simplificación resulta crucial para facilitar el análisis de la información de manera efectiva.

Desarrollo

Exploración de datos

1. Consulta de data frames Para iniciar nuestro análisis y obtener una visión panorámica de la situación, procederemos a explorar en detalle cada uno de los cinco conjuntos de datos que conforman nuestra base de datos. Esto se llevará a cabo mediante la ejecución de una serie de comandos descriptivos, diseñados para proporcionar información valiosa sobre la estructura y contenido de los datos.

Dentro de los comandos que utilizaremos se encuentran:

  • data() - Este comando se emplea para cargar la base de datos y ponerla a disposición para su manipulación.

  • str() - Al utilizar este comando, obtendremos una descripción detallada del data frame, lo que incluirá la cantidad de columnas y filas presentes, así como los tipos de variables que contiene.

  • ncol() - Al aplicar este comando, podremos determinar con precisión cuántas columnas conforman cada data frame.

  • nrow() - Al ejecutar este comando, obtendremos el número total de filas en cada conjunto de datos.

  • dim() - Mediante este comando, accederemos a las dimensiones completas de los data frames, proporcionando una perspectiva más completa al mostrar tanto la cantidad de filas como de columnas.

  • View() - Utilizaremos este comando para abrir una ventana gráfica adicional que permitirá una visualización más cómoda y detallada de toda la tabla.

  • head() - Al aplicar este comando, se nos mostrarán los primeros 6 registros de cada data frame, lo que brindará un vistazo inicial a los datos.

  • tail() - Este comando nos presentará los últimos 6 registros de cada data frame, complementando la vista previa inicial.

  • summary() - Al ejecutar este comando, obtendremos un resumen estadístico de cada columna presente en los data frames, proporcionando una comprensión más profunda de los valores y tendencias dentro de los datos.

Esta combinación de comandos descriptivos nos permitirá no solo entender la estructura de la base de datos, sino también obtener una idea más clara de los contenidos y las posibles pautas que podrían emerger a medida que profundicemos en el análisis.

Base de datos: Flights

library(nycflights13)
library(dplyr)
## 
## Attaching package: 'dplyr'
## The following objects are masked from 'package:stats':
## 
##     filter, lag
## The following objects are masked from 'package:base':
## 
##     intersect, setdiff, setequal, union
library(ggplot2)
library(tidyverse)
## ── Attaching core tidyverse packages ──────────────────────── tidyverse 2.0.0 ──
## ✔ forcats   1.0.0     ✔ stringr   1.5.0
## ✔ lubridate 1.9.2     ✔ tibble    3.2.1
## ✔ purrr     1.0.2     ✔ tidyr     1.3.0
## ✔ readr     2.1.4
## ── 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
data.frame("flights")
str(flights)
## tibble [336,776 × 19] (S3: tbl_df/tbl/data.frame)
##  $ year          : int [1:336776] 2013 2013 2013 2013 2013 2013 2013 2013 2013 2013 ...
##  $ month         : int [1:336776] 1 1 1 1 1 1 1 1 1 1 ...
##  $ day           : int [1:336776] 1 1 1 1 1 1 1 1 1 1 ...
##  $ dep_time      : int [1:336776] 517 533 542 544 554 554 555 557 557 558 ...
##  $ sched_dep_time: int [1:336776] 515 529 540 545 600 558 600 600 600 600 ...
##  $ dep_delay     : num [1:336776] 2 4 2 -1 -6 -4 -5 -3 -3 -2 ...
##  $ arr_time      : int [1:336776] 830 850 923 1004 812 740 913 709 838 753 ...
##  $ sched_arr_time: int [1:336776] 819 830 850 1022 837 728 854 723 846 745 ...
##  $ arr_delay     : num [1:336776] 11 20 33 -18 -25 12 19 -14 -8 8 ...
##  $ carrier       : chr [1:336776] "UA" "UA" "AA" "B6" ...
##  $ flight        : int [1:336776] 1545 1714 1141 725 461 1696 507 5708 79 301 ...
##  $ tailnum       : chr [1:336776] "N14228" "N24211" "N619AA" "N804JB" ...
##  $ origin        : chr [1:336776] "EWR" "LGA" "JFK" "JFK" ...
##  $ dest          : chr [1:336776] "IAH" "IAH" "MIA" "BQN" ...
##  $ air_time      : num [1:336776] 227 227 160 183 116 150 158 53 140 138 ...
##  $ distance      : num [1:336776] 1400 1416 1089 1576 762 ...
##  $ hour          : num [1:336776] 5 5 5 5 6 5 6 6 6 6 ...
##  $ minute        : num [1:336776] 15 29 40 45 0 58 0 0 0 0 ...
##  $ time_hour     : POSIXct[1:336776], format: "2013-01-01 05:00:00" "2013-01-01 05:00:00" ...

En la base de datos tenemos variables tipo: - Númerico - Entero - Carácter

col <- ncol(flights)
print(paste("Tenemos", col, "columnas en el data frame"))
## [1] "Tenemos 19 columnas en el data frame"
row<- nrow(flights)
print(paste("Tenemos", row, "columnas en el data frame"))
## [1] "Tenemos 336776 columnas en el data frame"
dimen<- dim(flights)
print(paste("Tenemos", dimen, "columnas en el data frame"))
## [1] "Tenemos 336776 columnas en el data frame"
## [2] "Tenemos 19 columnas en el data frame"
print(flights)
## # A tibble: 336,776 × 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
## # ℹ 336,766 more rows
## # ℹ 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>
head(flights)
tail(flights)   
summary(flights)
##       year          month             day           dep_time    sched_dep_time
##  Min.   :2013   Min.   : 1.000   Min.   : 1.00   Min.   :   1   Min.   : 106  
##  1st Qu.:2013   1st Qu.: 4.000   1st Qu.: 8.00   1st Qu.: 907   1st Qu.: 906  
##  Median :2013   Median : 7.000   Median :16.00   Median :1401   Median :1359  
##  Mean   :2013   Mean   : 6.549   Mean   :15.71   Mean   :1349   Mean   :1344  
##  3rd Qu.:2013   3rd Qu.:10.000   3rd Qu.:23.00   3rd Qu.:1744   3rd Qu.:1729  
##  Max.   :2013   Max.   :12.000   Max.   :31.00   Max.   :2400   Max.   :2359  
##                                                  NA's   :8255                 
##    dep_delay          arr_time    sched_arr_time   arr_delay       
##  Min.   : -43.00   Min.   :   1   Min.   :   1   Min.   : -86.000  
##  1st Qu.:  -5.00   1st Qu.:1104   1st Qu.:1124   1st Qu.: -17.000  
##  Median :  -2.00   Median :1535   Median :1556   Median :  -5.000  
##  Mean   :  12.64   Mean   :1502   Mean   :1536   Mean   :   6.895  
##  3rd Qu.:  11.00   3rd Qu.:1940   3rd Qu.:1945   3rd Qu.:  14.000  
##  Max.   :1301.00   Max.   :2400   Max.   :2359   Max.   :1272.000  
##  NA's   :8255      NA's   :8713                  NA's   :9430      
##    carrier              flight       tailnum             origin         
##  Length:336776      Min.   :   1   Length:336776      Length:336776     
##  Class :character   1st Qu.: 553   Class :character   Class :character  
##  Mode  :character   Median :1496   Mode  :character   Mode  :character  
##                     Mean   :1972                                        
##                     3rd Qu.:3465                                        
##                     Max.   :8500                                        
##                                                                         
##      dest              air_time        distance         hour      
##  Length:336776      Min.   : 20.0   Min.   :  17   Min.   : 1.00  
##  Class :character   1st Qu.: 82.0   1st Qu.: 502   1st Qu.: 9.00  
##  Mode  :character   Median :129.0   Median : 872   Median :13.00  
##                     Mean   :150.7   Mean   :1040   Mean   :13.18  
##                     3rd Qu.:192.0   3rd Qu.:1389   3rd Qu.:17.00  
##                     Max.   :695.0   Max.   :4983   Max.   :23.00  
##                     NA's   :9430                                  
##      minute        time_hour                     
##  Min.   : 0.00   Min.   :2013-01-01 05:00:00.00  
##  1st Qu.: 8.00   1st Qu.:2013-04-04 13:00:00.00  
##  Median :29.00   Median :2013-07-03 10:00:00.00  
##  Mean   :26.23   Mean   :2013-07-03 05:22:54.64  
##  3rd Qu.:44.00   3rd Qu.:2013-10-01 07:00:00.00  
##  Max.   :59.00   Max.   :2013-12-31 23:00:00.00  
## 

Base de datos: Airports

data.frame("airports")
str(airports)
## tibble [1,458 × 8] (S3: tbl_df/tbl/data.frame)
##  $ faa  : chr [1:1458] "04G" "06A" "06C" "06N" ...
##  $ name : chr [1:1458] "Lansdowne Airport" "Moton Field Municipal Airport" "Schaumburg Regional" "Randall Airport" ...
##  $ lat  : num [1:1458] 41.1 32.5 42 41.4 31.1 ...
##  $ lon  : num [1:1458] -80.6 -85.7 -88.1 -74.4 -81.4 ...
##  $ alt  : num [1:1458] 1044 264 801 523 11 ...
##  $ tz   : num [1:1458] -5 -6 -6 -5 -5 -5 -5 -5 -5 -8 ...
##  $ dst  : chr [1:1458] "A" "A" "A" "A" ...
##  $ tzone: chr [1:1458] "America/New_York" "America/Chicago" "America/Chicago" "America/New_York" ...
##  - attr(*, "spec")=
##   .. cols(
##   ..   id = col_double(),
##   ..   name = col_character(),
##   ..   city = col_character(),
##   ..   country = col_character(),
##   ..   faa = col_character(),
##   ..   icao = col_character(),
##   ..   lat = col_double(),
##   ..   lon = col_double(),
##   ..   alt = col_double(),
##   ..   tz = col_double(),
##   ..   dst = col_character(),
##   ..   tzone = col_character()
##   .. )

En la base de datos tenemos variables tipo: - Númerico - Carácter

col <- ncol(airports)
print(paste("Tenemos", col, "columnas en el data frame"))
## [1] "Tenemos 8 columnas en el data frame"
row<- nrow(airports)
print(paste("Tenemos", row, "columnas en el data frame"))
## [1] "Tenemos 1458 columnas en el data frame"
dimen<- dim(airports)
print(paste("Tenemos", dimen, "columnas en el data frame"))
## [1] "Tenemos 1458 columnas en el data frame"
## [2] "Tenemos 8 columnas en el data frame"
print(airports)
## # A tibble: 1,458 × 8
##    faa   name                             lat    lon   alt    tz dst   tzone    
##    <chr> <chr>                          <dbl>  <dbl> <dbl> <dbl> <chr> <chr>    
##  1 04G   Lansdowne Airport               41.1  -80.6  1044    -5 A     America/…
##  2 06A   Moton Field Municipal Airport   32.5  -85.7   264    -6 A     America/…
##  3 06C   Schaumburg Regional             42.0  -88.1   801    -6 A     America/…
##  4 06N   Randall Airport                 41.4  -74.4   523    -5 A     America/…
##  5 09J   Jekyll Island Airport           31.1  -81.4    11    -5 A     America/…
##  6 0A9   Elizabethton Municipal Airport  36.4  -82.2  1593    -5 A     America/…
##  7 0G6   Williams County Airport         41.5  -84.5   730    -5 A     America/…
##  8 0G7   Finger Lakes Regional Airport   42.9  -76.8   492    -5 A     America/…
##  9 0P2   Shoestring Aviation Airfield    39.8  -76.6  1000    -5 U     America/…
## 10 0S9   Jefferson County Intl           48.1 -123.    108    -8 A     America/…
## # ℹ 1,448 more rows
head(airports)
tail(airports)
summary(airports)
##      faa                name                lat             lon         
##  Length:1458        Length:1458        Min.   :19.72   Min.   :-176.65  
##  Class :character   Class :character   1st Qu.:34.26   1st Qu.:-119.19  
##  Mode  :character   Mode  :character   Median :40.09   Median : -94.66  
##                                        Mean   :41.65   Mean   :-103.39  
##                                        3rd Qu.:45.07   3rd Qu.: -82.52  
##                                        Max.   :72.27   Max.   : 174.11  
##       alt                tz              dst               tzone          
##  Min.   : -54.00   Min.   :-10.000   Length:1458        Length:1458       
##  1st Qu.:  70.25   1st Qu.: -8.000   Class :character   Class :character  
##  Median : 473.00   Median : -6.000   Mode  :character   Mode  :character  
##  Mean   :1001.42   Mean   : -6.519                                        
##  3rd Qu.:1062.50   3rd Qu.: -5.000                                        
##  Max.   :9078.00   Max.   :  8.000

Base de datos: Weather

data.frame("weather")
str(weather)
## tibble [26,115 × 15] (S3: tbl_df/tbl/data.frame)
##  $ origin    : chr [1:26115] "EWR" "EWR" "EWR" "EWR" ...
##  $ year      : int [1:26115] 2013 2013 2013 2013 2013 2013 2013 2013 2013 2013 ...
##  $ month     : int [1:26115] 1 1 1 1 1 1 1 1 1 1 ...
##  $ day       : int [1:26115] 1 1 1 1 1 1 1 1 1 1 ...
##  $ hour      : int [1:26115] 1 2 3 4 5 6 7 8 9 10 ...
##  $ temp      : num [1:26115] 39 39 39 39.9 39 ...
##  $ dewp      : num [1:26115] 26.1 27 28 28 28 ...
##  $ humid     : num [1:26115] 59.4 61.6 64.4 62.2 64.4 ...
##  $ wind_dir  : num [1:26115] 270 250 240 250 260 240 240 250 260 260 ...
##  $ wind_speed: num [1:26115] 10.36 8.06 11.51 12.66 12.66 ...
##  $ wind_gust : num [1:26115] NA NA NA NA NA NA NA NA NA NA ...
##  $ precip    : num [1:26115] 0 0 0 0 0 0 0 0 0 0 ...
##  $ pressure  : num [1:26115] 1012 1012 1012 1012 1012 ...
##  $ visib     : num [1:26115] 10 10 10 10 10 10 10 10 10 10 ...
##  $ time_hour : POSIXct[1:26115], format: "2013-01-01 01:00:00" "2013-01-01 02:00:00" ...

En la base de datos tenemos variables tipo: - Númerico - Entero - Carácter

col <- ncol(weather)
print(paste("Tenemos", col, "columnas en el data frame"))
## [1] "Tenemos 15 columnas en el data frame"
row<- nrow(weather)
print(paste("Tenemos", row, "columnas en el data frame"))
## [1] "Tenemos 26115 columnas en el data frame"
dimen<- dim(weather)
print(paste("Tenemos", dimen, "columnas en el data frame"))
## [1] "Tenemos 26115 columnas en el data frame"
## [2] "Tenemos 15 columnas en el data frame"
print(weather)
## # A tibble: 26,115 × 15
##    origin  year month   day  hour  temp  dewp humid wind_dir wind_speed
##    <chr>  <int> <int> <int> <int> <dbl> <dbl> <dbl>    <dbl>      <dbl>
##  1 EWR     2013     1     1     1  39.0  26.1  59.4      270      10.4 
##  2 EWR     2013     1     1     2  39.0  27.0  61.6      250       8.06
##  3 EWR     2013     1     1     3  39.0  28.0  64.4      240      11.5 
##  4 EWR     2013     1     1     4  39.9  28.0  62.2      250      12.7 
##  5 EWR     2013     1     1     5  39.0  28.0  64.4      260      12.7 
##  6 EWR     2013     1     1     6  37.9  28.0  67.2      240      11.5 
##  7 EWR     2013     1     1     7  39.0  28.0  64.4      240      15.0 
##  8 EWR     2013     1     1     8  39.9  28.0  62.2      250      10.4 
##  9 EWR     2013     1     1     9  39.9  28.0  62.2      260      15.0 
## 10 EWR     2013     1     1    10  41    28.0  59.6      260      13.8 
## # ℹ 26,105 more rows
## # ℹ 5 more variables: wind_gust <dbl>, precip <dbl>, pressure <dbl>,
## #   visib <dbl>, time_hour <dttm>
  head(weather)
tail(weather)
summary(weather)
##     origin               year          month             day       
##  Length:26115       Min.   :2013   Min.   : 1.000   Min.   : 1.00  
##  Class :character   1st Qu.:2013   1st Qu.: 4.000   1st Qu.: 8.00  
##  Mode  :character   Median :2013   Median : 7.000   Median :16.00  
##                     Mean   :2013   Mean   : 6.504   Mean   :15.68  
##                     3rd Qu.:2013   3rd Qu.: 9.000   3rd Qu.:23.00  
##                     Max.   :2013   Max.   :12.000   Max.   :31.00  
##                                                                    
##       hour            temp             dewp           humid       
##  Min.   : 0.00   Min.   : 10.94   Min.   :-9.94   Min.   : 12.74  
##  1st Qu.: 6.00   1st Qu.: 39.92   1st Qu.:26.06   1st Qu.: 47.05  
##  Median :11.00   Median : 55.40   Median :42.08   Median : 61.79  
##  Mean   :11.49   Mean   : 55.26   Mean   :41.44   Mean   : 62.53  
##  3rd Qu.:17.00   3rd Qu.: 69.98   3rd Qu.:57.92   3rd Qu.: 78.79  
##  Max.   :23.00   Max.   :100.04   Max.   :78.08   Max.   :100.00  
##                  NA's   :1        NA's   :1       NA's   :1       
##     wind_dir       wind_speed         wind_gust         precip        
##  Min.   :  0.0   Min.   :   0.000   Min.   :16.11   Min.   :0.000000  
##  1st Qu.:120.0   1st Qu.:   6.905   1st Qu.:20.71   1st Qu.:0.000000  
##  Median :220.0   Median :  10.357   Median :24.17   Median :0.000000  
##  Mean   :199.8   Mean   :  10.518   Mean   :25.49   Mean   :0.004469  
##  3rd Qu.:290.0   3rd Qu.:  13.809   3rd Qu.:28.77   3rd Qu.:0.000000  
##  Max.   :360.0   Max.   :1048.361   Max.   :66.75   Max.   :1.210000  
##  NA's   :460     NA's   :4          NA's   :20778                     
##     pressure          visib          time_hour                    
##  Min.   : 983.8   Min.   : 0.000   Min.   :2013-01-01 01:00:00.0  
##  1st Qu.:1012.9   1st Qu.:10.000   1st Qu.:2013-04-01 21:30:00.0  
##  Median :1017.6   Median :10.000   Median :2013-07-01 14:00:00.0  
##  Mean   :1017.9   Mean   : 9.255   Mean   :2013-07-01 18:26:37.7  
##  3rd Qu.:1023.0   3rd Qu.:10.000   3rd Qu.:2013-09-30 13:00:00.0  
##  Max.   :1042.1   Max.   :10.000   Max.   :2013-12-30 18:00:00.0  
##  NA's   :2729

Base de datos: Planes

data.frame("planes")
str(planes)
## tibble [3,322 × 9] (S3: tbl_df/tbl/data.frame)
##  $ tailnum     : chr [1:3322] "N10156" "N102UW" "N103US" "N104UW" ...
##  $ year        : int [1:3322] 2004 1998 1999 1999 2002 1999 1999 1999 1999 1999 ...
##  $ type        : chr [1:3322] "Fixed wing multi engine" "Fixed wing multi engine" "Fixed wing multi engine" "Fixed wing multi engine" ...
##  $ manufacturer: chr [1:3322] "EMBRAER" "AIRBUS INDUSTRIE" "AIRBUS INDUSTRIE" "AIRBUS INDUSTRIE" ...
##  $ model       : chr [1:3322] "EMB-145XR" "A320-214" "A320-214" "A320-214" ...
##  $ engines     : int [1:3322] 2 2 2 2 2 2 2 2 2 2 ...
##  $ seats       : int [1:3322] 55 182 182 182 55 182 182 182 182 182 ...
##  $ speed       : int [1:3322] NA NA NA NA NA NA NA NA NA NA ...
##  $ engine      : chr [1:3322] "Turbo-fan" "Turbo-fan" "Turbo-fan" "Turbo-fan" ...

En la base de datos tenemos variables tipo: - Entero - Carácter

col <- ncol(planes)
print(paste("Tenemos", col, "columnas en el data frame"))
## [1] "Tenemos 9 columnas en el data frame"
row<- nrow(planes)
print(paste("Tenemos", row, "columnas en el data frame"))
## [1] "Tenemos 3322 columnas en el data frame"
dimen<- dim(planes)
print(paste("Tenemos", dimen, "columnas en el data frame"))
## [1] "Tenemos 3322 columnas en el data frame"
## [2] "Tenemos 9 columnas en el data frame"
print(planes)
## # A tibble: 3,322 × 9
##    tailnum  year type              manufacturer model engines seats speed engine
##    <chr>   <int> <chr>             <chr>        <chr>   <int> <int> <int> <chr> 
##  1 N10156   2004 Fixed wing multi… EMBRAER      EMB-…       2    55    NA Turbo…
##  2 N102UW   1998 Fixed wing multi… AIRBUS INDU… A320…       2   182    NA Turbo…
##  3 N103US   1999 Fixed wing multi… AIRBUS INDU… A320…       2   182    NA Turbo…
##  4 N104UW   1999 Fixed wing multi… AIRBUS INDU… A320…       2   182    NA Turbo…
##  5 N10575   2002 Fixed wing multi… EMBRAER      EMB-…       2    55    NA Turbo…
##  6 N105UW   1999 Fixed wing multi… AIRBUS INDU… A320…       2   182    NA Turbo…
##  7 N107US   1999 Fixed wing multi… AIRBUS INDU… A320…       2   182    NA Turbo…
##  8 N108UW   1999 Fixed wing multi… AIRBUS INDU… A320…       2   182    NA Turbo…
##  9 N109UW   1999 Fixed wing multi… AIRBUS INDU… A320…       2   182    NA Turbo…
## 10 N110UW   1999 Fixed wing multi… AIRBUS INDU… A320…       2   182    NA Turbo…
## # ℹ 3,312 more rows
head(planes)
tail(planes)
summary(planes)
##    tailnum               year          type           manufacturer      
##  Length:3322        Min.   :1956   Length:3322        Length:3322       
##  Class :character   1st Qu.:1997   Class :character   Class :character  
##  Mode  :character   Median :2001   Mode  :character   Mode  :character  
##                     Mean   :2000                                        
##                     3rd Qu.:2005                                        
##                     Max.   :2013                                        
##                     NA's   :70                                          
##     model              engines          seats           speed      
##  Length:3322        Min.   :1.000   Min.   :  2.0   Min.   : 90.0  
##  Class :character   1st Qu.:2.000   1st Qu.:140.0   1st Qu.:107.5  
##  Mode  :character   Median :2.000   Median :149.0   Median :162.0  
##                     Mean   :1.995   Mean   :154.3   Mean   :236.8  
##                     3rd Qu.:2.000   3rd Qu.:182.0   3rd Qu.:432.0  
##                     Max.   :4.000   Max.   :450.0   Max.   :432.0  
##                                                     NA's   :3299   
##     engine         
##  Length:3322       
##  Class :character  
##  Mode  :character  
##                    
##                    
##                    
## 

Data frame “airlines”

data.frame("airlines")
str(airlines)
## tibble [16 × 2] (S3: tbl_df/tbl/data.frame)
##  $ carrier: chr [1:16] "9E" "AA" "AS" "B6" ...
##  $ name   : chr [1:16] "Endeavor Air Inc." "American Airlines Inc." "Alaska Airlines Inc." "JetBlue Airways" ...

En la base de datos tenemos variables tipo: - Carácter

col <- ncol(airlines)
print(paste("Tenemos", col, "columnas en el data frame"))
## [1] "Tenemos 2 columnas en el data frame"
row<- nrow(airlines)
print(paste("Tenemos", row, "columnas en el data frame"))
## [1] "Tenemos 16 columnas en el data frame"
dimen<- dim(airlines)
print(paste("Tenemos", dimen, "columnas en el data frame"))
## [1] "Tenemos 16 columnas en el data frame"
## [2] "Tenemos 2 columnas en el data frame"
print(airlines)
## # A tibble: 16 × 2
##    carrier name                       
##    <chr>   <chr>                      
##  1 9E      Endeavor Air Inc.          
##  2 AA      American Airlines Inc.     
##  3 AS      Alaska Airlines Inc.       
##  4 B6      JetBlue Airways            
##  5 DL      Delta Air Lines Inc.       
##  6 EV      ExpressJet Airlines Inc.   
##  7 F9      Frontier Airlines Inc.     
##  8 FL      AirTran Airways Corporation
##  9 HA      Hawaiian Airlines Inc.     
## 10 MQ      Envoy Air                  
## 11 OO      SkyWest Airlines Inc.      
## 12 UA      United Air Lines Inc.      
## 13 US      US Airways Inc.            
## 14 VX      Virgin America             
## 15 WN      Southwest Airlines Co.     
## 16 YV      Mesa Airlines Inc.
head(airlines)
tail(airlines)
summary(airlines)
##    carrier              name          
##  Length:16          Length:16         
##  Class :character   Class :character  
##  Mode  :character   Mode  :character

Manipulación de datos

2. Consulta el data frame flights para recordar su contenido.

print(flights)
## # A tibble: 336,776 × 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
## # ℹ 336,766 more rows
## # ℹ 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>

3. Consulta de los descriptivos de las distancias.

descripcion <- select(flights, distance) 
descripcion
summary(descripcion)
##     distance   
##  Min.   :  17  
##  1st Qu.: 502  
##  Median : 872  
##  Mean   :1040  
##  3rd Qu.:1389  
##  Max.   :4983

El código proporcionado realiza las siguientes acciones:

  • Imprime el contenido completo del data frame flights.
  • Se crea un nuevo objeto llamado descripcion utilizando la función select(). Esta función selecciona la columna distance del data frame flights y almacena el resultado en el objeto descripcion.
  • Se imprime el contenido del objeto descripcion, lo que mostrará únicamente la columna distance del data frame original.
  • Finalmente, se utiliza la función summary() para generar un resumen estadístico de la columna distance contenida en el objeto descripcion.

Encontrando aerolíneas que han recorrido más distancia (en millas).

4. Consulta para encontrar la suma y la media de las distancias recorridas por aerolínea

distancias <- flights %>% group_by(carrier) %>%
 
summarize(suma = sum(distance, na.rm = TRUE), media = mean(distance, na.rm = TRUE))
print(distancias)
## # A tibble: 16 × 3
##    carrier     suma media
##    <chr>      <dbl> <dbl>
##  1 9E       9788152  530.
##  2 AA      43864584 1340.
##  3 AS       1715028 2402 
##  4 B6      58384137 1069.
##  5 DL      59507317 1237.
##  6 EV      30498951  563.
##  7 F9       1109700 1620 
##  8 FL       2167344  665.
##  9 HA       1704186 4983 
## 10 MQ      15033955  570.
## 11 OO         16026  501.
## 12 UA      89705524 1529.
## 13 US      11365778  553.
## 14 VX      12902327 2499.
## 15 WN      12229203  996.
## 16 YV        225395  375.

El código proporcionado realiza las siguientes acciones:

  • Toma el data frame flights.
  • Usa el operador %>% (pipe) para encadenar varias operaciones.
  • Con la función group_by(carrier), agrupa los datos por la columna “carrier” (nombre de la aerolínea).
  • Luego, con la función summarize(), para cada grupo (aerolínea), realiza dos cálculos: 1.- Calcula la suma total de las distancias de vuelo utilizando sum(distance, na.rm = TRUE). El argumento na.rm = TRUE se utiliza para ignorar los valores faltantes (NA) al calcular la suma. 2.- Calcula la media de las distancias de vuelo utilizando mean(distance, na.rm = TRUE). Al igual que antes, el argumento na.rm = TRUE permite calcular la media sin tener en cuenta los valores faltantes. 3.- Asigna los resultados de los cálculos a dos nuevas columnas llamadas “suma” y “media” en el resultado final.
  • Finalmente, se imprime el nuevo data frame resultante llamado distancias.

5. Consulta para calcular la media de distancias para filtrar

mediatotal <- mean(distancias$suma, na.rm = TRUE) 
print(mediatotal)
## [1] 21888600

El código realiza lo siguiente:

  • Calcula la media de los valores en la columna “suma” del data frame distancias utilizando la función mean(). El argumento na.rm = TRUE se utiliza para excluir los valores faltantes (NA) en el cálculo de la media.
  • Almacena el resultado del cálculo en la variable mediatotal.
  • Imprime el valor almacenado en la variable mediatotal.

6. Consulta para filtrar las aerolíneas con suma de distancia superior a la media.

filtroaero <- distancias %>% 
filter(suma > mediatotal) 
print(filtroaero)
## # A tibble: 5 × 3
##   carrier     suma media
##   <chr>      <dbl> <dbl>
## 1 AA      43864584 1340.
## 2 B6      58384137 1069.
## 3 DL      59507317 1237.
## 4 EV      30498951  563.
## 5 UA      89705524 1529.

El código realiza lo siguiente: - Toma el data frame distancias, que contiene las estadísticas de suma y media de distancias de vuelo por aerolínea. - Utiliza el operador %>% (pipe) para encadenar operaciones. Con la función filter(), selecciona las filas del data frame donde el valor de la columna “suma” sea mayor que el valor almacenado en la variable mediatotal. - Almacena los resultados filtrados en un nuevo data frame llamado filtroaero. - Finalmente, imprime el nuevo data frame filtroaero, que contiene las filas de distancias que cumplen con el criterio de que la suma de distancias es mayor que la media total calculada previamente.

7. Consulta para filtrar el data frame flights por las aerolíneas filtradas y selección de las columnas carrier, distance, origin, dest para un nuevo dataframe.

finalaero <- flights %>%
  filter(carrier %in% filtroaero$carrier) %>%
  select(carrier, distance, origin, dest) %>%
  arrange(desc(distance))
print(finalaero)
## # A tibble: 248,312 × 4
##    carrier distance origin dest 
##    <chr>      <dbl> <chr>  <chr>
##  1 UA          4963 EWR    HNL  
##  2 UA          4963 EWR    HNL  
##  3 UA          4963 EWR    HNL  
##  4 UA          4963 EWR    HNL  
##  5 UA          4963 EWR    HNL  
##  6 UA          4963 EWR    HNL  
##  7 UA          4963 EWR    HNL  
##  8 UA          4963 EWR    HNL  
##  9 UA          4963 EWR    HNL  
## 10 UA          4963 EWR    HNL  
## # ℹ 248,302 more rows

El código realiza lo siguiente:

  • Toma el data frame flights.
  • Utiliza el operador %>% (pipe) para encadenar una serie de operaciones.
  • Con la función filter(), filtra las filas del data frame donde el valor en la columna “carrier” coincida con los valores presentes en la columna “carrier” del data frame filtroaero (que fue creado previamente).
  • Utiliza la función select() para mantener solamente las columnas “carrier” (aerolínea), “distance” (distancia de vuelo), “origin” (origen) y “dest” (destino).
  • Ordena las filas del data frame resultante de manera descendente por la columna “distance”.
  • Almacena el resultado en un nuevo data frame llamado finalaero.
  • Finalmente, imprime el nuevo data frame finalaero.

Identificando aerolíneas líderes en New York

8. Consulta para identificar si las aerolíneas líderes son las mismas en los tres aeropuertos cuyo origen es Nueva York ( John F. Kennedy (JFK), LaGuardia (LGA) and Newark Liberty (EWR) . Genera un data frame para cada aeropuerto.

Para determinar estas principales empresas, seguiremos un proceso uniforme para cada aeropuerto:

  1. Crearemos un nuevo marco de datos utilizando las siglas del aeropuerto en cuestión.
  2. Filtraremos los vuelos de salida correspondientes a cada aeropuerto.
  3. Agruparemos los datos por compañía aérea.
  4. Realizaremos un recuento de los datos que cumplan con el filtro y los ordenaremos de mayor a menor.
  5. Modificaremos el nombre del campo “n” a “n.flights”.
  6. Seleccionaremos únicamente los primeros 6 resultados, que son precisamente los que constituyen el grupo de interés: ¡las principales empresas que estamos buscando!

Top aerolineas x aeropuerto

JFK <- flights %>%
  filter(origin == "JFK") %>% 
  group_by(carrier) %>% 
  count() %>% 
  arrange(desc(n)) %>% 
  rename(n.flights = n) %>%
  head()

print(JFK) 
## # A tibble: 6 × 2
## # Groups:   carrier [6]
##   carrier n.flights
##   <chr>       <int>
## 1 B6          42076
## 2 DL          20701
## 3 9E          14651
## 4 AA          13783
## 5 MQ           7193
## 6 UA           4534

En el ranking, la aerolínea JetBlue Airways (código B6) ocupa el primer lugar, habiendo completado 42,076 vuelos desde el Aeropuerto LaGuardia. Por otro lado, American Airlines se posiciona en el cuarto puesto, habiendo llevado a cabo 13,783 vuelos desde el Aeropuerto John F. Kennedy.

LGA <- flights %>%
  filter(origin == "LGA") %>% 
  group_by(carrier) %>% 
  count() %>% 
  arrange(desc(n)) %>% 
  rename(n.flights = n) %>%
  head()

print(LGA) 
## # A tibble: 6 × 2
## # Groups:   carrier [6]
##   carrier n.flights
##   <chr>       <int>
## 1 DL          23067
## 2 MQ          16928
## 3 AA          15459
## 4 US          13136
## 5 EV           8826
## 6 UA           8044

Delta Air Lines Inc. lidera el ranking con 23,067 vuelos desde el Aeropuerto LaGuardia, ocupando la primera posición. En cambio, American Airlines está en la tercera posición, habiendo realizado 15,459 vuelos también desde el Aeropuerto LaGuardia.

EWR <- flights %>%
  filter(origin == "EWR") %>% 
  group_by(carrier) %>% 
  count() %>% 
  arrange(desc(n)) %>% 
  rename(n.flights = n) %>%
  head()

print(EWR) 
## # A tibble: 6 × 2
## # Groups:   carrier [6]
##   carrier n.flights
##   <chr>       <int>
## 1 UA          46087
## 2 EV          43939
## 3 B6           6557
## 4 WN           6188
## 5 US           4405
## 6 DL           4342

United Air Lines Inc. encabeza la lista con 46,087 vuelos desde el Aeropuerto LaGuardia, ocupando el primer puesto. Sin embargo, es importante señalar que American Airlines no figura entre las seis principales posiciones en el Aeropuerto Newark Liberty.

Conclusión

Los descubrimientos más significativos en nuestro informe indican que American Airlines registra una suma total de distancia de 43,864,584 millas y un promedio de 1,340.236 millas, ubicándola entre las empresas que superan la media total de 21,888,600 millas recorridas.

Dentro del mercado, American Airlines lidera en dos de los tres aeropuertos de la ciudad de Nueva York. En el Aeropuerto LaGuardia, ocupa la tercera posición con 15,459 vuelos, mientras que en el Aeropuerto John F. Kennedy, se ubica en el cuarto lugar con 13,783 vuelos. Sin embargo, en el caso del Aeropuerto Newark Liberty, la compañía no se encuentra entre las seis primeras posiciones. Sus competidores más fuertes en esta área son JetBlue Airways, United Air Lines Inc. y Delta Air Lines Inc.

Estos resultados resaltan una oportunidad de mejora, ya que además de enfocarse en avanzar en las posiciones de los dos primeros aeropuertos, la compañía enfrenta el reto de alcanzar un puesto destacado en el último aeropuerto.

Este proceso de manipulación y análisis de datos nos proporciona una perspectiva valiosa. Nos ayuda a comprender nuestra trayectoria y nos guía hacia nuestras metas como empresa, al brindarnos una comprensión profunda de los datos que generamos en nuestras operaciones diarias

Bibliografía de referencias

Wickham, H. and Grolemund, G. (2017) R for Data Science: Import, Tidy, Transform, Visualize, and Model Data O’Reilly Media: Sebastopol, California

Nycflights13 v1.0.0 https://www.rdocumentation.org/packages/nycflights13/versions/1.0.0