Introducción

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

Geomorfología

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

Descripción de la base de datos

  • Block.size.median: Longitud del clasto
  • Altitude: Altitud, medida snm
  • p20: Proporción de arcilla a limo medio en la celda (peso de 300 g de la superficie)
  • Drift: Tipo de deriva
    • Kame terraces: Terrazas Kame
    • Fluvio-glacial terraces: Terrazas fluvio-glaciales
    • Diamict: Diamict
    • Beaches: Playas
    • Organic soil: Suelo orgánico
    • Landslide deposits: Depósito de deslizamiento
  • Wetness.index: Índice de humedad
  • Latitude: Latitud
  • Valley.depth: Profundidad del valle
  • Diffuse.insolation: Radiación solar potencial
  • Terrain.Ruggedness.Index: Índice de rugosidad del terreno

Análisis exploratorio

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

Correlación

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

Aplicación de un FAMD

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

Variables

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

  • Las variables que más representan la dimensión 1 son altitude y p20.
  • Las variables que más representan la dimensión 2 son latitude y drift.

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)

Contribuciones

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.

  • Dimensión 1: Altitude, p20, drift, block.size.median.
  • Dimensión 2: Drift, latitude, diffuse.insolation.
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)

Individuos

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
             ) 

Cluster

res.hcpc <- HCPC(res, nb.clust=3,graph=FALSE)
plot(res.hcpc, choice="map",draw.tree=FALSE)

Características de los grupos:

  • Cluster 1: Baja altitud, alto índice de humedad, baja insolación, pequeña longitud de clastos y ausencia de terrazas kame.
  • Cluster 2: Asociación con alta insolación, alta profundidad de valle, baja latitud, baja aspereza del terreno y presencia de terraza kame.
  • Cluster 3: Gran altitud, baja produndidad del valle, bajo índice de humedad, gran longitud de clastos, alta accidentalidad del terreno, alta p20, presencia diamética (diamict) y ausencia de playa.

Shiny

#require(Factoshiny)
#res <- Factoshiny(geomorphology)