En este cuaderno se mostrará como obtener estadísticas multianuales para un grupo determinado de cultivos en el departamento de cundinamarca. Utilizaremos como fuente principal de datos las Evaluaciones Agropecuarias Municipales (EVA), un conjunto de datos agrícolas de 2007-2018 proporcionado por el Ministerio de Agricultura y Desarrollo Rural.
Luego, instalaremos y cargaremos las bibliotecas R necesarias que son: tidyverse readr ggplot2 dplyr
library(tidyverse)
## ── Attaching core tidyverse packages ──────────────────────── tidyverse 2.0.0 ──
## ✔ dplyr 1.1.3 ✔ readr 2.1.4
## ✔ forcats 1.0.0 ✔ stringr 1.5.0
## ✔ ggplot2 3.4.3 ✔ tibble 3.2.1
## ✔ lubridate 1.9.3 ✔ tidyr 1.3.0
## ✔ purrr 1.0.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(readr)
library(ggplot2)
library(dplyr)
Ingresaremos al siguiente link: https://www.datos.gov.co/Agricultura-y-Desarrollo-Rural/Evaluaciones-Agropecuarias-Municipales-EVA/2pnw-mmge/data para encontrar el conjunto de datos.
En el sitio web vinculado (datos.gov.co), visualizamos los datos y aplicamos un filtro para obtener solo los datos correspondientes del departamento de Cundinamarca. Luego, exportamos los datos en formato csv.
Ahora, dirígete al directorio de descargas para encontrar el archivo Evaluaciones_Agropecuarias_Municipales_EVA.csv. Muévalo a su directorio de trabajo.
list.files()
## [1] "ciudadesco.csv" "CuadernoEVA.nb.html"
## [3] "CuadernoEVA.Rmd" "Cuadernoeva_cundi.html"
## [5] "Cuadernoeva_cundi.Rmd" "EVA_19_22.xlsx"
## [7] "EVA_CUNDI.csv" "Imagen1.png"
## [9] "imagen2.png" "imagen3.png"
## [11] "MGN_MPIO_POLITICO.cpg" "MGN_MPIO_POLITICO.dbf"
## [13] "MGN_MPIO_POLITICO.prj" "MGN_MPIO_POLITICO.sbn"
## [15] "MGN_MPIO_POLITICO.sbx" "MGN_MPIO_POLITICO.shp"
## [17] "MGN_MPIO_POLITICO.shp.xml" "MGN_MPIO_POLITICO.shx"
## [19] "MGN2021_MPIO_POLITICO.rar" "Tolima_Algodon.csv"
## [21] "Tolima_dep.gpkg" "tolima_mun.gpkg"
(eva = read_csv ("EVA_CUNDI.csv", col_names = TRUE,
show_col_types = TRUE))
## Rows: 17805 Columns: 17
## ── Column specification ────────────────────────────────────────────────────────
## Delimiter: ","
## chr (10): DEPARTAMENTO, MUNICIPIO, GRUPO
## DE CULTIVO, SUBGRUPO
## DE CULTIVO, ...
## dbl (7): CÓD.
## DEP., CÓD. MUN., AÑO, Área Sembrada
## (ha), Área Cosechada
## (ha...
##
## ℹ Use `spec()` to retrieve the full column specification for this data.
## ℹ Specify the column types or set `show_col_types = FALSE` to quiet this message.
eva=as.data.frame(eva)
-Vea la tabla y confirme que contenga estadísticas agrícolas para diferentes años. ¿Puede decir cuál es el período de tiempo para estos datos? Es muy importante saber cuáles son los nombres que “ve” el software. Puede ser diferente de lo que vemos. Averigüemoslo:
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"
-Seleccione algunos atributos para limpiar el objeto eva:
# comprobar la salida del objeto en el último fragmento y
# cambiar los nombres de los atributos según sus propios datos
eva %>% dplyr::select('DEPARTAMENTO':'ESTADO FISICO PRODUCCION') -> eva.tmp
eva.tmp
-Verifique el resultado y asegurese que solo se seleccionaron las columnas relevantes. Ahora, cambie los nombres de varias columnas que contengan caracteres vacíos o “ruidosos”:
# asegúrese de utilizar los nombres de las columnas que están en su objeto eva.tmp
eva.tmp %>% dplyr::rename('Departamento'= 'DEPARTAMENTO','Cod_Mun' = 'CÓD. MUN.',
'Municipio'='MUNICIPIO',
'Grupo' = 'GRUPO \nDE CULTIVO',
'Subgrupo' = 'SUBGRUPO \nDE CULTIVO',
'Cultivo'='CULTIVO',
'Year' = 'AÑO',
'Periodo'='PERIODO',
'AreaSembrada' = 'Área Sembrada\n(ha)',
'AreaCosechada' = 'Área Sembrada\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
-Compruebe el resultado:
new_eva
-Consulte la tabla anterior y verifique 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 se pueden abordar utilizando el paradigma dividir-aplicar-combinar: dividir los datos en grupos, aplicar algúnanálisis a cada grupo y luego combinar los resultados. La biblioteca dplyr hace que esto sea muy fácil 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 resume() para colapsar cada grupo en un resumen de una sola fila. resume() hace esto aplicando una función de agregación o resumen a cada grupo.
Por ejemplo, si se quiere saber la producción total por grupo de cultivos, tecleamos:
new_eva %>%
group_by (Grupo, Municipio,Departamento)%>%
summarize(total_produccion = sum(Produccion)) %>%
arrange(desc(total_produccion))
## `summarise()` has grouped output by 'Grupo', 'Municipio'. You can override
## using the `.groups` argument.
-Nótese que la producción total contiene la suma de la producción de cada grupo de cultivos entre 2007 y 2018. En el Tolima, el cultivo de mayor producción fue “Cereales”. -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 > 1000000) -> main.groups
-Para conocer la producción total de los principales grupos de cultivos:
(value = sum(main.groups$total_produccion))
## [1] 28112605
-Para agregar un nuevo atributo con porcentaje de la producción total:
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, col="red", fill=Grupo))+
geom_bar(width = 1, stat = "identity", col="black")
# Piechart
pie <- bp + coord_polar("y", start=0)
pie
-Para conocer los municipios que lideraron la producción de cada cultivo de 2007 a 2018:
new_eva %>%
group_by(Grupo, Municipio, Departamento) %>%
summarize(total_prod = sum(Produccion, na.rm = TRUE)) %>%
slice(which.max(total_prod)) %>%
arrange(desc(total_prod))
## `summarise()` has grouped output by 'Grupo', 'Municipio'. You can override
## using the `.groups` argument.
-Para guardar el objeto:
new_eva %>%
group_by(Grupo,Municipio, Departamento) %>%
summarize(total_prod = sum(Produccion, na.rm = TRUE)) %>%
slice(which.max(total_prod)) -> leaders
## `summarise()` has grouped output by 'Grupo', 'Municipio'. You can override
## using the `.groups` argument.
leaders
-Para filtrar los municipios más importantes desde el punto de vista agrícola:
leaders %>%
filter(total_prod > 1000000) -> main.leaders
-Dibujemos a los líderes filtradas:
# Diagrama de barras básico
p<-ggplot(data=main.leaders, aes(x=Municipio, y=total_prod,fill=Municipio), options(scipen=999)) +
geom_bar(stat="identity")
p
new_eva %>%
filter(Municipio=="VILLAPINZON" & Cultivo=="PAPA") %>%
group_by(Year, Cultivo) %>%
select(Municipio, Cultivo, Produccion, Year) -> VILLAPINZON_PAPA
-Comprobemos el resultado:
VILLAPINZON_PAPA
-Hagamos un gráfico rápido de la producción de papa en villapinzon durante todo el período cubierto por el conjunto de datos de EVA:
g <- ggplot(aes(x=Year, y=Produccion/1000, fill=Year), data = VILLAPINZON_PAPA) + geom_bar(stat='identity') + labs(y='Produccion de papa [Ton x 1000]')
-Añada un titulo y visualice:
g + ggtitle("Evolución de la producción del cultivo de Papa en Villapinzón de 2007 a 2018") + labs(caption= "Basado en datos de EVA (Minagricultura, 2020)")
-Ahora vamos a analisar los datos de rendimiento en el departamento de CUNDINAMARCA
eva.tmp%>% dplyr::select('DEPARTAMENTO', 'MUNICIPIO','GRUPO \nDE CULTIVO', 'CULTIVO', 'Área Sembrada\n(ha)', 'Área Cosechada\n(ha)', 'Producción\n(t)','Rendimiento\n(t/ha)','ESTADO FISICO PRODUCCION') -> eva1.tmp
eva1.tmp
-Verifiquemos si el resultado que solo selecciono las columnas relevantes.
-Ahora, mos los nombres de varias columnas que contengan caracteres vacíos o “ruidosos”:
eva.tmp%>% dplyr::rename('Grupo' = 'GRUPO \nDE CULTIVO',
'Cultivo' = 'CULTIVO',
'Departamento' = 'DEPARTAMENTO',
'Municipio'="MUNICIPIO",
'AreaSembrada(ha)' = 'Área Sembrada\n(ha)',
'AreaCosechada(ha)' = 'Área Sembrada\n(ha)',
'Produccion(t)' = 'Producción\n(t)', 'Rendimiento(t/ha)' ='Rendimiento\n(t/ha)',
'Estado' = 'ESTADO FISICO PRODUCCION') -> new_eva1
-Comprobamos la salida:
new_eva1
Muchas tareas de análisis de datos se pueden abordar 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 hace que esto sea muy fácil 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 resume() para colapsar cada grupo en un resumen de una sola fila. resume() hace esto aplicando una función de agregación o resumen a cada grupo.
Por ejemplo, si queremos saber el rendimeinto total por grupo de cultivos, escribimos:
new_eva1 %>%
rename(Rendimiento ="Rendimiento(t/ha)")%>%
filter(Rendimiento>10) %>%
group_by(Grupo,Municipio,Departamento) %>%
summarize(total_rendimiento = sum(Rendimiento))%>%
arrange(desc(total_rendimiento))
## `summarise()` has grouped output by 'Grupo', 'Municipio'. You can override
## using the `.groups` argument.
-Nótemos que el rendimiento total contiene la suma de los rendimientos de cada grupo de cultivos entre 2007 y 2018, en Cundinamarca. -Ahora guardaremos el rendimiento total en un objeto:
new_eva %>%
group_by(Grupo,Municipio, Departamento) %>%
summarize(total_rendimiento = sum(Rendimiento)) -> PT
## `summarise()` has grouped output by 'Grupo', 'Municipio'. You can override
## using the `.groups` argument.
-Para filtraremos los cultivos más importantes
PT %>%
filter(total_rendimiento > 1000) -> main.groups
-Conoceremos el rendimiento total de los principales grupos de cultivos
(value = sum(main.groups$total_rendimiento))
## [1] 52054.77
-Para agregar un nuevo atributo con porcentaje del rendimiento total:
main.groups$percent = main.groups$total_rendimiento/value
-Para crear un gráfico circular del rendimiento total de main.group
library(ggplot2)
# Barplot
bp<- main.groups %>% group_by(Grupo)%>% ggplot(aes(x="", y= percent, fill=Grupo))+
geom_bar (width = 1, stat = "identity")+
coord_polar(theta="y")
bp
-Para conocer los municipios que lideraron el rendimiento de cada cultivo de 2007 a 2018:
new_eva %>%
group_by(Grupo, Municipio) %>%
summarize(total_rendimiento = sum(Rendimiento, na.rm = TRUE)) %>%
slice(which.max(total_rendimiento)) %>%
arrange(desc(total_rendimiento))
## `summarise()` has grouped output by 'Grupo'. You can override using the
## `.groups` argument.
-Para guardar el objeto:
new_eva %>%
group_by(Grupo, Municipio) %>%
summarize(total_Rendimiento = sum(Rendimiento, na.rm = TRUE)) %>%
slice(which.max(total_Rendimiento)) -> leaders1
## `summarise()` has grouped output by 'Grupo'. You can override using the
## `.groups` argument.
leaders1
-Para filtrar los municipios más importantes desde el punto de vista agrícola
leaders1 %>%
filter(total_Rendimiento > 500) -> main.leaders
-Dibujemos a las líderes filtradas:
p<-ggplot(data=main.leaders, aes(x=Municipio, y=total_Rendimiento, fill=Municipio)) +
geom_bar(stat="identity")
p
### 1.3 Dinámica de un cultivo importante entre 2007 y 2018
new_eva %>%
filter(Municipio=="COTA" & Cultivo=="PAPA") %>%
group_by(Year, Cultivo) %>%
select(Municipio, Cultivo,Departamento, Rendimiento, Year) -> cota_potato
cota_potato
-Hagamos un gráfico rápido del rendimiento de papa en sachica durante todo el período cubierto por el conjunto de datos de EVA:
g <- ggplot(aes(x=Year, y=Rendimiento, fill=Year), data = cota_potato) + geom_bar(stat='identity') + labs(y='Rendimiento de papa [Ton x 1000]')
-Añadimos un título y visualizamos:
g + ggtitle("Evolution of potato Crop in cota from 2007 to 2018") + labs(caption= "Based on EVA data (Minagricultura, 2020)")
## BIBLIOGRAFÍA Lizarazo, I., 2022. Understanding dynamic productivity
of crops. Available at https://rpubs.com/ials2un/production_dyn_v1.
sessionInfo()
## R version 4.3.1 (2023-06-16 ucrt)
## Platform: x86_64-w64-mingw32/x64 (64-bit)
## Running under: Windows 11 x64 (build 22621)
##
## Matrix products: default
##
##
## locale:
## [1] LC_COLLATE=Spanish_Mexico.utf8 LC_CTYPE=Spanish_Mexico.utf8
## [3] LC_MONETARY=Spanish_Mexico.utf8 LC_NUMERIC=C
## [5] LC_TIME=Spanish_Mexico.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.3 forcats_1.0.0 stringr_1.5.0 dplyr_1.1.3
## [5] purrr_1.0.2 readr_2.1.4 tidyr_1.3.0 tibble_3.2.1
## [9] ggplot2_3.4.3 tidyverse_2.0.0
##
## loaded via a namespace (and not attached):
## [1] bit_4.0.5 gtable_0.3.4 jsonlite_1.8.7 crayon_1.5.2
## [5] compiler_4.3.1 tidyselect_1.2.0 parallel_4.3.1 jquerylib_0.1.4
## [9] scales_1.2.1 yaml_2.3.7 fastmap_1.1.1 R6_2.5.1
## [13] labeling_0.4.3 generics_0.1.3 knitr_1.44 munsell_0.5.0
## [17] bslib_0.5.1 pillar_1.9.0 tzdb_0.4.0 rlang_1.1.1
## [21] utf8_1.2.3 stringi_1.7.12 cachem_1.0.8 xfun_0.40
## [25] sass_0.4.7 bit64_4.0.5 timechange_0.2.0 cli_3.6.1
## [29] withr_2.5.1 magrittr_2.0.3 digest_0.6.33 grid_4.3.1
## [33] vroom_1.6.4 rstudioapi_0.15.0 hms_1.1.3 lifecycle_1.0.3
## [37] vctrs_0.6.3 evaluate_0.22 glue_1.6.2 farver_2.1.1
## [41] fansi_1.0.4 colorspace_2.1-0 rmarkdown_2.25 tools_4.3.1
## [45] pkgconfig_2.0.3 htmltools_0.5.6