UNIVERSIDAD DE EL SALVADOR FACULTAD DE CIENCIAS ECONÓMICAS ESCUELA DE ECONOMÍA MÉTODOS PARA EL ANÁLISIS ECONÓMICO CICLO II-2023 GT02
TEMA A INVESTIGAR: “ANÁLISIS DE CLÚSTER (CONGLOMERADOS)”
INTEGRANTES:
| Nombre | Cárne |
|---|---|
| Nicole Saraí Aguilar Hernández | AH20030 |
| Yasmin Azucena Calderón García | CG19041 |
| Carlos David Deleón Molina | DM19001 |
| Cecilia Guadalupe Mejía López | ML20003 |
DOCENTE: Carlos Ademir Pérez Alas
Ciudad Universitaria, San Salvador, 7 de enero del 2024.
El Análisis de conglomerados (o Análisis de Clusters) es una técnica de análisis exploratorio de datos para resolver problemas de clasificación. Su objeto consiste en ordenar objetos (personas, cosas, animales, plantas, variables, etc, …) en grupos (conglomerados o clusters) de forma que el grado de asociación o similitud entre miembros del mismo cluster sea más fuerte que el grado de asociación/similitud entre miembros de diferentes clusters por lo que cada cluster se describe como la clase a la que sus miembros pertenecen.
Este método permite descubrir asociaciones y estructuras en los datos que no son evidentes a priori pero que pueden ser útiles una vez que se han encontrado. Los resultados de un Análisis de Clusters pueden contribuir a la definición formal de un esquema de clasificación tal como una taxonomía para un conjunto de objetos, a sugerir modelos estadísticos para describir poblaciones, a asignar nuevos individuos a las clases para diagnóstico e identificación, etc.
Podemos encontrarnos dos tipos fundamentales de métodos de clasificación: - Jerárquicos: . En este método la clasificación resultante tiene un número creciente de clases anidadas, la agrupación Jerárquica no requieren Pre especificar el número de clústeres que se producirán.
El método jerárquico se puede subdividir en dos tipos: - Aglomerativa: Cada observación se considera inicialmente como un racimo propio (hoja). Luego, los clústeres más similares se fusionan sucesivamente hasta que haya un solo gran clúster (raíz), esta agrupación es conocida como Dendrograma. - divisivos: Una inversión de la agrupación aglomerativa, comienza con la raíz, en que todos los objetos están incluidos en un grupo. Entonces el más heterogéneo de los conglomerados se dividen sucesivamente hasta que todas las observaciones están en su propio conglomerado. (Kassambara 2017, pág. 65)
El método no jerárquico se puede incluir: - Agrupación de K-medias: Cada agrupación está representada por el centro o por medio de los puntos de datos pertenecientes al clúster. El método de las K-medias es sensible a puntos de datos anómalos y valores atípicos. - Agrupación de K-medoides o Partición alrededor de medoides: Cada grupo está representado por uno de los objetos en el racimo y esta agrupación es menos sensible a valores atípicos en comparación con el método de k-medias. - Algoritmo de Agrupación de aplicaciones grandes: Con sus siglas en ingles CLARA, es una extensión del método Partición alrededor de medoides (PAM), adaptado para grandes conjuntos de datos.(Kassambara 2017, pág. 35)
| Análisis.Cluster | Técnicas.disponibles | Ventajas | Desventajas |
|---|---|---|---|
|
Jerárquico: Tienen por objetivo agrupar clusters para formar uno nuevo o bien separar alguno ya existente para dar origen a otros dos, de tal forma que se minimice alguna función distancia o bien se maximice alguna medida de similitud. |
Métodos aglomerativos: - Método del amalgamamiento simple. - Método del amalgamamiento completo. - Método del promedio entre grupos. - Método del centroide. - Método de la mediana. - Método de Ward. Métodos Disociativos: Destacan, además de los anteriores: - El análisis de asociación - El detector automático de interacción |
Puede encontrar agrupaciones de cualquier forma. Tiene la capacidad de identificar valores atípicos. No es necesario especificar el número de clusters de antemano, ya que, el método jerárquico insinúa el número. Fácil interpretación visual a través de dendrograma. El clustering jerárquico es de fácil implementación lo que nos permite identificar agrupaciones de cualquier forma. |
La interpretación con conjuntos de datos grandes puede volverse
complicada. Al momento en que se asigna un elemento a un grupo, no se le permite pertenecer a otro. La asignación de elementos a grupos puede no ser siempre ideal. La falta de un número predefinido puede hacer que la elección sea subjetiva y dificulte la interpretación. No se pueden corregir o ajustar los resultados. |
|
No jerárquico: También conocidos como partitivos o de optimización, tienen por objetivo realizar una sola partición de los individuos en K grupos. Ello implica que el investigador debe especificar a priori los grupos que deben ser formados, siendo ésta, posiblemente, la principal diferencia respecto de los métodos jerárquicos. |
1. Métodos de resignación: - El método K-medias. - El Quick-Cluster análisis. - El método de Forgy. - El método de las nubes dinámicas. 2. Métodos de búsqueda de la densidad: -Aproximación tipológica: - El análisis modal de Wishart. - El método Taxmap. - El método de Fortin. Aproximación porbabilística: - Método de Wolf. 3. Métodos directos: El algoritmo más conocido dentro de este grupo es el Block-Clustering. 4. Métodos de reducción de dimensiones: Análisis Factorial tipo Q. |
Los algoritmos no jerárquicos como K-means y K-medoids son conocidos por
su simplicidad y fácil implementación. De manera efectiva puede trabajar bien con un conjunto de datos grandes. K-medoids utiliza medoides que lo hace más robusto y adecuado para outliers. Tiene simplicidad y rapidez en la formación de clústeres. |
Tanto en K-means como en K-medoids es necesario que se especifique el
número de clústeres. La presencia de outliers puede afectar la calidad de los clusters obtenidos. La elección inicial de semillas puede afectar los resultados de los clústeres. En K-means hay problemas de robustez y tasas de convergencia variables. Algoritmos como K-means no son apropiados para tratar datos nominales. |
Fuente: Elaboración propia con base en Kassambara (2017) y Cluster-g.pdf.
Este método considera cada elemento como un clúster individual y luego fusiona progresivamente los pares de clústeres hasta formar un clúster grande que engloba todos los elementos. Como resultado, se obtiene un diagrama en forma de árbol, conocido como dendrograma, que representa la agrupación de estos elementos de manera “de abajo hacia arriba”. En otras palabras, inicialmente, cada elemento se trata como un grupo separado (una hoja), y en cada iteración del algoritmo, los dos grupos más similares se combinan en un nuevo grupo más grande (nodos), repitiendo este proceso hasta que todos los puntos forman parte de un clúster principal (raíz). Este enfoque aglomerativo es útil para identificar agrupaciones más pequeñas dentro de un conjunto de datos.
Simple Linkage (Vecino más cercano): Primero se calculan las distancias entre todos los pares de individuos para luego identificar aquellos que presentan la menor distancia o mayor similitud entre ellos. Estos individuos que cumplen con esta condición se agrupan formando un conjunto que permanece unido a lo largo del 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: Tambien conocido como método del centroide, la mayor desventaja de este método 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.
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).
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.
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
Reasignación: 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.
K-means Clustering: 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.
K-medoides o PAM: 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).
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.
Nubes Dinámicas: 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.
Búsqueda de densidad: 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.
Métodos Directos: 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.
Block - Clustering: 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.”
Métodos Reductivos: 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”
Análisis Factorial tipo Q: El objetivo consiste en encontrar grupos de individuos con valores semejantes en las variables con la finalidad de determinar un número reducido de clúster de los que se espera que los individuos contenidos en cada uno de ellos tengan algún tipo de propiedad común.
El método parte de la matriz de correlaciones entre 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.
Fuente: Elaboración en base a Cuellar (n.d.).
El agrupamiento de K-medias (MacQueen, 1967) es el método no supervisado más utilizado, es un algoritmo de aprendizaje automático para dividir un conjunto de datos determinado en un conjunto de k grupos, donde k representa el número de grupos preespecificados por el analista. Se clasifica objetos en múltiples grupos (clústeres) de modo que los objetos dentro del mismo grupo son lo más similares posible (es decir, alta similitud dentro de la clase), mientras que los objetos de diferentes grupos son lo más diferentes posible (es decir, baja similitud entre clases). En la agrupación de k-medias, cada grupo está representado por su centro (es decir, centroide), que Corresponde a la media de puntos asignados al cluster.
La idea básica detrás de la agrupación de k-medias consiste en definir agrupaciones de modo que en el total se minimiza la variación dentro del grupo. Hay varios algoritmos de k-medias disponibles. El algoritmo estándar es el algoritmo de Hartigan-Wong (1979), que define la variación total dentro del grupo como la suma de las distancias al cuadrado de las distancias euclidianas entre elementos y las distancias correspondientes.
El primer paso al utilizar la agrupación de k-medias es indicar el número de agrupaciones (k) que se generará en la solución final. El algoritmo comienza seleccionando aleatoriamente k objetos del conjunto de datos para que sirvan como base o centros iniciales de los clusters. Los objetos seleccionados también se conocen como medios de clúster o centroides. A continuación, cada uno de los objetos restantes se asigna a su centroide más cercano, donde el más cercano es definido utilizando la distancia euclidiana entre el objeto y el grupo significar. Este paso se denomina “paso de asignación de clústeres”. Para utilizar la correlación distancia, los datos se ingresan como puntuaciones z.
Después del paso de asignación, el algoritmo calcula el nuevo valor medio de cada grupo. El término “actualización de centroide” del grupo se utiliza para diseñar este paso, ahora que los centros han sido recalculados, cada observación se verifica nuevamente para ver si podría estar más cerca a un grupo diferente; todos los objetos se reasignan nuevamente utilizando el clúster actualizado.
Cargando el conjunto de datos, data (“USArrests”)
data("USArrests") # Cargando el conjunto de datos
df <- scale(USArrests) # Scaling the data
# Ver las primeras 3 filas de datos
head(df, n = 3)## Murder Assault UrbanPop Rape
## Alabama 1.24256408 0.7828393 -0.5209066 -0.003416473
## Alaska 0.50786248 1.1068225 -1.2117642 2.484202941
## Arizona 0.07163341 1.4788032 0.9989801 1.042878388
La función R estándar para la agrupación en clústeres de k-medias es k significa() [estadisticas paquete], cuyo formato simplificado es el siguiente: k significa(x, centros, iter.max = 10, nstart = 1)
Para crear un gráfico más estetico de los clústeres generados con el k significa() función, se utilizará el paquete factoextra.
La agrupación de k-means requiere que los usuarios especifiquen el número de agrupaciones que se generarán.
La idea es calcular la agrupación de k-medias utilizando diferentes valores de las agrupaciones k. A continuación, se dibuja el wss (dentro de la suma del cuadrado) de acuerdo con el número de grupos. La ubicación de una curva (rodilla) en la parcela se considera generalmente como un indicador del número apropiado de grupos.
La función R fviz_nbclust() [en factoextra paquete] proporciona una solución conveniente para estimar el número óptimo de clústeres.
library(factoextra)
fviz_nbclust(df, kmeans, method = "wss") +
geom_vline(xintercept = 4, linetype = 2)
El gráfico anterior representa la varianza dentro de los grupos.
Disminuye a medida que k aumenta, pero se puede ver una curva (o “codo”)
en k = 4. Esta curva indica que los grupos adicionales más allá del
cuarto tienen poco valor. En la siguiente sección, clasificaremos las
observaciones en 4 racimos.
Como el algoritmo de agrupamiento de k-medias comienza con k centroides seleccionados al azar, siempre se recomienda usar el set.seed () función con el fin de establecer una semilla para R es aleatorio generador de números. El objetivo es hacer reproducibles los resultados, de modo que el lector de este artículo obtenga exactamente los mismos resultados que se muestran a continuación.
El siguiente código R funciona agrupación de k-medias con k = 4:
# Calculando k-medias con k = 4
set.seed(123)
km.res <- kmeans(df, 4, nstart = 25)
# Imprime los resultados
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"
La salida impresa muestra: • las medias o centros del conglomerado: una matriz, cuyas filas son el número de conglomerados (1 a 4) y las columnas son variables • el vector de agrupamiento: un vector de números enteros (de 1: k) que indica el grupo al que se asigna cada punto.
Es posible calcular la media de cada variable por conglomerados utilizando los datos originales:
## 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 desea agregar las clasificaciones de puntos a los datos originales, use esto:
## 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
kmeans () La función devuelve una lista de componentes, que incluye:
Se puede acceder a los componentes de la siguiente manera:
## 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
## Alabama Alaska Arizona Arkansas
## 1 4 4 1
## [1] 8 13 16 13
## 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
Es una buena idea trazar los resultados del clúster. Estos se pueden utilizar para evaluar la elección del número de conglomerados, así como para comparar dos análisis de conglomerados diferentes. Ahora, queremos visualizar los datos en un diagrama de dispersión coloreando cada punto de datos de acuerdo con su asignación de grupo. El problema es que los datos contienen más de 2 variables y la pregunta es qué variables elegir para el diagrama de dispersión xy.
Una solución es reducir el número de dimensiones aplicando un algoritmo de reducción de dimensionalidad, como Análisis de componentes principales (PCA), que opera sobre las cuatro variables y genera dos nuevas variables (que representan las variables originales) que puede usar para hacer el gráfico. En otras palabras, si tenemos un conjunto de datos multidimensionales, una solución es realizar un análisis de componentes principales (PCA) y trazar puntos de datos de acuerdo con las dos primeras coordenadas de los componentes principales.
La función fviz_cluster() [factoextra paquete] se puede utilizar para visualizar fácilmente los clústeres de kmedias. Toma los resultados de k-medias y los datos originales como argumentos. En la gráfica resultante, las observaciones se representan mediante puntos, utilizando componentes principales si el número de variables es mayor que 2. También es posible dibujar una elipse de concentración alrededor de cada grupo.
fviz_cluster(
km.res,
data = df,
palette = c("#2E9FDF", "#00AFBB", "#E7B800", "#FC4E07"),
ellipse.type = "euclid",
# Concentration ellipse
star.plot = TRUE,
# Add segments from centroids to items
repel = TRUE,
# Avoid label overplotting (slow)
ggtheme = theme_minimal()
)El algoritmo k-medoides es un enfoque de agrupación relacionado con la agrupación de k-medias para dividir un conjunto de datos en k grupos o clusters. En la agrupación de k-medoides cada grupo está representado por uno de los puntos de datos del grupo. Estos puntos sonllamados medoides del racimo.
El uso de medias implica que la agrupación de k medias es muy sensible a los valores atípicos. Esto puede afectar gravemente la asignación de observaciones a los conglomerados. Un algoritmo más robusto es proporcionado por elPAM algoritmo.
El algoritmo PAM se basa en la búsqueda de k objetos representativos o medoides entre las observaciones del conjunto de datos. Después de encontrar un conjunto de k medoides, los grupos se construyen asignando cada observación al medoide más cercano.
A continuación, se intercambian cada medoide my cada punto de datos no medoide seleccionado y se calcula la función objetivo. La función objetivo corresponde a la suma de las diferencias de todos los objetos con su medoide más cercano.
El paso SWAP intenta mejorar la calidad de la agrupación mediante el intercambio de objetos seleccionados (medoides) y objetos no seleccionados. Si la función objetivo se puede reducir intercambiando un objeto seleccionado con un objeto no seleccionado, entonces se lleva a cabo el intercambio. Esto se continúa hasta que la función objetivo ya no se puede reducir. El objetivo es encontrar k objetos representativos que minimicen la suma de las diferencias de las observaciones con su objeto representativo más cercano.
Usaremos los conjuntos de datos de demostración “USArrests,” usando la función R escala() de la siguiente manera:
data("USArrests") # Cargar el conjunto de datos
df <- scale(USArrests) # Escala los datos
head(df, n = 3) # Ver las primeras 3 filas de datos## 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
La función pam() [grupo paquete] y pamk () [fpc paquete] se puede utilizar para calcular PAM. La función pamk() no requiere que el usuario decida el número de clústeres K. En los siguientes ejemplos, describiremos solo la función pam(), cuyo formato simplificado es: \[pam(x, k, métrica = “euclidiana,” stand = FALSO)\] - X: los valores posibles incluyen: • Matriz de datos numéricos o marco 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 típicamente el resultado de margarita() o dist () - k: El número de clústeres - métrico: las métricas de distancia que se utilizarán. Las opciones disponibles son “euclidiana” y “manhattan.” - pararse: valor lógico; si es verdadero, las variables (columnas) en x se estandarizan antes de calcular las diferencias. Se ignora cuando x es una matriz de disimilitudes. Para crear un hermoso gráfico de los clústeres generados con el pam() función, utilizará lalibreria factoextra.
Para estimar el número óptimo de conglomerados, usaremos el método de silueta promedio. La idea es calcular el algoritmo PAM utilizando diferentes valores de los grupos k. A continuación, se dibuja la silueta de los conglomerados promedio de acuerdo con el número de conglomerados. La silueta promedio mide la calidad de un agrupamiento. Un ancho de silueta medio alto indicauna buena agrupación. El número óptimo de conglomerados k es el que maximiza la siluet a promedio sobre un rango de valores posibles para k (Kaufman y Rousseeuw [1990]).
La función R fviz_nbclust() [factoextra paquete] proporciona una solución conveniente para estimar el número óptimo de clústeres.
A partir de la gráfica, el número sugerido de grupos es 2. En la
siguiente sección, clasificaremos las observaciones en 2 grupos.
El siguiente código R calcula el algoritmo PAM con k = 2:
## 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"
La salida impresa muestra: • los medoides del clúster: una matriz, cuyas filas son los medoides y las columnas son variables • el vector de agrupamiento: un vector de números enteros (de 1: k) que indica el grupo al que se asigna cada punto.
Si desea agregar las clasificaciones de puntos a los datos originales, use esto:
## 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
La función pam () devuelve un objeto de clase pam cuyos componentes incluyen: - medoides : objetos que representan grupos - agrupación : un vector que contiene el número de agrupación de cada objeto
Se puede acceder a estos componentes de la siguiente manera:
## Murder Assault UrbanPop Rape
## New Mexico 0.8292944 1.3708088 0.3081225 1.1603196
## Nebraska -0.8008247 -0.8250772 -0.2445636 -0.5052109
## Alabama Alaska Arizona Arkansas California Colorado
## 1 1 1 2 1 1
Para visualizar los resultados de la partición, usaremos la función fviz_cluster () [paquete factoextra]. Dibuja un diagrama de dispersión de puntos de datos coloreados por números de grupo. Si los datos contiene más de 2 variables, el algoritmo de análisis de componentes principales (PCA), se utiliza para reducir la dimensionalidad de los datos. En este caso, los dos primeros principales las dimensiones se utilizan para graficar los datos.
fviz_cluster(
pam.res,
palette = c("#00AFBB", "#FC4E07"),
# color palette
ellipse.type = "t",
# Concentration ellipse
repel = TRUE,
# Avoid label overplotting (slow)
ggtheme = theme_classic()
)CLARA (Clustering Large Applications, Kaufman y Rousseeuw (1990)) es una extensión de los métodos k-medoids (Capítulo 5) para tratar datos que contienen un gran número de objetos (más de varios miles de observaciones) con el fin de reducir el tiempo de cálculo y el problema de almacenamiento RAM. Para ello se utiliza el método de muestreo.
En lugar de encontrar medoides para todo el conjunto de datos, CLARA considera una pequeña muestra de los datos con tamaño fijo (sampsize) y aplica el algoritmo PAM (Capítulo 5) para generar un conjunto óptimo de medoides para la muestra. La calidad de los medoides resultantes se mide por la disimilitud promedio entre cada objeto en todo el conjunto de datos y el medoide de su grupo, definido como la función de costo. CLARA repite los procesos de muestreo y agrupamiento un número preestablecido de veces para minimizar el sesgo de muestreo. Los resultados finales de agrupamiento corresponden al conjunto de medoides con el costo mínimo. El algoritmo CLARA se resume en la siguiente sección.
El algoritmo es el siguiente:
1. Divida aleatoriamente los conjuntos de datos en varios subconjuntos con tamaño fijo (tamaño de muestra)
2. Calcule el algoritmo PAM en cada subconjunto y elija los k objetos representativos correspondientes (medoides). Asigne cada observación de todo el conjunto de datos al medoide más cercano.
3. Calcule la media (o la suma) de las diferencias de las observaciones con su medoide más cercano. Esto se usa como una medida de la bondad de la agrupación.
4. Conserve el subconjunto de datos para el que la media (o la suma) es mínima. Se lleva a cabo un análisis adicional en la partición final.
Tenga en cuenta que cada subconjunto de datos está obligado a contener los medoides obtenidos del mejor subconjunto de datos hasta ese momento. Las observaciones extraídas al azar se agregan a este conjunto hasta que se alcanza el tamaño de muestra.
Para calcular el algoritmo CLARA en R, generaremos el uso de un conjunto de datos aleatorios. Para que el resultado sea reproducible, comenzamos utilizando la función set.seed ().
set.seed(1234)
# Genera 500 objetos, divididos en 2 grupos
df <- rbind(cbind(rnorm(200, 0, 8), rnorm(200, 0, 8)),
cbind(rnorm(300, 50, 8), rnorm(300, 50, 8)))
# Especificar nombres de filas y columnas
colnames(df) <- c("x", "y")
rownames(df) <- paste0("S", 1:nrow(df))
# Vista previa de los datos
head(df, nrow = 6)## x y
## S1 -9.656526 3.881815
## S2 2.219434 5.574150
## S3 8.675529 1.484111
## S4 -18.765582 5.605868
## S5 3.432998 2.493448
## S6 4.048447 6.083699
La función clara() [grupo paquete] se puede utilizar para calcular CLARA. El formato simplificado es el siguiente: clara(x, k, métrica = “euclidiana,” stand = FALSO, muestras = 5, pamLike = FALSO)
X: una matriz de datos numéricos o un marco de datos, cada fila corresponde a una observación y cada columna corresponde a una variable. Se permiten valores perdidos (NA).
k: el número de clústeres.
metric: las métricas de distancia que se utilizarán. Las opciones disponibles son “euclidiana” y “manhattan.” Las distancias euclidianas son la raíz de la suma de cuadrados de las diferencias y las distancias de Manhattan son la suma de las diferencias absolutas. Lea más sobre medidas de distancia (Capítulo 3). Tenga en cuenta que la distancia de Manhattan es menos sensible a los valores atípicos.
stand: valor lógico; si es verdadero, las variables (columnas) en x se estandarizan antes de calcular las diferencias. Tenga en cuenta que se recomienda estandarizar las variables antes de agruparlas.
samples: número de muestras que se extraerán del conjunto de datos. El valor predeterminado es 5, pero se recomienda un valor mucho mayor.
pamLike: lógico que indica si se debe utilizar el mismo algoritmo de la función pam(). Debe ser siempre verdadero.
Para crear un hermoso gráfico de los clústeres generados con el pam() función, utilizará la libreria factoextra.
Se requiere cargar los paquetes:
Para estimar el número óptimo de clústeres en sus datos, es posible utilizar el método de silueta promedio como se describe en el capítulo de agrupamiento de PAM (Capítulo 5). El r function fviz_nbclust () [paquete factoextra] proporciona una solución para facilitar este paso
A partir del gráfico, el número de conglomerados sugerido es 2. En la siguiente sección, clasificaremos las observaciones en 2 conglomerados.
El siguiente código R calcula el algoritmo PAM con k = 2:
# Calcular CLARA
clara.res <- clara(df, 2, samples = 50, pamLike = TRUE)
# Imprimir componentes de clara.res
print(clara.res)## Call: clara(x = df, k = 2, samples = 50, pamLike = TRUE)
## Medoids:
## x y
## S121 -1.531137 1.145057
## S455 48.357304 50.233499
## Objective function: 9.87862
## Clustering vector: Named int [1:500] 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 ...
## - attr(*, "names")= chr [1:500] "S1" "S2" "S3" "S4" "S5" "S6" "S7" ...
## Cluster sizes: 200 300
## Best sample:
## [1] S37 S49 S54 S63 S68 S71 S76 S80 S82 S101 S103 S108 S109 S118 S121
## [16] S128 S132 S138 S144 S162 S203 S210 S216 S231 S234 S249 S260 S261 S286 S299
## [31] S304 S305 S312 S315 S322 S350 S403 S450 S454 S455 S456 S465 S488 S497
##
## Available components:
## [1] "sample" "medoids" "i.med" "clustering" "objective"
## [6] "clusinfo" "diss" "call" "silinfo" "data"
La salida de la función clara() incluye los siguientes componentes:
Si desea agregar las clasificaciones de puntos a los datos originales, use esto:
## 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
Puede acceder a los resultados devueltos por clara () de la siguiente manera:
## x y
## S121 -1.531137 1.145057
## S455 48.357304 50.233499
## S1 S2 S3 S4 S5 S6 S7 S8 S9 S10
## 1 1 1 1 1 1 1 1 1 1
Los medoides son S121, S455.
Para visualizar los resultados de la partición, usaremos la función fviz_cluster () [ el paquete factoextra]. Dibuja un diagrama de dispersión de puntos de datos coloreados por números de grupo.
fviz_cluster(
clara.res,
palette = c("#00AFBB", "#FC4E07"),
# color palette
ellipse.type = "t",
# Concentration ellipse
geom = "point",
pointsize = 1,
ggtheme = theme_classic()
)El algoritmo CLARA (Clustering Large Applications) es una extensión del método de clustering PAM (Partitioning Around Medoids) para grandes conjuntos de datos. Su objetivo es reducir el tiempo de cálculo en el caso de grandes conjuntos de datos.
Como casi todos los algoritmos de particionamiento, requiere que el usuario especifique el número adecuado de conglomerados que se van a producir. Esto puede estimarse utilizando la función fviz_nbclust [en el paquete R factoextra].
La función de R clara() [paquete cluster] puede utilizarse para calcular el algoritmo CLARA. El formato simplificado es clara(x, k, pamLike = TRUE), donde “x” son los datos y k es el número de clusters a generar.
Después de calcular CLARA, se puede utilizar la función de R fviz_cluster() [paquete factoextra] para visualizar los resultados. El formato es fviz_cluster(clara.res), donde clara.res son los resultados de CLARA.
Nota: Traducción realizada con la versión gratuita del traductor DeepL.com
Agrupación aglomerativalos agrupamiento aglomerativo es el tipo más común de agrupamiento jerárquico que se utiliza para agrupar objetos en grupos en función de su similitud. También se conoce comoINÉS(Anidación aglomerativa). El algoritmo comienza tratando cada objeto como un grupo único. A continuación, los pares de grupos se fusionan sucesivamente hasta que todos los grupos se fusionan en un grupo grande que contiene todos los objetos. El resultado es una representación basada en árbol de los objetos, denominadadendrograma.
La agrupación aglomerativa funciona de forma “de abajo hacia arriba.” Es decir, cada objeto se considera inicialmente como un grupo de un solo elemento (hoja). En cada paso del algoritmo, los dos grupos que son más similares se combinan en un nuevo grupo más grande (nodos). Este procedimiento se repite hasta que todos los puntos son miembros de un solo gran clúster (raíz) (consulte la figura siguiente). La inversa de la agrupación aglomerativa es agrupamiento divisivo, que también se conoce como DIANA (Análisis de división) y funciona de manera “de arriba hacia abajo.” Comienza con la raíz, en la 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 clúster.
Tenga en cuenta que la agrupación aglomerativa es buena para identificar agrupaciones pequeñas. La agrupación en clústeres divisoria es buena para identificar grandes agrupaciones. En este artículo, nos centraremos principalmente en la agrupación jerárquica aglomerativa.
Los datos deben ser una matriz numérica con: filas que representan observaciones (individuos); y columnas que representan variables, usaremos los conjuntos de datos de USArrests base R. Tenga en cuenta que, en general, se recomienda estandarizar las variables en el conjunto de datos antes de realizar un análisis posterior. La estandarización hace que las variables sean comparables cuando se miden en diferentes escalas. Por ejemplo, una variable puede medir la altura en metros y otra variable puede medir el peso en kg. La función Rescala() se puede utilizar para la estandarización, consulte la documentación de la escala
# Cargar los datos
data("USArrests")
# Estandarizar los datos
df <- scale(USArrests)
# Mostrar las primeras 6 filas
head(df, nrow = 6)## Murder Assault UrbanPop Rape
## Alabama 1.24256408 0.7828393 -0.5209066 -0.003416473
## Alaska 0.50786248 1.1068225 -1.2117642 2.484202941
## Arizona 0.07163341 1.4788032 0.9989801 1.042878388
## Arkansas 0.23234938 0.2308680 -1.0735927 -0.184916602
## California 0.27826823 1.2628144 1.7589234 2.067820292
## Colorado 0.02571456 0.3988593 0.8608085 1.864967207
Para decidir qué objetos / grupos deben combinarse o dividirse, necesitamos métodos para medir la similitud entre objetos.
Hay muchos métodos para calcular la (dis) similitud de la información, incluyendo Eu-distancias clidean y manhattan (capítulo 3). En el software R, puede utilizar la función dist () para calcular la distancia entre cada par de objetos en un conjunto de datos. Los resultados de este cálculo se conoce como matriz de distancia o disimilitud.
Por defecto, la función dist () calcula la distancia euclidiana entre objetos; sin embargo, es posible indicar otras métricas usando el método de argumento. See? . Por ejemplo, considere el conjunto de datos base R USArrests, puede calcular la distancia matriz de la siguiente manera:
# Calcule la matriz de disimilitud
# df = los datos estandarizados
res.dist <- dist(df, method = "euclidean")Tenga en cuenta que la función dist() calcula la distancia entre las filas de una matriz de datos utilizando el método de medición de distancia especificado.
Para ver fácilmente la información de distancia entre objetos, reformateamos los resultados de la función dist() en una matriz usando el como.matriz() función. En esta matriz, el valor en la celda formada por la fila i, la columna j, representa la distancia entre el objeto i y el objeto j en el conjunto de datos original. Por ejemplo, el elemento 1,1 representa la distancia entre el objeto 1 y él mismo (que es cero). El elemento 1,2 representa la distancia entre el objeto 1 y el objeto 2, y así sucesivamente.
El siguiente código R muestra las primeras 6 filas y columnas de la matriz de distancia:
## 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
La función de vinculación toma la información de distancia, devuelta por la función dist (), y agrupa pares de objetos en grupos según su similitud. A continuación, estos nuevos Los grupos formados están vinculados entre sí para crear grupos más grandes. Este proceso es iterado hasta que todos los objetos en el conjunto de datos original están vinculados juntos en una jerarquía árbol.
Por ejemplo, dada una matriz de distancia “res.dist” generada por la función dist (), el La función base de R hclust () se puede utilizar para crear el árbol jerárquico.
hclust () se puede utilizar de la siguiente manera:
D: una estructura de disimilitud producida por el dist () función.
método: El método de aglomeración (enlace) que se utilizará para calcular la distancia entre conglomerados. Los valores permitidos son “ward.D,” “ward.D2,” “single,” “complete,” “average,” “mcquitty,” “median” o “centroide.”
Hay muchos métodos de aglomeración de conglomerados (es decir, métodos de enlace). Los métodos de vinculación más comunes se describen a continuación.
Máximo o vinculación completa: La distancia entre dos conglomerados se define como el valor máximo de todas las distancias por pares entre los elementos del conglomerado 1 y los elementos del conglomerado 2. Tiende a producir conglomerados más compactos.
Mínimo o enlace único: La distancia entre dos conglomerados se define como el valor mínimo de todas las distancias por pares entre los elementos del conglomerado 1 y los elementos del conglomerado 2. Tiende a producir conglomerados largos y “sueltos.”
Significa o vinculación promedio: La distancia entre dos conglomerados se define como la distancia media entre los elementos del conglomerado 1 y los elementos del conglomerado 2.
Enlace centroide: La distancia entre dos conglomerados se define como la distancia entre el centroide del conglomerado 1 (un vector medio de variables de longitud p) y el centroide del conglomerado 2.
Método de variación mínima de Ward: Minimiza la varianza total dentro del conglomerado. En cada paso, se fusiona el par de grupos con una distancia mínima entre grupos.
Tenga en cuenta que, en cada etapa del proceso de agrupamiento, los dos grupos, que tienen la distancia de enlace más pequeña, están vinculados entre sí.
Generalmente se prefieren el enlace completo y el método de Ward.
Visualizar el dendrograma de la siguiente manera:
En el dendrograma que se muestra arriba, cada hoja corresponde a un
objeto. A medida que subimos por el árbol, los objetos que son similares
entre sí se combinan en ramas, que a su vez se fusionan a una altura
mayor.
La altura de la fusión, proporcionada en el eje vertical, indica la (dis) similitud / distancia entre dos objetos / grupos. Cuanto mayor sea la altura de la fusión, menos similares serán los objetos. Esta altura se conoce comodistancia cofenética entre los dos objetos.
Tenga en cuenta que las conclusiones sobre la proximidad de dos objetos solo se pueden extraer en función de la altura en la que se fusionan las ramas que contienen esos dos objetos primero. No podemos utilizar la proximidad de dos objetos a lo largo del eje horizontal como criterio de su similitud.
Para identificar subgrupos, podemos cortar el dendrograma a una cierta altura como se describe en las siguientes secciones.
Después de vincular los objetos de un conjunto de datos en un árbol de clúster jerárquico, es posible que desee para evaluar que las distancias (es decir, las alturas) en el árbol reflejan las distancias originales precisamente.
Una forma de medir qué tan bien el árbol de clúster generado por la función hclust () refleja sus datos es calcular la correlación entre las distancias cofenéticas y los datos de distancia originales generados por la función dist (). Si el agrupamiento es válido, la vinculación de objetos en el árbol del clúster debe tener una fuerte correlación con el distancias entre objetos en la matriz de distancias original.
Cuanto más se acerque el valor del coeficiente de correlación a 1, con mayor precisión será La solución de agrupamiento refleja sus datos. Se considera que los valores superiores a 0,75 son buenos. Los El método de vinculación “promedio” parece producir valores altos de esta estadística. Esto puede ser una de las razones por las que es tan popular.
La función de base R cophenetic () se puede utilizar para calcular las distancias cofenéticas para agrupación jerárquica.
# Calcule la distancia cophentic
res.coph <- cophenetic(res.hc)
# Correlación entre distancia cofenética y
# la distancia original
cor(res.dist, res.coph)## [1] 0.6975266
Ejecute la función hclust () nuevamente usando el método de vinculación promedio. A continuación, llame cophenetic () para evaluar la solución de agrupamiento.
## [1] 0.7180382
El coeficiente de correlación muestra que el uso de un método de vinculación diferente crea un árbol que representa las distancias originales un poco mejor.
Uno de los problemas con la agrupación jerárquica es que no nos dice cuántos racimos que hay, o donde cortar el dendrograma para formar grupos.
Puede cortar el árbol jerárquico a una altura determinada para dividir sus datos en grupos. La función base R cutree () se puede utilizar para cortar un árbol, generado por la función hclust (), en varios grupos especificando el número deseado de grupos o la altura de corte. Devuelve un vector que contiene el número de clúster de cada observación.
## Alabama Alaska Arizona Arkansas
## 1 2 2 3
## grp
## 1 2 3 4
## 7 12 19 12
## [1] "Alabama" "Georgia" "Louisiana" "Mississippi"
## [5] "North Carolina" "South Carolina" "Tennessee"
El resultado de los cortes se puede visualizar fácilmente usando la función fviz_dend () [en factoextra]:
# Cortar en 4 grupos y colorear por grupos
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
)
Usando la función fviz_cluster () [in factoextra], también podemos
visualizar el resultado en un diagrama de dispersión. Las observaciones
están representadas por puntos en la gráfica, usando el método de
componentes principales. Se dibuja un marco alrededor de cada grupo.
fviz_cluster(
list(data = df, cluster = grp),
palette = c("#2E9FDF", "#00AFBB", "#E7B800", "#FC4E07"),
ellipse.type = "convex",
# Elipse de concentración
repel = TRUE,
# # Evite el trazado excesivo de etiquetas (lento)
show.clust.cent = FALSE,
ggtheme = theme_minimal()
)El clúster de paquetes R facilita la realización de análisis de clústeres en R. Proporciona la función agnes () y diana () para calcular la agrupación aglomerativa y divisiva, respectivamente. Estas funciones realizan todos los pasos necesarios para usted. No necesitas para ejecutar las funciones scale (), dist () y hclust () por separado.
Las funciones se pueden ejecutar de la siguiente manera
library("cluster")
# Anidación aglomerativa (agrupación jerárquica)
res.agnes <- agnes(
x = USArrests,
# matriz de datos
stand = TRUE,
# Estandarizar los datos
metric = "euclidean",
# métrica para matriz de distancia
method = "ward" # Método de vinculación
)
# Agrupación de análisis de análisis visual
res.diana <- diana(x = USArrests, # matriz de datos
stand = TRUE, # estandarizar los datos
metric = "euclidean" # métrica para matriz de distancia
)Después de ejecutar agnes () y diana (), puede usar la función fviz_dend () [in factoextra] para visualizar la salida:
Después de haber mostrado como realiza la agrupación jerárquica en el capítulo anterior, es este capitulo se busca describir como comparar 2 dendrogramas usando el paquete de R llamada “dendextend”.
Se usara una base de datos ya dentro de R llamada “USArrests”, trabajando con una pequeña porción de los datos, seleccionando aleatoriamente 10 de las 10 observaciones dentro del data set:
Se comienza creando una lista con dos dendrogramas realizando la agrupación jerárquica utilizando dos formas diferentes de enlazarlos (usando “average” y “ward.D”), posteriormente, se transforma el resultado a un dendrograma y se crea la lista que los contenga.
library(dendextend)
#Calcular la distancia de la matrix
res.dist <- dist(df.1, method = "euclidean")
#Calculas las 2 agrupaciones gerarquicas
hc1 <- hclust(res.dist, method = "average")
hc2 <- hclust(res.dist, method = "ward.D2")
#Crear los dos dendogramas
den1 <- as.dendrogram(hc1)
den2 <- as.dendrogram(hc2)
#Crear la lista que contenga los dendogramas
dend_list <- dendlist(den1, den2)Para comparar ambos dendrogramas, se utilizara la función “tanglegram()”, dentro de la librería “dendextend” y esta función muestra ambos dendrogramas, una al lado del otro con sus etiquetas conectadas por líneas.
La calidad del alineamiento de ambos “arboles” puede ser medida usando la función “entanglement()”. El enredo se mide entre 1 (completamente enredado) y 0 (sin enredo); un nivel bajo de enredo corresponde a un buen alineamiento.
tanglegram(den1, den2,
highlight_distinct_edges = FALSE,
common_subtrees_color_lines = FALSE,
common_subtrees_color_branches = TRUE,
main = paste("entanglement =",
round(entanglement(dend_list),2)))## [,1] [,2]
## [1,] 1.0000000 0.9925544
## [2,] 0.9925544 1.0000000
## [,1] [,2]
## [1,] 1.0000000 0.9895528
## [2,] 0.9895528 1.0000000
La correlación entre ambos “arboles” puede calcularse como:
## [1] 0.9925544
## [1] 0.9895528
También es posible comparar simultáneamente múltiples dendrogramas. Un operador de cadena %>% es usado para correr múltiples funciones al mismo tiempo.
# Create multiple dendrograms by chaining
dend1 <- df.1 %>% dist %>% hclust("complete") %>% as.dendrogram
dend2 <- df.1 %>% dist %>% hclust("single") %>% as.dendrogram
dend3 <- df.1 %>% dist %>% hclust("average") %>% as.dendrogram
dend4 <- df.1 %>% 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
#Visualización de la matriz de correlación usando paquete de corrplot
library(corrplot)
corrplot(cors, "pie", "lower")Como se ha descrito en los capítulos anteriores, un dendrograma es una representación basada en un diagrama de árbol de un grupo de datos usando la agrupación jerárquica. En este capítulo, se obtendrá un código de R para ver y editar dendrpgramas.
Se comenzará calculando agrupación jerárquica usando la base de datos “USArrests”:
#Cargado de la data
data(USArrests)
#Calculo de las distancias y la agrupación jerarquica
dd <- dist(scale(USArrests), method = "euclidean")
hc <- hclust(dd, method = "ward.D2")library(factoextra)
#Creación de un dendrograma básico
fviz_dend(hc, cex = 0.5,
main = "dendrograma-ward.D2",
xlab = "Objetos", ylab = "Distancia", sub = "")
También es posible cortar el árbol a cierta altura, dividiendo los datos
en múltiples grupos como se describió en el capítulo 7 (Agrupación
Jerárquica), también es posible aplicar color a cada grupo y agregar un
rectángulo al rededor de cada grupo:
fviz_dend(hc,
k = 4,
cex = 0.5,
k_colors = c("#AF7AC5","#48C9B0","#F5B041","#58D68D"),
color_labels_by_k = TRUE,
rect = TRUE,
rect_fill = TRUE)También se puede cambiar el tema, utilizando los temas que se encuentran dentro de el paquete de ggplot2, algunos de estos se llaman: theme_gray(), theme_bw(), theme_minimal(), theme_classic(), theme_void().
fviz_dend(hc,
k = 4,
cex = 0.5,
k_colors = c("#AF7AC5","#48C9B0","#F5B041","#58D68D"),
color_labels_by_k = TRUE,
ggtheme = theme_gray()
)
Permitiendo los valores para k_color se incluyen algunas paletas del
paquete RColorBrewer además de paletas de colores de revista científica
del paquete ggsci.
Si se quiere un diagrama horizontal con rectángulos en las agrupaciones,
se usa:
fviz_dend(hc,
k = 4,
cex = 0.5,
horiz = TRUE,
k_colors = "jco",
rect = TRUE,
rect_border = "jco",
rect_fill =TRUE)
Adicional, también se puede presentar un dendrograma circular utilizando
la opción “type =”
Para presentar un árbol de tipo filogénico se usa en “type=”phylogenic”
y también “repel = TRUE” para evitar que los niveles se superposicionen.
Esta opción requiere de un paquete llamado “igraph”.
fviz_dend(hc,
k = 4,
k_colors = "jco",
type = "phylogenic",
repel = TRUE,
phylo_layout = "layout.gem")Si quieres calcular agrupaciones jerárquicas con un gran data set, o te gustaría hacer zoom en el dendrograma o mostrar nada más un subconjunto del dendrograma.
Se debe de seguir el siguiente procedimiento: - Crear un dendrograma completo usando “fviz_dend()” y guarda el resultado como un objeto. - Utiliza la función de R llamada “cut.dendrogram()” para cortar el dendrograma, dándole una altura (h), en múltipbles subconjuntos. Esto devuelve un listado con los componentes “\(upper" y "\)lower”. - Observa los subconjuntos de árboles usando “fviz_dend()”.
dend_plot <- fviz_dend(hc, k = 4,cex = 0.5, k_colors = "jco")
dend_data <- attr(dend_plot, "dendrogram")
dend_cuts <- cut(dend_data, h = 10)
fviz_dend(dend_cuts$upper)
También se pueden mostrar subconjuntos circulares:
El paquete dendextend da funciones para cambiar facílmente la apariencia de un dendrograma y para comparar dendrogramas.
En esta sección se usará el operador de cadena %>% para simplificar el código.
data <- scale(USArrests)
dist.res <- dist(data)
hc <- hclust(dist.res, method = "ward.D2")
dend <- as.dendrogram(hc)
plot(dend)library(dendextend)
dend <- USArrests[1:5,] %>%
scale %>%
dist %>%
hclust(method = "ward.D2") %>%
as.dendrogram
plot(dend)
- Funciones para editar dendrogramas: la función “set()” puede ser usada
para cambiar parámetros del dendrograma, el formato es:
\[ set (object, what, value)\] 1. Object: Objeto, en este caso un dendrograma 2. What: un carácter que indica cuál es la propiedad del árbol que debe ser cambiada o actualizada. 3. value: un vector con el valor a cambiar en el árbol (el tipo del valor depende de lo que se coloque en “what”)
library(dendextend)
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)Se describieron las funciones y paquetes para la visualización y arreglo de los dendrogramas, incluyendo: - fviz_dend() (en la librería factoextra), que brinda soluciones convenientes para el fácil trazado de un dendrograma. También puede ser usado para crear dendrogramas rectangulares y circulares, así como arboles filogénicos. - Y la librería dendextend, que brinda métodos flexibles para personalizar dendrogramas.
Además de mostrar como trazar un subconjunto de un dendrograma grande.
Los datos que se tomarán para el desarrollo de este ejemplo serán tomados de la página web “www.kaggle.com” que mediante un filtrado usando la palabra clave “cluster” se llegó a una base de datos que contiene la siguiente información:
Titulo: Wine Dataset for Clustering
Descripción: “Estos datos son el resultado de un análisis químico de vinos cultivados en la misma región de Italia, pero procedentes de tres cultivares diferentes. El análisis determinó las cantidades de 13 componentes presentes en cada uno de los tres tipos de vino:”
library(readr)
vinos <- read_csv("C:/Users/reque/Documents/R/METODOS PARA EL ANALISIS ECONOMICO/Parte2_AnálisisdeClúster/wine-clustering.csv")
head(vinos)## # 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>
Por lo cual, para el desarrollo del ejemplo nada más se tomarán las primeras 4 variables: - Alcohol - Ácido málico - Ceniza - Alcalinidad de la ceniza
library(dplyr)
vinos <- na.omit(vinos)
sub_vinos <- vinos %>%
select(Alcohol,
Malic_Acid,
Ash,
Ash_Alcanity)
boxplot(sub_vinos)
Debido a que no todas las variables se encuentran en una escala
comparable entre sí, en necesario someter a los datos a un proceso de
estandarización:
vinos.cua <- (nrow(sub_vinos.est) - 1) * sum(apply(sub_vinos.est, 2, var))
for (i in 2:15) vinos.cua[i] <- sum(kmeans(sub_vinos.est,
centers = i) $ withinss)
plot(1:15, vinos.cua,
type = "b",
xlab = "Cantidad de Clusters",
ylab="Suma de cuadrados dentro de grupos")
Para la elección de la cantidad de clusters, se utilizará el método
conocido como “el codo”, pero debido a que en el gráfico no se observa
uno con claridad, se concluye que el codo se encuentra entre el 3er y el
4to cluster.
fit1 <- kmeans(sub_vinos.est, 4)
sub_vinos.est <- data.frame(sub_vinos.est,
fit1$cluster)
aggregate(sub_vinos,
by = list(sub_vinos.est$fit1.cluster),
FUN = mean) ## Group.1 Alcohol Malic_Acid Ash Ash_Alcanity
## 1 1 13.14463 3.995366 2.412683 21.22683
## 2 2 12.49811 1.897838 2.583514 23.01622
## 3 3 12.39245 1.749388 2.067959 18.16735
## 4 4 13.83373 1.884706 2.458824 16.82353
##
## 1 2 3 4
## 41 37 49 51
Como se puede observar, 41 observaciones fueron agregadas al primer cluster, 37 observaciones fueron agregadas al segundo cluster, 49 fueron agregadas al tercero y 51 fueron agregadas al cuarto.
library(factoextra)
fviz_cluster(fit1, data = sub_vinos.est,
palette = c("#AF7AC5","#48C9B0","#F5B041","#58D68D"),
ellipse.type = "euclid",
star.plot = TRUE,
repel = TRUE,
ggtheme = theme_minimal()
)grupos_j <- cutree(fit2,
k = 4)
sub_vinos.est <- data.frame(sub_vinos.est,
grupos_j)
table(sub_vinos.est $ grupos_j)##
## 1 2 3 4
## 37 71 40 30
## Group.1 Alcohol Malic_Acid Ash Ash_Alcanity
## 1 1 13.91027 1.718919 2.470541 16.51622
## 2 2 12.32366 1.745915 2.187746 18.87746
## 3 3 13.23875 2.555250 2.591750 22.74000
## 4 4 13.16333 4.203333 2.361000 20.30333
Como se puede observar, 37 observaciones fueron agregadas al primer cluster, 71 observaciones fueron agregadas al segundo cluster, 40 fueron agregadas al tercero y 30 fueron agregadas al cuarto.