1. Introducción

El comercio exterior constituye un componente fundamental en el desarrollo económico de los países, ya que refleja la capacidad productiva, la competitividad y la inserción de las economías en los mercados internacionales. En el caso colombiano, las exportaciones desempeñan un papel relevante en la generación de ingresos y en la diversificación de la oferta nacional, especialmente en sectores como los alimentos y las manufacturas.

El presente análisis se basa en la información del mes de julio de 2025, tomada de la base “Estadísticas de Exportaciones – EXPO 2025” del Departamento Administrativo Nacional de Estadística (DANE). Esta base reúne los registros de las declaraciones de exportación (DEX) efectuadas por las empresas colombianas ante la DIAN, lo que permite identificar el comportamiento de los diferentes sectores económicos y sus destinos comerciales.

El objetivo principal de este estudio es analizar la relación entre el valor exportado (FOB) —expresado en términos logarítmicos para representar su cambio porcentual— el cual representa el valor de los bienes exportados al momento de ser embarcados, sin incluir costos de transporte ni seguros. El uso del logaritmo del FOB permite estabilizar la varianza, reducir la influencia de valores extremos y analizar de forma más precisa las diferencias en la magnitud económica real de las exportaciones entre las ciudades.

Por consiguiente se observa el comportamiento que tiene con diversas variables independientes asociadas al comercio exterior, tales como AGRENA, PNK, COD_PAI4, COD_SAI y POSAR. Para ello, se aplica un modelo de regresión lineal, con el fin de identificar los factores que más influyen en la variación del valor de las exportaciones de alimentos y manufacturas en el periodo analizado.

2. Obtención de datos

En este proyecto se implementó un modelo de clasificación discriminante para analizar las exportaciones de las ciudades colombianas durante julio de 2025, tomando como variable principal LOG_FOB. A partir de la base “Estadísticas de Exportaciones - EXPO 2025” del DANE, se realizó la limpieza y organización de los datos, seguida de un análisis exploratorio para identificar las variables más relevantes en la clasificación de los sectores exportadores, las cuales fueron: los países y ciudades con mayor porcentaje de exportaciones, el valor nacional agregado . Con base en esta información, se aplicó el modelo discriminante para determinar qué factores explican mejor las diferencias entre los grupos de exportación y evaluar su capacidad predictiva y de clasificación respecto a LOG_FOB.

3.Definición de variables

3.1. Variable dependiente

LOG_FOB: El valor FOB (Free On Board) representa el valor monetario de las mercancías exportadas al momento en que son cargadas a bordo del medio de transporte internacional en el puerto de salida. Este valor incluye los costos de producción, embalaje y transporte interno hasta el puerto de embarque, pero excluye los costos de seguro y transporte internacional hasta el país de destino. Por tanto, el FOB refleja el nivel de ingresos obtenidos por las exportaciones y constituye una medida directa del desempeño exportador.

En este análisis, se utiliza el logaritmo natural del valor FOB (log_FOB) como variable dependiente (Y) del modelo. La transformación logarítmica se aplica con el propósito de reducir la asimetría de la distribución y mitigar la influencia de valores extremos, permitiendo que los resultados sean más estables y comparables. Además, el uso del logaritmo facilita la interpretación de los coeficientes en términos relativos o porcentuales: un cambio en las variables explicativas se asocia con una variación proporcional en el valor exportado.

De esta manera, log_FOB refleja la magnitud relativa de las exportaciones y permite analizar cómo distintos factores inciden en el desempeño exportador desde una perspectiva más robusta y estadísticamente adecuada.

3.2. Variables independientes:

COD_PAI4: Esta variable identifica el país al cual se exporta un producto desde Colombia. Su inclusión permite analizar la distribución de las exportaciones hacia distintos mercados internacionales y comprender los patrones comerciales del país. Para este estudio se seleccionaron tres destinos principales: Estados Unidos, Ecuador y Perú, los cuales concentran una parte significativa de las exportaciones colombianas en julio de 2025 (países a los que más se exportó en el mes de julio). Estos países representan contextos económicos y geográficos diferentes, lo que aporta una visión comparativa sobre cómo las condiciones del mercado y los acuerdos comerciales influyen en el valor FOB de las exportaciones.

COD_SAL: Esta variable indica la ciudad colombiana desde la cual se realiza la exportación, lo que permite analizar los patrones logísticos y la distribución geográfica del comercio exterior. Se seleccionaron tres puntos estratégicos: Cartagena, Buenaventura y Bogotá, por su alta representatividad en las exportaciones de julio de 2025. Cartagena y Buenaventura destacan como los principales puertos marítimos del país, mientras que Bogotá actúa como un centro logístico clave por su ubicación y su infraestructura de transporte. Analizar estas ciudades permite identificar el papel de los principales corredores logísticos en el valor de las exportaciones.

POSAR (SECTOR): (Subpartida arancelaria del producto exportado) Clasifica las mercancías según el Sistema Armonizado de Designación y Codificación de Mercancías, identificando el tipo de producto exportado. En este análisis se seleccionaron las subpartidas correspondientes a alimentos y manufacturas, sectores relevantes para la economía colombiana y con estructuras productivas diferentes. Su inclusión permite evaluar cómo el tipo de bien exportado influye en el valor FOB y en la dinámica de las exportaciones colombianas.

AGRENA: Representa el valor agregado nacional asociado a las mercancías exportadas desde Colombia hacia otros países o zonas francas del territorio nacional. Es una variable cuantitativa continua, expresada en valores monetarios, en nuestro caso miles de dólares, que mide el componente de producción interna incorporado en los bienes exportados. Esta variable permite analizar el grado de participación nacional en las exportaciones, reflejando el aporte de la industria y los procesos productivos locales al valor final de los productos que salen del país.

PNK:Representa el peso neto en kilogramos de las mercancías exportadas. Es una variable cuantitativa continua que refleja la cantidad física de los bienes, sin incluir el peso de los envases o embalajes. Esta variable resulta fundamental para analizar la relación entre el volumen exportado y el valor FOB, permitiendo identificar diferencias de eficiencia o valor agregado entre productos de distinto peso.

4. Análisis descriptivo

4.1. Análisis variables cuantitativas

library(readxl)
export <-read_excel("1. EXCEL (1).XLSX")
head(export)
## # A tibble: 6 × 6
##   COD_PAI4 COD_SAL     POSAR   PNK FOBDOL AGRENA
##   <chr>    <chr>       <dbl> <dbl>  <dbl>  <dbl>
## 1 ECU      BOG     603199010   366  1784.      0
## 2 ECU      BOG     603199010   294  1376       0
## 3 ECU      BOG     603199010  2885 12265.      0
## 4 ECU      BOG     603199010   254  1152.      0
## 5 ECU      BOG     603199010  3850 19239       0
## 6 ECU      BOG     603199010    51   292.      0
library(tidyverse)
## ── Attaching core tidyverse packages ──────────────────────── tidyverse 2.0.0 ──
## ✔ dplyr     1.1.4     ✔ readr     2.1.5
## ✔ forcats   1.0.0     ✔ stringr   1.5.1
## ✔ ggplot2   4.0.0     ✔ tibble    3.2.1
## ✔ lubridate 1.9.4     ✔ tidyr     1.3.1
## ✔ purrr     1.0.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
library(car)
## Cargando paquete requerido: carData
## 
## Adjuntando el paquete: 'car'
## 
## The following object is masked from 'package:dplyr':
## 
##     recode
## 
## The following object is masked from 'package:purrr':
## 
##     some
library(lmtest)
## Cargando paquete requerido: zoo
## 
## Adjuntando el paquete: 'zoo'
## 
## The following objects are masked from 'package:base':
## 
##     as.Date, as.Date.numeric
library(ggcorrplot)


library(tidyverse)
export <- export %>%
  mutate(FOBDOL_log = log(FOBDOL))


sum(export$FOBDOL_log == 0, na.rm = TRUE)
## [1] 5
data.frame(
  Min = min(export$FOBDOL_log, na.rm = TRUE),
  Median = median(export$FOBDOL_log, na.rm = TRUE),
  Mean = mean(export$FOBDOL_log, na.rm = TRUE),
  Max = max(export$FOBDOL_log, na.rm = TRUE),
  Des = sd(export$FOBDOL_log, na.rm = TRUE),
  var = var(export$FOBDOL_log, na.rm = TRUE)
)
##         Min   Median     Mean      Max      Des     var
## 1 -3.912023 8.366301 8.295851 16.81677 2.600863 6.76449
sum(export$PNK == 0, na.rm = TRUE)
## [1] 0
data.frame(
  Min = min(export$PNK, na.rm = TRUE),
  Median = median(export$PNK, na.rm = TRUE),
  Mean = mean(export$PNK, na.rm = TRUE),
  Max = max(export$PNK, na.rm = TRUE),
  Des = sd(export$PNK, na.rm = TRUE),
  var = var(export$PNK, na.rm = TRUE)
)
##    Min Median     Mean     Max      Des         var
## 1 0.02    300 25756.01 9843212 266713.8 71136228286
sum(export$AGRENA == 0, na.rm = TRUE)
## [1] 1798
data.frame(
  Min = min(export$AGRENA, na.rm = TRUE),
  Median = median(export$AGRENA, na.rm = TRUE),
  Mean = mean(export$AGRENA, na.rm = TRUE),
  Max = max(export$AGRENA, na.rm = TRUE),
  Des = sd(export$AGRENA, na.rm = TRUE),
  var = var(export$AGRENA, na.rm = TRUE)
)
##   Min Median    Mean      Max      Des          var
## 1   0      0 34260.6 16634224 492286.2 242345717972
tabla_resumen <- tibble(
  Variable = c("FOBDOL_log", "PNK", "AGRENA"),
  Min = round(c(min(export$FOBDOL_log, na.rm = TRUE),
                min(export$PNK, na.rm = TRUE),
                min(export$AGRENA, na.rm = TRUE)), 2),
  Median = round(c(median(export$FOBDOL_log, na.rm = TRUE),
                   median(export$PNK, na.rm = TRUE),
                   median(export$AGRENA, na.rm = TRUE)), 2),
  Mean = round(c(mean(export$FOBDOL_log, na.rm = TRUE),
                 mean(export$PNK, na.rm = TRUE),
                 mean(export$AGRENA, na.rm = TRUE)), 2),
  Max = round(c(max(export$FOBDOL_log, na.rm = TRUE),
                max(export$PNK, na.rm = TRUE),
                max(export$AGRENA, na.rm = TRUE)), 2),
  SD = round(c(sd(export$FOBDOL_log, na.rm = TRUE),
               sd(export$PNK, na.rm = TRUE),
               sd(export$AGRENA, na.rm = TRUE)), 2),
  Var = round(c(var(export$FOBDOL_log, na.rm = TRUE),
                var(export$PNK, na.rm = TRUE),
                var(export$AGRENA, na.rm = TRUE)), 2)
)

4.2. Análisis variables cualitativas

library(knitr)

export$COD_PAI4 <- factor(export$COD_PAI4, levels = c("USA", "PER", "ECU"))

freq_abs <- as.numeric(table(export$COD_PAI4))
freq_rel <- freq_abs / sum(freq_abs)
freq_acum <- cumsum(freq_abs)
percent <- round(freq_rel * 100, 2)
percent_acum <- cumsum(percent)

freq_table <- data.frame(
  País = levels(export$COD_PAI4),
  "Frecuencia Absoluta" = freq_abs,
  "Frecuencia Relativa" = round(freq_rel, 4),
  "Frecuencia Acumulada" = freq_acum,
  "Porcentaje (%)" = percent,
  "Porcentaje Acumulado (%)" = percent_acum,
  check.names = FALSE
)

cat("Tabla 1: Ciudades\n\n")
## Tabla 1: Ciudades
tabla_html <- paste0(
  "<table border='1' cellpadding='5' cellspacing='0' style='border-collapse:collapse; text-align:center;'>",
  "<thead style='background-color:#D6EAF8; font-weight:bold;'>",
  "<tr>",
  paste0("<th>", names(freq_table), "</th>", collapse = ""),
  "</tr>",
  "</thead>",
  "<tbody>",
  paste(
    apply(freq_table, 1, function(fila) {
      paste0("<tr>", paste0("<td>", fila, "</td>", collapse = ""), "</tr>")
    }),
    collapse = ""
  ),
  "</tbody>",
  "<tfoot>",
  "<tr>",
  "<td colspan='6' style='text-align:center; font-weight:bold;'>Tabla 1: COD_PAI4</td>",
  "</tr>",
  "</tfoot>",
  "</table>"
)
    
    
library(htmltools)
browsable(HTML(tabla_html))# Crear tabla en HTML con estilo
PaísFrecuencia AbsolutaFrecuencia RelativaFrecuencia AcumuladaPorcentaje (%)Porcentaje Acumulado (%)
USA14310.6301143163.01 63.01
PER 5430.2391197423.91 86.92
ECU 2970.1308227113.08100.00
Tabla 1: COD_PAI4
#ciudades####################################################################

export$COD_SAL <- factor(export$COD_SAL, levels = c("BOG", "CTG", "BUN"))

freq_abs <- as.numeric(table(export$COD_SAL))
freq_rel <- freq_abs / sum(freq_abs)
freq_acum <- cumsum(freq_abs)
percent <- round(freq_rel * 100, 2)
percent_acum <- cumsum(percent)

freq_table_ciudades <- data.frame(
  Ciudad = levels(export$COD_SAL),
  "Frecuencia Absoluta" = freq_abs,
  "Frecuencia Relativa" = round(freq_rel, 4),
  "Frecuencia Acumulada" = freq_acum,
  "Porcentaje (%)" = percent,
  "Porcentaje Acumulado (%)" = percent_acum,
  check.names = FALSE
)


tabla_ciudades_html <- paste0(
  "<table border='1' cellpadding='5' cellspacing='0' style='border-collapse:collapse; text-align:center;'>",
  "<thead style='background-color:#D6EAF8; font-weight:bold;'>",
  "<tr>",
  paste0("<th>", names(freq_table_ciudades), "</th>", collapse = ""),
  "</tr>",
  "</thead>",
  "<tbody>",
  paste(
    apply(freq_table_ciudades, 1, function(fila) {
      paste0("<tr>", paste0("<td>", fila, "</td>", collapse = ""), "</tr>")
    }),
    collapse = ""
  ),
  "</tbody>",
  "<tfoot>",
  "<tr>",
  "<td colspan='6' style='text-align:center; font-weight:bold;'>Tabla 2: COD_SAL</td>",
  "</tr>",
  "</tfoot>",
  "</table>"
)



library(htmltools)
browsable(HTML(tabla_ciudades_html))
CiudadFrecuencia AbsolutaFrecuencia RelativaFrecuencia AcumuladaPorcentaje (%)Porcentaje Acumulado (%)
BOG13120.5777131257.77 57.77
CTG 5870.2585189925.85 83.62
BUN 3720.1638227116.38100.00
Tabla 2: COD_SAL
#tabala POSAR ##################################################################
library(knitr)

head(export$POSAR)
## [1] 603199010 603199010 603199010 603199010 603199010 603199010
export$Grupo <- ifelse(substr(export$POSAR, 1, 1) == "2", "Alimentos",
                       ifelse(substr(export$POSAR, 1, 1) %in% c("5","6"), "Manufactura", NA))


export$Grupo <- factor(export$Grupo, levels = c("Alimentos", "Manufactura"))

freq_abs <- as.numeric(table(export$Grupo))
freq_rel <- freq_abs / sum(freq_abs)
freq_acum <- cumsum(freq_abs)
percent <- round(freq_rel * 100, 2)
percent_acum <- cumsum(percent)


freq_table_grupos <- data.frame(
  Grupo = levels(export$Grupo),
  "Frecuencia Absoluta" = freq_abs,
  "Frecuencia Relativa" = round(freq_rel, 4),
  "Frecuencia Acumulada" = freq_acum,
  "Porcentaje (%)" = percent,
  "Porcentaje Acumulado (%)" = percent_acum,
  check.names = FALSE
)

library(htmltools)
library(htmltools)


tabla_grupos_html <- paste0(
  "<table border='1' cellpadding='5' cellspacing='0' style='border-collapse:collapse; text-align:center;'>",
  "<thead style='background-color:#D6EAF8; font-weight:bold;'>",
  "<tr>",
  paste0("<th>", names(freq_table_grupos), "</th>", collapse = ""),
  "</tr>",
  "</thead>",
  "<tbody>",
  paste(
    apply(freq_table_grupos, 1, function(fila) {
      paste0("<tr>", paste0("<td>", fila, "</td>", collapse = ""), "</tr>")
    }),
    collapse = ""
  ),
  "</tbody>",
  "<tfoot>",
  "<tr>",
  "<td colspan='6' style='text-align:center; font-weight:bold;'>Tabla 3: POSAR</td>",
  "</tr>",
  "</tfoot>",
  "</table>"
)


browsable(HTML(tabla_grupos_html))
GrupoFrecuencia AbsolutaFrecuencia RelativaFrecuencia AcumuladaPorcentaje (%)Porcentaje Acumulado (%)
Alimentos 7210.3175 72131.75 31.75
Manufactura15500.6825227168.25100.00
Tabla 3: POSAR

Mapas de los países

library(ggplot2)
library(rnaturalearth)
library(rnaturalearthdata)
## 
## Adjuntando el paquete: 'rnaturalearthdata'
## The following object is masked from 'package:rnaturalearth':
## 
##     countries110
library(sf)
## Linking to GEOS 3.13.0, GDAL 3.10.1, PROJ 9.5.1; sf_use_s2() is TRUE
# 
world <- ne_countries(scale = "medium", returnclass = "sf")

paises_destacados <- c("United States of America", "Ecuador", "Peru")


world$color <- ifelse(world$name == "United States of America", "Estados Unidos",
                      ifelse(world$name == "Ecuador", "Ecuador",
                             ifelse(world$name == "Peru", "Perú", "Otros países")))

ggplot(data = world) +
  geom_sf(aes(fill = color), color = "white", size = 0.2) +
  scale_fill_manual(
    values = c(
      "Estados Unidos" = "#FFD700",  # amarillo dorado
      "Ecuador" = "#228B22",         # verde fuerte
      "Perú" = "#1E90FF",            # azul medio
      "Otros países" = "gray90"      # resto del mundo
    ),
    name = "Países resaltados"
  ) +
  labs(
    title = "Mapa de América: Estados Unidos, Ecuador y Perú",
    subtitle = "Estados Unidos (amarillo) • Ecuador (verde) • Perú (azul)"
  ) +
  coord_sf(
    xlim = c(-130, -30),   # límites longitudinales (de oeste a este)
    ylim = c(-60, 55),     # límites latitudinales (de sur a norte)
    expand = FALSE
  ) +
  theme_minimal() +
  theme(
    legend.position = "right",
    legend.title = element_text(size = 12, face = "bold"),
    legend.text = element_text(size = 10),
    plot.title = element_text(size = 14, face = "bold", hjust = 0.5),
    plot.subtitle = element_text(size = 10, hjust = 0.5)
  )

## Mapas de las ciudades

# Instalar si no las tienes
# install.packages(c("ggplot2", "sf", "rnaturalearth", "rnaturalearthdata"))

library(ggplot2)
library(sf)
library(rnaturalearth)
library(rnaturalearthdata)

# Cargar mapa mundial y filtrar solo Colombia
world <- ne_countries(scale = "medium", returnclass = "sf")
colombia <- subset(world, name == "Colombia")

# Crear un data frame con las coordenadas de las ciudades
ciudades <- data.frame(
  nombre = c("Bogota", "Buenaventura", "Cartagena"),
  lon = c(-74.0817, -77.0283, -75.5144),   # Longitudes
  lat = c(4.6097, 3.5833, 10.4000),        # Latitudes
  color = c("Bogota", "Buenaventura", "Cartagena")
)

# Crear el mapa
ggplot(data = colombia) +
  geom_sf(fill = "gray90", color = "white") +
  geom_point(data = ciudades, aes(x = lon, y = lat, color = color), size = 4) +
  geom_text(data = ciudades, aes(x = lon, y = lat, label = nombre),
            vjust = -1, size = 3.5, fontface = "bold") +
  scale_color_manual(
    values = c(
      "Bogota" = "#FFD700",       # amarillo
      "Buenaventura" = "#228B22", # verde
      "Cartagena" = "#1E90FF"     # azul
    ),
    name = "Ciudades destacadas"
  ) +
  labs(
    title = "Mapa de Colombia con ciudades destacadas",
    subtitle = "Bogota (amarillo) • Buenaventura (verde) • Cartagena (azul)"
  ) +
  coord_sf(xlim = c(-80, -70), ylim = c(-5, 13), expand = FALSE) +
  theme_minimal() +
  theme(
    legend.position = "right",
    legend.title = element_text(size = 12, face = "bold"),
    legend.text = element_text(size = 10),
    plot.title = element_text(size = 14, face = "bold", hjust = 0.5),
    plot.subtitle = element_text(size = 10, hjust = 0.5)
  )

Relación entre país y ciudad de exportación

library(tidyverse)


tabla_cruzada <- as.data.frame(table(export$COD_PAI4, export$Grupo))
colnames(tabla_cruzada) <- c("País", "Grupo", "Frecuencia")

tabla_cruzada$Frecuencia <- as.numeric(tabla_cruzada$Frecuencia)

ggplot(tabla_cruzada, aes(x = Grupo, y = País, fill = Frecuencia)) +
  geom_tile(color = "black") +
  geom_text(aes(label = Frecuencia), color = "black", size = 3) +  # 👈 muestra los valores dentro
  scale_fill_gradient(low = "white", high = "#00BFC4") +
  labs(
    title = "Relación entre país y grupo exportado",
    x = "Grupo exportado",
    y = "País al que se exporta",
    fill = "Frecuencia"
  ) +
  theme_minimal(base_size = 13) +
  theme(axis.text.x = element_text(angle = 45, hjust = 1))

library(tidyverse)

El presente diagrama de calor bivariado representa la distribución de frecuencias absolutas de las operaciones de exportación, estableciendo una correlación directa entre el País al que se Exporta (Eje Y) y la Ciudad de Salida (Eje X). El gradiente de color, definido por la escala de Frecuencia, ilustra la intensidad del flujo comercial para cada díada geográfica.

Los datos demuestran una fuerte dependencia logística del puerto interior de Bogotá y del puerto caribeño de Cartagena representa el 89% del total de envios respecto al mercado de los Estados Unidos. Por otro lado, el puerto de Buenaventura muestra una orientación comercial más equilibrada y una mayor relevancia en las cadenas de suministro dirigidas hacia los países vecinos de la Comunidad Andina (Perú y Ecuador). Este análisis es fundamental para la optimización de la capacidad portuaria y la planificación de rutas de transporte terrestre.

Relación entre país y grupo exportado

tabla_cruzada <- as.data.frame(table(export$COD_PAI4, export$COD_SAL))
colnames(tabla_cruzada) <- c("País", "Ciudad", "Frecuencia")

tabla_cruzada$Frecuencia <- as.numeric(tabla_cruzada$Frecuencia)

ggplot(tabla_cruzada, aes(x = Ciudad, y = País, fill = Frecuencia)) +
  geom_tile(color = "black") +
  geom_text(aes(label = Frecuencia), color = "black", size = 3) +  # 👈 muestra los valores dentro
  scale_fill_gradient(low = "white", high = "#00BFC4") +
  labs(
    title = "Relación entre país y ciudad que exporta",
    x = "Ciudad que exporta",
    y = "País al que se exporta",
    fill = "Frecuencia"
  ) +
  theme_minimal(base_size = 13) +
  theme(axis.text.x = element_text(angle = 45, hjust = 1))

El diagrama confirma que la Manufactura es la categoría de producto más importante para las exportaciones en general, siendo Estados Unidos (USA) el mercado principal para ambos grupos de productos, pero especialmente para la Manufactura. Las exportaciones de Alimentos son significativamente menores en comparación, y se concentran principalmente en el mercado estadounidense.

Distribución del valor LOG_FOB transformado

ggplot(export, aes(x = FOBDOL_log)) +
  geom_histogram(fill = "#00BFC4", color = "white", bins = 30) +
  labs(
    title = "Distribución del valor FOB (log)",
    x = "Log del valor FOB (USD)",
    y = "Frecuencia"
  ) +
  theme_minimal(base_size = 13)

El gráfico presenta la distribución del valor FOB una vez aplicada la transformación logarítmica (logaritmo natural). Se observa una forma aproximadamente simétrica, con ligera asimetría a la derecha, lo cual contrasta con la distribución original de los datos sin transformar, que presentaba un sesgo positivo pronunciado. Esta transformación reduce

considerablemente el efecto de valores extremos (outliers), que suelen ser comunes en bases de datos de comercio internacional debido a la presencia de embarques con valores extraordinariamente altos.

5. Gráficos de dispersión

Antes de la estimación del modelo de regresión múltiple, se realizó un análisis exploratorio de los datos mediante gráficos de dispersión con el fin de observar el comportamiento y la relación existente entre las variables involucradas. En este caso, los gráficos de dispersión se emplearon para analizar la relación entre la variable dependiente (LOG _ FOB) y las variables independientes consideradas.

5.1.Relación entre PNK y LOG_FOB

ggplot(export, aes(x = PNK, y = FOBDOL_log)) +
  geom_point(alpha = 0.6, size = 2, color = "steelblue") +
  geom_smooth(method = "lm", se = FALSE, color = "red") +
  labs(
    title = "Relación entre el peso neto (PNK) y el logaritmo natural del valor FOB",
    subtitle = "",
    x = "Peso neto (kg)",
    y = "ln(Valor FOB en USD)"
  ) +
  coord_cartesian(xlim = c(0, 300000), ylim = c(5, 13))+
  
  theme_minimal(base_size = 13) +
  theme(
    plot.title = element_text(face = "bold"),
    plot.subtitle = element_text(size = 11, color = "gray30"),
    panel.grid.minor = element_blank(),
    panel.grid.major.x = element_line(color = "gray80", linetype = "dotted")
  )
## `geom_smooth()` using formula = 'y ~ x'

cor(export$PNK, export$FOBDOL_log, use = "complete.obs", method = "pearson")
## [1] 0.2023698

A partir de la visualización se puede observar que la mayoría de los puntos se concentran cerca del eje vertical, es decir, en valores bajos de peso neto. Esto indica que la mayor parte de las observaciones corresponden a productos con pesos relativamente pequeños. Sin embargo, a medida que el peso neto aumenta, también tiende a incrementarse ligeramente el valor FOB, lo que sugiere la existencia de una relación positiva débil entre ambas variables. Esto sugiere que el peso influye ligeramente en el valor exportado, pero no es un factor determinante por sí solo, lo que indica que otros factores pueden ser más relevantes.

El coeficiente de correlación obtenido (r = 0.2024) confirma esta observación visual, señalando una correlación positiva pero débil entre las variables

5.2 Relación entre AGRENA y LOG-FOB

ggplot(export, aes(x = AGRENA, y = FOBDOL_log)) +
  geom_point(alpha = 0.6, size = 2, color = "#B2FBA5") +
  geom_smooth(method = "lm", se = FALSE, color = "red") +
  labs(
    title = "Relación entre el Valor Agregado Nacional y el logaritmo natural del valor FOB",
    subtitle = "",
    x = "AGRENA",
    y = "ln(Valor FOB en USD)"
  ) +
  coord_cartesian(xlim = c(0, 300000), ylim = c(5, 13))+
  
  theme_minimal(base_size = 13) +
  theme(
    plot.title = element_text(face = "bold"),
    plot.subtitle = element_text(size = 11, color = "gray30"),
    panel.grid.minor = element_blank(),
    panel.grid.major.x = element_line(color = "gray80", linetype = "dotted")
  )
## `geom_smooth()` using formula = 'y ~ x'

cor(export$AGRENA, export$FOBDOL_log, use = "complete.obs", method = "pearson")
## [1] 0.1781332

A simple vista, se observa que la mayoría de los puntos se concentran en valores bajos de AGRENA, lo cual sugiere que la mayor parte de los registros corresponden a productos con un valor agregado nacional reducido. Sin embargo, en el rango inicial se percibe una tendencia creciente pronunciada del logaritmo del valor FOB conforme aumenta el AGRENA, aunque esta relación parece estabilizarse para valores más altos.

El coeficiente de correlación (r = 0.1781) confirma esta observación, indicando una correlación positiva débil entre ambas variables. Esto significa que, en general, los productos con un mayor valor agregado nacional tienden a registrar valores FOB ligeramente más altos, aunque la relación no es fuerte ni claramente lineal.

Metodología

6.1. Ecuación modelo

ln(FOB​)\(=β0​+β1​(PNK)\)​+β2​(AGRENA)$​+​β3(COD_PAI4)​+​β4(​COD_SAL)​+​β5(SECTOR)​+ε

En donde: 1. LOG_FOB es la variable respuesta, correspondiente al logaritmo natural del valor FOB en dólares. 2. PNK, AGRENA, sector, COD_PAI4 y COD_SAL son las variables explicativas o predictoras del modelo. 3. Los coeficientes β₁, β₂, β₃, β₄ y β₅ miden el efecto porcentual aproximado sobre el valor FOB ante un cambio unitario en cada predictor, manteniendo las demás variables constantes. 4. β₀ representa el valor promedio del log(FOB) cuando las variables explicativas están en su valor base, y ϵ es el término de error o ruido blanco, que recoge los factores no observados que influyen en la variable dependiente.

6.2. Resultados

export <- export %>%
  mutate(SECTOR = case_when(
    str_starts(POSAR, "6") | str_starts(POSAR, "5") ~ "Manufactura",
    str_starts(POSAR, "2") ~ "Alimentos",
    TRUE ~ "Otro"
  ))
library(tidyverse)
library(broom)
library(knitr)
library(kableExtra)
## 
## Adjuntando el paquete: 'kableExtra'
## The following object is masked from 'package:dplyr':
## 
##     group_rows
export <- export %>%
  mutate(log_FOB = log(FOBDOL))  

modelo_loglin <- lm(log_FOB ~ PNK + AGRENA + COD_PAI4 + COD_SAL + as.factor(SECTOR), data = export)

tabla_base <- tidy(modelo_loglin)

tabla_resultados <- tabla_base %>%
  mutate(
    Variable = case_when(
      term == "(Intercept)" ~ "Intercepto (valor base del modelo)",
      term == "PNK" ~ "PNK: Productividad Nacional",
      term == "AGRENA" ~ "AGRENA: Agricultura Nacional",
      term == "COD_PAI4" ~ "COD_PAI4: Código del país exportador",
      term == "COD_SAL" ~ "COD_SAL: Código del punto de salida",
      str_detect(term, "SECTOR") ~ paste0("Sector: ", str_remove(term, "as.factor\\(SECTOR\\)")),
      TRUE ~ term
    ),
    Significancia = case_when(
      p.value < 0.001 ~ "***",
      p.value < 0.01  ~ "**",
      p.value < 0.05  ~ "*",
      p.value < 0.1   ~ ".",
      TRUE ~ ""
    )
  ) %>%
  select(Variable,
         Estimate = estimate,
         `Std. Error` = std.error,
         `t value` = statistic,
         `Pr(>|t|)` = p.value,
         Significancia)

kable(tabla_resultados, digits = 6, caption = "Resultados del modelo Log-Lin con descripciones automáticas") %>%
  kable_styling(full_width = FALSE, position = "center", bootstrap_options = c("striped", "hover", "condensed", "responsive"))
Resultados del modelo Log-Lin con descripciones automáticas
Variable Estimate Std. Error t value Pr(>&#124;t&#124;) Significancia
Intercepto (valor base del modelo) 8.611686 0.163095 52.801767 0.000000 ***
PNK: Productividad Nacional 0.000001 0.000000 7.239170 0.000000 ***
AGRENA: Agricultura Nacional 0.000001 0.000000 7.086253 0.000000 ***
COD_PAI4PER -0.669018 0.134760 -4.964519 0.000001 ***
COD_PAI4ECU -0.126583 0.157039 -0.806061 0.420292
COD_SALCTG 0.712688 0.160314 4.445579 0.000009 ***
COD_SALBUN 1.307946 0.171691 7.618030 0.000000 ***
Sector: Manufactura -0.880074 0.147867 -5.951793 0.000000 ***
r2 <- summary(modelo_loglin)$r.squared
cat("\n\n**Multiple R-squared:**", round(r2, 4), "\n")
## 
## 
## **Multiple R-squared:** 0.1576
cat("\n**Sector de referencia del modelo:**", levels(as.factor(export$SECTOR))[1], "\n")
## 
## **Sector de referencia del modelo:** Alimentos

6.3.Interpretación de resultados

Dado que el modelo de regresión utiliza como variable dependiente el logaritmo del valor FOB, los coeficientes pueden interpretarse de dos maneras. En primer lugar, manteniendo la escala logarítmica, lo que permite un análisis más técnico del cambio proporcional en el log(FOB). En segundo lugar, aplicando la función exponencial (eβi−1)(e^{β_i} - 1)(eβi​−1), que traduce dichos efectos en variaciones porcentuales sobre el valor FOB real, facilitando una interpretación más práctica. Ambas formas son válidas y complementarias: la primera conserva el rigor estadístico, mientras que la segunda permite expresar los resultados en términos económicos directos.

En la interpretación en logaritmos, el modelo muestra que el logaritmo del valor FOB aumenta ligeramente con el peso neto (PNK) y con el valor agregado nacional (AGRENA), evidenciando una relación positiva aunque de pequeña magnitud. Las exportaciones hacia Perú presentan un log(FOB) significativamente menor que las del país base, mientras que las dirigidas a Estados Unidos no muestran diferencias significativas. En cuanto a las ciudades de salida, las exportaciones desde Buenaventura (BUN) y Cartagena (CTG) exhiben logaritmos de valor FOB superiores, y el sector manufacturero registra un log(FOB) inferior, lo que indica menores valores de exportación.

Por otro lado, en la interpretación exponencial, un aumento de una unidad en PNK incrementa el valor FOB en aproximadamente 0.001%, y un incremento en AGRENA lo eleva en 0.0001%, manteniendo constantes las demás variables. Las exportaciones hacia Perú presentan un valor FOB 41.8% menor, mientras que las provenientes de Buenaventura y Cartagena son 272% y 104% mayores, respectivamente, frente a la ciudad base. Finalmente, el sector manufacturero muestra un valor FOB 58.6% menor en comparación con el sector de referencia.

6.4. Coeficiente R2

El valor del R² es de 0.1576, lo que indica que el modelo logra explicar aproximadamente el 15.76% de la variabilidad del valor FOB (en logaritmos) a partir de las variables predictoras incluidas: PNK, AGRENA, sector (POSAR), país y ciudad de salida. Esto sugiere que, aunque el modelo presenta una capacidad explicativa moderadamente baja, las variables incorporadas sí aportan información relevante sobre el comportamiento del valor FOB. Sin embargo, la mayor parte de la variación del valor de exportación se debe a otros factores no contemplados en el modelo, lo cual es común en fenómenos económicos o comerciales donde influyen múltiples variables externas. Aun así, el modelo resulta útil para identificar las relaciones más significativas y la dirección de los efectos de las variables analizadas sobre el valor FOB.

7. Evaluación de los supuestos del modelo

7.1. Normalidad de los residuos

shapiro.test(residuals(modelo_loglin))
## 
##  Shapiro-Wilk normality test
## 
## data:  residuals(modelo_loglin)
## W = 0.98228, p-value = 3.304e-16
library(nortest)
lillie.test(residuals(modelo_loglin))
## 
##  Lilliefors (Kolmogorov-Smirnov) normality test
## 
## data:  residuals(modelo_loglin)
## D = 0.034308, p-value = 1.683e-06

7.2. Homocedasticidad

library(lmtest)
bptest(modelo_loglin)
## 
##  studentized Breusch-Pagan test
## 
## data:  modelo_loglin
## BP = 81.237, df = 7, p-value = 7.704e-15

7.3. Independencia de los errores

dwtest(modelo_loglin)
## 
##  Durbin-Watson test
## 
## data:  modelo_loglin
## DW = 1.373, p-value < 2.2e-16
## alternative hypothesis: true autocorrelation is greater than 0

7.4. Multicolinealidad

library(car)
vif(modelo_loglin)
##                       GVIF Df GVIF^(1/(2*Df))
## PNK               1.107241  1        1.052255
## AGRENA            1.101892  1        1.049710
## COD_PAI4          1.298986  2        1.067582
## COD_SAL           2.396425  2        1.244202
## as.factor(SECTOR) 1.882377  1        1.371997

Gráficos de los supuestos

1.Linealidad y homocedasticidad

res_df<- augment(modelo_loglin)
ggplot(res_df, aes(x = .fitted, y = .resid)) +
  geom_point(alpha = 0.5, color = "#0072B2") +
  geom_hline(yintercept = 0, linetype = "dashed", color = "red") +
  labs(
    title = "Figura 1. Linealidad y Homocedasticidad",
    subtitle = "Relación entre valores ajustados y residuos",
    x = "Valores ajustados",
    y = "Residuos"
  ) +
  theme_minimal(base_size = 13)

En la Figura 1 se observa la relación entre los valores ajustados y los residuos del modelo. Los residuos se distribuyen en torno a la línea roja (valor cero), lo cual sugiere que el supuesto de linealidad se cumple de manera aceptable. Sin embargo, la dispersión creciente a medida que aumentan los valores ajustados indica una posible heterocedasticidad, es decir, que la varianza de los errores no es constante. Esto podría implicar que el modelo tiene un ajuste desigual para diferentes niveles del valor FOB.

2.Homocedasticidad

El test de Breusch-Pagan (BP = 81.237, p-value < 0.001) rechaza la hipótesis nula de homocedasticidad, indicando la presencia de heterocedasticidad en el modelo. Esto significa que la varianza de los errores no es constante, lo que puede afectar la precisión de las pruebas de significancia de los coeficientes. Para mitigar este problema, se recomienda el uso de errores estándar robustos en la estimación del modelo.

bptest(modelo_loglin)
## 
##  studentized Breusch-Pagan test
## 
## data:  modelo_loglin
## BP = 81.237, df = 7, p-value = 7.704e-15

3.Normalidad

res_df<- augment(modelo_loglin)
ggplot(res_df, aes(x = .resid)) +
  geom_histogram(aes(y = after_stat(density)), bins = 30, fill = "#3498db", color = "white") +
  geom_density(linewidth = 1, color = "#e74c3c") +
  labs(
    title = "Figura 2. Distribución de los residuos",
    subtitle = "Evaluación visual del supuesto de normalidad",
    x = "Residuos",
    y = "Densidad"
  ) +
  theme_minimal(base_size = 13)

4.Distribución de los residuos

qqPlot(modelo_loglin, main = "Figura 3. QQ-Plot de los residuos")

## [1]  971 1098

Multicolinealidad

library(car)
library(knitr)
library(kableExtra)

# Calcular VIF
vif_tabla <- car::vif(modelo_loglin)

# Convertir a data frame limpio
vif_tabla_df <- as.data.frame(vif_tabla)
vif_tabla_df <- vif_tabla_df %>%
  tibble::rownames_to_column("Variable") %>%
  rename(
    GVIF = GVIF,
    Df = Df,
    `GVIF^(1/(2*Df))` = `GVIF^(1/(2*Df))`
  )

# Mostrar tabla formateada
vif_tabla_df %>%
  kable(
    caption = "Tabla 1. Factores de Inflación de la Varianza (VIF)",
    digits = 3,
    align = "c"
  ) %>%
  kable_styling(
    full_width = FALSE,
    position = "center",
    bootstrap_options = c("striped", "hover", "condensed")
  )
Tabla 1. Factores de Inflación de la Varianza (VIF)
Variable GVIF Df GVIF^(1/(2*Df))
PNK 1.107 1 1.052
AGRENA 1.102 1 1.050
COD_PAI4 1.299 2 1.068
COD_SAL 2.396 2 1.244
as.factor(SECTOR) 1.882 1 1.372

El coeficiente de correlación de Pearson (r=0.178) nos indica una relación positiva débil entre AGRENA y LOG_FOBDOL, al ser todos los valores inferiores a 5, indica que las variables explicativas no están fuertemente relacionadas entre sí. Por lo tanto, cada una aporta información relevante al modelo sin redundancia.

8. Conclusiones

8.1. Conclusiones El modelo logra explicar aproximadamente el 15.76% de la variabilidad del valor FOB (en logaritmos) a partir de las variables predictoras incluidas: PNK, AGRENA, sector (POSAR), país y ciudad de salida. un porcentaje ciertamente bajo a comparación del modelo lin-lin, lo que al principio resultaba ser confuso, pero analizando un poco más a fondo se concluye que el “valor alto” del modelo completamente lineal se debe a los puntos extremos que tiene, siendo un ajuste. En términos generales, el modelo de regresión lineal múltiple aplicado al logaritmo del valor FOB cumple de forma aceptable con los supuestos estadísticos básicos, aunque presenta algunas limitaciones. Los residuos muestran una distribución aproximadamente normal, centrada en torno a cero, lo que sugiere un ajuste adecuado y ausencia de sesgos sistemáticos significativos. Sin embargo, indica la presencia de heterocedasticidad, es decir, una varianza no constante de los errores, lo que puede afectar la eficiencia de las estimaciones de los coeficientes. Además, el análisis del VIF señala niveles de multicolinealidad moderada, lo que implica que algunas variables explicativas comparten información entre sí, aunque no en un grado crítico. Al aplicar la transformación logarítmica al valor FOB, el coeficiente de determinación (R²) se redujo de 93 % a 15 %. Esta disminución se explica porque la transformación logarítmica atenúa la influencia de valores extremos y muestra una relación más proporcional entre las variables. Además, la variable AGRENA presenta numerosos valores iguales a cero, lo cual limita su capacidad explicativa en el modelo logarítmico, reduciendo la variabilidad que puede ser explicada por el conjunto de predictores.

8.2 Estrategias o recomendaciones 1. Explorar transformaciones adicionales: Aunque el logaritmo del FOB ayudó a estabilizar la varianza, la relación entre algunas variables podría no ser completamente lineal. Sería conveniente probar otros modelos (como modelos log-log o de regresión robusta) para capturar mejor las relaciones reales entre las variables. 2.Ampliar el conjunto de variables predictoras: El bajo R² (15.76%) sugiere que gran parte de la variabilidad del valor FOB depende de factores no incluidos. Podrían incorporarse variables adicionales, aunque la base de datos cuenta con variables muy limitadas. 3.Interpretación aplicada a política comercial: Desde una perspectiva práctica, los resultados muestran que el peso y el valor agregado nacional influyen positivamente, aunque de forma débil, en el valor exportado. Esto sugiere la necesidad de fortalecer la producción con mayor contenido nacional y optimizar la logística de salida desde los principales puertos (Cartagena y Buenaventura), aprovechando su efecto positivo en el valor FOB.

9.Referencias

Departamento Administrativo Nacional de Estadística (DANE). (2025). Estadísticas de exportaciones – EXPO 2025 [Microdatos]. CI-MICRODATOS. https://microdatos.dane.gov.co/index.php/catalog/859