1. introducción

En este tercer cuaderno de R Markdown del curso de Geomática Básica 2026 analizaremos las estadisticas de varios años para un grupo determinado de cultivos en el departamento del meta.
Utilizaremos como fuente principal de datos las Evaluaciones Agropecuarias Municipales (EVA), un conjunto de datos agrícolas del periodo 2007-2018 proporcionado por el Ministerio de Agricultura y Desarrollo Rural.

2. Configuración

En este paso, instalaremos y cargaremos las bibliotecas de R necesarias.

library(dplyr)
## 
## Adjuntando el paquete: 'dplyr'
## The following objects are masked from 'package:stats':
## 
##     filter, lag
## The following objects are masked from 'package:base':
## 
##     intersect, setdiff, setequal, union
library(readxl)
library(sf)
## Linking to GEOS 3.14.1, GDAL 3.12.1, PROJ 9.7.1; sf_use_s2() is TRUE

3.Descargamos el conjunto de datos multianual de las EVA para el departamento del Meta

Ingresamos a Evaluaciones Agropecuarias Municipales (EVA) para encontrar el conjunto de datos.

En el sitio web enlazado (datos.gov.co), visualiza los datos y aplica un filtro para obtener únicamente la información correspondiente al departamento del Meta. Luego, exporta los datos en formato CSV.

Ahora, dirígete a la carpeta de descargas para localizar el archivo Evaluaciones_Agropecuarias_Municipales_EVA.csv. Muévelo a tu directorio de trabajo.

3. Leer el conjunto de datos de las EVA

list.files("./datos", pattern = "csv")
## [1] "Evaluaciones_Agropecuarias_Municipales_EVA_20261022.csv"
library(readr)

eva <- read_csv(
  "./datos/Evaluaciones_Agropecuarias_Municipales_EVA_20261022.csv",
  show_col_types = FALSE
)
eva <- read_csv(
  "C:/Users/juane/OneDrive/Documentos/datos/Evaluaciones_Agropecuarias_Municipales_EVA_20261022.csv",
  col_names = TRUE,
  show_col_types = FALSE
)
head(eva)

Observa la tabla y confirma que contiene estadísticas agrícolas de diferentes años. ¿Puedes decir cuál es el período de tiempo que abarcan estos datos?nnEs muy importante conocer los nombres que reconoce el programa. Estos pueden ser diferentes de los que nosotros vemos. Vamos a averiguarlo:

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"

Limpiar el conjunto de datos EVA

Seleccionemos algunos atributos para limpiar el objeto eva.

library(dplyr)

eva %>%
  dplyr::select('CÓD. MUN.':'ESTADO FISICO PRODUCCION') -> eva.tmp

eva.tmp

Ahora, cambia los nombres de varias columnas que contienen caracteres vacíos o «ruidosos» (caracteres que pueden dificultar su uso en el código).

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)`,
    Produccion = `Producción\n(t)`,
    Rendimiento = `Rendimiento\n(t/ha)`,
    Sistema = `DESAGREGACIÓN REGIONAL Y/O SISTEMA PRODUCTIVO`,
    Estado = `ESTADO FISICO PRODUCCION`
  ) -> new_eva

new_eva$Produccion <- as.numeric(new_eva$Produccion)
## Warning: NAs introducidos por coerción
new_eva

Revisa la tabla anterior y verifica que los atributos cuantitativos estén almacenados como tipos de datos numéricos y no como cadenas de texto.

Análisis de datos

Muchas tareas de análisis de datos se pueden abordar mediante el paradigma dividir-aplicar-combinar: dividir los datos en grupos, aplicar un análisis a cada grupo y, finalmente, combinar los resultados.

La biblioteca dplyr facilita mucho este proceso mediante la función group_by(), que divide los datos en grupos. Cuando los datos están agrupados de esta manera, se puede utilizar summarize() para resumir cada grupo en una sola fila. Esta función lo hace aplicando una función de agregación o resumen a cada grupo. # 5.1 Los cultivos más importantes entre 2007 y 2018 La producción total corresponde a la suma de la producción registrada para cada grupo de cultivos en el departamento del Meta durante el período de 2007 a 2018. A partir de estos datos, identificaremos los grupos de cultivos que tienen la mayor producción total.

new_eva %>%
  group_by(Grupo) %>%
  summarize(
    total_produccion = sum(Produccion, na.rm = TRUE)
  ) %>%
  arrange(desc(total_produccion))
new_eva$Produccion <- as.numeric(new_eva$Produccion)
sum(is.na(new_eva$Produccion))
## [1] 3
new_eva %>%
  filter(is.na(Produccion))
new_eva %>%
  group_by(Grupo) %>%
  summarize(total_produccion = sum(Produccion, na.rm = TRUE)) %>%
  arrange(desc(total_produccion))

la producción total corresponde a la suma de la producción de cada grupo de cultivos entre 2007 y 2018. En Meta, los dos grupos de cultivos con mayor producción fueron «Frutales» y «Tubérculos y cereales».

Para guardar la producción total en un objeto:

new_eva %>%
  group_by(Grupo) %>%
  summarize(total_produccion = sum(Produccion, na.rm = TRUE)) -> PT

PT

Para filtrar los cultivos más importantes.

PT %>%
  arrange(desc(total_produccion))
PT %>%
  filter(total_produccion > 100000) -> main.groups

main.groups

Para conocer la producción total de los principales grupos de cultivos:

(value = sum(main.groups$total_produccion))
## [1] 733830.5

Este paso permite calcular qué proporción de la producción total de los principales grupos de cultivos del Meta corresponde a cada grupo seleccionado.

main.groups$percent = main.groups$total_produccion/value
library(ggplot2)

Para crear un gráfico circular de la producción total de los principales grupos de cultivos del Meta:

library(ggplot2)

# Gráfico de barras
bp <- ggplot(main.groups, aes(x = "", y = percent, fill = Grupo)) +
  geom_bar(width = 1, stat = "identity")

# Gráfico circular
pie <- bp + coord_polar("y", start = 0)

pie

#5.2. Municipios con mayor producción para cada grupo de cultivos Primero, vamos a identificar los municipios del Meta que registran la mayor producción agrícola para cada grupo de cultivos durante el período de 2007 a 2018.

Para identificar los municipios que lideran la producción de cada grupo de cultivos entre 2007 y 2018:

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:

new_eva %>%
  group_by(Grupo, MUNICIPIO) %>%
  summarize(total_prod = sum(Produccion, na.rm = TRUE)) %>%
  slice(which.max(total_prod)) -> leaders
## `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.
leaders

Para filtrar los municipios más importantes desde el punto de vista agrícola:

leaders %>%
  filter(total_prod > 50000) -> main.leaders

main.leaders
leaders %>%
  arrange(desc(total_prod))

Para filtrar los municipios más importantes desde el punto de vista agrícola en el Meta:

leaders %>%
  filter(total_prod > 10000) -> main.leaders

main.leaders

Para representar gráficamente los municipios líderes que hemos filtrado: El gráfico de barras permitirá comparar la producción de los cuatro municipios seleccionados. Cada barra representa la producción total del grupo de cultivos en el municipio que lidera ese grupo.

# Gráfico de barras básico
p <- ggplot(data = main.leaders, aes(x = MUNICIPIO, y = total_prod)) +
  geom_bar(stat = "identity")

p

5.3. Dinámica de un cultivo importante entre 2007 y 2018

Ahora vamos a estudiar cómo ha cambiado la producción de un cultivo específico a lo largo del tiempo en un municipio del Meta.

new_eva %>%
  group_by(MUNICIPIO, CULTIVO) %>%
  summarize(total_produccion = sum(Produccion, na.rm = TRUE)) %>%
  arrange(desc(total_produccion))
## `summarise()` has regrouped the output.
## ℹ Summaries were computed grouped by MUNICIPIO and CULTIVO.
## ℹ Output is grouped by MUNICIPIO.
## ℹ Use `summarise(.groups = "drop_last")` to silence this message.
## ℹ Use `summarise(.by = c(MUNICIPIO, CULTIVO))` for per-operation grouping
##   (`?dplyr::dplyr_by`) instead.

Esto nos permite identificar un cultivo con producción relevante en el Meta que es el maiz y elegirlo para analizar su evolución entre 2007 y 2018.

new_eva %>%
  filter(MUNICIPIO == "SAN JUAN DE ARAMA" & CULTIVO == "MAIZ") %>%
  group_by(Year, CULTIVO) %>%
  select(MUNICIPIO, CULTIVO, Produccion, Year) -> sanjuan_maiz

Para revisar los resultados:

sanjuan_maiz

Para representar la producción de maíz en San Juan de Arama durante el período cubierto por los datos EVA:

g <- ggplot(data = sanjuan_maiz,
            aes(x = Year, y = Produccion / 1000)) +
  geom_bar(stat = "identity") +
  labs(y = "Producción de maíz [miles de toneladas]")

g

g + ggtitle("Evolución de la producción de maíz en San Juan de Arama, Meta, entre 2007 y 2018") +
  labs(caption = "Fuente: datos EVA de MinAgricultura")

información de tu sesión de R, como la versión de R y los paquetes utilizados:

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_Spain.utf8  LC_CTYPE=Spanish_Spain.utf8   
## [3] LC_MONETARY=Spanish_Spain.utf8 LC_NUMERIC=C                  
## [5] LC_TIME=Spanish_Spain.utf8    
## 
## time zone: America/Bogota
## tzcode source: internal
## 
## attached base packages:
## [1] stats     graphics  grDevices utils     datasets  methods   base     
## 
## other attached packages:
## [1] ggplot2_4.0.3 readr_2.2.0   sf_1.1-3      readxl_1.6.0  dplyr_1.2.1  
## 
## loaded via a namespace (and not attached):
##  [1] sass_0.4.10        generics_0.1.4     class_7.3-23       KernSmooth_2.23-26
##  [5] hms_1.1.4          digest_0.6.39      magrittr_2.0.5     RColorBrewer_1.1-3
##  [9] evaluate_1.0.5     grid_4.6.1         fastmap_1.2.0      cellranger_1.1.0  
## [13] jsonlite_2.0.0     e1071_1.7-17       DBI_1.3.0          scales_1.4.0      
## [17] jquerylib_0.1.4    cli_3.6.6          rlang_1.3.0        crayon_1.5.3      
## [21] units_1.0-1        bit64_4.8.6        withr_3.0.3        cachem_1.1.0      
## [25] yaml_2.3.12        tools_4.6.1        parallel_4.6.1     tzdb_0.5.0        
## [29] vctrs_0.7.3        R6_2.6.1           proxy_0.4-29       lifecycle_1.0.5   
## [33] classInt_0.4-11    bit_4.6.0          vroom_1.7.1        pkgconfig_2.0.3   
## [37] pillar_1.11.1      bslib_0.12.0       gtable_0.3.6       glue_1.8.1        
## [41] Rcpp_1.1.2         xfun_0.61          tibble_3.3.1       tidyselect_1.2.1  
## [45] rstudioapi_0.19.0  knitr_1.52         farver_2.1.2       htmltools_0.5.9   
## [49] labeling_0.4.3     rmarkdown_2.32     compiler_4.6.1     S7_0.2.2