A31-Tarea de investigación de Clusters

1. ANÁLISIS DE CONGLOMERADO

El análisis de conglomerado aborda problemas de clasificación siendo una herramienta de ánalisis exploratorio estadística. Su objetivo es organizar un conjunto de elementos en grupo garantizando la semejanza entre las observaciones de un mismo grupo sea lo más alta posible, mientras que las diferencias entre los distintos grupos resulten ser marcadas, por lo cual, permite descubrir patrones y estructuras latentes que no son vistas en primera instancia pero una vez identificadas aportan un valor significativo, dichas estructuras por lo general sirven para diseñar esquemas formales de clasificación.

Los procedimientos más habituales para realizar análisis de conglomerados se dividen en dos grandes grupos categóricos:

  • Métodos jerárquicos
  • Métodos no jerárquicos

La técnica busca agrupar observaciones individuales cumpliendo dos condiciones fundamentales:

  • Homogeneidad intragrupos: cada grupo debe de ser consistente internamente, de manera que las observaciones que lo intregan presenten gran similitud en función de las variables consideradas
  • Heregoneidad intergrupos: Deben de diferenciarse entre sí los diferentes grupos, atendiendo al conjunto de variables análizadas

Fuente adaptada: Aldás Manzano, J. & Uriel Jiménez, E. (2007)

2. CUADRO COMPARATIVO, ANÁLISIS DE CLÚSTER

Análisis de cluster

Técnicas disponibles

Ventajas

Desventajas

Jerárquico aglomerativo: Cada individuo es un grupo en sí mismo. Seguidamente se forman grupos de mayor tamaño fusi&ntild;n de mayor tamaño entre sí. Finalmente todos los individuos confluyen en un solo grupo.

Jerárquico desagregativos: Los individuos forman un único grupo y se van sucesivamente desgajando de él, formando dos grupos, tres grupos, hasta que al final del proceso cada caso forma un único grupo.

Método del centroide: Comienza uniendo aquellas dos observaciones que están más cercanas, luego, el grupo formado es sustituido por una observación que lo representa y en la que las variables toman valores medios de todas las observaciones que constituyen al grupo representado.

Método del vecino más cercano: En este método la distancia entre dos grupos es aquella que se da entre los dos miembros más cercanos a ese grupo

Método del vecino más lejano: La distancia entre dos grupos se mide por la distancia entre sus miembros mas alejados.

Método de la vinculación del promedio: La distancia entre dos grupos se obtiene calculando la distancia promedio entre todos los pares de observaciones que pueden formarse tomando un miembro de un grupo y otro miembro del otro grupo.

Método de ward: Este método no calcula la distancia entre los distintos conglomerados para decidir cuáles se deben fusionar. Su objetivo es maximizar la homogeneidad en cada conglomerado. Plantea todas las posibles combinaciones de observaciones para el número de grupos que se estén considerando en cada etapa concreta.

Método del centroide: Tiende a producir clusters que están bien separados entre sí. Al calcular la distancia entre los centroides (promedio geométrico de todos los puntos en un cluster), se tiene en cuenta la distribución de todos los puntos de un grupo, no solo el punto más cercano o el más lejano, como ocurre con otros métodos.

Método del vecino más cercano: el método más simple y computacionalmente eficiente porque sólo requiere encontrar la distancia mínima entre los límites de los dos grupos.no presenta inversiones en el dendrograma.

Método del vecino más lejano: su principal ventaja es que tiende a formar clusters compactos y bien definidos de forma esférica o globular, ya que el criterio para la fusión es el "punto de unión más débil" (la distancia máxima). elimina el problema del encadenamiento, ya que un punto intermedio no puede forzar la unión de dos grandes clusters si la distancia máxima es grande. no presenta inversiones en el dendrograma.

Método de la vinculación del promedio: Ofrece un balance entre la tendencia del Vecino Más Cercano a formar cadenas y la tendencia del Vecino Más Lejano a formar clusters muy compactos.

Tiende a producir clusters que son razonablemente compactos y separados, ofreciendo resultados de buena calidad en muchas aplicaciones.

El método de la vinculación promedio no presenta el problema de las inversiones en el dendrograma, lo que facilita su interpretación.

Al promediar todas las distancias, es menos sensible a los valores atípicos que los métodos que se basan en una sola distancia mínima o máxima.

Método de ward:  Es el mejor método para producir clusters que son compactos y tienen tamaños aproximadamente uniformes, ya que su objetivo es minimizar la dispersión interna (varianza).

Es muy efectivo para identificar estructuras de clusters subyacentes cuando estas son de forma esférica o globular.

El dendrograma resultante es siempre monotónico, es decir, los niveles de fusión aumentan constantemente, lo que facilita una interpretación jerárquica clara.

Método del centroide: Es posible que la distancia entre los centroides de dos clusters que se van a fusionar sea menor que la distancia de fusión de una etapa anterior. Tiende a funcionar mejor cuando los clusters tienen formas esféricas o compactas.

Método del vecino más cercano: La vinculación simple tiende a unir clusters grandes a través de una serie de puntos intermedios formando cadenas largas y delgadas. Esto hace que los clusters resultantes sean difíciles de interpretar y poco compactos. Es extremadamente sensible a los valores atípicos.  Debido al efecto encadenamiento, es menos efectivo para aislar clusters compactos y esféricos

Metodo del vecino mas lejano: un solo punto atípico en el borde de un cluster puede aumentar significativamente la distancia de vinculación máxima, impidiendo que el cluster se fusione con otros hasta muy tarde en el proceso.

Funciona mal cuando los clusters tienen formas no esféricas o alargadas, ya que intenta forzar la división o agrupación de las estructuras en formas más compactas y redondas.

Método de la vinculación del promedio:Es más intensivo desde el punto de vista computacional que los métodos de Vinculación Simple y Completa, ya que requiere calcular y promediar todas las distancias por pares entre los miembros de los dos clusters en cada paso de fusión.Puede tener dificultades con estructuras de cluster muy complejas o alargadas.El valor de la distancia promedio de fusión en el dendrograma es a menudo menos intuitivo de interpretar que la distancia mínima

Método de ward: Es muy sensible a los valores atípicos (outliers), ya que el cálculo se basa en la suma de los cuadrados de las distancias (similar a la varianza), lo que magnifica el efecto de los puntos extremos.

Funciona de manera óptima solo si se asume que los clusters tienen una forma esférica. Si los datos contienen clusters alargados o de formas irregulares, Ward puede agruparlos incorrectamente.

Para que la propiedad de minimizar la varianza se cumpla estadísticamente, generalmente se recomienda usar la distancia euclídea al cuadrado como medida de disimilitud.

No jerárquico: Los grupos no se forman en un proceso secuencial de fusión de grupos de menor tamaño. Se establece un número de grupos inicialmente y los individuos se van clasificando en cada uno de esos grupos y cada grupo es lo más distinto posible de los demás.

Agrupamiento k-medias: El algoritmo de k-means es un método de partición que divide un conjunto de datos en k grupos, donde cada observación pertenece al grupo con la media más cercana. El objetivo es dividir n observaciones en k grupos en los que cada observación pertenece al grupo cuya media (centroide) es más cercana, como prototipo del grupo.El objetivo es minimizar las distancias dentro de los clusters, es decir, minimizar la suma total de las distancias cuadradas entre cada punto y el centroide del cluster al que pertenece.

Método-PAM: Divide un conjunto de datos en un número predefinido de grupos (k clústeres). Representa cada clúster con un “medoide” (un punto real del dataset que minimiza la disimilitud total con los otros puntos del clúster)

Metodo CLARA: En lugar de procesar todo el dataset, usa muestreo para reducir tiempo de cómputo y memoria RAM: extrae múltiples subconjuntos de tamaño fijo, aplica PAM a cada uno para encontrar medoides óptimos, asigna el dataset completo a estos medoides y selecciona el subconjunto con el costo mínimo (disimilitud promedio entre objetos y su medoide más cercano).

Agrupamiento k-medias: Funciona rápido incluso con grandes volúmenes de datos, pues su complejidad es relativamente baja. Es uno de los métodos de clustering más utilizados en minería de datos por su rapidez. Cada cluster queda representado por un centroide que describe su “promedio” o perfil.

Metodo PAM: Al utilizar un medoide (un punto de datos existente) en lugar de una media (centroide), PAM es mucho menos sensible a los outliers. Los valores atípicos tienen un impacto menor en la posición del medoide que en la media, lo que resulta en clusters más estables y representativos. PAM trabaja con una matriz de disimilitud (distancia) entre todos los puntos de datos. Esto le permite utilizar cualquier medida de distancia, como la distancia de Manhattan, la distancia de Gower (útil para variables mixtas), o la distancia euclidiana, mientras que K-Means solo puede usar métricas basadas en la media.

El medoide es un objeto real del conjunto de datos. Esto facilita la interpretación del cluster en términos de un ejemplo concreto o representativo.

Metodo CLARA: CLARA solo aplica PAM sobre una submuestra de los datos. Esto reduce drásticamente el tiempo de cálculo y los requerimientos de memoria RAM, haciendo viable el clustering con k-medoides en bases de datos con decenas de miles o millones de observaciones.

Dado que CLARA ejecuta el algoritmo PAM sobre la submuestra, mantiene la ventaja inherente de k-medoides: el uso de medoides (puntos de datos reales) en lugar de centroides (medias). Esto lo hace robusto frente a valores atípicos (outliers), un problema común en el algoritmo K-Means.

CLARA mitiga el problema de la dependencia de los medoides iniciales al repetir el proceso de muestreo y clustering varias veces. Selecciona el conjunto final de medoides que produce la mejor calidad de clustering (generalmente medido por la disimilitud promedio) entre todas las muestras ejecutadas.

Agrupamiento k-medias: El algoritmo no determina k de forma automática; se necesita usar criterios como el “codo”. La media se desplaza fácilmente, lo que puede alterar los centroides. K-means utiliza medias, así que solo sirve para variables numéricas continuas.

Metodo PAM: El algoritmo PAM tiene una alta complejidad computacional, especialmente en las etapas de cálculo de la matriz de disimilitud y la fase SWAP (intercambio de medoides). Al igual que K-Means, PAM requiere que el usuario especifique el número de clusters ($) de antemano. Determinar el valor óptimo de k puede requerir métodos adicionales (como el método de la silueta).

La selección inicial de los medoides puede afectar el resultado final, aunque su impacto se considera generalmente menor que la sensibilidad de K-Means a la selección inicial de centroides.

Metodo de CLARA: la calidad del clustering resultante depende de qué tan bien esa submuestra represente al conjunto de datos completo. Si la muestra no es lo suficientemente grande o representativa, los medoides encontrados pueden no ser los medoides óptimos de todo el conjunto de datos. Se sacrifica cierta precisión por la velocidad.

El rendimiento de CLARA es sensible al tamaño de la submuestra elegida. Si la muestra es muy pequeña, los resultados pueden ser sesgados. Si es demasiado grande, se pierde la ventaja de velocidad que busca el algoritmo.

Al igual que PAM y K-Means, CLARA es un método de partición que requiere que el usuario especifique el número de clusters (k) antes de ejecutar el algoritmo.

3. TÉCNICAS DISPONIBLES PARA EL ANÁLISIS DE CLÚSTER

Técnicas no jerárquicas.

Agrupamiento K-medias.

Minimiza la variación total dentro de cada clúster mediante la asignación de observaciones a grupos donde los objetos dentro del mismo clúster sean los más similares posibles y los de los diferentes clúster sean disimiles. Cada clúster se representa como la media de los puntos asignados a él o como su centroide.

Siendo una técnica eficiente, rápida y simple que representa sensibilidad a la inicialización aleatoria, a valores atipicos y requiere especificar k previamente

Librería y sintaxis en R

Librería pricipal stats. Para determinar el k óptimo y visualizar resultados, utilizando factoextra. Este paquete facilita gráficos basados en ggplot2 y métodos como el “codo” para estimar k-

Sintaxis básica de kmeans()

Ejemplo:

\(kmeans(x,centers,iter.max=10,nstart=1)\)

  • centers: Los valores posibles son el número de clústeres (k) o un conjunto de centros de clústeres iniciales (distintos). Si se trata de un número, se elige un conjunto aleatorio de filas (distintas) en x como centros iniciales.
  • iter.max: Número máximo de iteraciones permitidas. El valor predeterminado es 10.
  • nstart: El número de particiones de inicio aleatorias cuando los centros son un número. A menudo se recomienda intentar

Método K-medoids o PAM

Esta metodología divide un conjunto de datos en un número predefinido de grupos (k clústeres). Similar a K-means, busca minimizar la variación intraclase, pero en lugar de usar centroides (medias), representa cada clúster con un “medoide” (un punto real del dataset que minimiza la disimilitud total con los otros puntos del clúster). Esto lo hace más robusto a valores atípicos y ruido, ya que no se ve afectado por promedios distorsionados.Funciona con datos no numéricos si se usa una matriz de disimilitud adecuada. Aunque requiere especificar k previamente y es sensible a la inicialización.

Librería y sintaxis en R

Librería principal: cluster para la función pam(). Para determinar el k óptimo, validar y visualizar resultados, usa factoextra. Este paquete, desarrollado por el autor del libro, facilita gráficos basados en ggplot2 y métodos como la silueta para estimar k.

Sintaxis básica: pam()

Ejemplo:

\(pam(x,k,metric="euclidean,"stand=FALSE)\)

X: Los valores posibles incluyen:

Matriz de datos numéricos o trama de datos numéricos: Cada fila corresponde a una observación y cada columna corresponde a una variable.

Matriz de disimilitud: En este caso x es normalmente la salida de daisy() o dist()

  • k: El número de clústeres
  • metric: Las métricas de distancia que se van a utilizar. Las opciones disponibles son “euclidean” y “manhattan.”
  • stand: valor lógico; si es true, las variables (columnas) de x se estandarizan antes de calcular las diferencias. Se ignora cuando x es una matriz de disimilitud.

Método CLARA

CLARA (Clustering Large Applications) es un algoritmo de agrupamiento no jerárquico (por particionamiento) diseñado para datasets grandes, como extensión de PAM (K-medoids). En lugar de procesar todo el dataset, usa muestreo para reducir tiempo de cómputo y memoria RAM: extrae múltiples subconjuntos de tamaño fijo, aplica PAM a cada uno para encontrar medoides óptimos, asigna el dataset completo a estos medoides y selecciona el subconjunto con el costo mínimo (disimilitud promedio entre objetos y su medoide más cercano). Repite el proceso un número predefinido de veces para minimizar sesgos.

Librería y sintaxis en R

Librería principal: cluster para la función clara()

Sintaxis básica de clara():

Ejemplo:

\(clara(x,k,metric="euclidean,"stand=FALSE,samples=5,pamLike=FALSE)\)

  • x: una matriz de datos numéricos o marco de datos, cada fila corresponde a una observación, y cada columna corresponde a una variable. Se permiten los valores que faltan (NAs).
  • k: el número de grupos.
  • métrica: las métricas de distancia que se van a utilizar. Las opciones disponibles son “euclidean” y “manhattan.”
  • stand: valor lógico; si es true, las variables (columnas) de x se estandarizan antes decalcular las diferencias.
  • muestras: número de muestras que deben extraerse del conjunto de datos. El valor predeterminado es 5, pero se recomienda un valor mucho mayor.
  • pamLike: Indicación lógica de si se debe utilizar el mismo algoritmo en la función pam(). Esto siempre debe ser cierto.

Métodos jerárquicos

Método del centroide.

En este método, la distancia entre dos clústeres se define como la distancia entre sus centroides, donde el centroide es el vector medio (promedio) de las observaciones en cada clúster (un vector de longitud igual al número de variables). El algoritmo comienza con cada observación como un clúster individual y fusiona iterativamente los clústeres más cercanos hasta formar un árbol jerárquico (dendrograma). Simple y computacionalmente eficiente para datasets moderados; produce clústeres equilibrados. Pero, puede generar “inversiones” en el dendrograma (fusiones a alturas menores que previas), sensible a outliers (ya que usa promedios) y no siempre garantiza clústeres compactos.

Librería y sintaxis en R

Librería principal: stats (incluida en R base) para la función hclust() (agrupamiento jerárquico). Para visualizar el dendrograma y validar resultados

Sintaxis básica de hclust():

Ejemplo:

\(hclust(d,method="centroid",members=NULL)\)

  • d: Matriz de disimilitud (generada con dist(x, method = “euclidean”); estandariza los datos previamente con scale() .
  • method: Método de enlace; usa “centroid” para este caso (otros: “single”, “complete”, “average”, “ward.D2”, etc.).
  • members: Opcional; vector con tamaños de grupos iniciales (por defecto NULL para observaciones individuales).

Método del vecino más cercano.

El método del vecino cercano (también conocido como enlace mínimo, enlace simple o “single linkage”) es un enfoque de agrupamiento jerárquico aglomerativo. En este método, la distancia entre dos clústeres se define como la distancia mínima entre cualquier par de puntos de los dos clústeres . El algoritmo comienza con cada observación como un clúster individual y fusiona iterativamente los clústeres más cercanos hasta formar un dendrograma. Esto tiende a producir clústeres largos y “laxos” (cadenas), ya que une grupos basados en la conexión más cercana, lo que puede capturar estructuras elongadas pero es sensible a ruido y outliers.

Calcula la matriz de distancias

  • Fusiona los clústeres con la menor distancia mínima entre puntos.
  • Repite hasta un solo clúster. **Este método es bueno para detectar clústeres no esféricos o cadenas; computacionalmente eficiente. Aunque puede crear clústeres desequilibrados y es vulnerable a puentes de ruido entre grupos.*

Librería y sintaxis en R Librería principal: stats (incluida en R base) para la función hclust() (agrupamiento jerárquico).

Para visualizar el dendrograma y validar resultados

Sintaxis básica de hclust():

\(hclust(d,method="single",members=NULL)\)

  • d: Matriz de disimilitud (generada con dist(x, method = “euclidean”); estandariza los datos previamente con scale().
  • method: Método de enlace; usa “single” para este caso (otros: “complete”, “average”, “centroid”, “ward.D2”, etc.).
  • members: Opcional; vector con tamaños de grupos iniciales (por defecto NULL para observaciones individuales).

Método de la vinculación del promedio:

En este método, la distancia entre dos clústeres se define como la distancia promedio (media aritmética) entre todos los pares de puntos de los dos clústeres (promedio de todas las distancias por pares entre elementos del grupo 1 y elementos del grupo 2). El algoritmo comienza con cada observación como un clúster individual y fusiona iterativamente los clústeres más cercanos hasta formar un dendrograma. Esto produce clústeres más equilibrados que el enlace simple, pero menos compactos que el completo.

Calcula la matriz de distancias.

  • Fusiona los clústeres con la menor distancia promedio entre pares.
  • Repite hasta un solo clúster. Librería y sintaxis en R Librería principal: stats (incluida en R base) para la función hclust() (agrupamiento jerárquico).

Para visualizar el dendrograma y validar resultados

Sintaxis básica de hclust()

\(hclust(d,method="average",members=NULL)\)

  • d: Matriz de disimilitud (generada con dist(x, method = “euclidean”); estandariza los datos previamente con scale().
  • method: Método de enlace; usa “average” para este caso (otros: “single”, “complete”, “centroid”, “ward.D2”, etc.).
  • members: Opcional; vector con tamaños de grupos iniciales (por defecto NULL para observaciones individuales).

Método de Ward.

Es un enfoque de agrupamiento jerárquico aglomerativo que minimiza la varianza total dentro de los clústeres (suma de cuadrados de errores) en cada paso de fusión. La distancia entre dos clústeres se basa en el aumento de la varianza al unirlos, fusionando aquellos que producen el menor incremento. Esto resulta en clústeres compactos y esféricos, comenzando con observaciones individuales y construyendo un dendrograma iterativamente.

Calcula la matriz de distancia. * Fusiona los clústeres que minimizan el aumento en la varianza intraclase. * Repite hasta un solo clúster. **Librería y sintaxis en R Librería principal: stats (incluida en R base) para la función hclust() (agrupamiento jerárquico).* Para visualizar el dendrograma y validar resultados

Sintaxis básica de hclust()

\(hclust(d,method="ward.D2",members=NULL)\)

  • d: Matriz de disimilitud (generada con dist(x, method = “euclidean”); estandariza los datos previamente con scale().
  • method: Método de enlace; usa “ward.D2” (recomendado, corrige por distancias cuadradas) o “ward.D” (versión original).
  • members: Opcional; vector con tamaños de grupos iniciales (por defecto NULL para observaciones individuales).

4.Rjemplos presentados en los capítulos: 4,5,6,7,8,9

4. Agrupamiento KMeans

4.3 Cálculo de la agrupación kmeans en R

Datos

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

Estimación del número optimo de clústeres

library(factoextra)
 fviz_nbclust(df.1, kmeans, method = "wss")+
 geom_vline(xintercept = 4, linetype = 2)

El grafico muestra la varianza dentro de los grupos, un \(K= 4\) indica que los grupos más alla de 4 tienen poco valor.

Cálculo de la agrupación K-means

 set.seed(123)
 km.res<-kmeans(df.1,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"

Se Observa una matriz que muestra las medias de los clústeres y el vector de agrupamiento que indica el clúster en el que pertenece cada variable.

Acceso a los resultados de la función kmeans()

# Número de clúster para cada observación
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 clúster
km.res$size
## [1]  8 13 16 13
# agrupación de medias
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 clústeres kmeans

library(ggplot2)
library(ggpubr)
fviz_cluster(
  km.res,
  data = df.1,
  palette = c("#fc0905", "#fcb205", "#05fc22", "#0515fc"),
  ellipse.type = "euclid",
  star.plot = TRUE,
  repel = TRUE,
  ggtheme = theme_minimal()
)

5. Cálculo de PAM en R

Estimación de números óptimos de clústeres

 library(cluster)
 fviz_nbclust(df.1, pam, method = "silhouette")+
 theme_classic()

Según el gráfico, el número sugerido de grupos es 2.

Cálculo de la agrupación PAM

 pam.res<-pam(df.1,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"

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

#medoides en cúmulos
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
#números de clúster
head(pam.res$clustering)
##    Alabama     Alaska    Arizona   Arkansas California   Colorado 
##          1          1          1          2          1          1

Visualización de clústeres PAM

fviz_cluster(pam.res,
 palette = c("#00AFBB", "#FC4E07"), 
 ellipse.type = "t", 
 repel = TRUE, 
 ggtheme = theme_classic()
 )

6. CLARA-agrupación grande

Preparación de datos

 set.seed(1234)

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

 colnames(df.2) <- c("x", "y")
 rownames(df.2) <- paste0("S", 1:nrow(df.2))

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

Estimación de número optimo de clústeres

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

Cálculo de CLARA

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

 print(clara.res)
## Call:     clara(x = df.2, 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"

Visualización de clústeres CLARA

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

7. Agrupamiento aglomerativo

Medidas de similitud

 res.dist <- dist(df.1, 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

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

Dendrograma

 fviz_dend(res.hc,cex=0.5)

Verificar el árbol de clústeres

 res.coph <- cophenetic(res.hc)
 cor(res.dist, res.coph)
## [1] 0.6975266
 res.hc2 <- hclust(res.dist, method = "average")
 cor(res.dist, cophenetic(res.hc2))
## [1] 0.7180382

El coeficiente de correlación muestra que el us de un método de enlace diferente crea un árbol que representa las distancias originales un poco mejor

Dividir el dendrograma en diferentes grupos

 grp <- cutree(res.hc, k=4)
 head(grp, n=4)
##  Alabama   Alaska  Arizona Arkansas 
##        1        2        2        3
 table(grp)
## grp
##  1  2  3  4 
##  7 12 19 12
 rownames(df.1)[grp == 1]
## [1] "Alabama"        "Georgia"        "Louisiana"      "Mississippi"   
## [5] "North Carolina" "South Carolina" "Tennessee"
 fviz_dend(res.hc, k=4, 
 cex = 0.5, 
 k_colors = c("#2E9FDF", "#00AFBB", "#E7B800", "#FC4E07"),
 color_labels_by_k = TRUE, 
 rect = TRUE 
 )

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

Paquete Cluster R

Proporciona las funciones agnes() y diana() para calcular la agrupación aglomerativa y divisiva, respectivamente. Estas funciones realizan todos los pasos necesarios automáticamente. No es necesario ejecutar las funciones scale(), dist() y hclust() por separado

 library("cluster")

 res.agnes <- agnes(x=USArrests, 
 stand = TRUE, 
 metric = "euclidean", 
 method = "ward" 
 )

 res.diana <- diana(x=USArrests,
 stand = TRUE,
 metric = "euclidean" 
 )
 fviz_dend(res.agnes, cex = 0.6, k=4)

8. Comparación de dendrogramas

Preparación de datos

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

Comparación de dendrogramas

 library(dendextend)

 res.dist <- dist(df.3, method = "euclidean")

 hc1 <- hclust(res.dist, method = "average")
 hc2 <- hclust(res.dist, method = "ward.D2")

 dend1 <- as.dendrogram (hc1)
 dend2 <- as.dendrogram (hc2)

 dend_list <- dendlist(dend1, dend2)

Comparación visual de dos dendrogramas

# dibujo del tanglegrama
tanglegram(dend1,dend2)

# Personalización del tanglegrama 
 tanglegram(dend1,dend2,
 highlight_distinct_edges=FALSE,
 common_subtrees_color_lines=FALSE,
 common_subtrees_color_branches=TRUE,
 main=paste("entanglement=",round(entanglement(dend_list),2))
 )

Matriz de correlación entre una lista de dendrogramas

 cor.dendlist(dend_list, method = "cophenetic")
##           [,1]      [,2]
## [1,] 1.0000000 0.9925544
## [2,] 0.9925544 1.0000000
 cor.dendlist(dend_list, method = "baker")
##           [,1]      [,2]
## [1,] 1.0000000 0.9895528
## [2,] 0.9895528 1.0000000
 cor_cophenetic(dend1, dend2)
## [1] 0.9925544
 cor_bakers_gamma(dend1, dend2)
## [1] 0.9895528
 dend1 <- df.3 %>% dist %>% hclust("complete")%>%as.dendrogram
 dend2 <- df.3 %>% dist %>% hclust("single")%>%as.dendrogram
 dend3 <- df.3 %>% dist %>% hclust("average")%>%as.dendrogram
 dend4 <- df.3 %>% dist %>% hclust("centroid")%>%as.dendrogram

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

 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
 library(corrplot)
## corrplot 0.95 loaded
 corrplot(cors, "pie", "lower")

##9. Visualización de dendrogramas

 dd <- dist(scale(USArrests), method = "euclidean")
 hc <- hclust(dd, method = "ward.D2")

Visualización de dendrogramas

#Dendrograma básico
fviz_dend(hc, cex = 0.5)

#cambiar titulos
fviz_dend(hc, cex = 0.5,
 main = "Dendrograma- ward.D2",
 xlab = "Objetos", ylab = "Distancia", sub = "")

#Crear dendrograma horizontal
 fviz_dend(hc, cex = 0.5, horiz = TRUE)

# Partición de los datos en múltiples grupos

 fviz_dend(
  hc,
  k = 4,
  cex = 0.5,

  k_colors = c("#2E9FDF", "#00AFBB", "#E7B800", "#FC4E07"),
  color_labels_by_k = TRUE,

  ggtheme = theme_gray() 
)

 # Cambiar colores del grupo usando "jco"
 
fviz_dend(hc,
          cex = 0.5,
          k = 4,
        
          k_colors = "jco")

# dendograma horizontal con un rectangulo al rededor

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"
)

# Creación de un árbol filogénico
require("igraph")
fviz_dend(
  hc,
  k = 4,
  k_colors = "jco",
  type = "phylogenic",
  repel = TRUE
)

# Usando "layout.gem" para el árbol filogénico

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

Dendrograma con grandes conjuntos de datos

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

# Cortar el dendrograma y visualizar la versión truncada

dend_plot <- fviz_dend(hc,
                       k = 4,
                     
                       cex = 0.5,
                     
                       k_colors = "jco")
dend_data <-
  attr(dend_plot, "dendrogram") 


# Cortar el dendrograma a la altura h= 10
dend_cuts <- cut(dend_data, h = 10)

fviz_dend(dend_cuts$upper)

print(dend_plot)

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

fviz_dend(dend_cuts$lower[[2]], main = "Subtree 2")

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

Manipulación de dendrogramas usando dendextend

dist.res <- dist(df.1)
hc <- hclust(dist.res, method = "ward.D2")
dend <- as.dendrogram(hc)
plot(dend)

# Creación de dendrograma con operador de encadenamiento
library(dendextend)
dend <- USArrests[1:5, ] %>% 
  scale %>% 
  dist %>% 
  hclust(method = "ward.D2") %>% 
  as.dendrogram 
plot(dend)

# Dendrograma personalizado

mycols <- c("#2E9FDF", "#00AFBB", "#E7B800", "#FC4E07")
dend <- as.dendrogram(hc) %>%
  set("branches_lwd", 1) %>% 
  set("branches_k_color", mycols, k = 4) %>% 
  set("labels_colors", mycols, k = 4) %>% 
  set("labels_cex", 0.5) 
fviz_dend(dend)

5. Ejemplo de aplicación de Análisis de Cluster

Retomando el Conjunto de datos de clústeres K-Means Dataset for Clustering disponibles en https://www.kaggle.com/datasets

Carga y preparación de datos

library(readr)
library(factoextra)
library(cluster)
datos <- read_csv("C:/Users/karla/Downloads/cluster_data.csv")
## Rows: 500 Columns: 2
## ── Column specification ────────────────────────────────────────────────────────
## Delimiter: ","
## dbl (2): Feature 1, Feature 2
## 
## ℹ Use `spec()` to retrieve the full column specification for this data.
## ℹ Specify the column types or set `show_col_types = FALSE` to quiet this message.
datos <- na.omit(datos)

datos <- scale(datos)
head(datos)
##       Feature 1   Feature 2
## [1,]  0.2122363 -0.96387251
## [2,] -0.4795386  0.47535878
## [3,]  0.1658521  0.88094739
## [4,] -0.8197521  0.21461956
## [5,] -0.4658753  0.05403269
## [6,]  1.7931621 -1.35007594

Estimación de número de Clúster

fviz_nbclust(x=datos ,FUNcluster = kmeans,method = "wss",
             k.max = 15,
             diss = get_dist(datos,method = "euclidean"),
             nstart=50)+labs(title="Número de clusters")+
  
  xlab(label = "Total de clusters")+
  ylab(label = "Suma de cuadrados")+geom_hline(yintercept = 1500)

set.seed(50)
kmeans<-kmeans(datos,3,nstart=25)
print(kmeans)
## K-means clustering with 3 clusters of sizes 100, 139, 261
## 
## Cluster means:
##    Feature 1 Feature 2
## 1  1.8284985 -1.411781
## 2 -0.6525619  1.247490
## 3 -0.3530412 -0.123460
## 
## Clustering vector:
##   [1] 3 3 2 3 3 1 3 1 3 3 2 3 3 2 3 1 3 1 3 3 3 1 3 3 3 2 3 3 2 3 3 2 3 2 3 3 3
##  [38] 1 1 1 2 1 3 3 3 3 1 3 3 2 2 1 3 3 1 3 1 1 2 3 3 1 3 3 2 2 3 2 3 3 3 3 3 1
##  [75] 3 3 3 3 3 3 3 2 2 3 1 3 1 3 3 3 3 2 2 3 1 3 3 3 2 2 3 2 2 3 2 3 1 3 3 3 3
## [112] 3 3 1 1 2 2 2 3 1 1 2 3 2 3 3 1 3 2 2 2 3 2 1 2 1 1 1 2 3 3 2 3 3 3 1 1 2
## [149] 3 3 2 2 2 3 3 2 3 3 2 3 2 1 3 3 3 3 3 3 1 3 3 2 1 1 3 2 3 2 3 2 3 2 2 1 3
## [186] 1 3 3 2 1 2 3 1 3 3 3 3 1 2 2 3 2 2 2 2 3 1 3 3 3 1 2 3 2 1 2 1 3 3 3 3 3
## [223] 1 1 1 2 3 1 1 3 3 3 2 2 2 3 2 3 1 2 3 3 2 1 3 3 2 2 3 1 1 2 3 3 3 2 3 3 3
## [260] 2 1 3 2 3 3 3 1 3 3 3 3 2 3 3 2 3 2 3 2 2 3 3 3 3 2 3 2 3 2 1 3 3 2 3 3 1
## [297] 2 3 1 2 1 3 3 3 2 3 1 3 3 2 1 2 3 1 3 3 2 1 1 1 2 2 3 3 3 2 1 1 3 3 2 3 3
## [334] 3 2 3 3 2 3 1 3 2 3 1 3 3 3 2 3 3 3 3 3 3 3 3 2 3 3 1 3 3 1 2 2 3 3 3 2 2
## [371] 3 3 1 3 3 3 1 3 2 3 1 1 2 1 1 2 2 1 3 2 2 2 3 1 1 1 1 3 2 3 2 3 1 3 3 3 3
## [408] 2 3 2 1 3 1 2 3 3 1 2 3 3 1 3 2 3 3 3 3 2 3 2 2 1 2 3 2 3 3 2 3 2 3 1 2 2
## [445] 2 3 3 3 2 2 2 3 1 3 3 3 1 3 2 3 1 2 2 1 3 3 2 3 3 3 1 3 2 3 2 3 2 1 3 1 3
## [482] 1 3 1 3 2 3 2 2 2 3 1 3 3 3 1 2 3 3 3
## 
## Within cluster sum of squares by cluster:
## [1]  12.62821  35.62263 104.07944
##  (between_SS / total_SS =  84.7 %)
## 
## Available components:
## 
## [1] "cluster"      "centers"      "totss"        "withinss"     "tot.withinss"
## [6] "betweenss"    "size"         "iter"         "ifault"
aggregate(datos,by=list(cluster=kmeans$cluster),mean)
##   cluster  Feature 1 Feature 2
## 1       1  1.8284985 -1.411781
## 2       2 -0.6525619  1.247490
## 3       3 -0.3530412 -0.123460
clusters_data<-cbind(datos,cluster=kmeans$cluster)
head(clusters_data,5)
##       Feature 1   Feature 2 cluster
## [1,]  0.2122363 -0.96387251       3
## [2,] -0.4795386  0.47535878       3
## [3,]  0.1658521  0.88094739       2
## [4,] -0.8197521  0.21461956       3
## [5,] -0.4658753  0.05403269       3

Tamaño de Clústeres

#Medias
kmeans$centers
##    Feature 1 Feature 2
## 1  1.8284985 -1.411781
## 2 -0.6525619  1.247490
## 3 -0.3530412 -0.123460

Media de los clusters

kmeans$size
## [1] 100 139 261

Graficando los Clusters

fviz_cluster(
  kmeans,
  data =  datos,
  palette=c("purple","blue","green"),
  ellipse.type = "convex",
  star.plot=TRUE,
  repel = TRUE,
  pointsize = 0.5,
  ggtheme = theme_minimal()
)+labs(title="Gráfico de cluster_data")