Laboratorio 2 Análisis de Clúster (Conglomerados)

2022-11-24

UNIVERSIDAD DE EL SALVADOR

FACULTAD DE CIENCIAS ECONÓMICAS

ESCUELA DE ECONOMÍA

CICLO II-2021

“Laboratorio 2 Análisis de Clúster (Conglomerados)”

Metodos para el Analisis Económico.

Docente:

Carlos Ademir Pérez Alas.

Integrantes:

Nelson Jesus Carrillo Paniagua. (CP18075)

Hugo Alejandro Azahar Nieto. (AN18012)

Grupo Teorico:

03

Ciudad Universitaria, Viernes 25 de noviembre de 2021.

1. Explique en qué consiste el análisis de conglomerados.

El análisis de conglomerados, al que también se denomina comúnmente análisis cluster, es una técnica diseñada para clasificar distintas observaciones en grupos, de tal forma que:

  1. Cada grupo (conglomerado o cluster) sea homogéneo respecto a las variables utilizadas para caracterizarlo, es decir, que cada observación contenida en él sea parecida a todas las que estén incluidas en ese grupo.

  2. Que los grupos sean lo más distintos posible unos de otros respecto a las variables consideradas.

(Aldas Manzano & Uriel Jimenez, 2017)

La agrupación en clústeres es uno de los métodos de minería de datos importantes para descubrir conocimiento en datos multidimensionales. El objetivo de la agrupación es identificar patrones o grupos de objetos similares dentro de un conjunto de datos de interés.

El análisis de conglomerados es popular en muchos campos, que incluyen:

• En la investigación del cáncer para clasificar a los pacientes en subgrupos según su perfil de expresión génica. Esto puede ser útil para identificar el perfil molecular de pacientes con buen o mal pronóstico, así como para comprender la enfermedad.

• En marketing para la segmentación del mercado mediante la identificación de subgrupos de clientes con perfiles similares y que puedan ser receptivos a una determinada forma de publicidad.

• En Urbanismo para la identificación de grupos de viviendas según su tipología, valor y ubicación.

(Kassambara, 2017)

El análisis de conglomerados (CLA) es una colección de algoritmos para clasificar objetos como países, especies e individuos (Anderberg, 1973; Massart & Kaufman, 1983). La clasificación tiene como objetivo reducir la dimensionalidad de un conjunto de datos explotando las similitudes/disemejanzas entre los casos.

(Commission et al., 2008)

2. Elabore un cuadro comparativo, que incluya los siguientes elementos:

Resumen del Análisis de Clúster

Análisis de Clúster

Técnicas disponibles

Ventajas

Desventajas

Jerárquico:

 

Agrupar clúster para formar uno nuevo o separar alguno ya existente para dar origen a otros dos de forma que se maximice una medida de similaridad o se minimice alguna distancia.

 

En una clasificación jerárquica, los grupos se van fusionando (o subdividiendo) sucesivamente, siguiendo una prelación o jerarquía, decreciendo la homogeneidad conforme se van haciendo más amplios.

Agrupación aglomerativa

·         Vinculación máxima o completa

·         Enlace mínimo o único

·         Enlace medio o promedio

·         Método centroide

·         Método de la varianza mínima de Ward

Agrupación divisiva

·         Vinculación máxima o completa

·         Enlace mínimo o único

·         Enlace medio o promedio

·         Método centroide

·       Método de la varianza mínima de Ward

·         No es necesario especificar el número de clusteres necesarios para el algoritmo.

·         El clustering jerárquico es fácil de implementar.

·         El dendrograma producido es muy útil para comprender los datos.

 

·         El algoritmo nunca puede deshacer ninguna de los pasos anteriores, No puede recuperarse de decisiones incorrectas.

·         La complejidad del tiempo para el clustering puede dar lugar a tiempos de cálculo muy largos, en comparación con algoritmos eficientes, como K-Means.

·         Si tenemos un conjunto de datos grande, puede ser difícil determinar el número correcto de clusteres por el dendrograma.

 

No Jerárquico:

 

Están diseñados para la clasificación de individuos (no de variables) en K grupos. El procedimiento es elegir una partición de los individuos en K grupos e intercambiar los miembros de los clusters para tener una partición mejor.

 

 

Reasignación

·         K Medias

·         Partitioning Around Medoids (PAM)

·         CLARA

·         Nubes Dinámicas

Búsqueda de densidad

·         Análisis Modal

·         Métodos Taxap

·         Método de Fortin

·         Método de Wolf

Métodos Directos

·         Block – Clustering

Métodos Reductivos

·         Análisis Factorial tipo Q

 

 

 

 

 

·         Fácil de entender, fácil de adaptar

 

·         Trabaja bien con conjuntos de datos grandes o pequeños,

 

·         Es eficiente y tiene buen desempeño

 

·         Necesita que el usuario defina el número de clústeres.

 

·         Sensible a ruido

 

·         Presenta problemas de robustez

 

·         El resultado puede variar según las variables elegidas al inicio.

 

Fuente: elaboración propia con base en:

(Kassambara, 2017),(Hojas, 2020),(AN�LISIS CLUSTER, n.d.), (De La Fuente, 2011)

3. Describa las técnicas disponibles para realizar el análisis de clúster, tanto jerárquicas como no jerárquicas, presentadas en el cuadro anterior, incluya una explicación de la librería y sintaxis para implementarla en R.

El Análisis Cluster, conocido como Análisis de Conglomerados, es una técnica estadística multivariante que busca agrupar elementos (o variables) tratando de lograr la máxima homogeneidad en cada grupo y la mayor diferencia entre los grupos.

Es un procedimiento estadístico que parte de un conjunto de datos que contiene información sobre una muestra de entidades e intenta reorganizarlas en grupos relativamente homogéneos a los que se llama conglomerados (clusters).

ETAPAS DEL ANÁLISIS DE CONGLOMERADOS (CLUSTERS)

  1. Elección de las variables

  2. Elección de la medida de asociación

  3. Elección de la técnica Cluster

  4. Validación de los resultados

    Conglomerados Jerárquico:

El Análisis de Conglomerados Jerárquico pretende identificar grupos homogéneos de variables en función de alguna característica. Consecuentemente, al realizar este proceso, se busca ir combinando las agrupaciones hasta que finalmente quede solamente un grupo con características más diferenciadas. Esta metodología para realizar conglomerados no requiere que se preestablezca un número de clusters determinado, como si necesita el Análisis de k-Medias, y suele completarse con la realización de un tipo de gráfico particular, llamado dendrograma, que permite visualizar las agrupaciones en forma de árbol donde se van representando los datos por subcategorías.

La agrupación jerárquica se puede subdividir en dos tipos:

Agrupamiento aglomerativo

en el que cada observación se considera inicialmente como un grupo propio (hoja). Luego, los clústeres más similares se fusionan sucesivamente hasta que solo queda un solo clúster grande (raíz).

Vinculación máxima o completa

La distancia entre dos conglomerados se define como el valor máximo de todas las distancias por pares entre los elementos del conglomerado 1 y los elementos del conglomerado 2. Tiende a producir conglomerados más compactos.

Vinculación mínima o simple

La distancia entre dos grupos se define como el valor mínimo de todas las distancias por pares entre los elementos del grupo 1 y los elementos del grupo 2. Tiende a producir grupos largos y “sueltos”.

Vinculación media o media

La distancia entre dos conglomerados se define como la distancia promedio entre los elementos del conglomerado 1 y los elementos del conglomerado 2.

Enlace centroide

La distancia entre dos conglomerados se define como la distancia entre el centroide del conglomerado 1 (un vector medio de variables de longitud p) y el centroide del conglomerado 2.

Método de la varianza mínima de Ward

Minimiza la varianza total dentro del conglomerado. En cada paso, se fusionan el par de clústeres con una distancia mínima entre clústeres.

El Método de Ward es uno de los más utilizados en la práctica; posee casi todas las ventajas del Método de la K‐medias y suele ser más discriminativo en la determinación de los niveles de agrupación.

El agrupamiento dividido

Lo contrario del agrupamiento aglomerativo, comienza con la raíz, en el que todos los objetos se incluyen en un agrupamiento. Luego, los grupos más heterogéneos se dividen sucesivamente hasta que todas las observaciones están en su propio grupo.

Conglomerado no Jerarquico

El análisis de conglomerados no jerárquico se caracteriza porque, a diferencia del jerárquico, se conoce a priori el número k de grupos que se desea, y las observaciones son entonces asignadas a cada uno de esos k conglomerados, de tal forma que se maximiza la homogeneidad de los sujetos asignados a un mismo grupo y la heterogeneidad entre los distintos conglomerados.

  1. Se han de determinar los centroides iniciales de los k grupos, esto es, los valores medios de las variables que caracterizan las observaciones en cada uno de esos grupos. Estos centroides iniciales, que se conocen como semillas, pueden ser fijados por el investigador de acuerdo con información previa.

  2. Una vez establecidas las semillas, cada observación se asigna a aquel conglomerado, de entre los k existentes, cuyo centroide esté más cercano.

  3. Se recalculan entonces los centroides de los k grupos de acuerdo con las observaciones que han sido clasificadas en cada uno de ellos. Si el cambio en los centroides es mayor que un valor criterio de convergencia preestablecido, entonces se vuelve al paso 2.

(Aldas Manzano & Uriel Jimenez, 2017)

K-Medoids

El algoritmo k-medoids es un enfoque de agrupamiento relacionado con el agrupamiento de k-medias para dividir un conjunto de datos en k grupos o conglomerados. En el agrupamiento de k-medoides, cada grupo está representado por uno de los puntos de datos en el grupo. Estos puntos se denominan medoides de racimo.

K-medoid es una alternativa robusta al agrupamiento k-means. Esto significa que el algoritmo es menos sensible al ruido y los valores atípicos, en comparación con k-means, porque usa medoids como centros de clúster en lugar de medios (usados en k-means).

El algoritmo k-medoids requiere que el usuario especifique k, el número de grupos que se generarán (como en k-means clustering).

(Kassambara, 2017)

PAM

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

El algoritmo PAM se basa en la búsqueda de k objetos representativos o medoides entre las observaciones del conjunto de datos. Después de encontrar un conjunto de k medoides, se construyen grupos asignando cada observación al medoide más cercano.

  1. Seleccione k objetos para que se conviertan en los medoides o, en caso de que se hayan proporcionado estos objetos, utilícelos como medoides;

  2. Calcular la matriz de disimilitud si no se proporcionó;

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

  4. Para cada búsqueda de conglomerados, si alguno de los objetos del conglomerado disminuye el coeficiente de disimilitud promedio; si es así, seleccione la entidad que más disminuya este coeficiente como el medoide para este grupo;

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

(Kassambara, 2017)

CLARA

CLARA (Clustering Large Applications, Kaufman and Rousseeuw (1990)) es una extensión de los métodos k-medoids para manejar datos que contienen una gran cantidad de objetos (más de varios miles de observaciones) para reducir el tiempo de cálculo y el problema de almacenamiento de RAM. .Esto se logra utilizando el método de muestreo.

CLARA repite los procesos de muestreo y agrupación un número predeterminado de veces para minimizar el sesgo de muestreo. Los resultados finales del agrupamiento corresponden al conjunto de medoides con el costo mínimo.

El algoritmo es el siguiente:

  1. Divida aleatoriamente los conjuntos de datos en múltiples subconjuntos con tamaño fijo (tamaño de muestra)

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

  3. Calcular la media (o la suma) de las diferencias de las observaciones a su medoid más cercano. Esto se utiliza como una medida de la bondad de la agrupación.

  4. Conservar el conjunto de subdatos para el que la media (o la suma) es mínima. Se lleva a cabo un análisis adicional en la partición final.

(Kassambara, 2017)

Nubes Dinamicas

Se basa en que cada clúster debe tener una representación llamada núcleo o centroide de clúster para, posteriormente, hacer una búsqueda iterada de centroides y de clúster, por lo que cada clase estará representada por un núcleo, que será un elemento representativo de todos los que integran la misma.

Los pasos del algoritmo son los siguientes:

  1. Se establece un conjunto de “k” núcleos iniciales

  2. Fase de asignación: Se forma un clúster, asignando cada individuo al clúster más próximo mediante el cálculo de la distancia al centroide.

  3. Fase de representación: Se calculan los centroides de los clúster y se toman como nuevos centroides.

  4. Se repiten los pasos 2 y 3 hasta alcanzar un determinado criterio de convergencia, cuando las clases se estabilizan.

Búsqueda de densidad

La idea principal de este tipo de métodos, es identificar los clústers y sus parámetros de distribución, haciendo crecer una determinada agrupación hasta que la densidad del clúster vecino o más próximo sobrepase un cierto umbral (es decir, que contenga un determinado número de individuos dentro del clúster).

Block - Clustering

El objetivo de este método es encontrar sub-matrices, con filas y columnas con una alta correlación, pero uno de los problemas que plantean es que el número de clúster a calcular debe de ser suministrado previamente al cálculo del algoritmo. Sin embargo, estas estrategias sólo pueden ser realizadas utilizando algoritmos de una vía y existe una falta de enfoque claro para conseguir el mejor número de clústers en algoritmos de “Block-Clustering”. (Charrad et al., 2010)

Análisis Factorial tipo Q

El objetivo consiste en encontrar grupos de individuos con valores semejantes en las variables, con la finalidad de determinar un número reducido de clúster, de los que se espera que los individuos contenidos en cada uno de ellos tengan algún tipo de propiedad común. El método parte de la matriz de correlaciones entre individuos y somete los factores encontrados a una rotación ortogonal (Vallejo, 1992)

Medidas de similitud Linkage

library(cluster)
library(factoextra)
library(ggplot2)
data("USArrests") #Cargar la data
df <- scale(USArrests) # Estandarizar los datos
res.dist <- dist(df, method = "euclidean") # Calcular la matriz de disimilitud
# df = los datos estandarizados
as.matrix(res.dist)[1:6, 1:6] # Refleja la matriz
##             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
res.hc <- hclust(d = res.dist, method = "ward.D2")# El dendograma se puede producir en R usando el función base (res.hc), es la salida de hclust().
fviz_dend(res.hc, cex = 0.5) # fviz_dend() para producir un dendrograma.

4. Del texto: Kassambara, A. (2017). Practical Guide to Cluster Analysis in R: Unsupervised Machine Learning (Multivariate Analysis) (1st ed.). STHDA, desarrolle los ejemplos presentados en los capítulos: 4,5,6,7,8,9.

Ejemplo Capitulo 4 Agrupación de K-Means

# Especificacion del número de agrupaciones a ser generado.
library(ggplot2)
library(factoextra)
data("USArrests")
df <- scale(USArrests)
fviz_nbclust(df, kmeans, method = "wss") +
  geom_vline(xintercept = 4, linetype = 2)

El gráfico representa la varianza dentro de los grupos. Disminuye a medida que aumenta k. Esta curva indica que los grupos adicionales despues del cuarto su valor disminuye.

Cálculo de clústeres de k-medias

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"
library(kableExtra)
## Warning in !is.null(rmarkdown::metadata$output) && rmarkdown::metadata$output
## %in% : 'length(x) = 4 > 1' in coercion to 'logical(1)'
# Calcular la media de cada variable por conglomerados

aggregate(USArrests, by = list(cluster = km.res$cluster), mean) %>%
  kable(caption = "Media de cada variable por conglomerados",
        align = "c",
        digits = 6) %>%
  kable_classic_2(html_font = "Luminari",
                  lightable_options = c("basic","hover", "striped")) %>%
  row_spec(0,
           bold = TRUE,
           monospace = TRUE,
           italic = FALSE,
           color = "# 2a0b23",
           background = "#c4a8bb")
Media de cada variable por conglomerados
cluster Murder Assault UrbanPop Rape
1 13.93750 243.62500 53.75000 21.41250
2 3.60000 78.53846 52.07692 12.17692
3 5.65625 138.87500 73.87500 18.78125
4 10.81538 257.38461 76.00000 33.19231
# clasificaciones de puntos a los datos originales
library(factoextra)
dd <- cbind(USArrests, cluster = km.res$cluster)
head(dd) %>% 
   kable(caption = "Clasificaciones de Puntuaciones",
        align = "c",
        digits = 6) %>%
  kable_classic_2(html_font = "Luminari",
                  lightable_options = c("basic","hover", "striped")) %>%
  row_spec(0,
           bold = TRUE,
           monospace = TRUE,
           italic = FALSE,
           color = "# 2a0b23",
           background = "#c4a8bb")
Clasificaciones de Puntuaciones
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
# Número de conglomerado para cada una de las observaciones
km.res$cluster
##        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
# Tamaño de cluster
km.res$size
## [1]  8 13 16 13
# Medios de clúster
library(factoextra)
km.res$centers %>% 
   kable(caption = "Medios de cluster",
        align = "c",
        digits = 6) %>%
  kable_classic_2(html_font = "Luminari",
                  lightable_options = c("basic","hover", "striped")) %>%
  row_spec(0,
           bold = TRUE,
           monospace = TRUE,
           italic = FALSE,
           color = "#2a0b23",
           background = "#c4a8bb")
Medios de cluster
Murder Assault UrbanPop Rape
1.411890 0.874335 -0.814521 0.019271
-0.961541 -1.106601 -0.930107 -0.966763
-0.489438 -0.382600 0.575830 -0.261654
0.695070 1.039441 0.722637 1.276940
# Visualización de clústeres de k-medias

library(factoextra)
library(ggrepel)
fviz_cluster(
  km.res,
  data = df,
  palette = c("#2a0b23", "#c4a8bb", "#ff7c43", "#008cd4"),
  ellipse.type = "euclid",
  # Elipse de concentración
  star.plot = TRUE,
  # Agregar segmentos de centroides a elementos
  repel = TRUE,
  # Evite el sobretrazado de etiquetas (lento)
  ggtheme = theme_minimal()
)

fuente: en base a los ejempos del capitulo 4 (Kassambara, 2017)

Ejemplo capitulo 5 K-medoides

library(cluster)
library(factoextra)
fviz_nbclust(df, pam, method = "silhouette")+ # La idea es calcular el algoritmo PAM usando diferentes valores de grupos k.
theme_minimal()

El siguiente código R calcula el algoritmo PAM con k = 2

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"

Agregacion de las clasificaciones de puntos a los datos originales

library(factoextra)
dd <- cbind(USArrests, cluster = pam.res$cluster)
head(dd) %>%
kable(caption = "Clasificaciones de Puntos",
        align = "c",
        digits = 6) %>%
  kable_classic_2(html_font = "Luminari",
                  lightable_options = c("basic","hover", "striped")) %>%
  row_spec(0,
           bold = TRUE,
           monospace = TRUE,
           italic = FALSE,
           color = "# 2a0b23",
           background = "#c4a8bb")
Clasificaciones de Puntos
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
Arkansas 8.8 190 50 19.5 2
California 9.0 276 91 40.6 1
Colorado 7.9 204 78 38.7 1

Accediendo a los resultados de la función pam()

# Medoides de clúster
pam.res$medoids %>%
kable(caption = "Medoides de clúster",
        align = "c",
        digits = 6) %>%
  kable_classic_2(html_font = "Luminari",
                  lightable_options = c("basic","hover", "striped")) %>%
  row_spec(0,
           bold = TRUE,
           monospace = TRUE,
           italic = FALSE,
           color = "# 2a0b23",
           background = "#c4a8bb")
Medoides de clúster
Murder Assault UrbanPop Rape
New Mexico 0.829294 1.370809 0.308122 1.160320
Nebraska -0.800825 -0.825077 -0.244564 -0.505211
# Números de clúster
head(pam.res$clustering) 
##    Alabama     Alaska    Arizona   Arkansas California   Colorado 
##          1          1          1          2          1          1
fviz_cluster(pam.res,
palette = c("#B23AEE","#66CD00"), # Paleta de colores
ellipse.type = "t", # Elipse de concentracion
repel = TRUE, # Evitar el exceso de etiqueta (lento)
ggtheme = theme_light() 
)

fuente: en base a los ejempos del capitulo 5 (Kassambara, 2017)

Ejemplo Capitulo 6: CLARA - Agrupamiento grande Aplicaciones

# Reproduccion del resultado usando la función set.seed().
set.seed(1234)
# Genera 500 objetos, divididos en 2 grupos..
df_CLARA <- rbind(cbind(rnorm(200, 0, 8), rnorm(200, 0, 8)),
                  cbind(rnorm(300, 50, 8), rnorm(300, 50, 8)))
# Especificar nombres de columnas y filas
colnames(df_CLARA) <- c("x", "y")
rownames(df_CLARA) <- paste0("S", 1:nrow(df_CLARA))
# Vista previa de los datos
head(df_CLARA, nrow = 10) %>% 
kable(caption = "Datos Aleatorios",
        align = "c",
        digits = 6) %>%
  kable_classic_2(html_font = "Luminari",
                  lightable_options = c("basic","hover", "striped")) %>%
  row_spec(0,
           bold = TRUE,
           monospace = TRUE,
           italic = FALSE,
           color = "# 2a0b23",
           background = "#c4a8bb")
Datos Aleatorios
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
library(cluster)
library(factoextra)
fviz_nbclust(df_CLARA, clara, method = "silhouette")+
theme_classic()

# Calcular CLARA 
clara.res <- clara(df_CLARA, 2, samples = 50, pamLike = TRUE)
# Imprimir componentes de clara.res
print(clara.res)
## Call:     clara(x = df_CLARA, 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"
# Agregacion de las clasificaciones de puntos a los datos originales
library(factoextra)
dd_CLARA <- cbind(df_CLARA, cluster = clara.res$cluster)
head(dd_CLARA, n = 4) %>% 
kable(caption = "Clasificaciones de Puntos",
        align = "c",
        digits = 6) %>%
  kable_classic_2(html_font = "Luminari",
                  lightable_options = c("basic","hover", "striped")) %>%
  row_spec(0,
           bold = TRUE,
           monospace = TRUE,
           italic = FALSE,
           color = "# 2a0b23",
           background = "#c4a8bb")
Clasificaciones de Puntos
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
# Medoides
clara.res$medoids %>% 
kable(caption = "Medoides",
        align = "c",
        digits = 6) %>%
  kable_classic_2(html_font = "Luminari",
                  lightable_options = c("basic","hover", "striped")) %>%
  row_spec(0,
           bold = TRUE,
           monospace = TRUE,
           italic = FALSE,
           color = "# 2a0b23",
           background = "#c4a8bb")
Medoides
x y
S121 -1.531137 1.145057
S455 48.357304 50.233499
# Agrupación
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 de clústeres CLARA

fviz_cluster(clara.res,
palette = c("#4E9D53", "#CD6E94"), # color palette
ellipse.type = "t", # Concentration ellipse
geom = "point", pointsize = 1,
ggtheme = theme_linedraw()
)

fuente: en base a los ejempos del capitulo 6 (Kassambara, 2017)

Ejemplo Capitulo 7: Agrupación aglomerativa

# Calculo la matriz de disimilitud
# df = los datos estandarizados
res.dist <- dist(df, method = "euclidean")
as.matrix(res.dist)[1:6, 1:6] %>% 
kable(caption = "matriz de disimilitud",
        align = "c",
        digits = 6) %>%
  kable_classic_2(html_font = "Luminari",
                  lightable_options = c("basic","hover", "striped")) %>%
  row_spec(0,
           bold = TRUE,
           monospace = TRUE,
           italic = FALSE,
           color = "# 2a0b23",
           background = "#c4a8bb")
matriz de disimilitud
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
# El dendograma se puede producir en R usando el función base (res.hc), es la salida de hclust().
res.hc <- hclust(d = res.dist, method = "ward.D2")
# cex: tamaño de la etiqueta
library("factoextra")
fviz_dend(res.hc, cex = 0.5)
## Warning: `guides(<scale> = FALSE)` is deprecated. Please use `guides(<scale> =
## "none")` instead.

# Calcular la distancia cofentica
res.coph <- cophenetic(res.hc)
# Correlación entre distancia cofenética y
# la distancia original
cor(res.dist, res.coph)
## [1] 0.6975266
# Metodo de vinculacion promedio
res.hc2 <- hclust(res.dist, method = "average")
# Calcular la distancia cofentica
cor(res.dist, cophenetic(res.hc2))
## [1] 0.7180382
# Cortar el árbol en 4 grupos
grp <- cutree(res.hc, k = 4)
head(grp, n = 4)
##  Alabama   Alaska  Arizona Arkansas 
##        1        2        2        3
# Numero de miembros en cada grupo
table(grp)
## grp
##  1  2  3  4 
##  7 12 19 12
# Obtener los nombres de los miembros del clúster 1
rownames(df)[grp == 1]
## [1] "Alabama"        "Georgia"        "Louisiana"      "Mississippi"   
## [5] "North Carolina" "South Carolina" "Tennessee"
# Obtener los nombres de los miembros del clúster 2
rownames(df)[grp == 2]
##  [1] "Alaska"     "Arizona"    "California" "Colorado"   "Florida"   
##  [6] "Illinois"   "Maryland"   "Michigan"   "Nevada"     "New Mexico"
## [11] "New York"   "Texas"
# Obtener los nombres de los miembros del clúster 3
rownames(df)[grp == 3]
##  [1] "Arkansas"      "Connecticut"   "Delaware"      "Hawaii"       
##  [5] "Indiana"       "Kansas"        "Kentucky"      "Massachusetts"
##  [9] "Missouri"      "New Jersey"    "Ohio"          "Oklahoma"     
## [13] "Oregon"        "Pennsylvania"  "Rhode Island"  "Utah"         
## [17] "Virginia"      "Washington"    "Wyoming"
# Obtener los nombres de los miembros del clúster 4
rownames(df)[grp == 4]
##  [1] "Idaho"         "Iowa"          "Maine"         "Minnesota"    
##  [5] "Montana"       "Nebraska"      "New Hampshire" "North Dakota" 
##  [9] "South Dakota"  "Vermont"       "West Virginia" "Wisconsin"
# Cortar en 4 grupos y colorear por grupos
fviz_dend(res.hc, k = 4, # Corta en 4 grupos
cex = 0.5, # Tamaño de la etiqueta
k_colors = c("#4A3D8D", "#922C33", "#005923", "#B23A6E"),
color_labels_by_k = TRUE, # etiquetas de color por grupos
rect = TRUE # Agregue un rectángulo alrededor de los grupos
)
## Warning: `guides(<scale> = FALSE)` is deprecated. Please use `guides(<scale> =
## "none")` instead.

# visualizar el resultado en un diagrama de dispersión.
fviz_cluster(list(data = df, cluster = grp),
palette = c("#4A3D8D", "#922C33", "#005923", "#B23A6E"),
ellipse.type = "convex", # elipse de concentracion
repel = TRUE, # Evitar el exceso de etiqueta (lento)
show.clust.cent = FALSE, ggtheme = theme_minimal())

library("cluster")
# Anidamiento aglomerativo (agrupación jerárquica)
res.agnes <- agnes(x = USArrests, # Matriz de datos
stand = TRUE, # Estandarizar los datos
metric = "euclidean", # Métrica para matriz de distancia
method = "ward" # Método de vinculación
)
fviz_dend(res.agnes, cex = 0.6, k = 4) # Visualizar dendograma
## Warning: `guides(<scale> = FALSE)` is deprecated. Please use `guides(<scale> =
## "none")` instead.

# Agrupamiento de análisis divisivo
res.diana <- diana(x = USArrests, # matriz de datos
stand = TRUE, # Estandarizar los datos
metric= "euclidean" # Métrica para matriz de distancia
)
fviz_dend(res.diana, cex = 0.6, k = 4)
## Warning: `guides(<scale> = FALSE)` is deprecated. Please use `guides(<scale> =
## "none")` instead.

fuente: en base a los ejempos del capitulo 7 (Kassambara, 2017)

Ejemplo Capitulo 8: Comparación de dendogramas

# Preparando los datos
data("USArrests") # Cargando el data set de R base
df <- scale(USArrests)
# Subconjunto que contiene 10 filas
set.seed(123)
ss <- sample(1:50, 10)
df <- df[ss,]
# Comparación visual de dos dendrogramas
library(dendextend)
# Calcular matriz de distancia
res.dist <- dist(df, method = "euclidean")
# Calcular 2 agrupaciones jerárquicas
hc1 <- hclust(res.dist, method = "average")
hc2 <- hclust(res.dist, method = "ward.D2")
# Crear dos dendogramas
dend1 <- as.dendrogram (hc1)
dend2 <- as.dendrogram (hc2)
# Crear una lista para contener dendogramas
dend_list <- dendlist(dend1, dend2)
# Dibuja un tanglegrama
tanglegram(dend1, dend2)

# Personalizacion del tanglegrama
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("entanglement =", round(entanglement(dend_list), 2))
)

# Matriz de correlación cofenética
cor.dendlist(dend_list, method = "cophenetic")
##           [,1]      [,2]
## [1,] 1.0000000 0.9925544
## [2,] 0.9925544 1.0000000
# Matriz de correlación de Baker
cor.dendlist(dend_list, method = "baker")
##           [,1]      [,2]
## [1,] 1.0000000 0.9895528
## [2,] 0.9895528 1.0000000
# Coeficiente de correlación cofenético
cor_cophenetic(dend1, dend2)
## [1] 0.9925544
# Coeficiente de correlación de Baker
cor_bakers_gamma(dend1, dend2)
## [1] 0.9895528
# Crear múltiples dendrogramas encadenando
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
# Calcular matriz de correlación
dend_list <- dendlist("Complete" = dend1, "Single" = dend2,
"Average" = dend3, "Centroid" = dend4)
cors <- cor.dendlist(dend_list)
# Imprimir matriz de correlación
round(cors, 2) %>% 
kable(caption = "matriz de correlación",
        align = "c",
        digits = 6) %>%
  kable_classic_2(html_font = "Luminari",
                  lightable_options = c("basic","hover", "striped")) %>%
  row_spec(0,
           bold = TRUE,
           monospace = TRUE,
           italic = FALSE,
           color = "# 2a0b23",
           background = "#c4a8bb")
matriz de correlación
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
# Visualice la matriz de correlación usando el paquete corrplot
library(corrplot)
corrplot(cors, "pie", "lower")

fuente: en base a los ejempos del capitulo 8 (Kassambara, 2017)

Ejemplo Capítulo 9 Visualización de dendogramas

# Cargar la DATA
data(USArrests)
# Calcular distancias y agrupamiento jerárquico
dd <- dist(scale(USArrests), method = "euclidean")
hc <- hclust(dd, method = "ward.D2")
fviz_dend(hc, cex = 0.5) # Dendograma

# Visualización de dendogramas
fviz_dend(hc, cex = 0.5,
main = "Dendrogram - ward.D2",
xlab = "Objects", ylab = "Distance", sub = "")

# Dibujar un dendograma horizontal
fviz_dend(hc, cex = 0.5, horiz = TRUE)

library(dendextend)
library(factoextra)
fviz_dend(hc, k = 4, # Cortar en 4 grupos
palette = "jco", rect = TRUE, rect_fill = TRUE, rect_border = "jco", labels_track_height = 1.8 )

library(dendextend)
library(factoextra)
fviz_dend(hc, k = 4, # Cortar en 4 grupos
cex = 0.5, # Tamaño de la etiqueta
k_colors = c("#2E9FDF", "#00AFBB", "#E7B800", "#FC4E07"),
color_labels_by_k = TRUE, # Etiquetas de colores por grupos
ggtheme = theme_gray() # Cambio de tema
)

fviz_dend(hc, cex = 0.5, k = 4, # Cortar en 4 grupos
k_colors = "jco")

# Dendograma horizontal con un rectángulo alrededor de los grupos
fviz_dend(hc, k = 4, cex = 0.4, horiz = TRUE, k_colors = "jco",
rect = TRUE, rect_border = "jco", rect_fill = TRUE)

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

require("igraph")
# Arbol de tipo filogénico
fviz_dend(hc, k = 4, k_colors = "jco",
type = "phylogenic", repel = TRUE)

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

# Zoom en el dendrograma
fviz_dend(hc, xlim = c(1, 20), ylim = c(1, 8))

# Crea una gráfica de todo el dendrograma,
# y extraer los datos del dendrograma
dend_plot <- fviz_dend(hc, k = 4, # Corta en 4 grupos
cex = 0.5, # Tamaño de la etiqueta
k_colors = "jco"
)
dend_data <- attr(dend_plot, "dendrogram") # Extraer datos de dendrograma
# Cortar el dendograma a la altura h = 10
dend_cuts <- cut(dend_data, h = 10)
# Visualiza la versión truncada que contiene
# dos ramas
fviz_dend(dend_cuts$upper)

# Trazar todo el dendograma
print(dend_plot)

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

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

fviz_dend(dend_cuts$lower[[2]], type = "circular")

# Código R estándar para crear un dendrograma:
data <- scale(USArrests)
dist.res <- dist(data)
hc <- hclust(dist.res, method = "ward.D2")
dend <- as.dendrogram(hc)
plot(dend)

# Código R para crear un dendrograma usando un operador de encadenamiento:
library(dendextend)
dend <- USArrests[1:5,] %>% # data
scale %>% # Escalar los datos
dist %>% # Calcular una matriz de distancia,
hclust(method = "ward.D2") %>% # Agrupación jerárquica
as.dendrogram # Convertir el objeto en un dendrograma.
plot(dend)

library(dendextend)
# 1. Crear un dendrograma personalizado
mycols <- c("#2E9FDF", "#00AFBB", "#E7B800", "#FC4E07")
dend <- as.dendrogram(hc) %>%
set("branches_lwd", 1) %>% # Ancho de línea de ramas
set("branches_k_color", mycols, k = 4) %>% # Ramas de colores por grupos
set("labels_colors", mycols, k = 4) %>% # Etiquetas de colores por grupos
set("labels_cex", 0.5) # Cambiar tamaño de etiqueta
# 2. Crear grafico
fviz_dend(dend)

fuente: en base a los ejempos del capitulo 9 (Kassambara, 2017)

Bibliografía

Aldas Manzano, J., & Uriel Jimenez, E. (2017). Análisis multivariante aplicado con r. Ediciones Paraninfo, SA.
AN�LISIS CLUSTER. (n.d.). https://www.uv.es/ceaces/multivari/cluster/CLUSTER2.htm.
Commission, J. R. C.-E. et al. (2008). Handbook on constructing composite indicators: Methodology and user guide. OECD publishing.
De La Fuente, S. (Ed.). (2011). Analisis conglomerados. Facultad de Ciencias Economicas y Empresariales, Universidad Autonoma de Madrid UAM. Madrid, Espana.
Hojas, I. M. (2020). Agrupación en clúster jerárquica. https://www.statdeveloper.com/agrupacion-en-cluster-jerarquica/; Ignacio Moreno Hojas.
Kassambara, A. (2017). Practical guide to cluster analysis in r: Unsupervised machine learning. STHDA. https://books.google.com.sv/books?id=-q3snAAACAAJ