Este informe describe la evolución de las importaciones y exportaciones de productos asociados al rubro forestal en Paraguay.
Los datos se obtuvieron del portal de datos abiertos de la Dirección Nacional de Ingresos Tributarios (DNIT), a partir de archivos mensuales de la Dirección Nacional de Aduanas. El período efectivo corresponde a los datos de los últimos 10 años, con corte a agosto del 2026.
Fuente: Datos abiertos de la DNIT.
El sector forestal ocupa un lugar relevante en la economía paraguaya: el país cuenta con una base importante de recursos madereros (bosques nativos y plantaciones) y una cadena de valor que abarca desde la extracción de rollos y la producción de carbón vegetal hasta la manufactura de papel, cartón y productos derivados de la celulosa. Este rubro genera divisas por exportación, empleo en zonas rurales y vínculos productivos con otros sectores (construcción, energía, industria del papel), a la vez que está sujeto a presiones específicas: sostenibilidad del recurso, trazabilidad del origen de la madera, y sensibilidad a la demanda externa y a los precios internacionales de commodities forestales.
El comercio exterior de estos productos genera una gran cantidad de información registrada en los despachos aduaneros, que permite conocer qué productos se comercializan, cuáles son los principales países de destino y origen, qué aduanas participan y qué medios de transporte son utilizados.
Por este motivo, resulta necesario organizar y analizar estos datos para conocer cómo ha evolucionado el comercio exterior forestal, cuáles son los principales productos comercializados, qué países concentran los intercambios y qué aduanas y medios de transporte tienen mayor participación.
En este contexto, el presente trabajo busca utilizar herramientas de Big Data para procesar y analizar los registros de comercio exterior del rubro forestal paraguayo, con el propósito de identificar sus principales características y patrones durante el período estudiado.
Analizar el comportamiento del comercio exterior de productos del rubro forestal en Paraguay durante los últimos 10 años, mediante técnicas de análisis estadístico y visualización de datos en R, considerando las operaciones de importación y exportación, su evolución temporal, volumen comercializado, composición de los productos y principales mercados de origen y destino.
Caracterizar las operaciones de comercio exterior del rubro forestal según tipo de operación y categoría de producto.
Analizar el volumen físico de productos forestales importados y exportados, considerando el peso neto y la cantidad estadística.
Analizar la evolución temporal del comercio forestal, identificando tendencias y posibles patrones estacionales durante el período de estudio.
Identificar los principales productos y categorías forestales comercializados, diferenciando su comportamiento entre importaciones y exportaciones.
Identificar los principales países de origen, procedencia y destino de los productos forestales según el tipo de operación.
Caracterizar las operaciones forestales según las principales aduanas y medios de transporte utilizados.
La clasificación se basa en el campo RUBRO publicado por
Aduanas y se limita a seis categorías: Madera, Carbón vegetal, Capítulo
45 (corcho), Capítulo 47 (pasta de madera/celulosa), Papel y cartón, y
Capítulo 46 (manufacturas de espartería/cestería). Se toleran
diferencias de tildes, espacios y puntuación en las etiquetas de
capítulos. El catálogo detectado se imprime para revisar las etiquetas
efectivamente incluidas.
Este criterio es una aproximación temática, no una clasificación oficial exhaustiva del sector forestal. Antes de presentar resultados definitivos, conviene revisar la tabla de categorías detectadas y ajustar el patrón del estudio, según la dirección que considera otros productos o excluye alguno de ellos.
Las métricas monetarias y físicas se convierten usando coma decimal y
punto de miles cuando la fuente las entrega como texto. Los despachos se
cuentan mediante identificadores distintos de
DESPACHO CIFRADO; el peso y FOB se suman a nivel de
ítem.
inventario <- tibble::tibble(archivo = basename(archivos)) |>
dplyr::mutate(
anio = as.integer(substr(archivo, 1, 4)),
mes = sub("^[0-9]{4}_", "", sub("\\.parquet$", "", archivo))
) |>
dplyr::count(anio, name = "archivos_mensuales") |>
dplyr::arrange(anio)
knitr::kable(inventario, caption = "Archivos mensuales disponibles por año")
| anio | archivos_mensuales |
|---|---|
| 2016 | 12 |
| 2017 | 12 |
| 2018 | 12 |
| 2019 | 12 |
| 2020 | 12 |
| 2021 | 12 |
| 2022 | 12 |
| 2023 | 12 |
| 2024 | 12 |
| 2025 | 12 |
| 2026 | 8 |
cat("\nTotal de archivos mensuales:", length(archivos), "\n")
##
## Total de archivos mensuales: 128
cat("Período cubierto:", min(inventario$anio), "-", max(inventario$anio), "\n")
## Período cubierto: 2016 - 2026
Primero se inspecciona únicamente la columna RUBRO de
cada archivo. Así se obtiene el catálogo sin cargar todas las columnas
ni todas las filas en memoria.
rubros_catalogo <- unique(unlist(lapply(archivos, function(archivo) {
arrow::open_dataset(archivo, format = "parquet") |>
dplyr::select(RUBRO) |>
dplyr::distinct() |>
dplyr::collect() |>
dplyr::pull(RUBRO)
}), use.names = FALSE))
rubros_normalizados <- normalizar_texto(rubros_catalogo)
patrones_forestales <- c(
"^MADERA$",
"^CARBON VEGETAL$",
"^CAPITULO\\s*45\\s*[-:]*\\s*CORCHO",
"^CAPITULO\\s*47.*(PASTA DE MADERA|MATERIAS FIBROSAS CELULOSICAS)",
"^PAPEL Y CARTON$",
"^CAPITULO\\s*46.*(ESPARTERIA|CESTERIA)"
)
coincide_forestal <- Reduce(
`|`,
lapply(patrones_forestales, grepl, x = rubros_normalizados)
)
rubros_forestales <- rubros_catalogo[coincide_forestal]
rubros_forestales <- sort(unique(rubros_forestales[!is.na(rubros_forestales)]))
if (length(rubros_forestales) == 0) {
stop("No se encontraron las seis categorías forestales esperadas en RUBRO.")
}
knitr::kable(
tibble::tibble(rubro_detectado = rubros_forestales),
caption = "Categorías incluidas por el filtro forestal"
)
| rubro_detectado |
|---|
| CAPITULO 45CORCHO Y MANUFACTURAS DE CORCHO |
| CAPITULO 46 MANUFACTURAS DE ESPARTERIA O DE CESTERIA |
| CAPITULO 47 PASTA DE MADERA O DE OTRAS MATERIAS FIBROSAS CELULOSICAS ,DESPERDICIOS Y DESECHOS DE PA |
| CARBON VEGETAL |
| MADERA |
| PAPEL Y CARTON |
Se filtra cada mes antes de leerlo en memoria. La caché contiene solo las columnas necesarias para el análisis y emplea tipos homogéneos; de esta forma se pueden combinar años en los que los importes fueron almacenados como texto con otros en los que fueron almacenados como números.
if (reprocesar_cache && dir.exists(dir_cache)) {
unlink(dir_cache, recursive = TRUE, force = TRUE)
}
dir.create(dir_cache, recursive = TRUE, showWarnings = FALSE)
columnas_necesarias <- c(
"DESPACHO CIFRADO", "OPERACION", "AÑO", "MES", "ADUANA",
"MEDIO TRANSPORTE", "PAIS ORIGEN", "PAIS PROCEDENCIA/DESTINO",
"UNIDAD MEDIDA ESTADISTICA", "CANTIDAD ESTADISTICA", "KILO NETO",
"KILO BRUTO", "FOB DOLAR", "RUBRO", "MERCADERIA"
)
normalizar_texto_local <- function(x) {
x <- toupper(trimws(as.character(x)))
iconv(x, from = "", to = "ASCII//TRANSLIT")
}
parsear_numero_local <- function(x) {
if (is.numeric(x)) return(as.double(x))
readr::parse_number(
as.character(x),
locale = readr::locale(decimal_mark = ",", grouping_mark = ".")
)
}
for (archivo in archivos) {
salida <- file.path(dir_cache, basename(archivo))
if (!reprocesar_cache && file.exists(salida) && file.info(salida)$size > 0) {
next
}
tryCatch({
mensual <- arrow::open_dataset(archivo, format = "parquet") |>
dplyr::filter(RUBRO %in% rubros_forestales) |>
dplyr::collect()
names(mensual) <- trimws(names(mensual))
faltantes <- setdiff(columnas_necesarias, names(mensual))
if (length(faltantes) > 0) {
stop("Faltan columnas: ", paste(faltantes, collapse = ", "))
}
# Selección en R después del filtro Arrow; evita problemas con any_of().
mensual <- mensual[, columnas_necesarias, drop = FALSE]
mensual_limpio <- data.frame(
despacho = as.character(mensual[["DESPACHO CIFRADO"]]),
operacion = normalizar_texto_local(mensual[["OPERACION"]]),
anio = suppressWarnings(as.integer(as.character(mensual[["AÑO"]]))),
mes = normalizar_texto_local(mensual[["MES"]]),
aduana = as.character(mensual[["ADUANA"]]),
medio_transporte = as.character(mensual[["MEDIO TRANSPORTE"]]),
pais_origen = as.character(mensual[["PAIS ORIGEN"]]),
pais_procedencia_destino = as.character(mensual[["PAIS PROCEDENCIA/DESTINO"]]),
unidad_estadistica = as.character(mensual[["UNIDAD MEDIDA ESTADISTICA"]]),
cantidad_estadistica = parsear_numero_local(mensual[["CANTIDAD ESTADISTICA"]]),
kilo_neto = parsear_numero_local(mensual[["KILO NETO"]]),
kilo_bruto = parsear_numero_local(mensual[["KILO BRUTO"]]),
fob_dolar = parsear_numero_local(mensual[["FOB DOLAR"]]),
rubro = as.character(mensual[["RUBRO"]]),
mercaderia = as.character(mensual[["MERCADERIA"]]),
stringsAsFactors = FALSE
)
arrow::write_parquet(mensual_limpio, salida, compression = "zstd")
cat("Procesado:", basename(archivo), "\n")
}, error = function(e) {
stop(
"Error procesando ", basename(archivo), ": ",
conditionMessage(e),
call. = FALSE
)
})
}
archivos_forestales <- list.files(
dir_cache,
pattern = "\\.parquet$",
full.names = TRUE
)
if (length(archivos_forestales) == 0) {
stop("No se generaron archivos filtrados; compruebe las categorías y columnas.")
}
forestal <- arrow::open_dataset(archivos_forestales, format = "parquet")
filas_forestales <- forestal |>
dplyr::summarise(total = dplyr::n()) |>
dplyr::collect() |>
dplyr::pull(total)
cat("Archivos forestales normalizados:", length(archivos_forestales), "\n")
cat("Registros forestales:", base::format(filas_forestales, big.mark = "."), "\n")
resumen_rubros <- forestal |>
dplyr::count(rubro, sort = TRUE) |>
dplyr::collect()
knitr::kable(resumen_rubros, caption = "Registros por categoría forestal")
| rubro | n |
|---|---|
| PAPEL Y CARTON | 747201 |
| MADERA | 140295 |
| CARBON VEGETAL | 48645 |
| CAPITULO 47 PASTA DE MADERA O DE OTRAS MATERIAS FIBROSAS CELULOSICAS ,DESPERDICIOS Y DESECHOS DE PA | 9511 |
| CAPITULO 46 MANUFACTURAS DE ESPARTERIA O DE CESTERIA | 6568 |
| CAPITULO 13GOMAS, RESINAS Y DEMAS JUGOS Y EXTRACTOS VEGETALES | 5995 |
| CAPITULO 45CORCHO Y MANUFACTURAS DE CORCHO | 1079 |
| CAPITULO 55 FIBRAS SINTETICAS O ARTIFICIALES DISCONTINUAS | 10 |
resumen_operaciones <- forestal |>
dplyr::group_by(operacion) |>
dplyr::summarise(
despachos = dplyr::n_distinct(despacho),
registros = dplyr::n(),
.groups = "drop"
) |>
dplyr::collect()
knitr::kable(resumen_operaciones, caption = "Validación por tipo de operación")
| operacion | despachos | registros |
|---|---|---|
| IMPORTACION | 187874 | 809833 |
| EXPORTACION | 101975 | 149471 |
operaciones_tipo <- forestal |>
dplyr::group_by(operacion) |>
dplyr::summarise(
operaciones = dplyr::n_distinct(despacho),
registros = dplyr::n(),
toneladas = sum(kilo_neto, na.rm = TRUE) / 1000,
valor_fob_usd = sum(fob_dolar, na.rm = TRUE),
.groups = "drop"
) |>
dplyr::collect() |>
dplyr::arrange(dplyr::desc(operaciones))
knitr::kable(operaciones_tipo, digits = 2, caption = "Comercio forestal por operación")
| operacion | operaciones | registros | toneladas | valor_fob_usd |
|---|---|---|---|---|
| IMPORTACION | 187874 | 809833 | 7967486 | 17893145164 |
| EXPORTACION | 101975 | 149471 | 4603494 | 3206978994 |
ggplot(operaciones_tipo, aes(x = reorder(operacion, operaciones), y = operaciones, fill = operacion)) +
geom_col(show.legend = FALSE) +
coord_flip() +
scale_y_continuous(labels = scales::label_comma(big.mark = ".", decimal.mark = ",")) +
labs(title = "Despachos por tipo de operación", x = NULL, y = "Despachos distintos") +
theme_minimal(base_size = 12)
operaciones_rubro <- forestal |>
dplyr::group_by(rubro, operacion) |>
dplyr::summarise(
operaciones = dplyr::n_distinct(despacho),
toneladas = sum(kilo_neto, na.rm = TRUE) / 1000,
.groups = "drop"
) |>
dplyr::collect()
ggplot(operaciones_rubro, aes(x = reorder(rubro, operaciones), y = operaciones, fill = operacion)) +
geom_col(position = "dodge") +
coord_flip() +
scale_y_continuous(labels = scales::label_comma(big.mark = ".", decimal.mark = ",")) +
labs(title = "Despachos por categoría y operación", x = NULL, y = "Despachos distintos", fill = "Operación") +
theme_minimal(base_size = 11)
volumen_valor <- forestal |>
dplyr::group_by(operacion) |>
dplyr::summarise(
toneladas = sum(kilo_neto, na.rm = TRUE) / 1000,
valor_fob_usd = sum(fob_dolar, na.rm = TRUE),
.groups = "drop"
) |>
dplyr::collect()
knitr::kable(volumen_valor, digits = 2, caption = "Peso neto y valor FOB por operación")
| operacion | toneladas | valor_fob_usd |
|---|---|---|
| IMPORTACION | 7967486 | 17893145164 |
| EXPORTACION | 4603494 | 3206978994 |
ggplot(volumen_valor, aes(x = reorder(operacion, toneladas), y = toneladas, fill = operacion)) +
geom_col(show.legend = FALSE) +
coord_flip() +
scale_y_continuous(labels = scales::label_number(big.mark = ".", decimal.mark = ",")) +
labs(title = "Volumen físico por tipo de operación", x = NULL, y = "Toneladas netas") +
theme_minimal(base_size = 12)
evolucion_anual <- forestal |>
dplyr::group_by(anio, operacion) |>
dplyr::summarise(
operaciones = dplyr::n_distinct(despacho),
toneladas = sum(kilo_neto, na.rm = TRUE) / 1000,
valor_fob_usd = sum(fob_dolar, na.rm = TRUE),
.groups = "drop"
) |>
dplyr::collect()
ggplot(evolucion_anual, aes(x = anio, y = toneladas, color = operacion, group = operacion)) +
geom_line(linewidth = 0.9) +
geom_point(size = 2) +
scale_x_continuous(breaks = sort(unique(evolucion_anual$anio))) +
scale_y_continuous(labels = scales::label_number(big.mark = ".", decimal.mark = ",")) +
labs(title = "Evolución anual del volumen forestal", x = "Año", y = "Toneladas netas", color = "Operación") +
theme_minimal(base_size = 11) +
theme(axis.text.x = element_text(angle = 45, hjust = 1))
mensual_anual <- forestal |>
dplyr::group_by(anio, mes, operacion) |>
dplyr::summarise(
operaciones = dplyr::n_distinct(despacho),
toneladas = sum(kilo_neto, na.rm = TRUE) / 1000,
.groups = "drop"
) |>
dplyr::collect() |>
dplyr::mutate(mes_num = match(normalizar_texto(mes), meses_es)) |>
dplyr::filter(!is.na(mes_num))
estacionalidad <- mensual_anual |>
dplyr::group_by(mes_num, operacion) |>
dplyr::summarise(
toneladas_promedio = mean(toneladas, na.rm = TRUE),
operaciones_promedio = mean(operaciones, na.rm = TRUE),
.groups = "drop"
) |>
dplyr::mutate(mes = factor(meses_es[mes_num], levels = meses_es))
ggplot(estacionalidad, aes(x = mes, y = toneladas_promedio, color = operacion, group = operacion)) +
geom_line(linewidth = 0.9) +
geom_point(size = 2) +
scale_y_continuous(labels = scales::label_number(big.mark = ".", decimal.mark = ",")) +
labs(title = "Volumen mensual promedio por operación", x = "Mes", y = "Toneladas promedio", color = "Operación") +
theme_minimal(base_size = 11) +
theme(axis.text.x = element_text(angle = 45, hjust = 1))
productos_base <- forestal |>
dplyr::select(operacion, mercaderia, despacho, kilo_neto, fob_dolar) |>
dplyr::collect() |>
as.data.frame()
top_productos <- productos_base |>
dplyr::filter(
!is.na(mercaderia),
trimws(as.character(mercaderia)) != ""
) |>
dplyr::group_by(operacion, mercaderia) |>
dplyr::summarise(
operaciones = dplyr::n_distinct(despacho),
toneladas = sum(kilo_neto, na.rm = TRUE) / 1000,
valor_fob_usd = sum(fob_dolar, na.rm = TRUE),
.groups = "drop"
) |>
dplyr::group_by(operacion) |>
dplyr::slice_max(
order_by = operaciones,
n = 10,
with_ties = FALSE
) |>
dplyr::ungroup()
knitr::kable(
top_productos,
digits = 2,
caption = "Diez principales mercaderías por operación"
)
| operacion | mercaderia | operaciones | toneladas | valor_fob_usd |
|---|---|---|---|---|
| EXPORTACION | LOS DEMAS PAPELES Y CARTONES DE GRAMAJE SUPERIOR A 150 G/M2 | 19172 | 763497.75 | 738553699.88 |
| EXPORTACION | LATERAL DE CARTON | 1344 | 332.43 | 19688.24 |
| EXPORTACION | CARBON VEGETAL EN BOLSAS | 1063 | 102294.12 | 37894237.49 |
| EXPORTACION | CARBON VEGETAL EN BOLSAS. | 647 | 66693.15 | 21615351.91 |
| EXPORTACION | CARBON VEGETAL | 580 | 34728.74 | 11136789.79 |
| EXPORTACION | PBL-CARTON YESO | 559 | 71068.00 | 40545964.98 |
| EXPORTACION | FORRO DE CARTON | 486 | 19.94 | 2969.14 |
| EXPORTACION | MADERA TERCIADA Y/O MULTILAMINADA | 411 | 13514.51 | 8281144.11 |
| EXPORTACION | LOS DEMAS PAPELES Y CARTONES DE GRAMAJE INFERIOR O IGUAL A 150 G/M2 | 401 | 12909.64 | 12595468.99 |
| EXPORTACION | CAJAS | 377 | 52.18 | 661298.78 |
| IMPORTACION | CAJAS DE PAPEL ONDULADO DE DIFERENTES MEDIDAS | 667 | 4903.18 | 3978943.61 |
| IMPORTACION | CAJAS DE CARTON CORRUGADO, DE DISTINTAS MEDIDAS, PARA CARNE, SEGUN DESCRIPCION EN SUB-ITEM: | 650 | 9079.81 | 7757984.23 |
| IMPORTACION | ALMOHADILLAS(PAD) PAD FOR AUTOMOTIVE HARNES PRODUCTION | 541 | 431.49 | 5517135.91 |
| IMPORTACION | LOS DEMAS, (66) UNI MDF DETALLADO EN LA SUBITEM | 541 | 3863.91 | 1741413.43 |
| IMPORTACION | FONDOS DE CARTON CORRUGADO. | 540 | 4631.34 | 5417819.85 |
| IMPORTACION | PAPEL HIGIENICO,EN: | 528 | 25512.83 | 46516319.38 |
| IMPORTACION | ETIQUETA . | 517 | 1111.57 | 5106898.75 |
| IMPORTACION | LOS DEMAS, (66) UNI MDF DETALLADO SEGUN SUBITEM | 515 | 3727.12 | 1866901.97 |
| IMPORTACION | ETIQUETAS (LABEL) IDENTIFICATION LABELS FOR AUTOMOTIVE HARNESS PRODUCTION | 447 | 63.82 | 1143038.23 |
| IMPORTACION | JUNTA | 441 | 4.56 | 225486.72 |
ggplot(
top_productos,
aes(x = reorder(mercaderia, operaciones), y = operaciones, fill = operacion)
) +
geom_col(show.legend = FALSE) +
coord_flip() +
facet_wrap(~ operacion, scales = "free_y") +
labs(
title = "Principales mercaderías forestales",
x = NULL,
y = "Despachos distintos"
) +
theme_minimal(base_size = 10)
paises_base <- forestal |>
dplyr::select(
operacion,
pais_origen,
pais_procedencia_destino,
despacho,
kilo_neto
) |>
dplyr::collect() |>
as.data.frame()
paises <- paises_base |>
dplyr::mutate(
pais = ifelse(
operacion == "IMPORTACION",
pais_origen,
pais_procedencia_destino
)
) |>
dplyr::filter(
!is.na(pais),
trimws(as.character(pais)) != ""
) |>
dplyr::group_by(operacion, pais) |>
dplyr::summarise(
operaciones = dplyr::n_distinct(despacho),
toneladas = sum(kilo_neto, na.rm = TRUE) / 1000,
.groups = "drop"
) |>
dplyr::group_by(operacion) |>
dplyr::slice_max(
order_by = operaciones,
n = 10,
with_ties = FALSE
) |>
dplyr::ungroup()
knitr::kable(
paises,
digits = 2,
caption = "Principales países por operación"
)
| operacion | pais | operaciones | toneladas |
|---|---|---|---|
| EXPORTACION | BRASIL | 14108 | 542157.57 |
| EXPORTACION | CHILE | 8460 | 359335.34 |
| EXPORTACION | ESTADOS UNIDOS DE AMERICA | 7179 | 207371.57 |
| EXPORTACION | BR - BRASIL | 6540 | 236701.58 |
| EXPORTACION | ARGENTINA | 6481 | 346027.11 |
| EXPORTACION | URUGUAY | 5723 | 174225.44 |
| EXPORTACION | REINO UNIDO | 4758 | 415717.15 |
| EXPORTACION | CL - CHILE | 4501 | 195897.57 |
| EXPORTACION | US - ESTADOS UNIDOS DE AMERICA | 3340 | 123875.82 |
| EXPORTACION | AR - ARGENTINA | 3113 | 123247.60 |
| IMPORTACION | BRASIL | 66188 | 3004663.30 |
| IMPORTACION | BR - BRASIL | 31044 | 1639877.49 |
| IMPORTACION | CHINA | 20496 | 336984.08 |
| IMPORTACION | ARGENTINA | 12677 | 554007.82 |
| IMPORTACION | CN - CHINA | 9411 | 182596.04 |
| IMPORTACION | ESTADOS UNIDOS DE AMERICA | 6526 | 132710.19 |
| IMPORTACION | AR - ARGENTINA | 4992 | 306839.79 |
| IMPORTACION | ALEMANIA | 3509 | 77230.18 |
| IMPORTACION | CHILE | 2665 | 58757.35 |
| IMPORTACION | US - ESTADOS UNIDOS DE AMERICA | 2658 | 59988.44 |
ggplot(
paises,
aes(x = reorder(pais, operaciones), y = operaciones, fill = operacion)
) +
geom_col(show.legend = FALSE) +
coord_flip() +
facet_wrap(~ operacion, scales = "free_y") +
labs(
title = "Principales países de origen y destino",
x = NULL,
y = "Despachos distintos"
) +
theme_minimal(base_size = 10)
logistica_base <- forestal |>
dplyr::select(
operacion,
aduana,
medio_transporte,
despacho,
kilo_neto
) |>
dplyr::collect() |>
as.data.frame()
resumen_aduanas <- logistica_base |>
dplyr::filter(!is.na(aduana), trimws(as.character(aduana)) != "") |>
dplyr::group_by(operacion, aduana) |>
dplyr::summarise(
operaciones = dplyr::n_distinct(despacho),
toneladas = sum(kilo_neto, na.rm = TRUE) / 1000,
.groups = "drop"
) |>
dplyr::group_by(operacion) |>
dplyr::slice_max(
order_by = operaciones,
n = 10,
with_ties = FALSE
) |>
dplyr::ungroup()
resumen_transporte <- logistica_base |>
dplyr::filter(
!is.na(medio_transporte),
trimws(as.character(medio_transporte)) != ""
) |>
dplyr::group_by(operacion, medio_transporte) |>
dplyr::summarise(
operaciones = dplyr::n_distinct(despacho),
toneladas = sum(kilo_neto, na.rm = TRUE) / 1000,
.groups = "drop"
) |>
dplyr::group_by(operacion) |>
dplyr::slice_max(
order_by = operaciones,
n = 10,
with_ties = FALSE
) |>
dplyr::ungroup()
knitr::kable(resumen_aduanas, digits = 2, caption = "Principales aduanas")
| operacion | aduana | operaciones | toneladas |
|---|---|---|---|
| EXPORTACION | PUERTO SECO BOREAL | 19516 | 679410.78 |
| EXPORTACION | PTO SEGURO FLUVIAL | 15895 | 954341.02 |
| EXPORTACION | TER. DE CARGAS KM.12 | 13621 | 523421.61 |
| EXPORTACION | CAACUPEMI | 12198 | 563421.80 |
| EXPORTACION | CHACOI | 11484 | 554251.28 |
| EXPORTACION | TERPORT - VILLETA | 10437 | 560380.57 |
| EXPORTACION | CAMPESTRE S.A. | 5618 | 98398.79 |
| EXPORTACION | PEDRO JUAN CABALLERO | 3891 | 213025.54 |
| EXPORTACION | MCAL.ESTIGARRIBIA | 2136 | 60053.13 |
| EXPORTACION | ENCARNACION | 1587 | 101205.80 |
| IMPORTACION | CIUDAD DEL ESTE | 63591 | 3197051.61 |
| IMPORTACION | AEROP. PETTIROSSI | 19668 | 27021.27 |
| IMPORTACION | SOLUCION LOGISTICA | 12878 | 350722.40 |
| IMPORTACION | PAKSA | 11312 | 534634.40 |
| IMPORTACION | CAACUPEMI | 9775 | 840793.22 |
| IMPORTACION | PUERTOS Y ESTIBAJES | 9489 | 455650.90 |
| IMPORTACION | PTO SEGURO FLUVIAL | 8395 | 533990.20 |
| IMPORTACION | JOSE FALCON | 6050 | 471443.01 |
| IMPORTACION | TERPORT - VILLETA | 5240 | 387587.07 |
| IMPORTACION | EMPEDRIL S.A. | 5221 | 246615.41 |
knitr::kable(
resumen_transporte,
digits = 2,
caption = "Principales medios de transporte"
)
| operacion | medio_transporte | operaciones | toneladas |
|---|---|---|---|
| EXPORTACION | CAMION | 59559 | 2284247.94 |
| EXPORTACION | ACUATICO | 41636 | 2309536.32 |
| EXPORTACION | AVION | 703 | 5549.89 |
| EXPORTACION | PROPIOS MEDIOS | 3 | 290.22 |
| IMPORTACION | CAMION | 112380 | 5855595.85 |
| IMPORTACION | ACUATICO | 22788 | 1919095.57 |
| IMPORTACION | AVION | 20395 | 25898.62 |
| IMPORTACION | PROPIOS MEDIOS | 281 | 449.47 |
ggplot(resumen_aduanas, aes(x = reorder(aduana, operaciones), y = operaciones, fill = operacion)) +
geom_col(show.legend = FALSE) +
coord_flip() +
facet_wrap(~ operacion, scales = "free_y") +
labs(title = "Principales aduanas forestales", x = NULL, y = "Despachos distintos") +
theme_minimal(base_size = 10)
ggplot(resumen_transporte, aes(x = reorder(medio_transporte, operaciones), y = operaciones, fill = operacion)) +
geom_col(show.legend = FALSE) +
coord_flip() +
facet_wrap(~ operacion, scales = "free_y") +
labs(title = "Medios de transporte utilizados", x = NULL, y = "Despachos distintos") +
theme_minimal(base_size = 10)
RUBRO;
revise las categorías listadas antes de interpretar el filtro como una
definición oficial del sector._forestal_normalizado_v1 y la reutiliza en ejecuciones
posteriores. Si cambia el patrón forestal, establezca
reprocesar_cache <- TRUE en el bloque de configuración y
vuelva a tejer el documento.Dirección Nacional de Ingresos Tributarios. Datos abiertos.