1. Introducción

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.

2. Configuración

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)

3. Descarga el conjunto de datos EVA plurianual de tu departamento

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.

3. Lea el conjunto de datos EVA

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"

4. Limpiar el conjunto de datos EVA

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).

5. Análisis de datos

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.

5.1 Los cultivos más importantes entre 2019 y 2025

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

5.3 Evolución de un cultivo importante entre 2019 y 2025

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)")

6. Análisis adicionales y gráficos

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.

7. Bibliografía

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