Datos sobre puertos en la Unión Europea

Puertos
Transporte
España
Autor/a
Afiliación

Víctor Serrano Campos

Universidad de València

Fecha de publicación

1 de abril de 2026

Input

Para visualizar los puertos europeos vamos a trabajar con la base de datos proporcioanda por Eurostat. Eurostat es la oficina estadística de la Unión Europea dedicada a recopilar y difundir información de principalmente los estados miembros.

Más concretamente, Eurostat también dispone de datos espaciales de diversas temáticas, desde infraestructura de transportes hasta servicios básicos como educación y sanidad. Se encuentran también disponibles datos geográficos recopilados por la red de satelites europeos.

En nuestro caso, la base de datos que vamos a utilizar no solo recopila los puertos en territorio europeo de los estados miembros, sino que también incluye puertos de territorios de ultramar como puertos de paises contiguos a la UE. En un primer vistazo muy preliminar podemos comentar que el dataset tiene 2201 puertos y 3 variables/características. Las características no son muy destacables y la única que nos interesa es el identificador del puerto a nivel europeo (PORT_ID). Como último apunte en esta introducción, remarcar que la base de datos que vamos a utilizar fue subida el 5 de Octubre de 2009 y, aunque en la web indique que está formada por geometrías de puntos y polígonos, realmente el dataset que vamos a utilizar solo incluye puntos.

Descripción

En un primer lugar cargamos las librerías necesarias:

En segundo lugar y antés de obtener los datos, vamos a definir el lugar o bounding box del aerea de la que queremos extraer los datos. En nuestro caso el territorio está delimitado por las fronteras de los estados miembros de la UE. Para ello vamos a recurrir a la misma web de Eurostat para descargar los límites administrativos de todos los estados reconocidos por las Naciones Unidas y vamos a extraer todos los estados miembros de la Unión Europea.

area <- sf::st_read("../data/2526020043/CNTR_RG_20M_2024_4326.gpkg", quiet=T)

area_UE <- area %>% 
  filter(EU_STAT == "T")

Una vez ya tenemos el area de nuestro análisis, procedemos a cargar los datos.

puertos <- sf::st_read("../data/2526020043/PORT_2009_SH/shape/data/PORT_PT_2009.shp", quiet = T)

Una vez obtenidos los datos, podemos confirmar lo ya comentado previamente. Todos los puertos están localizados por la geometría de puntos.

Descripción de la base de datos

summary(puertos)
   PORT_ID            DATA_SRC_C    PORT_COOR_                 geometry   
 Length:2201        Min.   :2106   Length:2201        POINT        :2201  
 Class :character   1st Qu.:2108   Class :character   epsg:4258    :   0  
 Mode  :character   Median :2110   Mode  :character   +proj=long...:   0  
                    Mean   :3628                                          
                    3rd Qu.:5106                                          
                    Max.   :9998                                          

Recuperando lo ya comentado con anterioridad, la base de datos cuenta con 2201 puertos. Un número ligeramente superior a la cifra que podemos encontrar en otras fuentes. En artículos relacionados con el comercio marítimo se cifra en alrededor de 1200 puertos marítimos, mientras que la web basesportuarias.com ofrece una cifra cercana a 1500 puertos comerciales. Por tanto, y como ya hemos comentado con anterioridad, con seguridad hay un alto número de puertos incluidos en los datos que no se encuentran en el territorio de los estados miembros de la Unión.

Una vez ya tenemos los datos, vamos a realizar un representación visual de los datos para poder realizar un análisis preeliminar de la ubicación de todos los puertos e intentar discernir si se encuentran dentro o fuera de la unión. Para ello vamos a utilizar el paquete leaflet. Para evitar futuros problemas, vamos a hacer coincidir los sistemas de referencia de ambos conjuntos de datos.

puertos <- st_transform(puertos, crs = st_crs(area_UE))

leaflet() %>%
  addTiles() %>%
  addCircles(
    data = puertos,
    popup = ~puertos$PORT_ID,
    color = "purple",
    fillOpacity = 0.6,
    radius = 500,
    group = "Puertos"
  ) %>%
  addPolygons(
    data = area_UE$geom,
    color = "black",
    weight = 2,
    fill = TRUE,
    fillColor = "brown",
    fillOpacity = 0.15,
    group = "Límites UE"
  ) %>%
  addLayersControl(
    overlayGroups = c("Puertos", "Límites UE"),
    options = layersControlOptions(collapsed = FALSE)
  )

Con este primer mapa podemos confirmar lo que ya hemos venido comentando, la discrepancia en el número de puertos seguramente se deba a la inclusión en la base de datos de puertos que no pertenecen a paises miembros de la Unión Europea. Más concretamente podemos observar que paises como Reino Unido, Noruega o Turquía están incluidos en el conjunto de datos. Por último, también podemos darnos cuenta que hay varios puertos en territorios de ultramar de paises miembros de la UE, al seguir perteneciendo legítimamente a la Unión Europea, no tenemos más remedio que incluirlos.

Tratamiento

En primer lugar y antes de modificar el conjunto de datos, vamos a realizar algunos pasos previos para asegurar la calidad y exactitud de los datos.

Primeramente comprobaremos si tenemos datos duplicados y los eliminaremos en dicho caso. Para ello utilizaremos la función distinct() del paquete dplyr. Tras realizar el proceso, no hemos encontrado ninguna entrada duplicada.

puertos <- puertos %>% 
  distinct(.keep_all = T)

En segundo lugar, vamos a detectar y eliminar todas aquellas observaciones que contengan datos faltantes of NA. Tras una primer inspección hemos concluido que no tenemos datos faltantes en ninguna de las columnas de nuestra base de datos

colSums(is.na(puertos))
   PORT_ID DATA_SRC_C PORT_COOR_   geometry 
         0          0          0          0 

Por tanto, tras estas comprobaciones, podemos asegurar la calidad de nuestro conjunto de datos.

Vamos ahora a eliminar los puertos que se encuentran fuera de los territorios de los paises miembros de la Unión Europea.

idx <- st_within(puertos, area_UE)

puertos_filtrados <- puertos[lengths(idx) > 0, ]

De en un principio tener más de 2000 puertos, nos quedamos con simplemente 1094 puertos en los territorios de la Unión Europea.

Antes de llega a las conclusiones finales vamos a relaizar un paso extra para mejorar la calidad de la visualización de los datos. Vamos a añadir a nuestra base de datos el nombre del puerto, a partir de su LOCODE o PORT_ID en nuestra base de datos. Para ello vamos a descargar una base de datos con los identificadores de la siguiente web y unir las variables interesantes que se encuentren presentes a nuestro conjunto de datos.

code_list <- readr::read_csv("../data/2526020043/code-list.csv")

code_list$locode <- paste0(code_list$Country,code_list$Location)

code_list <- code_list %>% 
  select(locode, Name)


puertos_final <- puertos_filtrados %>%
  inner_join(code_list, by = c("PORT_ID" = "locode"))

Output

Después de este proceso de limpieza y mejora de la base de datos de puertos, se ha obtenido una base de datos más precisa en lo que se refiere a conocer y visualizar los puertos de la Unión Europea.

Para finalizar este documento, únicamente queda visualizar nuestro conjunto de datos final y realizar un pequeño análisis de lo que podemos ver.

leaflet() %>%
  addTiles() %>%
  addPolygons(
    data = area_UE$geom,
    color = "black",
    weight = 2,
    fill = TRUE,
    fillColor = "brown",
    fillOpacity = 0.15,
    group = "Límites UE",
    popup = area_UE$CNTR_NAME
  ) %>%
  addCircles(
    data = puertos_final,
    popup = paste("ID:", puertos_final$PORT_ID, "<br><b>Puerto de", puertos_final$Name),
    color = "purple",
    fillOpacity = 0.6,
    radius = 500,
    group = "Puertos"
  ) %>%
  addLayersControl(
    overlayGroups = c("Puertos", "Límites UE"),
    options = layersControlOptions(collapsed = FALSE)
  ) %>%
  setView(zoom = 2.75, lat = 43, lng = 0)

El mapa muestra una gran disparidad en la densidad de puertos a lo largo de Europa. Se observa una elevada concentración de puertos en los países del Benelux, mientras que otros países del sur de Europa, como Portugal, Italia o Francia, presentan una densidad portuaria relativamente baja si se tiene en cuenta la extensa línea de costa de la que disponen. El caso contrario es Grecia, el único país del sur de Europa con una alta densidad de puertos, algo lógico dado que gran parte de su territorio está formado por islas.

Como resultado de nuestro trabajo hemos obtenido una base de datos mucho más precisa y con un poco más de información en lo que respecta a la posición de los puertos de los paises de la Unión Europea.

Tipo de archivo generado: objeto sf, exportado como archivo GPKG
CRS (Sistema de Referencias de Coordenadas): EPSG:4326 (WGS84)

st_write(puertos_final, "puertos_union_europea.gpkg")

El/los fichero(s) generados con este procedimiento/técnica/metodología se puede descargar de aquí.



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