El objetivo de este documento, es practicar algunos ítems aprendidos en la clase de Análisis de Datos Espaciales, en cuanto al manejo del Software R, para lo cual, se hará uso de la base de datos del Censo Arbóreo, levantada en el año 2015 mediante los convenios 095 de 2013 y 049 de 2014 entre la UAO, CVC y DAGMA y en el cual se detallan las características taxonómicas y fitosanitarias de los individuos vegetales de Santiago de Cali (árbol, palma, arbusto, planta arbustiva, bambú).
El análisis de datos se centrará en conocer los individuos vegetales de mayor porte por altura, grosor y densidad de su copa, con el fin de clasificar aquellas especies que aportan al embellecimiento paisajístico, generación de sombra, captura de CO2 y que además pueden llegar a ser considerados patrimonios locales por su importancia.
Para tal fin, primero realizaremos con el cargue de los paquetes a utilziar en el análisis.
## Llamar paquetes
library(openxlsx) #Leer y escribir excel sin java
require(ggplot2) #Hacer graficos bonitos
## Loading required package: ggplot2
library(plotly)
##
## Attaching package: 'plotly'
## The following object is masked from 'package:ggplot2':
##
## last_plot
## The following object is masked from 'package:stats':
##
## filter
## The following object is masked from 'package:graphics':
##
## layout
El censo arbóreo tiene 291 mil registros y 97 variables, lo que lo convierte en una base de datos pesada para el procesamiento, por tal motivo realizaremos un nuevo data frame con solo las variables requeridas en el procesamiento.
#datos a usar: id(chr), barrio(chr), comuna(chr), familia(chr), vegetacion(chr), perimetro(chr*), edad(chr), pb(num), pap(num), altura_fuste(num),
# altura_arbol(num), diametro_copa(num), inclinacion(num), vitalidad(chr), bacteriosis_tronco(chr), ahorcamiento_tronco(chr), quemaduras_tronco(chr)
## Llamar datos
Arboles_Cali <- read.xlsx("D:/Posgrado/1. Primer semestre/1. Clase tratamiento de datos espaciales/Clase 3/Tarea/df_arboles.xlsx")
str(Arboles_Cali)
## 'data.frame': 291090 obs. of 17 variables:
## $ id : chr "0101G11264461" "0101G12259648" "0101G12259649" "0101G12259650" ...
## $ barrio : chr "Terron Colorado" "Terron Colorado" "Terron Colorado" "Terron Colorado" ...
## $ comuna : num 1 1 1 1 1 1 1 1 1 1 ...
## $ familia : chr "Arecaceae" "Fabaceae" "Fabaceae" "Fabaceae" ...
## $ vegetacion : chr "Palma" "Arbol" "Arbol" "Arbol" ...
## $ perimetro : chr "N/A" "N/A" "N/A" "N/A" ...
## $ edad : chr "Juvenil " "Maduro " "Maduro " "Juvenil " ...
## $ pb : num 1.34 1.02 1.28 0.39 0.55 0.72 1.4 0.51 1.3 5.2 ...
## $ pap : num 0 0.74 0 0.29 0.37 0.56 0 0.31 0 0 ...
## $ DAP : num 0.05 0.24 0.19 0.09 0.12 0.18 0.25 0.1 0.26 0.13 ...
## $ altura_arbol : num 1.7 6 7 6 7 6.5 8.5 5.5 9 7 ...
## $ altura_fuste : chr "0.5" "2.5" "3" "2.7" ...
## $ diametro_copa : chr "2.8" "4.5" "8" "2.8" ...
## $ inclinacion : chr "0" "0" "0" "0" ...
## $ densidad_copa : chr "Alto (67 - 100%) " "Alto (67 - 100%) " "Alto (67 - 100%) " "Bajo (0 - 33%) " ...
## $ vitalidad : chr "Regular " "Regular " "Regular " "Regular " ...
## $ bacteriosis_tronco: chr "N/A" "N/A" "N/A" "N/A" ...
attach(Arboles_Cali)
Es necesario organizar la base de datos en algunos aspectos, tal es el caso de reemplazar los “N/A” en NA, para que R los tome como vacíos, y convertir la variable comuna de número a caracter.
Arboles_Cali[Arboles_Cali=="N/A"] <- NA
Arboles_Cali$comuna<- as.character(Arboles_Cali$comuna)
Conozcamos primero las características de la variable altura del árbol, se resalta que la variable altura árbol no solo está involucrando los árboles, si no también otros tipos de especies vegetales. A continuación, mediante la función summary, observamos un reporte descriptivo de la variable, en cuanto términos de valores mínimos y máximos, indicadores de tendencia central y la distribución mediante los cuartiles.
summary(altura_arbol)
## Min. 1st Qu. Median Mean 3rd Qu. Max.
## 0.000 3.500 5.800 6.438 8.700 30.000
Aparentemente la distribución de la alturas son muy variantes, desde los cero metros (si, aca hay algun error), hasta los 30 metros de altura, sin embargo la mediana (cuartil 2) es de 5.8 metros, lo que indica una asimetria de la variable, lo cual podemos evidenciar en el siguiente histograma.
p_alt_arb1=ggplot(data=Arboles_Cali,aes(x=altura_arbol))+geom_histogram(colour="black", fill="skyblue")+ylab("Altura")
p_alt_arb1
## `stat_bin()` using `bins = 30`. Pick better value with `binwidth`.
Como observamos en el histograma anterior, la distribución de los individuos vegetales presenta una asimetría a la izquierda y apriori conocemos que el porte de un individuo vegetal dependerá del tipo de vegetación que se encuentre clasificado (árbol, palma, bambú, arbusto, planta ornamental). Así que será de nuestro interés primero, conocer la cantidad de individuos vegetales según clasificación vegetal, para observar su predominancia.
table(vegetacion) #Cantidad de individuos vegetales por tipo de vegetación
## vegetacion
## Arbol Arbusto Bambu Palma
## 197114 38151 402 49060
## Planta arbustiva Seco
## 6295 68
Para ser mas visual, utilizaremos el paquete ggplot. En este caso, construiremos un grafico de barras que represente la tabla visualizada en el paso anterior. Aca se evidencia que el individuo vegetal predominante es el arbol, seguido de las palmas, los arbustos, y en menor proporción las plantas arbustivas y bambú.
Arboles_Cali$vegetacion=factor(Arboles_Cali$vegetacion,levels = c("Arbol","Palma","Arbusto","Planta arbustiva","Bambu","Seco"))
p_veg1=ggplot(data=Arboles_Cali,aes(x=vegetacion))+geom_bar(colour="black", fill="skyblue")+ylab("Cantidad de individuos")
p_veg1
Mediante el gráfico boxplot, relacionaremos la altura del arbol con el tipo de vegetación, donde observamos que los arboles, palmas y bambu, son especies de alto porte, los arbustos y las platas orgamentales son de un bajo porte, normalmente inferior a los 4 metros.
p_veg2=ggplot(data=Arboles_Cali,aes(x=vegetacion,y=altura_arbol))+geom_boxplot(colour="black", fill="skyblue")+ylab("Altura")
p_veg2
Para el análisis del grosor utilizaremos la medida del diametro a la altura del pecho (DAP), se resalta que hay varias mediciones que podríamos utilizar y que este análisis también dependen de la cantidad de fustes que tenga el árbol, pero para este fin utilizaremos la medición mencionada. Primero conozcamos un pequeño análisis descriptivo.
summary(DAP)
## Min. 1st Qu. Median Mean 3rd Qu. Max.
## 0.0000 0.0800 0.1600 0.2196 0.3000 6.3700
Se observa que la mediana indica que el 50% de los datos tienen un diámetro a la altura del pecho de 0.16 metros, o su equivalente a 16cm, si embargo, se alcanzan valores de hasta los 6.37 metros, esto hace que la distribución tenga una asimetría a la izquierda, seguramente por la presencia de datos atípicos. Además, igual que con la altura, dependerá el diámetro del tipo de vegetación a analizar.
p_alt_arb1=ggplot(data=Arboles_Cali,aes(x=DAP))+geom_histogram(colour=“black”, fill=“skyblue”)+ylab(“Altura”) p_alt_arb1
Por esta razón realizaremos el mismo análisis de la altura, mediante un diagrama de cajas, qeu clasifica el perimetro a la altura del pecho, con el tipo de vegetación.
p_veg3=ggplot(data=Arboles_Cali,aes(x=vegetacion,y=DAP))+geom_boxplot(colour="black", fill="skyblue")+ylab("Diamtro a la altura del pecho (Metros)")
p_veg3
Los resultados apuntan a la lógica esperada, donde el árbol y la palma, son los individuos vegetales de mayor grosor. Se resalta que los arbustos y platas arbustivas son individuos de varios fustes (tallos), en comparación del árbol y la palmas que lo común es verlo de uno solo (existen varias especies con más de un tallo pero generalizaremos en el análisis).
Por ultimo, analizaremos la densidad de copa de los arboles, la cual, en la base de datos del censo, esta clasificada en tres categorias: Alto (67 - 100%), Medio (34 - 66%) y Bajo (0 - 33%). Primero nos interesa conocer de manera general la cantidad de individuos vegetales según densidad de copa.
sort(unique(Arboles_Cali$densidad_copa))
## [1] "Alto (67 - 100%)" "Alto (67 - 100%) " "Bajo (0 - 33%)"
## [4] "Bajo (0 - 33%) " "Medio (34 - 66%)" "Medio (34 - 66%) "
Arboles_Cali$densidad_copa[Arboles_Cali$densidad_copa=="Alto (67 - 100%) "] <- "Alto (67 - 100%)"
Arboles_Cali$densidad_copa[Arboles_Cali$densidad_copa=="Medio (34 - 66%) "] <- "Medio (34 - 66%)"
Arboles_Cali$densidad_copa[Arboles_Cali$densidad_copa=="Bajo (0 - 33%) "] <- "Bajo (0 - 33%)"
Arboles_Cali$densidad_copa=factor(Arboles_Cali$densidad_copa,levels = c("Bajo (0 - 33%)","Medio (34 - 66%)","Alto (67 - 100%)"))
densidad_copa <- Arboles_Cali$densidad_copa
table(densidad_copa)
## densidad_copa
## Bajo (0 - 33%) Medio (34 - 66%) Alto (67 - 100%)
## 83287 114535 93268
Se observa que los individuos vegetales entre mayor sea su altura tendrán una mayor densidad de copa, sin embargo, este comportamiento es debido a los tipos de individuos como el árbol y la palmas, dado que los arbustos y las plantas arbustivas la variación es muy poca de la densidad de copa a medida que aumenta su altura.
p_den2=ggplot(data=Arboles_Cali,aes(x=densidad_copa,y=altura_arbol))+geom_boxplot()+facet_grid(~vegetacion)
p_den2
Nota: Preguntarle al profesor como organizar el eje X, cambiando las etiquetas de densidad de copa por unas más cortas. Intenté con xlim(c(“B”,”M”,”A”)), pero no funcionó.
Se asume que a medida que mayor sea la altura de un árbol, mayor será el diámetro de su tronco, sin embargo, observamos individuos como las palmas o bambús, que tienden a ser altos y delgados. El siguiente gráficos de puntos observaremos la correlación entre las variables altura árbol y DAP y lo calcificaremos por el tipo de vegetación.
p_rela1=ggplot(data=Arboles_Cali,aes(x=altura_arbol,y=DAP))+geom_jitter()+facet_grid(~vegetacion) #Preguntar diferencia entre geom_point() y geom_jitter()
p_rela1
A pesar que no es visible una correlación clara entre todas las categorías de vegetación, si se evidencia algunos resultados relevantes, como el caso del bambú, que a medida que aumenta la altura el grosor tiene una variación muy pequeña, mientras que los árboles y las palmas aparentemente tienen una relación entre las dos variables aunque con mucha dispersión, por tal motivo se pasa a analizar la correlación de ambas categorías vegetales.
En el caso de los árboles se separa una base de datos solo con esta clasificación vegetal para evidenciar a mayor detalle el gráfico de dispersión, también se calcula la correlación de entre las variables altura del árbol y diámetro a la altura del pecho.
arbol=Arboles_Cali[Arboles_Cali$vegetacion=="Arbol",]
p_rel_arbol=ggplot(data=arbol,aes(x=altura_arbol,y=DAP))+geom_jitter()+geom_smooth(method=lm) #Preguntar diferencia entre geom_point() y geom_jitter()
p_rel_arbol
## `geom_smooth()` using formula 'y ~ x'
cor(arbol$DAP,arbol$altura_arbol)
## [1] 0.6476993
Se realiza un procedimiento similar con las palmas, sin embargo, los resultados no presentan una correlación tan marcada, posiblemente hay factores que se podrían tener en cuenta para realizar una mayor desagregación del tipo de árbol. Podría utilizarse una matriz de correlaciones entre las diversas variables continuas de las características físicas del árbol, pero no se abordara en este análisis.
palma=Arboles_Cali[Arboles_Cali$vegetacion=="Palma",]
p_rel_palma=ggplot(data=palma,aes(x=altura_arbol,y=DAP))+geom_jitter()+geom_smooth(method=lm) #Preguntar diferencia entre geom_point() y geom_jitter()
p_rel_palma
## `geom_smooth()` using formula 'y ~ x'
cor(palma$DAP,palma$altura_arbol)
## [1] 0.6318363
Por último, generamos un resumen de los árboles de mayor porte en cuanto a altura, diámetro a la altura de pecho, tomando los registros mayores al cuartil 3 y aquellos que tengan una densidad de la copa alta.
summary(arbol$altura_arbol)
## Min. 1st Qu. Median Mean 3rd Qu. Max.
## 0.00 4.50 7.00 7.35 10.00 30.00
summary(arbol$DAP)
## Min. 1st Qu. Median Mean 3rd Qu. Max.
## 0.0000 0.1100 0.2100 0.2562 0.3400 6.3700
cond_mayor_porte=arbol$altura_arbol>10&arbol$DAP>0.34&arbol$densidad_copa=="Alto (67 - 100%)"
arboles_mayor_porte=arbol[cond_mayor_porte,]
arboles_mayor_porte$comuna=factor(arboles_mayor_porte$comuna,levels = c("1","2","3","4","5","6","7","8","9","10","11","12","13","14","15","16","17","18","19","20","21","22"))
p_porte_com=ggplot(data=arboles_mayor_porte,aes(x=comuna))+geom_bar(colour="black", fill="skyblue")#Preguntar diferencia entre geom_point() y geom_jitter()
ggplotly(p_porte_com)