El siguiente conjunto de datos contiene información de 75 terrenos con sus correspondientes características descritas en 10 variables cuantitativas y una variables cualitativas. Para la realización de este ejemplo se utilizan las librerías FactoMineR y factoextra. El artículo resultante de esta base de datos se puede encontrar en el siguiente link del DOI https://doi.org/10.1016/j.geomorph.2011.12.022, el cual es titulado como “Clasificación de áreas de terreno ordenadas según sus características ambientales (Skagafjörður, norte de Islandia)”.
Definición: La geomorfología tiene como objetivo el estudio de las formas de la superficie terrestre enfocado en describirlas, entender su génesis y su actual comportamiento. Las aplicaciones prácticas de la geomorfología incluyen la evaluación de peligros, como la predicción y mitigación de deslizamientos de tierra, el control de ríos y la restauración de arroyos y la protección costera. La geomorfología planetaria estudia los accidentes geográficos de otros planetas terrestres como Marte. Se estudian las indicaciones de los efectos de los procesos eólicos, fluviales, glaciales, de masas, impactos de meteoritos, tectónica y volcánica. https://es.wikipedia.org/wiki/Geomorfolog%C3%ADa
Se leen las librerías necesarias para realizar el Análisis Factorial de Datos Mixtos (FAMD) y tablas interactivas para una visualización más grata.
library(FactoMineR);library(factoextra);library(DT);library(ggplot2);library(readr);library(xtable)
## Loading required package: ggplot2
## Welcome! Want to learn more? See two factoextra-related books at https://goo.gl/ve3WBa
Posteriormente se cargan los datos de geomorphology con la librería FactoMineR. De acuerdo al artículo citado, mencionan que no se tendrán en cuenta las variables Wind.effect y Convergence.index.
data(geomorphology)
geomorphology=geomorphology[,-c(9,10)]
DT::datatable(geomorphology)
Para observar las descriptivas de las variables cuantitativas de una forma más ordenada y agradable, se creean los vectores con el resumen de la respectiva variable, así:
Block.size.median<-summary(geomorphology$Block.size.median)
Altitude<-summary(geomorphology$Altitude)
p20<-summary(geomorphology$p20)
Wetness.index<-summary(geomorphology$Wetness.index)
Latitude<-summary(geomorphology$Latitude)
Valley.depth<-summary(geomorphology$Valley.depth)
Diffuse.insolation<-summary(geomorphology$Diffuse.insolation)
Terrain.Ruggedness.Index<-summary(geomorphology$Terrain.Ruggedness.Index)
n<-nrow(geomorphology); p<-ncol(geomorphology)
Luego, se usará la librería DT para mostrar las descriptivas en forma de una tabla interactiva
tabla<-rbind(Block.size.median,Altitude,p20,Wetness.index,Latitude,Valley.depth,Diffuse.insolation,Terrain.Ruggedness.Index)
DT::datatable(tabla)
Ya se hizo el análisis exploratorio de las variables cuantitativas, donde se pudo observar que no están en las mismas escalas y la única variable que presenta valores bastante altos es Altitude, por lo tanto se va requerir centrar y escalar las variables.
Lo mencionado anteriormente, se puede reflejar con mayor facilidad por medio del gráfico de boxplot para las variables cuantitativas y diagramas de barras para las variables cualitativas, teniendo en cuenta que con la base de datos en estudio, se cuenta con una sola variable cualitativa llamada Drift, se realiza el mismo procedimiento anterior.
par(bg="white", mar=c(7,3,3,3));boxplot(geomorphology,col = c(2:12),las = 2,main="Variables cuantitativas", cex.axis=0.8,ylim=c(-55,960))
Drift<-summary(geomorphology$Drift)
par(bg="white", mar=c(6,3,3,3));plot(geomorphology$Drift, main = "Categorías de Drift", ylab = "Frecuencia",ylim=c(0,50),las=2,col=c(2:7))
Por medio de la librería corrplot se puede realizar la matriz de correlaciones, donde se observa que las correlaciones más altas se hallan entre block.size.median y altitude, y entre altitude y p20, con valores de 0.45 y 0.43 respectivamente. De igual forma, entre wetness.index y diffuse.insolation, con una correlación de -0.37.
cor<-round(cor(geomorphology[,c(1,2,3,5,6,7,8)]),5)
corrplot::corrplot(cor , method = "ellipse",addCoef.col = "black",type="upper")
Por medio de la librería FactoMineR, se aplica el FAMD y se inhabilita la opción graph con FALSE para realizar el análisis paso a paso y lograr comprender sus resultados.
res<-FAMD(geomorphology,graph = FALSE);res #nada suplementario y una sola variable cualitativa (tomada como activa)
## *The results are available in the following objects:
##
## name description
## 1 "$eig" "eigenvalues and inertia"
## 2 "$var" "Results for the variables"
## 3 "$ind" "results for the individuals"
## 4 "$quali.var" "Results for the qualitative variables"
## 5 "$quanti.var" "Results for the quantitative variables"
summary(res)
##
## Call:
## FAMD(base = geomorphology, graph = FALSE)
##
##
## Eigenvalues
## Dim.1 Dim.2 Dim.3 Dim.4 Dim.5
## Variance 2.358 1.941 1.619 1.319 1.092
## % of var. 18.139 14.929 12.455 10.149 8.403
## Cumulative % of var. 18.139 33.068 45.523 55.672 64.075
##
## Individuals (the 10 first)
## Dist Dim.1 ctr cos2 Dim.2 ctr cos2
## 1 | 3.700 | 2.054 2.385 0.308 | -1.570 1.694 0.180
## 2 | 1.570 | 0.277 0.043 0.031 | 0.436 0.130 0.077
## 3 | 3.204 | -1.099 0.683 0.118 | 2.017 2.795 0.396
## 4 | 1.927 | -0.103 0.006 0.003 | 0.667 0.305 0.120
## 5 | 4.320 | -1.256 0.892 0.084 | 1.619 1.801 0.140
## 6 | 5.326 | 0.437 0.108 0.007 | 3.035 6.329 0.325
## 7 | 3.277 | -1.336 1.009 0.166 | 1.846 2.342 0.317
## 8 | 3.369 | -0.598 0.202 0.032 | 1.731 2.058 0.264
## 9 | 4.686 | 0.503 0.143 0.012 | -2.116 3.076 0.204
## 10 | 1.969 | 0.143 0.011 0.005 | -0.067 0.003 0.001
## Dim.3 ctr cos2
## 1 | -0.840 0.581 0.052 |
## 2 | 0.175 0.025 0.012 |
## 3 | -1.332 1.461 0.173 |
## 4 | -0.631 0.327 0.107 |
## 5 | 0.396 0.129 0.008 |
## 6 | 2.958 7.207 0.309 |
## 7 | -0.673 0.373 0.042 |
## 8 | -1.902 2.980 0.319 |
## 9 | -0.408 0.137 0.008 |
## 10 | -0.827 0.563 0.176 |
##
## Continuous variables
## Dim.1 ctr cos2 Dim.2 ctr cos2 Dim.3
## Block.size.median | 0.625 16.568 0.391 | -0.212 2.309 0.045 | -0.248
## Altitude | 0.819 28.474 0.671 | -0.117 0.706 0.014 | 0.241
## p20 | 0.688 20.053 0.473 | 0.044 0.099 0.002 | 0.022
## Wetness.index | -0.356 5.369 0.127 | 0.392 7.936 0.154 | 0.378
## Latitude | 0.184 1.432 0.034 | 0.709 25.883 0.502 | -0.286
## Valley.depth | -0.366 5.691 0.134 | -0.384 7.582 0.147 | 0.467
## Diffuse.insolation | 0.173 1.272 0.030 | -0.556 15.934 0.309 | -0.135
## Terrain.Ruggedness.Index | 0.292 3.611 0.085 | 0.437 9.854 0.191 | 0.686
## ctr cos2
## Block.size.median 3.786 0.061 |
## Altitude 3.592 0.058 |
## p20 0.031 0.001 |
## Wetness.index 8.805 0.143 |
## Latitude 5.048 0.082 |
## Valley.depth 13.485 0.218 |
## Diffuse.insolation 1.119 0.018 |
## Terrain.Ruggedness.Index 29.057 0.470 |
##
## Categories
## Dim.1 ctr cos2 v.test Dim.2 ctr cos2
## Beach | -0.930 2.280 0.105 -2.159 | 1.382 7.434 0.232
## Diamict | 0.676 5.156 0.558 4.909 | -0.155 0.398 0.029
## Kame | -1.775 3.778 0.167 -2.658 | -3.007 15.999 0.479
## Landslide | -0.788 0.745 0.037 -1.180 | 1.759 5.479 0.182
## Organic soil | 1.998 0.958 0.051 1.301 | 0.524 0.097 0.003
## Terraces | -1.791 4.615 0.232 -2.959 | -0.369 0.289 0.010
## v.test Dim.3 ctr cos2 v.test
## Beach 3.537 | -1.857 19.294 0.419 -5.205 |
## Diamict -1.238 | 0.142 0.483 0.025 1.245 |
## Kame -4.962 | 0.833 1.763 0.037 1.504 |
## Landslide 2.904 | 1.978 9.947 0.230 3.573 |
## Organic soil 0.376 | 2.413 2.962 0.074 1.897 |
## Terraces -0.672 | -0.453 0.626 0.015 -0.903 |
eig.val <- res$eig
DT::datatable(eig.val)
barplot(eig.val[, 2],
names.arg = 1:nrow(eig.val),
main = "Varianza explicada (%)",
xlab = "Dimensiones",
ylab = "Porcentaje de varianza",
col ="steelblue",ylim = c(0,22));lines(x = 1:nrow(eig.val), eig.val[, 2],
type = "b", pch = 19, col = "red")
Se realiza el plano factorial con todas las variables, tanto las cuantitativas como la variable cualitativa, a diferencia del ACP, en este caso no se tuvo que colocar la variable como suplementaria, sino como un ACP normado, donde está inmersa en el análisis porque se logra cuantificar como una variable más.
plot(res, choix = "var")
Aquí se pueden graficar las categorías de la variable cualitativa Drift y con su respectiva contribución de acuerdo a una barra de calor lateral.
fviz_famd_var(res, "quali.var", col.var = "contrib",
gradient.cols = c("#00AFBB", "#E7B800", "#FC4E07")
)
Se grafica el circulo de correlación, donde no se presenta el factor tamaño, por lo cual habría que reescalar algunas variables para lograr construir un índice si ese fuera el objetivo del estudio.
plot(res, choix = "quanti")
Con la librería factoextra se puede construir el mismo círculo de correlación pero con el plus de las contribuciones de cada una de las variables cuantitativas.
fviz_famd_var(res, "quanti.var", col.var = "contrib",
gradient.cols = c("#00AFBB", "#E7B800", "#FC4E07"),
repel = TRUE)
Con la misma librería factoextra se puede graficar la contribución de cada variable a la dimensión deseada, en este caso grafiqué para la dimensión 1 y la dimensión 2.
fviz_contrib(res, "var", axes = 1)#1-dim
fviz_contrib(res, "var", axes = 2)# 2-dim
También puedo obtener las contribuciones de cada una de las categorías de la variable cualitativa Drift y anexada como una tabla interactiva.
quali.var <- get_famd_var(res, "quali.var")
tab1<-round(quali.var$contrib,3)
DT::datatable(tab1)
Se puede llegar a escoger que librería emplear para realizar los gráficos a interpretar, si FactoMineR o factoextra, puesto que es algo más ligado al gusto y qué tan bonito parezca.
get_famd_ind(res)
## FAMD results for individuals
## ===================================================
## Name Description
## 1 "$coord" "Coordinates"
## 2 "$cos2" "Cos2, quality of representation"
## 3 "$contrib" "Contributions"
plot(res,habillage=4) #con factominer
#factoextra
fviz_mfa_ind(res,
habillage = "Drift", # color by groups
palette = c(2:7),
addEllipses = TRUE, ellipse.type = "confidence",
repel = TRUE # Avoid text overlapping
)
res.hcpc <- HCPC(res, nb.clust=3,graph=FALSE)
plot(res.hcpc, choice="map",draw.tree=FALSE)
Características de los grupos:
#require(Factoshiny)
#res <- Factoshiny(geomorphology)