Este es el tercer cuaderno de R Markdown para el curso de Geomática Básica 2022. En él se muestra cómo obtener estadísticas de varios años para un grupo determinado de cultivos en cualquier departamento. Utilizaremos como fuente principal de datos las Evaluaciones Agropecuarias Municipales (EVA), un conjunto de datos agrícolas de 2019 a 2025 proporcionado por el Ministerio de Agricultura y Desarrollo Rural.
En este paso, instalaremos y cargaremos las bibliotecas de R necesarias.
#run the following lines from the command line:
#install.packages('tidyverse')
#install.packages('dplyr')
#install.packages('readxl')
#install.packages('sf')
library(tidyverse)
## ── 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
library(dplyr)
library(readr)
library(ggplot2)
Ve a (https://upra.gov.co/sites/default/files/2026-05/20260526_BaseAgricola20192025.xlsx) para encontrar el conjunto de datos.
En el sitio web vinculado (es decir, upra.gov.co), descargara los datos automaticamente y debe guardarlos en formato CSV(delimitado por comas) .
Ahora, vaya al directorio de descargas para localizar el archivo 20260526_BaseAgricola20192025.CSV. Muévalo a su directorio de trabajo y cambiele el nombre por Evaluaciones_Agropecuarias_Municipales_EVA.csv.
list.files("./datos", pattern=c('csv'))
## [1] "Evaluaciones_Agropecuarias_Municipales_EVA.csv"
Ahora, pasemos a leer el conjunto de datos EVA de 2019 a 2025:
# Importar y visualizar la base de datos EVA
(eva <- read_csv(
"./datos/Evaluaciones_Agropecuarias_Municipales_EVA.csv",
col_names = TRUE,
locale = locale(encoding = "Windows-1252"),
name_repair = "minimal",
show_col_types = FALSE
))
# Limpiar nombres de las columnas
names(eva) <- trimws(names(eva))
Revisa la tabla y confirma que contenga estadísticas agrícolas de diferentes años. ¿Puedes decir cuál es el período de tiempo al que corresponden estos datos?
Es muy importante saber cuáles son los nombres que el software “ve”. Pueden ser diferentes de los que vemos nosotros. Averigüémoslo:
names(eva)
## [1] "CÓD. DEP."
## [2] "DEPARTAME"
## [3] "CÓD. MUN."
## [4] "MUNICIPIO"
## [5] "DESAGREGACIÓN REGIONAL Y/O SISTEMA PRODUCTIVO"
## [6] "CULTIVO"
## [7] "CICLO DE CULTIVO"
## [8] "GRUPO DE CULTIVO"
## [9] "SUBGRUPO DE CULTIVO"
## [10] "AÑO"
## [11] "PERIODO"
## [12] "Área sembrada (ha)"
## [13] "Área cosechada (ha)"
## [14] "Producción (t)"
## [15] "Rendimiento (t/ha)"
## [16] "NOMBRE CIENTIFICO"
## [17] "ESTADO FISICO PRODUCCION"
Seleccionemos algunos atributos para limpiar el objeto eva:
# seleccionamos los datos de La Guajira
(eva1 = dplyr::filter(eva, eva$DEPARTAME == "La Guajira"))
# revisa la salida del objeto en el último fragmento y cambia los nombres de los atributos según tus propios datos
eva1 %>% dplyr::select('CÓD. MUN.':'ESTADO FISICO PRODUCCION') -> eva.tmp
eva.tmp
Revisa el resultado y verifica que solo se hayan seleccionado las columnas pertinentes.
Ahora, cambia los nombres de varias columnas que contengan caracteres vacíos o «ruido»:
# Asegúrate de usar los nombres de columna que aparecen en tu objeto eva.tmp
new_eva <- eva.tmp %>%
rename(
Grupo = `GRUPO DE CULTIVO`,
Subgrupo = `SUBGRUPO DE CULTIVO`,
Year = `AÑO`,
AreaSembrada = `Área sembrada (ha)`,
AreaCosechada = `Área cosechada (ha)`,
Produccion = `Producción (t)`,
Rendimiento = `Rendimiento (t/ha)`,
Sistema = `DESAGREGACIÓN REGIONAL Y/O SISTEMA PRODUCTIVO`,
Estado = `ESTADO FISICO PRODUCCION`
) %>%
mutate(
Produccion = as.numeric(Produccion)
)
Veamos el resultado:
new_eva
Revisa la tabla anterior y verifica que los atributos cuantitativos se almacenen como tipos de datos numéricos (no como tipos de datos de cadena).
Muchas tareas de análisis de datos pueden abordarse utilizando el paradigma «dividir-aplicar-combinar»: dividir los datos en grupos, aplicar algún análisis a cada grupo y, luego, combinar los resultados.
La biblioteca dplyr facilita mucho esto mediante el uso de la función group_by(), que divide los datos en grupos. Cuando los datos se agrupan de esta manera, se puede utilizar summarize() para condensar cada grupo en un resumen de una sola fila. summarize() lo hace aplicando una función de agregación o resumen a cada grupo.
Por ejemplo, si queremos averiguar la producción total por grupo de cultivos, escribimos:
new_eva %>%
##filter(Produccion > 0) %>%
group_by(Grupo) %>%
summarize(total_produccion = sum(Produccion)) %>%
arrange(desc(total_produccion))
Ten en cuenta que la producción total incluye la suma de la producción de cada grupo de cultivos entre 2019 y 2025. En La Guajira, los dos cultivos con mayor producción fueron «Frutales» y «Tubérculos junto a raíces y tubérculos».
Para guardar la producción total en un objeto:
new_eva %>%
group_by(Grupo) %>%
summarize(total_produccion = sum(Produccion)) -> PT
Para filtrar los cultivos más importantes:
PT %>%
filter(total_produccion > 100000) -> main.groups
Para conocer la producción total de los principales grupos de cultivos:
(value = sum(main.groups$total_produccion))
## [1] 1284263
Para agregar un nuevo atributo con el porcentaje del total de producción:
main.groups$percent = main.groups$total_produccion/value
Para crear un gráfico circular de la producción total de los grupos principales:
library(ggplot2)
# Barplot
bp<- ggplot(main.groups, aes(x="", y=percent, fill=Grupo))+
geom_bar(width = 1, stat = "identity")
# Piechart
pie <- bp + coord_polar("y", start=0)
pie
Producción por cada grupo de cultivos:
Para conocer los municipios que lideraron la producción de cada cultivo entre 2019 y 2025:
new_eva %>%
group_by(Grupo, MUNICIPIO) %>%
summarize(total_prod = sum(Produccion, na.rm = TRUE)) %>%
slice(which.max(total_prod)) %>%
arrange(desc(total_prod))
## `summarise()` has regrouped the output.
## ℹ Summaries were computed grouped by Grupo and MUNICIPIO.
## ℹ Output is grouped by Grupo.
## ℹ Use `summarise(.groups = "drop_last")` to silence this message.
## ℹ Use `summarise(.by = c(Grupo, MUNICIPIO))` for per-operation grouping
## (`?dplyr::dplyr_by`) instead.
Para guardar el objeto:
leaders <- new_eva %>%
group_by(Grupo, MUNICIPIO) %>%
summarize(
total_prod = sum(Produccion, na.rm = TRUE),
.groups = "drop"
) %>%
group_by(Grupo) %>%
slice_max(order_by = total_prod, n = 1, with_ties = TRUE) %>%
ungroup() %>%
arrange(desc(total_prod))
## `summarise()` has grouped output by 'Grupo'. You can override using the `.groups` argument.
leaders
Para seleccionar los municipios más importantes desde el punto de vista agrícola:
leaders %>%
filter(total_prod > 5000) -> main.leaders
Trazemos un gráfico con los líderes filtrados:
# Basic barplot
p<-ggplot(data=main.leaders, aes(x=MUNICIPIO, y=total_prod)) +
geom_bar(stat="identity")
p
new_eva %>%
filter(MUNICIPIO=="Riohacha" & CULTIVO=="Banano") %>%
group_by(Year, CULTIVO) %>%
select(MUNICIPIO, CULTIVO, Produccion, Year) -> Riohacha_Banano
Veamos el resultado:
Riohacha_Banano
Hagamos un gráfico rápido de la producción de banano en Riohacha para todo el período que abarca el conjunto de datos de EVA:
g <- ggplot(aes(x=Year, y=Produccion/1000), data = Riohacha_Banano) + geom_bar(stat='identity') + labs(y='Produccion de banano [Ton x 1000]')
Agrega un título y visualiza:
g + ggtitle("Evolucion del cultivo de banano en Riohacha de 2019 hasta 2025") + labs(caption= "Based on EVA data (Minagricultura, 2026)")
He mostrado algunos ejemplos de análisis. Podrías analizar otras variables además de la producción (por ejemplo, rendimiento, área cosechada, área sembrada).
En este cuaderno encontrarás más ejemplos de análisis.
En tu cuaderno, cita este trabajo como: Lizarazo, I., 2022. Comprensión de la productividad dinámica de los cultivos. Disponible en https://rpubs.com/ials2un/production_dyn_v1.
sessionInfo()
## R version 4.6.2 (2026-10-29 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.2 tidyselect_1.2.1 parallel_4.6.2 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.2 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.2 pkgconfig_2.0.3
## [45] htmltools_0.5.9