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.
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.
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.
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.
# 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") 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).
# 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")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.
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.NacIntLa 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.
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.NacIntEl 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.
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)
NacIntDe 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.
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.TipoBarcoAlgunos 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.
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.ActiviadBarcoCategoria <- 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.
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.
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")
CategoriaTraf.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.MaritEl 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.
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.MaritEl 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.
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.MaritPara 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) **
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
Identificamos los puertos que lideran cada actividad, observando dónde se concentra la mayor actividad exportadora e importadora del país.
# 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
Slides hechas con Quarto