Datos de aeropuertos en Europa

TRANSPORTE
AEROPUERTOS
EUROPA
CÓDIGOS ICAO
Autor/a
Afiliación

Sofía Gómez Alcañiz

Universitat de València

Fecha de publicación

10 de mayo de 2024

Input

La base de datos seleccionada se enfoca en los aeropuertos europeos durante el año 2013. Estos datos, extraídos de Eurostat, están disponibles para su descarga en formatos GDP y SHP dentro de un archivo comprimido ZIP. La base de datos cuenta con 25 variables distintas y abarca 2,847 observaciones en total. Entre las variables más relevantes se encuentran el código ICAO del aeropuerto (AIPR_ICAO), el nombre del aeropuerto (AIRP_NAME), el código del país (CNTR_CODE), y detalles operacionales como la existencia de facilidades para vuelos IFR (IFR) y VFR (VFR), además de las coordenadas geográficas de cada ubicación.

A continuación se muestra un resumen de la base de datos:

  • Tema: Transporte

  • Cobertura geográfica: Europa

  • Fecha de lanzamiento: 2014

  • Frequencia de actualización: irregular

  • Fuente de los datos: Recopilados por Eurostat mediante encuestas y colaboraciones con administraciones nacionales de transporte.

  • Acceso a los datos: Acceso libre bajo licencia especificada en la plataforma de descarga.

  • Formato: SHP

Descripción

Preparación de los datos

Para comenzar el análisis de la base de datos de aeropuertos europeos, es esencial preparar el entorno en R instalando y cargando las librerías necesarias. Utilizamos sf para la manipulación de datos geográficos, ggplot2 para la visualización, dplyr para la manipulación de datos, y leaflet para mapas interactivos. Además, instalamos rnaturalearth y rnaturalearthdata para acceder a mapas de alta calidad que incluyen los límites geográficos.

library(sf)
library(ggplot2)
library(dplyr)
if (!requireNamespace("rnaturalearth", quietly = TRUE))
  install.packages("rnaturalearth")

if (!requireNamespace("rnaturalearthdata", quietly = TRUE))
  install.packages("rnaturalearthdata")

library(rnaturalearth)
library(rnaturalearthdata)
library(leaflet)

El archivo Airports-2013-SHP.zip, que contiene los datos en formato Shapefile, es descomprimido y cargado utilizando la función st_read para su análisis.

unzip("Airports-2013-SHP.zip")
aeropuertos_shp <- st_read("data/SHAPE/AIRP_PT_2013.shp")
Reading layer `AIRP_PT_2013' from data source 
  `C:\Users\Virgilio\OneDrive - Universitat de València\01 PROFESOR\06 Innovación Educativa\2023 2024\03 Web\datasets\data\SHAPE\AIRP_PT_2013.shp' 
  using driver `ESRI Shapefile'
Simple feature collection with 2847 features and 24 fields
Geometry type: POINT
Dimension:     XY
Bounding box:  xmin: -69.38873 ymin: -21.31941 xmax: 102.4905 ymax: 78.92753
Geodetic CRS:  ETRS89

Descripción de la base de datos

summary(aeropuertos_shp)
    OBJECTID      AIRP_ICAO_          AIRP_HIER      AIRP_NAME_       
 Min.   :   84   Length:2847        Min.   :1.000   Length:2847       
 1st Qu.: 9748   Class :character   1st Qu.:1.000   Class :character  
 Median :10464   Mode  :character   Median :1.000   Mode  :character  
 Mean   :10448                      Mean   :1.021                     
 3rd Qu.:11178                      3rd Qu.:1.000                     
 Max.   :11891                      Max.   :2.000                     
  CNTR_CODE          AIRP_ICRG_         IATA_CODE           AIRP_PASS     
 Length:2847        Length:2847        Length:2847        Min.   :0.0000  
 Class :character   Class :character   Class :character   1st Qu.:0.0000  
 Mode  :character   Mode  :character   Mode  :character   Median :0.0000  
                                                          Mean   :0.7345  
                                                          3rd Qu.:0.0000  
                                                          Max.   :9.0000  
  PUBL_FLAG             IFR                VFR             AIRP_OWNR        
 Length:2847        Length:2847        Length:2847        Length:2847       
 Class :character   Class :character   Class :character   Class :character  
 Mode  :character   Mode  :character   Mode  :character   Mode  :character  
                                                                            
                                                                            
                                                                            
  AIRP_LAND          AIRP_TRAF          AIRP_INTR          AIRP_CITY        
 Length:2847        Length:2847        Length:2847        Length:2847       
 Class :character   Class :character   Class :character   Class :character  
 Mode  :character   Mode  :character   Mode  :character   Mode  :character  
                                                                            
                                                                            
                                                                            
      ALT             LAT_EUR          LON_EUR           AIRP_USE    
 Min.   :    1.0   Min.   :-21.32   Min.   :-69.389   Min.   :2.000  
 1st Qu.:   42.0   1st Qu.: 45.68   1st Qu.:  2.534   1st Qu.:6.000  
 Median :  123.0   Median : 49.71   Median :  9.848   Median :6.000  
 Mean   :  513.1   Mean   : 50.02   Mean   : 10.042   Mean   :5.999  
 3rd Qu.:  324.0   3rd Qu.: 53.50   3rd Qu.: 17.030   3rd Qu.:6.000  
 Max.   :11891.0   Max.   : 78.93   Max.   :102.491   Max.   :6.000  
  AIRP_GROUP         AIRP_GETIS           AIRP_ID        AIRP_LCOV_    
 Length:2847        Length:2847        Min.   :   84   Min.   :   0.0  
 Class :character   Class :character   1st Qu.: 9748   1st Qu.:   0.0  
 Mode  :character   Mode  :character   Median :10465   Median :   0.0  
                                       Mean   :10448   Mean   : 399.8  
                                       3rd Qu.:11178   3rd Qu.: 822.5  
                                       Max.   :11891   Max.   :1652.0  
          geometry   
 POINT        :2847  
 epsg:4258    :   0  
 +proj=long...:   0  
                     
                     
                     

La base de datos contiene 2,847 observaciones y 25 variables, lo cual sugiere un volumen considerable de datos que puede requerir una limpieza detallada. Este número supera los 223 aeropuertos reportados actualmente por Hosteltur en Europa, lo que indica posibles duplicados o datos no relevantes.

Para entender mejor la distribución geográfica de los aeropuertos, se visualizan los límites de los países europeos junto con la ubicación de los aeropuertos.

world <- ne_countries(scale = "medium", returnclass = "sf")
europe <- world[world$continent == "Europe", ]


ggplot() +
  geom_sf(data = europe, fill = "white", color = "gray") +
  geom_sf(data = aeropuertos_shp, color = "blue", size = 0.3) +  # Reducción del tamaño de los puntos
  ggtitle("Número de aeropuertos en Europa") +
  coord_sf(xlim = c(-25, 60), ylim = c(25, 70), expand = FALSE)

Este mapa inicial nos permite identificar visualmente la concentración de aeropuertos y será útil para detectar anomalías y decidir sobre los criterios de limpieza de datos.

Observaciones clave del mapa:

  1. Densidad de Aeropuertos: Se observa una mayor densidad de aeropuertos en Europa occidental, particularmente en países como Alemania, Francia y el Reino Unido. Esta alta concentración puede estar asociada a mayores poblaciones y una más desarrollada infraestructura de transporte.

  2. Distribución Geográfica: Los aeropuertos están notablemente menos densos en Europa del Este y en regiones más al norte, como Escandinavia. Esto podría reflejar diferencias en densidad poblacional y desarrollo económico.

  3. Anomalías: Notablemente, hay puntos visualizados fuera de los límites geográficos de Europa, en regiones como Medio Oriente y partes de Asia y África del Norte. Esto puede ser resultado de errores en los datos o inclusiones de aeropuertos no europeos, y representa una anomalía importante que requiere corrección.

  4. Discrepancia en los Datos: La comparación de los 2,847 registros presentes en la base de datos con los 223 aeropuertos que operan actualmente en Europa, destaca significativas inconsistencias. Esta disparidad sugiere que la base de datos puede contener entradas duplicadas, valores ausentes (NA) y errores de localización, lo que subraya la urgente necesidad de realizar una limpieza exhaustiva de los datos.

Tratamiento

Para garantizar la calidad y relevancia de los datos utilizados en el análisis, se realizaron varios pasos esenciales de limpieza de la base de datos.

  1. Detección y eliminación de duplicados

    Primero, se eliminaron todas las entradas duplicadas para asegurar la unicidad de cada registro. Este proceso se llevó a cabo utilizando la función distinct() de la librería dplyr, sin encontrar duplicados en la base de datos. Se obtuvieron 0 duplicaciones por lo que no fue necesario eliminar ninguna observación.

    aeropuertos_shp <- aeropuertos_shp %>%
      distinct(.keep_all = TRUE)
  2. Detección y eliminación de NA

    Posteriormente, se identificaron y eliminaron los registros con valores NA, reduciendo el número inicial de 2,847 observaciones a 804.

    cols_to_check <- setdiff(names(aeropuertos_shp), c("geometry", "otras_columnas_tipo_lista_si_existen"))
    
    aeropuertos_shp <- aeropuertos_shp %>%
      filter(!if_any(all_of(cols_to_check), is.na))
  3. Selección de las columnas importantes

    Se seleccionaron las columnas más relevantes para el análisis, enfocándonos en identificadores de aeropuerto, códigos de país, coordenadas y ciudades; pasando de 25 variables a 6.

    aeropuertos_shp <- aeropuertos_shp %>%
      select(AIRP_ICAO_, CNTR_CODE, LAT_EUR, LON_EUR,AIRP_CITY,geometry)
  4. Eliminación de los aeropuertos fuera de Europa

    Para centrar el análisis en Europa, se eliminaron las observaciones de aeropuertos que no se encontraban dentro del continente. Se ajustó el sistema de referencia de coordenadas (CRS) de los aeropuertos para alinearlo con el de los datos europeos y se realizó una intersección para identificar y eliminar los aeropuertos fuera de Europa.

    crs_europa <- st_crs(europe)
    
    aeropuertos_shp <- st_transform(aeropuertos_shp, crs_europa)
    indices_in_europe <- st_intersects(aeropuertos_shp, europe, sparse = FALSE) %>% 
      apply(1, any)
    
    aeropuertos_fuera_europa <- aeropuertos_shp[!indices_in_europe, ]
    conteo_aeropuertos_por_pais_fuera_europa <- aeropuertos_fuera_europa %>%
      group_by(CNTR_CODE) %>%
      summarize(conteo = n(), .groups = 'drop')
    
    print(conteo_aeropuertos_por_pais_fuera_europa)
    Simple feature collection with 21 features and 2 fields
    Geometry type: GEOMETRY
    Dimension:     XY
    Bounding box:  xmin: -68.70316 ymin: 17.9043 xmax: 72.79333 ymax: 78.24609
    Geodetic CRS:  WGS 84
    # A tibble: 21 × 3
       CNTR_CODE conteo                                                     geometry
       <chr>      <int>                                               <GEOMETRY [°]>
     1 BL             1                                    POINT (-62.84441 17.9043)
     2 CY             3 MULTIPOINT ((33.62558 34.87712), (32.48689 34.71735), (32.9…
     3 DE             7 MULTIPOINT ((8.90167 54.15333), (8.532991 54.68306), (7.914…
     4 DK             2        MULTIPOINT ((14.75943 55.06342), (9.793151 54.96282))
     5 EL             8 MULTIPOINT ((19.91179 39.60588), (20.7729 38.92987), (20.50…
     6 ES             4 MULTIPOINT ((-15.38527 27.93393), (-17.88643 27.81453), (-5…
     7 FI             1                                     POINT (24.58397 65.7808)
     8 FR             5 MULTIPOINT ((7.214367 43.6589), (0.08925595 49.53317), (-1.…
     9 GG             2        MULTIPOINT ((-2.215412 49.7067), (-2.60197 49.43496))
    10 GI             1                                   POINT (-5.347131 36.15101)
    # ℹ 11 more rows

    Se indentificaron 122 observaciones fuera del continente europeo. Entre estos, destacaron 14 aeropuertos en territorios ultramarinos de Francia, 4 en España, 11 en Alemania y 15 en Grecia, entre otros.

    aeropuertos_en_europa <- aeropuertos_shp[indices_in_europe, ]
    aeropuertos_shp <- aeropuertos_en_europa

    Finalmente, se filtraron y retuvieron únicamente las observaciones dentro de los límites geográficos de Europa, reduciendo el total de 804 a 682 observaciones válidas.

Output

Después de un exhaustivo proceso de limpieza y validación de la base de datos de aeropuertos, hemos logrado una notable mejora en la calidad y precisión de la información. Al comparar los gráficos antes y después de la limpieza, se observa una reducción significativa en el número de aeropuertos, pasando de 2,847 observaciones iniciales a 682 observaciones finales.

Análisis Comparativo de los Gráficos:

  • Antes de la Limpieza: El gráfico inicial mostraba una densidad excesivamente alta de puntos en Francia y en otras partes de Europa, lo que no correspondía a la cantidad real de aeropuertos operativos. Esto sugirió la presencia de datos duplicados, erróneos o irrelevantes.

    leaflet() %>%
      addProviderTiles(providers$CartoDB.Positron) %>%
      addPolygons(data = europe, color = "#444444", weight = 1, fillOpacity = 0.5) %>%  
      addCircleMarkers(data = aeropuertos_shp, radius = 0.3, color = "blue", fillOpacity = 1) %>% 
      setView(lng = 15, lat = 50, zoom = 4)
    ggplot() +
      geom_sf(data = europe, fill = "white", color = "gray") +
      geom_sf(data = aeropuertos_shp, color = "blue", size = 0.3) +  # Reducción del tamaño de los puntos
      ggtitle("Aeropuertos de Europa") +
      coord_sf(xlim = c(-25, 60), ylim = c(25, 70), expand = FALSE)

  • Después de la Limpieza: El gráfico actualizado muestra una distribución más realista y homogénea de los aeropuertos en Europa. Se eliminaron las observaciones erróneas, y ahora el mapa refleja una visión más precisa del panorama aeroportuario europeo.

Consideraciones y Reflexiones Finales:

Aunque el número de aeropuertos en la base de datos limpiada, 682, sigue siendo superior a los 223 aeropuertos registrados oficialmente, este valor es considerablemente más cercano al esperado. La diferencia puede atribuirse a la inclusión en la base de datos de pistas de aterrizaje de avionetas o helicópteros, y aeródromos, que técnicamente también cuentan como instalaciones aeroportuarias aunque no operen vuelos comerciales regulares.

Para refinar aún más la base de datos, sería necesario revisar cada una de las observaciones restantes, verificando el código ICAO para determinar si corresponden a aeropuertos principales, aeródromos o helipuertos. Este paso adicional permitiría alinear aún más la base de datos con el número oficial de aeropuertos y garantizaría que solo se incluyan instalaciones pertinentes a estudios de tráfico aéreo y planificación infraestructural.

Generación del fichero

Para concluir, los datos obtenidos se han guardado en formato gpkg para facilitar su acceso y uso, quedando disponibles aquí.

sf::st_write(aeropuertos_en_europa, "AerEuropa.gpkg")



Proyecto de Innovación Educativa Emergente (PIEE-2737007)