Este es el tercer cuaderno R Markdown del curso Geomática Básica 2026. Ilustra cómo obtener estadísticas multianuales para un grupo de cultivos en un departamento, en este caso Guaviare. La fuente de datos son las Evaluaciones Agropecuarias Municipales (EVA) del Ministerio de Agricultura y Desarrollo Rural.
Instala los paquetes una sola vez desde la consola (si ya tienes
tidyverse, no necesitas nada más):
install.packages("tidyverse")
Y luego cárgalos en cada sesión:
library('tidyverse') # incluye dplyr, readr y ggplot2
## ── Attaching core tidyverse packages ──────────────────────── tidyverse 2.0.0 ──
## ✔ dplyr 1.2.1 ✔ readr 2.2.0
## ✔ forcats 1.0.1 ✔ stringr 1.6.0
## ✔ ggplot2 4.0.3 ✔ tibble 3.3.1
## ✔ lubridate 1.9.5 ✔ tidyr 1.3.2
## ✔ purrr 1.2.2
## ── Conflicts ────────────────────────────────────────── tidyverse_conflicts() ──
## ✖ dplyr::filter() masks stats::filter()
## ✖ dplyr::lag() masks stats::lag()
## ℹ Use the conflicted package (<http://conflicted.r-lib.org/>) to force all conflicts to become errors
datos dentro de tu directorio de trabajo.Tu archivo ya está descargado:
Evaluaciones_Agropecuarias_Municipales_EVA_20261027.csv.
Primero, confirma que R ve el archivo:
list.files("./datos", pattern = "csv")
## [1] "Evaluaciones_Agropecuarias_Municipales_EVA_20261027.csv"
Ahora léelo. Todo se lee como texto ("c") porque el CSV
trae comas de miles (por ejemplo "1,820" o
"2,009" para el año). Más abajo convertimos las columnas
numéricas con parse_number().
# ajusta la ruta si tu archivo está en otra carpeta
eva <- read_csv("./datos/Evaluaciones_Agropecuarias_Municipales_EVA_20261027.csv",
col_names = TRUE,
col_types = cols(.default = "c"))
eva
Es muy importante saber qué nombres usa R para las columnas, porque
pueden ser distintos a los que vemos en Excel (los encabezados traen
saltos de línea \n):
names(eva)
## [1] "CÓD. \nDEP."
## [2] "DEPARTAMENTO"
## [3] "CÓD. MUN."
## [4] "MUNICIPIO"
## [5] "GRUPO \nDE CULTIVO"
## [6] "SUBGRUPO \nDE CULTIVO"
## [7] "CULTIVO"
## [8] "DESAGREGACIÓN REGIONAL Y/O SISTEMA PRODUCTIVO"
## [9] "AÑO"
## [10] "PERIODO"
## [11] "Área Sembrada\n(ha)"
## [12] "Área Cosechada\n(ha)"
## [13] "Producción\n(t)"
## [14] "Rendimiento\n(t/ha)"
## [15] "ESTADO FISICO PRODUCCION"
## [16] "NOMBRE \nCIENTIFICO"
## [17] "CICLO DE CULTIVO"
Nos quedamos con las columnas desde CÓD. MUN. hasta
ESTADO FISICO PRODUCCION:
eva %>%
dplyr::select('CÓD. MUN.':'ESTADO FISICO PRODUCCION') -> eva.tmp
eva.tmp
Comprueba que solo quedaron las columnas relevantes.
Cambiamos los nombres con espacios, tildes o saltos de línea por
nombres simples. Ojo: en el cuaderno que usaste de
referencia, AreaCosechada quedó apuntando a la columna
Área Sembrada. Eso es un error de copiado y haría que las
dos áreas fueran idénticas. Aquí cada una apunta a su columna:
eva.tmp %>%
dplyr::rename(
'Cod_Mun' = 'CÓD. MUN.',
'Grupo' = 'GRUPO \nDE CULTIVO',
'Subgrupo' = 'SUBGRUPO \nDE CULTIVO',
'Year' = 'AÑO',
'AreaSembrada' = 'Área Sembrada\n(ha)',
'AreaCosechada' = 'Área Cosechada\n(ha)', # <- corregido
'Produccion' = 'Producción\n(t)',
'Rendimiento' = 'Rendimiento\n(t/ha)',
'Sistema' = 'DESAGREGACIÓN REGIONAL Y/O SISTEMA PRODUCTIVO',
'Estado' = 'ESTADO FISICO PRODUCCION'
) -> new_eva
Como leímos todo como texto, convertimos las columnas cuantitativas:
new_eva <- new_eva %>%
mutate(across(c(Cod_Mun, Year, AreaSembrada, AreaCosechada,
Produccion, Rendimiento), parse_number))
new_eva
Verifica en la tabla que esas columnas aparezcan como
<dbl> y no como <chr>.
Muchas tareas de análisis se resuelven con el paradigma
dividir-aplicar-combinar: dividir los datos en grupos,
aplicar un análisis a cada grupo y combinar los resultados. En
dplyr, group_by() divide y
summarize() resume cada grupo en una fila.
Producción total por grupo de cultivos:
new_eva %>%
group_by(Grupo) %>%
summarize(total_produccion = sum(Produccion, na.rm = TRUE)) %>%
arrange(desc(total_produccion))
Guarda ese resultado en un objeto:
new_eva %>%
group_by(Grupo) %>%
summarize(total_produccion = sum(Produccion, na.rm = TRUE)) -> PT
Filtra los grupos más importantes (más de 10.000 toneladas acumuladas):
PT %>%
filter(total_produccion > 10000) -> main.groups
main.groups
Producción total de esos grupos principales:
(value <- sum(main.groups$total_produccion))
## [1] 849945
Agrega la proporción de cada grupo respecto al total:
main.groups$percent <- main.groups$total_produccion / value
Gráfico circular:
bp <- ggplot(main.groups, aes(x = "", y = percent, fill = Grupo)) +
geom_bar(width = 1, stat = "identity")
pie <- bp + coord_polar("y", start = 0)
pie
El grupo “Tubérculos y plátanos” concentra cerca del 67 % de la
producción de los cuatro grupos principales de Guaviare, seguido por los
cereales (24 %). Los frutales (6 %) y otros permanentes (3,5 %) tienen
un peso mucho menor.
new_eva %>%
group_by(Grupo, MUNICIPIO) %>%
summarize(total_prod = sum(Produccion, na.rm = TRUE), .groups = "drop_last") %>%
slice(which.max(total_prod)) %>%
arrange(desc(total_prod))
Guarda el objeto:
new_eva %>%
group_by(Grupo, MUNICIPIO) %>%
summarize(total_prod = sum(Produccion, na.rm = TRUE), .groups = "drop_last") %>%
slice(which.max(total_prod)) -> leaders
leaders
Filtra los líderes más importantes (más de 5.000 toneladas):
leaders %>%
filter(total_prod > 5000) -> main.leaders
Y grafícalos. Aquí un municipio puede aparecer varias veces (lidera más de un grupo), así que coloreamos por grupo para distinguirlos:
ggplot(data = main.leaders, aes(x = MUNICIPIO, y = total_prod, fill = Grupo)) +
geom_bar(stat = "identity", position = "dodge") +
labs(y = "Producción acumulada (t)", x = NULL)
San José del Guaviare lidera los dos grupos de mayor producción: tubérculos y plátanos (cerca de 236.000 t) y cereales (cerca de 99.000 t). El Retorno lidera frutales y otros permanentes, con volúmenes bastante menores (22.000 t y 11.000 t).
El cultivo de referencia en el cuaderno original era el plátano en Tame (Arauca). En Guaviare, el plátano es el cultivo con mayor producción acumulada, y el municipio líder es San José del Guaviare:
new_eva %>%
filter(MUNICIPIO == "SAN JOSE DEL GUAVIARE" & CULTIVO == "PLATANO") %>%
group_by(Year, CULTIVO) %>%
dplyr::select(MUNICIPIO, CULTIVO, Produccion, Year) -> SJG_platano
SJG_platano
Gráfico rápido de la producción para todo el período:
g <- ggplot(aes(x = Year, y = Produccion / 1000), data = SJG_platano) +
geom_bar(stat = "identity", fill = "#1b4332") +
scale_x_continuous(breaks = unique(SJG_platano$Year)) +
labs(y = "Producción de plátano [t x 1000]")
Añade un título y visualiza:
g +
ggtitle("Evolución de la producción de plátano en San José del Guaviare") +
labs(caption = "Basado en datos EVA (Minagricultura)")
La producción de plátano en San José del Guaviare fluctúa entre 8.500 y 14.500 t durante 2007-2015, sin una tendencia clara. A partir de 2016 aumenta de forma marcada y llega a cerca de 22.000 t en 2018, más del doble que en 2011.
Para ir más allá del cuaderno de referencia, aquí van un análisis con otras variables.
Rendimiento del plátano (producción / área cosechada):
new_eva %>%
filter(MUNICIPIO == "SAN JOSE DEL GUAVIARE", CULTIVO == "PLATANO",
AreaCosechada > 0) %>%
mutate(Rend_calc = Produccion / AreaCosechada) %>%
ggplot(aes(x = Year, y = Rend_calc)) +
geom_line(color = "#2d6a4f") +
geom_point(color = "#2d6a4f") +
labs(y = "Rendimiento [t/ha]", title = "Rendimiento del plátano en San José del Guaviare")
El rendimiento baja de 10,4 t/ha en 2008 a 4,4 t/ha en 2011, se mantiene bajo hasta 2013 y luego sube hasta 12 t/ha entre 2016 y 2018. El aumento de producción desde 2016 se debe entonces a un mayor rendimiento por hectárea, no a más área cosechada.
sessionInfo()
## R version 4.6.1 (2026-06-24 ucrt)
## Platform: x86_64-w64-mingw32/x64
## Running under: Windows 11 x64 (build 26200)
##
## Matrix products: default
## LAPACK version 3.12.1
##
## locale:
## [1] LC_COLLATE=Spanish_Colombia.utf8 LC_CTYPE=Spanish_Colombia.utf8
## [3] LC_MONETARY=Spanish_Colombia.utf8 LC_NUMERIC=C
## [5] LC_TIME=Spanish_Colombia.utf8
##
## time zone: America/Bogota
## tzcode source: internal
##
## attached base packages:
## [1] stats graphics grDevices utils datasets methods base
##
## other attached packages:
## [1] lubridate_1.9.5 forcats_1.0.1 stringr_1.6.0 dplyr_1.2.1
## [5] purrr_1.2.2 readr_2.2.0 tidyr_1.3.2 tibble_3.3.1
## [9] ggplot2_4.0.3 tidyverse_2.0.0
##
## loaded via a namespace (and not attached):
## [1] bit_4.6.0 gtable_0.3.6 jsonlite_2.0.0 crayon_1.5.3
## [5] compiler_4.6.1 tidyselect_1.2.1 parallel_4.6.1 jquerylib_0.1.4
## [9] scales_1.4.0 yaml_2.3.12 fastmap_1.2.0 R6_2.6.1
## [13] labeling_0.4.3 generics_0.1.4 knitr_1.52 bslib_0.12.0
## [17] pillar_1.11.1 RColorBrewer_1.1-3 tzdb_0.5.0 rlang_1.3.0
## [21] stringi_1.8.9 cachem_1.1.0 xfun_0.62 sass_0.4.10
## [25] S7_0.2.2 bit64_4.8.6 otel_0.2.0 timechange_0.4.0
## [29] cli_3.6.6 withr_3.0.3 magrittr_2.0.5 digest_0.6.39
## [33] grid_4.6.1 vroom_1.7.1 rstudioapi_0.19.0 hms_1.1.4
## [37] lifecycle_1.0.5 vctrs_0.7.3 evaluate_1.0.5 glue_1.8.1
## [41] farver_2.1.2 rmarkdown_2.32 tools_4.6.1 pkgconfig_2.0.3
## [45] htmltools_0.5.9