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)
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"))
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.
fviz_nbclust(my_data, kmeans, method = "gap_stat")
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.
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)
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.
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
# 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"))
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.
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.
my_data <- scale(iris[, -5])
get_clust_tendency(my_data, n = 50,
gradient = list(low = "steelblue", high = "white"))
## $hopkins_stat
## [1] 0.2002686
##
## $plot
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 .
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
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.