Este informe estudia la evolución trimestral de la cuenta corriente y la cuenta financiera de la balanza de pagos de Colombia, a partir de los archivos suministrados del Banco de la República. Se presentan estadísticas descriptivas, visualizaciones y preguntas de investigación relacionadas con el comercio internacional y la integración económica.
Los datos permiten describir tendencias y asociaciones, pero por sí solos no demuestran que un tratado comercial haya causado un cambio en las cuentas externas.
Guía visual de lectura. El azul petróleo identifica la estructura principal del informe; el azul medio se utiliza para las series y tendencias; el verde señala valores positivos y el terracota valores negativos cuando la gráfica distingue signos. Los colores ayudan a leer los datos, pero no sustituyen la interpretación de la convención contable de cada serie.
El archivo de cuenta corriente se lee exclusivamente desde la hoja
Transpuesto. El archivo de cuenta
financiera se lee desde la hoja
Cuenta financiera.
paquetes <- c("readxl", "dplyr", "tidyr", "ggplot2", "stringr",
"lubridate", "scales", "knitr", "kableExtra", "zoo")
instalar <- paquetes[!paquetes %in% rownames(installed.packages())]
if (length(instalar) > 0) install.packages(instalar, repos = "https://cloud.r-project.org")
invisible(lapply(paquetes, library, character.only = TRUE))Importante: para evitar que el proceso se interrumpa
durante Knit, guarda los dos Excel en la misma carpeta que
este archivo .Rmd. El código buscará los archivos
automáticamente y verificará que contengan las hojas necesarias. Así no
dependerás de una ventana de selección que pueda cancelarse.
Si tus archivos tienen otros nombres, modifica las dos rutas en el bloque de código, en las líneas indicadas.
# ------------------------------------------------------------
# UBICACIÓN DE LOS ARCHIVOS EXCEL
# Guarda ambos Excel en la misma carpeta que este archivo Rmd.
# Si tienen nombres distintos, actualiza los nombres abajo.
# ------------------------------------------------------------
# Detecta la carpeta del Rmd; si no está disponible, usa getwd().
archivo_rmd <- tryCatch(knitr::current_input(), error = function(e) "")
if (length(archivo_rmd) == 0 || is.na(archivo_rmd) || !nzchar(archivo_rmd)) {
carpeta_trabajo <- getwd()
} else {
carpeta_trabajo <- dirname(normalizePath(archivo_rmd, mustWork = FALSE))
if (!dir.exists(carpeta_trabajo)) carpeta_trabajo <- getwd()
}
# Nombres de archivo esperados. Puedes cambiarlos si tus Excel se llaman distinto.
ruta_corriente <- file.path(
carpeta_trabajo,
"SERIES_DESCENTRALIZADAS_CORRIENTE_BP transpuesta.xlsx"
)
ruta_financiera <- file.path(
carpeta_trabajo,
"CUENTA_FINANCIERA_TRANSPUESTA (1).xlsx"
)
# Si no se encuentran por nombre exacto, intenta reconocerlos por parte del nombre.
excels_disponibles <- list.files(
carpeta_trabajo, pattern = "\\.xlsx?$",
full.names = TRUE, ignore.case = TRUE
)
if (!file.exists(ruta_corriente)) {
posibles <- excels_disponibles[
grepl("DESCENTRALIZADAS.*CORRIENTE|CORRIENTE.*TRANSPUESTA",
basename(excels_disponibles), ignore.case = TRUE)
]
if (length(posibles) == 1) ruta_corriente <- posibles[1]
}
if (!file.exists(ruta_financiera)) {
posibles <- excels_disponibles[
grepl("CUENTA.*FINANCIERA|FINANCIERA.*TRANSPUESTA",
basename(excels_disponibles), ignore.case = TRUE)
]
if (length(posibles) == 1) ruta_financiera <- posibles[1]
}
# Detiene el proceso con instrucciones claras si falta alguno de los archivos.
faltantes <- c(
if (!file.exists(ruta_corriente)) "Cuenta corriente (archivo que contiene la hoja 'Transpuesto')",
if (!file.exists(ruta_financiera)) "Cuenta financiera (archivo que contiene la hoja 'Cuenta financiera')"
)
if (length(faltantes) > 0) {
archivos_encontrados <- if (length(excels_disponibles) > 0) {
paste(basename(excels_disponibles), collapse = "\n- ")
} else {
"No se encontraron archivos Excel en la carpeta del Rmd."
}
stop(
paste0(
"\nNO SE PUDIERON LOCALIZAR LOS ARCHIVOS NECESARIOS.\n\n",
"Carpeta revisada: ", carpeta_trabajo, "\n\n",
"Falta localizar:\n- ", paste(faltantes, collapse = "\n- "), "\n\n",
"Archivos Excel encontrados:\n- ", archivos_encontrados, "\n\n",
"Solución: copia ambos Excel a la misma carpeta que el archivo Rmd ",
"o modifica las variables ruta_corriente y ruta_financiera en este bloque."
),
call. = FALSE
)
}
# Comprueba que cada Excel tenga la hoja requerida.
validar_hoja <- function(ruta, hoja_requerida) {
hojas <- tryCatch(
readxl::excel_sheets(ruta),
error = function(e) {
stop(
"No se pudo leer el archivo Excel: ", basename(ruta),
"\nDetalle: ", conditionMessage(e),
call. = FALSE
)
}
)
coincidencia <- which(tolower(trimws(hojas)) == tolower(trimws(hoja_requerida)))
if (length(coincidencia) == 0) {
stop(
"\nEl archivo '", basename(ruta), "' no contiene la hoja '",
hoja_requerida, "'.\nHojas disponibles: ",
paste(hojas, collapse = ", "),
"\nRevisa que hayas asignado el Excel correcto a la variable de ruta.",
call. = FALSE
)
}
hojas[coincidencia[1]]
}
hoja_corriente <- validar_hoja(ruta_corriente, "Transpuesto")
hoja_financiera <- validar_hoja(ruta_financiera, "Cuenta financiera")
cat("ARCHIVOS IMPORTADOS\n")## ARCHIVOS IMPORTADOS
## Cuenta corriente: SERIES_DESCENTRALIZADAS_CORRIENTE_BP transpuesta.xlsx
## Hoja utilizada: Transpuesto
## Cuenta financiera: CUENTA_FINANCIERA_TRANSPUESTA (1).xlsx
## Hoja utilizada: Cuenta financiera
# Cuenta corriente: exclusivamente la hoja Transpuesto.
# Las primeras dos filas son informativas; la tercera contiene encabezados.
corriente_raw <- readxl::read_excel(
ruta_corriente, sheet = hoja_corriente, skip = 2
)
# Cuenta financiera: hoja Cuenta financiera.
# Las primeras tres filas son informativas; la cuarta contiene encabezados.
financiera_raw <- readxl::read_excel(
ruta_financiera, sheet = hoja_financiera, skip = 3
)
cat("Dimensiones de cuenta corriente: ", nrow(corriente_raw), " filas y ",
ncol(corriente_raw), " columnas.\n", sep = "")## Dimensiones de cuenta corriente: 122 filas y 15 columnas.
cat("Dimensiones de cuenta financiera: ", nrow(financiera_raw), " filas y ",
ncol(financiera_raw), " columnas.\n", sep = "")## Dimensiones de cuenta financiera: 106 filas y 9 columnas.
knitr::kable(head(corriente_raw), caption = "Vista preliminar: cuenta corriente") |>
kableExtra::kable_styling(bootstrap_options = c("striped", "hover", "responsive"))| Periodo | CUENTA CORRIENTE | Balanza de Bienes | Bienes - Exportaciones | Bienes - Importaciones | Balanza de Servicios | Servicios - Exportaciones | Servicios - Importaciones | BIENES Y SERVICIOS TOTAL | Ingreso primario (Renta factorial) | Ingreso primario - Ingresos | Ingreso primario - Egresos | Ingreso secundario (Transferencias corrientes) | Ingreso secundario - Ingresos | Ingreso secundario - Egresos |
|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
| 1 Trimestre 1996 | -1091,968 | -529,5917 | 2736,082 | 3265,674 | -271,1385 | 557,1634 | 828,3019 | -800,7302 | -460,1371 | 178,7024 | 638,8395 | 168,8996 | 219,8175 | 50,91792 |
| 2 Trimestre 1996 | -1074,374 | -469,1056 | 2772,532 | 3241,638 | -287,2955 | 549,8720 | 837,1675 | -756,4011 | -480,6524 | 176,6244 | 657,2768 | 162,6796 | 218,2638 | 55,58421 |
| 3 Trimestre 1996 | -1281,627 | -638,6366 | 2602,464 | 3241,101 | -281,0271 | 546,8914 | 827,9186 | -919,6637 | -542,6128 | 169,5188 | 712,1316 | 180,6491 | 237,0597 | 56,41061 |
| 4 Trimestre 1996 | -1220,585 | -454,2315 | 2855,111 | 3309,342 | -380,9770 | 539,0211 | 919,9981 | -835,2085 | -579,0244 | 191,0787 | 770,1031 | 193,6477 | 248,4735 | 54,82585 |
| 1 Trimestre 1997 | -1167,053 | -412,9906 | 2915,388 | 3328,379 | -358,1589 | 551,3558 | 909,5147 | -771,1495 | -563,2813 | 213,9615 | 777,2428 | 167,3776 | 233,0089 | 65,63129 |
| 2 Trimestre 1997 | -1363,219 | -554,8373 | 3024,451 | 3579,288 | -405,4530 | 524,6938 | 930,1468 | -960,2903 | -606,7018 | 227,2897 | 833,9915 | 203,7734 | 243,6732 | 39,89975 |
knitr::kable(head(financiera_raw), caption = "Vista preliminar: cuenta financiera") |>
kableExtra::kable_styling(bootstrap_options = c("striped", "hover", "responsive"))| Año | Periodo | Tipo de dato | Cuenta financiera | Inversión directa | Inversión de cartera | Derivados financieros (distintos de reservas) y opciones de compra de acciones por parte de empleados | Otra inversión | Activos de reserva |
|---|---|---|---|---|---|---|---|---|
| 2000 | Q1 | Dato revisado | 304,80917 | -339,9479 | -361,8045 | 24,92393 | 769,1910 | 212,44664 |
| 2000 | Q2 | Dato revisado | 173,67307 | -455,4221 | 351,0750 | 31,37812 | 145,4623 | 101,17974 |
| 2000 | Q3 | Dato revisado | 359,82836 | -766,8052 | 390,2365 | 32,67088 | 386,6618 | 317,06442 |
| 2000 | Q4 | Dato revisado | 11,34624 | -548,9382 | -554,1977 | 32,98539 | 850,1636 | 231,33313 |
| 2001 | Q1 | Dato revisado | -430,22418 | -517,9177 | -204,5215 | 32,33429 | -63,0967 | 322,97745 |
| 2001 | Q2 | Dato revisado | -409,25874 | -978,7928 | -1058,7273 | 33,44307 | 1527,5841 | 67,23417 |
# Función para convertir a número columnas que pudieran haber sido importadas
# como texto. No modifica el signo de las observaciones.
a_numero <- function(x) {
if (is.numeric(x)) return(as.numeric(x))
x <- as.character(x)
x <- stringr::str_replace_all(x, "\\s", "")
# En estos archivos las cifras suelen venir como números de Excel.
# Se contemplan separadores de miles/decimales si aparecen como texto.
x <- stringr::str_replace_all(x, "\\$", "")
suppressWarnings(as.numeric(x))
}
# Normalizar nombres de columnas para facilitar el uso en el código.
names(corriente_raw) <- trimws(names(corriente_raw))
names(financiera_raw) <- trimws(names(financiera_raw))
# Confirmar que las columnas de fecha existan.
if (!"Periodo" %in% names(corriente_raw)) {
stop("No se encontró la columna 'Periodo' en la hoja Transpuesto.")
}
if (!all(c("Año", "Periodo") %in% names(financiera_raw))) {
stop("No se encontraron las columnas 'Año' y 'Periodo' en Cuenta financiera.")
}
# La cuenta corriente presenta periodos como '1 Trimestre 1996'.
corriente <- corriente_raw |>
dplyr::mutate(
periodo_texto = as.character(.data$Periodo),
anio = suppressWarnings(as.integer(stringr::str_extract(periodo_texto, "\\d{4}"))),
trimestre = suppressWarnings(as.integer(stringr::str_extract(periodo_texto, "^[1-4]")))
) |>
dplyr::filter(!is.na(anio), !is.na(trimestre)) |>
dplyr::mutate(
fecha = as.Date(zoo::as.yearqtr(paste0(anio, " Q", trimestre), format = "%Y Q%q"))
) |>
dplyr::arrange(fecha)
# Cuenta financiera: Periodo tiene formato Q1, Q2, Q3 o Q4.
financiera <- financiera_raw |>
dplyr::mutate(
anio = suppressWarnings(as.integer(.data$Año)),
trimestre = suppressWarnings(as.integer(stringr::str_extract(as.character(.data$Periodo), "[1-4]"))),
fecha = as.Date(zoo::as.yearqtr(paste0(anio, " Q", trimestre), format = "%Y Q%q"))
) |>
dplyr::filter(!is.na(anio), !is.na(trimestre)) |>
dplyr::arrange(fecha)
# Convertir columnas económicas a numéricas, conservando fechas y categorías.
cols_num_corriente <- setdiff(names(corriente), c("Periodo", "periodo_texto", "anio",
"trimestre", "fecha"))
corriente <- corriente |>
dplyr::mutate(dplyr::across(dplyr::all_of(cols_num_corriente), a_numero))
cols_num_fin <- setdiff(names(financiera), c("Año", "Periodo", "Tipo de dato",
"anio", "trimestre", "fecha"))
financiera <- financiera |>
dplyr::mutate(dplyr::across(dplyr::all_of(cols_num_fin), a_numero))
# Eliminar duplicados exactos, si los hubiera, y reportarlos antes de hacerlo.
duplicados_corriente <- sum(duplicated(corriente))
duplicados_financiera <- sum(duplicated(financiera))
cat("Filas duplicadas detectadas en cuenta corriente:", duplicados_corriente, "\n")## Filas duplicadas detectadas en cuenta corriente: 0
## Filas duplicadas detectadas en cuenta financiera: 0
corriente <- dplyr::distinct(corriente)
financiera <- dplyr::distinct(financiera)
# Tabla resumen de cobertura temporal y valores faltantes.
resumen_base <- tibble::tibble(
Base = c("Cuenta corriente: hoja Transpuesto", "Cuenta financiera"),
Observaciones = c(nrow(corriente), nrow(financiera)),
Variables = c(ncol(corriente), ncol(financiera)),
Periodo_inicial = c(min(corriente$fecha, na.rm = TRUE), min(financiera$fecha, na.rm = TRUE)),
Periodo_final = c(max(corriente$fecha, na.rm = TRUE), max(financiera$fecha, na.rm = TRUE)),
Valores_faltantes = c(sum(is.na(corriente)), sum(is.na(financiera)))
)
knitr::kable(resumen_base, caption = "Descripción general de las bases") |>
kableExtra::kable_styling(bootstrap_options = c("striped", "hover", "responsive"))| Base | Observaciones | Variables | Periodo_inicial | Periodo_final | Valores_faltantes |
|---|---|---|---|---|---|
| Cuenta corriente: hoja Transpuesto | 122 | 19 | 1996-01-01 | 2026-04-01 | 0 |
| Cuenta financiera | 106 | 12 | 2000-01-01 | 2026-04-01 | 0 |
Las bases de trabajo fueron suministradas en archivos Excel atribuidos al Banco de la República de Colombia. La frecuencia es trimestral y las cifras se interpretan en millones de dólares estadounidenses, de acuerdo con la descripción de los archivos. La cuenta corriente corresponde a una serie desestacionalizada; la cuenta financiera conserva la clasificación de tipo de dato que aparece en el archivo original.
La limpieza consistió en identificar los encabezados, extraer año y trimestre, ordenar cronológicamente las observaciones, convertir variables económicas a formato numérico y revisar duplicados y datos faltantes. No se sustituyen observaciones faltantes por valores inventados.
Fuentes para consulta: Banco de la República. Verifica en la publicación original la convención de signos y la definición metodológica de cada serie antes de realizar interpretaciones contables definitivas.
# Paleta institucional uniforme: azul petróleo, azul medio, verde y terracota.
azul <- "#17324D"
azul_claro <- "#2878A5"
verde <- "#3F7D68"
rojo <- "#B85C54"
dorado <- "#C39A4A"
gris <- "#657586"
tema_academico <- ggplot2::theme_minimal(base_size = 12, base_family = "sans") +
ggplot2::theme(
plot.title = element_text(face = "bold", size = 17, colour = azul,
margin = margin(b = 8), lineheight = 1.12),
plot.subtitle = element_text(size = 11.5, colour = gris,
margin = margin(b = 14), lineheight = 1.25),
plot.caption = element_text(size = 9, colour = gris, hjust = 0,
margin = margin(t = 12)),
axis.title = element_text(face = "bold", colour = azul, size = 10.5),
axis.text = element_text(colour = "#405667", size = 9.5),
axis.ticks = element_line(colour = "#CBD7DF", linewidth = 0.3),
legend.title = element_text(face = "bold", colour = azul, size = 10.5),
legend.text = element_text(size = 9.5, colour = "#405667"),
legend.position = "bottom",
legend.box = "vertical",
panel.grid.minor = element_blank(),
panel.grid.major.x = element_blank(),
panel.grid.major.y = element_line(colour = "#E3EBF0", linewidth = 0.4),
strip.background = element_rect(fill = "#EAF2F6", colour = NA),
strip.text = element_text(face = "bold", colour = azul, size = 10.5,
margin = margin(8, 6, 8, 6)),
plot.background = element_rect(fill = "#FFFFFF", colour = NA),
panel.background = element_rect(fill = "#FFFFFF", colour = NA),
plot.margin = margin(18, 20, 18, 16)
)
formato_millones <- scales::label_number(big.mark = ".", decimal.mark = ",", accuracy = 1)
grafico_linea <- function(datos, variable, titulo, subtitulo = NULL) {
if (!variable %in% names(datos)) {
message("No se genera el gráfico: no existe la variable ", variable)
return(NULL)
}
ggplot(datos, aes(x = fecha, y = .data[[variable]])) +
geom_hline(yintercept = 0, linetype = "dashed", colour = gris, linewidth = 0.5) +
geom_line(colour = azul_claro, linewidth = 1.05, na.rm = TRUE) +
labs(title = titulo, subtitle = subtitulo,
x = "Trimestre", y = "Millones de USD",
caption = "Fuente: Banco de la República de Colombia; archivos suministrados.") +
scale_y_continuous(labels = formato_millones) +
scale_x_date(date_breaks = "4 years", date_labels = "%Y") +
tema_academico
}
estadisticas <- function(datos, variables) {
variables <- intersect(variables, names(datos))
if (length(variables) == 0) return(data.frame())
datos |>
dplyr::select(dplyr::all_of(variables)) |>
tidyr::pivot_longer(cols = dplyr::everything(), names_to = "Variable", values_to = "Valor") |>
dplyr::group_by(Variable) |>
dplyr::summarise(
N = sum(!is.na(Valor)),
Media = mean(Valor, na.rm = TRUE),
Mediana = median(Valor, na.rm = TRUE),
Desviacion_estandar = sd(Valor, na.rm = TRUE),
Minimo = ifelse(all(is.na(Valor)), NA_real_, min(Valor, na.rm = TRUE)),
Maximo = ifelse(all(is.na(Valor)), NA_real_, max(Valor, na.rm = TRUE)),
.groups = "drop"
)
}
# Produce una interpretación automática basada en las observaciones reales.
# Resume niveles, extremos, signo y dispersión sin afirmar causalidad.
interpretar_serie <- function(datos, variable, nombre = variable) {
if (!variable %in% names(datos)) {
cat("**No se generó la lectura cuantitativa:** no se encontró la variable ", nombre, ".\\n\\n", sep = "")
return(invisible(NULL))
}
z <- datos |>
dplyr::select(fecha, valor = dplyr::all_of(variable)) |>
dplyr::filter(!is.na(fecha), !is.na(valor)) |>
dplyr::arrange(fecha)
if (nrow(z) < 2) {
cat("Hay menos de dos observaciones válidas para interpretar **", nombre, "**.\\n\\n", sep = "")
return(invisible(NULL))
}
primero <- z[1, ]
ultimo <- z[nrow(z), ]
maximo <- z[which.max(z$valor), ]
minimo <- z[which.min(z$valor), ]
cambio <- ultimo$valor - primero$valor
direccion <- if (cambio > 0) "aumentó" else if (cambio < 0) "disminuyó" else "no registró cambio neto"
positivos <- mean(z$valor > 0) * 100
negativos <- mean(z$valor < 0) * 100
volatilidad <- stats::sd(z$valor, na.rm = TRUE)
cat("**Lectura cuantitativa.** La serie **", nombre, "** pasó de ",
formato_millones(primero$valor), " millones de USD en ",
format(primero$fecha, "%Y-%m"), " a ",
formato_millones(ultimo$valor), " millones en ",
format(ultimo$fecha, "%Y-%m"), ". Entre ambos extremos, el saldo ",
direccion, " en una magnitud de ", formato_millones(abs(cambio)),
" millones de USD. El valor máximo fue ",
formato_millones(maximo$valor), " millones en ",
format(maximo$fecha, "%Y-%m"), " y el mínimo fue ",
formato_millones(minimo$valor), " millones en ",
format(minimo$fecha, "%Y-%m"), ". Un ",
round(positivos, 1), "% de las observaciones fue positivo y un ",
round(negativos, 1), "% negativo. La desviación estándar fue de ",
formato_millones(volatilidad), " millones de USD.\\n\\n", sep = "")
cat("**Interpretación económica.** El cambio entre el primer y el último dato resume la dirección neta del período, mientras que los máximos, mínimos y la desviación estándar permiten reconocer episodios extremos y dispersión. Estos indicadores son descriptivos: no identifican por sí solos las causas del movimiento. Para explicar los episodios concretos, deben contrastarse con información complementaria sobre comercio por socio, actividad económica, precios internacionales, tasas de interés y decisiones de inversión.\\n\\n")
invisible(list(inicial = primero, final = ultimo, maximo = maximo,
minimo = minimo, cambio = cambio, sd = volatilidad))
}vars_corriente <- c(
"CUENTA CORRIENTE", "Balanza de Bienes", "Balanza de Servicios",
"BIENES Y SERVICIOS TOTAL", "Ingreso primario (Renta factorial)",
"Ingreso secundario (Transferencias corrientes)",
"Bienes - Exportaciones", "Bienes - Importaciones",
"Servicios - Exportaciones", "Servicios - Importaciones"
)
stats_corriente <- estadisticas(corriente, vars_corriente)
knitr::kable(stats_corriente, digits = 2,
caption = "Estadísticas descriptivas de la cuenta corriente") |>
kableExtra::kable_styling(bootstrap_options = c("striped", "hover", "responsive"))| Variable | N | Media | Mediana | Desviacion_estandar | Minimo | Maximo |
|---|---|---|---|---|---|---|
| BIENES Y SERVICIOS TOTAL | 122 | -1616,09 | -981,19 | 1677,27 | -5442,01 | 711,52 |
| Balanza de Bienes | 122 | -817,51 | -359,90 | 1590,17 | -4814,00 | 2193,18 |
| Balanza de Servicios | 122 | -798,58 | -720,16 | 513,86 | -2170,89 | 171,96 |
| Bienes - Exportaciones | 122 | 8676,02 | 9289,97 | 4348,18 | 2602,46 | 16290,03 |
| Bienes - Importaciones | 122 | 9493,53 | 10178,52 | 5036,66 | 2428,18 | 19212,00 |
| CUENTA CORRIENTE | 122 | -2075,14 | -1810,31 | 1597,66 | -6429,91 | 331,28 |
| Ingreso primario (Renta factorial) | 122 | -1985,50 | -1892,11 | 1200,58 | -4669,21 | -240,49 |
| Ingreso secundario (Transferencias corrientes) | 122 | 1526,45 | 1236,71 | 1083,15 | 157,00 | 4297,89 |
| Servicios - Exportaciones | 122 | 1789,28 | 1495,59 | 1308,18 | 442,59 | 5361,23 |
| Servicios - Importaciones | 122 | 2587,86 | 2663,10 | 1418,91 | 770,66 | 5511,00 |
La media y la mediana resumen el nivel típico de cada serie; la desviación estándar mide su dispersión. Los mínimos y máximos permiten identificar valores extremos, que deben interpretarse en el contexto económico y no asumirse automáticamente como errores.
grafico_linea(
corriente, "CUENTA CORRIENTE",
"Gráfica 1. Evolución de la cuenta corriente",
"Saldo trimestral; la línea horizontal señala el valor cero"
)La serie permite distinguir los trimestres con saldo negativo de aquellos con saldo positivo. La lectura automática siguiente identifica el nivel inicial y final, los extremos históricos y la proporción de trimestres con signo positivo o negativo.
Lectura cuantitativa. La serie Cuenta corriente pasó de -1.092 millones de USD en 1996-01 a -4.712 millones en 2026-04. Entre ambos extremos, el saldo disminuyó en una magnitud de 3.620 millones de USD. El valor máximo fue 331 millones en 1999-04 y el mínimo fue -6.430 millones en 2014-10. Un 7,4% de las observaciones fue positivo y un 92,6% negativo. La desviación estándar fue de 1.598 millones de USD.*Interpretación económica.** El cambio entre el primer y el último dato resume la dirección neta del período, mientras que los máximos, mínimos y la desviación estándar permiten reconocer episodios extremos y dispersión. Estos indicadores son descriptivos: no identifican por sí solos las causas del movimiento. Para explicar los episodios concretos, deben contrastarse con información complementaria sobre comercio por socio, actividad económica, precios internacionales, tasas de interés y decisiones de inversión.
if ("CUENTA CORRIENTE" %in% names(corriente)) {
extremos_cc <- dplyr::bind_rows(
corriente |> dplyr::slice_min(.data[["CUENTA CORRIENTE"]], n = 5, with_ties = FALSE) |>
dplyr::mutate(Clasificacion = "Cinco saldos más bajos"),
corriente |> dplyr::slice_max(.data[["CUENTA CORRIENTE"]], n = 5, with_ties = FALSE) |>
dplyr::mutate(Clasificacion = "Cinco saldos más altos")
) |>
dplyr::select(fecha, Clasificacion, `CUENTA CORRIENTE`)
knitr::kable(extremos_cc, digits = 2,
caption = "Trimestres extremos de la cuenta corriente") |>
kableExtra::kable_styling(bootstrap_options = c("striped", "hover", "responsive"))
}| fecha | Clasificacion | CUENTA CORRIENTE |
|---|---|---|
| 2014-10-01 | Cinco saldos más bajos | -6429,91 |
| 2022-07-01 | Cinco saldos más bajos | -5963,23 |
| 2022-01-01 | Cinco saldos más bajos | -5666,84 |
| 2021-10-01 | Cinco saldos más bajos | -5462,49 |
| 2015-01-01 | Cinco saldos más bajos | -5371,76 |
| 1999-04-01 | Cinco saldos más altos | 331,28 |
| 2000-01-01 | Cinco saldos más altos | 319,26 |
| 1999-07-01 | Cinco saldos más altos | 272,81 |
| 2000-07-01 | Cinco saldos más altos | 229,47 |
| 2000-10-01 | Cinco saldos más altos | 174,78 |
componentes_cc <- c(
"Balanza de Bienes", "Balanza de Servicios",
"Ingreso primario (Renta factorial)",
"Ingreso secundario (Transferencias corrientes)"
)
componentes_cc <- intersect(componentes_cc, names(corriente))
if (length(componentes_cc) > 0) {
corriente |>
dplyr::select(fecha, dplyr::all_of(componentes_cc)) |>
tidyr::pivot_longer(-fecha, names_to = "Componente", values_to = "Saldo") |>
ggplot(aes(fecha, Saldo, colour = Componente)) +
geom_hline(yintercept = 0, linetype = "dashed", colour = gris) +
geom_line(linewidth = 0.8, na.rm = TRUE) +
facet_wrap(~Componente, scales = "free_y", ncol = 2) +
scale_y_continuous(labels = formato_millones) +
scale_x_date(date_breaks = "5 years", date_labels = "%Y") +
labs(title = "Gráfica 2. Componentes de la cuenta corriente",
subtitle = "Paneles separados para facilitar la lectura de magnitudes diferentes",
x = "Trimestre", y = "Millones de USD", colour = "Componente",
caption = "Fuente: Banco de la República de Colombia; archivos suministrados.") +
tema_academico + theme(legend.position = "none")
}Cómo interpretar esta gráfica. Compara la posición de cada línea respecto de cero, su amplitud y la persistencia de sus movimientos. La balanza de bienes y la de servicios se relacionan con el intercambio internacional; el ingreso primario recoge rentas asociadas, entre otros conceptos, con trabajo e inversión; el ingreso secundario incluye transferencias corrientes. Los paneles tienen escalas independientes: por ello, la altura visual de dos líneas en paneles diferentes no equivale a una comparación directa de magnitudes.
Lectura cuantitativa. La serie Balanza de Bienes pasó de -530 millones de USD en 1996-01 a -4.814 millones en 2026-04. Entre ambos extremos, el saldo disminuyó en una magnitud de 4.284 millones de USD. El valor máximo fue 2.193 millones en 2012-01 y el mínimo fue -4.814 millones en 2026-04. Un 43,4% de las observaciones fue positivo y un 56,6% negativo. La desviación estándar fue de 1.590 millones de USD.*Interpretación económica.** El cambio entre el primer y el último dato resume la dirección neta del período, mientras que los máximos, mínimos y la desviación estándar permiten reconocer episodios extremos y dispersión. Estos indicadores son descriptivos: no identifican por sí solos las causas del movimiento. Para explicar los episodios concretos, deben contrastarse con información complementaria sobre comercio por socio, actividad económica, precios internacionales, tasas de interés y decisiones de inversión.*Lectura cuantitativa. La serie Balanza de Servicios** pasó de -271 millones de USD en 1996-01 a -610 millones en 2026-04. Entre ambos extremos, el saldo disminuyó en una magnitud de 339 millones de USD. El valor máximo fue 172 millones en 2026-01 y el mínimo fue -2.171 millones en 2014-10. Un 3,3% de las observaciones fue positivo y un 96,7% negativo. La desviación estándar fue de 514 millones de USD.*Interpretación económica.** El cambio entre el primer y el último dato resume la dirección neta del período, mientras que los máximos, mínimos y la desviación estándar permiten reconocer episodios extremos y dispersión. Estos indicadores son descriptivos: no identifican por sí solos las causas del movimiento. Para explicar los episodios concretos, deben contrastarse con información complementaria sobre comercio por socio, actividad económica, precios internacionales, tasas de interés y decisiones de inversión.*Lectura cuantitativa. La serie Ingreso primario (Renta factorial)** pasó de -460 millones de USD en 1996-01 a -3.445 millones en 2026-04. Entre ambos extremos, el saldo disminuyó en una magnitud de 2.985 millones de USD. El valor máximo fue -240 millones en 1999-04 y el mínimo fue -4.669 millones en 2022-07. Un 0% de las observaciones fue positivo y un 100% negativo. La desviación estándar fue de 1.201 millones de USD.*Interpretación económica.** El cambio entre el primer y el último dato resume la dirección neta del período, mientras que los máximos, mínimos y la desviación estándar permiten reconocer episodios extremos y dispersión. Estos indicadores son descriptivos: no identifican por sí solos las causas del movimiento. Para explicar los episodios concretos, deben contrastarse con información complementaria sobre comercio por socio, actividad económica, precios internacionales, tasas de interés y decisiones de inversión.*Lectura cuantitativa. La serie Ingreso secundario (Transferencias corrientes)** pasó de 169 millones de USD en 1996-01 a 4.157 millones en 2026-04. Entre ambos extremos, el saldo aumentó en una magnitud de 3.988 millones de USD. El valor máximo fue 4.298 millones en 2025-04 y el mínimo fue 157 millones en 1998-04. Un 100% de las observaciones fue positivo y un 0% negativo. La desviación estándar fue de 1.083 millones de USD.*Interpretación económica.** El cambio entre el primer y el último dato resume la dirección neta del período, mientras que los máximos, mínimos y la desviación estándar permiten reconocer episodios extremos y dispersión. Estos indicadores son descriptivos: no identifican por sí solos las causas del movimiento. Para explicar los episodios concretos, deben contrastarse con información complementaria sobre comercio por socio, actividad económica, precios internacionales, tasas de interés y decisiones de inversión.
vars_comercio <- intersect(c("Bienes - Exportaciones", "Bienes - Importaciones"), names(corriente))
if (length(vars_comercio) >= 2) {
corriente |>
dplyr::select(fecha, dplyr::all_of(vars_comercio)) |>
tidyr::pivot_longer(-fecha, names_to = "Serie", values_to = "Valor") |>
ggplot(aes(fecha, Valor, colour = Serie)) +
geom_line(linewidth = 0.9, na.rm = TRUE) +
scale_colour_manual(values = c("Bienes - Exportaciones" = verde,
"Bienes - Importaciones" = azul_claro)) +
scale_y_continuous(labels = formato_millones) +
scale_x_date(date_breaks = "4 years", date_labels = "%Y") +
labs(title = "Gráfica 3. Exportaciones e importaciones de bienes",
subtitle = "Comparación de los flujos trimestrales",
x = "Trimestre", y = "Millones de USD", colour = NULL,
caption = "Fuente: Banco de la República de Colombia; archivos suministrados.") +
tema_academico
} else {
cat("No se encontraron ambas columnas de exportaciones e importaciones.\n")
}Análisis de la comparación comercial. Observa si las
dos líneas convergen, se separan o cambian de dirección. Una brecha
persistente entre importaciones y exportaciones puede coincidir con un
saldo deficitario de bienes; la conclusión debe verificarse con la
variable Balanza de Bienes del mismo archivo. Los cambios
de las series reflejan valores nominales en USD y no permiten separar
por sí solos variaciones de precios de cambios en cantidades.
if (all(c("Bienes - Exportaciones", "Bienes - Importaciones") %in% names(corriente))) {
brecha_comercial <- corriente |>
dplyr::mutate(
brecha_exp_imp = `Bienes - Exportaciones` - `Bienes - Importaciones`,
diferencia_abs = abs(brecha_exp_imp)
) |>
dplyr::filter(!is.na(brecha_exp_imp))
peor <- brecha_comercial |> dplyr::slice_min(brecha_exp_imp, n = 1, with_ties = FALSE)
mejor <- brecha_comercial |> dplyr::slice_max(brecha_exp_imp, n = 1, with_ties = FALSE)
cat("**Indicadores de la brecha comercial.** En promedio, la diferencia exportaciones menos importaciones fue de ",
formato_millones(mean(brecha_comercial$brecha_exp_imp)), " millones de USD por trimestre. ",
"La brecha más negativa ocurrió en ", format(peor$fecha, "%Y-%m"),
" (", formato_millones(peor$brecha_exp_imp), " millones), mientras que el mayor saldo de exportaciones frente a importaciones se observó en ",
format(mejor$fecha, "%Y-%m"), " (", formato_millones(mejor$brecha_exp_imp), " millones). ",
"Estos cálculos comparan los flujos de bienes reportados y deben contrastarse con la serie oficial de balanza de bienes.\\n\\n", sep = "")
}Indicadores de la brecha comercial. En promedio, la diferencia exportaciones menos importaciones fue de -818 millones de USD por trimestre. La brecha más negativa ocurrió en 2026-04 (-4.814 millones), mientras que el mayor saldo de exportaciones frente a importaciones se observó en 2012-01 (2.193 millones). Estos cálculos comparan los flujos de bienes reportados y deben contrastarse con la serie oficial de balanza de bienes.
vars_saldos <- intersect(c(
"CUENTA CORRIENTE", "Balanza de Bienes", "Balanza de Servicios",
"Ingreso primario (Renta factorial)",
"Ingreso secundario (Transferencias corrientes)"
), names(corriente))
if (length(vars_saldos) > 0) {
corriente |>
dplyr::select(dplyr::all_of(vars_saldos)) |>
tidyr::pivot_longer(dplyr::everything(), names_to = "Variable", values_to = "Saldo") |>
ggplot(aes(x = reorder(Variable, Saldo, FUN = median, na.rm = TRUE), y = Saldo)) +
geom_boxplot(fill = azul_claro, alpha = 0.75, outlier.colour = rojo, na.rm = TRUE) +
coord_flip() +
scale_y_continuous(labels = formato_millones) +
labs(title = "Gráfica 4. Distribución de los saldos de la cuenta corriente",
x = NULL, y = "Millones de USD",
caption = "Los puntos extremos son observaciones atípicas estadísticas, no necesariamente errores.") +
tema_academico
}Análisis de distribución. La línea central de cada caja representa la mediana; la caja recoge el rango intercuartílico y los puntos alejados pueden indicar trimestres atípicos. Los valores extremos no son necesariamente errores: pueden reflejar episodios económicos extraordinarios. Debido a que las variables tienen magnitudes diferentes, compara también las estadísticas descriptivas y no solo la extensión visual de las cajas.
if (length(vars_saldos) > 0) {
dispersion_cc <- corriente |>
dplyr::select(dplyr::all_of(vars_saldos)) |>
tidyr::pivot_longer(dplyr::everything(), names_to = "Componente", values_to = "Saldo") |>
dplyr::group_by(Componente) |>
dplyr::summarise(
Rango_intercuartil = IQR(Saldo, na.rm = TRUE),
Desviacion = sd(Saldo, na.rm = TRUE),
.groups = "drop"
) |>
dplyr::arrange(dplyr::desc(Rango_intercuartil))
if (nrow(dispersion_cc) > 0) {
cat("**Comparación de dispersión.** Según el rango intercuartílico, el componente con mayor dispersión central es **",
dispersion_cc$Componente[1], "** (", formato_millones(dispersion_cc$Rango_intercuartil[1]),
" millones de USD). Este criterio compara la amplitud del 50 % central de las observaciones y reduce la influencia de los valores extremos.\\n\\n", sep = "")
}
}Comparación de dispersión. Según el rango intercuartílico, el componente con mayor dispersión central es Balanza de Bienes (2.544 millones de USD). Este criterio compara la amplitud del 50 % central de las observaciones y reduce la influencia de los valores extremos.
corriente <- corriente |>
dplyr::arrange(fecha) |>
dplyr::mutate(
variacion_absoluta_trimestral = .data[["CUENTA CORRIENTE"]] -
dplyr::lag(.data[["CUENTA CORRIENTE"]]),
variacion_interanual = .data[["CUENTA CORRIENTE"]] -
dplyr::lag(.data[["CUENTA CORRIENTE"]], 4)
)
ggplot(corriente, aes(fecha, variacion_interanual)) +
geom_hline(yintercept = 0, linetype = "dashed", colour = gris) +
geom_col(fill = azul_claro, na.rm = TRUE) +
scale_y_continuous(labels = formato_millones) +
scale_x_date(date_breaks = "4 years", date_labels = "%Y") +
labs(title = "Gráfica 5. Cambio interanual de la cuenta corriente",
subtitle = "Diferencia respecto al mismo trimestre del año anterior",
x = "Trimestre", y = "Cambio en millones de USD",
caption = "Fuente: elaboración propia con datos suministrados del Banco de la República.") +
tema_academicoAnálisis de la variación interanual. Las barras por encima de cero indican que el saldo fue mayor que en el mismo trimestre del año anterior; las barras por debajo de cero muestran un saldo menor. Como se utiliza una diferencia absoluta y no una tasa porcentual, la medida conserva una interpretación clara cuando el saldo anterior es negativo o cercano a cero. Un aumento del saldo no implica necesariamente que la cuenta haya pasado a superávit.
cambios_validos <- corriente |> dplyr::filter(!is.na(variacion_interanual))
if (nrow(cambios_validos) > 0) {
mayor_mejora <- cambios_validos |> dplyr::slice_max(variacion_interanual, n = 1, with_ties = FALSE)
mayor_deterioro <- cambios_validos |> dplyr::slice_min(variacion_interanual, n = 1, with_ties = FALSE)
cat("**Episodios de cambio interanual más pronunciado.** La mayor variación positiva se registró en ",
format(mayor_mejora$fecha, "%Y-%m"), " (",
formato_millones(mayor_mejora$variacion_interanual), " millones de USD), mientras que la mayor variación negativa ocurrió en ",
format(mayor_deterioro$fecha, "%Y-%m"), " (",
formato_millones(mayor_deterioro$variacion_interanual), " millones). ",
"Estos episodios son candidatos para investigación documental posterior; las cifras no permiten atribuirlos automáticamente a una política o choque particular.\\n\\n", sep = "")
}Episodios de cambio interanual más pronunciado. La mayor variación positiva se registró en 2023-07 (4.165 millones de USD), mientras que la mayor variación negativa ocurrió en 2014-10 (-3.554 millones). Estos episodios son candidatos para investigación documental posterior; las cifras no permiten atribuirlos automáticamente a una política o choque particular.
vars_fin <- c(
"Cuenta financiera", "Inversión directa", "Inversión de cartera",
"Derivados financieros (distintos de reservas) y opciones de compra de acciones por parte de empleados",
"Otra inversión", "Activos de reserva"
)
stats_financiera <- estadisticas(financiera, vars_fin)
knitr::kable(stats_financiera, digits = 2,
caption = "Estadísticas descriptivas de la cuenta financiera") |>
kableExtra::kable_styling(bootstrap_options = c("striped", "hover", "responsive"))| Variable | N | Media | Mediana | Desviacion_estandar | Minimo | Maximo |
|---|---|---|---|---|---|---|
| Activos de reserva | 106 | 551,17 | 326,15 | 694,24 | -869,60 | 3429,00 |
| Cuenta financiera | 106 | -2110,97 | -1838,05 | 1598,18 | -6193,64 | 359,83 |
| Derivados financieros (distintos de reservas) y opciones de compra de acciones por parte de empleados | 106 | -27,25 | 17,69 | 292,67 | -879,41 | 1238,03 |
| Inversión de cartera | 106 | -386,12 | -186,04 | 1827,87 | -6089,38 | 6653,05 |
| Inversión directa | 106 | -1793,06 | -1662,04 | 1292,33 | -5441,74 | 2320,54 |
| Otra inversión | 106 | -455,71 | -305,78 | 1799,20 | -6930,22 | 3913,72 |
Los componentes representan diferentes tipos de transacciones financieras internacionales. La inversión directa suele asociarse con una relación duradera de inversión; la inversión de cartera incluye instrumentos financieros negociables; otra inversión reúne otras categorías de activos y pasivos; y los activos de reserva corresponden a activos externos bajo control de la autoridad monetaria. La interpretación del signo debe seguir la convención oficial aplicada a esta serie.
La siguiente lectura cuantitativa resume la trayectoria de la cuenta financiera total; úsala junto con la gráfica y la metodología oficial para explicar el signo.
grafico_linea(financiera, "Cuenta financiera",
"Gráfica 6. Evolución de la cuenta financiera",
"Saldo trimestral reportado en el archivo suministrado")Lectura cuantitativa. La serie Cuenta financiera total pasó de 305 millones de USD en 2000-01 a -3.719 millones en 2026-04. Entre ambos extremos, el saldo disminuyó en una magnitud de 4.024 millones de USD. El valor máximo fue 360 millones en 2000-07 y el mínimo fue -6.194 millones en 2014-10. Un 5,7% de las observaciones fue positivo y un 94,3% negativo. La desviación estándar fue de 1.598 millones de USD.*Interpretación económica.** El cambio entre el primer y el último dato resume la dirección neta del período, mientras que los máximos, mínimos y la desviación estándar permiten reconocer episodios extremos y dispersión. Estos indicadores son descriptivos: no identifican por sí solos las causas del movimiento. Para explicar los episodios concretos, deben contrastarse con información complementaria sobre comercio por socio, actividad económica, precios internacionales, tasas de interés y decisiones de inversión.
Lectura de la gráfica. Observa cambios de signo, movimientos extremos y persistencia de los movimientos. No interpretes automáticamente los valores positivos como entradas netas de capital sin confirmar la convención contable oficial.
vars_componentes_fin <- intersect(c(
"Inversión directa", "Inversión de cartera",
"Derivados financieros (distintos de reservas) y opciones de compra de acciones por parte de empleados",
"Otra inversión", "Activos de reserva"
), names(financiera))
if (length(vars_componentes_fin) > 0) {
financiera |>
dplyr::select(fecha, dplyr::all_of(vars_componentes_fin)) |>
tidyr::pivot_longer(-fecha, names_to = "Componente", values_to = "Valor") |>
ggplot(aes(fecha, Valor, colour = Componente)) +
geom_hline(yintercept = 0, linetype = "dashed", colour = gris) +
geom_line(linewidth = 0.8, na.rm = TRUE) +
facet_wrap(~Componente, scales = "free_y", ncol = 2) +
scale_y_continuous(labels = formato_millones) +
scale_x_date(date_breaks = "5 years", date_labels = "%Y") +
labs(title = "Gráfica 7. Evolución de los componentes financieros",
subtitle = "Paneles con escalas independientes",
x = "Trimestre", y = "Millones de USD", colour = NULL,
caption = "Fuente: Banco de la República de Colombia; archivos suministrados.") +
tema_academico + theme(legend.position = "none")
}Análisis por componente. Los paneles permiten detectar qué componentes presentan mayores oscilaciones y cuándo aparecen cambios de dirección. Como cada panel utiliza una escala propia, la comparación visual debe complementarse con desviaciones estándar y rangos. Para explicar estos movimientos en términos de tasas de interés, riesgo internacional, precios de materias primas o decisiones de inversión se requieren fuentes complementarias.
Lectura cuantitativa. La serie Inversión directa pasó de -340 millones de USD en 2000-01 a -3.188 millones en 2026-04. Entre ambos extremos, el saldo disminuyó en una magnitud de 2.848 millones de USD. El valor máximo fue 2.321 millones en 2010-07 y el mínimo fue -5.442 millones en 2023-04. Un 4,7% de las observaciones fue positivo y un 95,3% negativo. La desviación estándar fue de 1.292 millones de USD.*Interpretación económica.** El cambio entre el primer y el último dato resume la dirección neta del período, mientras que los máximos, mínimos y la desviación estándar permiten reconocer episodios extremos y dispersión. Estos indicadores son descriptivos: no identifican por sí solos las causas del movimiento. Para explicar los episodios concretos, deben contrastarse con información complementaria sobre comercio por socio, actividad económica, precios internacionales, tasas de interés y decisiones de inversión.*Lectura cuantitativa. La serie Inversión de cartera** pasó de -362 millones de USD en 2000-01 a 6.653 millones en 2026-04. Entre ambos extremos, el saldo aumentó en una magnitud de 7.015 millones de USD. El valor máximo fue 6.653 millones en 2026-04 y el mínimo fue -6.089 millones en 2021-04. Un 42,5% de las observaciones fue positivo y un 57,5% negativo. La desviación estándar fue de 1.828 millones de USD.*Interpretación económica.** El cambio entre el primer y el último dato resume la dirección neta del período, mientras que los máximos, mínimos y la desviación estándar permiten reconocer episodios extremos y dispersión. Estos indicadores son descriptivos: no identifican por sí solos las causas del movimiento. Para explicar los episodios concretos, deben contrastarse con información complementaria sobre comercio por socio, actividad económica, precios internacionales, tasas de interés y decisiones de inversión.*Lectura cuantitativa. La serie Derivados financieros (distintos de reservas) y opciones de compra de acciones por parte de empleados** pasó de 25 millones de USD en 2000-01 a -804 millones en 2026-04. Entre ambos extremos, el saldo disminuyó en una magnitud de 829 millones de USD. El valor máximo fue 1.238 millones en 2015-07 y el mínimo fue -879 millones en 2023-10. Un 58,5% de las observaciones fue positivo y un 37,7% negativo. La desviación estándar fue de 293 millones de USD.*Interpretación económica.** El cambio entre el primer y el último dato resume la dirección neta del período, mientras que los máximos, mínimos y la desviación estándar permiten reconocer episodios extremos y dispersión. Estos indicadores son descriptivos: no identifican por sí solos las causas del movimiento. Para explicar los episodios concretos, deben contrastarse con información complementaria sobre comercio por socio, actividad económica, precios internacionales, tasas de interés y decisiones de inversión.*Lectura cuantitativa. La serie Otra inversión** pasó de 769 millones de USD en 2000-01 a -6.930 millones en 2026-04. Entre ambos extremos, el saldo disminuyó en una magnitud de 7.699 millones de USD. El valor máximo fue 3.914 millones en 2026-01 y el mínimo fue -6.930 millones en 2026-04. Un 40,6% de las observaciones fue positivo y un 59,4% negativo. La desviación estándar fue de 1.799 millones de USD.*Interpretación económica.** El cambio entre el primer y el último dato resume la dirección neta del período, mientras que los máximos, mínimos y la desviación estándar permiten reconocer episodios extremos y dispersión. Estos indicadores son descriptivos: no identifican por sí solos las causas del movimiento. Para explicar los episodios concretos, deben contrastarse con información complementaria sobre comercio por socio, actividad económica, precios internacionales, tasas de interés y decisiones de inversión.*Lectura cuantitativa. La serie Activos de reserva** pasó de 212 millones de USD en 2000-01 a 550 millones en 2026-04. Entre ambos extremos, el saldo aumentó en una magnitud de 338 millones de USD. El valor máximo fue 3.429 millones en 2007-01 y el mínimo fue -870 millones en 2006-04. Un 89,6% de las observaciones fue positivo y un 10,4% negativo. La desviación estándar fue de 694 millones de USD.*Interpretación económica.** El cambio entre el primer y el último dato resume la dirección neta del período, mientras que los máximos, mínimos y la desviación estándar permiten reconocer episodios extremos y dispersión. Estos indicadores son descriptivos: no identifican por sí solos las causas del movimiento. Para explicar los episodios concretos, deben contrastarse con información complementaria sobre comercio por socio, actividad económica, precios internacionales, tasas de interés y decisiones de inversión.
if (length(vars_componentes_fin) > 0) {
fin_anual <- financiera |>
dplyr::mutate(Anio = lubridate::year(fecha)) |>
dplyr::group_by(Anio) |>
dplyr::summarise(dplyr::across(dplyr::all_of(vars_componentes_fin),
~sum(.x, na.rm = TRUE)), .groups = "drop")
# Selecciona cinco años con mayor suma de variaciones absolutas de componentes.
fin_anual <- fin_anual |>
dplyr::mutate(magnitud_total = rowSums(abs(dplyr::across(dplyr::all_of(vars_componentes_fin))),
na.rm = TRUE))
anios_seleccionados <- fin_anual |>
dplyr::slice_max(magnitud_total, n = min(5, nrow(fin_anual)), with_ties = FALSE) |>
dplyr::pull(Anio)
fin_anual |>
dplyr::filter(Anio %in% anios_seleccionados) |>
dplyr::select(-magnitud_total) |>
tidyr::pivot_longer(-Anio, names_to = "Componente", values_to = "Valor") |>
ggplot(aes(x = factor(Anio), y = Valor, fill = Valor >= 0)) +
geom_col(show.legend = FALSE) +
facet_wrap(~Componente, scales = "free_y", ncol = 2) +
scale_fill_manual(values = c("TRUE" = verde, "FALSE" = rojo), labels = c("TRUE" = "Positivo", "FALSE" = "Negativo")) +
scale_y_continuous(labels = formato_millones) +
labs(title = "Gráfica 8. Componentes financieros en años seleccionados", fill = "Signo",
subtitle = "Se muestran los cinco años con mayor magnitud agregada absoluta entre los componentes disponibles",
x = "Año", y = "Suma anual en millones de USD",
caption = "La selección se basa en magnitudes absolutas; el signo conserva el registro original.") +
tema_academico
}Análisis de barras divergentes. Las barras verdes representan sumas anuales positivas y las terracota, negativas, de acuerdo con los valores originales. La selección se basa en la suma de magnitudes absolutas de los componentes disponibles, no en una clasificación general de importancia económica. Como las series financieras pueden tener convenciones contables distintas de la intuición cotidiana de “entrada” y “salida”, interpreta el signo con la documentación oficial.
if (length(vars_componentes_fin) > 0) {
financiera |>
dplyr::select(dplyr::all_of(vars_componentes_fin)) |>
tidyr::pivot_longer(dplyr::everything(), names_to = "Componente", values_to = "Valor") |>
ggplot(aes(x = reorder(Componente, Valor, FUN = median, na.rm = TRUE), y = Valor)) +
geom_boxplot(fill = azul_claro, alpha = 0.75, outlier.colour = rojo, na.rm = TRUE) +
coord_flip() +
scale_y_continuous(labels = formato_millones) +
labs(title = "Gráfica 9. Dispersión de los componentes financieros",
x = NULL, y = "Millones de USD",
caption = "Fuente: elaboración propia con datos suministrados.") +
tema_academico
}Análisis de variabilidad. Una caja más amplia indica mayor dispersión del 50 % central de las observaciones; los puntos extremos muestran trimestres distantes del comportamiento típico. La desviación estándar ayuda a comparar las fluctuaciones en la misma unidad, aunque la magnitud y naturaleza contable de cada componente deben tenerse en cuenta. Esta gráfica no identifica causas ni mide por sí sola el riesgo financiero.
cc_comparacion <- corriente |>
dplyr::select(fecha, saldo_corriente = `CUENTA CORRIENTE`)
cf_comparacion <- financiera |>
dplyr::select(fecha, saldo_financiero = `Cuenta financiera`)
periodo_comun <- dplyr::inner_join(cc_comparacion, cf_comparacion, by = "fecha") |>
dplyr::arrange(fecha)
cat("Observaciones trimestrales comunes:", nrow(periodo_comun), "\n")## Observaciones trimestrales comunes: 106
if (nrow(periodo_comun) > 0) {
cat("Primer trimestre común:", format(min(periodo_comun$fecha), "%Y-%m-%d"), "\n")
cat("Último trimestre común:", format(max(periodo_comun$fecha), "%Y-%m-%d"), "\n")
}## Primer trimestre común: 2000-01-01
## Último trimestre común: 2026-04-01
if (nrow(periodo_comun) > 0) {
periodo_comun |>
tidyr::pivot_longer(-fecha, names_to = "Cuenta", values_to = "Saldo") |>
ggplot(aes(fecha, Saldo, colour = Cuenta)) +
geom_hline(yintercept = 0, linetype = "dashed", colour = gris) +
geom_line(linewidth = 0.8, na.rm = TRUE) +
facet_wrap(~Cuenta, scales = "free_y", ncol = 1,
labeller = as_labeller(c(
saldo_corriente = "Cuenta corriente",
saldo_financiero = "Cuenta financiera"
))) +
scale_y_continuous(labels = formato_millones) +
scale_x_date(date_breaks = "4 years", date_labels = "%Y") +
labs(title = "Gráfica 10. Trayectorias de cuenta corriente y cuenta financiera",
subtitle = "Solo trimestres presentes en ambas bases; cada panel tiene su propia escala",
x = "Trimestre", y = "Millones de USD",
caption = "Fuente: Banco de la República de Colombia; archivos suministrados.") +
tema_academico + theme(legend.position = "none")
}Análisis comparativo. Los paneles permiten observar si los cambios en las dos cuentas ocurren en períodos similares o diferentes. Se usan escalas independientes para evitar que una serie de mayor magnitud oculte a la otra. Las dos cuentas forman parte de la balanza de pagos, pero sus saldos no tienen por qué coincidir de manera exacta en los archivos presentados. La relación contable completa también puede involucrar la cuenta de capital, errores y omisiones y convenciones específicas de registro. No se debe inferir causalidad a partir de la coincidencia temporal.
if (nrow(periodo_comun) >= 3) {
correlacion <- cor(periodo_comun$saldo_corriente,
periodo_comun$saldo_financiero,
use = "complete.obs",
method = "pearson")
cat("Correlación de Pearson en el período común:", round(correlacion, 3), "\n")
cat("Esta correlación describe asociación lineal; no demuestra causalidad.\n")
} else {
cat("No hay suficientes observaciones coincidentes para calcular una correlación útil.\n")
}## Correlación de Pearson en el período común: 0,967
## Esta correlación describe asociación lineal; no demuestra causalidad.
Los acuerdos comerciales y los procesos de integración pueden influir en los costos de comercio, el acceso a mercados, la composición de las exportaciones e importaciones y las decisiones de inversión. Sin embargo, las dos bases utilizadas contienen agregados nacionales y no identifican por sí solas qué socio comercial o acuerdo explica una variación.
Como contexto para una discusión posterior pueden consultarse fuentes oficiales sobre la Comunidad Andina, la Alianza del Pacífico y el Ministerio de Comercio, Industria y Turismo de Colombia.
Para comprobar efectos específicos sería necesario incorporar, por ejemplo, exportaciones e importaciones por país socio, inversión extranjera por país de origen, fechas de entrada en vigor de los acuerdos y variables macroeconómicas de control. Sin esa información, las relaciones con la integración económica deben presentarse como hipótesis o mecanismos posibles, no como efectos causales demostrados.
¿Qué relación temporal existe entre el saldo de la cuenta corriente y el comportamiento de la cuenta financiera de Colombia durante el período común?
¿Qué componentes de la cuenta corriente contribuyen en mayor medida a los déficits o superávits observados?
¿Cómo podría evaluarse si los acuerdos de integración económica de Colombia se relacionan con cambios en sus exportaciones, importaciones y flujos de inversión extranjera?
¿Qué tan volátiles han sido los componentes de la cuenta financiera y cuáles muestran las mayores fluctuaciones?
Completa las siguientes conclusiones después de revisar las tablas y gráficas generadas. Evita dejar afirmaciones genéricas o inventar resultados:
Para la elaboración de este trabajo se utilizó inteligencia artificial (ChatGPT) como herramienta de apoyo en la estructuración del código en RStudio, el diseño visual de las gráficas y la organización de los análisis e interpretaciones de las series de cuenta corriente y cuenta financiera de Colombia. Los resultados obtenidos se basan en las bases de datos utilizadas y deben ser revisados y validados por los autores. La inteligencia artificial se empleó como apoyo al proceso académico, sin sustituir el análisis crítico, la comprensión de los datos ni la responsabilidad de los autores sobre el contenido final del trabajo.