Cluster Jerárquico

Agrupación jerárquica en R

library(cluster)
library(purrr)
data <- USArrests
 
# eliminamos los valores nulos
head(data)
           Murder Assault UrbanPop Rape
Alabama      13.2     236       58 21.2
Alaska       10.0     263       48 44.5
Arizona       8.1     294       80 31.0
Arkansas      8.8     190       50 19.5
California    9.0     276       91 40.6
Colorado      7.9     204       78 38.7

Escalar las variables

Al igual que en otros métodos estadísticos (PCA, ridge regression, lasso…), la escala en la que se miden las variables y la magnitud de su varianza pueden afectar en gran medida a los resultados obtenidos por clustering. Si una variable tiene una escala mucho mayor que el resto, determinará en gran medida el valor de distancia/similitud obtenido al comparar las observaciones, dirigiendo así la agrupación final. Escalar y centrar las variables de forma que todas ellas tengan media 0 y desviación estándar 1 antes de calcular la matriz de distancias asegura que todas las variables tengan el mismo peso cuando se realice el clustering.

Para escalar los datos, utilice la función scale(). scale es una función genérica cuyo método predeterminado centra y / o escala las columnas de una matriz numérica. Si el argumento center se establece en VERDADERO, el centrado se realiza tomando las desviaciones medias de cada columna. Si scale = TRUE, la escala se realiza dividiendo las columnas de datos (centradas) por sus desviaciones estándar.

data <- scale(data)
head(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

Matriz de distancia

calcula y devuelve la matriz de distancia calculada utilizando la medida de distancia especificada para calcular las distancias entre las filas de una matriz de datos. El argumento x especifica una matriz numérica, un marco de datos o un objeto “dist”. El método del segundo argumento especifica la medida de distancia que se utilizará. El método debe ser uno de los siguientes:

“euclidiana”, “máximo”, “manhattan”, “canberra”, “binario” o “minkowski”

library(stats)
# Matriz de distancias
res.dist = dist(x = data,
                method = "euclidean")
# Imprimi la matriz de distancias
output = as.matrix(res.dist)[1:6, 1:6]
round(output, digits = 3)
           Alabama Alaska Arizona Arkansas California Colorado
Alabama      0.000  2.704   2.294    1.290      3.263    2.651
Alaska       2.704  0.000   2.701    2.826      3.013    2.327
Arizona      2.294  2.701   0.000    2.718      1.310    1.365
Arkansas     1.290  2.826   2.718    0.000      3.764    2.831
California   3.263  3.013   1.310    3.764      0.000    1.288
Colorado     2.651  2.327   1.365    2.831      1.288    0.000

Agrupamiento Aglomerativo

El argumento despecifica una estructura de disimilitud producida por la dist() función. El segundo argumento es el method que especifica el método de aglomeración que se utilizará. Debe ser uno de los siguientes:

“ward.D”, “ward.D2”, “single”, “complete”, “average” (UPGMA), “mcquitty” (WPGMA), “median” (WPGMC) or “centroid” (UPGMC).

# Dissimilarity matrix
d <- dist(data, method = "euclidean")
# Hierarchical clustering using Complete Linkage
hc1 <- hclust(d, method = "complete" )
# Plot the obtained dendrogram
plot(hc1, cex = 0.6, hang = -1)

Agnes

Otra alternativa es la función agnes. Ambas funciones son bastante similares; sin embargo, con la función agnes también puede obtener el coeficiente de aglomeración, que mide la cantidad de estructura de agrupamiento encontrada (los valores más cercanos a 1 sugieren una estructura de agrupación fuerte).

hc2 <- agnes(data, method = "complete")
 
# Agglomerative coefficient
hc2$ac
[1] 0.8531583

comparativa de metodos

# metodos a comparar
metodo <- c( "average", "single", "complete", "ward")
names(metodo) <- c( "average", "single", "complete", "ward")
 
# calculo de coeficiente para cada método
ac <- function(x) {
  agnes(data, method = x)$ac
}
map_dbl(metodo, ac)
  average    single  complete      ward 
0.7379371 0.6276128 0.8531583 0.9346210 

Ward

El método Ward utiliza el coeficiente mas alto de aglomeración.

hc3 <- agnes(data, method = "ward")
pltree(hc3, cex = 0.6, hang = -1, main = "Dendrograma de agnes")

Agrupamiento Divisivo

La función ‘diana’ en el paquete de clúster nos ayuda a realizar agrupamientos jerárquicos divisivos. ‘diana’ funciona de manera similar a ‘agnes’. Sin embargo, no hay un argumento de método aquí, y, en lugar del coeficiente de aglomeración, tenemos un coeficiente de división.

# c
hc4 <- diana(data)
# 0.8531583
# Divise coefficient
hc4$dc
[1] 0.8514345
# plot dendrogram
pltree(hc4, cex = 0.6, hang = -1, main = "Dendrograma de diana")
rect.hclust(hc4, k = 9, border = 2:10)

pltree(hc3, cex = 0.6, hang = -1, main = "Dendrograma de agnes")
rect.hclust(hc3, k = 9, border = 2:10)

Podando el árbol

library(factoextra)
clust <- cutree(hc4, k = 6)
fviz_cluster(list(data = data, cluster = clust))  ## ‘factoextra’ package