UNIVERSIDAD DE EL SALVADOR
FACULTAD DE CIENCIAS
ECONÓMICAS
ESCUELA DE ECONOMIA
METODOS PARA EL ANALISIS ECONOMICO
CICLO 2 - 2025
CATEDRÁTICO:
Carlos Ademir Perez Alas
Trabajo de investigacion - Analisis de conglomerados
INTEGRANTES:
Carlos Felipe Belloso Castillo
Ricardo José Mendez Lopez
El análisis de conglomerados constituye una herramienta esencial dentro de la exploración estadística, especialmente útil para enfrentar problemas de clasificación.
Se ubica en el ámbito de los métodos de aprendizaje no supervisados y su objetivo central es organizar un conjunto de elementos en grupos. La finalidad es garantizar que la semejanza entre las observaciones de un mismo grupo sea lo más alta posible, mientras que las diferencias entre los distintos grupos resulten igualmente marcadas.
Esta técnica permite descubrir patrones y estructuras latentes que no son evidentes a primera vista, pero que, una vez identificados, aportan gran valor. Con frecuencia, dichas estructuras sirven como base para diseñar esquemas formales de clasificación.
Los procedimientos más habituales para realizar análisis de conglomerados se dividen en dos grandes categorías: métodos jerárquicos y métodos no jerárquicos. En esencia, la técnica busca agrupar observaciones individuales cumpliendo dos condiciones fundamentales:
Homogeneidad intragrupo: cada conjunto debe ser internamente consistente, de modo que las observaciones que lo integran presenten gran similitud en función de las variables consideradas.
Heterogeneidad intergrupo: los diferentes grupos deben diferenciarse claramente entre sí, atendiendo al conjunto de variables analizadas.
Fuente adaptada: Aldás Manzano, J. & Uriel Jiménez, E. (2007)
|
Análisis de cluster |
Técnicas disponibles |
Ventajas |
Desventajas |
|
Jerárquico aglomerativo: Cada individuo es un grupo en sí mismo. Sucesivamente se van formando grupos de mayor tamaño fusionando grupos 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. |
Fuente: Elaboracion propia con informacion tomada de analisis multivariante aplicado en R, Multivariate Analysis I
Técnicas no jerárquicas
El objetivo principal de esta técnica es minimizar la variación total dentro de cada clúster, asignando observaciones a grupos donde los objetos dentro del mismo clúster sean lo más similares posible (alta similitud intraclase) y los de clústeres diferentes sean disímiles (baja similitud interclase). Cada clúster se representa por su centroide (la media de los puntos asignados a él).
De las ventajas que podemos mencionar sobre esta técnica es simple, rápido y eficiente, aunque presenta sensibilidad a la inicialización aleatoria, a valores atípicos 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
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.
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.
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).
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.
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).
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.
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).
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.
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).
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
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.
# Computek-meanswith k= 4
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.
# 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
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()
)
Estimación de números óptimos de clústeres
library(cluster)
## Warning: package 'cluster' was built under R version 4.4.3
fviz_nbclust(df.1, pam, method = "silhouette")+
theme_classic()
Según el gráfico, el número sugerido de grupos es 2.
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"
#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
fviz_cluster(pam.res,
palette = c("#00AFBB", "#FC4E07"), # color palette
ellipse.type = "t", # Concentration ellipse
repel = TRUE, # Avoid label overplotting (slow)
ggtheme = theme_classic()
)
set.seed(1234)
# Generate 500 objects, divided into 2 clusters.
df.2 <- rbind(cbind(rnorm(200,0,8), rnorm(200,0,8)),
cbind(rnorm(300,50,8), rnorm(300,50,8)))
# Specify column and row names
colnames(df.2) <- c("x", "y")
rownames(df.2) <- paste0("S", 1:nrow(df.2))
# Previewing the data
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
fviz_nbclust(df.2, clara, method = "silhouette")+
theme_classic()
# Compute CLARA
clara.res <- clara(df.2, 2, samples = 50, pamLike = TRUE)
# Print components of clara.res
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"
fviz_cluster(clara.res,
palette=c("#00AFBB","#FC4E07"),#color palette
ellipse.type="t",# Concentrationellipse
geom="point",pointsize=1,
ggtheme=theme_classic()
)
# Compute the dissimilarity matrix
# df = the standardized data
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
res.hc<-hclust(d=res.dist,method="ward.D2")
# cex:labelsize
fviz_dend(res.hc,cex=0.5)
# Compute cophentic distance
res.coph <- cophenetic(res.hc)
# Correlation between cophenetic distance and
# the original distance
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
# Cut tree into 4 groups
grp <- cutree(res.hc, k=4)
head(grp, n=4)
## Alabama Alaska Arizona Arkansas
## 1 2 2 3
# Number of members in each cluster
table(grp)
## grp
## 1 2 3 4
## 7 12 19 12
# Get the names for the members of cluster 1
rownames(df.1)[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
)
### Visualización en un diagrama de dispersión
fviz_cluster(list(data=df.1,cluster=grp),
palette=c("#2E9FDF","#00AFBB","#E7B800","#FC4E07"),
ellipse.type="convex",# Concentration ellipse
repel=TRUE,#Avoid labeloverplotting (slow)
show.clust.cent=FALSE,ggtheme=theme_minimal())
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")
# Agglomerative Nesting (Hierarchical Clustering)
res.agnes <- agnes(x=USArrests, # data matrix
stand = TRUE, # Standardize the data
metric = "euclidean", # metric for distance matrix
method = "ward" # Linkage method
)
# DIvisive ANAlysis Clustering
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)
set.seed(123)
ss <- sample(1:50, 10)
df.3 <- df.1[ss,]
library(dendextend)
## Warning: package 'dendextend' was built under R version 4.4.3
# Compute distance matrix
res.dist <- dist(df.3, 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)
# dibujo del tanglegrama
tanglegram(dend1,dend2)
# Personalización del tanglegrama
tanglegram(dend1,dend2,
highlight_distinct_edges=FALSE,# Turn-off dashedlines
common_subtrees_color_lines=FALSE,#Turn-off line colors
common_subtrees_color_branches=TRUE,# Colorcommonbranches
main=paste("entanglement=",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.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
# 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)
## Warning: package 'corrplot' was built under R version 4.4.3
## corrplot 0.95 loaded
corrplot(cors, "pie", "lower")
## 9. Visualización de dendrogramas
# Compute distances and hierarchical clustering
dd <- dist(scale(USArrests), method = "euclidean")
hc <- hclust(dd, method = "ward.D2")
#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")
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)
Retomando los datos de Wine Dataset for Clustering disponibles en https://www.kaggle.com/datasets
library(readr)
## Warning: package 'readr' was built under R version 4.4.3
library(factoextra)
library(cluster)
datos <- read_csv("C:/Users/ricar/Downloads/wine-clustering.csv")
## Rows: 178 Columns: 13
## ── Column specification ────────────────────────────────────────────────────────
## Delimiter: ","
## dbl (13): Alcohol, Malic_Acid, Ash, Ash_Alcanity, Magnesium, Total_Phenols, ...
##
## ℹ 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.
head(datos)
## # A tibble: 6 × 13
## Alcohol Malic_Acid Ash Ash_Alcanity Magnesium Total_Phenols Flavanoids
## <dbl> <dbl> <dbl> <dbl> <dbl> <dbl> <dbl>
## 1 14.2 1.71 2.43 15.6 127 2.8 3.06
## 2 13.2 1.78 2.14 11.2 100 2.65 2.76
## 3 13.2 2.36 2.67 18.6 101 2.8 3.24
## 4 14.4 1.95 2.5 16.8 113 3.85 3.49
## 5 13.2 2.59 2.87 21 118 2.8 2.69
## 6 14.2 1.76 2.45 15.2 112 3.27 3.39
## # ℹ 6 more variables: Nonflavanoid_Phenols <dbl>, Proanthocyanins <dbl>,
## # Color_Intensity <dbl>, Hue <dbl>, OD280 <dbl>, Proline <dbl>
###Estandarización de la data
# eliminar datos perdidos
datos <- na.omit(datos)
# estandarizar
datos <- scale(datos)
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 51, 62, 65
##
## Cluster means:
## Alcohol Malic_Acid Ash Ash_Alcanity Magnesium Total_Phenols
## 1 0.1644436 0.8690954 0.1863726 0.5228924 -0.07526047 -0.97657548
## 2 0.8328826 -0.3029551 0.3636801 -0.6084749 0.57596208 0.88274724
## 3 -0.9234669 -0.3929331 -0.4931257 0.1701220 -0.49032869 -0.07576891
## Flavanoids Nonflavanoid_Phenols Proanthocyanins Color_Intensity Hue
## 1 -1.21182921 0.72402116 -0.77751312 0.9388902 -1.1615122
## 2 0.97506900 -0.56050853 0.57865427 0.1705823 0.4726504
## 3 0.02075402 -0.03343924 0.05810161 -0.8993770 0.4605046
## OD280 Proline
## 1 -1.2887761 -0.4059428
## 2 0.7770551 1.1220202
## 3 0.2700025 -0.7517257
##
## Clustering vector:
## [1] 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2
## [38] 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 3 3 1 3 3 3 3 3 3 3 3 3 3 3 2
## [75] 3 3 3 3 3 3 3 3 3 1 3 3 3 3 3 3 3 3 3 3 3 2 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3
## [112] 3 3 3 3 3 3 3 1 3 3 2 3 3 3 3 3 3 3 3 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1
## [149] 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1
##
## Within cluster sum of squares by cluster:
## [1] 326.3537 385.6983 558.6971
## (between_SS / total_SS = 44.8 %)
##
## Available components:
##
## [1] "cluster" "centers" "totss" "withinss" "tot.withinss"
## [6] "betweenss" "size" "iter" "ifault"
aggregate(datos,by=list(cluster=kmeans$cluster),mean)
## cluster Alcohol Malic_Acid Ash Ash_Alcanity Magnesium
## 1 1 0.1644436 0.8690954 0.1863726 0.5228924 -0.07526047
## 2 2 0.8328826 -0.3029551 0.3636801 -0.6084749 0.57596208
## 3 3 -0.9234669 -0.3929331 -0.4931257 0.1701220 -0.49032869
## Total_Phenols Flavanoids Nonflavanoid_Phenols Proanthocyanins
## 1 -0.97657548 -1.21182921 0.72402116 -0.77751312
## 2 0.88274724 0.97506900 -0.56050853 0.57865427
## 3 -0.07576891 0.02075402 -0.03343924 0.05810161
## Color_Intensity Hue OD280 Proline
## 1 0.9388902 -1.1615122 -1.2887761 -0.4059428
## 2 0.1705823 0.4726504 0.7770551 1.1220202
## 3 -0.8993770 0.4605046 0.2700025 -0.7517257
clusters_data<-cbind(datos,cluster=kmeans$cluster)
head(clusters_data,5)
## Alcohol Malic_Acid Ash Ash_Alcanity Magnesium Total_Phenols
## [1,] 1.5143408 -0.56066822 0.2313998 -1.1663032 1.90852151 0.8067217
## [2,] 0.2455968 -0.49800856 -0.8256672 -2.4838405 0.01809398 0.5670481
## [3,] 0.1963252 0.02117152 1.1062139 -0.2679823 0.08810981 0.8067217
## [4,] 1.6867914 -0.34583508 0.4865539 -0.8069748 0.92829983 2.4844372
## [5,] 0.2948684 0.22705328 1.8352256 0.4506745 1.27837900 0.8067217
## Flavanoids Nonflavanoid_Phenols Proanthocyanins Color_Intensity Hue
## [1,] 1.0319081 -0.6577078 1.2214385 0.2510088 0.3611585
## [2,] 0.7315653 -0.8184106 -0.5431887 -0.2924962 0.4049085
## [3,] 1.2121137 -0.4970050 2.1299594 0.2682629 0.3174085
## [4,] 1.4623994 -0.9791134 1.0292513 1.1827317 -0.4263410
## [5,] 0.6614853 0.2261576 0.4002753 -0.3183774 0.3611585
## OD280 Proline cluster
## [1,] 1.8427215 1.01015939 2
## [2,] 1.1103172 0.96252635 2
## [3,] 0.7863692 1.39122370 2
## [4,] 1.1807407 2.32800680 2
## [5,] 0.4483365 -0.03776747 2
#Medias
kmeans$centers
## Alcohol Malic_Acid Ash Ash_Alcanity Magnesium Total_Phenols
## 1 0.1644436 0.8690954 0.1863726 0.5228924 -0.07526047 -0.97657548
## 2 0.8328826 -0.3029551 0.3636801 -0.6084749 0.57596208 0.88274724
## 3 -0.9234669 -0.3929331 -0.4931257 0.1701220 -0.49032869 -0.07576891
## Flavanoids Nonflavanoid_Phenols Proanthocyanins Color_Intensity Hue
## 1 -1.21182921 0.72402116 -0.77751312 0.9388902 -1.1615122
## 2 0.97506900 -0.56050853 0.57865427 0.1705823 0.4726504
## 3 0.02075402 -0.03343924 0.05810161 -0.8993770 0.4605046
## OD280 Proline
## 1 -1.2887761 -0.4059428
## 2 0.7770551 1.1220202
## 3 0.2700025 -0.7517257
kmeans$size
## [1] 51 62 65
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 wine_clustering")
Los clusters demuestran como se relacionan entre si cada una de las observaciones donde cada una de ellas (las observaciones) poseen un color que las caracteriza enfatizando el cluster al que pertenecen donde tambien se dibuja una elipse alrededor de cada grupo.