0.1 Preparación Datos

data("USArrests")
my_data <- USArrests
# Remove any missing value (i.e, NA values for not available)
my_data <- na.omit(my_data)
# Scale variables
my_data <- scale(my_data)
# View the firt 3 rows
head(my_data, n = 3)
##             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

ahora cargamos las librerias necesarias

library(cluster)
library(factoextra)

0.2 matriz de distancias

Es sencillo calcular y visualizar la matriz de distancia utilizando las funciones get_dist () y fviz_dist () en el paquete factoextra r:

Get_dist (): para calcular una matriz de distancia entre las filas de una matriz de datos. Comparado con la función dist () estándar, soporta medidas de distancia basadas en la correlación incluyendo los métodos “pearson”, “kendall” y “spearman”.

Fviz_dist (): para visualizar una matriz de distancia

res.dist <- get_dist(USArrests, stand = TRUE, method = "pearson")
fviz_dist(res.dist, 
   gradient = list(low = "#00AFBB", mid = "white", high = "#FC4E07"))

0.3 particionando el cluster

Los algoritmos de partición 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.

0.3.1 Determinación óptima del número de cluster

fviz_nbclust(my_data, kmeans, method = "gap_stat")

0.3.2 cluster kmeans

km.res <- kmeans(my_data, 3, nstart = 25)
fviz_cluster(km.res, data = my_data, frame.type = "convex")
## Warning: argument frame is deprecated; please use ellipse instead.
## Warning: argument frame.type is deprecated; please use ellipse.type
## instead.

0.3.3 cluster PAM

Agrupación de pam: partición alrededor de los medoids. Alternativa robusta a la agrupación de k-means, menos sensible a los valores atípicos.

# Compute PAM
library("cluster")
pam.res <- pam(my_data, 4)
# Visualize
fviz_cluster(pam.res)

#clusplot(pam.res)

0.3.4 Clara: agrupación de grandes aplicaciones

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 ram.

Tenga 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.

0.4 cluster jerarquico

Clustering jerárquico es un enfoque alternativo a la agrupación de k-means para identificar grupos en el conjunto de datos. No requiere especificar previamente el número de clústeres que se generarán.

El agrupamiento jerárquico puede subdividirse en dos tipos:

+Aglomeración jerárquica agrupación (ahc) en el que, cada observación es inicialmente considerado como un grupo de su propia (hoja, entonces, los clústeres más similares se combinan iterativamente hasta que sólo hay un único gran racimo (raíz). +Divise agrupación jerárquica que es una inversa de ahc. Comienza con la raíz, en la que todos los objetos están incluidos en un grupo. Entonces los clústeres más heterogéneos se dividen iterativamente hasta que toda la observación está en su propio grupo.

El resultado de la agrupación jerárquica es una representación arbórea de las observaciones que se llama un dendrograma. Las observaciones pueden subdividirse en grupos cortando el dendograma a un nivel de similitud deseado.

clarax <- clara(my_data, 3)
# Cluster plot
fviz_cluster(clarax, stand = T, geom = "point",
             pointsize = 1)

plot(silhouette(clarax),  col = 2:3, main = "Silhouette plot")  

fviz_cluster(clarax)

fviz_silhouette(clarax)
##   cluster size ave.sil.width
## 1       1   17          0.26
## 2       2   19          0.29
## 3       3   10          0.46

0.4.1 preparando datos

# 1. Loading and preparing data
data("USArrests")
my_data <- scale(USArrests)
# 2. Compute dissimilarity matrix
d <- dist(my_data, method = "euclidean")
# Hierarchical clustering using Ward's method
res.hc <- hclust(d, method = "ward.D2" )
# Cut tree into 4 groups
grp <- cutree(res.hc, k = 4)
# Visualize
plot(res.hc, cex = 0.6) # plot tree
rect.hclust(res.hc, k = 4, border = 2:5) # add rectangle

ahora un poco más elegante

library("factoextra")
# Compute hierarchical clustering and cut into 4 clusters
res <- hcut(USArrests, k = 4, stand = TRUE)
# Visualize
fviz_dend(res, rect = TRUE, cex = 0.5,
          k_colors = c("#00AFBB","#2E9FDF", "#E7B800", "#FC4E07"))

0.5 validación

La validación de clústeres incluye tres tareas principales:

+Clustering tendencia evalúa si la aplicación de agrupación es adecuada a sus datos. +La evaluación de agrupación evalúa la bondad o calidad de la agrupación. +La estabilidad del agrupamiento busca entender la sensibilidad del resultado del agrupamiento a varios parámetros algorítmicos, por ejemplo, el número de conglomerados.

0.5.1 Evaluación de la tendencia de agrupamiento

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: si el valor de Hopkins estadística está cerca de cero (muy por debajo de 0,5), entonces podemos concluir que el conjunto de datos es significativamente clusterable.
  • VAT (evaluación visual de la tendencia de agrupamiento): la cubeta 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 de cuba.
my_data <- scale(iris[, -5])
get_clust_tendency(my_data, n = 50,
                   gradient = list(low = "steelblue",  high = "white"))
## $hopkins_stat
## [1] 0.2002686
## 
## $plot

0.5.2 determinar el número óptimo de agrupaciones

Estimar el número de clusters en los datos usando estadísticas de gap: factoextra :: fviz_cluster ()

my_data <- scale(USArrests)
library("factoextra")
fviz_nbclust(my_data, kmeans, method = "gap_stat")

Nbclust: un paquete que proporciona 30 índices para determinar el mejor número de clusters

library("NbClust")
set.seed(123)
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 .

0.5.3 Estadísticas de validación de clústeres

Se ha propuesto una variedad de medidas en la literatura para evaluar los resultados de la agrupación. El término validación de agrupamiento se utiliza para diseñar el procedimiento de evaluación de los resultados de un algoritmo de agrupación.

my_data <- scale(iris[, -5])
# Enhanced hierarchical clustering, cut in 3 groups
library("factoextra")
res.hc <- eclust(my_data, "hclust", k = 3, graph = FALSE) 
# Visualize
fviz_dend(res.hc, rect = TRUE, show_labels = FALSE)

Validar los resultados de agrupación por inspección de la trama de la silueta del grupo Recuerde que la silueta ( (s_i )) mide la similitud de un objeto  (i ) con los otros objetos de su propio clúster frente a los del clúster vecino.  (S_i ) los valores van de 1 a - 1:

Un valor de  (s_i ) cercano a 1 indica que el objeto está bien agrupado. En otras palabras, el objeto  (i ) es similar a los otros objetos de su grupo. Un valor de  (s_i ) cercano a -1 indica que el objeto está mal agrupado y que la asignación a algún otro clúster probablemente mejoraría los resultados generales.

# Visualize the silhouette plot
fviz_silhouette(res.hc)
##   cluster size ave.sil.width
## 1       1   49          0.63
## 2       2   30          0.44
## 3       3   71          0.32

# Silhouette width of observations
sil <- res.hc$silinfo$widths[, 1:3]
# Objects with negative silhouette
neg_sil_index <- which(sil[, 'sil_width'] < 0)
sil[neg_sil_index, , drop = FALSE]
##     cluster neighbor   sil_width
## 84        3        2 -0.01269799
## 122       3        2 -0.01789603
## 62        3        2 -0.04756835
## 135       3        2 -0.05302402
## 73        3        2 -0.10091884
## 74        3        2 -0.14761137
## 114       3        2 -0.16107155
## 72        3        2 -0.23036371

0.6 Cómo elegir los algoritmos de agrupación apropiados para sus datos?

my_data <- scale(USArrests)
# Compute clValid
library("clValid")
intern <- clValid(my_data, nClust = 2:6, 
              clMethods = c("hierarchical","kmeans","pam",'clara'),
              validation = "internal")
# Summary
summary(intern)
## 
## 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(intern)

Recuerde que la conectividad debe ser minimizada, mientras tanto el índice de dunn y el ancho de la silueta debe ser maximizada.

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 cada número de clusters evaluados.

Independientemente del algoritmo de agrupamiento, el número óptimo de grupos parece ser dos utilizando las tres medidas.