El trafico maritimo de Colombia

Hola, somos Yutao Henry Jiang Zheng (yujiangz@alumni.uv.es), Lucas Osejo Martínez (luomar2@alumni.uv.es) y Javier Arnau Basagoiti Montagut (jabamon@alumni.uv.es)

Esta web sirve para presentar el trabajo en equipo para la asignatura “Programación y manejo de datos en la era Del Big Data”, optativa de GECO en la Facultad de Economía de la Universitat de València.

La web de la asignatura está aquí y los trabajos de mis compañeros de curso puedes verlos aquí.

Nuestro trabajo lleva por título : “El trafico maritimo de Colombia”. El objetivo es mostrar un analisis sobre el trasporte maritimo en Colombia, su composicion y los componestes que lo forman.

El trabajo puede verse aquí, y las slides aquí.

Mapa de los Principales Puertos

Ubicación de los principales Puertos de Colombia

Como primera etapa del análisis, y para comprender la distribución logística del país, presentamos a continuación la ubicación geoespacial de los 5 principales puertos en Colombia. Hemos generado la cartografía utilizando el paquete sf, lo que nos permite visualizar la concentración de infraestructura en la Costa Caribe frente a la dependencia de un único gran nodo en el Pacífico.

Sistema portuario nacional: Un desafío Geográfico

Un relieve peculiar

Colombia cuenta con una ventaja estratégica al tener salida tanto al océano Pacífico como al Atlántico, lo que facilita su comercio con Asia, Europa y Norteamérica. No obstante, el desarrollo portuario se ha concentrado históricamente en la Costa Caribe debido a su mejor conexión con el centro del país, mientras que la Costa Pacífica ha permanecido más aislada por la barrera natural de la Cordillera de los Andes.

Código
# Usamos knitr para mostrar la imagen directamente desde Wikimedia 
knitr::include_graphics("https://upload.wikimedia.org/wikipedia/commons/8/8a/Colombia_relief_location_map_cropped.svg")

Mapa físico de Colombia. Se observa claramente cómo las tres cordilleras andinas bloquean el acceso al Pacífico, mientras que el Caribe es más llano y accesible.

Mapa físico de Colombia. Se observa claramente cómo las tres cordilleras andinas bloquean el acceso al Pacífico, mientras que el Caribe es más llano y accesible.

Análisis Gráfico y Exploratorio

Evolución del volumen de carga (Top Puertos)

Primero, analizamos la tendencia en el tiempo. Como hay muchas zonas pequeñas que podrían desordenar el gráfico, hemos filtrado los datos para ver sólo los 6 puertos más importantes según volumen histórico. Queremos ver si el tráfico ha subido después de la pandemia y qué puertos son los líderes.

Código
# 1. Preparación de los datos
df_grafico1 <- df_CargaPuerto %>%
mutate(year = as.numeric(year)) %>% # Aseguramos que el año sea numérico para el eje X 
# Calculamos el total histórico por ciudad para saber cuáles son los "grandes" group_by(Ciudad) %>%
mutate(total_historico = sum(Carga_Portuaria, na.rm = TRUE)) %>%
ungroup()
# 2. Filtro: Nos quedamos solo con los nombres del Top 6
top_puertos <- unique(df_grafico1 %>% arrange(desc(total_historico)) %>% pull(Ciudad))[1:6]
# Filtramos la base de datos original para mantener solo esas ciudades top
df_grafico1 <- df_grafico1 %>% filter(Ciudad %in% top_puertos)
# 3. Sumamos la carga por año y ciudad 
df_grafico1 <- df_grafico1 %>% 
group_by(year, Ciudad) %>%
summarise(Carga = sum(Carga_Portuaria, na.rm = TRUE), .groups = 'drop')

#- Gráfico de líneas
p <- ggplot(data = df_grafico1, 
mapping = aes(x = year, y = Carga, color = Ciudad)) + 
geom_line(linewidth = 1) + # Línea un poco más gruesa para visibilidad
geom_point(size = 2) + # Puntos para marcar cada año
scale_y_continuous(labels = scales::label_number(scale = 1e-6, suffix = " M")) + # Formato Millones
theme_minimal() # Tema limpio

p + labs(title = "Evolución de carga (Top 6 Puertos)",
subtitle = "Toneladas que se mueven anualmente", 
y = "Millones de Toneladas", 
color = "Zona Portuaria") 

Comparativa: Caribe vs Pacífico

Para comprobar si es verdad que el Caribe domina por la barrera de los Andes, comparamos directamente el volumen de carga del último año completo (2023).

Código
# 1. Clasificación Geográfica 
df_grafico2 <- df_CargaPuerto %>%
mutate(year = as.numeric(year)) %>%
filter(year == 2023) %>% 
# Creamos la columna 'Region' 
mutate(Region = case_when
( Ciudad %in% c("Buenaventura", "Tumaco") ~ "Pacífico",
Ciudad %in% c("Barrancabermeja", "Río Magdalena") ~ "Fluvial",
TRUE ~ "Caribe"   )) %>% # El resto (Cartagena, etc.) asumimos que son Caribe 

# 2. Sumamos el total por región
group_by (Region) %>%
summarise(Total = sum(Carga_Portuaria, na.rm = TRUE)) %>%

# Calculamos el porcentaje para entender la proporción
  mutate(Porcentaje = Total / sum(Total))

#Gráfico de barras
p <- ggplot(df_grafico2, aes(x = reorder(Region, -Total), y = Total, fill = Region)) + geom_col() + 
  
# Añadimos etiquetas de texto con el porcentaje encima de las barras
  geom_text(aes(label = scales::percent(Porcentaje, accuracy = 1)),
vjust = -0.5, fontface = "bold") + 
scale_y_continuous(labels = scales::label_number(scale = 1e-6, suffix = " M")) + scale_fill_manual(values = c("Caribe"="blue", "Pacífico"="orange", "Fluvial"="green")) + theme_light() 

p + labs(title = "Distribución de Carga por Región (2023)",
subtitle = "Predominio claro de la costa Caribeña", 
x = "Región", 
y = "Total Toneladas") + 
theme(legend.position = "none")

Tipos de barcos

Nacionales vs Internacionales

Colombia, como país bioceánico, recibe diversos tipos de embarcaciones, con un predominio creciente de barcos de origen nacional. Entre 2018 y 2023 se registró un aumento sostenido en los arribos a los puertos colombianos, impulsado especialmente desde 2021 por la recuperación económica posterior a la pandemia y el fortalecimiento de la flota logística nacional ante las disrupciones en las cadenas de suministro; la disminución observada en 2024 no refleja una caída real del tráfico, sino la falta de información del último trimestre del año.

Código
R.NacInt <- df_C.Arribo|> group_by(year)|>filter(mes=="total")|> ggplot(aes(x=year, y=value, fill = tipo ))+geom_col()+theme_bw()+scale_y_continuous(labels = label_comma(accuracy = 1))+
  theme(panel.background = element_rect(fill = "lightyellow", color = NA))+labs(title="Evolución de la procedencia de barcos que llegan a \npuertos colombianos (2018-2024)", x="Años",y="Arribos", fill="Tipo" )+ scale_fill_discrete(name = "Tipo de Navegación",  labels = c( "internac" = "Tráfico Internacional","nacional"= "Tráfico Nacional"))
R.NacInt

Procedencia de los barcos del año 2024

La mayoría de los barcos arriban principalmente a los puertos del Atlántico. Como se observa en la siguiente gráfica, correspondiente a los barcos arribados en 2024, los puertos del Atlántico reciben un mayor número de embarcaciones tanto nacionales como internacionales, lo que corrobora la afirmación de que la costa caribeña presenta una mayor actividad portuaria que la costa pacífica.

Código

R.NacInt <- df_C.Arribo|> filter(year=="2024",mes=="total")|> ggplot(aes(x=region, y=value, fill = tipo ))+geom_col()+theme_bw()+ theme(panel.background = element_rect(fill = "lightyellow", color = NA))+labs(title="Procedencia de barcos que llegan a puertos colombianos en el 2024", x="Años",y="Arribos", fill="Tipo" )+scale_fill_discrete(name = "Tipo de Navegación",  labels = c( "internac" = "Tráfico Internacional","nacional"= "Tráfico Nacional"))
R.NacInt

Los principales puertos colombianos

El tráfico marítimo en la costa caribeña se concentra principalmente en los puertos de Cartagena, Santa Marta y Coveñas, que ocupan el primer, segundo y tercer lugar, respectivamente, entre los puertos con mayor recepción de embarcaciones. Por su parte, en la costa pacífica el puerto de Buenaventura registra el mayor flujo de barcos y se posiciona en el cuarto lugar a nivel nacional en términos de tráfico portuario.

Código
library(patchwork)
NacInt <- df_C.Arribo|> filter(year=="2024")|> ggplot(aes(x=puerto, y=value, fill = tipo ))+geom_col()+theme_bw()+theme(axis.text.x = element_text( angle = 60, hjust = 1)) +theme(panel.background = element_rect(fill = "lightyellow", color = NA))+ labs(title="Procedencia de barcos que llegan a cada puertos colombianos en el 2024", x="Años",y="Arribos", fill="Tipo" )+scale_fill_discrete(name = "Tipo de Navegación",  labels = c( "internac" = "Tráfico Internacional","nacional"= "Tráfico Nacional"))
tablaarribo <-df_C.Arribo|>filter(year=="2024",tipo=="nacional", mes=="enero")|>select(region,puerto)
NacInt

Código
DT::datatable(tablaarribo)

Actividad de los barcos que arriaban a puertos colombianos

De los barcos que llegan, la mayoría son buques de carga, seguidos, a gran distancia, por embarcaciones recreativas. La pandemia provocó una caída significativa en la llegada de buques recreacionales, pero a partir de 2022 se observa una recuperación. En 2024 se aprecia una disminución general en todos los tipos de barcos, lo cual se debe a que la base de datos consultada no incluía información del último trimestre del año, como mencionamos anteriormente.

Código
R.TipoBarco <- df_tipoBarco|>group_by(year)|>filter(tipo=="Actividad")|> ggplot(aes(x=year,y=value,fill = actividad_y_motivo_de_arribo))+geom_col()+scale_fill_brewer(palette = "Set1")+
  labs(title = "Tipo de barcos que arriban a puertos colombianos (2018-2024)", x="Años",y="Arribos", fill = "Tipo de barco")+theme_bw()+theme(panel.background = element_rect(fill = "lightblue3", colour = "white"))
R.TipoBarco

Barcos que arriban a puertos colombianos motivos especiales

Algunos barcos llegan a Colombia por motivos especiales, es decir, por razones distintas al comercio regular; principalmente por aprovisionamiento, como se puede observar en la gráfica.

Código
R.ActiviadBarco <- df_tipoBarco|>group_by(year)|>filter(tipo=="M.Arribo_Especial")|> ggplot(aes(x=year,y=value,fill = actividad_y_motivo_de_arribo))+geom_col()+theme_bw()+theme(panel.background = element_rect(fill = "lightyellow1", colour = "white"))+labs(title="Motivos de arribo especiales a puertos colombianos (2018-2024)", x="Años",y="Arribos",fill="Motivos de arribo especiales")
R.ActiviadBarco

Tipo de barcos de carga que llegan a puertos colombianos

Código
Categoria <- df_TipoCarga|>group_by(year)|>filter(mes=="total")|>ggplot(aes(x=year,y=value, fill = puertBarco))+geom_col()+labs(title = "Tipos de barcos de carga que llegan a Colombia (2018-2024)",x="Años",y="Arribos",fill="Tipo de cargero")+scale_fill_brewer(palette = "Set3")+theme(panel.background = element_rect(fill = "lightblue4", colour = "white"))
Categoria 

Los barcos de carga que arriban a los puertos colombianos están compuestos principalmente por portacontenedores, seguidos por graneleros y tanqueros. Esto se debe a que los portacontenedores son fundamentales para el transporte de mercancía general y bienes manufacturados, como la exportación de café, una de las principales exportaciones del país, así como la importación de diversos bienes.

En el caso de los graneleros, su presencia responde a la exportación de minerales, como el carbón y el hierro, y a la importación de alimentos, como cereales, además de otros insumos, entre ellos los fertilizantes. Por su parte, la llegada de tanqueros se explica porque Colombia es un importante productor de petróleo.

Tipo de barcos de carga que llegan a puertos colombianos por costa

En la siguiente gráfica se puede observar que, en 2023, la costa atlántica recibió una mayor cantidad de barcos de carga de todos los tipos, lo que respalda el argumento de que la costa pacífica tiene un menor movimiento portuario en comparación con la costa caribeña.

Código
Categoria <- df_TipoCarga|>group_by(region)|>filter(mes=="total", year=="2023")|>ggplot(aes(x=region,y=value, fill = puertBarco))+geom_col(position = "dodge")+labs(title = "Tipos de barcos de carga que llegan a Colombia (2023)",x="Costa",y="Arribos",fill="Tipo de cargero")+scale_fill_brewer(palette = "Set3")+theme(panel.background = element_rect(fill = "lightblue4", colour = "white"))+annotate("rect",xmin = 1.5, xmax = 2.5,ymin = -Inf, ymax = Inf,alpha = 0.2, fill = "red")+ annotate("rect",xmin = 0.5, xmax = 1.5,ymin = -Inf, ymax = Inf,alpha = 0.2, fill = "green2")
           
Categoria

Evolución de la carga portuario

La evolucion del movimiento de carga (2017-2024)

Código
Traf.Marit <- df_CargaPuerto|>group_by(year)|>mutate(Traf_anual=sum(Carga_Portuaria))|> filter(Trimestre=="Trim. 4 ", Ciudad%in%c("Barrancabermeja"))|>mutate(year = as.numeric(as.character(year)))|> select(year,Traf_anual)|> ggplot(aes(x=year,y=Traf_anual,group = 1))+geom_line(color="blue3", size=1.2)+geom_point(size=2.5, color= "firebrick3")+theme_bw() +scale_y_continuous(labels = label_comma(accuracy = 1))+theme(panel.background = element_rect(fill = "lightblue4", colour = "white"))+labs(title="Carga portuaria en Colombia 17-24",x="Años",y="Movimiento de carga")
Traf.Marit <- Traf.Marit+transition_reveal(year)
Traf.Marit

El movimiento de carga portuaria en Colombia experimentó una caída entre 2018 y 2020, con una disminución particularmente pronunciada en 2019 debido a la pandemia. A partir de 2020, la actividad portuaria comenzó a recuperarse; sin embargo, en 2022 volvió a disminuir como consecuencia de la inflación mundial y la guerra en Ucrania, que encareció el transporte marítimo. A partir de finales de 2022, se registró una rápida recuperación del movimiento portuario, impulsada por la recuperación económica global y las sequías en el Canal de Panamá, que obligaron a varios barcos a dirigirse a puertos colombianos.

Se estima que el tráfico de carga en Colombia podría disminuir en 2025 debido al Fenómeno del Niño, que aumenta los riesgos de navegación en ciertos meses del año y afecta la seguridad portuaria. Además, este fenómeno meteorológico podría reducir la cosecha de café, una de las principales exportaciones del país junto con el petróleo. La exportacion de crudo también podría verse afectada, debido al incremento en la producción de petróleo en Estados Unidos, principal comprador del crudo colombiano, impulsado por las políticas extractivas de la administración de Trump y a la disminución de precios de la OPEP+, lo que hace que el petróleo colombiano sea menos competitivo en el mercado internacional.

Código
Traf.Marit <- df_CargaPuerto|>group_by(year)|>mutate(Traf_anual=sum(Carga_Portuaria))|> filter(Trimestre=="Trim. 4 ", Ciudad%in%c("Barrancabermeja"))|>mutate(year = as.numeric(as.character(year)))|> select(year,Traf_anual)|> ggplot(aes(x=year,y=Traf_anual,group = 1))+geom_line(color="blue3", size=1.2)+geom_point(size=2.5, color= "firebrick3")+theme_bw() +scale_y_continuous(labels = label_comma(accuracy = 1))+theme(panel.background = element_rect(fill = "lightblue4", colour = "white"))+labs(title="Evolución de la carga portuario en puertos colombianos (2017-2024)",x="Años",y="Movimiento de carga")

Traf.Marit

Contribucion por costa en la carga portuaria

El movimiento de carga portuaria en Colombia se concentra principalmente en la costa atlántica, seguidas por la costa pacífica y los puertos fluviales. Esto se explica porque la población y la actividad económica del país se concentran en la región central y en la costa caribe, y estas zonas cuentan con mejores conexiones hacia el Atlántico. En contraste, la zona pacífica ha permanecido históricamente aislada debido a la presencia de la cordillera de los Andes.

Por su parte, los puertos fluviales mantienen su nivel de movimiento principalmente por la ciudad de Barrancabermeja, que alberga la refinería de petróleo más grande de Colombia y se encuentra cerca del yacimiento de petróleo del Magdalena Medio. Además, su ubicación en el río Magdalena, que desemboca en el Caribe, facilita el transporte de carga desde esta región, aunque su navegabilidad no es constante durante todo el año, lo que limita parcialmente el flujo portuario.

Código
Traf.Marit <- df_CargaPuerto|>group_by(year)|>mutate(Traf_anual=sum(Carga_Portuaria))|> filter(Trimestre=="Trim. 4 ")|> ggplot(aes(x=year,y=Traf_anual, fill = Costa))+geom_col()+scale_y_continuous(labels = label_comma(accuracy = 1))+theme_bw()+ labs(title="Contribucion por costa en la evolución de la carga portuaria \nen puertos colombianos (2017-2024)",x="Años",y="Movimiento de carga")+theme(panel.background = element_rect(fill = "lightyellow1", colour = "white"))
Traf.Marit

Exportaciones e Importaciones

Evolución de la Balanza Comercial

Para este apartado nos centraremos en el dataframe df_TM_Puerto, que contiene los datos de tonelaje desglosados por tipo de movimiento; a partir de él generamos el gráfico en el que se puede ver la diferencia entre importaciones y exportaciones marítimas del país .

** Evolución de la Balanza Comercial (Interactiva) **

Código
library(plotly) 

# 1. CREACIÓN Y LIMPIEZA DE df_comercio (a partir df_TM_Puerto)
df_comercio <- df_TM_Puerto %>%
  # Seleccionamos las columnas clave y renombramos el año (anno_vigencia)
  select(zona_portuaria, anno_vigencia, exportacion, importacion) %>%
  rename(Year = anno_vigencia, Zona = zona_portuaria) %>%
  
  # Convertir las columnas 'exportacion' e 'importacion' en filas
  pivot_longer(
    cols = c(exportacion, importacion),
    names_to = "Movimiento",
    values_to = "Total_Ton"
  ) %>%
  # eliminamos NAs
  filter(!is.na(Total_Ton), Total_Ton > 0)

# 2. CREACIÓN DEL DATAFRAME NECESARIO (df_evolucion_comercio)
df_evolucion_comercio <- df_comercio %>%
  group_by(Year, Movimiento) %>%
  summarise(Total_Ton = sum(Total_Ton, na.rm = TRUE)) %>%
  ungroup()

# 3. Crear el gráfico base con ggplot
p_base_balanza <- ggplot(df_evolucion_comercio, 
                         aes(x = Year, y = Total_Ton, color = Movimiento,
                                                text = paste("Año:", Year, "<br>",
                                                             "Movimiento:", Movimiento, "<br>",
                                                             "Toneladas:", scales::label_comma()(Total_Ton)))) +
  geom_line(linewidth = 1.2) +
  geom_point(size = 3) +
  scale_y_continuous(labels = scales::label_comma(scale = 1e-6, suffix = " M")) +
  scale_color_manual(values = c("exportacion" = "#2E86C1", "importacion" = "#E74C3C")) +
  theme_minimal() +
  labs(title = "Evolución Exportaciones vs Importaciones",
       subtitle = "Volumen en Millones de Toneladas por Año",
       y = "Millones de Toneladas",
       x = "Año",
       color = "Flujo") +
  theme(legend.position = "bottom")

# 4. Convertir a Plotly para hacerlo interactivo
ggplotly(p_base_balanza, tooltip = "text") %>%
  layout(hovermode = "x unified")

Evolución Interactiva de las Toneladas Exportadas vs. Importadas

Especialización Portuaria Interactiva: ¿Quién Exporta y Quién Importa?**

Identificamos los puertos que lideran cada actividad, observando dónde se concentra la mayor actividad exportadora e importadora del país.

Código
# 1. CREACIÓN Y LIMPIEZA DE df_comercio 
df_comercio <- df_TM_Puerto %>%
  select(zona_portuaria, anno_vigencia, exportacion, importacion) %>%
  rename(Year = anno_vigencia, Zona = zona_portuaria) %>%
  pivot_longer(
    cols = c(exportacion, importacion),
    names_to = "Movimiento",
    values_to = "Total_Ton"
  ) %>%
  mutate(Total_Ton = as.numeric(Total_Ton)) %>%
  filter(!is.na(Total_Ton), Total_Ton > 0)

# 2. CREACIÓN DEL DATAFRAME NECESARIO (df_puertos_ranking)
df_puertos_ranking <- df_comercio %>%
  group_by(Zona, Movimiento) %>%
  summarise(Total_Ton = sum(Total_Ton, na.rm = TRUE)) %>%
  ungroup()

# 3. Sacar el Top 5 general (sumando todo)
top_5_zonas <- df_puertos_ranking %>%
  group_by(Zona) %>%
  summarise(Grand_Total = sum(Total_Ton)) %>%
  arrange(desc(Grand_Total)) %>%
  head(5) %>%
  pull(Zona)

# 4. Crear el gráfico con ggplot
p_base_puertos <- df_puertos_ranking %>%
  filter(Zona %in% top_5_zonas) %>%
  ggplot(aes(x = Total_Ton, 
             y = reorder(Zona, Total_Ton), 
             fill = Movimiento,
             text = paste("Puerto:", Zona, "<br>",
                          "Flujo:", Movimiento, "<br>",
                          "Volumen:", scales::label_comma()(Total_Ton)))) +
  geom_col(position = "dodge") + 
  scale_x_continuous(labels = scales::label_comma(scale = 1e-6, suffix = " M")) +
  scale_fill_manual(values = c("exportacion" = "#2E86C1", "importacion" = "#E74C3C")) +
  theme_minimal() +
  labs(title = "Top 5 Zonas Portuarias: Perfil Exportador vs Importador",
       subtitle = "Acumulado histórico (Toneladas)",
       x = "Millones de Toneladas",
       y = "Zona Portuaria",
       fill = "Flujo")

# 5. Convertir a Plotly para hacerlo interactivo
ggplotly(p_base_puertos, tooltip = "text") %>%
  layout(yaxis = list(title = "Zona Portuaria"))

Top 5 Zonas Portuarias Interactivas: Perfil Exportador vs. Importador

FIN