Este informe examina el comportamiento de algunos componentes de la balanza de pagos de Colombia a partir de información descargada del Banco de la República. Se analizan estadísticas descriptivas y tendencias trimestrales de la cuenta corriente y de la cuenta financiera.
Los resultados dependen de las variables, unidades de medida, periodo cubierto y convención de signos de los archivos suministrados. Por ello, las cifras se interpretan como resultados descriptivos y no como evidencia causal de los efectos de una política económica.
Selecciona el archivo Excel que contiene los componentes de la cuenta
corriente. El archivo debe incluir una hoja llamada Hoja1 y
las columnas utilizadas en este análisis.
archivo_corriente <- file.choose()
hojas_corriente <- excel_sheets(archivo_corriente)
hoja_corriente <- if ("Hoja1" %in% hojas_corriente) "Hoja1" else hojas_corriente[1]
datos <- read_excel(archivo_corriente, sheet = hoja_corriente)
cat("Filas:", nrow(datos), "| Columnas:", ncol(datos), "\n")
## Filas: 122 | Columnas: 12
knitr::kable(head(datos, 6), caption = "Primeras observaciones de la cuenta corriente")
| periodo | expot_bienes | import_bienes | balanza_servi | export_servi | import_servi | export_bys | import_bys | ingresos_prim | egresos_prim | ingresos_secun | egresos_secun |
|---|---|---|---|---|---|---|---|---|---|---|---|
| 1 Trimestre 1996 | 2736.082 | 3265.674 | -271.1385 | 557.1634 | 838.3019 | 3293.245 | 4103.976 | 178.7024 | 638.8395 | 219.8175 | 50.91792 |
| 2 Trimestre 1996 | 2772.532 | 3241.638 | -287.2955 | 549.8720 | 837.1675 | 3322.404 | 4078.805 | 176.6244 | 657.2768 | 218.2638 | 55.58421 |
| 3 Trimestre 1996 | 2602.464 | 3241.101 | -281.0271 | 546.8914 | 827.9186 | 3149.355 | 4069.019 | 169.5188 | 712.1316 | 237.0597 | 56.41061 |
| 4 Trimestre 1996 | 2855.111 | 3309.342 | -380.9770 | 539.0211 | 919.9981 | 3394.132 | 4229.340 | 191.0787 | 770.1031 | 248.4735 | 54.82585 |
| 1 Trimestre 1997 | 2915.388 | 3328.379 | -358.1589 | 551.3558 | 909.5147 | 3466.744 | 4237.894 | 213.9615 | 777.2428 | 233.0089 | 65.63129 |
| 2 Trimestre 1997 | 3024.451 | 3579.288 | -405.4530 | 524.6938 | 930.1468 | 3549.145 | 4509.435 | 227.2897 | 833.9915 | 243.6732 | 39.89975 |
columnas_corriente <- c(
"periodo", "expot_bienes", "import_bienes",
"export_servi", "import_servi", "ingresos_prim",
"egresos_prim", "ingresos_secun", "egresos_secun",
"export_bys", "import_bys"
)
validar_columnas(datos, columnas_corriente, "cuenta corriente")
variables_corrientes <- setdiff(columnas_corriente, "periodo")
datos <- convertir_numericas(datos, variables_corrientes)
# Se mantiene el orden original del archivo, que debe estar organizado cronológicamente.
datos <- datos %>% mutate(indice = row_number())
estructura <- data.frame(
Variable = names(datos),
Tipo = vapply(datos, function(x) class(x)[1], character(1)),
Valores_faltantes = vapply(datos, function(x) sum(is.na(x)), integer(1))
)
knitr::kable(estructura, caption = "Estructura y valores faltantes")
| Variable | Tipo | Valores_faltantes | |
|---|---|---|---|
| periodo | periodo | character | 0 |
| expot_bienes | expot_bienes | numeric | 0 |
| import_bienes | import_bienes | numeric | 0 |
| balanza_servi | balanza_servi | numeric | 0 |
| export_servi | export_servi | numeric | 0 |
| import_servi | import_servi | numeric | 0 |
| export_bys | export_bys | numeric | 0 |
| import_bys | import_bys | numeric | 0 |
| ingresos_prim | ingresos_prim | numeric | 0 |
| egresos_prim | egresos_prim | numeric | 0 |
| ingresos_secun | ingresos_secun | numeric | 0 |
| egresos_secun | egresos_secun | numeric | 0 |
| indice | indice | integer | 0 |
La tabla anterior permite revisar los tipos de variables y detectar datos faltantes. Antes de interpretar las tendencias, conviene confirmar que el periodo esté ordenado cronológicamente y que todas las cifras estén expresadas en una unidad comparable.
Los saldos se calculan como exportaciones menos importaciones o, en el caso de los ingresos, ingresos menos egresos. Un saldo positivo indica que el primer componente supera al segundo; un saldo negativo indica lo contrario.
datos <- datos %>%
mutate(
saldo_bienes = expot_bienes - import_bienes,
saldo_servicios = export_servi - import_servi,
saldo_primarios = ingresos_prim - egresos_prim,
saldo_secundarios = ingresos_secun - egresos_secun,
saldo_bienes_servicios = export_bys - import_bys
)
tabla_saldos <- datos %>%
select(periodo, saldo_bienes, saldo_servicios,
saldo_primarios, saldo_secundarios, saldo_bienes_servicios)
knitr::kable(
head(tabla_saldos, 10),
digits = 2,
caption = "Saldos calculados para las primeras diez observaciones"
)
| periodo | saldo_bienes | saldo_servicios | saldo_primarios | saldo_secundarios | saldo_bienes_servicios |
|---|---|---|---|---|---|
| 1 Trimestre 1996 | -529.59 | -281.14 | -460.14 | 168.90 | -810.73 |
| 2 Trimestre 1996 | -469.11 | -287.30 | -480.65 | 162.68 | -756.40 |
| 3 Trimestre 1996 | -638.64 | -281.03 | -542.61 | 180.65 | -919.66 |
| 4 Trimestre 1996 | -454.23 | -380.98 | -579.02 | 193.65 | -835.21 |
| 1 Trimestre 1997 | -412.99 | -358.16 | -563.28 | 167.38 | -771.15 |
| 2 Trimestre 1997 | -554.84 | -405.45 | -606.70 | 203.77 | -960.29 |
| 3 Trimestre 1997 | -695.30 | -358.85 | -579.72 | 167.15 | -1054.15 |
| 4 Trimestre 1997 | -974.64 | -401.65 | -576.05 | 175.02 | -1376.29 |
| 1 Trimestre 1998 | -975.31 | -384.28 | -471.49 | 179.10 | -1359.58 |
| 2 Trimestre 1998 | -729.24 | -367.00 | -447.32 | 157.00 | -1096.25 |
resumen_corriente <- datos %>%
summarise(
across(
all_of(c("saldo_bienes", "saldo_servicios", "saldo_primarios",
"saldo_secundarios", "saldo_bienes_servicios")),
list(
Promedio = ~ mean(.x, na.rm = TRUE),
Mediana = ~ median(.x, na.rm = TRUE),
Minimo = ~ min(.x, na.rm = TRUE),
Maximo = ~ max(.x, na.rm = TRUE),
Desv_estandar = ~ sd(.x, na.rm = TRUE)
),
.names = "{.col}_{.fn}"
)
)
knitr::kable(
t(resumen_corriente),
digits = 2,
col.names = "Valor",
caption = "Estadísticas descriptivas de los saldos"
)
| Valor | |
|---|---|
| saldo_bienes_Promedio | -817.51 |
| saldo_bienes_Mediana | -359.90 |
| saldo_bienes_Minimo | -4814.00 |
| saldo_bienes_Maximo | 2193.18 |
| saldo_bienes_Desv_estandar | 1590.17 |
| saldo_servicios_Promedio | -798.66 |
| saldo_servicios_Mediana | -720.16 |
| saldo_servicios_Minimo | -2170.89 |
| saldo_servicios_Maximo | 171.96 |
| saldo_servicios_Desv_estandar | 513.77 |
| saldo_primarios_Promedio | -1985.50 |
| saldo_primarios_Mediana | -1892.11 |
| saldo_primarios_Minimo | -4669.21 |
| saldo_primarios_Maximo | -240.49 |
| saldo_primarios_Desv_estandar | 1200.58 |
| saldo_secundarios_Promedio | 1526.45 |
| saldo_secundarios_Mediana | 1236.71 |
| saldo_secundarios_Minimo | 157.00 |
| saldo_secundarios_Maximo | 4297.89 |
| saldo_secundarios_Desv_estandar | 1083.15 |
| saldo_bienes_servicios_Promedio | -1616.17 |
| saldo_bienes_servicios_Mediana | -981.19 |
| saldo_bienes_servicios_Minimo | -5442.01 |
| saldo_bienes_servicios_Maximo | 711.52 |
| saldo_bienes_servicios_Desv_estandar | 1677.23 |
saldos_largos <- datos %>%
select(indice, periodo, saldo_bienes, saldo_servicios) %>%
tidyr::pivot_longer(
cols = c(saldo_bienes, saldo_servicios),
names_to = "Componente",
values_to = "Saldo"
) %>%
mutate(
Componente = recode(
Componente,
saldo_bienes = "Bienes",
saldo_servicios = "Servicios"
)
)
ggplot(saldos_largos, aes(x = indice, y = Saldo, color = Componente)) +
geom_hline(yintercept = 0, linetype = "dashed", color = "grey50") +
geom_line(linewidth = 0.9, na.rm = TRUE) +
scale_x_continuous(
breaks = pretty(datos$indice, n = 8),
labels = function(x) datos$periodo[pmax(1, pmin(nrow(datos), round(x)))]
) +
scale_y_continuous(labels = label_number(big.mark = ".", decimal.mark = ",")) +
scale_color_manual(values = c("Bienes" = "#176B87", "Servicios" = "#D97706")) +
labs(
title = "Evolución de los saldos de bienes y servicios",
subtitle = "Exportaciones menos importaciones",
x = "Periodo",
y = "Saldo",
color = "Componente",
caption = "Fuente: elaboración propia con datos del Banco de la República."
) +
tema_profesional +
theme(axis.text.x = element_text(angle = 45, hjust = 1))
Interpretación. La línea horizontal en cero permite distinguir los periodos con superávit (valores positivos) de aquellos con déficit (valores negativos). La distancia respecto a cero refleja la magnitud del saldo. Las subidas y bajadas muestran cambios en el tiempo, pero por sí solas no permiten atribuirlos a una causa específica.
serie_bs <- datos %>% filter(!is.na(saldo_bienes_servicios))
if (nrow(serie_bs) == 0) {
stop("No hay observaciones válidas para calcular el saldo de bienes y servicios.")
}
resumen_bs <- data.frame(
Indicador = c("Promedio", "Mediana", "Mínimo", "Máximo", "Desviación estándar"),
Valor = c(
mean(serie_bs$saldo_bienes_servicios),
median(serie_bs$saldo_bienes_servicios),
min(serie_bs$saldo_bienes_servicios),
max(serie_bs$saldo_bienes_servicios),
sd(serie_bs$saldo_bienes_servicios)
)
)
knitr::kable(resumen_bs, digits = 2, caption = "Resumen del saldo de bienes y servicios")
| Indicador | Valor |
|---|---|
| Promedio | -1616.17 |
| Mediana | -981.19 |
| Mínimo | -5442.01 |
| Máximo | 711.52 |
| Desviación estándar | 1677.23 |
ggplot(datos, aes(x = indice, y = saldo_bienes_servicios)) +
geom_hline(yintercept = 0, linetype = "dashed", color = "grey45") +
geom_line(color = "#176B87", linewidth = 0.9, na.rm = TRUE) +
geom_point(color = "#176B87", size = 1.6, na.rm = TRUE) +
scale_x_continuous(
breaks = pretty(datos$indice, n = 8),
labels = function(x) datos$periodo[pmax(1, pmin(nrow(datos), round(x)))]
) +
scale_y_continuous(labels = label_number(big.mark = ".", decimal.mark = ",")) +
labs(
title = "Evolución del saldo de bienes y servicios",
subtitle = "Valores positivos indican superávit; valores negativos, déficit",
x = "Periodo",
y = "Saldo",
caption = "Fuente: elaboración propia con datos del Banco de la República."
) +
tema_profesional +
theme(axis.text.x = element_text(angle = 45, hjust = 1))
Interpretación automática de los resultados. En el periodo disponible, el saldo promedio fue de -1.616,17 y la mediana fue de -981,19. El valor mínimo correspondió a 4 Trimestre 2021, con -5.442,01; el máximo se registró en 1 Trimestre 2012, con 711,52.
Si el promedio es negativo, significa que durante el periodo considerado las importaciones superaron a las exportaciones en promedio. Si es positivo, ocurrió lo contrario. La mediana ayuda a comprobar si el resultado central está influido por valores extremos. Estos indicadores describen únicamente el saldo de bienes y servicios, no el saldo total de la cuenta corriente.
componentes <- data.frame(
Componente = c(
"Exportaciones de bienes", "Importaciones de bienes",
"Exportaciones de servicios", "Importaciones de servicios",
"Ingresos primarios", "Egresos primarios",
"Ingresos secundarios", "Egresos secundarios"
),
Promedio = c(
mean(datos$expot_bienes, na.rm = TRUE),
mean(datos$import_bienes, na.rm = TRUE),
mean(datos$export_servi, na.rm = TRUE),
mean(datos$import_servi, na.rm = TRUE),
mean(datos$ingresos_prim, na.rm = TRUE),
mean(datos$egresos_prim, na.rm = TRUE),
mean(datos$ingresos_secun, na.rm = TRUE),
mean(datos$egresos_secun, na.rm = TRUE)
)
)
knitr::kable(componentes, digits = 2, caption = "Promedio de los componentes de la cuenta corriente")
| Componente | Promedio |
|---|---|
| Exportaciones de bienes | 8676.02 |
| Importaciones de bienes | 9493.53 |
| Exportaciones de servicios | 1789.28 |
| Importaciones de servicios | 2587.94 |
| Ingresos primarios | 915.17 |
| Egresos primarios | 2900.68 |
| Ingresos secundarios | 1714.44 |
| Egresos secundarios | 187.99 |
ggplot(componentes, aes(x = reorder(Componente, Promedio), y = Promedio)) +
geom_col(fill = "#176B87", width = 0.72) +
coord_flip() +
scale_y_continuous(labels = label_number(big.mark = ".", decimal.mark = ",")) +
labs(
title = "Promedio de los componentes de la cuenta corriente",
x = NULL,
y = "Promedio",
caption = "Fuente: elaboración propia con datos del Banco de la República."
) +
tema_profesional
Interpretación. La comparación de promedios permite observar qué componentes tienen mayor magnitud y contrastar ingresos con egresos. Para interpretar el resultado de manera económica, se debe confirmar que todas las columnas estén expresadas en la misma unidad y que correspondan al mismo periodo de referencia.
Selecciona el archivo Excel que contiene la cuenta financiera. Este
código importa el archivo una sola vez y utiliza la hoja
Hoja1 si existe; de lo contrario, selecciona la primera
hoja disponible.
archivo_financiera <- file.choose()
hojas_financieras <- excel_sheets(archivo_financiera)
hoja_financiera <- if ("Hoja1" %in% hojas_financieras) "Hoja1" else hojas_financieras[1]
datos_financiera <- read_excel(archivo_financiera, sheet = hoja_financiera)
knitr::kable(head(datos_financiera, 6), caption = "Primeras observaciones de la cuenta financiera")
| periodo | Inver_dire | inver_cart | deri_finan | otra_inver | acti_reser |
|---|---|---|---|---|---|
| 1 Trimestre 1996 | -3559.8765 | -1031.620 | -411.1333 | 3913.716 | 542.8903 |
| 2 Trimestre 1996 | -3188.0964 | 6653.049 | -804.4067 | -6930.224 | 550.3352 |
| 3 Trimestre 1996 | -6747.9729 | 5621.429 | -1215.5400 | -3016.508 | 1093.2255 |
| 4 Trimestre 1996 | -179.2054 | 1156.047 | -422.2829 | -2443.940 | 563.5773 |
| 1 Trimestre 1997 | -1805.4008 | -3533.896 | -448.3182 | 3370.491 | 524.5847 |
| 2 Trimestre 1997 | -1933.1520 | -4078.635 | -398.3049 | 3430.717 | 534.1645 |
columnas_financieras <- c(
"periodo", "Inver_dire", "inver_cart", "deri_finan",
"otra_inver", "acti_reser"
)
validar_columnas(datos_financiera, columnas_financieras, "cuenta financiera")
variables_financieras <- setdiff(columnas_financieras, "periodo")
datos_financiera <- convertir_numericas(datos_financiera, variables_financieras) %>%
mutate(indice = row_number())
knitr::kable(
data.frame(
Variable = names(datos_financiera),
Tipo = vapply(datos_financiera, function(x) class(x)[1], character(1)),
Valores_faltantes = vapply(datos_financiera, function(x) sum(is.na(x)), integer(1))
),
caption = "Estructura y valores faltantes de la cuenta financiera"
)
| Variable | Tipo | Valores_faltantes | |
|---|---|---|---|
| periodo | periodo | character | 11 |
| Inver_dire | Inver_dire | numeric | 0 |
| inver_cart | inver_cart | numeric | 0 |
| deri_finan | deri_finan | numeric | 0 |
| otra_inver | otra_inver | numeric | 0 |
| acti_reser | acti_reser | numeric | 0 |
| indice | indice | integer | 0 |
componentes_financieros <- c(
"Inver_dire", "inver_cart", "deri_finan", "otra_inver", "acti_reser"
)
resumen_financiero <- bind_rows(lapply(componentes_financieros, function(variable) {
x <- datos_financiera[[variable]]
data.frame(
Componente = variable,
Observaciones_validas = sum(!is.na(x)),
Promedio = if (all(is.na(x))) NA_real_ else mean(x, na.rm = TRUE),
Mediana = if (all(is.na(x))) NA_real_ else median(x, na.rm = TRUE),
Minimo = if (all(is.na(x))) NA_real_ else min(x, na.rm = TRUE),
Maximo = if (all(is.na(x))) NA_real_ else max(x, na.rm = TRUE),
Desviacion_estandar = if (sum(!is.na(x)) < 2) NA_real_ else sd(x, na.rm = TRUE)
)
}))
knitr::kable(resumen_financiero, digits = 2, caption = "Estadísticas descriptivas de la cuenta financiera")
| Componente | Observaciones_validas | Promedio | Mediana | Minimo | Maximo | Desviacion_estandar |
|---|---|---|---|---|---|---|
| Inver_dire | 133 | -2858.12 | -2057.89 | -15646.18 | 2320.54 | 3030.67 |
| inver_cart | 133 | -615.47 | -174.69 | -11564.82 | 8662.73 | 2616.74 |
| deri_finan | 133 | -43.44 | 18.48 | -2574.59 | 1955.76 | 446.50 |
| otra_inver | 133 | -726.40 | -342.63 | -11338.34 | 3970.82 | 2427.11 |
| acti_reser | 133 | 878.56 | 457.47 | -869.60 | 6946.23 | 1223.32 |
Interpretación. La media resume el valor promedio de cada componente; la mediana muestra el valor central y el mínimo y el máximo permiten identificar la amplitud de las variaciones observadas. Una media positiva o negativa no debe traducirse automáticamente en entradas o salidas de capital sin comprobar la convención de signos del archivo y la metodología empleada por la fuente.
financiera_larga <- datos_financiera %>%
select(indice, periodo, all_of(componentes_financieros)) %>%
tidyr::pivot_longer(
cols = all_of(componentes_financieros),
names_to = "Componente",
values_to = "Valor"
) %>%
mutate(
Componente = recode(
Componente,
Inver_dire = "Inversión directa",
inver_cart = "Inversión de cartera",
deri_finan = "Derivados financieros",
otra_inver = "Otra inversión",
acti_reser = "Activos de reserva"
)
)
ggplot(financiera_larga, aes(x = indice, y = Valor)) +
geom_hline(yintercept = 0, linetype = "dashed", color = "grey50") +
geom_line(color = "#176B87", linewidth = 0.8, na.rm = TRUE) +
facet_wrap(~ Componente, scales = "free_y", ncol = 2) +
scale_x_continuous(
breaks = pretty(datos_financiera$indice, n = 6),
labels = function(x) datos_financiera$periodo[pmax(1, pmin(nrow(datos_financiera), round(x)))]
) +
scale_y_continuous(labels = label_number(big.mark = ".", decimal.mark = ",")) +
labs(
title = "Evolución de los componentes de la cuenta financiera",
subtitle = "Cada panel utiliza una escala vertical propia para facilitar la lectura",
x = "Periodo",
y = "Valor",
caption = "Fuente: elaboración propia con datos del Banco de la República."
) +
tema_profesional +
theme(
axis.text.x = element_text(angle = 45, hjust = 1),
strip.text = element_text(face = "bold")
)
Interpretación de las tendencias. Las gráficas permiten observar la dirección y volatilidad de cada componente, así como los periodos en que sus valores cambian de signo. Como cada panel utiliza una escala vertical independiente, la comparación es adecuada para examinar la evolución interna de cada serie, pero no para concluir directamente cuál componente tiene la mayor magnitud absoluta. La interpretación económica requiere verificar si los datos representan transacciones netas, adquisición de activos, emisión de pasivos u otra convención estadística.
promedios_financieros <- resumen_financiero %>%
select(Componente, Promedio) %>%
mutate(
Componente = recode(
Componente,
Inver_dire = "Inversión directa",
inver_cart = "Inversión de cartera",
deri_finan = "Derivados financieros",
otra_inver = "Otra inversión",
acti_reser = "Activos de reserva"
)
)
ggplot(promedios_financieros, aes(x = reorder(Componente, Promedio), y = Promedio)) +
geom_col(fill = "#0F766E", width = 0.72, na.rm = TRUE) +
geom_hline(yintercept = 0, linetype = "dashed", color = "grey45") +
coord_flip() +
scale_y_continuous(labels = label_number(big.mark = ".", decimal.mark = ",")) +
labs(
title = "Promedio por componente de la cuenta financiera",
x = NULL,
y = "Promedio",
caption = "Fuente: elaboración propia con datos del Banco de la República."
) +
tema_profesional
Interpretación automática. Entre los componentes con datos válidos, el promedio más alto corresponde a Activos de reserva y el más bajo a Inversión directa. Esta comparación identifica diferencias estadísticas, pero no determina por sí sola la contribución de cada componente al saldo total de la cuenta financiera.
na.rm = TRUE. La cantidad de observaciones válidas debe
considerarse al interpretar los resultados.Estas preguntas pueden abordarse como líneas de investigación complementarias. Para evaluar efectos o relaciones específicas, será necesario definir periodos, indicadores y fuentes adicionales que permitan contrastar los cambios observados con la evolución de los acuerdos comerciales.
El análisis descriptivo de la cuenta corriente y la cuenta financiera permite comparar saldos, promedios y variaciones temporales de los componentes incluidos en las bases. Las gráficas ayudan a identificar tendencias y periodos atípicos, mientras que las tablas resumen la distribución de los valores observados.
Las conclusiones económicas definitivas deben formularse después de verificar los nombres de las variables, las unidades de medida, el orden cronológico y la convención de signos. Asimismo, para establecer una relación entre los acuerdos de integración y los resultados comerciales o financieros, se requiere un análisis adicional que incorpore información específica sobre los acuerdos y controle otros factores que también pueden afectar la economía colombiana.