1. Introducción

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.

2. Configuración

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

3. Descarga del conjunto de datos EVA

  1. Entra a https://www.datos.gov.co/Agricultura-y-Desarrollo-Rural/Evaluaciones-Agropecuarias-Municipales-EVA/2pnw-mmge/data.
  2. Aplica un filtro para dejar solo tu departamento (Guaviare).
  3. Exporta en formato CSV.
  4. Busca el archivo en la carpeta de descargas y muévelo a la carpeta datos dentro de tu directorio de trabajo.

Tu archivo ya está descargado: Evaluaciones_Agropecuarias_Municipales_EVA_20261027.csv.

4. Lectura del conjunto de datos

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"

5. Limpieza del conjunto de datos

5.1 Seleccionar columnas

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.

5.2 Renombrar columnas

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

5.3 Convertir a números

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

6. Análisis de datos

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.

6.1 Los grupos de cultivos más importantes (2006-2018)

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.

6.2 Municipios líderes en cada grupo de cultivos

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

6.3 Dinámica de un cultivo importante (2006-2018)

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.

7. Análisis y gráficos adicionales

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.

8. Bibliografía

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