UNIVERSIDAD DE EL SALVADOR
FACULTAD DE CIENCIAS ECONÓMICAS
ESCUELA DE ECONOMÍA
METODOS PARA EL ANALISIS ECONÓMICO
ACTIVIDAD:
“Laboratorio 2, Análisis de Clúster(Conglomerados)”.
DOCENTE:
Carlos Ademir Pérez Alas.
GRUPO TEÓRICO:
03
INTEGRANTES:
Christian Moisés Murcia Zepeda. MZ18015
Salvador Antonio Figueroa Gonzalez. FG18006
.Ciudad Universitaria, 22 de noviembre de 2022
Corresponde a un conjunto de técnicas que permite clasificar observaciones en grupos, relativamente homogéneos internamente y al mismo tiempo relativamente diferentes entre ellos. A estos grupos se les denomina cluster o conglomerados. Y es de carácter exploratorio y descriptivo.
El propósito del análisis de conglomerados es agrupar las observaciones o casos de forma que los datos sean muy homogéneos dentro de los grupos, que tenga la mínima varianza y que estos grupos sean lo más heterogéneos posible entre ellos y tenga la máxima varianza posible. De este modo obtenemos una clasificación de los datos multivariante con la que podemos comprender mejor los mismos y la población de la que proceden. Podemos realizar análisis cluster de casos, un análisis cluster de variables y un análisis cluster por bloques si agrupamos variables y casos. El análisis cluster se podría ocupar por ejemplo para:
Con el análisis cluster se pretende encontrar un conjunto de grupos a los que ir asignando los distintos individuos por algún criterio de homogeneidad. Por lo tanto, se hace imprescindible definir una medida de similitud o bien de divergencia para ir clasificando a los individuos en unos u otros grupos.
library(kableExtra)
text_tbl <- data.frame(
Análisis_cluster = c("JERÁRQUICO
Los llamados métodos jerárquicos tienen por objetivo agrupar clúster para formar uno nuevo o bien separar alguno ya existente para dar origen a otros dos, de tal forma que, si sucesivamente se va efectuando este proceso de aglomeración o división, se minimice alguna distancia o bien se maximice alguna medida de similitud. Está comprendido en dos grandes grupos: Agrupamiento Aglomerativo y Disociativo. Los métodos aglomerativos también conocidos como ascendentes, comienzan el análisis con tantos grupos como individuos haya mientras que los métodos disociativos también llamados descendentes, constituyen el proceso inverso al anterior.",
"NO JERÁRQUICO
La agrupación en clústeres de particiones son métodos de agrupación que se utilizan para clasificar observaciones, dentro de un conjunto de datos, en varios grupos en función de su similitud. Los algoritmos requieren analista para especificar el número de conglomerados que se generarán." ),
Técnicas_Disponibles = c(
"AGLOMERATIVO
• Linkage Simple
• Linkage Completo
• Promedio entre grupos
• Método del centroide
• Método de la mediana
• Método de Ward
• Dendograma
• Mapa de Calor
DISOCIATIVO
• Linkage Simple
• Linkage Completo
• Promedio entre grupos
• Método del centroide
• Método de la mediana
• Método de Ward
• Análisis de asociación
• Detector Automático de Interacción.",
"Métodos de Reasignación:
• Centroides
• PAM
• CLARA
• K-medias
• Quick-Cluster
• Método de Forgy
• Nubes Dinámicas
Búsqueda de densidad:
• Aproximación Tipológica
• Análisis Modal
• Método Taxmap
• Método de Fortín
Aprobación Probabilística:
• Método de Wolf
Métodos Directos: Block-Clustering
Métodos Reductivos: Análisis Factorial tipo Q"),
Ventajas = c(
"• La principal ventaja del método jerarquico es que insinua el número de cluster
• No es necesario especificar el número de clusteres necesarios para el algoritmo
• El clustering jerárquico es fácil de implementar
• El dendrograma producido es muy útil para comprender los datos
• Nos permite visualizar simultaneamente, grupos de muestras y caracteristicas
",
"• Fácil de entender, fácil de adaptar.
• Trabaja bien con conjuntos de datos grandes o pequeños, es eficiente y tiene buen desempeño.
• K-medoids es un método de clustering más robusto que K-means, por lo es más adecuado cuando el set de datos contiene outliers o ruido"),
Desventajas = c(
"• Una vez que un elemento se agrega a un grupo, no puede pertenecer a otro, a esto se le conoce como anidamiento, el principal problema es que puede que dicha asignación no sea ideal.
• No es necesario especificar el número de clusteres necesarios para el algoritmo.
• El clustering jerárquico es fácil de implementar.
• El dendrograma producido es muy útil para comprender los datos.
",
"• Necesita que el usuario defina el número de clústeres.
• Necesito conocer k de antemano.
• Sensible a ruido.
• El resultado puede variar en base a las semillas elegidas al inicio.
• Presenta problemas de robustez.
• Algunas semillas pueden resultar en una tasa de convergencia menor
• La selección de semillas se puede basar en heurísticas o resultados obtenidos por otros métodos
• Puede caer en mínimos locales
• No trata datos nominales (K-Modes)."
)
)
kbl(text_tbl) %>%
kable_paper(full_width = F) %>%
column_spec(
1,
bold = T,background = "white",
width = "20em",
border_left = T,
border_right = T
) %>%
column_spec(2,
bold = T,
width = "15em",
background = "white") %>%
column_spec(
3,
bold = T,
width = "15em",
border_left = T,
background = "white"
) %>%
column_spec(
4,
bold = T,
width = "15em",
border_right = T,
border_left = T,
background = "white"
)
Análisis_cluster | Técnicas_Disponibles | Ventajas | Desventajas |
---|---|---|---|
JERÁRQUICO Los llamados métodos jerárquicos tienen por objetivo agrupar clúster para formar uno nuevo o bien separar alguno ya existente para dar origen a otros dos, de tal forma que, si sucesivamente se va efectuando este proceso de aglomeración o división, se minimice alguna distancia o bien se maximice alguna medida de similitud. Está comprendido en dos grandes grupos: Agrupamiento Aglomerativo y Disociativo. Los métodos aglomerativos también conocidos como ascendentes, comienzan el análisis con tantos grupos como individuos haya mientras que los métodos disociativos también llamados descendentes, constituyen el proceso inverso al anterior. |
AGLOMERATIVO • Linkage Simple • Linkage Completo • Promedio entre grupos • Método del centroide • Método de la mediana • Método de Ward • Dendograma • Mapa de Calor DISOCIATIVO • Linkage Simple • Linkage Completo • Promedio entre grupos • Método del centroide • Método de la mediana • Método de Ward • Análisis de asociación • Detector Automático de Interacción. |
• La principal ventaja del método jerarquico es que insinua el número de cluster • No es necesario especificar el número de clusteres necesarios para el algoritmo • El clustering jerárquico es fácil de implementar • El dendrograma producido es muy útil para comprender los datos • Nos permite visualizar simultaneamente, grupos de muestras y caracteristicas |
• Una vez que un elemento se agrega a un grupo, no puede pertenecer a otro, a esto se le conoce como anidamiento, el principal problema es que puede que dicha asignación no sea ideal. • No es necesario especificar el número de clusteres necesarios para el algoritmo. • El clustering jerárquico es fácil de implementar. • El dendrograma producido es muy útil para comprender los datos. |
NO JERÁRQUICO La agrupación en clústeres de particiones son métodos de agrupación que se utilizan para clasificar observaciones, dentro de un conjunto de datos, en varios grupos en función de su similitud. Los algoritmos requieren analista para especificar el número de conglomerados que se generarán. |
Métodos de Reasignación: • Centroides • PAM • CLARA • K-medias • Quick-Cluster • Método de Forgy • Nubes Dinámicas Búsqueda de densidad: • Aproximación Tipológica • Análisis Modal • Método Taxmap • Método de Fortín Aprobación Probabilística: • Método de Wolf Métodos Directos: Block-Clustering Métodos Reductivos: Análisis Factorial tipo Q |
• Fácil de entender, fácil de adaptar. • Trabaja bien con conjuntos de datos grandes o pequeños, es eficiente y tiene buen desempeño. • K-medoids es un método de clustering más robusto que K-means, por lo es más adecuado cuando el set de datos contiene outliers o ruido |
• Necesita que el usuario defina el número de clústeres. • Necesito conocer k de antemano. • Sensible a ruido. • El resultado puede variar en base a las semillas elegidas al inicio. • Presenta problemas de robustez. • Algunas semillas pueden resultar en una tasa de convergencia menor • La selección de semillas se puede basar en heurísticas o resultados obtenidos por otros métodos • Puede caer en mínimos locales • No trata datos nominales (K-Modes). |
Fuente: elaboración propia con base en (Fuente, Santiago, 2016)
Aglomerativos.
La agrupación aglomerativa funciona de manera “ascendente”. Es decir, cada objeto es inicialmente considerado como un grupo de un solo elemento (hoja). En cada paso del algoritmo, los dos clústeres que son más similares se combinan en un nuevo clúster más grande. Este procedimiento se repite hasta que todos los puntos son miembros de un solo cluster grande.
En otras palabras, en los aglomerativos, inicialmente, cada individuo es un grupo en si mismo. Sucesivamente se van formando grupos de mayor tamaño fusionando grupos cercanos entre sí, los cuales al final construyen un solo grupo. La agrupación aglomerativa es buena para identificar agrupaciones pequeñas. [@clusterif]
Existen muchos métodos aglomerativos de cluster, los más comunes son los siguientes:
Vinculación máxima o completa: La distancia entre dos clústeres se define como el valor máximo de todas las distancias por pares entre los elementos del clúster 1 y los elementos del grupo temático 2. Tiende a producir clústeres más compactos.
Vinculación mínima o única: Se define la distancia entre dos clústeres como valor mínimo de todas las distancias por pares entre los elementos en el grupo 1 y los elementos del grupo 2.
Vinculación promedio: La distancia entre los dos clústeres es definida como la distancia promedios entre los elementos del grupo 1 y los del 2.
Método de varianza mínima de Ward: Minimiza la varianza total dentro del grupo. En cada paso, el par de clústeres con una distancia mínima entre clústeres se fusionan.
Estructura y preparación de la data. La data debería ser una matriz numérica, donde las filas represente observaciones y las columnas representen variables, se carga la data y se estandariza con la función scale().
Medidas de similitud. Para decidir qué objetos/clústeres deben combinarse o dividirse, necesitamos métodos para medir la similitud entre objetos. En el software R, se puede usar la función dist() para calcular la distancia entre cada par de objetos de un conjunto de datos. Los resultados de este cálculo se conocen como matriz de distancia o disimilitud. (kassambara2017practical)
Con esta función “dist()” se puede calcular la distancia disimilar de una matriz, ejecutando la función en la variable creada con la data estandarizada. Para ver fácilmente la información de distancia entre objetos, reformateamos los resultados de la función dist() en una matriz usando la función as.matrix(). 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 sí mismo (que es cero). El elemento 1,2 representa la distancia entre el objeto 1 y el objeto 2, y así sucesivamente.
Uso de la función linkage. Es una función para agrupar objetos en árbol de clúster jerárquico, basado en la información de distancia generada en el paso 1. Los objetos/clústeres que están muy cerca se vinculan entre sí mediante la función de “linkage”.
Si se tiene una matriz de distancia “res.dist” generada por dist() , la función base R hclust() se puede usar para crear el árbol jerárquico.
Los dendrogramas corresponden a la representación gráfica del árbol jerárquico generado por la función hclust(). El dendrograma se puede producir en R usando la función base plot(res.hc), donde res.hc es la salida de hclust(). Aquí, usaremos la función fviz_dend()[ in factoextra R package] para producir un dendrograma visualmente mas atractivo.
Para ello hay que instalar el paquete factorextra y usar la librería Primero instale factoextra escribiendo esto: install.packages(“factoextra”); siguiente visualización , y le pasamos la función fviz_dend() a la variable creada en el paso anterior.
Desagregativos.
Este enfoque funciona “de arriba hacia abajo”. Comienza con la raíz, en la que todos los objetos se incluyen en un solo clúster. Este proceso es similar al de los aglomerativos, solo que, inicialmente todos los individuos forman un solo grupo y se van sucesivamente desgajando de el, formando dos grupos, tres grupos y así hasta el final del proceso, cada caso forma un único grupo. la agrupación desagregativa es buena para identificar agrupaciones largas.[@análisisb]
Explicación de la librería y sintaxis para implementarla en R.
Un mapa de calor (o mapa de calor) es otra forma de visualizar la agrupación jerárquica. Es también se denomina imagen de color falso, donde los valores de los datos se transforman en escala de color. Los mapas de calor nos permiten visualizar simultáneamente grupos de muestras y características. La primera agrupación jerárquica se realiza tanto de las filas como de las columnas de la matriz de datos. Las columnas/filas de la matriz de datos se reordenan de acuerdo con el resultado de agrupación jerárquica, poniendo observaciones similares cerca unas de otras. Los bloques de ‘alto’ y los valores “bajos” son adyacentes en la matriz de datos. Finalmente, se aplica un esquema de color para la visualización y se muestra la matriz de datos.
Visualizar la matriz de datos de esta manera puede ayudar a encontrar las variables que parecen ser características de cada muestra.
Hay un número múltiple de paquetes de R y funciones para dibujar de forma interactiva y mapas de calor estáticos, incluyendo:
Dibuja un mapa de calor simple.
Luego de hacer la respectiva carga de la data a usar, podemos la función heatmap() en la cual se incluye x que es la matriz numérica , y scale que es el que indica que los valores deben estar centrados y escalados en filas , columnas o en ninguna.
En la grafica resultante de la función se puede especificar los colores esperados con el argumento col o la librería RColorBrewer, por ejemplo si se indica que se desean tener tonos rojos y amarillos(los que tira por default) los valores altos tiene tono rojo y los bajos amarillo.
Dibuja un mapa de calor mejorado en comparación con la función base R. (kassambara2017practical)
La función heatmap.2 () [en paquete gplots] proporciona muchas extensiones a la función estándar R heatmap() presentada en la sección anterior.
se instala el paquete gplots para hacer uso de la librería, luego se escribe la función heatmap.2 y se puede indicar la escala, el color, el rastro y la información de densidad.
El resultado es un gráfico más atractivo y robusto.
Dibuja bonitos mapas de calor y proporciona más control para cambiar la apariencia de los mapas de calor. (bibliografía)
Primero se debe instalar el paquete pheatmap para hacer uso de la librería. Al llamar la función pheatmat() los argumentos están disponibles para cambiar la métrica de agrupación en clústeres predeterminada (“euclidiana”) y método (“completo”). También es posible anotar filas y columnas mediante la agrupación de variables.
El resultado es un mapa mas atractivo visualmente y ordenado.
Dibuja un mapa de calor interactivo/en el que se puede hacer clic.
Primero, hacer la istalacion del paquete d3heatmap, para hacer uso de la librería, donde se puede indicar la escalar y los colores deseados, asi como también poner el numero de grupos en las filas y en las columnas . La función d3heamap() permite:
• Poner el mouse en una celda del mapa de calor de interés para ver los nombres de las filas y las columnas, así como el valor correspondiente.
• Seleccionar un área para hacer zoom. Después de hacer zoom, hacer clic en el mapa de calor nuevamente para ir volver a la pantalla anterior.
Dibuja, anota y organiza mapas de calor complejos (muy útiles para el análisis de datos genómicos). [@clusteri]
El paquete dendextend se puede utilizar para mejorar las funciones de otros paquetes. Los datos de mtcars se utilizan en las siguientes secciones. Se comenzara definiendo el orden y la apariencia de las filas y columnas usando dendextend.
ComplexHeatmap es un paquete R/bioconductor, desarrollado por Zuguang Gu, que proporciona una solución flexible para organizar y anotar múltiples mapas de calor. Permite también visualizar la asociación entre diferentes datos de diferentes fuentes.
Agrupación k-medias es la técnica más utilizada sin supervisión, algoritmo de aprendizaje automático para particionar un conjunto de datos determinados en un conjunto de grupos k, donde k representa el número de grupos preespecificados por el analista. Eso clasifica objetos en varios grupos, de modo que los objetos dentro de los mismos grupos son lo más similares posible, mientras que los objetos de diferentes grupos son lo menos similares posible. En agrupación k-medias, cada cluster es representado por su centro que corresponde a la media de puntos asignados al cluster.[@análisisb]
La idea básica detrás de agrupación k-medias consiste en definir clusteres de modo que la variación total intra-cluster (conocida como variación total dentro del cluster) se minimiza.
El primer paso cuando se utiliza la agrupación en clústeres de k-medias es indicar el número de clústeres (k) que se generará en la solución final. El algoritmo comienza seleccionando aleatoriamente k objetos del conjunto de datos para que sirvan como el centro inicial para los clústeres. Los objetos seleccionados también se conocen como medios de clúster o centroides. Después del paso de asignación, el algoritmo calcula el nuevo valor medio de cada clúster. El término clúster “actualización de centroide” se utiliza para diseñar este paso. Ahora que los centros se han recalculado, cada observación se comprueba de nuevo para ver si podría estar más cerca de un cluster diferente. Todos los objetos son nuevamente reasignados usando el cluster medio actualizado. [@clusteri]
Los pasos de asignación de clusteres y actualización de centroides se repiten iterativamente hasta que las asignaciones de clusteres logran convergencia, es decir, el cluster formado en la iteración actual es el mismo que el de la anterior.
Preparar la data. Los datos deben contener sólo variables continuas, como la k-medias. El algoritmo utiliza medios variables. Como no se quiere que el algoritmo k-means dependa de una unidad variable arbitraria, comenzamos escalando los datos usando la función R “scale ()”.
Paquetes y funciones de R requeridos. Se usa la función estándar para el agrupamiento de k-medias “kmeans ()” , en la cual hay que identificar “X” , que es una matriz numérica, data frame o un vector numérico; así como el centro cuyo valor posible será el numero de clusteres (K) o un set inicial de centros de cluster (distintos); el numero máxima de iteraciones permitidas y el numero de particiones iniciales aleatorias cuando los centros es un numero (nstart debe ser mayor a 1). Pero, se recomienda calcular la agrupación en clústeres de K-Medias con un valor grande de Nstart como 25 o 50, con el fin de tener un resultado más estable.
Se hará uso de la librería “factorextra” para uso estético de los gráficos creados con “kmeans ()”.
Estimación del número óptimo de clusteres. K-medias requiere que los usuarios especifiquen el numero de clusteres que se realizaran, pero, ¿Cómo elegir el numero correcto de clusteres esperados? Hay diferentes métodos para saber el número correcto, la solución simple es calcular la agrupación en clusteres de k-medias utilizando diferentes valores de k. La función R “fviz_nbclust ()” [en el paquete factorextra] proporciona una solución conveniente para estimar el número óptimo de clústeres.
Computación de agrupación k-medias. Como el algoritmo de agrupamiento k-medias comienza con k centroides seleccionados al azar, siempre es recomendado utilizar la función “Set.seed()” para establecer una para el generador de números aleatorios de R.
Se busca hacer los resultados reproducibles, usando un código que realiza la agrupación en clusteres de k-medias, indicando el número de k y de nstart, como ya antes mencionado, es altamente recomendado que el valor de nstart este entre 25 a 50 para mayor estabilidad del resultado.
Es posible calcular la media de cada variable por clústeres utilizando los datos originales, con el comando “aggregate”; si se desea agregar las clasificaciones de puntos de los datos originales, lo hacemos con un “cbind”.
Accediendo a los resultados de la función k-medias. La función k-medias devuelve una lista de componentes que incluyen: cluster, centros, la suma total de cuadrados, vector de la suma de cuadrados dentro del grupo, el total de la suma de cuadrados dentro del grupo, y el total de la suma de cuadrado entre los grupos. Usando un “$” podemos pedirle a r que nos muestre cualquiera de los componentes antes mencionados.
Visualización de clústeres de k-medias. La función “fviz_cluster ()” [paquete factorextra] se puede utilizar para visualizar fácilmente los clústeres de k-means. Toma los resultados de k-medias y los datos originales como argumentos. En la gráfica resultante, las observaciones se representan por puntos, utilizando componentes principales si el número de variables es mayor que 2. También es posible dibujar la elipse de concentración alrededor de cada grupo. [@clusteria]
El algoritmo k-Medoides es un enfoque de agrupamiento relacionado con el agrupamiento de k-medias, para particionar un conjunto de datos en k grupos o clústeres. En la agrupación de k-Medoides, cada clúster está representado por uno de los puntos de datos del clúster. Estos puntos son Medoides de clúster con nombre.
El término medoide se refiere a un objeto dentro de un grupo para el cual la disimilitud promedio entre él y todos los demás miembros del clúster es mínimo. Corresponde a el punto más céntrico del clúster. Estos objetos pueden ser considerado como un ejemplo representativo de los miembros de ese grupo que puede ser útil en algunas situaciones.
K-Medoides es una alternativa robusta de la agrupación de k-medias. Esto significa que, el algoritmo es menos sensible al ruido y a los valores atípicos, en comparación con las k-medias, porque utiliza Medoides como centros de clúster en lugar de medias. (bibliografía) El método de agrupamiento k-Medoides más común es el algoritmo PAM. o Método PAM.
El uso de medios implica que la agrupación de k-medias es altamente sensible a los valores atípicos. Éste puede afectar gravemente la asignación de observaciones a grupos. Un algoritmo más robusto es proporcionado por el algoritmo PAM. [@clusteric]
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 cúmulos se construyen asignando cada observación al medoide más cercano.
A continuación, cada medoide seleccionado y cada punto de datos no medoide se intercambian y se calcula la función objetivo. La función objetivo corresponde a la suma de las diferencias de todos los objetos a su medoide más cercano. El paso SWAP intenta mejorar la calidad de la agrupación en clústeres 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 swap. Esto continúa hasta que la función objetiva ya no puede ser decreciente. El objetivo es encontrar k objetos representativos que minimicen la suma de las diferencias de las observaciones con respecto a su objeto representativo más cercano.*[@clusteria]
Preparar la data. Se carga la data a usar, usando la función “scale()” de R.
Paquetes y funciones de R requeridos. La función “pam()” [paquete de clúster] y “pamk()” [paquete fpc] se pueden utilizar para calcular PAM. La función “pamk()” no requiere que un usuario decida el número de clústeres K; donde al usar pam se pone la “X” la cual puede tener el valor de una matriz numérica o un data frame donde cada fila corresponde a una observación y cada columna a una variable,y “X” también puede representar el valor de una matriz de similitud; K es el numero de clusteres ; se decide la distancia metrica a usar y el valor lógico.
Se hará uso de la librería “factorextra” para uso estético de los gráficos creados con “pam()”, asi como también se carga la librería “cluster”.
Estimation del numero optimo de clusteres. Para estimar el número óptimo de clústeres, usaremos el método de silueta promedio. La idea es calcular el algoritmo PAM utilizando diferentes valores de los clústeres k. Próximo la silueta promedio de los cúmulos se dibuja de acuerdo con el número de grupos. El La silueta media mide la calidad de un agrupamiento. Una silueta media alta width indica una buena agrupación. El número óptimo de clusters k es el que maximizar la silueta media en un rango de valores posibles para k.*[@clusteri]
La librería factorextra contiene la función R “fviz_nbclust()” que proporciona una solución conveniente para estimar el número óptimo de clústeres.
Computación de agrupación PAM. Se crea una variable Si se desea agregar las clasificaciones de puntos de los datos originales, lo hacemos con un “cbind”.
Acceder a los resultados de la función pam(). La función pam() devuelve un objeto de clase pam cuyos componentes incluyen : medoides y clustering, con un “$” en la variable creada le podemos indicar a R lo que queremos que nos muestre , ya sea los medoides o los clustering.
Visualizacion de clusteres de pam. Para visualizar los resultados de la partición, usaremos la función fviz_cluster() [factoextra paquete]. Dibuja un diagrama de dispersión de puntos de datos coloreados por números de clúster. 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 trazar los datos.
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 agenerar un conjunto óptimo de medoides para la muestra. La calidad de los medoides resultantes se mide por la disimilitud media entre cada objeto de todo el conjunto de datos y el medoide de su cluster, definido como la función de costo.
CLARA repite los procesos de muestreo y agrupación un número de veces prees especificado con el fin de 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.
Para que divida aleatoriamente los conjuntos de datos en múltiples subconjuntos con tamaño fijo. (bibliografía).
Calcule el algoritmo PAM en cada subconjunto y elija la k correspondiente objetos representativos (medoides). Asignar cada observación de todos los datos establecido en el medoide más cercano.
Calcular la media (o la suma) de las diferencias de las observaciones a su medoide más cercano. Esto se utiliza como una medida de la bondad de la agrupación.
Conservar el conjunto de set de datos para el que la media (o suma) es mínima. Se lleva a cabo un análisis adicional en la partición final.
Preparar la data. Se hace la carga de la data a usar .Generaremos usando un conjunto de datos aleatorios. Para que el resultado sea reproducible, comenzamos mediante la función “set.seed()”.
Paquetes y funciones de R requeridos. La función “clara()”[paquete de clúster] se puede utilizar para calcular CLARA. Al poner esta funcion se debe poner: “X” que representa a una matriz numérica o un data frame en la que cada fila corresponde a una observación y cada columna a una variable; k que representa el numero de clusteres; la distancia metrica a usar; el valor lógico; el numero de muestras que se extraerá del conjunto de datos y la indicacio lógica que debería ser siempre cierta.
Se hará uso de la librería “factorextra” para uso estético de los gráficos creados con “clara()”, asi como también se carga la librería “cluster”.
Estimar el numero optimo de clusteres. Para estimar el número óptimo de clústeres, usaremos el método de silueta promedio. La librería factorextra contiene la función R “fviz_nbclust()” que proporciona una solución conveniente para estimar el número óptimo de clústeres.
Informática CLARA. Se crea una variable Si se desea agregar las clasificaciones de puntos de los datos originales, lo hacemos con un “cbind”. La función “clara()” devuelve un objeto clara cuyos componentes incluyen : medoides, clustering y muestra, con un “$” en la variable creada le podemos indicar a R lo que queremos que nos muestre , ya sea los medoides, los clustering, o la muestra.
Visualizacion de clusteres de clara. Para visualizar los resultados de la partición, usaremos la función fviz_cluster() [factoextra paquete]. Dibuja un diagrama de dispersión de puntos de datos coloreados por números de clúster.
Carga de datos
data("USArrests") # Cargando el conjunto de datos
df <- USArrests #Escalar los datos
# Ver las primeras 3 filas de datos
head(df, n = 3)
## Murder Assault UrbanPop Rape
## Alabama 13.2 236 58 21.2
## Alaska 10.0 263 48 44.5
## Arizona 8.1 294 80 31.0
library(factoextra)
fviz_nbclust(df, kmeans, method = "wss") +
geom_vline(xintercept = 4, linetype = 2)
# Calcule 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 14, 10, 10, 16
##
## Cluster means:
## Murder Assault UrbanPop Rape
## 1 8.214286 173.2857 70.64286 22.84286
## 2 5.590000 112.4000 65.60000 17.27000
## 3 2.950000 62.7000 53.90000 11.51000
## 4 11.812500 272.5625 68.31250 28.37500
##
## Clustering vector:
## Alabama Alaska Arizona Arkansas California
## 4 4 4 1 4
## Colorado Connecticut Delaware Florida Georgia
## 1 2 4 4 1
## Hawaii Idaho Illinois Indiana Iowa
## 3 2 4 2 3
## Kansas Kentucky Louisiana Maine Maryland
## 2 2 4 3 4
## Massachusetts Michigan Minnesota Mississippi Missouri
## 1 4 3 4 1
## Montana Nebraska Nevada New Hampshire New Jersey
## 2 2 4 3 1
## New Mexico New York North Carolina North Dakota Ohio
## 4 4 4 3 2
## Oklahoma Oregon Pennsylvania Rhode Island South Carolina
## 1 1 2 1 4
## South Dakota Tennessee Texas Utah Vermont
## 3 1 1 2 3
## Virginia Washington West Virginia Wisconsin Wyoming
## 1 1 3 3 1
##
## Within cluster sum of squares by cluster:
## [1] 9136.643 1480.210 4547.914 19563.863
## (between_SS / total_SS = 90.2 %)
##
## Available components:
##
## [1] "cluster" "centers" "totss" "withinss" "tot.withinss"
## [6] "betweenss" "size" "iter" "ifault"
aggregate(USArrests, by=list(cluster=km.res$cluster), mean)
## cluster Murder Assault UrbanPop Rape
## 1 1 8.214286 173.2857 70.64286 22.84286
## 2 2 5.590000 112.4000 65.60000 17.27000
## 3 3 2.950000 62.7000 53.90000 11.51000
## 4 4 11.812500 272.5625 68.31250 28.37500
dd <- cbind(USArrests, cluster = km.res$cluster)
head(dd)
## Murder Assault UrbanPop Rape cluster
## Alabama 13.2 236 58 21.2 4
## 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 1
# Número de conglomerado para cada una de las observaciones
km.res$cluster
## Alabama Alaska Arizona Arkansas California
## 4 4 4 1 4
## Colorado Connecticut Delaware Florida Georgia
## 1 2 4 4 1
## Hawaii Idaho Illinois Indiana Iowa
## 3 2 4 2 3
## Kansas Kentucky Louisiana Maine Maryland
## 2 2 4 3 4
## Massachusetts Michigan Minnesota Mississippi Missouri
## 1 4 3 4 1
## Montana Nebraska Nevada New Hampshire New Jersey
## 2 2 4 3 1
## New Mexico New York North Carolina North Dakota Ohio
## 4 4 4 3 2
## Oklahoma Oregon Pennsylvania Rhode Island South Carolina
## 1 1 2 1 4
## South Dakota Tennessee Texas Utah Vermont
## 3 1 1 2 3
## Virginia Washington West Virginia Wisconsin Wyoming
## 1 1 3 3 1
head(km.res$cluster, 4)
## Alabama Alaska Arizona Arkansas
## 4 4 4 1
# Tamaño de Cluster
km.res$size
## [1] 14 10 10 16
# Media de Cluster
km.res$centers
## Murder Assault UrbanPop Rape
## 1 8.214286 173.2857 70.64286 22.84286
## 2 5.590000 112.4000 65.60000 17.27000
## 3 2.950000 62.7000 53.90000 11.51000
## 4 11.812500 272.5625 68.31250 28.37500
fviz_cluster(
km.res,
data = df,
palette = c("#2E9FDF", "#00AFBB", "#E7B800", "#FC4E07"),
ellipse.type = "euclid",
# Elipse de concentración
star.plot = TRUE,
# Agregar segmentos de centroides a elementos
repel = TRUE,
# Evitar el exceso de etiqueta (lento)
ggtheme = theme_minimal()
)
df <- scale(USArrests) # Escala de la data
library(cluster)
library(factoextra)
library(cluster)
library(factoextra)
fviz_nbclust(df, pam, method = "silhouette") +
theme_classic()
pam.res <- pam(df, 2)
print(pam.res)
## Medoids:
## ID Murder Assault UrbanPop Rape
## New Mexico 31 0.8292944 1.3708088 0.3081225 1.1603196
## Nebraska 27 -0.8008247 -0.8250772 -0.2445636 -0.5052109
## Clustering vector:
## Alabama Alaska Arizona Arkansas California
## 1 1 1 2 1
## Colorado Connecticut Delaware Florida Georgia
## 1 2 2 1 1
## Hawaii Idaho Illinois Indiana Iowa
## 2 2 1 2 2
## Kansas Kentucky Louisiana Maine Maryland
## 2 2 1 2 1
## Massachusetts Michigan Minnesota Mississippi Missouri
## 2 1 2 1 1
## Montana Nebraska Nevada New Hampshire New Jersey
## 2 2 1 2 2
## New Mexico New York North Carolina North Dakota Ohio
## 1 1 1 2 2
## Oklahoma Oregon Pennsylvania Rhode Island South Carolina
## 2 2 2 2 1
## South Dakota Tennessee Texas Utah Vermont
## 2 1 1 2 2
## Virginia Washington West Virginia Wisconsin Wyoming
## 2 2 2 2 2
## Objective function:
## build swap
## 1.441358 1.368969
##
## Available components:
## [1] "medoids" "id.med" "clustering" "objective" "isolation"
## [6] "clusinfo" "silinfo" "diss" "call" "data"
dd <- cbind(USArrests, cluster = pam.res$cluster)
head(dd, n = 3)
## 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
# Medoides de cluster: Nuevo México, Nebraska
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
# Numero de Cluster
head(pam.res$clustering)
## Alabama Alaska Arizona Arkansas California Colorado
## 1 1 1 2 1 1
fviz_cluster(
pam.res,
palette = c("#00AFBB", "#FC4E07"),
# Paleta de color
ellipse.type = "t",
# Elipse de concentracion
repel = TRUE,
# Evitar el exceso de etiqueta (lento)
ggtheme = theme_classic()
)
set.seed(1234)
# Genera 500 objetos, divididos en 2 clusters.
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))
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
library(cluster)
library(factoextra)
fviz_nbclust(df, clara, method = "silhouette") +
theme_classic()
#Calcular CLARA
clara.res <- clara(df, 2, samples = 50, pamLike = TRUE)
#Imprimir componenetes 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"
dd <- cbind(df, cluster = clara.res$cluster)
head(dd, 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
#Medoides
clara.res$medoids
## x y
## S121 -1.531137 1.145057
## S455 48.357304 50.233499
#Agrupacion
head(clara.res$clustering, 10)
## S1 S2 S3 S4 S5 S6 S7 S8 S9 S10
## 1 1 1 1 1 1 1 1 1 1
fviz_cluster(
clara.res,
palette = c("#00AFBB", "#FC4E07"),
# color palette
ellipse.type = "t",
# Concentration ellipse
geom = "point",
pointsize = 1,
ggtheme = theme_classic()
)
Usando los conjuntos de datos de USArrests base R.
# Cargar los datos
data("USArrests")
# estadarizacion de 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
# Calcule la matriz de disimilitud
# df = los datos estandarizados
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")
# cex: tamaño de etiqueta
library("factoextra")
fviz_dend(res.hc, cex = 0.5)
# Calculo de la distancia del coeficiente
res.coph <- cophenetic(res.hc)
# Correlacion entre la distancia del coeficiente y
# la distancia original
cor(res.dist, res.coph)
## [1] 0.6975266
res.hc2 <- hclust(res.dist, method = "average")
cor(res.dist, cophenetic(res.hc2))
## [1] 0.7180382
# Cortar el árbol en 4 grupos
grp <- cutree(res.hc, k = 4)
head(grp, n = 4)
## Alabama Alaska Arizona Arkansas
## 1 2 2 3
# Número de miembros en cada grupo
table(grp)
## grp
## 1 2 3 4
## 7 12 19 12
# Obtener los nombres de los miembros del clúster 1
rownames(df)[grp == 1]
## [1] "Alabama" "Georgia" "Louisiana" "Mississippi"
## [5] "North Carolina" "South Carolina" "Tennessee"
# Cortar en 4 grupos y dar coor a cada grupo
fviz_dend(
res.hc,
k = 4,
# dividir en cuatro grupos
cex = 0.5,
# tamaño de etiqueta
k_colors = c("#2E9FDF", "#00AFBB", "#E7B800", "#FC4E07"),
color_labels_by_k = TRUE,
# etiquetas de color por grupos
rect = TRUE # Agregando rectángulo alrededor de los grupos
)
fviz_cluster(
list(data = df, cluster = grp),
palette = c("#2E9FDF", "#00AFBB", "#E7B800", "#FC4E07"),
ellipse.type = "convex",
# Elipse de concentración
repel = TRUE,
# Evitar la superposición de etiquetas (slow)
show.clust.cent = FALSE,
ggtheme = theme_minimal()
)
library("cluster")
# Anidando la aglomeración (agrupamiento jerárquico)
res.agnes <- agnes(
x = USArrests,
# data matrix
stand = TRUE,
# estandarización de datos
metric = "euclidean",
# métrica para matriz de distancia
method = "ward" # # Agrupación de análisis de análisis visual
)
# Agrupación de análisis de análisis visual
res.diana <- diana(x = USArrests, # data matrix
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
fviz_dend(res.agnes, cex = 0.6, k = 4)
Preparación de datos
df <- scale(USArrests)
# Subconjunto que contiene 10 filas
set.seed(123)
ss <- sample(1:50, 10)
df <- df[ss, ]
Comparación de dendrogramas
library(dendextend)
# Calcular matriz de distancias
res.dist <- dist(df, method = "euclidean")
# Calculo de 2 agrupaciones jerárquicas
hc1 <- hclust(res.dist, method = "average")
hc2 <- hclust(res.dist, method = "ward.D2")
# Creando dos dendrogramas
dend1 <- as.dendrogram (hc1)
dend2 <- as.dendrogram (hc2)
# Creando una lista para contener dendrogramas
dend_list <- dendlist(dend1, dend2)
Comparación visual de dos dendrogramas
tanglegram(dend1, dend2)
Personalizando el tanglegram
tanglegram(
dend1,
dend2,
highlight_distinct_edges = FALSE,
# Desactivar líneas discontinuas
common_subtrees_color_lines = FALSE,
# Colores de línea de desactivación
common_subtrees_color_branches = TRUE,
# Colores de ramas comunes
main = paste("entanglement =", round(entanglement(dend_list), 2))
)
# Matriz de correlación cofenética
cor.dendlist(dend_list, method = "cophenetic")
## [,1] [,2]
## [1,] 1.0000000 0.9925544
## [2,] 0.9925544 1.0000000
# Matriz de correlación de Baker
cor.dendlist(dend_list, method = "baker")
## [,1] [,2]
## [1,] 1.0000000 0.9895528
## [2,] 0.9895528 1.0000000
La correlación entre dos árboles también se puede calcular de la siguiente manera:
# Coeficiente de correlación cofenética
cor_cophenetic(dend1, dend2)
## [1] 0.9925544
# Matriz de correlación de Baker
cor_bakers_gamma(dend1, dend2)
## [1] 0.9895528
# Crea múltiples dendrogramas encadenando
dend1 <- df %>% dist %>% hclust("complete") %>% as.dendrogram
dend2 <- df %>% dist %>% hclust("single") %>% as.dendrogram
dend3 <- df %>% dist %>% hclust("average") %>% as.dendrogram
dend4 <- df %>% dist %>% hclust("centroid") %>% as.dendrogram
# Calcular matriz de correlación
dend_list <- dendlist(
"Complete" = dend1,
"Single" = dend2,
"Average" = dend3,
"Centroid" = dend4
)
cors <- cor.dendlist(dend_list)
# Imprimir matriz de correlación
round(cors, 2)
## 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
# Visualizando la matriz de correlación usando el paquete corrplot
library(corrplot)
corrplot(cors, "pie", "lower")
data(USArrests)
# Calcular distancias y agrupamiento jerárquico
dd <- dist(scale(USArrests), method = "euclidean")
aj <- hclust(dd, method = "ward.D2")
# Creando dendogramas usando factoextra
library(factoextra)
fviz_dend(aj, cex = 0.5)
Puede usar los argumentos main, sub, xlab, ylab para cambiar los títulos de la trama
library(factoextra)
fviz_dend(
aj,
cex = 0.5,
main = "Dendrogram - ward.D2",
xlab = "Objects",
ylab = "Distance",
sub = ""
)
Para dibujar un dendrograma horizontal
fviz_dend(aj, cex = 0.5, horiz = TRUE)
Coloreando las ramas por grupos y agregar un rectángulo alrededor de cada grupo.
fviz_dend(
aj,
k = 4,
# cortar en cuatro grupos
cex = 0.5,
# tamaño de etiqueta
k_colors = c("#2E9FDF", "#00AFBB", "#E7B800", "#FC4E07"),
color_labels_by_k = TRUE,
# etiquetas de color por grupos
rect = TRUE # Add rectangle around groups
)
fviz_dend(
aj,
k = 4,
# Cortar en cuatro grupos
cex = 0.5,
# tamaño de etiqueta
k_colors = c("#2E9FDF", "#00AFBB", "#E7B800", "#FC4E07"),
color_labels_by_k = TRUE,
# etiquetas de color por grupos
ggtheme = theme_gray() # Cambiar tema
)
En el código R a continuación, cambiaremos los colores del grupo usando “jco”
fviz_dend(aj,
cex = 0.5,
k = 4,
# cortar en cuatro grupos
k_colors = "jco")
Dibujar un dendrograma horizontal con un rectángulo alrededor de los grupos
fviz_dend(
aj,
k = 4,
cex = 0.4,
horiz = TRUE,
k_colors = "jco",
rect = TRUE,
rect_border = "jco",
rect_fill = TRUE
)
Además, puede trazar un dendrograma circular usando la opción type = “circular”.
fviz_dend(
aj,
cex = 0.5,
k = 4,
k_colors = "jco",
type = "circular"
)
Usando el paquete igraph
library(igraph)
require("igraph")
fviz_dend(
aj,
k = 4,
k_colors = "jco",
type = "phylogenic",
repel = TRUE
)
require("igraph")
# Probando phylo.layout = "layout.gem":
fviz_dend(
aj ,
k = 4,
# cortar en cuatro grupos
k_colors = "jco",
type = "phylogenic",
repel = TRUE,
phylo_layout = "layout.gem"
)
Para realizar zoom en los primeros clústeres, es posible usar la opción xlim y ylim para limitar el área de la parcela.
fviz_dend(aj, xlim = c(1, 20), ylim = c(1, 8))
# Cree una gráfica de todo el dendrograma,
# y extrae los datos del dendrograma
dend_plot <- fviz_dend(aj,
k = 4,
# cortar en grupos de cuatro
cex = 0.5,
# tamaño de etiqueta
k_colors = "jco")
dend_data <-
attr(dend_plot, "dendrogram") # Extraer datos de dendrograma
# Cortar el dendrograma a la altura h = 10
dend_cuts <- cut(dend_data, h = 10)
# Visualice la versión truncada que contiene
# dos ramas
fviz_dend(dend_cuts$upper)
Trazar subárboles dendrogramas
# Trazar el dendrograma completo
print(dend_plot)
# Trazar el subárbol 1
fviz_dend(dend_cuts$lower[[1]], main = "Subtree 1")
# Trazar el subárbol 2
fviz_dend(dend_cuts$lower[[2]], main = "Subtree 2")
# trazar árbol circular
fviz_dend(dend_cuts$lower[[2]], type = "circular")
#Código R estándar para crear un dendrograma
data <- scale(USArrests)
dist.res <- dist(data)
aj <- hclust(dist.res, method = "ward.D2")
dend <- as.dendrogram(aj)
plot(dend)
# Código R para crear un dendrograma usando el operador de encadenamiento:
library(dendextend)
dend <- USArrests[1:5,] %>% # data
scale %>% # Escala los datos
dist %>% # calcula una matriz de distancia
hclust(method = "ward.D2") %>% # Agrupación jerárquica
as.dendrogram # Convierte el objeto en un dendrograma
plot(dend)
EJEMPLOS:
library(dendextend)
# 1. Crea un dendrograma personalizado
mycols <- c("#2E9FDF", "#00AFBB", "#E7B800", "#FC4E07")
dend <- as.dendrogram(aj) %>%
set("branches_lwd", 1) %>% # Ancho de línea de ramas
set("branches_k_color", mycols, k = 4) %>% # Colorea las ramas por grupos
set("labels_colors", mycols, k = 4) %>% # Etiquetas de color por grupos
set("labels_cex", 0.5) # Cambiar el tamaño de la etiqueta
# 2. Crear trama
fviz_dend(dend)
##Bibliografia
@libro{kassambara2017práctico, title={Guía práctica para el análisis de conglomerados en R: aprendizaje automático no supervisado}, autor={Kassambara, Albukadel}, volumen={1}, año={2017}, editor={Sthda} }
@article{rodriguez2001analisis, title={An{'a}lisis de cluster o an{'a}lisis de conglomerados}, author={Rodr{'}guez-Jaume, Mar{'}a-Jos{'e} and Mora Catal{'a}, Rafael and others}, year={2001}, publisher={Universidad de Alicante. Servicio de Publicaciones} }
@article{santiago2011analisis, title={An{'a}lisis de conglomerado}, author={Santiago, F}, journal={Recuperado de: http://www. fuenterre bollo. com/Economicas/ECONOMETRIA/SEGMENTACION/CONGLOMERADOS/conglomerados. pdf}, year={2011} }
igraph-the network analysis package https://igraph.org/