UNIVERSIDAD DE EL SALVADOR
FACULTAD DE CIENCIAS ECONÓMICAS
ESCUELA DE ECONOMÍA
MÉTODOS PARA EL ANÁLISIS ECONÓMICO
TEMA:
“Investigación de Análisis Conglomerados”
DOCENTE:
MSF. Carlos Ademir Pérez Alas.
ESTUDIANTES:
Verónica Nayeli Miranda Mejia MM21065
Sara Yamileth Castro Argueta CA21011
Eliana Michell Mejía Juárez MJ21002
Grupo teórico
GT-03
Ciudad Universitaria, Domingo 24 de Noviembre de 2024
Definición de Análisis de Conglomerados
Conocido en inglés como Cluster analysis, término utilizado por primera vez por Tyron en 19391, consiste en una técnica estadística multivariante que busca agrupar observaciones en grupos (o conglomerados) de tal forma que los elementos de un mismo grupo sean lo más similares posible entre sí (homogéneos) y lo más diferentes posible de los de otros grupos (heterogéneo). Es decir que un análisis de de conglomerados se refiere a un estudio multivariado que hace referencia a un conjunto de relaciones interdependientes, donde no se hace distinción entre las variables dependientes e independientes.Prácticamente el análisis de conglomerados tiene como propósito reducir el número de objetos y reunirlos en un número de grupos mucho menor que la totalidad de los objetos o casos iniciales y que sean similares internamente y diferentes entre grupos. La peculiaridad de este tipo de análisis es que resulta útil para clasificar y simplificar grandes volúmenes de datos en muchos campos del conocimiento como áreas de marketing, economía, etc. Por ejemplo este análisis de conglomerados en investigaciones de mercados tiene dos aplicaciones como: el comportamiento del consumidor cuando se pretende identificar grupos de compradores homogéneos, y en la segmentación de mercado cuando los consumidores se agrupan en base a su semejanza según las preferencias respecto a las variables seleccionadas o a la utilidad que buscan al adquirir un producto.(Meneses 2000)
2. Cuadro Comparativo sobre Análisis de Conglomerados
Elabore un cuadro comparativo, que incluya los siguientes elementos: definición de clouster jerarquicos y no jerárquicos,las técnicas de cada una y sus respectivas ventajas y desventajas que presentan ambos tipos.
| Análisis de Cluster | Técnicas Disponibles | Ventajas | Desventajas |
|---|---|---|---|
| Jerárquico | Métodos aglomerativos… | Interpretabilidad… | Computacionalmente intensivo… |
| Forma los grupos en pasos sucesivos… | |||
| No Jerárquico | Agrupación por partición | Permite establecer un número fijo de grupos… | Definir el número de conglomerados… |
| Se aplica en casos de tamaño de muestra grande… |
Fuente: Desarrollo de análisis Cluster en R & Conglomerados
Para mayor detalle sobre la tabla comparativa de análisis de conglomerados puedes visitar el siguiente enlace:
https://rpubs.com/vero240314/tabla_comparativa_clustervm
3. Descripción de las Técnicas de Análisis de Conglomerados Jerárquicas y No Jerárquicas con las Librerías y Sintaxis para Implementarlas en R
Describa las técnicas disponibles para realizar el análisis de clúster, tanto jerárquicas como no jerárquicas, presentadas en el cuadro anterior, incluya una explicación de la librería y sintaxis para implementarla en R.
Técnicas de análisis de conglomerados jerárquicos
1. Métodos aglomerativos (enlace)La agrupación jerárquica es un método de análisis de aglomerados que produce una presentación basada en representación de dendrograma. Los objetos en el dendrograma están vinculados juntos en función de su similitud. Para realizar un análisis de conglomerados jerárquicos en R, el primer paso es calcular el valor por distancias por pares a través de la función de dist(). Luego el resultado del calculo es usado por la funcion hclust() para producir el arbol jerárquico.(Joaquin and Ezequiel 2017)
Dentro de las ibrerías que este método utiliza esta la stats and la factoextra. La stats incluye los comandos hclust() usado para los métodos clásicos para clustering jerárquico y dist() que permite el cálculo de la matriz de distancias.
1.1 Método de enlace sencillo
El método aglomerativo sencillo (o single linkage) es una técnica de agrupación jerárquica donde la distancia entre dos clusters se define como la distancia más corta entre cualquier par de puntos, uno de cada cluster. Este método une los clusters que tienen los puntos más cercanos, formando clusters alargados o en forma de cadenas
# Cargar un conjunto de datos de ejemplo
data(iris)
df <- scale(iris[, -5]) # Normalizar los datos (excluyendo la variable categórica)
# Calcular matriz de distancias
d <- dist(df)
# Aplicar el método de enlace simple
hc_single <- hclust(d, method = "single")
# Visualizar el dendrograma
plot(hc_single, main = "Dendrograma (Enlace Simple)", xlab = "", ylab = "Altura")1.2 Método de enlace completo
El método de enlace completo (o complete linkage) es también una técnica de agrupación jerárquica en la que la distancia entre dos clusters se define como la distancia máxima entre cualquier par de puntos, uno de cada cluster. Esto significa que se considera la mayor separación entre elementos al fusionar dos clusters.
Tiene la característica que forma clusters más compactos y redondeados que el método de enlace sencillo, es menos susceptible al efecto de encadenamiento y tiende a evitar la fusión de clusters con grandes variaciones internas.
# Crear un conjunto de datos simple
data <- data.frame(
x = c(1, 2, 3, 8, 9, 10),
y = c(1, 1, 2, 8, 9, 10)
)
# Visualizar los datos
plot(data, main = "Datos de ejemplo", pch = 19)# Calcular la matriz de distancias
d <- dist(data)
# Agrupar usando el método de enlace completo
hc_complete <- hclust(d, method = "complete")
# Visualizar el dendrograma
plot(hc_complete, main = "Dendrograma (Enlace Completo)", xlab = "", ylab = "Altura")1.3. Método de enlace promedio
El método de enlace promedio es una técnica de agrupamiento jerárquico que calcula la distancia promedio entre todos los puntos de dos grupos.[venables2005introduction]
Librería: Para realizar agrupamiento jerárquico, usar la librería stats, que viene incluida en R.
Sintaxis y Ejemplo# Cargar librerías
library(stats)
# Crear un conjunto de datos de ejemplo
set.seed(123)
data <- matrix(rnorm(100), ncol=2)
# Calcular la matriz de distancias
distancias <- dist(data)
# Realizar el agrupamiento jerárquico con enlace promedio
hc <- hclust(distancias, method = "average")
# Graficar el dendrograma
plot(hc)# Cortar el dendrograma para obtener 3 grupos
grupos <- cutree(hc, k = 3)
# Visualizar los grupos
plot(data, col = grupos)2. Método Divisivo (Divisive Method)
El método divisivo es otro enfoque de agrupamiento jerárquico que comienza con todos los puntos en un solo grupo y los divide sucesivamente.(Everitt et al. 2011)
Librería Puedes usar la librería dendextend para visualizar y manipular dendrogramas.
Sintaxis y Ejemplo## Warning: package 'dendextend' was built under R version 4.4.1
##
## ---------------------
## Welcome to dendextend version 1.18.1
## Type citation('dendextend') for how to cite the package.
##
## Type browseVignettes(package = 'dendextend') for the package vignette.
## The github page is: https://github.com/talgalili/dendextend/
##
## Suggestions and bug-reports can be submitted at: https://github.com/talgalili/dendextend/issues
## You may ask questions at stackoverflow, use the r and dendextend tags:
## https://stackoverflow.com/questions/tagged/dendextend
##
## To suppress this message use: suppressPackageStartupMessages(library(dendextend))
## ---------------------
##
## Adjuntando el paquete: 'dendextend'
## The following object is masked from 'package:stats':
##
## cutree
# Crear un conjunto de datos de ejemplo
set.seed(123)
data <- matrix(rnorm(100), ncol=2)
# Calcular la matriz de distancias
distancias <- dist(data)
# Realizar el agrupamiento jerárquico
hc <- hclust(distancias, method = "ward.D2")
# Convertir a un objeto dendrograma
dendro <- as.dendrogram(hc)
# Cortar el dendrograma para obtener 3 grupos
grupos <- cutree(hc, k = 3)
# Graficar el dendrograma
plot(dendro)# Visualizar los grupos
plot(data, col = grupos)
points(hc$centers, col = 1:3, pch = 8, cex = 2) # Cambiar para mostrar los centrosReferencias: R Documentation. “hclust”.
Técnicas de análisis de conglomerados no jerárquicos
1. K-Medias (K-Means Clustering)
El método k-medias es una técnica popular de agrupamiento que busca dividir los datos en k grupos basándose en la minimización de la variabilidad dentro de los grupos.
Librería la librería stats para realizar el k-medias.
Sintaxis y Ejemplo# Cargar librerías
library(stats)
# Crear un conjunto de datos de ejemplo
set.seed(123)
data <- matrix(rnorm(100), ncol=2)
# Aplicar k-medias
set.seed(123) # Para reproducibilidad
kmeans_result <- kmeans(data, centers = 3)
# Visualizar los resultados
plot(data, col = kmeans_result$cluster)
points(kmeans_result$centers, col = 1:3, pch = 8, cex = 2)1. Agrupación por Partición
Principalmente estos métodos dividen los datos en un número predefinido de grupos (k), basados en minimizar la distancia dentro de los grupos y maximizar la distancia entre ellos. Dentro de la técnica de agrupación por participación podemos encontrar dos tipos: conocidas en inglés como K-means y K-medoids o en español como K-medias y K-medoides
K-means y K-medoids no son lo mismo, pero son métodos similares de análisis de conglomerados por partición. Ambos buscan dividir los datos en un número predefinido de grupos (k), pero difieren en cómo definen los centros de los grupos y su sensibilidad a valores atípicos.
K-means: Para César Pérez López el algoritmo de las K-medias es el más importante desde los puntos de vista conceptual y práctico. El algoritmo empieza con puntos iniciales (centroides) que se eligen al azar como los centros de los grupos. A partir de esos puntos, cada dato se asigna al centro más cercano.
Después de asignar los datos, el algoritmo calcula nuevamente el centro de cada grupo como el promedio de los datos asignados, luego reasigna los datos a los nuevos centros, y asi este proceso se repite (iteraciones) hasta que las asignaciones no cambian más o ya sea que se cumplan ciertos criterios como alcanzar un número máximo de pasos. Lo que busca lograr es minimizar la varianza residual, que es básicamente la distancia entre los datos y el centro del grupo al que pertenecen, y a la vez, maximizar la distancia entre los centros de los grupos para que sean lo más diferentes posible entre sí.
## Warning: package 'cluster' was built under R version 4.4.2
# K-means
data <- mtcars[, c("mpg", "hp")] # Selección de variables
kmeans_result <- kmeans(data, centers = 3, nstart = 25)
print(kmeans_result)## K-means clustering with 3 clusters of sizes 10, 5, 17
##
## Cluster means:
## mpg hp
## 1 15.80000 178.50000
## 2 14.62000 263.80000
## 3 24.22353 93.52941
##
## Clustering vector:
## Mazda RX4 Mazda RX4 Wag Datsun 710 Hornet 4 Drive
## 3 3 3 3
## Hornet Sportabout Valiant Duster 360 Merc 240D
## 1 3 2 3
## Merc 230 Merc 280 Merc 280C Merc 450SE
## 3 3 3 1
## Merc 450SL Merc 450SLC Cadillac Fleetwood Lincoln Continental
## 1 1 1 1
## Chrysler Imperial Fiat 128 Honda Civic Toyota Corolla
## 2 3 3 3
## Toyota Corona Dodge Challenger AMC Javelin Camaro Z28
## 3 1 1 2
## Pontiac Firebird Fiat X1-9 Porsche 914-2 Lotus Europa
## 1 3 3 3
## Ford Pantera L Ferrari Dino Maserati Bora Volvo 142E
## 2 1 2 3
##
## Within cluster sum of squares by cluster:
## [1] 3799.420 6922.188 8771.866
## (between_SS / total_SS = 86.7 %)
##
## Available components:
##
## [1] "cluster" "centers" "totss" "withinss" "tot.withinss"
## [6] "betweenss" "size" "iter" "ifault"
# Visualización
library(ggplot2)
ggplot(data = as.data.frame(data), aes(x = mpg, y = hp)) +
geom_point(aes(color = as.factor(kmeans_result$cluster))) +
labs(color = "Cluster") +
theme_minimal()# Datos de los centroides
centroides <- as.data.frame(kmeans_result$centers)
# Gráfico con centroides
ggplot(data = as.data.frame(data), aes(x = mpg, y = hp)) +
geom_point(aes(color = as.factor(kmeans_result$cluster))) + # Puntos del dataset
geom_point(data = centroides, aes(x = mpg, y = hp), color = "black", size = 4, shape = 17) + # Centroides
labs(color = "Cluster") +
theme_minimal()Explicación:
En R Studio hay un conjunto de datos llamados mtcars, del cual se ha extraído dos variables mpg: Millas por galón (eficiencia de combustible) y hp: Caballos de fuerza (potencia del motor), con la idea de poder crear dos subconjuntos de datos con las dos variables, luego se realiza la aplicación del algoritmo K-means. K-means esta formado por la data, los centers y los nstars; el centers significa el número de grupos que va a dividir el conjunto de datos y nstart = 10: significa que el algoritmo se va a ejecutar 25 veces con diferentes puntos iniciales aleatorios, para encontrar la mejor solución o mejor dicho la que minimice la varianza.
En el gráfico, los centroides representan los puntos centrales de cada cluster. En términos de K-means, el centroide de un cluster es el promedio (o la media) de las coordenadas de todos los puntos que pertenecen a ese cluster. Es decir que representan el automóvil promedio del cluster en términos de eficiencia (mpg) y potencia (hp).
También en este gráfico de dispersión los puntos del mismo color pertenecen al mismo grupo (cluster). Esto significa que los automóviles dentro de un cluster tienen valores similares en mpg y hp.Si los clusters están bien formados, significa que los puntos de cada grupo están relativamente cerca entre sí y separados de los otros grupos lo que que refleja que K-means ha agrupado los datos de forma eficiente minimizando las diferencias dentro de cada grupo.
# Otra forma de aplicación de K-means
data <- mtcars[, c("mpg", "hp")]
kmeans_result <- kmeans(data, centers = 3, nstart = 10)
print(kmeans_result$centers)## mpg hp
## 1 15.80000 178.50000
## 2 24.22353 93.52941
## 3 14.62000 263.80000
Explicación
En R Studio hay un conjunto de datos llamados mtcars, del cual se ha extraído dos variables mpg: Millas por galón (eficiencia de combustible) y hp: Caballos de fuerza (potencia del motor), con la idea de poder crear dos subconjuntos de datos con las dos variables, luego se realiza la aplicación del algoritmo K-means. K-means esta formado por la data, los centers y los nstars; el centers significa el número de grupos que va a dividir el conjunto de datos y nstart = 10: significa que el algoritmo se va a ejecutar 10 veces con diferentes puntos iniciales aleatorios, para encontrar la mejor solución o mejor dicho la que minimice la varianza.
Cada color en el gráfico representa un grupo (cluster) formado por el algoritmo K-means.Los puntos de un mismo color están en el mismo cluster, lo que significa que los automóviles en este grupo son similares en términos de eficiencia (mpg) y potencia (hp). Los puntos cercanos dentro de un mismo color indican que los automóviles en ese cluster son muy similares, si los puntos están muy dispersos dentro del cluster, podría sugerir que hay más variabilidad interna, mientras una gran distancia entre colores indica que los grupos son bien diferenciados como tam bién esto puede sugerir que el grupo no está bien definido o que el número de clusters elegido no es el ideal.
La técnica de K-medoids es un método de clustering particional que agrupa datos en un número predefinido de 𝑘.Los k clusters se caracterizan por utilizar medoides como puntos de referencia; estos medoides son observaciones reales dentro del conjunto de datos que minimizan la suma de distancias generalmente, la distancia euclidiana ya sea entre ellas y las otras observaciones de su grupo.
A diferencia de los K-means, estos son robustos frente a valores extremos los cuales requiere de grandes costos computacionales
Librerías que se pueden aplicar para implementar K-medoids en R son: clouster, fpc y clustMixTypelibrary(cluster)
# Datos simulados
data <- matrix(rnorm(100), nrow = 20)
# Aplicación de K-medoids
kmedoids_result <- pam(data, k = 3)
# Gráfica de clusters
clusplot(data, kmedoids_result$cluster, color = TRUE, shade = TRUE, labels = 2, lines = 0)## [,1] [,2] [,3] [,4] [,5]
## [1,] 0.4120223 0.3002791 0.52685567 0.7901903 0.9025058
## [2,] -0.2288958 -0.4889228 1.76365303 1.1849306 -2.3482903
## [3,] -0.7729782 -0.3193938 0.03768285 0.3399565 -0.7554640
## [4,] 1.2339762 -0.9008709 -0.66518864 -0.7661688 -1.2774508
# Datos ficticios
library(clustMixType)
set.seed(123) # Para reproducibilidad
data <- data.frame(
Edad = c(25, 34, 28, 45, 50, 33, 48, 52, 41, 27),
Ingreso = c(25000, 40000, 30000, 60000, 70000, 32000, 65000, 80000, 55000, 27000),
Genero = as.factor(c("Mujer", "Hombre", "Mujer", "Hombre", "Hombre", "Mujer", "Hombre", "Mujer", "Hombre", "Mujer")),
Categoria = as.factor(c("A", "B", "A", "C", "C", "A", "B", "C", "B", "A"))
)
print(data)## Edad Ingreso Genero Categoria
## 1 25 25000 Mujer A
## 2 34 40000 Hombre B
## 3 28 30000 Mujer A
## 4 45 60000 Hombre C
## 5 50 70000 Hombre C
## 6 33 32000 Mujer A
## 7 48 65000 Hombre B
## 8 52 80000 Mujer C
## 9 41 55000 Hombre B
## 10 27 27000 Mujer A
## # NAs in variables:
## Edad Ingreso Genero Categoria
## 0 0 0 0
## 0 observation(s) with NAs.
##
## Estimated lambda: 345057560
## Distance type: huang
##
## Numeric predictors: 2
## Categorical predictors: 2
## Lambda: 345057560
##
## Number of Clusters: 3
## Cluster sizes: 2 2 6
## Within cluster error: 2000013 2000002 2313563794
##
## Cluster prototypes:
## Edad Ingreso Genero Categoria
## 1 30.5 31000.00 Mujer A
## 2 26.0 26000.00 Mujer A
## 3 45.0 61666.67 Hombre B
2.Self-Organizing Maps (SOM)
Descripción: Una técnica basada en redes neuronales no supervisadas que mapea datos multidimensionales en una representación de menor dimensión (generalmente 2D). Es útil para visualizar y explorar grandes volúmenes de datos pero requiere de una configuración previa de la red neuronal y puede ser compleja de interpretar.
A diferencia de los métodos jerárquicos, SOM no crea una estructura de árbol, es decir que en su lugar, organiza los datos en un mapa de baja dimensión (generalmente 2D), donde puntos similares se agrupan cerca unos de otros. Además se caracteriza por crear un mapa auto-organizado donde los datos se mapean a una cuadrícula (normalmente 2D), en la que cada punto en el mapa representa una categoría o un grupo de datos. Las distancias entre los puntos en el mapa reflejan las similitudes entre los datos originales.
## Warning: package 'kohonen' was built under R version 4.4.2
# Usar solo las variables numéricas de iris (sin la columna de especie)
data <- iris[, -5]
# Convertir el dataframe a una matriz numérica
data_matrix <- as.matrix(data)
# Crear una red SOM con una malla hexagonal de 3x3
som_result <- som(data_matrix, grid = somgrid(3, 3, "hexagonal"))
# Visualizar los resultados
plot(som_result)Explicación
Al utilizar iris[, -5] se esta inidcando en R que elimibe la columna de las especies (la cual es categórica) y que deje solo con las variables numéricas (las medidas de las flores).
as.matrix(data): lo que hace es convertir el data.frame en una matriz numérica, lo cual es necesario para que la función SOM funcione correctamente.
somgrid(3, 3, “hexagonal”): Define una malla de 3x3 con una disposición “hexagonal” que puede experimentar diferentes tamaños.
3. DBSCAN (Density-Based Spatial Clustering of Applications with Noise)
Este método esta basado en la densidad que agrupa puntos de datos que están cercanos entre sí y separa puntos ruidosos o atípicos, también no requiere definir el número de clusters. La ventaja que tienen es que manejan clusters de forma arbitraria y detecta ruido, requieren de dos parámetros (radio de vecindad y cantidad mínima de puntos), lo que puede ser difícil de ajustar.La librería de R que usa es: dbscan
library(dbscan)
data <- iris[, -5]
dbscan_result <- dbscan(data, eps = 0.5, minPts = 5)
print(dbscan_result$cluster) # Identificación de clusters## [1] 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1
## [38] 1 1 1 1 0 1 1 1 1 1 1 1 1 2 2 2 2 2 2 2 0 2 2 0 2 2 2 2 2 2 2 0 2 2 2 2 2
## [75] 2 2 2 2 2 2 2 2 2 2 2 2 2 0 2 2 2 2 2 0 2 2 2 2 0 2 2 2 2 2 2 0 0 2 0 0 2
## [112] 2 2 2 2 2 2 0 0 2 2 2 0 2 2 2 2 2 2 2 2 0 2 2 0 0 2 2 2 2 2 2 2 2 2 2 2 2
## [149] 2 2
library(ggplot2)
# Convertir a un dataframe para graficar
plot_data <- cbind(data, cluster = as.factor(dbscan_result$cluster))
ggplot(plot_data, aes(x = Sepal.Length, y = Sepal.Width, color = cluster)) +
geom_point() +
labs(title = "Clustering DBSCAN", color = "Cluster")Explicación
texto<-"bscan_result$cluster:
Este vector asigna un número de cluster a cada punto de los datos.
Valor 0: Representa puntos considerados ruido (outliers) que no pertenecen a ningún cluster.
Otros valores (1, 2, etc.): Representan los diferentes clusters identificados"
cat(paste("<p style='text-align:justify;'>", texto, "</p>", sep = ""))## <p style='text-align:justify;'>bscan_result$cluster:
##
## Este vector asigna un número de cluster a cada punto de los datos.
## Valor 0: Representa puntos considerados ruido (outliers) que no pertenecen a ningún cluster.
## Otros valores (1, 2, etc.): Representan los diferentes clusters identificados</p>
4. Quick cluster
Es una técnica de análisis de conglomerados no jerárquicos que hace una implementación específica del algoritmo k-means, utilizado para agrupar casos u observaciones en un número predefinido de clústeres, que se basa en una similitud de sus características.
Se clasifica como no jerárquico porque no genera una estructura jerárquica de grupos, sino que forma clústeres independientes directamente que requiere de requiere de un número inicial de clústeres especificados por el investigador o analista. Funciona calculando el centroide (promedio) de cada clúster y reasigna las observaciones al clúster cuyo centroide esté más cerca en términos de distancia usualmente euclidiana.(“Scran Source: quickCluster Function in r” n.d.)
# Crear datos ficticios
set.seed(123)
clientes <- data.frame(
edad = c(25, 34, 28, 50, 45, 22, 30, 40, 29, 60),
ingreso = c(40000, 60000, 50000, 80000, 75000, 42000, 48000, 70000, 52000, 90000),
gasto = c(2000, 3000, 2500, 4000, 3500, 2200, 2800, 3700, 2600, 4500)
)
# Estandarizar las variables
clientes_scaled <- scale(clientes)
# Aplicar k-means (Quick Cluster)
set.seed(123) # Para reproducibilidad
kmeans_result <- kmeans(clientes_scaled, centers = 3, nstart = 25)
# Mostrar resultados
print(kmeans_result)## K-means clustering with 3 clusters of sizes 5, 2, 3
##
## Cluster means:
## edad ingreso gasto
## 1 -0.7791132 -0.8330333 -0.8072560
## 2 1.5336229 1.4155740 1.4310447
## 3 0.2761068 0.4446728 0.3913968
##
## Clustering vector:
## [1] 1 3 1 2 3 1 1 3 1 2
##
## Within cluster sum of squares by cluster:
## [1] 1.2620304 0.6929759 1.1929167
## (between_SS / total_SS = 88.3 %)
##
## Available components:
##
## [1] "cluster" "centers" "totss" "withinss" "tot.withinss"
## [6] "betweenss" "size" "iter" "ifault"
# Añadir los clústeres al dataset original
clientes$cluster <- kmeans_result$cluster
print(clientes)## edad ingreso gasto cluster
## 1 25 40000 2000 1
## 2 34 60000 3000 3
## 3 28 50000 2500 1
## 4 50 80000 4000 2
## 5 45 75000 3500 3
## 6 22 42000 2200 1
## 7 30 48000 2800 1
## 8 40 70000 3700 3
## 9 29 52000 2600 1
## 10 60 90000 4500 2
# Librería para gráficos
library(ggplot2)
# Gráfico de dispersión con clústeres
ggplot(clientes, aes(x = ingreso, y = gasto, color = factor(cluster))) +
geom_point(size = 3) +
labs(title = "Clústeres de Clientes", x = "Ingreso", y = "Gasto", color = "Clúster") +
theme_minimal()5. Clara medoides
CLARA es una técnica de análisis de conglomerados no jerárquica basada en el método de k-medoides. Es particularmente adecuada para analizar grandes conjuntos de datos, ya que selecciona muestras aleatorias del dataset completo para calcular los conglomerados, lo que permite reducir el costo computacional, este utiliza el algoritmo PAM (Partitioning Around Medoids) en cada muestra, eligiendo la partición que minimiza la disimilitud promedio entre las observaciones. La ventaja de esta técnica se puede manejar grandes conjuntos de datos al analizar subconjuntos aleatorios en lugar de trabajar con todos los datos, donde cada clúster con una observación central (medoide), en lugar del promedio, lo que lo hace robusto frente a valores atípicos que buscan minimizar la suma de las disimilitudes entre los puntos y sus medoides correspondientes.
## Sepal.Length Sepal.Width Petal.Length Petal.Width Species
## 1 5.1 3.5 1.4 0.2 setosa
## 2 4.9 3.0 1.4 0.2 setosa
## 3 4.7 3.2 1.3 0.2 setosa
## 4 4.6 3.1 1.5 0.2 setosa
## 5 5.0 3.6 1.4 0.2 setosa
## 6 5.4 3.9 1.7 0.4 setosa
# Aplicar CLARA al conjunto de datos iris (sin la columna de especies)
set.seed(123) # Para reproducibilidad
clara_result <- clara(iris[, 1:4], k = 3, samples = 5)
# Resumen del resultado
print(clara_result)## Call: clara(x = iris[, 1:4], k = 3, samples = 5)
## Medoids:
## Sepal.Length Sepal.Width Petal.Length Petal.Width
## [1,] 5.1 3.5 1.4 0.2
## [2,] 6.1 3.0 4.6 1.4
## [3,] 6.8 3.0 5.5 2.1
## Objective function: 0.6760124
## Clustering vector: int [1:150] 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 ...
## Cluster sizes: 50 61 39
## Best sample:
## [1] 1 2 4 14 16 29 30 32 33 37 41 47 48 50 54 59 64 66 67
## [20] 70 75 76 80 83 92 96 97 111 112 113 114 117 119 120 121 126 128 130
## [39] 131 132 133 140 143 144 147 149
##
## Available components:
## [1] "sample" "medoids" "i.med" "clustering" "objective"
## [6] "clusinfo" "diss" "call" "silinfo" "data"
##
## setosa versicolor virginica
## 1 50 0 0
## 2 0 48 13
## 3 0 2 37
## Warning: package 'factoextra' was built under R version 4.4.1
## Welcome! Want to learn more? See two factoextra-related books at https://goo.gl/ve3WBa
fviz_cluster(clara_result, geom = "point", data = iris[, 1:4]) +
labs(title = "Visualización de CLARA en el dataset iris")6. Block Clustering
Es una técnica de agrupamiento que se utiliza para identificar patrones en datos que pueden ser organizados en bloques o segmentos. Es especialmente útil en datos de alta dimensionalidad donde las relaciones entre las variables pueden ser complejas. Esta técnica agrupa observaciones en bloques basándose en características similares, permitiendo una mejor interpretación y análisis de los datos(CRAN 2024).
Librería en R Para realizar block clustering en R, se puede usar la librería blockcluster. Esta librería implementa un enfoque para el agrupamiento de datos en bloques, permitiendo la identificación de patrones en conjuntos de datos grandes y complejos.
Ejemplo Completo de Block Clustering
ejemplo completo que muestra cómo usar la técnica de block clustering en R.# Cargar librerías
library(ggplot2)
# Crear un conjunto de datos de ejemplo
set.seed(123)
data <- matrix(rnorm(1000), ncol = 10) # 100 observaciones y 10 variables
# Convertir a un objeto de datos
data_frame <- as.data.frame(data)
# Dividir el conjunto de datos en bloques (por ejemplo, 2 bloques)
block1 <- data_frame[1:50, ] # Primer bloque
block2 <- data_frame[51:100, ] # Segundo bloque
# Aplicar k-means a cada bloque
set.seed(123)
kmeans_block1 <- kmeans(block1, centers = 3)
kmeans_block2 <- kmeans(block2, centers = 3)
# Agregar la asignación de grupos al dataframe original
data_frame$cluster <- NA
data_frame$cluster[1:50] <- kmeans_block1$cluster
data_frame$cluster[51:100] <- kmeans_block2$cluster
# Visualizar los resultados (usando solo las dos primeras dimensiones para simplicidad)
ggplot(data_frame, aes(x = V1, y = V2, color = as.factor(cluster))) +
geom_point() +
labs(title = "K-Means Clustering on Blocks", color = "Cluster") +
theme_minimal()4. Ejemplos en R Presentados en el Libro de Alboukadel Kassambara Titulado Análisis Multivariante 1
Del texto: Kassambara, A. (2017). Practical Guide to Cluster Analysis in R: Unsupervised Machine Learning (Multivariate Analysis) (1st ed.). STHDA, disponible en: https://drive.google.com/file/d/1iOUDLsbrUgS-ypVLaZ3tU60AulQn2VPv/view?usp=sharing , desarrolle los ejemplos presentados en los capítulos: 4,5,6,7,8,9.
Capítulo 4: Agrupamiento de K-medias
1- K-means clustering: Usando los conjuntos de datos de “USArrests”.Emplearemos la funcion scale() para comenzar a escalar los datos.
data("USArrests") #Cargando la data
df <- scale(USArrests) #Escalando la data
#ver las primeras tres filas
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
Especificamos la cantidad de clusters que se generaran, usando la funcion “fviz_nbclust()” para estimar el numero optimo de clusteres.
library("factoextra")
fviz_nbclust(df, kmeans, method="wss") +
geom_vline(xintercept = 4, linetype = 2)
Grafica 4.1: Representa la varianza dentro de los grupos. Se pude ver la curvatura en k=4 indicando que los grupos adicionales mas alla del cuarto tiene poco valor.
Como el algoritmo de agrupamiento de k-means comienza con k centroides se usara la funcion set.seed() para establecer una semilla para el generador de números aleatorios.#Calculamos k-means con k = 4
set.seed(123)
km.res <- kmeans(df, 4, nstart = 25)#Seleccionaremos 25asignaciones inciales aleatoria diferentes
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"
Es posible usar la media de cada variable por coglomerados utilizando los datos originales:
## cluster Murder Assault UrbanPop Rape
## 1 1 13.93750 243.62500 53.75000 21.41250
## 2 2 3.60000 78.53846 52.07692 12.17692
## 3 3 5.65625 138.87500 73.87500 18.78125
## 4 4 10.81538 257.38462 76.00000 33.19231
Si se agrega las clasificaciones de puntos a los datos originales:
## 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
Accedemos a los resultados de la funcion k-means()
## Alabama Alaska Arizona Arkansas California
## 1 4 4 1 4
## Colorado Connecticut Delaware Florida Georgia
## 4 3 3 4 1
## Hawaii Idaho Illinois Indiana Iowa
## 3 2 4 3 2
## Kansas Kentucky Louisiana Maine Maryland
## 3 2 1 2 4
## Massachusetts Michigan Minnesota Mississippi Missouri
## 3 4 2 1 4
## Montana Nebraska Nevada New Hampshire New Jersey
## 2 2 4 2 3
## New Mexico New York North Carolina North Dakota Ohio
## 4 4 1 2 3
## Oklahoma Oregon Pennsylvania Rhode Island South Carolina
## 3 3 3 3 1
## South Dakota Tennessee Texas Utah Vermont
## 2 1 4 3 2
## Virginia Washington West Virginia Wisconsin Wyoming
## 3 3 2 2 3
## Alabama Alaska Arizona Arkansas
## 1 4 4 1
## [1] 8 13 16 13
## Murder Assault UrbanPop Rape
## 1 1.4118898 0.8743346 -0.8145211 0.01927104
## 2 -0.9615407 -1.1066010 -0.9301069 -0.96676331
## 3 -0.4894375 -0.3826001 0.5758298 -0.26165379
## 4 0.6950701 1.0394414 0.7226370 1.27693964
Visualizaremos los resultados en un diagrama cde dipersion usando la funcion “fviz_cluster()” para visualizar facilmente los grupos de k-meansy los datos originales como argumentos
fviz_cluster(km.res, data=df,
palette=c("#2E9FDF", "#00AFBB", "#E7B800","#FC4E07" ),
ellipse.type = "euclid", #Elipse de concentracion
star.plot = TRUE, # Agregar segmentos centoides a elementos
repel = TRUE,
ggtheme = theme_minimal())Capítulo 5: K-medoides
2- K-Medoids: Al igual que el ejercicio anterior usaremos la data “USArrests” usando la funcion scale()
data("USArrests") #Cargando la data
df <- scale(USArrests) #Escalando la data
#ver las primeras tres filas
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
Pra estimar el numero optimo de clusters, utilizaremos el metodo de silueta promedio de acuerdo con el numero de conglomerados atraves de la funcion “fviz_nbclust()”
Grafico 2: El numero optimo de clusters es de 2
calculando algorimo con K=2
## Medoids:
## ID Murder Assault UrbanPop Rape
## New Mexico 31 0.8292944 1.3708088 0.3081225 1.1603196
## Nebraska 27 -0.8008247 -0.8250772 -0.2445636 -0.5052109
## Clustering vector:
## Alabama Alaska Arizona Arkansas California
## 1 1 1 2 1
## Colorado Connecticut Delaware Florida Georgia
## 1 2 2 1 1
## Hawaii Idaho Illinois Indiana Iowa
## 2 2 1 2 2
## Kansas Kentucky Louisiana Maine Maryland
## 2 2 1 2 1
## Massachusetts Michigan Minnesota Mississippi Missouri
## 2 1 2 1 1
## Montana Nebraska Nevada New Hampshire New Jersey
## 2 2 1 2 2
## New Mexico New York North Carolina North Dakota Ohio
## 1 1 1 2 2
## Oklahoma Oregon Pennsylvania Rhode Island South Carolina
## 2 2 2 2 1
## South Dakota Tennessee Texas Utah Vermont
## 2 1 1 2 2
## Virginia Washington West Virginia Wisconsin Wyoming
## 2 2 2 2 2
## Objective function:
## build swap
## 1.441358 1.368969
##
## Available components:
## [1] "medoids" "id.med" "clustering" "objective" "isolation"
## [6] "clusinfo" "silinfo" "diss" "call" "data"
Si agregamos las clasificaciones de puntos a los datos originales
## 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
Accediendo a los resultados con la funcio “pam()”
## Murder Assault UrbanPop Rape
## New Mexico 0.8292944 1.3708088 0.3081225 1.1603196
## Nebraska -0.8008247 -0.8250772 -0.2445636 -0.5052109
## Alabama Alaska Arizona Arkansas California Colorado
## 1 1 1 2 1 1
Visualizaremos los resultados a traves de un diagrama de dispersion
fviz_cluster(pam.res,
palette= c("#00AFBB", "#FC4E07"),
ellipse.type = "t",
repel= TRUE,
ggtheme = theme_classic())Capítulo 6: CLARA - Agrupamiento de grandes aplicaciones
6.3 Computing CLARA in R 6.3.1 Data format and preparation
set.seed(1234)
# Generate 500 objects, divided into 2 clusters.
df <- rbind(cbind(rnorm(200,0,8), rnorm(200,0,8)),
cbind(rnorm(300,50,8), rnorm(300,50,8)))
# Specify column and row names
colnames(df) <- c("x", "y")## 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()6.3. COMPUTING CLARA IN R 61 6.3.4 Computing CLARA
# Compute CLARA
clara.res <- clara(df, 2, samples = 50, pamLike = TRUE)
# Print components of 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"
## 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
## x y
## S121 -1.531137 1.145057
## S455 48.357304 50.233499
## S1 S2 S3 S4 S5 S6 S7 S8 S9 S10
## 1 1 1 1 1 1 1 1 1 1
6.3.5 Visualizing CLARA clusters
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: Aglomeración aglomerativa
7.2. STEPS TO AGGLOMERATIVE HIERARCHICAL CLUSTERING
# Load the data
data("USArrests")
# Standardize the data
df <- scale(USArrests)
# Show the first 6 rows
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
# Compute the dissimilarity matrix
# df = the standardized data
res.dist <- dist(df, method = "euclidean")## 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 Linkage
7.2.4 Dendrogram
## Warning: The `<scale>` argument of `guides()` cannot be `FALSE`. Use "none" instead as
## of ggplot2 3.3.4.
## ℹ The deprecated feature was likely used in the factoextra package.
## Please report the issue at <https://github.com/kassambara/factoextra/issues>.
## This warning is displayed once every 8 hours.
## Call `lifecycle::last_lifecycle_warnings()` to see where this warning was
## generated.
# Compute cophentic distance
res.coph <- cophenetic(res.hc)
# Correlation between cophenetic distance and
# the original distance
cor(res.dist, res.coph)## [1] 0.6975266
## [1] 0.7180382
7.4 Cut the dendrogram into different groups
## Alabama Alaska Arizona Arkansas
## 1 2 2 3
## grp
## 1 2 3 4
## 7 12 19 12
## [1] "Alabama" "Georgia" "Louisiana" "Mississippi"
## [5] "North Carolina" "South Carolina" "Tennessee"
# Cut in 4 groups and color by groups
fviz_dend(res.hc, k = 4, # Cut in four groups
cex = 0.5, # label size
k_colors = c("#2E9FDF", "#00AFBB", "#E7B800", "#FC4E07"),
color_labels_by_k = TRUE, # color labels by groups
rect = TRUE # Add rectangle around groups
)fviz_cluster(list(data = df, cluster = grp),
palette = c("#2E9FDF", "#00AFBB", "#E7B800", "#FC4E07"),
ellipse.type = "convex", # Concentration ellipse
repel = TRUE, # Avoid label overplotting (slow)
show.clust.cent = FALSE, ggtheme = theme_minimal())7.5 Cluster R package
library("cluster")
# Agglomerative Nesting (Hierarchical Clustering)
res.agnes <- agnes(x = USArrests, # data matrix
stand = TRUE, # Standardize the data
metric = "euclidean", # metric for distance matrix
method = "ward" # Linkage method
)
# DIvisive ANAlysis Clustering
res.diana <- diana(x = USArrests, # data matrix
stand = TRUE, # standardize the data
metric = "euclidean" # metric for distance matrix
)Capítulo 8: Comparación de dendrogramas
# Preparación de datos base de R USArrests y iniciando con la estandarizanción de las variables mediante la función scale()
df <- scale(USArrests)
# Subconjunto que contiene 10 filas
# Subset containing 10 rows
set.seed(123)
ss <- sample(1:50, 10)
df <- df[ss,]Se comienza creando una lista de dos dendrogramas calculando la agrupación jerárquica (HC) utilizando dos métodos de vinculación diferentes (“average” y “ward.D2”). A continuación, se transforman los resultados en dendrogramas y se crea una lista para almacenar los dos dendrogramas.
# 8.2 Comparación de dendrogramas
library(dendextend)
# Compute distance matrix
res.dist <- dist(df, method = "euclidean")
# Compute 2 hierarchical clusterings
hc1 <- hclust(res.dist, method = "average")
hc2 <- hclust(res.dist, method = "ward.D2")
# Create two dendrograms
dend1 <- as.dendrogram (hc1)
dend2 <- as.dendrogram (hc2)
# Create a list to hold dendrograms
dend_list <- dendlist(dend1, dend2)Para comparar visualmente dos dendrogramas, se utiliza la función tanglegram() [ paquete dendextend], 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 entanglement(). El entrelazamiento es una medida entre 1 (entrelazamiento completo) y 0 (sin entrelazamiento). Un coeficiente de entrelazamiento más bajo corresponde a una buena alineación.
# Personalización del tanglegram usando muchas otras opciones como las siguientes:
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))
)La función cor.dendlist() se utiliza para calcular la matriz de correlación “Baker” o “Cophenetic” entre una lista de árboles. El valor puede oscilar entre -1 y 1. Los valores cercanos a 0 significan que los dos árboles no son estadísticamente similares.
## [,1] [,2]
## [1,] 1.0000000 0.9925544
## [2,] 0.9925544 1.0000000
## [,1] [,2]
## [1,] 1.0000000 0.9895528
## [2,] 0.9895528 1.0000000
La correlación entre dos árboles también se puede calcular de la siguiente manera:
## [1] 0.9925544
## [1] 0.9895528
texto<-"También es posible comparar varios dendrogramas simultáneamente. Se utiliza un operador de encadenamiento %>% para ejecutar varias funciones al mismo tiempo. Resulta útil para simplificar el código:"
cat(paste("<p style='text-align:justify;'>", texto, "</p>", sep = ""))## <p style='text-align:justify;'>También es posible comparar varios dendrogramas simultáneamente. Se utiliza un operador de encadenamiento %>% para ejecutar varias funciones al mismo tiempo. Resulta útil para simplificar el código:</p>
# Crear múltiples dendrogramas mediante encadenamiento
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 la 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
## Warning: package 'corrplot' was built under R version 4.4.1
## corrplot 0.95 loaded
Capítulo 9: Visualización de dendogramas
Este capítulo proporciona el código de R para visualizar, personalizar, guardar y hacer zoom en un dendrograma grande.
Se comienza calculando la agrupación jerárquica utilizando los conjuntos de datos de USArrests:# Cargar datos
data(USArrests)
# Calcular distancias y agrupamiento jerárquico
dd <- dist(scale(USArrests), method = "euclidean")
hc <- hclust(dd, method = "ward.D2")Las funciones y paquetes de R permiten visualizar el dendrograma, para lo cual se usan las sigientes funciones:
fviz_dend [ paquete R adicional de facto] para crear fácilmente un hermoso gráfico basado en ggplot2
dendextend para manipular dendrogramas
#Puede utilizar los argumentos main, sub, xlab, ylab para cambiar los títulos de los gráficos de la siguiente manera
fviz_dend(hc, cex = 0.5,
main = "Dendrogram - ward.D2",
xlab = "Objects", ylab = "Distance", sub = "")# Para dibujar un dendrograma horizontal, se escribe lo siguiente:
fviz_dend(hc, cex = 0.5, horiz = TRUE)# Tema de la trama, utilizando el argumento ggtheme
fviz_dend(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
ggtheme = theme_gray() # Change theme
)# Cambiar los colores del grupo usando jco
fviz_dend(hc, cex = 0.5, k = 4, # Cortar en cuatro grupos
# Cambiar tema
k_colores = "jco")# Para visualizar un dendrograma horizontal con un rectángulo alrededor de los grupos, se usa el siguiente código.
fviz_dend(hc, k = 4, cex = 0.4, horiz = TRUE, k_colors = "jco",
rect = TRUE, rect_border = "jco", rect_fill = TRUE)# Para un endedograma circular usar el código, sigiente:
fviz_dend(hc, cex = 0.5, k = 4,
k_colors = "jco", type = "circular")Para trazar un árbol de tipo filogenético, se utiliza type = “phylogenic” y repel = TRUE (para evitar que las etiquetas se superpongan). Esta funcionalidad requiere el paquete R igraph, por lo que hay que instalarlo antes de escribir el siguiente código R.
El diseño predeterminado para los árboles filogenéticos es “layout.auto”. Los valores permitidos son uno de los siguientes: 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.
#Probu con phylo.layout = “layout.gem”
require("igraph")
fviz_dend(hc, k = 4, # Cut in four groups
k_colors = "jco",
type = "phylogenic", repel = TRUE,
phylo_layout = "layout.gem")# 9.2 Caso de dendrograma con grandes conjuntos de datos
texto<-"Si calcula la agrupación jerárquica en un conjunto de datos grande, es posible que desee ampliar el dendrograma o trazar solo un subconjunto del mismo.
Como alternativa, también puedes trazar el dendrograma en una página grande en un PDF, que se puede ampliar sin pérdida de resolución."
cat(paste("<p style='text-align:justify;'>", texto, "</p>", sep = ""))## <p style='text-align:justify;'>Si calcula la agrupación jerárquica en un conjunto de datos grande, es posible que desee ampliar el dendrograma o trazar solo un subconjunto del mismo.
## Como alternativa, también puedes trazar el dendrograma en una página grande en un PDF, que se puede ampliar sin pérdida de resolución.</p>
Para ampliar los primeros grupos, es posible utilizar las opciones xlim e ylim para limitar el área del gráfico. Por ejemplo, observe el código siguiente:
Para trazar un subárbol, seguiremos el procedimiento a continuación:
Cree el dendrograma completo utilizando fviz_dend() y guarde el resultado en un objeto, llamado dend_plot por ejemplo.
Utilice la función base R cut.dendrogram() para cortar el dendrograma, a una altura dada (h), en múltiples subárboles. Esto devuelve una lista con los componentes $upper y $lower, el primero es una versión truncada del árbol original, también de la clase dendrogram, el segundo una lista con las ramas obtenidas al cortar el árbol, cada una de ellas un dendrograma.
Visualice subárboles utilizando fviz_dend().
El código R es el siguiente:
• Cortar el dendrograma y visualizar la versión truncada:
# Crea un gráfico de todo el dendrograma, # y extrae los
dend_plot <- fviz_dend(hc,k = 4, # Corta en cuatro grupos
cex = 0.5, # Tamaño de la etiqueta
k_colors = "jco" )
dend_data <- attr(dend_plot, "dendrogram") # Extraer datos del 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)## Warning in min(-diff(our_dend_heights)): ningún argumento finito para min;
## retornando Inf
• Trazar subárboles de dendrogramas:
# También puedes trazar árboles circulares de la siguiente manera:
fviz_dend(dend_cuts$lower[[2]], type = "circular")# 9.2.3 Guardar el dendrograma en una página PDF grande
texto<-"Si tiene un dendrograma grande, puede guardarlo en una página PDF grande, que se puede ampliar sin pérdida de resolución."
cat(paste("<p style='text-align:justify;'>", texto, "</p>", sep = ""))## <p style='text-align:justify;'>Si tiene un dendrograma grande, puede guardarlo en una página PDF grande, que se puede ampliar sin pérdida de resolución.</p>
pdf(“dendrogram.pdf”, width=30, height=15) # Abrir PDF p <- fviz_dend(hc, k = 4, cex = 1, k_colors = “jco” ) # Cerrar el PDF
print(p)
dev.off()
El paquete dendextend proporciona funciones para cambiar fácilmente la apariencia de un dendrograma y para comparar dendrogramas.
En esta sección, utilizaremos el operador de encadenamiento (%>%) para simplificar nuestro código. El operador de encadenamiento convierte x %>% f(y) en f(x, y) para que puedas usarlo para reescribir múltiples operaciones de manera que se puedan leer de izquierda a derecha y de arriba a abajo. Por ejemplo, los resultados de los dos códigos R que se muestran a continuación 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 utilizando el operador de encadenamiento:
library(dendextend)
dend <- USArrests[1:5,] %>% # Datos
scale %>% # Escalar datos
dist %>% # Calcular una matriz de distancia
hclust(method = "ward.D2") %>% # Agrupamiento jerárquico
as.dendrogram # Convertir el objeto en un endedograma
plot(dend)
El paquete dendextend tiene funciones para personalizar dendrogramas, la cual es la función set(), y es utilizada para cambiar los parámetros de un dendrograma. El formato es:
Explicación de códigos en español e inglés
|
Value for the argument what |
Description |
|
labels labels_colors and labels_cex
leaves_pch, leaves_cex and leaves_col
nodes_pch, nodes_cex and nodes_col
hang_leaves
branches_k_color
branches_col, branches_lwd , branches_lty
by_labels_branches_col, by_labels_branches_lwd and by_labels_branches_lty
clear_branches and clear_leaves |
set the labels Set the color and the size of labels, respectively.
Set the point type, size and color for leaves, respectively.
set the point type, size and color for nodes, respectively
hang the leaves
color the branches
Set the color, the line width and the line type of branches, respectively
Set the color, the line width and the line type of branches with specific labels, respectively
Clear branches and leaves, respectively |
|
Valor para el argumento que |
Descripción |
|
Etiquetas Etiquetas_colores y etiquetas_cex
Hojas_pch, hojas_cex y hojas_col
nodos_pch nodos_cex y nodos_col hojas_col Ramas_k_color Ramas_col Ramas_lwd ramas_Ity
Por_etiquetas_ramas_col Por_etiquetas_ramas_lwd y Por_etiquetas_ramas_Ity Ramas_claras y hojas_claras |
Establecer las etiquetas Establezca el color y el tamaño de las etiquetas respectivamente
Establezca el tipo de punto, el tamaño y el color de las hojas
Respectivamente, establezca el tipo de punto, el tamaño y el color de los nodos Respectivamente, cuelgue las hojas y coloree las ramas Establezca el color, el ancho de línea y el tipo de línea de las ramas, respectivamente
Establezca el color, el ancho de línea y el tipo de línea de las ramas con etiquetas específicas respectivamente
Limpiar ramas y hojas respectivamente |
Fuente: Análisis Multivariante 1
library(dendextend)
# 1. Crear un endendograma perzonalizado
mycols <- c("#2E9FDF", "#00AFBB", "#E7B800", "#FC4E07")
dend <- as.dendrogram(hc) %>%
set("branches_lwd", 1) %>% # Ancho de las lineas de las ramas
set("branches_k_color", mycols, k = 4) %>% # Colorear las ramas por grupos
set("labels_colors", mycols, k = 4) %>% # Colorear las etiquetas por grupos
set("labels_cex", 0.5) # Cambiar el tamaño de las etiquetas
# 2. Crear gráfico
fviz_dend(dend)Referencias