ContinuaciĂ³n de mĂ©todos de particionamiento

Como vimos en la secciĂ³n anterior, los algoritmos de particionamiento son enfoques de agrupamiento que dividen los conjuntos de datos, que contienen \(n\) observaciones, en un conjunto de \(k\) grupos (es decir, conglomerados). Los algoritmos requieren que el analista especifique el nĂºmero de clĂºsteres que se generarĂ¡n.

  • K-means clustering (Macqueen, 1967), en el que, cada grupo estĂ¡ representado por el centro o los medios de los puntos de datos pertenecientes al grupo.

  • K-medoids clustering que tambien es conocido por sus siglas en inglĂ©s pam (particiĂ³n alrededor de los medoides) , (Kaufman y Rousseeuw, 1990), en el que, cada grupo estĂ¡ representado por uno de los objetos en el grupo. Es una alternativa no paramĂ©trica de la agrupaciĂ³n de k-means. Vamos a hablar tambiĂ©n una variante de pam llamado clara (agrupaciĂ³n de grandes aplicaciones), que se utiliza para analizar grandes conjuntos de datos.

Trabajo en R

Para ejemplificar los diferentes mĂ©todos, seguiremos trabajando con el conjunto de datos que analizamos la secciĂ³n anterior.

PreparaciĂ³n de datos

data("USArrests")
my_data <- USArrests
# Escalamos las variables
my_data <- scale(my_data)
# Observamos las primeras lineas
head(my_data)
##                Murder   Assault   UrbanPop         Rape
## Alabama    1.24256408 0.7828393 -0.5209066 -0.003416473
## Alaska     0.50786248 1.1068225 -1.2117642  2.484202941
## Arizona    0.07163341 1.4788032  0.9989801  1.042878388
## Arkansas   0.23234938 0.2308680 -1.0735927 -0.184916602
## California 0.27826823 1.2628144  1.7589234  2.067820292
## Colorado   0.02571456 0.3988593  0.8608085  1.864967207

Ahora cargamos las librerias necesarias para esta primera parte

library(cluster)
library(factoextra)
## Loading required package: ggplot2
## Warning in as.POSIXlt.POSIXct(Sys.time()): unable to identify current timezone 'H':
## please set environment variable 'TZ'
## Welcome! Want to learn more? See two factoextra-related books at https://goo.gl/ve3WBa

DeterminaciĂ³n Ă³ptima del nĂºmero de cluster

fviz_nbclust(my_data, kmeans, method = "gap_stat", k.max = 10, 
             diss = get_dist(my_data, method = "euclidean"), nstart = 50)+
  labs(title= "NĂºmero optimo de cluster") + 
  xlab("k ") +
  ylab("EstadĂ­sticas Gap")

Notemos que a diferencia del mĂ©todo de silueta visto en la secciĂ³n anterior, donde nos daba como resultado del nĂºmero \(k\) Ă³ptimo igual a 2, el mĂ©todo de estadĂ­sticas gap, nos arroja ahora que el nĂºmero optimo \(k\) es 3 y si recuerdan logramos decidir de forma manual que un nĂºmero adecuado de grupos deberĂ­a ser 4. Es por ello que es muy importante resaltar la importancia de entender que este nĂºmero Ă³ptimo por cualquier mĂ©todo, debemos entenderlo como una buena opciĂ³n, pero no es unica, dependiendo del mĂ©todo usado. Entonces, el lograr decidir el nĂºmero adecuado de \(k\) conlleva un trabajo retante para el grupo de analistas.

Queda para el lector, revisar como funciona el método de Estadísticas gap.

Aplicando \(k\)-medias

Aplicaremos el algortimo para los valores de \(k=3\) y \(k=4\).

kmedias <- kmeans(my_data,3, nstart = 50)
fviz_cluster(kmedias, data = my_data)

kmedias <- kmeans(my_data,4, nstart = 50)
fviz_cluster(kmedias, data = my_data)

Aplicando \(k\)-medoides

La agrupaciĂ³n realizada por este mĂ©todo es una particiĂ³n alrededor de los medoides, la cual es una alternativa robusta a la agrupaciĂ³n de \(k\)-medias, que esmenos sensible a los valores atĂ­picos.

library("cluster")
kmedoides <- pam(my_data, 3)
fviz_cluster(kmedoides, data = my_data)

kmedoides <- pam(my_data, 4)
fviz_cluster(kmedoides, data = my_data)

Aplicando Clara

Clara es un mĂ©todo de particiĂ³n utilizado para tratar conjuntos de datos mucho mĂ¡s grandes (mĂ¡s de varios miles de observaciones) con el fin de reducir el tiempo de computaciĂ³n y el problema de almacenamiento.

Debemos tener en cuenta que, lo que puede considerarse pequeño / grande, es realmente una funciĂ³n de la potencia de cĂ¡lculo disponible, tanto de memoria (RAM) como de velocidad.

clarax <- clara(my_data, 3)
fviz_cluster(clarax, data = my_data)

clarax <- clara(my_data, 4)
fviz_cluster(clarax, data = my_data)

Aplicando Cluster jerarquico

Recordemos de la secciĂ³n de AnĂ¡lisis de conglomerados que un Cluster jerĂ¡rquico es un enfoque alternativo a la agrupaciĂ³n de 4k$-medias para identificar grupos en el conjunto de datos. Este no requiere especificar previamente el nĂºmero de clĂºsteres que se generarĂ¡n.

El resultado de la agrupaciĂ³n jerĂ¡rquica es una representaciĂ³n que llamamos dendrograma. Las observaciones pueden subdividirse en grupos cortando el dendograma a un nivel de similitud deseado. Veamos,

d      <- dist(my_data, method = "euclidean")
res.hc <- hclust(d, method = "complete" )
grup   <- cutree(res.hc, k = 3)
plot(res.hc, cex = 0.6) 
rect.hclust(res.hc, k = 3, border = 2:4) 

grup   <- cutree(res.hc, k = 4)
plot(res.hc, cex = 0.6) 
rect.hclust(res.hc, k = 4, border = 2:5) 

QuizĂ¡s, una opciĂ³n un poco mĂ¡s elegante.

res <- hcut(my_data, k = 3)
fviz_dend(res, rect = TRUE, cex = 0.5,
          k_colors = c("red","blue", "green"))

res <- hcut(my_data, k = 4)
fviz_dend(res, rect = TRUE, cex = 0.5,
          k_colors = c("red","blue", "green","purple"))

Observamos que aparte de la discusiĂ³n de poder elegir un \(K\) Ă³ptimo, ahora el elegir el mĂ©todo de agrupaciĂ³n es tambiĂ©n un tema de discusiĂ³n, porque si observan bien, aunque se elija el mismo valor de \(K\) no necesariamente los grupos estĂ¡n constituidos por los mismos elementos cuando aplicas diferente mĂ©todo. A continuaciĂ³n, presentamos algunas alternativas de validaciĂ³n.

ValidaciĂ³n

Existe en R, mĂ©todos de validaciĂ³n, los cuales tratan de evaluar los diferentes mĂ©todos existentes para cada tarea y tomar como Ă³ptimo el valor dado por la mayoria de los mĂ©todos. Esta validaciĂ³n incluye tres tareas principales:

  • EvalĂºar si la aplicaciĂ³n de agrupaciĂ³n es adecuada a sus datos.

  • EvalĂºar la bondad o calidad del parĂ¡metro Ă³timo de la agrupaciĂ³n.

  • EvalĂºar el algortimo de agrupaciĂ³n apropiado para sus datos.

EvalĂºaciĂ³n de agrupaciĂ³n

La evaluaciĂ³n de la tendencia de agrupamiento consiste en examinar si los datos son agrupables, es decir, si los datos contienen cualquier estructura de agrupaciĂ³n inherente. Esto debe comprobarse antes de aplicar el anĂ¡lisis de agrupaciĂ³n.

  • Hopkins estadĂ­stica: Entre mĂ¡s cercano a 1 este el valor del estadĂ­stico Hopkins, podemos concluir que el conjunto de datos es significativamente divisible o particionable. En la prĂ¡ctica si el valor esta por encimar de 0.5 es aceptable concluir la viabilidad de la agrupaciĂ³n

  • VAT (evaluaciĂ³n visual de la tendencia de agrupamiento): la grĂ¡fica detecta la tendencia de agrupamiento en una forma visual contando el nĂºmero de bloques oscuros (o coloreados) de forma cuadrada a lo largo de la diagonal en una imagen cuadrada.

Tomando como ejemplo el conjunto de datos con el que estamos trabajando, encontramos que:

get_clust_tendency(my_data,n=40, gradient = list(low = "steelblue", 
                                                 high = "white"))
## $hopkins_stat
## [1] 0.6559125
## 
## $plot

Donde por el valor del estadĂ­stico se puede conluir que es viable pensar en un agrupamiento de nuestros datos. AdemĂ¡s, visualmente en la diagonal se espara observar bloques un poco mĂ¡s oscuros.

Por otra parte, si tomamos los datos de iris vemos como el coeficiente es bastante alto y la grĂ¡fica nos muestra bastante bien bloques oscuros.

get_clust_tendency(iris[,-5],n=40, gradient = list(low = "steelblue", 
                                                 high = "white"))
## $hopkins_stat
## [1] 0.8219662
## 
## $plot

EvalĂºarciĂ³n del parĂ¡metro Ă³timo de la agrupaciĂ³n

El paquete Nbclust proporciona 30 Ă­ndices diferentes para determinar el mejor nĂºmero de clusters.

library("NbClust")
set.seed(1981)
res.nbclust <- NbClust(my_data, distance = "euclidean",
                  min.nc = 2, max.nc = 10, 
                  method = "complete", index ="all")

## *** : The Hubert index is a graphical method of determining the number of clusters.
##                 In the plot of Hubert index, we seek a significant knee that corresponds to a 
##                 significant increase of the value of the measure i.e the significant peak in Hubert
##                 index second differences plot. 
## 

## *** : The D index is a graphical method of determining the number of clusters. 
##                 In the plot of D index, we seek a significant knee (the significant peak in Dindex
##                 second differences plot) that corresponds to a significant increase of the value of
##                 the measure. 
##  
## ******************************************************************* 
## * Among all indices:                                                
## * 9 proposed 2 as the best number of clusters 
## * 4 proposed 3 as the best number of clusters 
## * 6 proposed 4 as the best number of clusters 
## * 2 proposed 5 as the best number of clusters 
## * 1 proposed 8 as the best number of clusters 
## * 1 proposed 10 as the best number of clusters 
## 
##                    ***** Conclusion *****                            
##  
## * According to the majority rule, the best number of clusters is  2 
##  
##  
## *******************************************************************
factoextra::fviz_nbclust(res.nbclust)
## Among all indices: 
## ===================
## * 2 proposed  0 as the best number of clusters
## * 1 proposed  1 as the best number of clusters
## * 9 proposed  2 as the best number of clusters
## * 4 proposed  3 as the best number of clusters
## * 6 proposed  4 as the best number of clusters
## * 2 proposed  5 as the best number of clusters
## * 1 proposed  8 as the best number of clusters
## * 1 proposed  10 as the best number of clusters
## 
## Conclusion
## =========================
## * According to the majority rule, the best number of clusters is  2 .

Por lo tanto, segĂºn este mĂ©todo de validaciĂ³n se encuentra que el Ă³ptimo del nĂºmero de cluster es \(k=2\).

EvaluaciĂ³n del algortimo de agrupaciĂ³n

El paquete clValid proporciona la evaluaciĂ³n de todos los mĂ©todos vistos.

Evaluaremos sĂ³lo los mĂ©todos vistos, pero podrĂ­an revisar que aĂºn se pueden evaluar muchos otros mĂ©todos.

library("clValid")
## Warning: package 'clValid' was built under R version 3.6.3
validclus  <- clValid(my_data, nClust = 2:6, 
                clMethods = c("hierarchical","kmeans","pam","clara"),
                validation = "internal")
summary(validclus)
## 
## Clustering Methods:
##  hierarchical kmeans pam clara 
## 
## Cluster sizes:
##  2 3 4 5 6 
## 
## Validation Measures:
##                                  2       3       4       5       6
##                                                                   
## hierarchical Connectivity   6.6437  9.5615 13.9563 22.5782 31.2873
##              Dunn           0.2214  0.2214  0.2224  0.2046  0.2126
##              Silhouette     0.4085  0.3486  0.3637  0.3213  0.2720
## kmeans       Connectivity   6.6437 13.6484 16.2413 24.6639 33.7194
##              Dunn           0.2214  0.2224  0.2224  0.1983  0.2231
##              Silhouette     0.4085  0.3668  0.3573  0.3377  0.3079
## pam          Connectivity   6.6437 13.8302 20.4421 29.5726 38.2643
##              Dunn           0.2214  0.1376  0.1849  0.1849  0.2019
##              Silhouette     0.4085  0.3144  0.3390  0.3105  0.2630
## clara        Connectivity   6.6437 13.8302 20.4421 29.5726 38.2643
##              Dunn           0.2214  0.1376  0.1849  0.1849  0.2019
##              Silhouette     0.4085  0.3144  0.3390  0.3105  0.2630
## 
## Optimal Scores:
## 
##              Score  Method       Clusters
## Connectivity 6.6437 hierarchical 2       
## Dunn         0.2231 kmeans       6       
## Silhouette   0.4085 hierarchical 2
plot(validclus)

Para entender los resultados, debemos buscar el método que minimiza la conectividad, y maximice tanto el índice dunn como el ancho de la silueta.

Por lo tanto, parece que la AgrupaciĂ³n jerĂ¡rquica supera a los otros algoritmos de agrupaciĂ³n en cada medida de validaciĂ³n, para casi todos los nĂºmeros de clusters evaluados. AdemĂ¡s, se puede corroborar la conclusiĂ³n de que \(k=2\) es el mejor valor para el nĂºmero de grupos.

Por lo tanto, si deseamos quedarnos con una clasificaciĂ³n Ă³ptima serĂ­a la siguiente.

res <- hcut(my_data, k = 2)
fviz_dend(res, rect = TRUE, cex = 0.5,
          k_colors = c("red","blue"))

fviz_cluster(res, data = my_data)