HOLA MUNDO

UNIVERSIDAD DE EL SALVADOR

FACULTAD DE CIENCIAS ECONÓMICAS

ESCUELA DE ECONOMÍA

CICLO II - 2023

Trabajo de investigación

Análisis de Clúster (Conglomerados)

Asignatura

Métodos para el Análisis Económico

Grupo teórico

GT-02

Grupo de trabajo

03

Docente

MSF.Carlos Ademir Peréz Alas

Integrantes:

Nombre Carnet
Flores Ayala, Katerin Mariela FA21033
Figueroa González, Salvador Antonio FG18006
Mendoza Lemus, Johan Eli ML18043
Rodríguez Melgar, Mariana Guadalupe RM21005

Ciudad universitaria, 07 de enero de 2024

1. Explique en que consiste el análisis de conglomerados.

El análisis de conglomerados, también conocido como análisis de clústeres, es una técnica en estadísticas y minería de datos que se utiliza para agrupar observaciones similares en conjuntos llamados conglomerados o clústeres. La idea fundamental es agrupar objetos de datos de manera que los miembros dentro de un mismo grupo sean más similares entre sí que con los miembros de otros grupos. El proceso de análisis de conglomerados implica calcular distancias o similitudes entre todas las parejas de observaciones en función de sus características. Estas distancias o similitudes se utilizan para agrupar las observaciones en clústeres.

2. Elabore un cuadro comparativo.

Tabla I: Análisis Clúster
Análisis de Clúster Técnicas Disponibles Ventajas Desventajas
Jerárquico: Generan grupos en cada una de las fases del proceso buscando el número de clúster en el que existe una agrupación óptima

Aglomerado

• Encadenamiento simple

• Encadenamiento completo

• Encadenamiento medio

• Método Ward

• Método del centroide

• Método de la mediada

Dividida

• Método Ward

• Análisis de asociación

• Mediana

• promedio entre grupos

• Método centroide

• Linkage completo

• Linkage simple

• No es necesario especificar el número de clústeres que se generarán, lo que permite encontrar agrupaciones de cualquier forma.

• No necesitan ser circulares y se pueden identificar valores atípicos

• Herramienta útil para interpretar los datos.

• La interpretación de los datos puede resultar complicada cuando los elementos a clasificar son muy grandes.

• Una vez que los elementos pertenecen a un grupo específico, no pueden pertenecer a otros grupos .
No Jerárquico: categorizan los elementos seún el número de clúster dado.

Reasignación

• K-Medias.

• K-Medoides

• Algoritmo de Agrupación de aplicaciones.

• Método del centroide.

• Nubes dinámicas.

• Permite el procesamiento de gran número de datos.

• K medias es el método más robusto respecto a presencia de outliers y errores en las medidas de distancia.

• El algoritmo de K-means es un método de agrupación que requiere que el analista elija el número apropiado de clúster (k) por adelantado.

• Formar todas las particiones posibles para escoger la óptima es muy complejo.

• Los resultados finales obtenidos son sensibles a la selección aleatoria inicial del clúster de centros y a los valores atípicos.
Fuente: Elaboración propia con base en Kassambara, A. (2017). Practical Guide to Cluster Analysis in R: Unsupervised Machine
Learning (Multivariate Analysis) (1st ed.). STHDA, (2011).
Elaboración propia con base en:

3. Describa las técnicas disponibles para realizar el análisis de clúster

Jerarquicas

También se le conoce como análisis de conglomeradoss jerarquicos (HCA), se trata de un enfoque alternativo del “Cluster Partitioning” o los no jerarquicos. Este lo que pretende es agrupar objetos en función de su similitud que, por el contrario al no jerarquico, este no requiere especificar, con anterioridad el numero de racimos que se producirán.

Se divide en dos tipos:

Tipo Descripción
Agglomerative clustering Cada observación se considera un racimo propio al inicio, luego los clusters mas similares se fusionan.
Divise clustering Todos los objetos se encuentran agrupados, por lo que los mas heterogeneos se dividen hasta que todas las observaciones se encuentren en su propio grupo.

La agrupación aglomerativa “Agglomerative clustering” se lleva a cabo de manera ascendente, es decir que cada objeto se considera un grupo, luego los que son mas similares se combinan; procedimiento que se repite hasta que todos los puntos sean miembros de un solo gran cluster.

Lo inverso se presenta en el “Divise clustering” ya que al inicio todos los objetos estan incluidos en un solo grupo y en cada paso, el grupo mas heterogeneo se divide, el proceso termina hasta que todos los objetos estan en su propio grupo. A este tipo tambien se le conoce por el nombre de DIANA.

El resultado de este es un un arbol, en el que se tendran representados los objetos. A esta practica también se le conoce como dendrograma.

Tenemos entonces que ” agglomerative clustering” es bueno para identificar pequeños clusters, y por otro lafo “dDivisive clustering” es bueno para identificar clusters grandes.

Implementación en R

R cuenta con la libreria “cluster” que hace mas facil el realizar análisis cluster. Contiene la función “agnes()” y “diana()” para realziar agrupaciones aglomerativas y divisibas. Estas funciones realizan todos los pasos necesarios.

Agglomerative Nesting

Elemento Función
x Es la matriz de datos sobre la cual se realizará el clustering. En este caso, se utiliza el conjunto de datos USArrests.
stand Indica si se debe estandarizar los datos. En este caso, se establece en TRUE, lo que significa que los datos se estandarizarán antes de realizar el clustering.
metric Especifique la medida de distancia que se utilizará. En este caso, se utiliza la distancia euclidiana.
method Especifica el método de aglomeración. En este caso, se utiliza el método ward, que minimiza la variación al fusionar clusters.

Para ver la salida del comando anterior, lo realizamos de la siguiente manera:

library("factoextra") # Esta libreria nos permitira la salida del arbol con el resultado del comando anterior
fviz_dend(res.agnes, cex = 0.6, k = 4)

Divisive analysis Clustering

# Divisive analysis Clustering

# "diana" Realiza el análisis de clustering divisivo utilizando el método de diana

res.diana <- diana(x = USArrests, # matriz de datos
stand = TRUE, # Estandarizar
metric = "euclidean" # Metrica
)

A diferencia de que ahora se cambia la función a “diana”, el resto del código sigue el mismo desarrollo al anterior.

De igual forma para imprimir la salidad, lo hacemos de la siguiente forma:

library("factoextra")
fviz_dend(res.diana, cex = 0.6, k = 4)

No Jerarquicas

Al igual que el método anterior, es usado para clasificar observaciones, que se encuentran dentro de un conjunto de datos, en grupos segun sus similitudes. Pero la diferencia que tiene con el jerarquico, radica en que requiere que se especifique el número de clusters que se van a generar.

Los “partitioning clustering” comúmente usados, son:

Tipo Descripción
K-means Cada grupo se encuentra representado por el centro de los puntos de datos que se encuentran en el cluster. Este método es sensible a datos anómalos y valores atípicos.
K-medoids También se le nombra por su siglas PAM (Partitioning Aroung Medoids), en este cada grupo esta representado por uno de los objetos que se encuentren en el cluster. Es menos sensible a valores atipicos que el K-means
CLARA Es una extensión de PAM, pero adaptada a grandes sets de datos

K-means

Es el método mas utilizado para dividir un conjunto de datos determinado en un grupo de k grupo, donde “k” representa el numero de grupos pre-especificado por el analista. Este clasifica objetos en múltiples grupos, de modo que los objetos dentro del mismo grupo son los más similares posibles, mientras que los de los otros grupos son diferentes.

Dentro del K-means cada grupo esta representado por su centro (centroide), que son la media de puntos asignados al cluster.

Paquete de R

La función de R para K-means clustering es “kmeans()” que tiene el siguiente formato:

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

Variable Descripción
x Es la matriz numerica, el marco de datos o puede ser un vector númerico
centers Numero de grupo (K) o conjunto de grupos iniciales. Si un numero se elige como un conjunto aleatorio de filas en x centros iniciales
iter.max Es el numero máximo de iteraciones permitidas, por default en valor es 10
nstart Numero cualquiera de particiones iniciales, cuanod los centros son un número. Se debe de tratar de iniciar por valores mayores a 1.

Para crear gráficos de los clusters generados por la función, se puede utilizar el paquete factextra.

Instale el paquete:

install.packages(“factoextra”)

Cargue factoextra:

library(factoextra)

K-medoids

Es un enfoque de agrupación relacionado con K-means clustering para dividir un data set en “k” grupos o clusters. En este cada grupo está representado por uno de los puntos de datos del grupo. Estos puntos son llamados cluster medoids.

El termino “medoid” se refiere a un grupo para el cual la disimilitud promedio entre él y los demás dentro del cluster es minimo. Corresponde a el punto mas céntrico del grupo.

K-medoids es una alternativa a K-means clustering. Esto significa que el algoritmo. Esto significa que el algoritmo es menos sensible al ruido y a los valores atípicos, en comparación con k-medias, porque utiliza medoides como el centro, en lugar de medias.

Requiere que el usuario especifique “k” el numero de grupos que sera generado.

El método de agrupación de k-medoides más común es el algoritmo PAM.

Paquete de R

La función pam() (paquete de clúster) y pamk() (paquete de fpc) se puede utilizar para cualquier PAM.

La diferencia entre ambos radica en que la función pamk() no requiere que un usuario decida el número de grupos “k”.

Con la función pam(), el formato es el siguiente:

pam(x, k, metric = “euclidean”, stand = FALSE)

Variable Descripción
x Posibles valores: - Matriz de datos numerica o una base datos numerica: donde las filas corresponden a las observaciones y cada columana a una variable. - Matriz de dismilitud: en este caso X suele ser la salidad de daisy() o dist().
K Numero de clusters.
metric La distancia de metricas a usar. Las opciones disponibles son >>euclidean<< y >>manhattan<<.
stand Valor logico, si es true, las variables (columnas) en X son estandarizadas antes de calcular las diferencias. Se ignora cuando es una matriz de disimilitud.

Al igual que en el anterior si se desea crear un gráfico de los clusters generados con la función pam(), usaremos el paquete factoextra.

Instalar el paquete:

install.packages(c(“clúster”, “factoextra”))

Cargar el paquete:

library(cluster) library(factoextra)

CLARA

Con sus siglas “Clustering Large Application” es una externsión a los métodos K-medoids para tratar datos que contienen una gran cantidad de datos, para reducir el tiempo de cálculo y almacenamiento RAM. Esto se logra mediante el muestreo.

En lugar de encontrar medoides para todo el conjutno de datos, CLARA considera una pequeña muetra de los datos con tamaño fijo y aplica el algoritmo PAM para generar un conjunto óptimo de medioides para la muestra.

La calidad de los medioides 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.

Los resultados finales del agrupamiento corresponden a los conjunto de medioides con el mínimo costo.

Paquete de R

Para este tenemos la función “clara()” (paquete de cluster) en él se puede calcular CLARA, el formato es el siguiente:

clara(x, k, metric = “euclidean”, stand = FALSE, samples = 5, pamLike = FALSE)

Variable Descripción
x Una matriz de datos numerica o una base de datos, cada fila corresponde a una observación y cada columna a una variable. Valores faltantes (NAs) son permitidos
K Numero de clusters.
metric La distancia de metricas a usar. Las opciones disponibles son >>euclidean<< y >>manhattan<<.Las distancias euclidianas son sumas de cuadrados de diferencias, y Las distancias de Manhattan son la suma de diferencias absolutas.
stand Valor logico, si es true, las variables (columnas) en X son estandarizadas antes de calcular las diferencias. Es favorable estandarizar antes de agrupar.
samples Numero de muestras que se extraen del conjunto de datos, se tiene por valor predeterminado 5, pero se recomienda un valor mayor.
pamLike Indica si el mismo algoritmo en la funcion pam() debe ser usado.

Para este caso si se quiere generar un gráfico, usaremos el mismo paquete que en los casos anteriores: factoextra.

Instalando el paquete necesario:

install.packages(c(“clúster”, “factoextra”))

Y luego cargando:

biblioteca (clúster)

biblioteca(factoextra

4. Desarrollo de ejemplos

Capítulo 4: K-Means Clustering

La metodología de agrupación mediante K-medias, formulada por MacQueen en 1967, sobresale como el principal algoritmo de aprendizaje no supervisado empleado para dividir un conjunto específico de datos en k grupos (o clústeres), donde k es establecido de antemano por el analista. Su función primordial consiste en la categorización de elementos en diversos grupos, con el objetivo de maximizar la semejanza intraclase (alta concordancia entre elementos dentro del mismo grupo) y minimizar la semejanza interclase (baja concordancia entre elementos de grupos diferentes). Durante este procedimiento, cada grupo se caracteriza a través de su centroide, que representa la media de los puntos asignados a ese grupo.

4.1 Principios fundamentales de K-means

La esencia subyacente en la agrupación de k-medias radica en la formación de grupos de manera que se minimice la variabilidad total dentro de cada grupo, conocida como variabilidad total intra-grupo. Existen diversos algoritmos de k-medias disponibles, siendo el algoritmo convencional el de Hartigan-Wong (1979). Este algoritmo define la variabilidad total intra-grupo como la suma de las distancias al cuadrado de las distancias euclidianas entre los elementos y el respectivo centroide.

4.2 Algoritmos K-means

El algoritmo K-medias se puede resumir de la siguiente manera:

1-Especifique el número de clusters (K) que se crearán (por el analista)

2-Seleccione aleatoriamente k objetos del conjunto de datos como centros o medios del grupo inicial.

3-Asigna cada observación a su centroide más cercano, según la distancia euclidiana entre el objeto y el centroide.

4-Para cada uno de los k grupos, actualice el centroide del grupo calculando los nuevos valores medios de todos los puntos de datos del grupo. El centoide de un grupo K-ésimo es un vector de longitud p que contiene las medias de todas las variables para las observaciones en el grupo K-ésimo; p es el número de variables.

5-Minimizar iterativamente el total dentro de la suma del cuadrado. Es decir, repita los pasos 3 y 4 hasta que las asignaciones del clúster dejen de cambiar o se alcance el número máximo de iteraciones. De forma predeterminada, el software R utiliza 10 como valor predeterminado para el número máximo de iteraciones.

4.3 Calcular la agrupación de k-medias en R.

4.3.1 Datos

Para llevar a cabo la agrupación de k-medias en R, se empleará el conjunto de datos de muestra “USArrests”. Es esencial preparar los datos según las indicaciones del capítulo 2, asegurándose de que solo incluyan variables continuas, ya que el algoritmo k-medias se basa en promedios variables.

Con el objetivo de evitar que el algoritmo dependa de una escala arbitraria, se procede a escalar los datos mediante la función scale() en R. El proceso se lleva a cabo de la siguiente manera:

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

4.3.2 Paquetes y funciones de R requeridos

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)

x: matriz numérica, marco de datos numéricos o un vector numérico.

centros: Los valores posibles son el número de conglomerados (k) o un conjunto de centros de conglomerados iniciales (distintos). Si es un número, se elige un conjunto aleatorio de filas (distintas) en x como centros iniciales.

iter.max: El número máximo de iteraciones permitidas. El valor predeterminado es 10.

nstart: El número de particiones iniciales aleatorias cuando los centros son un número. A menudo se recomienda probar nstart> 1.

Para crear un hermoso gráfico de los clústeres generados con el k significa() función, utilizará la factoextra paquete.

4.3.3 Estimación del número óptimo de conglomerados

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(ggplot2)
library(factoextra)
data("USArrests")
df <- scale(USArrests)
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.

4.3.4 Cálculo de la agrupación en clústeres de k-medias

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:

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

Dado que el resultado final de la agrupación de k-medias puede ser influenciado por las asignaciones iniciales aleatorias, hemos especificado nstart como 25. Esto indica que R realizará 25 asignaciones iniciales aleatorias diferentes y seleccionará los resultados más óptimos, los cuales tienen la variación más baja dentro del grupo. El valor predeterminado de nstart en R es uno, pero se recomienda encarecidamente aumentar este valor, por ejemplo, a 25 o 50, al realizar la agrupación de k-medias para obtener resultados más estables y confiables.

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:

aggregate(USArrests, by = list(cluster = km.res$cluster), mean)
##   cluster   Murder   Assault UrbanPop     Rape
## 1       1 13.93750 243.62500 53.75000 21.41250
## 2       2  3.60000  78.53846 52.07692 12.17692
## 3       3  5.65625 138.87500 73.87500 18.78125
## 4       4 10.81538 257.38462 76.00000 33.19231

Si desea agregar las clasificaciones de puntos a los datos originales, use esto:

dd <- cbind(USArrests, cluster = km.res$cluster)
head(dd)
##            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

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

La función kmeans () devuelve una lista de componentes, que incluye:

Cluster: Un vector de números enteros (de 1: k) que indica el grupo al que se asigna cada punto.

Centers: Una matriz de centros de conglomerados (medias de conglomerados).

totss: La suma total de cuadrados (TSS), es decir (XI ≠ x̄)2. TSS mide la varianza total en los datos.

Insidess: Vector de suma de cuadrados dentro del conglomerado, un componente por conglomerado.

tot.withinss: Suma total de cuadrados dentro del conglomerado, es decir suma(dentro).

Betweenss: La suma de cuadrados entre grupos, es decir totss ≠ tot.withinss.

Size: El número de observaciones en cada grupo.

Se puede acceder a los componentes de la siguiente manera:

# Número de conglomerado para cada una de las observaciones
km.res$cluster
##        Alabama         Alaska        Arizona       Arkansas     California 
##              1              4              4              1              4 
##       Colorado    Connecticut       Delaware        Florida        Georgia 
##              4              3              3              4              1 
##         Hawaii          Idaho       Illinois        Indiana           Iowa 
##              3              2              4              3              2 
##         Kansas       Kentucky      Louisiana          Maine       Maryland 
##              3              2              1              2              4 
##  Massachusetts       Michigan      Minnesota    Mississippi       Missouri 
##              3              4              2              1              4 
##        Montana       Nebraska         Nevada  New Hampshire     New Jersey 
##              2              2              4              2              3 
##     New Mexico       New York North Carolina   North Dakota           Ohio 
##              4              4              1              2              3 
##       Oklahoma         Oregon   Pennsylvania   Rhode Island South Carolina 
##              3              3              3              3              1 
##   South Dakota      Tennessee          Texas           Utah        Vermont 
##              2              1              4              3              2 
##       Virginia     Washington  West Virginia      Wisconsin        Wyoming 
##              3              3              2              2              3
head(km.res$cluster, 4)
##  Alabama   Alaska  Arizona Arkansas 
##        1        4        4        1
# Tamaño de cluster
km.res$size
## [1]  8 13 16 13
# Clúster significa
km.res$centers
##       Murder    Assault   UrbanPop        Rape
## 1  1.4118898  0.8743346 -0.8145211  0.01927104
## 2 -0.9615407 -1.1066010 -0.9301069 -0.96676331
## 3 -0.4894375 -0.3826001  0.5758298 -0.26165379
## 4  0.6950701  1.0394414  0.7226370  1.27693964

4.3.6 Visualización de clústeres de k-medias

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

4.4 Ventajas y desventajas de la agrupación K-means

Entre las ventajas de la agrupación, K-medias destaca por su simplicidad y velocidad, siendo un algoritmo eficiente incluso para conjuntos de datos extensos. Su capacidad para manejar grandes volúmenes de datos contribuye a su escalabilidad, convirtiéndolo en una opción viable para aplicaciones prácticas.

Por otra parte, la principal desventaja es la necesidad de que el analista determine previamente el número de clústeres (k), una elección que puede resultar desafiante sin un conocimiento profundo de los datos. La sensibilidad a la inicialización aleatoria de los centros de clúster también plantea problemas, ya que diferentes ejecuciones pueden producir soluciones diversas. Además, la influencia de valores atípicos y la dependencia del orden de los datos son aspectos que deben abordarse.

Para superar la dificultad en la elección de k, se sugiere calcular K-medias para diversos valores de k y seleccionar el óptimo mediante la comparación de resultados de agrupación. La inicialización múltiple del algoritmo con diferentes centros de clúster ayuda a mitigar la variabilidad en los resultados. En cuanto a la sensibilidad a valores atípicos, se propone el uso del algoritmo PAM, menos propenso a distorsiones causadas por datos atípicos. Estas estrategias abordan las limitaciones inherentes de K-medias y mejoran su robustez y aplicabilidad en diversas situaciones.

4.5 Alternativa a la agrupación de k-means

Una opción robusta como alternativa a la agrupación de k-medias es PAM, que se fundamenta en la noción de medoides. Como se explorará en el próximo capítulo, la realización de la agrupación de clústeres mediante PAM se logra mediante el uso de la función pam() del paquete de clústeres. Adicionalmente, la función pamk() del paquete fpc ofrece una herramienta integral para PAM, incluyendo la impresión del número sugerido de grupos basado en el ancho promedio óptimo de la silueta.

Capítulo 5 : K-Medoides

LEl algoritmo k-medoids, relacionado con la agrupación k-medias (véase capítulo 4), divide un conjunto de datos en k grupos o clusters. En este enfoque, cada grupo está representado por un punto de datos específico, denominado medoide del cúmulo. El término “medoide” se refiere a un objeto dentro del grupo cuya disimilitud promedio con los demás miembros del grupo es mínima, siendo este el punto más céntrico del cluster. A diferencia de la agrupación k-medias, donde el centro del grupo es el valor medio de todos los puntos, los medoides son objetos representativos de cada grupo.

K-medoides, una sólida alternativa a k-medias, se destaca por su menor sensibilidad al ruido y a los valores atípicos, ya que utiliza medoides en lugar de medias como centros de grupo. Para implementar este algoritmo, es necesario especificar k, el número de clusters a generar, de manera similar al clustering k-medias. Un método efectivo para determinar el número óptimo de conglomerados es el método de silueta, explicado en las secciones siguientes. El algoritmo PAM (Partitioning Around Medoids, Kaufman & Rousseeuw, 1990) es la implementación más común del enfoque de agrupación de k-medoides.

5.1 Concepto PAM

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 el PAM algoritmo.

5.2 Algoritmo PAM

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.

5.3 Calcular PAM en R.

5.3.1 Datos

Usaremos los conjuntos de datos de demostración “USArrests,” que comenzamos escalando (Capítulo 2) 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

5.3.2 Paquetes y funciones de R requeridos

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.

5.3.3 Estimando el número óptimo de clústeres

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 indica una 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.

5.3.4 Estimación del número óptimo de conglomerados

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

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.

5.3.5 Cálculo de la agrupación en clústeres PAM

El siguiente código R calcula el algoritmo PAM con k = 2:

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"

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:

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

5.3.5 Acceder a los resultados de la función pam ()

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:

# Medoides de racimo: 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
# Números de clúster
head(pam.res$clustering)
##    Alabama     Alaska    Arizona   Arkansas California   Colorado 
##          1          1          1          2          1          1

5.3.6 Visualización de clústeres PAM

Para representar gráficamente los resultados de la partición en clústeres PAM, emplearemos la función fviz_cluster() del paquete factoextra. Esta función genera un diagrama de dispersión que coloreará los puntos de datos según los números de grupo asignados. En situaciones donde los datos abarcan más de dos variables, se implementa el algoritmo de Análisis de Componentes Principales (PCA) para reducir la dimensionalidad de los datos. En este contexto, las dos primeras dimensiones principales se utilizan para visualizar los datos de manera efectiva.

fviz_cluster(
  pam.res,
  palette = c("#00AFBB", "#FC4E07"),
  # color palette
  ellipse.type = "t",
  # Concentration ellipse
  repel = TRUE,
  # Avoid label overplotting (slow)
  ggtheme = theme_classic()
)

Capítulo 6: CLARA - Agrupación de Grandes Aplicaciones

CLARA (Agrupación de grandes aplicaciones, Kaufman y Rousseeuw (1990)) es una extensión de los métodos k-medoides (Capítulo 5) para tratar datos que contienen una gran cantidad de objetos (más de varios miles de observaciones) con el fin de reducir el tiempo de computación y el problema de almacenamiento de RAM. . Esto se logra utilizando el método de muestreo.

6.1 Concepto CLARA

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.

6.2 Algoritmo CLARA

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.

6.3 Calcular CLARA en R

6.3.1 Formato y preparación de los datos

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

6.3.2 Paquetes y funciones de R requeridos

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.

Métrico: 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.

Pararse: 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.

Muestras: 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: indica lógico si el mismo algoritmo en el pamSe debe utilizar la función (). Esto debería ser siempre cierto.

Para crear un hermoso gráfico de los clústeres generados con el pam() función, utilizará la libreria factoextra.

6.3.3 Estimación del número óptimo de conglomerados

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.

library(cluster)
library(factoextra)
fviz_nbclust(df, clara, method = "silhouette") +
  theme_classic()

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.

6.3.4 Computación CLARA

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:

Medoides: Objetos que representan grupos

Agrupamiento: un vector que contiene el número de grupo de cada objeto

Muestra: etiquetas o números de caso de las observaciones en la mejor muestra, es decir, la muestra utilizada por el algoritmo clara para la partición final.

Si desea agregar las clasificaciones de puntos a los datos originales, use esto:

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

Puede acceder a los resultados devueltos por clara () de la siguiente manera:

# Medoides
clara.res$medoids
##              x         y
## S121 -1.531137  1.145057
## S455 48.357304 50.233499
# Agrupación
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

Los medoides son S121, S455.

6.3.5 Visualización de clústeres CLARA

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

Capítulo 7: Agrupación aglomerativa. 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 como INÉ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.

7.1 Algoritmo

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.

7.2 Pasos para la agrupación jerárquica aglomerativa

Seguiremos los pasos a continuación para realizar agrupaciones jerárquicas aglomerativas utilizando el software R: 1. Preparación de los datos. 2. Calcular información de (dis) similitud entre cada par de objetos en el conjunto de datos. 3. Uso de la función de vinculación para agrupar objetos en un árbol de agrupamiento jerárquico, según la información de distancia generada en el paso 1. Los objetos / agrupaciones que están muy próximos se vinculan entre sí mediante la función de vinculación. 4. Determinar dónde cortar el árbol jerárquico en grupos. Esto crea una partición de los datos.

7.2.1 Estructura y preparación de datos

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

7.2.2 Medidas de similitud

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? Dist

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:

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

7.2.3 Vinculación

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:

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

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í.

7.2.4 Dendrograma

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 el gráfico de función base (res.hc), donde res.hc es la salida de hclust (). Aquí, usaremos el función fviz_dend () [en el paquete factoextra R] para producir un hermoso dendrograma.

Primero instale factoextra escribiendo esto: install.packages (“factoextra”); siguiente visualizar el dendrograma de la siguiente manera:

Generalmente se prefieren el enlace completo y el método de Ward.

library("factoextra")
res.hc <- hclust(d = res.dist, method = "ward.D2")
fviz_dend(res.hc, cex = 0.5)

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.

**7.3 Verificar el árbol del clúster

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.

res.hc2 <- hclust(res.dist, method = "average")
cor(res.dist, cophenetic(res.hc2))
## [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.

7.4 Cortar el dendrograma en diferentes grupos

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.

# 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
# Obtenga los nombres de los miembros del clúster 1
rownames(df)[grp == 1]
## [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()
)

7.5 Paquete Cluster R

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:

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

7.6 Aplicación de agrupamiento jerárquico al análisis de datos de expresión genética

En el análisis de datos de expresión genética, el agrupamiento jerárquico se emplea como una etapa inicial para investigar los datos. El objetivo es identificar posibles grupos de genes o muestras que presenten patrones similares de expresión genética. En este contexto, se han propuesto diversas medidas de distancia (ver Capítulo 3) para evaluar la similitud o disimilitud entre los ítems, facilitando así la decisión sobre qué ítems deben agruparse.

Capítulo 8: Comparación de dendogramas

Comparación de dendrogramas Después de mostrar cómo calcular la agrupación jerárquica (Capítulo 7), describimos, aquí, cómo comparar dos dendrogramas utilizando el dendextend Paquete R.

Los dendextend El paquete proporciona varias funciones para comparar dendrogramas. Aquí, nos centraremos en dos funciones:

Enredo(): para la comparación visual de dos dendrogramas • cor.dendlist(): para calcular una matriz de correlación entre dendrogramas.

8.1 Preparación de datos: Usaremos los conjuntos de datos de USArrests base R y comenzaremos por estandarizar las variables usando la función scale () de la siguiente manera:

df <- scale(USArrests)

Para hacer legibles los gráficos, generados en las siguientes secciones, trabajaremos con un pequeño subconjunto aleatorio del conjunto de datos. Por lo tanto, usaremos la funciónmuestra() para seleccionar al azar 10 observaciones entre las 50 observaciones contenidas en el conjunto de datos:

# Subconjunto que contiene 10 filas
set.seed(123)
ss <- sample(1:50, 10)
df <- df[ss, ]

8.2 Comparación de dendrogramas

Comenzamos creando una lista de dos dendrogramas calculando agrupaciones jerárquicas (HC) utilizando dos métodos de vinculación diferentes (“promedio” y “ward.D2”). Luego, nosotrosTransforme los resultados como dendrogramas y cree una lista para contener los dos dendrogramas.

library(dendextend)
# Calcular matriz de distancias
res.dist <- dist(df, method = "euclidean")
# Calcule 2 agrupaciones jerárquicas
hc1 <- hclust(res.dist, method = "average")
hc2 <- hclust(res.dist, method = "ward.D2")
# Crear dos Dendogramas
dend1 <- as.dendrogram (hc1)
dend2 <- as.dendrogram (hc2)
# Crea una lista para contener dendrogramas
dend_list <- dendlist(dend1, dend2)

8.2.1 Comparación visual de dos dendrogramas

Para comparar visualmente dos dendrogramas, usaremos la función tanglegram () [ dendextend paquete], que traza los dos dendrogramas, uno al lado del otro, con sus etiquetas conectadas por líneas.

La calidad de la alineación de los dos árboles se puede medir utilizando la función enredo (). El entrelazamiento es una medida entre 1 (entrelazamiento total) y 0 (sin entrelazamiento). Un coeficiente de entrelazamiento más bajo corresponde a una buena alineación.

• Draw a tanglegram:

library(dendextend)
res.dist <- dist(df, method = "euclidean")
hc1 <- hclust(res.dist, method = "average")
hc2 <- hclust(res.dist, method = "ward.D2")
dend1 <- as.dendrogram (hc1)
dend2 <- as.dendrogram (hc2)
dend_list <- dendlist(dend1, dend2)
tanglegram(dend1, dend2)

• Personaliza el enredo con muchas otras opciones de la siguiente manera:

tanglegram(
  dend1,
  dend2,
highlight_distinct_edges = FALSE, # Turn-off dashed lines
common_subtrees_color_lines = FALSE, # Turn-off line colors
common_subtrees_color_branches = TRUE, # Color common branches
main = paste("entanglement =", round(entanglement(dend_list), 2))
)

Tenga en cuenta que los nodos “únicos,” con una combinación de etiquetas / elementos que no están presentes en el otro árbol, están resaltados con líneas discontinuas.

8.2.2 Matriz de correlación entre una lista de dendrogramas

La función cor.dendlist () se utiliza para calcular la correlación ” Baker ” o ” Cophenetic ” matriz entre una lista de árboles. El valor puede oscilar entre -1 y 1. Con cerca de 0 valores que significan que los dos árboles no son estadísticamente similares.

# 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
# Coeficiente de correlación de Baker
cor_bakers_gamma(dend1, dend2)
## [1] 0.9895528

También es posible comparar simultáneamente varios dendrogramas. Un operador de encadenamiento %>% se usa para ejecutar múltiples funciones al mismo tiempo. Es útil para simplificar código:

# 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
# Visualice la matriz de correlación usando el paquete corrplot
library(corrplot)
## corrplot 0.92 loaded
corrplot(cors, "pie", "lower")

Capítulo 9: Visualización de dendrogramas

En capítulos previos, se explicó que un dendrograma es una representación en forma de árbol de datos generados mediante métodos de agrupamiento jerárquico, como se detalló en el Capítulo 7. Este artículo presenta código en R para la visualización y personalización de dendrogramas, además de ofrecer información sobre cómo guardar y ampliar un dendrograma extenso. El proceso comienza con el cálculo de la agrupación jerárquica utilizando conjuntos de datos de USArrests.

9.1 Carga de datos

# Cargar datos
data(USArrests)
# Calcular distancias y agrupamiento jerárquico
dd <- dist(scale(USArrests), method = "euclidean")
hc <- hclust(dd, method = "ward.D2")

Para visualizar el dendrograma, usaremos las siguientes funciones y paquetes de R:

• fviz_dend () [en el paquete factoextra R] para crear fácilmente un hermoso basado en ggplot2 dendrograma.

• Paquete dendextend para manipular dendrogramas Antes de continuar, instale el paquete requerido de la siguiente manera:

Antes de continuar, instale el paquete requerido de la siguiente manera:

install.packages ( c ( “factoextra” , “dendextend” ))

9.1 Visualización de dendrogramas

Usaremos la función fviz_dend () [en el paquete factoextra R] para crear fácilmente una hermosa dendrograma utilizando el gráfico base R o ggplot2. También proporciona una opción para dibujando dendrogramas circulares y árboles parecidos a filogenia.

Para crear dendrogramas básicos, escriba esto:

library(factoextra)
data(USArrests)
dd <- dist(scale(USArrests), method = "euclidean")
hc <- hclust(dd, method = "ward.D2")
fviz_dend(hc, cex = 0.5)

Puede usar los argumentos main, sub, xlab, ylab para cambiar los títulos de la trama de la siguiente manera:

fviz_dend(
  hc,
  cex = 0.5,
  main = "Dendrogram - ward.D2",
  xlab = "Objects",
  ylab = "Distance",
  sub = ""
)

Para dibujar un dendrograma horizontal, escriba esto:

fviz_dend(hc, cex = 0.5, horiz = TRUE)

También es posible cortar el árbol a una altura determinada para dividir los datos en múltiples grupos como se describe en el capítulo anterior: Agrupación jerárquica (Capítulo 7). En este caso, es posible colorear las ramas por grupos y agregar un rectángulo alrededor de cada grupo.

fviz_dend(
  hc,
  k = 4,
# Cortar en cuatro grupos
  cex = 0.5,
# Tamaño de la etiqueta
  k_colors = c("#8B0000", "#006400", "#8B008B", "#00008B"),
  color_labels_by_k = TRUE,
  ggtheme = theme_gray()
)

Para cambiar el tema de la trama, use el argumento ggtheme, cuyos valores permitidos incluyen ggplot2 temas oficiales [theme_gray (), theme_bw (), theme_minimal (), theme_classic (), theme_void ()] o cualquier otro tema de ggplot2 definido por el usuario.

fviz_dend(
  hc,
  k = 4,
  # Cortar en cuatro grupos
  cex = 0.5,
  # # Tamaño de la etiqueta
  k_colors = c("#8B0000", "#006400", "#8B008B", "#00008B"),
  color_labels_by_k = TRUE,
  # Etiquetas de Color por grupos
  ggtheme = theme_gray() # Cambiar de tema
)

Los valores permitidos para k_color incluyen paletas de cerveza del paquete RColorBrewer (p. Ej. “RdBu,” “Blues,” “Dark2,” “Set2,” . . ; ) y paletas de revistas científicas de ggsci R paquete (por ejemplo: “npg,” “aaas,” “lancet,” “jco,” “ucscgb,” “uchicago,” “simpsons” y “Rickandmorty”).

En el código R a continuación, cambiaremos los colores del grupo usando “aaas” (revista Asociación Estadounidense para el Avance de la Ciencia) paleta de color:

fviz_dend(hc,
          cex = 0.5,
          k = 4,
          # Cortar en cuatro grupos
          k_colors = "aaas")

Si desea dibujar un dendrograma horizontal con un rectángulo alrededor de los grupos, use esto:

fviz_dend(
  hc,
  k = 4,
  cex = 0.4,
  horiz = TRUE,
  k_colors = "aaas",
  rect = TRUE,
  rect_border = "aaas",
  rect_fill = TRUE
)

Además, puede trazar un dendrograma circular usando la opción type = “circular.”

fviz_dend(
  hc,
  cex = 0.5,
  k = 4,
  k_colors = "aaas",
  type = "circular"
)

Para trazar un árbol filogénico, use type = “phylogenic” y repel = TRUE (para evitar superposición de etiquetas). Esta funcionalidad requiere el paquete R igraph. Asegúrate de eso está instalado antes de escribir el siguiente código R.

require("igraph")
fviz_dend(
  hc,
  k = 4,
  k_colors = "aaas",
  type = "phylogenic",
  repel = TRUE
)

El diseño predeterminado para árboles filogenéticos es “layout.auto.” Los valores permitidos son uno de: c (“layout.auto,” “layout_with_drl,” “layout_as_tree,” “layout.gem,” “layout.mds,” “Layout_with_lgl”). Para leer más sobre estos diseños, lea la documentación del paquete igraph R.

Probemos phylo.layout = “layout.gem”:

require("igraph")
fviz_dend(
  hc,
  k = 4,
  # Cortar en cuatro grupos
  k_colors = "aaas",
  type = "phylogenic",
  repel = TRUE,
  phylo_layout = "layout.gem"
)

9.2 Caso de dendrograma con grandes conjuntos de datos

Si calcula la agrupación jerárquica en un conjunto de datos grande, es posible que desee ampliar el dendrograma o para trazar solo un subconjunto del dendrograma.

Alternativamente, también puede trazar el dendrograma en una página grande en un PDF, que se puede ampliar sin pérdida de resolución

9.2.1 Zoom en el dendrograma

Si desea hacer zoom en los primeros clústeres, es posible usar la opción xlim y ylim para limitar el área de la parcela. Por ejemplo, escriba el siguiente código:

fviz_dend(hc, xlim = c(1, 20), ylim = c(1, 8))

9.2.2 Trazado de un sub-árbol de dendrogramas

Para trazar un sub-árbol, seguiremos el siguiente procedimiento:

1-Cree el dendrograma completo usando fviz_dend () y guarde el resultado en un objeto, llamado dend_plot por ejemplo.

2-Utilice la función de base R cut.dendrogram () para cortar el dendrograma, en un determinado altura (h), en múltiples subárboles. Esto devuelve una lista con componentes $ superior y $ lower, la primera es una versión truncada del árbol original, también de clase dendrograma, este último una lista con las ramas obtenidas de la tala del árbol, cada uno un dendrograma.

3-Visualice sub-árboles usando fviz_dend ().

El código R es el siguiente.

• Cortar el dendrograma y visualizar la versión truncada:

# Cree una gráfica de todo el dendrograma,
# y extrae los datos del dendrograma
dend_plot <- fviz_dend(hc,
                       k = 4,
                       # Cortar en cuatro grupos
                       cex = 0.5,
                       # label size
                       k_colors = "aaas")
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)

# Parcela sub-árbol 1
fviz_dend(dend_cuts$lower[[1]], main = "Subtree 1")

# Parcela sub-árbol 2
fviz_dend(dend_cuts$lower[[2]], main = "Subtree 2")

También puede trazar árboles circulares de la siguiente manera:

fviz_dend(dend_cuts$lower[[2]], type = "circular")

9.2.3 Guardar dendrograma en una página PDF grande

Si tiene un dendrograma grande, puede guardarlo en una página PDF grande, que puede ser ampliada sin pérdida de resolución.

pdf("dendrogram.pdf", width=30, height=15) # Open a PDF
p <- fviz_dend(hc, k = 4, cex = 1, k_colors = "aaas" ) # Do plotting
print(p)
dev.off() # Close the PDF
## png 
##   2

9.3 Manipulación de dendrogramas usando dendextend

El paquete dendextend proporciona funciones para cambiar fácilmente la apariencia de un dendrograma y para comparar dendrogramas. En esta sección, utilizamos el operador de encadenamiento (%>%) para simplificar el código, convirtiendo múltiples operaciones en una forma más legible y estructurada. Este operador transforma expresiones del tipo x %>% f(y) en f(x, y), permitiendo la lectura secuencial de las operaciones de izquierda a derecha y de arriba a abajo. Los siguientes códigos R ilustran de manera equivalente esta idea.

En esta sección usaremos el operador de encadenamiento (%>%) para simplificar nuestro código. El operador de encadenamiento convierte x%>% f (y) en f (x, y) para que pueda usarlo para reescribir múltiples operaciones de modo que se puedan leer de izquierda a derecha, de arriba a abajo. Por ejemplo, los resultados de los dos códigos R siguientes son equivalentes.

• Código R estándar para crear un dendrograma:

data <- scale(USArrests)
dist.res <- dist(data)
hc <- hclust(dist.res, method = "ward.D2")
dend <- as.dendrogram(hc)
plot(dend)

• Código R para crear un dendrograma usando un operador de encadenamiento:

library(dendextend)
dend <- USArrests[1:5, ] %>% # data
  scale %>% # Escala de datos
  dist %>% # calcular una matriz de distancia,
  hclust(method = "ward.D2") %>% # Agrupación jerárquica
  as.dendrogram # Convierte el objeto en un dendrograma.
plot(dend)

Funciones para personalizar dendrogramas: la función set () [en el paquete dendextend] se puede utilizar para cambiar los parámetros de un dendrograma. El formato es:set(object, what, value)

1-Objeto: un objeto dendrograma

2-Qué: un carácter que indica cuál es la propiedad del árbol que debe ser configurar / actualizar

3-Valor: un vector con el valor a establecer en el árbol (el tipo de valor depende sobre el “qué”).

Valores posibles para el argumento qué incluir:

library(dendextend)
# 1. Crea un dendrograma personalizado
mycols <- c("#2E9FDF", "#006400", "#E7B800", "#FC4E07")
dend <- as.dendrogram(hc) %>%
  set("branches_lwd", 1) %>% # Ancho de línea de ramas
  set("branches_k_color", mycols, k = 4) %>% # Colorea 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. Crea una trama
fviz_dend(dend)

5. Presente un ejemplo de aplicación de Análisis de Cluster,

Análisis de Clúster en Víctimas de Suicidio

DIXON, K. (Agosto de 2018). Análisis de Clúster en Víctimas de Suicidio. Obtenido de Kaggle : https://www.kaggle.com/code/ksvrd1/cluster-analysis-on-suicide-victims

La muerte por suicidio representa una de las principales causas de fallecimiento a nivel mundial, especialmente en individuos de 15 a 49 años. Abordar este fenómeno implica comprender a las víctimas, identificando similitudes y diferencias en sus características demográficas. Para ello, se empleará el lenguaje de programación R en un análisis de clúster, utilizando agrupamiento jerárquico para segmentar la población de suicidas según parámetros específicos. Posteriormente, se perfilará estos clústeres basándose en características demográficas para obtener una comprensión más profunda de quiénes son las víctimas en cada grupo. El análisis se centrará en evaluaciones bivariadas y resúmenes de la media de cada clúster. se seleccionan seis atributos de segmentación, los cuales serán utilizados para el perfilado detallado de las variables involucradas.

Carga de datos

library(dplyr)
library(kableExtra)

sr <- read_csv("C:/Users/johan/OneDrive/Documentos/A/MAE118/master.csv")

Cada punto de datos representa números y tasas de suicidio para cada país según el año, género y grupo de edad.

Depuración de datos

# Omitiendo datos NA

sr_no_na <- sr %>%
  na.omit()

# Atributos de Segmentación

sr1 <- sr %>%
  na.omit() %>%
  select(suicides_no, `suicides/100k pop`, `gdp_for_year ($)`, `gdp_per_capita ($)`, `HDI for year`)

Tabla resumen

sum <- sr_no_na %>% select(-country, -age, -sex, -`country-year`, -generation) %>% summary()
sum
##       year       suicides_no        population       suicides/100k pop
##  Min.   :1985   Min.   :    0.0   Min.   :     875   Min.   :  0.00   
##  1st Qu.:2000   1st Qu.:    3.0   1st Qu.:  121642   1st Qu.:  1.04   
##  Median :2010   Median :   27.0   Median :  472250   Median :  5.72   
##  Mean   :2005   Mean   :  206.1   Mean   : 1852173   Mean   : 11.99   
##  3rd Qu.:2012   3rd Qu.:  127.2   3rd Qu.: 1500290   3rd Qu.: 15.44   
##  Max.   :2014   Max.   :11767.0   Max.   :43509335   Max.   :187.06   
##   HDI for year    gdp_for_year ($)    gdp_per_capita ($)
##  Min.   :0.4830   Min.   :3.963e+08   Min.   :   313    
##  1st Qu.:0.7130   1st Qu.:1.431e+10   1st Qu.:  4862    
##  Median :0.7790   Median :6.176e+10   Median : 12584    
##  Mean   :0.7766   Mean   :5.477e+11   Mean   : 21074    
##  3rd Qu.:0.8550   3rd Qu.:3.115e+11   3rd Qu.: 30271    
##  Max.   :0.9440   Max.   :1.743e+13   Max.   :126352

Análisis Jerárquico de Clústeres

El análisis jerárquico de clústeres agrupa las observaciones basándose en sus distancias mutuas. En una primera etapa, se procederá a la normalización de los valores, considerando las múltiples unidades de medida entre las variables. Posteriormente, se calcularán las distancias entre pares mediante el método Euclidiano.

# Normalizando sr1 y calculando la distancia euclidiana entre las observaciones de sr1

dist_sr1 <- dist(scale(sr1))

# Visualizando las distancias entre pares

hist(dist_sr1)

El histograma que se presenta a continuación indica que una distancia euclidiana de dos es la más frecuente entre las distancias mutuas.

# Análisis de linkage de clústeres
hclust_sr1 <- hclust(dist_sr1, method = "complete")

library(dendextend)

# resultado en un dendrograma

sr1_dendrogram <- as.dendrogram(hclust_sr1)
sr1_dendrogram_color <- color_branches(sr1_dendrogram, h = 8)

# Se extrae el grupo de clúster
cluster <- cutree(hclust_sr1, k=4)

# Se añade los valores de grupo de clúster a las observaciones
sr2 <- sr_no_na %>% mutate(cluster = cluster)


plot(sr1_dendrogram_color)

Dendrograma de Clústeres

A través de la función hclust(), se llevó a cabo un análisis de enlace utilizando el método “complete” para vincular las distancias. Después de realizar una inspección visual del dendrograma, se realizaron pruebas con varios números de clústeres y se exploraron relaciones bivariadas para determinar cuál cantidad de clústeres segmenta de manera óptima los datos. Aunque se consideró el método tradicional de selección de k mediante la representación gráfica de las distancias basadas en el número de clústeres, se descartó debido a la gran cantidad de datos, identificándose más de 900 clústeres.

Análisis de Relaciones Bivariadas

Se analizaron diversas combinaciones de distancias entre pares mediante gráficos en 2D. Esto se realizó con el objetivo de seleccionar las variables que mejor visualizan los segmentos de clúster. La elección de variables se basó en el análisis de la forma y la intensidad de diversas relaciones bivariadas. Se colocó una línea de regresión en el gráfico para comprender mejor las relaciones.

La relación entre las variables Número de Suicidios y PIB para el Año mostró la asociación más fuerte de todas las relaciones bivariadas, como se muestra a continuación.

sr2_lr <- ggplot(sr2, aes(x = `gdp_for_year ($)`, y = suicides_no)) +
              geom_point() +
              geom_smooth(method = "lm", se = FALSE) +
              scale_y_log10() +
              scale_x_log10()
sr2_lr

Visualización de Clústeres

Usando las variables seleccionadas (Número de Suicidios y PIB para el Año), se crearon gráficos en 2D para visualizar los clústeres. Se añadieron líneas de regresión para cada clúster con el objetivo de demostrar la relación entre las variables dentro de cada grupo. Se eliminaron las escalas logarítmicas de cada eje para facilitar la distinción entre los clústeres.

sr2_plot <- ggplot(sr2, aes(y=suicides_no, x=`gdp_for_year ($)`, color = factor(cluster))) +
                geom_point() +
                geom_smooth(method = "lm", se = FALSE)

sr2_plot
## `geom_smooth()` using formula = 'y ~ x'

Perfilando e Interpretando cada Clúster

Con el objetivo de comprender lo que está sucediendo en cada clúster, se visualizaron y perfilaron individualmente, basándose en País, Género, Edad y Generación. Los perfiles se representan mediante colores.

Clúster 1: incluye la mayoría de los puntos de datos. La mayoría de las víctimas de suicidio están en este clúster y no hay un elemento distintivo de perfil basado en los datos que tenemos.

cluster1 <- sr2 %>%
                filter(cluster ==  1) %>% 
                     ggplot(aes(x = suicides_no, y = `gdp_for_year ($)`, color = sex)) +
                         geom_point() +
                         scale_y_log10() +
                         scale_x_log10()
cluster1
## Warning: Transformation introduced infinite values in continuous x-axis

Clúster 2: - Víctimas de Japón, Ucrania y Estados Unidos. - Las víctimas de Ucrania tienen el PIB más bajo para el año y el menor número de suicidios entre las tres. - Todas las víctimas son de género masculino. - Sus edades abarcan desde 15 hasta 74 años, destacándose el grupo de edad de 35 a 54 años con el mayor valor en el número de suicidios.

cluster2_country <- sr2 %>%
                filter(cluster ==  2) %>%
                    ggplot(aes(y = suicides_no, x = `gdp_for_year ($)`, color = `country`)) +
                        geom_point()+
                        scale_y_log10() +
                        scale_x_log10() +
                        ggtitle("Cluster 2 GDP ~ No. of Suicides by Country")
cluster2_country

Clúster 3: - Las víctimas en el Clúster 3 son todas de los Estados Unidos. - Todas son de género masculino. - Sus edades varían entre 35 y 74 años, siendo el grupo de edad de 35 a 54 años el que tiene el mayor número de observaciones.

cluster3_age <- sr2 %>% 
                filter(cluster ==  3) %>%
                    ggplot(aes(y = suicides_no, x = `gdp_for_year ($)`, color = `age`)) +
                        geom_point() +
                          scale_y_log10() +
                          ggtitle("Cluster 3 GDP ~ No. of Suicides by Age")
cluster3_age

Clúster 4: - Las víctimas en el Clúster 4 son todas de los Estados Unidos. - Están compuestas por individuos de género masculino y femenino; sin embargo, la mayoría de las víctimas en este clúster son mujeres. - Sus edades varían desde 15 hasta 75 años y más, destacándose el grupo de edad de 24 a 34 años con el mayor número de suicidios entre 2010 y 2014. - Los millennials tienen el mayor número de suicidios entre los años 2011 y 2014. - El número de suicidios para cada grupo de edad no ha cambiado mucho desde el año 2000.

cluster4_country <- sr2 %>%
                filter(cluster ==  4) %>%
                    ggplot(aes(y = suicides_no, x = `gdp_for_year ($)`, color = `generation`)) +
                        geom_point()+
                        scale_y_log10() +
                        scale_x_log10() +
                        ggtitle("Cluster 4 GDP ~ No. of Suicides by Generation")

cluster4_country

Resumen de Promedios por Clúster

En este segundo análisis, se resumen los promedios de cada variable: Número de Suicidios, Suicidios por cada 100,000 personas, PIB para el Año y PIB per cápita. Los promedios para cada par clúster/variable se presentan en una tabla y luego se visualizan en un gráfico de serpiente.

pop <- sr2 %>% summarize(
  suicides_no = mean(suicides_no),
  `suicides/100k pop` = mean(`suicides/100k pop`), 
  `gdp_for_year ($)` = mean(`gdp_for_year ($)`),
  `gdp_per_capita ($)` = mean(`gdp_per_capita ($)`),
  `HDI for year` = mean(`HDI for year`)) %>%
  mutate(cluster = "pop")
pop <- pop[,c(6,1,2,3,4,5)]
summary <- sr2 %>% group_by(cluster) %>% summarize(
          suicides_no = mean(suicides_no),
          `suicides/100k pop` = mean(`suicides/100k pop`), 
          `gdp_for_year ($)` = mean(`gdp_for_year ($)`),
          `gdp_per_capita ($)` = mean(`gdp_per_capita ($)`),
          `HDI for year` = mean(`HDI for year`))
summary <- add_row(
  summary,
  cluster = as.integer("pop"),  # Convertir a entero
  suicides_no = 206.1243,
  `suicides/100k pop` = 11.99194,
  `gdp_for_year ($)` = 547663851141,
  `gdp_per_capita ($)` = 21074.37,
  `HDI for year` = 0.7766011,
  .before = 1
)

summary <- as.data.frame(t(summary))
summary$profiling_var <- rownames(summary)
summary <- summary[-c(1), ]

colnames(summary) <- c("Population", "Cluster 1", " Cluster 2", "Cluster 3", "Cluster 4")
colnames(summary)[6] <- "profiling_var"

summary <- tbl_df(summary)
summary <- summary %>% mutate_at(vars(1:5), as.character)
summary <- summary %>% mutate_at(vars(1:5), as.numeric)
summary
## # A tibble: 5 × 6
##   Population `Cluster 1` ` Cluster 2` `Cluster 3` `Cluster 4` profiling_var     
##        <dbl>       <dbl>        <dbl>       <dbl>       <dbl> <chr>             
## 1   2.06e+ 2    1.52e+ 2     5.69e+ 3    9.73e+ 3    2.02e+ 3 suicides_no       
## 2   1.20e+ 1    1.19e+ 1     4.07e+ 1    2.65e+ 1    1.07e+ 1 suicides/100k pop 
## 3   5.48e+11    3.87e+11     4.44e+12    1.48e+13    1.49e+13 gdp_for_year ($)  
## 4   2.11e+ 4    2.07e+ 4     2.97e+ 4    5.15e+ 4    5.19e+ 4 gdp_per_capita ($)
## 5   7.77e- 1    7.75e- 1     8.32e- 1    9.06e- 1    9.06e- 1 HDI for year

Análisis de Snake Plot por Clúster

  • Los Clústeres 3 y 4 están empatados con el promedio más alto del PIB por año.

  • El Clúster 4 presenta el promedio más alto de Número de Suicidios.

  • Sin embargo, el Clúster 2 tiene la tasa de suicidios promedio más alta (por cada 100,000 personas), al mismo tiempo que posee el segundo promedio más alto de PIB por año y Número de Suicidios.

  • Los Clústeres 2 y 3 exhiben el promedio más alto tanto en el número de suicidios como en la tasa de suicidios.

library(reshape2)


summary_melt <- melt(summary, id = "profiling_var")
colnames(summary_melt)[3] <- "mean"
colnames(summary_melt)[2] <- "cluster"
summary_melt <- tbl_df(summary_melt)

snake_plot <- summary_melt %>%
                    ggplot(aes(x=profiling_var, y= mean, group = cluster, color = cluster)) + 
                    geom_line() +
                    geom_point() +
                    scale_y_log10() +
                    ggtitle("Cluster Averages by Variable") +
                    theme(legend.position = c(0.8, 0.8))
snake_plot

Conclusión

En este kernel, se llevó a cabo un análisis de agrupamiento utilizando R sobre el número de víctimas de suicidio en todo el mundo. Desde el análisis jerárquico, se identificaron cuatro clústeres principales formados a partir de los datos. Cada clúster, con excepción del Clúster 1, presenta atributos de perfil únicos que los distinguen entre sí. El Clúster 1 no mostró un elemento de perfil único según los datos disponibles. Los Clústeres 2 incluyen personas que viven en Ucrania, Japón y Estados Unidos. Los Clústeres 3 y 4 están compuestos solo por personas que viven en Estados Unidos, con edades entre 35 y 74 años. Mientras que el Clúster 3 está formado exclusivamente por hombres, la mayoría de los integrantes del Clúster 4 son mujeres. En nuestro análisis final, el resumen de los promedios nos permitió observar cómo interactúan entre sí los diferentes clústeres a través de las diversas variables numéricas.

Bibliografía

DIXON, K. (Agosto de 2018). Análisis de Clúster en Víctimas de Suicidio. Obtenido de Kaggle : https://www.kaggle.com/code/ksvrd1/cluster-analysis-on-suicide-victims

Kassambara, A. (2017). Practical Guide to Cluster Analysis in R: Unsupervised Machine Learning (Multivariate Analysis) (1st ed.). STHDA. obtenido de: https://xsliulab.github.io/Workshop/2021/week10/r-cluster-book.pdf