La palabra jerárquico se refiere a la construcción de jerarquías que este algoritmo crea para determinar los clusters. El algoritmo crea un listado de combinaciones posibles de acuedo a la jerarquía de las distancias entre puntos.
La idea de este procedimiento es construir una jerarquía de particiones del conjunto de casos y escoger la que mejor se ajuste. Supongamos que \(\{C_1,C_2,\dots,Cr\}\) es una partición del conjunto de observaciones. Dada esta partición, podemos calcular la matriz de dimensión \(r \times r\), en donde la posición \((i,j)\) guardará la distancia entre el conjunto \(C_i\) y \(C_j\), según alguna de las medidas de proximidad.
En los siguientes pasos podemos resumir el trabajo que se realiza:
Paso 0: suponemos grupos unitarios formados por cada una de las observaciones. Esto es, \(C_i = \{i\}\) con \(i = 1,\dots,n\). En un principio, cada dato es un grupo.
Paso 1: calculamos la distancia entre los conjuntos de la partición, (para la primera iteración, sería calcular la distancia entre las observaciones).
Paso 2: agrupamos los dos conjuntos más cercanos y dejamos los demás conjuntos igual. Por lo tanto, tenemos ahora \(C_k\) grupos, con \(k<n\).
Paso 3: regresamos al paso 1 e iniciamos una nueva iteración.
Paso 4: si se logra obtener un solo conjunto en la partición paramos el procedimiento.
Para entender mejor el algoritmo, desarrollaremos paso a paso el proceso con un ejemplo inventado de datos.
Supongamos que tenemos una base de datos compuesta por 12 observaciones. en este paso 0, suponemos que cada observación es un grupo.
Para el paso 1, el algoritmo busca los dos puntos que esten cercanos, y los agrupa. Luego busca otros dos puntos con la menor distancia y pregunta: ¿la distancia entre estos dos nuevos puntos es menor que la distancia de estos puntos al grupo creado antes? Si la respuesta es sí los agrupa, sino agrupa el punto más cercano al primer grupo creado.
Notemos que los puntos 1 y 2 tienen la jerarquía más baja dado que tienen la distancia más corta. Luego el algoritmo busca por los siguientes dos puntos más cercanos (el punto 9 y el 12) y al comparar con el punto medio del 1 y 2 opta por crear un nuevo grupo con una jerarquía ligeramente más alta y así sucesivamente. Pero notemos que los puntos 7 y 11 no logran formar un grupo.
Sin embargo, ahora que tenemos el punto 7 y 11, calculamos su distancia y resulta que esa distancia no es la menor comparado a las distancias con los otros grupos existentes. Por ejemplo, el 7 está más cerca al punto medio del 1 y 2, y el 11 está más cerca al punto medio del 5 y 6. Así, el algoritmo crea una jerarquía más alta para esta agrupación.
El algoritmo continua hasta que finalmente crea un grupo que contempla a todos como la jerarquía más alta. En el siguiente gráfico no solo podemos apreciar ello sino también en el eje \(y\) la distancia entre cada punto o grupo de puntos.
Esta representación gráfica es muy utilizada para describir los resultados de un cluster jerárquico, denominada: dendograma , un dendograma muestra a qué valor de la medida de proximidad se produce la unión de los grupos y simultáneamente qué grupos se van uniendo.
También nos permite una valoración rápida de cuántos grupos puede haber en la base de datos. Simplemente trazando una linea horizontal a la altura que consideremos. Por ejemplo, para dos grupos, podemos trazar a la altura del valor 40.
si deseamos tener más grupos, podemos ahora pensar en hacer una línea horizontal a una distancia más baja, por ejemplo en 28 y ahora tendremos tres grupos.
Ahora tenemos tres clúster y así podríamos ir continuando hasta obtener los clústers que deseemos. Vale la pena resaltar que este modelo nos permite hacer cortes no solo por distancias sino también indicando cuántos clúster queremos y existen mecanismos automáticos para elegir este número de clúster óptimo.
Para este primer ejemplo, generaremos tres conjuntos de datos normales multivariados.
# Datos simulados
library(mvtnorm)
set.seed(1234)
x1 <- rmvnorm(n = 10, mean = c(1, 1))
x2 <- rmvnorm(n = 10, mean = c(3.5, 4))
x3 <- rmvnorm(n = 10, mean = c(6, 5.5))
x <- rbind(x1,x2,x3)
gr <- gl(3,10,labels = c("x1","x2","x3"))
id <- as.numeric(gr)
plot(x,col=id,xlab=" ",ylab=" ",cex=1.2,pch=19)
Recordemos que un primer paso muy importante, antes de iniciar el
proceso es, escalar todas las variables numéricas. Escalar significa que
cada variable ahora tendrá una media cero y una desviación estándar uno.
Puede estandarizar los datos usando la función
scale
de R:
dat <- scale(x)
plot(dat,col=id,xlab=" ",ylab=" ",cex=1.2,pch=19)
Hay varias funciones disponibles en R para realizar
Cluster jerárquicos. Trabajaremos con la librería que más se usa
regularmente, esta es:
hclust()
.
Para
hclust()
, se requiere ingresa la
matriz de distancias entre las observaciones. Estas se pueden calcular
mediante la función
dist()
. El método predeterminado
es la distancia Euclidiana, sin embargo, hay otros métodos
programados. Por otra parte, también se necesita especificar el método
para calcular la distancia entre grupos (es decir,
“simple”,“completo”,“promedio”).
distancia <- dist(dat, method = "euclidean")
modelo <- hclust(distancia, method = "complete" )
Una vez creado nuestro modelo, podemos visualizarlo utilizando la librería dendextend.
library(dendextend)
dend_modelo <- as.dendrogram(modelo)
plot(dend_modelo)
Hasta ahora solo hemos hecho la jerarquía, pero lo que nos interesa
es la agrupación. La agrupación se realiza por la distancia calculada
(parámetro h
). Probemos con una distancia de 2. Usaremos
las funciones
color_branches y color_labels para
hacer visible los cambios.
corte <- 2
dend_modelo %>%
color_branches(h = corte) %>%
color_labels(h = corte) %>%
plot() %>%
abline(h = corte, lty = 2)
Este modelo nos permite hacer cortes no solo por distancias sino
también indicando cuántos clúster queremos, parámetro
k
.
clusters_deseados <- 3
dend_modelo %>%
color_branches(k = clusters_deseados) %>%
color_labels(k = clusters_deseados) %>%
plot()
Otra alternativa de visualización, es dibujar rectángulos en los grupos.
plot(dend_modelo)
rect.hclust(modelo, k = clusters_deseados ,
border = 2:4)
Para determinar el número óptimo de clúster, en R,
tenemos la función
fviz_nbclust()
de la librería factoextra.
library(factoextra)
fviz_nbclust(dat, FUN = hcut, method = "silhouette")
Aquí podemos conluir que para un valor de \(k=2\) tendremos el mejor promedio, con lo que éste se convierte en nuestro número de grupos óptimo. Aunque, vale la pena resaltar que estos datos fueron inventados pensando en tener tres grupos diferentes, pero al parecer el método encuentra que hay dos grupos bastante similares como para suponerlos como un sólo grupo. Esta última librería, también tiene una forma de gráficar los dendogramas, la cual los separa por colores y se les puede adicionar los rectángulos. Además, agregue el parámetro de horizontal, este se le puede agregar a cualquiera de las gráficas anteriores.
fviz_dend(modelo, k = 2, rect = TRUE,horiz = TRUE)
Para este segundo ejemplo, trabajaremos la base de datos USArrests , la cual contiene estadísticas de arrestos en los diferentes estados.
head(USArrests)
## 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
Recordemos que debemos escalar los datos antes de hacer cualquier proceso.
data.scaled <- scale(x = USArrests,
center = TRUE,
scale = TRUE)
head(data.scaled)
## 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
Calculemos la matriz de distancias y veamos una forma de visualizarla.
dist <- dist(data.scaled,method = "euclidean")
# matriz de distancias
dist_mat <- as.matrix(round(dist,3))
as.dist(dist_mat[1:6,1:6])
## Alabama Alaska Arizona Arkansas California
## Alaska 2.704
## Arizona 2.294 2.701
## Arkansas 1.290 2.826 2.718
## California 3.263 3.013 1.310 3.764
## Colorado 2.651 2.327 1.365 2.831 1.288
Calculamos el número óptimo de clúster. Esta tarea la vamos a realizar por varios métodos para ejemplificar, pero en el próximo tema se explicará a detalle como funciona cada método.
fviz_nbclust(data.scaled, FUN = hcut, method = "silhouette")
Aquí, encontramos que el número óptimo de clúster sería \(k=2\). Vale la pena resaltar que además del
método de silueta, existen otros métodos ya programados en
R. Por ejemplo, si se usa el método wss
,
buscamos el número que consideremos estabiliza la suma de los cuadrados.
Este método siempre permite un número grande de clúster.
fviz_nbclust(data.scaled, FUN = hcut, method = "wss")
Por ejemplo, para estos datos, podríamos pensar en quedarnos con \(k=4\), ya que después de eso el cambio es mínimo.
También se podría usar el método
gap_stat
. Este método igual que
con silueta automaticamente te da el valor óptimo.
fviz_nbclust(data.scaled, FUN = hcut, method = "gap_stat")
Entonces, por este método tendriamos que \(k=3\). En conclusión, es un tema de investigación aún y puede suceder como es este caso, donde para los mismos datos, los diferentes métodos no logran encontrar un único valor.
Calculamos ahora el modelo.
modelo2 <- hclust(dist, method = "complete")
Veamos ahora, que podemos personalizar el dendograma de muchas formas.
fviz_dend(modelo2, cex = 0.8, lwd = 0.8, k = 4,
# Seleccionando manualmente los colores
k_colors = c("red", "green3", "blue", "magenta"),
rect = TRUE,
rect_border = "gray",
rect_fill = FALSE)
fviz_dend(modelo2, cex = 0.8, lwd = 0.8, k = 4,
# JCO fill color for rectangles
k_colors = c("jco"),
rect = TRUE,
rect_border = "jco",
rect_fill = TRUE)
# mejorando el tamaño de letra
fviz_dend(modelo2, cex = 0.5, k=4,
rect = TRUE,
k_colors = "jco",
rect_border = "jco",
rect_fill = TRUE,
horiz = TRUE)
# Agregando tema
fviz_dend(modelo2, cex = 0.5, k=4,
rect = TRUE,
k_colors = "jco",
rect_border = "jco",
rect_fill = TRUE,
horiz = TRUE,
ggtheme = theme_bw())
Tambien se puede cambiar el tipo de dendograma.
# filogenetico
fviz_dend(modelo2, cex = 0.5, k = 4,
rect = TRUE,
k_colors = "jco",
rect_border = "jco",
rect_fill = TRUE,
type = "phylogenic")
# circular
fviz_dend(modelo2, cex = 0.5, k = 4,
rect = TRUE,
k_colors = "jco",
rect_border = "jco",
rect_fill = TRUE,
type = "circular")
Finalmente, si ya estamos convencidos con la clasificación brindada, debemos agregar la nueva columna de clasificación a la base de datos.
grupos<-cutree(modelo2, k=4)
table(grupos)
## grupos
## 1 2 3 4
## 8 11 21 10
grupos_paises <- cbind(USArrests,grupos)
print(grupos_paises)
## Murder Assault UrbanPop Rape grupos
## Alabama 13.2 236 58 21.2 1
## Alaska 10.0 263 48 44.5 1
## Arizona 8.1 294 80 31.0 2
## Arkansas 8.8 190 50 19.5 3
## California 9.0 276 91 40.6 2
## Colorado 7.9 204 78 38.7 2
## Connecticut 3.3 110 77 11.1 3
## Delaware 5.9 238 72 15.8 3
## Florida 15.4 335 80 31.9 2
## Georgia 17.4 211 60 25.8 1
## Hawaii 5.3 46 83 20.2 3
## Idaho 2.6 120 54 14.2 4
## Illinois 10.4 249 83 24.0 2
## Indiana 7.2 113 65 21.0 3
## Iowa 2.2 56 57 11.3 4
## Kansas 6.0 115 66 18.0 3
## Kentucky 9.7 109 52 16.3 3
## Louisiana 15.4 249 66 22.2 1
## Maine 2.1 83 51 7.8 4
## Maryland 11.3 300 67 27.8 2
## Massachusetts 4.4 149 85 16.3 3
## Michigan 12.1 255 74 35.1 2
## Minnesota 2.7 72 66 14.9 3
## Mississippi 16.1 259 44 17.1 1
## Missouri 9.0 178 70 28.2 3
## Montana 6.0 109 53 16.4 4
## Nebraska 4.3 102 62 16.5 4
## Nevada 12.2 252 81 46.0 2
## New Hampshire 2.1 57 56 9.5 4
## New Jersey 7.4 159 89 18.8 3
## New Mexico 11.4 285 70 32.1 2
## New York 11.1 254 86 26.1 2
## North Carolina 13.0 337 45 16.1 1
## North Dakota 0.8 45 44 7.3 4
## Ohio 7.3 120 75 21.4 3
## Oklahoma 6.6 151 68 20.0 3
## Oregon 4.9 159 67 29.3 3
## Pennsylvania 6.3 106 72 14.9 3
## Rhode Island 3.4 174 87 8.3 3
## South Carolina 14.4 279 48 22.5 1
## South Dakota 3.8 86 45 12.8 4
## Tennessee 13.2 188 59 26.9 1
## Texas 12.7 201 80 25.5 2
## Utah 3.2 120 80 22.9 3
## Vermont 2.2 48 32 11.2 4
## Virginia 8.5 156 63 20.7 3
## Washington 4.0 145 73 26.2 3
## West Virginia 5.7 81 39 9.3 4
## Wisconsin 2.6 53 66 10.8 3
## Wyoming 6.8 161 60 15.6 3