1. Explique en que consiste el análisis de conglomerados.

Es una técnica estadística multivariante que agrupa variables o elementos con características similares en conjuntos más homogéneos. Esta técnica es de carácter descriptivo, más no inferencial. Debido a su funcionalidad descriptiva se utiliza mucho en el campo del análisis exploratorio.

Se puede decir que esta técnica se basa en el agrupamiento de variables con características similares, obtenidas de un conjunto de datos, en grupos más homogéneos.

Áreas de Aplicación

El Análisis de clusters es uno de los métodos de minería de datos más importantes para descubrir conocimientos en datos multidimensionales. El objetivo es identificar patrones de objetos similares en un conjunto de datos. Pero no se utiliza solo aquí, hay una gran cantidad de datos provenientes de todas las ramas de investigación, los métodos de conglomerados pueden utilizarse en las siguientes competencias mostradas por (Cluster Analysis):

  1. Inteligencia Artificial: En esta área se le conoce como aprendizaje automático no supervisado, un método proveniente del Machine Learning. se conoce asi debido a que se parte sin ningun conocimiento sobre los grupos de datos y el algoritmo aprende a agrupar esos datos por si solo.

  2. psiquiatría: Donde la caracterización de los pacientes en base a grupos de síntomas puede ser útil en la identificación de una forma de terapia.

  3. Biología: Para la búsqueda de grupos de genes con funciones similares.

  4. Recuperación de información: La red mundial está formada por miles de millones de páginas web y los resultados de una consulta a un motor de búsqueda pueden devolver miles de páginas. El clustering puede utilizarse para agrupar estos resultados de búsqueda en un pequeño número de clusters, cada uno de los cuales captura un aspecto particular de la consulta. Cada categoría (clúster) puede dividirse en subcategorías (subclústeres), lo que produce una estructura jerárquica que ayuda al usuario a explorar los resultados de la consulta.

  5. Clima: Para entender el clima de la Tierra es necesario encontrar patrones en la atmósfera y el océano. Para ello, se ha aplicado el análisis de clústeres para encontrar patrones en la presión atmosférica de las regiones polares y en los ateos del océano que tienen un impacto significativo en el clima terrestre.

  6. Marketing: Sirve para la segmentación del mercado mediante la identificación de subgrupos de clientes con perfiles similares y que podrían ser receptivos a una determinada forma de publicidad.

  7. Economía: En la economía puede utilizarse para estudiar para agrupar variables economicas que describan un mismo fenómeno. Además tambien puede servir para el estudio de concentraciones geográficas de empresas e instituciones interconectadas en un campo en particular.

Diferencias con el análisis Factorial

El análisis de conglomerados se diferencia del análisis factorial, en que este último agrupa variables en función de las respuestas provenientes de cosas externas a esas variables, mientras que los métodos de conglomerados agrupa los objetos en función de las respuestas que propongan a varias variables. Para entenderlo mejor suponga el ejemplo de distintas personas que responden una determinada encuentas sobre los niveles de pobreza, en el análisis factorial, formamos grupos de variables en función de las respuestas de las personas a esas variables. En cambio, en el análisis de conglomerados, agrupamos a las personas en función de sus respuestas a varias variables.

2. Cuadro

Resumen de Análisis de Clúster

Análisis de Clúster

Técnicas Disponibles

Ventajas

Desventajas

Jerárquico:

Es el procedimiento escalonado que identifica grupos relativamente homogéneos de casos basados en características seleccionadas que resulta en la construcción de una jerarquía o estructura en forma de árbol (dendrograma) que representa la formación de clusters y que en cuyo inicio no requiere especificar previamente el número de conglomerados a producir. La muestra debe ser moderada con < 300.

  • Aglomerativa

  • Divisiva
  • Simplicidad

  • Se hace con diferentes medidas de similitud

  • Rápido
  • Elimina Observaciones

  • Se aplica a muestras pequeñas

No Jerárquico:

Procedimiento que no implica el proceso de construcción de árboles y que asignan los objetos en distintos conglomerados una vez que se especifica el número de estos.Están diseñados para la clasificación de individuos (no de variables) en K grupos.

  • k-Medias

  • PAM

  • CLARA
  • Accesibilidad

  • Muestras grandes
  • Ineficientes debido a muchas soluciones

  • Solución aleatoria

Fuente: Elaboración Propia en base a (Sthda, n.d.)

3. Técnicas de Análisis Jerárquico y no Jerárquico

Análisis Jeráquico

Aglomerativo

Este es un método ascentende, la agrupación aglomerativa se da cuando cada observación se considera inicialmente como un grupo propio (hoja). Luego, los clústeres más similares se fusionan sucesivamente hasta que haya un solo gran clúster (raíz), el resultadi es un árbol llamado dendrograma. (Sthda, n.d.)

Este método tambien es conocido como asociativo y se parte del número original de individuos (grupos propios) que se tiene en la base de datos a utilizar y se van agrupando hasta tener todos los casos en un mismo grupo. los pasos para llevar a acabo un análisis jerárquico aglomerativo son los sigueintes:

1. Preparar los datos a utilizar. Esto implica estandarizar los datos

2. Cálcular la similitud entre cada par de objetos

3. Agrupar todos los objetos en un árbol jerárquico

4. Partición de los datos. Esto implica cortar el árbol jerárquico

La librería utilizada para el análisis de clusters es cluster de ella se utiliza la función agnes() en el enfoque aglomarativo, su implementación es la siguiente:

library(cluster)
agnes(x = df, # df es un conjunto de datos o matriz de disimilitud
      stand = TRUE, # TRUE significa que el conjunto de datos se estandarizará
      metric = "euclidean", # Tipo de cálculo de las diferencias entre observaciones
      method = "ward") # Define el método de agrupamiento.

Para visualizar el árbol creado o dendograma se utiliza la librería factoextra y la función fviz_dend() que se implementa de la sigueinte manera:

library(factoextra)
fviz_dend(x = df, # Objeto dendograma creado con agnes()
          k = 4, # Número de grupos en que se cortará el árbol
          horiz = TRUE, # Verdadero dibuja dendograma horizontalmente 
          cex = 0.5, # Tamaño de las etiquetas
          rect = TRUE) # Verdadero agrega un rectángulo al rededor de grupos

Divisiva

La agrupación divisiva, comienza con la raíz, en la que todos los objetos se incluyen en un grupo. Luego, los conglomerados más heterogéneos se dividen sucesivamente hasta que todas las observaciones se encuentran en su propio conglomerado. (Sthda, n.d.)

Los pasos de los métodos divisivos son similares al aglomerativo y para implementar el análisis en R se utiliza la libería cluster y su función diana() de la forma siguiente:

library(cluster)
diana(x = df, # Conjunto o matriz de datos 
      metric ="euclidean", #Tipo de cálculo de las diferencias entre observaciones
      stand = TRUE) # TRUE significa que el conjunto de datos se estandarizará

Para visualizar el objeto creado con diana se utiliza también la función fviz_dend() de factoextra vista anteriormente.

Análisis no Jerárquico

Método de k-medias

Es un algortimo de aprendizaje automático no supervisado mas utilizado para dividir un conjunto de datos dado en uno de k grupos, donde “k” representa el número de grupos preespecificados por el analista. Clasifica objetos en múltipes grupos, de modo que los obejtos son lo mas similares posibles, mientras que los objetos de diferentes grupos son tan diferentes como sea posible. En el agrupamiento k-medias, cada grupo está representado por su centro que corresponde a la media de puntos asignados al grupo.

Las ideas basicas de la agrupación k-medias consiste en definir agrupaciones de modo que se minimice la variación total dentro de la agrupación.

El algoritmo k-medias se puede resumir de la siguiente manera:

1. Especificar el número de agrupaciones (k) que se crearán por el analista

2. Seleccionar aleatoriamente k objetos del conjunto de datos como centros o medias del conglomerado inicial

3. Asigna cada observación a su controide más cercano, segun la distancia euclidiana entre el objeto y el centroide

4. Para cada uno de los k conglomerados, actualice el centroide del conglomerado calculando los nuevos valores medios de todos los puntos de datos del conglomerado. El centroide de un grupo k, es un vector de lungitud p que contiene las medias de todas las variables para las observaciones en el grupo ku; p es el número de variables

5. Minimice iterativamente el total dentro de la suma del cuadrado. Es decir, repita los pasos 3 y 4 hasta que las asiganaciones de cluster dejen de cambiar o se alcancen el número máximo de iteraciones. De forma predeterminada, el software R usa 10 como valor predeterminado para el número máximo de iteraciones

data("USArrests") 
df <- scale(USArrests)

head(df, n = 3)
library(factoextra)
fviz_nbclust(df, kmeans, method = "wss") +
geom_vline(xintercept = 4, linetype = 2)
           
# Calculando K-mean con K=4
set.seed(123)
km.res <- kmeans(df, 4, nstart = 25)

# Vista Km.res
print(km.res)

aggregate(USArrests, by=list(cluster=km.res$cluster), mean)
dd <- cbind(USArrests, cluster = km.res$cluster)
head(dd)

# Número de conglomerados para cada una de las observaciones
km.res$cluster
head(km.res$cluster, 4)

#Tamaño de clúster
km.res$size

# Medias de clúster
km.res$centers

fviz_cluster(km.res, data = df,
palette = c("#2E9FDF", "#00AFBB", "#E7B800", "#FC4E07"),
ellipse.type = "euclid", # Concentration ellipse
star.plot = TRUE, # Add segments from centroids to items
repel = TRUE, # Avoid label overplotting (slow)
ggtheme = theme_minimal()
)

PAM

El algoritmo anterior (k-medias) es muy sensible a los valores atípicos. Esto puede afectar gravemente a la asignación de observaciones a los conglomerados. El algoritmo PAM proporciona un algoritmo más robusto.

El algoritmo PAM se basa en la busqueda de K objetos representativos y medidos entre las observaciones del conjunto de datos.

El algoritmo PAM procede en dos fases de las siguentes maneras:

1. Seleccione k objetos para convertirlos en medoides, o en caso de que se proporcionen estos objetos utilicelos como medoides

2. Calcule la matriz de disimilitud si no se proporcionó

3. Asigne cada objeto a su medoide más cercano

4. Para cada busqueda de conglomerados, si alguno de los objetos del conglomerado disminuye el coeficiente de disimilitud promedio; si lo hace, seleccione la entidad que mas disminuya este coeficiente como el medoide para este conglomerado

5. Si al menos un medoide ha cambiado, vaya a (3), de lo contrario finalice el algoritmo

El algoritmo PAM funciona con una matriz de disimilitud y para calcular esta matriz, el algoritmo puede utilizar dos métricas:

1. Las distintas euclidianas, que son la raiz de la suma de cuadrados de las diferencias

2. Y la distancia de Manhattan que es la suma de distancia absoluta

data("USArrests")
df <- scale(USArrests)
head(df, n = 3) 

library(cluster)
library(factoextra)
fviz_nbclust(df, pam, method = "silhouette")+
theme_classic()
pam.res <- pam(df, 2)
print(pam.res)

dd <- cbind(USArrests, cluster = pam.res$cluster)
head(dd, n = 3)

pam.res$medoids

head(pam.res$clustering)

fviz_cluster(pam.res,
palette = c("#00AFBB", "#FC4E07"), # color palette
ellipse.type = "t", # Concentration ellipse
repel = TRUE, # Avoid label overplotting (slow)
ggtheme = theme_classic()
)

CLARA

Esta técnica es una extensión de los métodos k-medoides para tratar datos que contienen una gran cantidad de objetos con el fin de reducir el tiempo de cálculo y la RAM, problema de almacenamiento. Esto se logra utilizando el método de muestreo.

Clara no utiliza todo el conjunto de datos si no que considera una pequeña muestra de los datos con tamaño fijo y aplica el algoritmo PAM para generar un conjunto optimo de medoides para la muestra. La calidad de los medoides resultantes se mide por la disimilitud promedio entre cada objeto en todo el conjunto de datos y el medoide de su grupo, definido como la función de costo.

Clara repite los procesos de muestreo y agrupamiento un número prestablecido de veces para minimizar los contenedores de muestreo. los resultados finales del clustering correponden al conjunto de medoides con el mismo coste.

El algoritmo Clara se resume de la siguente manera:

1. Divida aleatoriamente los conjuntos de datos en varios subconjuntos con tamaño fijo

2. Calcule el algoritmo PAM en cada subconjunto y elija los k objetos representativos correspondientes. Asigne cada observación de todo el conjunto de datos al medoide más cercano

3. Calcule la media de las diferencias de las observaciones con su medoide más cercano. Esto se usa como una medida de la bondad de la agrupación

4. Conserve el subcnjunto de datos para el que la media es mínima. Se lleva a cabo un análisis adicional en la partición final

set.seed(1234)

df <- rbind(cbind(rnorm(200,0,8), rnorm(200,0,8)),
cbind(rnorm(300,50,8), rnorm(300,50,8)))

colnames(df) <- c("x", "y")

rownames(df) <- paste0("S", 1:nrow(df))

head(df, nrow = 6)

library(cluster)
library(factoextra)
fviz_nbclust(df, clara, method = "silhouette")+
theme_classic()

clara.res <- clara(df, 2, samples = 50, pamLike = TRUE)

print(clara.res)

dd <- cbind(df, cluster = clara.res$cluster)
head(dd, n = 4)

clara.res$medoids

head(clara.res$clustering, 10)

fviz_cluster(clara.res,
palette = c("#00AFBB", "#FC4E07"), # color palette
ellipse.type = "t", # Concentration ellipse
geom = "point", pointsize = 1,
ggtheme = theme_classic()
)

4. Reproducción de los Ejercicios

Capítulo 4

K-medias clustering

Datos

data("USArrests")
df <- scale(USArrests)
head(df, 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

Estimar el número de conglomerados optimos

# Elegir conglomerados antes del 4. en el "codo"
fviz_nbclust(df, kmeans, method = "wss") +
geom_vline(xintercept = 4, linetype = 2)

Cálculo de conglomerados K-medias

# nstart es recomendable de 25 o 50
set.seed(123)
km.res <- kmeans(df, 4, nstart = 25)
print(km.res)
## K-means clustering with 4 clusters of sizes 8, 13, 16, 13
## 
## Cluster means:
##       Murder    Assault   UrbanPop        Rape
## 1  1.4118898  0.8743346 -0.8145211  0.01927104
## 2 -0.9615407 -1.1066010 -0.9301069 -0.96676331
## 3 -0.4894375 -0.3826001  0.5758298 -0.26165379
## 4  0.6950701  1.0394414  0.7226370  1.27693964
## 
## Clustering vector:
##        Alabama         Alaska        Arizona       Arkansas     California 
##              1              4              4              1              4 
##       Colorado    Connecticut       Delaware        Florida        Georgia 
##              4              3              3              4              1 
##         Hawaii          Idaho       Illinois        Indiana           Iowa 
##              3              2              4              3              2 
##         Kansas       Kentucky      Louisiana          Maine       Maryland 
##              3              2              1              2              4 
##  Massachusetts       Michigan      Minnesota    Mississippi       Missouri 
##              3              4              2              1              4 
##        Montana       Nebraska         Nevada  New Hampshire     New Jersey 
##              2              2              4              2              3 
##     New Mexico       New York North Carolina   North Dakota           Ohio 
##              4              4              1              2              3 
##       Oklahoma         Oregon   Pennsylvania   Rhode Island South Carolina 
##              3              3              3              3              1 
##   South Dakota      Tennessee          Texas           Utah        Vermont 
##              2              1              4              3              2 
##       Virginia     Washington  West Virginia      Wisconsin        Wyoming 
##              3              3              2              2              3 
## 
## Within cluster sum of squares by cluster:
## [1]  8.316061 11.952463 16.212213 19.922437
##  (between_SS / total_SS =  71.2 %)
## 
## Available components:
## 
## [1] "cluster"      "centers"      "totss"        "withinss"     "tot.withinss"
## [6] "betweenss"    "size"         "iter"         "ifault"
# Calcular la media de cada variable por conglomerados
aggregate(USArrests, by=list(cluster=km.res$cluster), mean)
##   cluster   Murder   Assault UrbanPop     Rape
## 1       1 13.93750 243.62500 53.75000 21.41250
## 2       2  3.60000  78.53846 52.07692 12.17692
## 3       3  5.65625 138.87500 73.87500 18.78125
## 4       4 10.81538 257.38462 76.00000 33.19231
# Clasificaciones
dd <- cbind(USArrests, cluster = km.res$cluster)
head(dd)
##            Murder Assault UrbanPop Rape cluster
## Alabama      13.2     236       58 21.2       1
## Alaska       10.0     263       48 44.5       4
## Arizona       8.1     294       80 31.0       4
## Arkansas      8.8     190       50 19.5       1
## California    9.0     276       91 40.6       4
## Colorado      7.9     204       78 38.7       4

Acceder a los resultados de la funcion K-medias

# Número de conglomerados por observaciones
head(km.res$cluster, 4)
##  Alabama   Alaska  Arizona Arkansas 
##        1        4        4        1
# Tamaño de los conglomerados
km.res$size
## [1]  8 13 16 13
# Media de los conglomerados
km.res$centers
##       Murder    Assault   UrbanPop        Rape
## 1  1.4118898  0.8743346 -0.8145211  0.01927104
## 2 -0.9615407 -1.1066010 -0.9301069 -0.96676331
## 3 -0.4894375 -0.3826001  0.5758298 -0.26165379
## 4  0.6950701  1.0394414  0.7226370  1.27693964

Visualización de los conglomerados k-medias

fviz_cluster(km.res, data = df,
             palette = c("#2E9FDF", "#00AFBB", "#E7B800", "#FC4E07"),
             ellipse.type = "euclid", # Elipse de concentración
             star.plot = TRUE, # Segmentos de centroides
             repel = TRUE, # Evita el exceso de etiquetas
             ggtheme = theme_minimal()
             )

Capítulo 5

Cálculo de PAM o K-medoides

Datos

head(df, 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

Número Óptimo de conglomerados

# Grupos sugeridos son 2
fviz_nbclust(df, pam, method = "silhouette")+
theme_classic()

Cálculo de conglomerados PAM

pam.res <- pam(df, 2)
print(pam.res)
## Medoids:
##            ID     Murder    Assault   UrbanPop       Rape
## New Mexico 31  0.8292944  1.3708088  0.3081225  1.1603196
## Nebraska   27 -0.8008247 -0.8250772 -0.2445636 -0.5052109
## Clustering vector:
##        Alabama         Alaska        Arizona       Arkansas     California 
##              1              1              1              2              1 
##       Colorado    Connecticut       Delaware        Florida        Georgia 
##              1              2              2              1              1 
##         Hawaii          Idaho       Illinois        Indiana           Iowa 
##              2              2              1              2              2 
##         Kansas       Kentucky      Louisiana          Maine       Maryland 
##              2              2              1              2              1 
##  Massachusetts       Michigan      Minnesota    Mississippi       Missouri 
##              2              1              2              1              1 
##        Montana       Nebraska         Nevada  New Hampshire     New Jersey 
##              2              2              1              2              2 
##     New Mexico       New York North Carolina   North Dakota           Ohio 
##              1              1              1              2              2 
##       Oklahoma         Oregon   Pennsylvania   Rhode Island South Carolina 
##              2              2              2              2              1 
##   South Dakota      Tennessee          Texas           Utah        Vermont 
##              2              1              1              2              2 
##       Virginia     Washington  West Virginia      Wisconsin        Wyoming 
##              2              2              2              2              2 
## Objective function:
##    build     swap 
## 1.441358 1.368969 
## 
## Available components:
##  [1] "medoids"    "id.med"     "clustering" "objective"  "isolation" 
##  [6] "clusinfo"   "silinfo"    "diss"       "call"       "data"
# Clasificación de puntos datos originales
dd <- cbind(USArrests, cluster = pam.res$cluster)
head(dd, n = 3)
##         Murder Assault UrbanPop Rape cluster
## Alabama   13.2     236       58 21.2       1
## Alaska    10.0     263       48 44.5       1
## Arizona    8.1     294       80 31.0       1

Acceder a los resultados de la función PAM

# Cluster medoids: New Mexico, Nebraska
pam.res$medoids
##                Murder    Assault   UrbanPop       Rape
## New Mexico  0.8292944  1.3708088  0.3081225  1.1603196
## Nebraska   -0.8008247 -0.8250772 -0.2445636 -0.5052109
# Cluster numbers
head(pam.res$clustering)
##    Alabama     Alaska    Arizona   Arkansas California   Colorado 
##          1          1          1          2          1          1

Vualización de conglomerados PAM

fviz_cluster(pam.res, 
             palette = c("#00AFBB", "#FC4E07"), # color palette
             ellipse.type = "t", # Concentration ellipse
             repel = TRUE, # Avoid label overplotting (slow)
             ggtheme = theme_classic()
             )

Capítulo 6

Cálculo de CLARA

Formato de datos y preparación

set.seed(1234)
# Generate 500 objects, divided into 2 clusters.

df <- rbind(cbind(rnorm(200,0,8), rnorm(200,0,8)),
cbind(rnorm(300,50,8), rnorm(300,50,8)))

# Especificar los nombre de las columnas y las filas
colnames(df) <- c("x", "y")
rownames(df) <- paste0("S", 1:nrow(df))

# Previewing the data

head(df, nrow = 6)
##             x        y
## S1  -9.656526 3.881815
## S2   2.219434 5.574150
## S3   8.675529 1.484111
## S4 -18.765582 5.605868
## S5   3.432998 2.493448
## S6   4.048447 6.083699

Estimar el número óptimo de conglomerados

fviz_nbclust(df, clara, method = "silhouette")+
theme_classic()

Calcular CLARA

# Compute CLARA
clara.res <- clara(df, 2, samples = 50, pamLike = TRUE)

# Print components of clara.res
print(clara.res)
## Call:     clara(x = df, k = 2, samples = 50, pamLike = TRUE) 
## Medoids:
##              x         y
## S121 -1.531137  1.145057
## S455 48.357304 50.233499
## Objective function:   9.87862
## Clustering vector:    Named int [1:500] 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 ...
##  - attr(*, "names")= chr [1:500] "S1" "S2" "S3" "S4" "S5" "S6" "S7" ...
## Cluster sizes:            200 300 
## Best sample:
##  [1] S37  S49  S54  S63  S68  S71  S76  S80  S82  S101 S103 S108 S109 S118 S121
## [16] S128 S132 S138 S144 S162 S203 S210 S216 S231 S234 S249 S260 S261 S286 S299
## [31] S304 S305 S312 S315 S322 S350 S403 S450 S454 S455 S456 S465 S488 S497
## 
## Available components:
##  [1] "sample"     "medoids"    "i.med"      "clustering" "objective" 
##  [6] "clusinfo"   "diss"       "call"       "silinfo"    "data"
# Clasificación por puntos en la data original
dd <- cbind(df, cluster = clara.res$cluster)
head(dd, n = 4)
##             x        y cluster
## S1  -9.656526 3.881815       1
## S2   2.219434 5.574150       1
## S3   8.675529 1.484111       1
## S4 -18.765582 5.605868       1

Acceder a los resultados

# Medoids
clara.res$medoids
##              x         y
## S121 -1.531137  1.145057
## S455 48.357304 50.233499
# Clustering
head(clara.res$clustering, 10)
##  S1  S2  S3  S4  S5  S6  S7  S8  S9 S10 
##   1   1   1   1   1   1   1   1   1   1

Visualización

fviz_cluster(clara.res,
             palette = c("#00AFBB", "#FC4E07"), # color palette
             ellipse.type = "t", # Concentration ellipse
             geom = "point", pointsize = 1,
             ggtheme = theme_classic()
)

Capítulo 7

Agrupación jerarquica

Preparación de los datos

# cargar
data("USArrests")
# Estandarizar
df <- scale(USArrests)
head(df, nrow = 6)
##                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

Medidas de similitud

Cálculo de la matriz de distancia

res.dist <- dist(df, method = "euclidean")
as.matrix(res.dist)[1:6, 1:6]
##             Alabama   Alaska  Arizona Arkansas California Colorado
## Alabama    0.000000 2.703754 2.293520 1.289810   3.263110 2.651067
## Alaska     2.703754 0.000000 2.700643 2.826039   3.012541 2.326519
## Arizona    2.293520 2.700643 0.000000 2.717758   1.310484 1.365031
## Arkansas   1.289810 2.826039 2.717758 0.000000   3.763641 2.831051
## California 3.263110 3.012541 1.310484 3.763641   0.000000 1.287619
## Colorado   2.651067 2.326519 1.365031 2.831051   1.287619 0.000000

Enlace y Arbol jerárquico

res.hc <- hclust(d = res.dist, method = "ward.D2")

Dendograma

fviz_dend(res.hc, cex = 0.5)

7.3. Verificar árbol de clúster

Cálculo de distancias

# Cálculo de distancia cofenética
res.coph <- cophenetic(res.hc)
# Correlación entre la distancia cofenética y
# la distancia original
cor(res.dist, res.coph)
## [1] 0.6975266
# Solución de agrupación
res.hc2 <- hclust(res.dist, method = "average")
cor(res.dist, cophenetic(res.hc2))
## [1] 0.7180382

7.4. Cortar dendograma en diferentes grupos

# Cortar arbol en 4 grupos
grp <- cutree(res.hc, k = 4)
head(grp, n = 4)
##  Alabama   Alaska  Arizona Arkansas 
##        1        2        2        3
# Número de miembros en cada clúster
table(grp)
## grp
##  1  2  3  4 
##  7 12 19 12
# Nombres de los miembros del clúster 1
rownames(df)[grp == 1]
## [1] "Alabama"        "Georgia"        "Louisiana"      "Mississippi"   
## [5] "North Carolina" "South Carolina" "Tennessee"
# Cut in 4 groups and color by groups
fviz_dend(res.hc, k = 4, # Cut in four groups
          cex = 0.5, # label size
          k_colors = c("#2E9FDF", "#00AFBB", "#E7B800", "#FC4E07"),
          color_labels_by_k = TRUE, # color labels by groups
          rect = TRUE # Add rectangle around groups
)

Viualizar Resultados

fviz_cluster(list(data = df, cluster = grp),
             palette = c("#2E9FDF", "#00AFBB", "#E7B800", "#FC4E07"),
             ellipse.type = "convex", # Concentration ellipse
             repel = TRUE, # Avoid label overplotting (slow)
             show.clust.cent = FALSE, ggtheme = theme_minimal())

7.5. Paquete R clúster

library("cluster")
# Anidamiento aglomerativo (clustering jerárquico) 
res.agnes <- agnes(x = USArrests, # data matrix
                   stand = TRUE, # Standardize the data
                   metric = "euclidean", # metric for distance matrix
                   method = "ward" # Linkage method
)
# Agrupación de ANÁLISIS DIVISIVA
res.diana <- diana(x = USArrests, # data matrix
                   stand = TRUE, # standardize the data
                   metric = "euclidean" # metric for distance matrix
)

fviz_dend(res.agnes, cex = 0.6, k = 4)

Capítulo 8

Comparación de dendrogramas

8.1 Preparación de datos

df <- scale(USArrests)
set.seed(123)
ss <- sample(1:50, 10)
df <- df[ss,]

8.2. Comparar dendrogramas

Lista de dendrogramas

library(dendextend)

# Compute distance matrix
res.dist <- dist(df, method = "euclidean")

# Compute 2 hierarchical clusterings
hc1 <- hclust(res.dist, method = "average")
hc2 <- hclust(res.dist, method = "ward.D2")

# Create two dendrograms
dend1 <- as.dendrogram (hc1)
dend2 <- as.dendrogram (hc2)

# Create a list to hold dendrograms
dend_list <- dendlist(dend1, dend2)

Visualización de la comparación

tanglegram(dend1, dend2)

# Personalizar enredo

tanglegram(dend1, dend2, 
           highlight_distinct_edges = FALSE, # Turn-off dashed lines
           common_subtrees_color_lines = FALSE, # Turn-off line colors
           common_subtrees_color_branches = TRUE, # Color common branches
           main = paste("enredo =", round(entanglement(dend_list), 2))
)

Matriz de correlación entre una lista de dendrogramas

# Cophenetic correlation matrix
cor.dendlist(dend_list, method = "cophenetic")
##           [,1]      [,2]
## [1,] 1.0000000 0.9925544
## [2,] 0.9925544 1.0000000
# Baker correlation matrix
cor.dendlist(dend_list, method = "baker")
##           [,1]      [,2]
## [1,] 1.0000000 0.9895528
## [2,] 0.9895528 1.0000000
# Cophenetic correlation coefficient
cor_cophenetic(dend1, dend2)
## [1] 0.9925544
# Baker correlation coefficient
cor_bakers_gamma(dend1, dend2)
## [1] 0.9895528
# Create multiple dendrograms by chaining
dend1 <- df %>% dist %>% hclust("complete") %>% as.dendrogram
dend2 <- df %>% dist %>% hclust("single") %>% as.dendrogram
dend3 <- df %>% dist %>% hclust("average") %>% as.dendrogram
dend4 <- df %>% dist %>% hclust("centroid") %>% as.dendrogram

# Compute correlation matrix
dend_list <- dendlist("Complete" = dend1, "Single" = dend2,
"Average" = dend3, "Centroid" = dend4)
cors <- cor.dendlist(dend_list)

# Print correlation matrix
round(cors, 2)
##          Complete Single Average Centroid
## Complete     1.00   0.46    0.45     0.30
## Single       0.46   1.00    0.23     0.17
## Average      0.45   0.23    1.00     0.31
## Centroid     0.30   0.17    0.31     1.00
# Visualize the correlation matrix using corrplot package
library(corrplot)
corrplot(cors, "pie", "lower")

Capitulo 9:

Visualización de dendogramas

library(factoextra)

# Load data
data(USArrests)
# Compute distances and hierarchical clustering
dd <- dist(scale(USArrests), method = "euclidean")
hc <- hclust(dd, method = "ward.D2")

9.1. Visualización de dendogramas

Gráfico 1:

## Representación 1

fviz_dend(hc, cex = 0.5)

## Representación 2

fviz_dend(hc, cex = 0.5,
main = "Dendrogram - ward.D2",
xlab = "Objects", ylab = "Distance", sub = "")

## Representación 3
fviz_dend(hc, cex = 0.5, horiz = TRUE)

Gráfico 2:

fviz_dend(hc, k = 4, # Cut in four groups 
          cex = 0.5, # label size
          k_colors = c("#2E9FDF", "#00AFBB", "#E7B800", "#FC4E07"),
          color_labels_by_k = TRUE, # color labels by groups
          rect = TRUE, # Add rectangle around groups
          rect_border = c("#2E9FDF", "#00AFBB", "#E7B800", "#FC4E07"),
          rect_fill = TRUE)

Gráfico 3:

fviz_dend(hc, k = 4, # Cut in four groups 
          cex = 0.5, # label size
          k_colors = c("#2E9FDF", "#00AFBB", "#E7B800", "#FC4E07"),
          color_labels_by_k = TRUE, # color labels by groups
          ggtheme = theme_gray() # Change theme
)

Gráfico 4:

fviz_dend(hc, cex = 0.5, k = 4, # Cut in four groups
k_colors = "jco")

Gráfico 5:

fviz_dend(hc, k = 4, cex = 0.4, horiz = TRUE, k_colors = "jco",
rect = TRUE, rect_border = "jco", rect_fill = TRUE)

Gráfico 6:

fviz_dend(hc, cex = 0.5, k = 4,
k_colors = "jco", type = "circular")

Gráfico 7:

require("igraph")
fviz_dend(hc, k = 4, k_colors = "jco",
type = "phylogenic", repel = TRUE)

Gráfico 8:

require("igraph")
fviz_dend(hc, k = 4, # Cut in four groups
k_colors = "jco",
type = "phylogenic", repel = TRUE,
phylo_layout = "layout.gem")

9.2. Dendogramas con grandes conjuntos de Datos

Hacer zoom

fviz_dend(hc, xlim = c(1, 20), ylim = c(1, 8))

Trazar un subárbol

# Cree un gráfico de todo el dendrograma y extraiga los datos del dendrograma
dend_plot <- fviz_dend(hc, k = 4, # Cortar en 4 grupos
                       cex = 0.5, 
                       k_colors = "jco")
dend_data <- attr(dend_plot, "dendrogram") # Extraer los datos del dendrograma
dend_cuts <- cut(dend_data, h = 10) # Cortar dendrograma a la altura h = 10
fviz_dend(dend_cuts$upper) # Visualizar

print(dend_plot) # Dendrograma completo

fviz_dend(dend_cuts$lower[[1]], main = "Subtree 1") # subárbol 1

fviz_dend(dend_cuts$lower[[2]], main = "Subtree 2") # subárbol 2

fviz_dend(dend_cuts$lower[[2]], type = "circular") # árboles circulares

Guardar dendrograma

pdf("dendrogram.pdf", width=30, height=15) # Abrir pdf
p <- fviz_dend(hc, k = 4, cex = 1, k_colors = "jco" ) 
print(p)
dev.off() # Cerrar PDF
## png 
##   2

9.3 Manipular dendrogramas usando dendextend

library(dendextend)
dend <- USArrests[1:5,] %>% # data
   scale %>% # Escalar los datos
   dist %>% # cálcular la matriz de distancia
   hclust(method = "ward.D2") %>% # Agrupación jerárquica
   as.dendrogram # Convierte el objeto en un dendrograma.
plot(dend)

Ejemplo:

library(dendextend)

# 1. Crear dendrograma personalizado

mycols <- c("#2E9FDF", "#00AFBB", "#E7B800", "#FC4E07")
dend <- as.dendrogram(hc) %>%
   set("branches_lwd", 1) %>% # Ancho de las líneas
   set("branches_k_color", mycols, k = 4) %>% # Color de las ramas por grupos
   set("labels_colors", mycols, k = 4) %>% # Color de etiquetas
   set("labels_cex", 0.5) # Tamaño de las etiquetas
fviz_dend(dend) # Crear Gráfico

Bibliografía

Cluster analysis. https://es.slideshare.net/jewelmrefran/cluster-analysis-15529464.
Https://www.fuenterrebollo.com/economicas/ECONOMETRIA/SEGMENTACION/CONGLOMERADOS/conglomerados.pdf. https://www.fuenterrebollo.com/Economicas/ECONOMETRIA/SEGMENTACION/CONGLOMERADOS/conglomerados.pdf.
Maechler, M., Rousseeuw, P., Struyf, A., & Hubert, M. (2021). Cluster: "Finding groups in data": Cluster analysis extended rousseeuw et al. https://svn.r-project.org/R-packages/ trunk/cluster/
Microsoft PowerPoint - clase 2. http://ocw.upm.es/pluginfile.php/1284/mod_label/intro/anal_mult_2.pdf.
R Core Team. (2021). R: A language and environment for statistical computing. R Foundation for Statistical Computing. https://www.R-project.org/
Sthda (Ed.). (n.d.). Guía práctica para el análisis de clústeres en r: Aprendizaje automático no supervisado.
Wickham, H., François, R., Henry, L., & Müller, K. (2021). Dplyr: A grammar of data manipulation. https://CRAN.R-project.org/ package=dplyr
Zhu, H. (2021). kableExtra: Construct complex table with kable and pipe syntax. https://CRAN.R-project.org/ package=kableExtra