UNIVERSIDAD DE EL SALVADOR
FACULTAD DE CIENCIAS ECONÓMICAS
ESCUELA DE ECONOMÍA
CICLO II-2022
Laboratorio 2 Análisis de Clúster (Conglomerados)
MÉTODOS PARA EL ANÁLISIS ECONÓMICO
Docente:
Carlos Ademir Pérez Alas
Integrantes:
Blanco Ochoa, José Alejandro BO20007
Bonilla Melara, Jeffry Isaac BM20033
Iraheta Mendoza, Ana Sofía IM19002
Mejía Platero, Roberto Moisés MP19056
Palacios Zuniga, Luis Alexander PZ18008
Grupo Teórico
03
Grupo de Trabajo
San Salvador, Ciudad Universitaria, 25 de Noviembre del 2022
El análisis de clúster o también llamado análisis de conglomerados, es una técnica diseñada para clasificar distintas observaciones en grupos, de tal forma que cada grupo (clúster o conglomerado) sea homogéneo respecto a las variables utilizadas para caracterizarlo, es decir, que cada observación obtenida en el sea parecida a todas las que estén incluidas en ese grupo; además otra característica es que los grupos sean lo mas distintos posibles uno de otros respecto a las variables consideradas. (Aldas)
El Análisis Clúster es una técnica descriptiva, ateórica y no inferencial que no tiene bases estadísticas sobre las que deducir inferencias estadísticas para una población a partir de una muestra, es un método basado en criterios geométricos y se utiliza fundamentalmente como una técnica exploratoria, descriptiva pero no explicativa. Las soluciones no son únicas, en la medida en que la pertenencia al conglomerado para cualquier número de soluciones depende de muchos elementos del procedimiento elegido. Por otra parte, la solución clúster depende totalmente de las variables utilizadas, la adición o destrucción de variables relevantes puede tener un impacto substancial sobre la solución resultante (fuente)
Pasos para el análisis clúster:
• Se tiene información de n casos y k variables.
• Se establece un indicador que nos diga en qué medida cada par de observaciones se parece entre sí (distancia o similitud).
• Se crean los grupos de acuerdo con la medida de similitud o distancia anterior. Hay dos tipos de creación de grupos y varios métodos de agrupación.
• Se describen los grupos obtenidos y se comparan unos con otros.
• Validación del análisis
(Lo indicado en rojo corresponde a los elementos a redactar, en la versión a ser entregada debe aparecer el texto negro normal).
|
Análisis de Clúster |
Técnicas disponibles |
Ventajas |
Desventajas |
|
Jerárquico: Este es un método
alternativo a la agrupación en clústeres de particiones para agrupar objetos en
función de su similitud. La agrupación jerárquica no requiere especificar el
número de clústeres que se producirán. |
Aglomerativo Divisivo |
No es necesario
especificar el número de clústeres necesarios para el algoritmo. El clustering jerárquico
es sencillo de implementar. El dendrograma
producido es muy útil para la comprensión de los datos. |
El algoritmo no puede
deshacer ninguno de los pasos anteriores. Si el algoritmo agrupa dos puntos,
el programa no es capaz de deshacer este paso. La complejidad del
tiempo para el clustering puede dar lugar a tiempos de cálculo muy largos. Si hay un conjunto de
datos grandes, puede ser complicado determinar el número correcto de
clústeres por el dendograma. |
|
No jerárquico: Este es una serie de
métodos de agrupación que se utilizan para clasificar las observaciones
dentro de un conjunto de datos, en varios grupos en función de su
similitud. |
K-means K-Medoids
(PAM) Clustering
Large Applications (CLARA) Block
- Clustering Análisis Factorial tipo Q |
Estos
métodos son una alternativa robusta para dividir un conjunto de datos en
grupos de observación. La
agrupación en clústeres de K-means es un algoritmo
simple y rápido. Puede lidiar
de manera eficiente con conjuntos grandes de datos. |
Es
necesario que se conozcan los datos y se indique el número apropiado de
clústeres que se van a producir. Los
resultados obtenidos son sensibles a la selección aleatoria inicial de los
clústeres. Es sensible
a los valores atípicos. Si
reorganiza sus datos, es muy posible que obtenga una solución diferente cada
vez que cambie el orden de estos. |
Fuente: Elaboración propia con base en “Kassambara, A. (2017). Obtenido de Practical Guide To Cluster Analysis in R. Unsupervised Machine Learning.”
Con base a información extraída de (Kassambara, 2017):
Este trata a cada objeto como un clúster único, luego los pares de clústeres se unen sucesivamente hasta crear un gran clúster que contiene todos los objetos. El resultado de esto es un árbol (representación de los objetos) denominado dendrograma, donde la agrupación de este funciona “de abajo hacia arriba”. En otras palabras, cada objeto al inicio es considerado como un grupo de un solo elemento (una hoja) y en cada paso del algoritmo, los dos grupos que son los más parecidos se combinan en un nuevo grupo más grande (nodos), repitiéndose hasta que todos los puntos son miembros de un gran clúster (raíz). Esta agrupación aglomerativa es buena para identificar agrupaciones pequeñas.
Métodos:
Simple Linkage (Vecino más cercano): Una vez conocida las distancias existentes entre cada dos individuos, se observa cua´les son los más próximos en cuanto a distancia o similaridad (menor distancia o mayor similaridad). Ambos individuos que cumplan con lo anterior mencionado forman un grupo que no se separa durante el proceso.
Complete Linkage (Vecino más lejano): El agrupamiento de enlaces completos es la distancia entre los elementos más distantes en cada grupo.
Average Linkage (Promedio entre grupos): Este método presenta la ventaja de que aprovecha la información de todos los miembros de los conglomerados que se comparan uniéndolos previamente. La distancia entre dos conglomerados se calcula como la distancia promedio existente entre todos los miembros del conglomerado unión de ambos.
Método del Centroide: Este método es espacio-conservativo, pero presenta el inconveniente de dejarse influir excesivamente por los grupos de mayor tamaño.
Método de la Mediana: La mayor desventaja del método del centroide es que si se fusionan dos grupos de diferente tamaño, el centroide del nuevo grupo queda más cerca del grupo de mayor tamaño y más alejado del de menor tamaño en proporción a sus diferencias de tamaño. Esto trae como consecuencia que durante el proceso aglomerativo de fusión se van perdiendo paulatinamente las propiedades de los grupos pequeños. Para evitar esto, puede suponerse, con independencia del tamaño que tengan los grupos en realidad, que los grupos son de igual tamaño.
Llevando a cabo esta estrategia, la distancia entre un individuo o grupo K de centroide k y el grupo formado por la fusión de los grupos I y J de centroides i y j viene dada por la mediana del triángulo i,j, k. Razón por la cual Gower propuso el nombre de método (distancia) de la mediana.
Este método es, como el del centroide, espacio-conservativo, aunque también como él no resulta ser invariante ante transformaciones monótonas de la distancia empleada, cosa que sí ocurría con los tres primeros métodos.
Método de Ward: Ward propuso que la pérdida de información que se produce al integrar los distintos individuos en clusters puede medirse a través de la suma total de los cuadrados de las desviaciones entre cada punto (individuo) y la media del cluster en el que se integra. Para que el proceso de clusterización resulte óptimo, en el sentido de que los grupos formados no distorsionen los datos originales, proponía la siguiente estrategia:
En cada paso del análisis se debe considerar la posibilidad de la unión de cada par de grupos y optar por la fusión de dos grupos que menos incrementen la suma de los cuadrados de las desviaciones al unirse.
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 media y suele ser más discriminativo en la determinación de los niveles de agrupación .Una investigación llevada a cabo por Kuiper y Fisher probó que este método era capaz de acertar mejor con la clasificación óptima que otros métodos (mínimo, máximo, media y centroide).
Disociativa
Por otro lado, la inversa de la agrupación aglomerativa es la agrupación divisiva que también es conocida como DIANA (Divise Analysis) y funciona de “arriba hacía abajo”. Comienza con el root, en el que todos los objetos se incluyen en un solo clúster. En cada paso de la iteración, el grupo más heterogéneo se divide en dos. El proceso se repite hasta que todos los objetos están en su propio grupo. Esta agrupación divisiva es buena para identificar grandes agrupaciones.
Se debe seguir los siguientes pasos:
Preparar los datos.
Calcular información de (des) similitud entre cada par de objetos en los datos a colocar.
Uso de la función de vinculación para agrupar objetos en un árbol de clúster jerárquico, según la información de distancia generada en el paso 1. Objetos/grupos que están cerca aproximadamente se vinculan entre sí mediante la función de vinculación.
Determinar dónde cortar el árbol jerárquico en grupos. Esto crea un partición de los datos.
library(cluster)
library(factoextra)
data("USArrests")
df <- scale(USArrests)
res.dist <- dist(df, method = "euclidean")
as.matrix(res.dist)[1:6, 1:6]## Alabama Alaska Arizona Arkansas California Colorado
## Alabama 0.000000 2.703754 2.293520 1.289810 3.263110 2.651067
## Alaska 2.703754 0.000000 2.700643 2.826039 3.012541 2.326519
## Arizona 2.293520 2.700643 0.000000 2.717758 1.310484 1.365031
## Arkansas 1.289810 2.826039 2.717758 0.000000 3.763641 2.831051
## California 3.263110 3.012541 1.310484 3.763641 0.000000 1.287619
## Colorado 2.651067 2.326519 1.365031 2.831051 1.287619 0.000000
res.hc <- hclust(d = res.dist, method = "ward.D2")
fviz_dend(res.hc, cex = 0.5)
Métodos no Jerárquicos:
Este método permite que un individuo asignado a un grupo en un determinado paso del proceso sea reasignado a otro grupo en un paso posterior, si esto optimiza el criterio de selección. El proceso termina cuando no quedan individuos cuya reasignación permita optimizar el resultado que se ha conseguido. Algunos de los algoritmos más conocidos dentro de estos métodos son el método K-means (o K-medias) de McQueen (1967), el Quick Cluster Analysis y el método de Forgy, los cuales se suelen agrupar bajo el nombre de métodos centroides o centros de gravedad.
Este método necesita como dato de entrada el número de grupos en los que se va a segmentar la población. A partir de este número k de clusters, el algoritmo coloca primero k puntos aleatorios (centroides), luego asigna a cualquiera de esos puntos todas las muestras con las distancias más pequeñas.
A continuación, el punto se desplaza a la media de las muestras más cercanas, lo cual generará una nueva asignación de muestras, ya que algunas muestras están ahora más cerca de otro centroide. Este proceso se repite de forma iterativa y los grupos se van ajustando hasta que la asignación no cambia más moviendo los puntos. Este resultado final representa el ajuste que maximiza la distancia entre los distintos grupos y minimiza la distancia intragrupo.
Este algoritmo es n enfoque de agrupación relacionado con la agrupación de k-medias para dividir un conjunto de datos en k grupos o agrupaciones. En la agrupación de k-medoides, cada grupo está representado por uno de los puntos de datos en el grupo. Estos puntos se denominan medoides de racimo.
Cuando decimos medoide nos referimos al objeto dentro de un grupo para el cual la disimilitud promedio entre él y todos los demás miembros del grupo es mínima. Corresponde a el punto más céntrico del grupo. Estos objetos (uno por grupo) se pueden considerar como un ejemplo representativo de los miembros de ese grupo que puede ser útil en algunas situaciones. Recuerde que, en la agrupación de k-medias, el centro de un grupo dado se calcula como el valor medio de todos los puntos de datos en el grupo.
K-medoid es una alternativa sólida al agrupamiento de k-medias. Esto significa que el algoritmo es menos sensible al ruido y valores atípicos, en comparación con k-medias, porque usa medoides como centros de clúster en lugar de medias (usado en k-medias).
El algoritmo k-medoids requiere que el usuario especifique k, el número de clusters que se generarán (como en el clustering de k-means). Un enfoque útil para determinar el número óptimo de conglomerados es el método de silueta, que se describe en las siguientes secciones. El método de agrupamiento de k-medoides más común es el algoritmo PAM (Partitioning Around Medoids, Kaufman & Rousseeuw, 1990).
Este método puede manejar conjuntos de datos mucho más grandes. Internamente, esto se logra considerando subconjuntos de datos de tamaño fijo ( sampsize) de modo que los requisitos de tiempo y almacenamiento se vuelvan lineales en n en lugar de cuadrático
Cada subconjunto de datos se divide en k grupos utilizando el mismo algoritmo que en PAM. Una vez que se han seleccionado objetos representativos del subconjunto de datos, cada observación de todo el conjunto de datos se asigna al medoide más cercano. La media (equivalente a la suma) de las diferencias de las observaciones con su medoide más cercano se usa como una medida de la calidad de la agrupación. Se retiene el subconjunto de datos para el cual la media (o suma) es mínima.
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á repsentada por un núcleo, que será un elemento representativo de todos los que intefran la misma.
Es decir, que en lugar de elegir como referencia de clase un sólo punto que constituye su centro y reasignar los puntos por proximidad a ese centro, se eligen varios puntos “h” para representar cada clase, siendo estos puntos el “núcleo” de la clase.
Este método presenta una aproximación tipológica y una aproximación probabilística. En la primera aproximación, los grupos se forman buscando las zonas en las cuales se da una mayor concentración de individuos. Entre los algoritmos más conocidos dentro de estos métodos están el análisis modal de Wishart, el método de Taxmap de Carmichael y Sneath, y el método de Fortin. En la segunda aproximación, se parte del postulado de que las variables siguen una ley de probabilidad según la cual los parámetros varían de un grupo a otro. Se trata de encontrar los individuos que pertenecen a la misma distribución. Destaca en esta aproximación el método de las combinaciones de Wolf.
Los métodos directos permiten clasificar simultáneamente a los individuos y a las variables. Las entidades agrupadas, ya no son los individuos o las variables, sino que son las observaciones, es decir, los cruces que configuran la matriz de datos.
El obejtivo 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 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 enroque claro para conseguir el mejor número de clústers en algoritmos de “Block-Clustering.”
Consisten en la busqueda de unos factores en el espacio de los individuos que contiene la matriz de datos, donde cada factor corresponde a un clúster y se les cononoce como “Analisis 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 individuios y somete los factores econtrados a una roación ortogonal, el problema es que los individuos pueden pertenecer a varios y, por tanto, los clústers pueden presentar solapamiento, resultando una compleja interpretación.
data("USArrests")
Data_USA<-scale(USArrests)
head(Data_USA, n=6)## Murder Assault UrbanPop Rape
## Alabama 1.24256408 0.7828393 -0.5209066 -0.003416473
## Alaska 0.50786248 1.1068225 -1.2117642 2.484202941
## Arizona 0.07163341 1.4788032 0.9989801 1.042878388
## Arkansas 0.23234938 0.2308680 -1.0735927 -0.184916602
## California 0.27826823 1.2628144 1.7589234 2.067820292
## Colorado 0.02571456 0.3988593 0.8608085 1.864967207
library(factoextra)
fviz_nbclust(Data_USA, kmeans, method = "wss") +
geom_vline(xintercept = 4, linetype = 2) +labs(title = "Número Óptimo de Conglomerados")+
xlab(label = "Número de Grupos")+
ylab(label = "Totales dentro de la suma de cuadrados")Interpretación: El gráfico angterior representa las varianzas dentro de cada “cluster” , en el cual se visualiza que a medida aumenta K (números de grupos), la varianza disminuye. Se puede observar que existe una curva o “codo” cuando el numero de grupos es 4. La cual nos indica que un número mayor de grupos a 4 tienen poco valor. Por lo cual se clasificarán las observaciones en 4 grupos.
set.seed(123)
Kmeans_res<-kmeans(Data_USA, 4, nstart = 25)
print(Kmeans_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"
Es posible calcular la media de cada varaible por clústeres utilizando los data original:
aggregate(USArrests, by=list(cluster=Kmeans_res$cluster), mean)## cluster Murder Assault UrbanPop Rape
## 1 1 13.93750 243.62500 53.75000 21.41250
## 2 2 3.60000 78.53846 52.07692 12.17692
## 3 3 5.65625 138.87500 73.87500 18.78125
## 4 4 10.81538 257.38462 76.00000 33.19231
Si se desea añadir la clasificación de los datos, se realiza de la siguiente manera:
Clasificacion_Kmeans <- cbind(USArrests, cluster = Kmeans_res$cluster)
head(Clasificacion_Kmeans, 10)## 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
## Connecticut 3.3 110 77 11.1 3
## Delaware 5.9 238 72 15.8 3
## Florida 15.4 335 80 31.9 4
## Georgia 17.4 211 60 25.8 1
El número de conglomerado al que pertence cada una de las observaciones
Kmeans_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
head(Kmeans_res$cluster,10)## Alabama Alaska Arizona Arkansas California Colorado
## 1 4 4 1 4 4
## Connecticut Delaware Florida Georgia
## 3 3 4 1
El tamaño que posee cada “cluster”:
Kmeans_res$size## [1] 8 13 16 13
La matriz de las medias de los conglomerados:
Kmeans_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
fviz_cluster(Kmeans_res, data = Data_USA,
palette = c("#2E9FDF", "#00AFBB", "#E7B800", "#FC4E07"),
ellipse.type = "euclid",
star.plot = TRUE, # añadir los segmentos a los centroides o grupos
repel = TRUE, # para que las etiquetas no queden sobrepuestas
ggtheme = theme_minimal()
)+labs(title = "Gráfico de Conglomerados")La data a utilizar será la misma que en el ejemplo anterior(Data_USA).
head(Data_USA,4)## Murder Assault UrbanPop Rape
## Alabama 1.24256408 0.7828393 -0.5209066 -0.003416473
## Alaska 0.50786248 1.1068225 -1.2117642 2.484202941
## Arizona 0.07163341 1.4788032 0.9989801 1.042878388
## Arkansas 0.23234938 0.2308680 -1.0735927 -0.184916602
library(cluster)
library(factoextra)
fviz_nbclust(Data_USA, pam, method = "silhouette")+
theme_classic() +labs(title = "Número Óptimo de Conglomerados")+
xlab(label = "Número de Grupos")+
ylab(label = "Anchura media de la silueta")Como podemos observar del gráfico anterior el número sugerido de conglomerados es 2. Por lo que, en los siguientes procesos se clasificará la información en dos conglomerados.
PAM_res <- pam(Data_USA, 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"
Si se desea añadir la clasificación de los datos, se realiza de la siguiente manera:
Clasificacion_Medoids <- cbind(USArrests, cluster = PAM_res$cluster)
head(Clasificacion_Medoids, n = 10)## 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
## Connecticut 3.3 110 77 11.1 2
## Delaware 5.9 238 72 15.8 2
## Florida 15.4 335 80 31.9 1
## Georgia 17.4 211 60 25.8 1
Visualizar los Medoides a utilizar:
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úmero de clusters al que pertenece cada dato:
head(PAM_res$clustering,10)## Alabama Alaska Arizona Arkansas California Colorado
## 1 1 1 2 1 1
## Connecticut Delaware Florida Georgia
## 2 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()
)+labs(title = "Gráfico de Conglomerados")set.seed(1234)
# Generar 500 objetos en dos clusters.
Data_Cap6 <- rbind(cbind(rnorm(200,0,8), rnorm(200,0,8)),
cbind(rnorm(300,50,8), rnorm(300,50,8)))
# Especificar los nombres de columnas y filas
colnames(Data_Cap6) <- c("x", "y")
rownames(Data_Cap6) <- paste0("S", 1:nrow(Data_Cap6))
# PVisualización de la data
head(Data_Cap6, 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
library(cluster)
library(factoextra)
fviz_nbclust(Data_Cap6, clara, method = "silhouette")+
theme_gray()+labs(title = "Número Óptimo de Conglomerados")+
xlab(label = "Número de Grupos")+
ylab(label = "Anchura media de la silueta")Como podemos observar del gráfico anterior el número sugerido de conglomerados es 2. Por lo que, en los siguientes procesos se clasificará la información en dos conglomerados.
El codigo de R a utilizar, usa el algoritmo PAM con K=2
# Compute CLARA
CLARA_res <- clara(Data_Cap6, 2, samples = 50, pamLike = TRUE)
# Print components of clara.res
print(CLARA_res)## Call: clara(x = Data_Cap6, 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"
Si se desea añadir la clasificación de los datos, se realiza de la siguiente manera:
Clasificacion_CLARA <- cbind(Data_Cap6, cluster = CLARA_res$cluster)
head(Clasificacion_CLARA, n = 4)## x y cluster
## S1 -9.656526 3.881815 1
## S2 2.219434 5.574150 1
## S3 8.675529 1.484111 1
## S4 -18.765582 5.605868 1
Acceder a los medoides a utilizar:
CLARA_res$medoids## x y
## S121 -1.531137 1.145057
## S455 48.357304 50.233499
Cluster al que pertenece cada dato:
head(CLARA_res$clustering,20)## S1 S2 S3 S4 S5 S6 S7 S8 S9 S10 S11 S12 S13 S14 S15 S16 S17 S18 S19 S20
## 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1
fviz_cluster(CLARA_res,
palette = c("#00AFBB", "#FC4E07"),
ellipse.type = "t",
geom = "point", pointsize = 1,
ggtheme = theme_get()
)+labs(title = "Gráfico de Conglomerados")La data a utilizar es la data cargada para el ejemplo del capitulo 4 que es presentada como “Data_USA”, cabe destacar que esta data ya ha sido estandarizada por el comando “scale(data)”
# Load the data
#data("USArrests")
# Standardize the data
#Data_USA <- scale(USArrests)
# Show the first 6 rows
head(Data_USA, nrow = 6)## Murder Assault UrbanPop Rape
## Alabama 1.24256408 0.7828393 -0.5209066 -0.003416473
## Alaska 0.50786248 1.1068225 -1.2117642 2.484202941
## Arizona 0.07163341 1.4788032 0.9989801 1.042878388
## Arkansas 0.23234938 0.2308680 -1.0735927 -0.184916602
## California 0.27826823 1.2628144 1.7589234 2.067820292
## Colorado 0.02571456 0.3988593 0.8608085 1.864967207
Se puede calcular la matriz de distancia de la siguiente manera:
# Calculo de la matriz de disimilitud
Res_Dist <- dist(Data_USA, 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")
head(Res_HC, n=6)## $merge
## [,1] [,2]
## [1,] -15 -29
## [2,] -13 -32
## [3,] -14 -16
## [4,] -23 -49
## [5,] -20 -31
## [6,] -36 3
## [7,] -37 -47
## [8,] -19 1
## [9,] -46 -50
## [10,] -41 -48
## [11,] -26 -27
## [12,] -1 -18
## [13,] -35 -38
## [14,] -24 -40
## [15,] -21 -30
## [16,] -12 11
## [17,] 6 13
## [18,] -43 2
## [19,] -22 5
## [20,] -34 -45
## [21,] -10 -42
## [22,] -4 -17
## [23,] -11 -44
## [24,] -7 -39
## [25,] 12 21
## [26,] 9 22
## [27,] -5 -28
## [28,] -33 14
## [29,] -25 7
## [30,] -3 19
## [31,] 10 20
## [32,] 4 8
## [33,] -6 27
## [34,] 15 24
## [35,] -9 30
## [36,] 16 32
## [37,] -8 34
## [38,] 17 23
## [39,] 29 38
## [40,] 18 35
## [41,] 25 28
## [42,] 31 36
## [43,] -2 33
## [44,] 37 39
## [45,] 40 43
## [46,] 26 44
## [47,] 41 45
## [48,] 42 46
## [49,] 47 48
##
## $height
## [1] 0.2058539 0.3502188 0.4287712 0.4940832 0.5353893 0.5535286
## [7] 0.5935343 0.6559259 0.7038309 0.7108812 0.7389936 0.7722224
## [13] 0.7781298 0.7865674 0.7977642 0.8076434 0.8472042 0.9427614
## [19] 0.9513719 0.9824857 1.0122252 1.0598104 1.0709720 1.0756115
## [25] 1.0910920 1.1606271 1.1968261 1.2074603 1.2601290 1.2990516
## [31] 1.3169658 1.3449118 1.3901014 1.5396377 1.6907596 1.7484165
## [37] 1.8118061 1.9360777 2.2033391 2.2421782 2.7145543 2.9932892
## [43] 3.0250236 3.2107135 3.4960481 3.7341155 6.4618664 7.1881893
## [49] 13.5162424
##
## $order
## [1] 1 18 10 42 33 24 40 43 13 32 9 3 22 20 31 2 6 5 28 41 48 34 45 12 26
## [26] 27 23 49 19 15 29 46 50 4 17 8 21 30 7 39 25 37 47 36 14 16 35 38 11 44
##
## $labels
## [1] "Alabama" "Alaska" "Arizona" "Arkansas"
## [5] "California" "Colorado" "Connecticut" "Delaware"
## [9] "Florida" "Georgia" "Hawaii" "Idaho"
## [13] "Illinois" "Indiana" "Iowa" "Kansas"
## [17] "Kentucky" "Louisiana" "Maine" "Maryland"
## [21] "Massachusetts" "Michigan" "Minnesota" "Mississippi"
## [25] "Missouri" "Montana" "Nebraska" "Nevada"
## [29] "New Hampshire" "New Jersey" "New Mexico" "New York"
## [33] "North Carolina" "North Dakota" "Ohio" "Oklahoma"
## [37] "Oregon" "Pennsylvania" "Rhode Island" "South Carolina"
## [41] "South Dakota" "Tennessee" "Texas" "Utah"
## [45] "Vermont" "Virginia" "Washington" "West Virginia"
## [49] "Wisconsin" "Wyoming"
##
## $method
## [1] "ward.D2"
##
## $call
## hclust(d = Res_Dist, method = "ward.D2")
library("factoextra")
fviz_dend(Res_HC, cex = 0.5) + labs(title = "Dendograma de Conglomerados")+theme_gray()# Calcular la distancia cofentica
Res_coph <- cophenetic(Res_HC)
# Correlación entre la distancia confentica y la distancia original
cor(Res_Dist, Res_coph)## [1] 0.6975266
Se observa que el valor no supera el 0.75 por lo cual no se puede decir que la solución mostrada por este agrupamiento no es del todo buena. Por ello recurriremos a cambiar el metodo de vinculación a “average” (promedio)
Res_HC2 <- hclust(Res_Dist, method = "average")
cor(Res_Dist, cophenetic(Res_HC2))## [1] 0.7180382
El coeficiente de correlaciones muestra que el uso de un método de vinculación diferente crea un árbol que representa las distancias originales ligeramente mejor.
# Cortaremos el árbol en 4 grupos
Grupos_7 <- cutree(Res_HC, k = 4)
head(Grupos_7, n = 4)## Alabama Alaska Arizona Arkansas
## 1 2 2 3
# Número de miembros en cada Clusters
table(Grupos_7)## Grupos_7
## 1 2 3 4
## 7 12 19 12
#Obtención de los nombres de los miembros que pertenecen al Cluster 1
row.names(Data_USA)[Grupos_7==1]## [1] "Alabama" "Georgia" "Louisiana" "Mississippi"
## [5] "North Carolina" "South Carolina" "Tennessee"
fviz_dend(Res_HC, k = 4, # Cortar el árbol en 4 grupos
cex = 0.5,
k_colors = c("#2E9FDF", "#00AFBB", "#E7B800", "#FC4E07"),
color_labels_by_k = TRUE, # cada grupo con un color
rect = TRUE # Enmarcar con un rectangulo cada corte
)+ labs(title = "Dendograma de Clongomerados")+ theme_classic()fviz_cluster(list(data = Data_USA, cluster = Grupos_7),
palette = c("#2E9FDF", "#00AFBB", "#E7B800",
"#FC4E07"),
ellipse.type = "convex",
repel = TRUE,
show.clust.cent = FALSE,
ggtheme = theme_minimal())+ labs(title = "Gráfico de
conglomerados")library("cluster")
# Agglomerative Nesting (Hierarchical Clustering)
Res_Agnes <- agnes(x = USArrests,
stand = TRUE, # Estandarizar la data
metric = "euclidean", # matriz de distancia
method = "ward" # metodo de vinculación
)
# Divisive Analysis Clustering
Res_DIANA<- diana(x = USArrests,
stand = TRUE,
metric = "euclidean"
)Visualización
fviz_dend(Res_Agnes, cex = 0.6, k = 4)+labs(title = "Dendograma de Conglomerados")Se seguira utilizando la data de USArrests estadarizados que se ha guardado en el objeto de Data_USA.
Para hacer legibles los diagramas que se van a generar, trabajaremos con una pequeña subconjunto aleatorio del conjunto de datos. Por lo tanto, se usará la función sample() para aleatoriamente seleccione 10 observaciones entre las 50 observaciones contenidas en el conjunto de datos:
set.seed(123)
Random <- sample(1:50, 10)
SubData_USA<- Data_USA[Random,]library(dendextend)
# Calculo de la matriz de distancias
Res_dist_8 <- dist(SubData_USA, method = "euclidean")
# Calculo de 2 agrupamientos jerarquicos
HC1 <- hclust(Res_dist_8, method = "average")
HC2 <- hclust(Res_dist_8, method = "ward.D2")
# Creamos ambos dendogramas
Dendo1 <- as.dendrogram (HC1)
Dendo2 <- as.dendrogram (HC2)
# Crear una lista para la obtención de dendogramas
Dend_list <- dendlist(Dendo1, Dendo2)tanglegram(Dendo1, Dendo2)tanglegram(Dendo1, Dendo2,
highlight_distinct_edges = FALSE, # líneas discontinuas
common_subtrees_color_lines = FALSE, # lineas de colores
common_subtrees_color_branches = TRUE, # lineas comunes del mismo color
main = paste("Enredo =",
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
La correlación entre dos árboles(dendogramas) también se puede calcular de la siguiente manera:
# Coeficiente de Correlación Cofenético
cor_cophenetic(Dendo1, Dendo2)## [1] 0.9925544
# Coeficiente de correlación de Baker
cor_bakers_gamma(Dendo1, Dendo2)## [1] 0.9895528
También es posible comparar simultáneamente múltiples dendrogramas. Se utiliza un operador de encadenamiento %>% (pipe) para ejecutar múltiples funciones al mismo tiempo. Es útil para simplificar el código:
# Creación de múltiples dendogramas
Dend1_8 <- SubData_USA %>% dist %>% hclust("complete") %>% as.dendrogram
Dend2_8 <- SubData_USA %>% dist %>% hclust("single") %>% as.dendrogram
Dend3_8 <- SubData_USA %>% dist %>% hclust("average") %>% as.dendrogram
Dend4_8 <- SubData_USA %>% dist %>% hclust("centroid") %>% as.dendrogram
# Calculo de la matriz de correlacion
dend_list_8 <- dendlist("Complete" = Dend1_8, "Single" = Dend2_8,
"Average" = Dend3_8, "Centroid" = Dend4_8)
Matriz_Corr_8 <- cor.dendlist(dend_list_8)
# Visualizar la matriz de Correlación
round(Matriz_Corr_8, 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
Visualización de la matriz de correlación usando la librería Corrplot
library(corrplot)
corrplot(Matriz_Corr_8, "pie", "lower")La data a utilizar se encuentra en “Data_USA” que ya se encuentra estadarizada.
# CalculO de distancias y agrupamiento jerárquico.
distancias_9 <- dist(Data_USA, method = "euclidean")
HC_cap9 <- hclust(distancias_9, method = "ward.D2")library(factoextra)
fviz_dend(HC_cap9, cex = 0.5)fviz_dend(HC_cap9, cex = 0.5,
main = "Dendograma - ward.D2",
xlab = "Objetos", ylab = "Distancia", sub = "")fviz_dend(HC_cap9, cex = 0.5, horiz = TRUE,
main = "Dendograma ",
xlab = "Objetos", ylab = "Distancia", sub = "")fviz_dend(HC_cap9, k = 4, # Cortar en 4 grupos
cex = 0.5, # tamaño de las etiquetas
k_colors= "npg",
color_labels_by_k = TRUE, # color de las etiquetas por cada grupos
rect = TRUE,# Añadir un rectangulo limitando cada grupo
rect_border ="npg",
rect_fill = TRUE,
main = "Dendograma",
xlab = "Objetos", ylab = "Distancia", sub = ""
)Nota: Los valores permitidos para k_color incluyen paletas de cervezas del paquete RColorBrewer (p. ej., “RdBu”, “Blues”, “Dark2”, “Set2”, . . . ; ) y paletas de revistas científicas del paquete ggsci R (p. ej., “npg”, “aaas”, “lancet”, “jco”, “ucscgb”, “uchicago”, “simpsons” y “rickandmorty”).
Para cambiar el tema de la trama se usa el argumento ggtheme:
fviz_dend(HC_cap9, k = 4,
cex = 0.5,
k_colors = c("#2E9FDF", "#00AFBB", "#E7B800", "#FC4E07"),
color_labels_by_k = TRUE,
ggtheme = theme_minimal(), # Cambios de Trama
main = "Dendograma",
xlab = "Objetos", ylab = "Distancia", sub = ""
)Para dibujar un dendograma horizontal con rectangulos en cada grupo, se realizaría de la siguiente manera:
fviz_dend(HC_cap9, k = 4,
cex = 0.4, horiz = TRUE,
k_colors = "jco",
rect = TRUE,
rect_border = "jco",
rect_fill = TRUE,
main = "Dendograma Horizontal",
xlab = "Objetos", ylab = "Distancia", sub = "")fviz_dend(HC_cap9, cex = 0.5, k = 4,
k_colors = "aaas", type = "circular")library(igraph)
fviz_dend(HC_cap9, k = 4, k_colors = "uchicago",
type = "phylogenic", repel = TRUE)El diseño predeterminado para los árboles filogenéticos es “layout.auto”. Los valores permitidos son uno de: c(“layout.auto”, “layout_with_drl”, “layout_as_tree”, “layout.gem”, “layout.mds”, “diseño_con_lgl”).
A continuación usaremos: phylo.layout = “layout.gem”
fviz_dend(HC_cap9, k = 4,
k_colors = "jco",
type = "phylogenic", repel = TRUE,
phylo_layout = "layout.gem")fviz_dend(HC_cap9,
xlim = c(1, 20), # limitar el eje x (objetos)
ylim = c(1, 8)) # limitar el eje y (distancia)# 1- Crear una gráfica de todo el dendograma y extraer los datos del dendograma
Dendo_plot <- fviz_dend(HC_cap9, k = 4, # Cortar en 4 grupos
cex = 0.5,
k_colors = "jco"
)
Dendo_data <- attr(Dendo_plot, "dendrogram") # Datos del dendograma
# Cortar el dendograma a una altura de h = 15
dend_cortado <- cut(Dendo_data, h = 15)
# Visualizar el dendograma cortado
# dos ramas
fviz_dend(dend_cortado$upper)El dendograma completo sería el siguiente:
print(Dendo_plot)Gráficar los sub-arboles 1 y 2
# Sub-arbol 1 o grupo 1
fviz_dend(dend_cortado$lower[[1]], main = "Sub-Árbol 1")# Sub-arbol 2 o grupo 2
fviz_dend(dend_cortado$lower[[2]], main = "Sub-Árbol 2")También se pueden trazar sub-árboles circulares de la siguiente manera:
fviz_dend(dend_cortado$lower[[2]], type = "circular")Se puede tener un dendograma grande y guardarlo en una única pagina sin que se pierda la resolución de este.
El proceso es el siguiente:
pdf("dendrograma.pdf", width=30, height=15) # crear el pdf
dendograma<- fviz_dend(HC_cap9, k = 4, cex = 1, k_colors = "jco" )
#creación del gráfico
print(dendograma)
dev.off()## png
## 2
Código R estándar para crear un dendrograma:
Código R para crear un dendrograma usando un operador de encadenamiento y la librería dendextend:
library(dendextend)
Dend <- USArrests[1:5,] %>% # data
scale %>% # estandarizar
dist %>% # calculo de la matriz de distancias,
hclust(method = "ward.D2") %>% # agrupación jerarquica
as.dendrogram # convertirlos en dendograma.
plot(Dend)La función set() de la librería dendextend nos permite cambiar los parametros del dendograma
A continuaión se muestra un ejemplo:
library(dendextend)
# 1. Crear el dendograma personalizado
mycols <- c("#2E9FDF", "#00AFBB", "#E7B800", "#FC4E07")
dend <- as.dendrogram(HC_cap9) %>%
set("branches_lwd", 1) %>% # Anchura de las ramas
set("branches_k_color", mycols, k = 4) %>% # colores de las grupos
set("labels_colors", mycols, k = 4) %>% # Colores de las etiquetas de los grupos
set("labels_cex", 0.5) # tamaño de las etiquetas
# 2. Creación del gráfico
fviz_dend(dend)Y como podemos obervar se obtiene el mismo dendograma que se muestra como ejemplo a inicios del capitulo.
Aldas, J. (s.f.). Analisis multivariante aplicado con R. Obtenido de https://drive.google.com/drive/folders/1A_OB3xL4KYu48kGqmFUDaXue4Wh5DfkM
fuente, S. d. (s.f.). analisis conglomerados. Obtenido de https://www.fuenterrebollo.com/Economicas/ECONOMETRIA/SEGMENTACION/CONGLOMERADOS/conglomerados.pdf
Kassambara, A. (2017). Obtenido de Practical Guide To Cluster Analysis in R. Unsupervised Machine Learning.
Barnier, J. (s.f.). cran.r-project. Obtenido de rmdformats: HTML Output Formats and Templates for ‘rmarkdown’ Documents: https://cran.r-project.org/web/packages/rmdformats/index.html
cran.r-project. (22 de Noviembre de 2022). Obtenido de igraph: Network Analysis and Visualization: https://cran.r-project.org/web/packages/igraph/index.html
Galili, T. (4 de Julio de 2022). cran.r-project . Obtenido de dendextend: Extending ‘dendrogram’ Functionality in R: https://cran.r-project.org/web/packages/dendextend/index.html
Kassambara, A. (01 de Abril de 2020). cran.r-project. Obtenido de factoextra: Extract and Visualize the Results of Multivariate Data Analyses: https://cran.r-project.org/web/packages/factoextra/index.html
Keitt, T. (2 de Mayo de 2022). cran.r-project. Obtenido de colorRamps: Builds Color Tables: https://cran.r-project.org/web/packages/colorRamps/index.html
h1,h2,h3,h4{
font-size:14px;
font-weight: bold;
font-family: 'Times New Roman', Times, serif;
line-height:2;
}
h1 {
text-align: center;
}
h4{
text-align:center;
font-weight: bold
}
p, li{
text-indent: 40px;
font-size:12 px;
font-family: 'Times New Roman', Times, serif;
line-height: 2;
}