UNIVERSIDAD DE EL SALVADOR
FACULTAD DE CIENCIAS ECONÓMICAS
ESCUELA DE ECONOMÍA
MÉTODOS PARA EL ANÁLISIS ECONÓMICO
LABORATORIO 2
DOCENTE:
MSF. CARLOS ADEMIR PÉREZ ALAS.
INTEGRANTES:
ABARCA ESPINOZA, FABIO FELICIANO. AE17013.
IRAHETA VILLEGAS, JUAN PABLO. IV14001.
QUINTANILLA COTO, JEFFERSON ANGELO. QC18007.
GRUPO TEORICO:
3
CIUDAD UNIVERSITARIA, LUNES 22 DE NOVIEMBRE DE 2021.
El proposito del análisis de conglomerados (cluster en terminología inglesa) es el agrupar las observaciones de forma que los datos sean muy homogéneos dentro de los grupos (mínima varianza) y que estos grupos sean lo más heterogéneos posible entre ellos (máxima varianza). De este modo obtenemos una clasificación de los datos multivariante con la que podemos comprender mejor los mismos y la población de la que proceden. Podemos realizar análisis cluster de casos, un análisis cluster de variables o un análisis cluster por bloques si agrupamos variables y casos. El análisis cluster se puede utilizar para:
• La taxonomía, agrupar especies naturales. • Para el marketing, clasificar consumidores tipo. • Medicina, clasificar seres vivos con los mismos síntomas y características patológicas. • Técnicas de reconocimiento de patrones. • Formar grupos de pixels en imágenes digitalizadas enviadas por un satélite desde un planeta para identificar los terrenos
Simulación: Generamos tres muestras correspondientes a distribuciones normales bivariadas. La matriz de covarianzas vamos a suponer que es la matriz identidad. Los vectores de medias son μ1=c(1,1),μ2=c(3.5,3) y μ3=c(6,5.5). En resumen, tenemos un vector de datos Xi∼Nd(μi;I2×2). Vamos a generar 100 datos de cada grupo, para ello es necesario el paquete mvtnor.
library(mvtnorm)
# Generamos los datos
x1 <- rmvnorm(n = 100, mean = c(1, 1))
x2 <- rmvnorm(n = 100, mean = c(3.5, 4))
x3 <- rmvnorm(n = 100, mean = c(6, 5.5))
# Gráfica de los datos
limx <- c(-1, 8)
limy <- limx
plot(x1, xlim = limx, ylim = limy,col="green",xlab="Normales bivariadas",ylab=" ")
points(x2, pch = 2,col="red")
points(x3, pch = 3,col="yellow")
Se puede observar que hay tres grupos, pero estos no están claramente delimitados. Cabe resalta que nosotros no disponemos de esta información. Conocemos los valores que componen los vectores de datos, pero no conocemos el grupo al que podría pertenecer cada uno de ellos. Tampoco tenemos porqué tener prefijado el número de grupos. Aunque los datos son artificiales, ilustran bien el problema.
library(kableExtra)
text_tbl <- data.frame(
Analisis_Cluster = c("JERÁRQUICO
Los métodos jerárquicos tienen por objetivo agrupar todos los clúster para formar un clúster nuevo o separar alguno existente para crear otros dos clústeres distintos, de manera que se minimice alguna función distancia o se maximice alguna medida de similitud.",
"NO JERÁRQUICO
Los métodos no jerárquicos, también conocidos como partitivos o de optimización, su objetivo es realizar una partición de los individuos en K grupos, siendo este número de grupos especificado a priori, es decir, el investigador debe especificar antes de aplicar la técnica clúster el número de grupos que se forman."
),
Técnicas_Disponibles=c(
"AGLOMERATIVO
• Linkage Simple
• Linkage Completo
• Promedio entre grupos
• Método del centroide
• Método de la mediana
• Método de Ward
• Dendograma
DISOCIATIVO
• Linkage Simple
• Linkage Completo
• Promedio entre grupos
• Método del centroide
• Analisis de Asociacion
• Detector Automático de Interacción",
"Métodos de Reasignación:
• Centroides
• PAM
• CLARA
• K-medias
• Quick-Cluster
• Método de Forgy
• Nubes Dinámicas
Búsqueda de densidad:
• Aproximación Tipológica
• Análisis Modal
• Método Taxmap
• Metodo de Fortín
Aproximacion probabilistica:
• Metodo de Wolf
Metodos directos:
• Block-Clustering
Metodos Reductivos:
• Analisis Factorial tipo Q"
),
Ventajas = c(
"• Rapido
• Simplicidad
• Se hace con diferentes medidas de similitud",
" • Muestras grandes
• Accesibilidad"
),
Desventajas = c(
"• Se aplica a muestras pequeñas
• Elimina Observaciones
• No es necesario especificar el número de clusteres necesarios para el algoritmo.",
"• Necesita que el usuario defina el número de clústeres
• Solucion Aleatoria
• Ineficiente debido a muchas soluciones"
)
)
kbl(text_tbl) %>%
kable_paper(full_width = F) %>%
column_spec(
1,
bold = T,background = "white",
width = "20em",
border_left = T,
border_right = T
) %>%
column_spec(2,
bold = T,
width = "15em",
background = "white") %>%
column_spec(
3,
bold = T,
width = "15em",
border_left = T,
background = "white"
) %>%
column_spec(
4,
bold = T,
width = "15em",
border_right = T,
border_left = T,
background = "white"
)
| Analisis_Cluster | Técnicas_Disponibles | Ventajas | Desventajas |
|---|---|---|---|
|
JERÁRQUICO Los métodos jerárquicos tienen por objetivo agrupar todos los clúster para formar un clúster nuevo o separar alguno existente para crear otros dos clústeres distintos, de manera que se minimice alguna función distancia o se maximice alguna medida de similitud. |
AGLOMERATIVO • Linkage Simple • Linkage Completo • Promedio entre grupos • Método del centroide • Método de la mediana • Método de Ward • Dendograma DISOCIATIVO • Linkage Simple • Linkage Completo • Promedio entre grupos • Método del centroide • Analisis de Asociacion • Detector Automático de Interacción |
• Rapido • Simplicidad • Se hace con diferentes medidas de similitud |
• Se aplica a muestras pequeñas • Elimina Observaciones • No es necesario especificar el número de clusteres necesarios para el algoritmo. |
|
NO JERÁRQUICO Los métodos no jerárquicos, también conocidos como partitivos o de optimización, su objetivo es realizar una partición de los individuos en K grupos, siendo este número de grupos especificado a priori, es decir, el investigador debe especificar antes de aplicar la técnica clúster el número de grupos que se forman. |
Métodos de Reasignación: • Centroides • PAM • CLARA • K-medias • Quick-Cluster • Método de Forgy • Nubes Dinámicas Búsqueda de densidad: • Aproximación Tipológica • Análisis Modal • Método Taxmap • Metodo de Fortín Aproximacion probabilistica: • Metodo de Wolf Metodos directos: • Block-Clustering Metodos Reductivos: • Analisis Factorial tipo Q |
• Muestras grandes • Accesibilidad |
• Necesita que el usuario defina el número de clústeres • Solucion Aleatoria • Ineficiente debido a muchas soluciones |
Fuente: elaboración propia con base en (Kassambara 2017; Sanz 2014)
Agrupación k-medias es la técnica más utilizada sin supervisión, algoritmo de aprendizaje automático para particionar un conjunto de datos determinados en un conjunto de grupos k, donde k representa el número de grupos preespecificados por el analista.(Kassambara 2017)
La idea básica detrás de agrupación k-medias consiste en definir clusteres de modo que la variación total intra-cluster (conocida como variación total dentro del cluster) se minimiza.
El primer paso cuando se utiliza la agrupación en clústeres de k-medias es indicar el número de clústeres (k) que se generará en la solución final. El algoritmo comienza seleccionando aleatoriamente k objetos del conjunto de datos para que sirvan como el centro inicial para los clústeres. Los objetos seleccionados también se conocen como medios de clúster o centroides. Después del paso de asignación, el algoritmo calcula el nuevo valor medio de cada clúster. El término clúster “actualización de centroide” se utiliza para diseñar este paso. Ahora que los centros se han recalculado, cada observación se comprueba de nuevo para ver si podría estar más cerca de un cluster diferente. Todos los objetos son nuevamente reasignados usando el cluster medio actualizado. (Kassambara 2017)
Preparar la data. Los datos deben contener sólo variables continuas, como la k-medias. El algoritmo utiliza medios variables. Como no se quiere que el algoritmo k-means dependa de una unidad variable arbitraria, comenzamos escalando los datos usando la función R “scale ().”
Paquetes y funciones de R requeridos. Se usa la función estándar para el agrupamiento de k-medias “kmeans ()” , en la cual hay que identificar “X” , que es una matriz numérica, data frame o un vector numérico; así como el centro cuyo valor posible será el numero de clusteres (K) o un set inicial de centros de cluster (distintos); el numero máxima de iteraciones permitidas y el numero de particiones iniciales aleatorias cuando los centros es un numero (nstart debe ser mayor a 1). Pero, se recomienda calcular la agrupación en clústeres de K-Medias con un valor grande de Nstart como 25 o 50, con el fin de tener un resultado más estable.
Se hará uso de la librería “factorextra” para uso estético de los gráficos creados con “kmeans ().”
Estimación del número óptimo de clusteres. K-medias requiere que los usuarios especifiquen el numero de clusteres que se realizaran, pero, ¿Cómo elegir el numero correcto de clusteres esperados? Hay diferentes métodos para saber el número correcto, la solución simple es calcular la agrupación en clusteres de k-medias utilizando diferentes valores de k. La función R “fviz_nbclust ()” [en el paquete factorextra] proporciona una solución conveniente para estimar el número óptimo de clústeres.
Computación de agrupación k-medias. Como el algoritmo de agrupamiento k-medias comienza con k centroides seleccionados al azar, siempre es recomendado utilizar la función “Set.seed()” para establecer una para el generador de números aleatorios de R.
Se busca hacer los resultados reproducibles, usando un código que realiza la agrupación en clusteres de k-medias, indicando el número de k y de nstart, como ya antes mencionado, es altamente recomendado que el valor de nstart este entre 25 a 50 para mayor estabilidad del resultado.
Es posible calcular la media de cada variable por clústeres utilizando los datos originales, con el comando “aggregate”; si se desea agregar las clasificaciones de puntos de los datos originales, lo hacemos con un “cbind.”
Accediendo a los resultados de la función k-medias. La función k-medias devuelve una lista de componentes que incluyen: cluster, centros, la suma total de cuadrados, vector de la suma de cuadrados dentro del grupo, el total de la suma de cuadrados dentro del grupo, y el total de la suma de cuadrado entre los grupos. Usando un “$” podemos pedirle a r que nos muestre cualquiera de los componentes antes mencionados.
Visualización de clústeres de k-medias. La función “fviz_cluster ()” [paquete factorextra] se puede utilizar para visualizar fácilmente los clústeres de k-means. Toma los resultados de k-medias y los datos originales como argumentos. En la gráfica resultante, las observaciones se representan por puntos, utilizando componentes principales si el número de variables es mayor que 2. También es posible dibujar la elipse de concentración alrededor de cada grupo. (Kassambara 2017)
El algoritmo k-Medoides es un enfoque de agrupamiento relacionado con el agrupamiento de k-medias, para particionar un conjunto de datos en k grupos o clústeres. En la agrupación de k-Medoides, cada clúster está representado por uno de los puntos de datos del clúster. Estos puntos son Medoides de clúster con nombre.
El término medoide se refiere a un objeto dentro de un grupo para el cual la disimilitud promedio entre él y todos los demás miembros del clúster es mínimo. Corresponde a el punto más céntrico del clúster.
K-Medoides es una alternativa robusta de la agrupación de k-medias. Esto significa que, el algoritmo es menos sensible al ruido y a los valores atípicos, en comparación con las k-medias, porque utiliza Medoides como centros de clúster en lugar de medias. El método de agrupamiento k-Medoides más común es el algoritmo PAM. o Método PAM.
El uso de medios implica que la agrupación de k-medias es altamente sensible a los valores atípicos. Éste puede afectar gravemente la asignación de observaciones a grupos. Un algoritmo más robusto es proporcionado por el algoritmo PAM. (Kassambara 2017)
El algoritmo PAM se basa en la búsqueda de k objetos representativos o medoides entre las observaciones del conjunto de datos. Después de encontrar un conjunto de k medoides, los cúmulos se construyen asignando cada observación al medoide más cercano.
A continuación, cada medoide seleccionado y cada punto de datos no medoide se intercambian y se calcula la función objetivo. La función objetivo corresponde a la suma de las diferencias de todos los objetos a su medoide más cercano. El paso SWAP intenta mejorar la calidad de la agrupación en clústeres mediante el intercambio de objetos seleccionados (medoides) y objetos no seleccionados.
Si la función objetivo se puede reducir intercambiando un objeto seleccionado con un objeto no seleccionado, entonces se lleva a cabo el swap. Esto continúa hasta que la función objetiva ya no puede ser decreciente. El objetivo es encontrar k objetos representativos que minimicen la suma de las diferencias de las observaciones con respecto a su objeto representativo más cercano. (Kassambara 2017)
Preparar la data. Se carga la data a usar, usando la función “scale()” de R.
Paquetes y funciones de R requeridos. La función “pam()” [paquete de clúster] y “pamk()” [paquete fpc] se pueden utilizar para calcular PAM. La función “pamk()” no requiere que un usuario decida el número de clústeres K; donde al usar pam se pone la “X” la cual puede tener el valor de una matriz numérica o un data frame donde cada fila corresponde a una observación y cada columna a una variable,y “X” también puede representar el valor de una matriz de similitud; K es el numero de clusteres ; se decide la distancia metrica a usar y el valor lógico.
Se hará uso de la librería “factorextra” para uso estético de los gráficos creados con “pam(),” asi como también se carga la librería “cluster.”
La librería factorextra contiene la función R “fviz_nbclust()” que proporciona una solución conveniente para estimar el número óptimo de clústeres.
Computación de agrupación PAM. Se crea una variable Si se desea agregar las clasificaciones de puntos de los datos originales, lo hacemos con un “cbind.”
Acceder a los resultados de la función pam(). La función pam() devuelve un objeto de clase pam cuyos componentes incluyen : medoides y clustering, con un “$” en la variable creada le podemos indicar a R lo que queremos que nos muestre , ya sea los medoides o los clustering.
Visualizacion de clusteres de pam. Para visualizar los resultados de la partición, usaremos la función fviz_cluster() [factoextra paquete]. Dibuja un diagrama de dispersión de puntos de datos coloreados por números de clúster. Si los datos contiene más de 2 variables, el algoritmo de análisis de componentes principales (PCA) se utiliza para reducir la dimensionalidad de los datos. En este caso, los dos primeros principales las dimensiones se utilizan para trazar los datos. (Kassambara 2017)
En lugar de encontrar medoides para todo el conjunto de datos, CLARA considera una pequeña muestra de los datos con tamaño fijo (sampsize) y aplica el algoritmo PAM agenerar un conjunto óptimo de medoides para la muestra.
CLARA repite los procesos de muestreo y agrupación un número de veces prees especificado con el fin de minimizar el sesgo de muestreo. Los resultados finales de agrupamiento corresponden al conjunto de medoides con el costo mínimo. El algoritmo CLARA se resume en la siguiente sección. (Kassambara 2017)
Para que divida aleatoriamente los conjuntos de datos en múltiples subconjuntos con tamaño fijo. (bibliografía).
Calcule el algoritmo PAM en cada subconjunto y elija la k correspondiente objetos representativos (medoides). Asignar cada observación de todos los datos establecido en el medoide más cercano. (Kassambara 2017)
Calcular la media (o la suma) de las diferencias de las observaciones a su medoide más cercano. Esto se utiliza como una medida de la bondad de la agrupación. (Kassambara 2017)
Conservar el conjunto de set de datos para el que la media (o suma) es mínima. Se lleva a cabo un análisis adicional en la partición final. (Kassambara 2017)
Preparar la data. Se hace la carga de la data a usar .Generaremos usando un conjunto de datos aleatorios. Para que el resultado sea reproducible, comenzamos mediante la función “set.seed().”
Paquetes y funciones de R requeridos. La función “clara()”[paquete de clúster] se puede utilizar para calcular CLARA. Al poner esta funcion se debe poner: “X” que representa a una matriz numérica o un data frame en la que cada fila corresponde a una observación y cada columna a una variable; k que representa el numero de clusteres; la distancia metrica a usar; el valor lógico; el numero de muestras que se extraerá del conjunto de datos y la indicacio lógica que debería ser siempre cierta.
Se hará uso de la librería “factorextra” para uso estético de los gráficos creados con “clara(),” asi como también se carga la librería “cluster.”
Estimar el numero optimo de clusteres. Para estimar el número óptimo de clústeres, usaremos el método de silueta promedio. La librería factorextra contiene la función R “fviz_nbclust()” que proporciona una solución conveniente para estimar el número óptimo de clústeres. (Kassambara 2017)
Informática CLARA. Se crea una variable Si se desea agregar las clasificaciones de puntos de los datos originales, lo hacemos con un “cbind.” La función “clara()” devuelve un objeto clara cuyos componentes incluyen : medoides, clustering y muestra, con un “$” en la variable creada le podemos indicar a R lo que queremos que nos muestre , ya sea los medoides, los clustering, o la muestra.
Visualizacion de clusteres de clara. Para visualizar los resultados de la partición, usaremos la función fviz_cluster() [factoextra paquete]. Dibuja un diagrama de dispersión de puntos de datos coloreados por números de clúster. (Kassambara 2017)
La agrupación aglomerativa funciona de manera “ascendente.” Es decir, cada objeto es inicialmente considerado como un grupo de un solo elemento (hoja). En cada paso del algoritmo, los dos clústeres que son más similares se combinan en un nuevo clúster más grande.
En otras palabras, en los aglomerativos, inicialmente, cada individuo es un grupo en si mismo. Sucesivamente se van formando grupos de mayor tamaño fusionando grupos cercanos entre sí, los cuales al final construyen un solo grupo. La agrupación aglomerativa es buena para identificar agrupaciones pequeñas. (Kassambara 2017)
Existen muchos métodos aglomerativos de cluster, los más comunes son los siguientes:
Vinculación máxima o completa: La distancia entre dos clústeres se define como el valor máximo de todas las distancias por pares entre los elementos del clúster 1 y los elementos del grupo temático 2. Tiende a producir clústeres más compactos.
Vinculación mínima o única: Se define la distancia entre dos clústeres como valor mínimo de todas las distancias por pares entre los elementos en el grupo 1 y los elementos del grupo 2.
Vinculación promedio: La distancia entre los dos clústeres es definida como la distancia promedios entre los elementos del grupo 1 y los del 2.
Método de varianza mínima de Ward: Minimiza la varianza total dentro del grupo. En cada paso, el par de clústeres con una distancia mínima entre clústeres se fusionan.
Estructura y preparación de la data. La data debería ser una matriz numérica, donde las filas represente observaciones y las columnas representen variables, se carga la data y se estandariza con la función scale().
Medidas de similitud. Para decidir qué objetos/clústeres deben combinarse o dividirse, necesitamos métodos para medir la similitud entre objetos. En el software R, se puede usar la función dist() para calcular la distancia entre cada par de objetos de un conjunto de datos. Los resultados de este cálculo se conocen como matriz de distancia o disimilitud. (Kassambara 2017)
Con esta función “dist()” se puede calcular la distancia disimilar de una matriz, ejecutando la función en la variable creada con la data estandarizada. Para ver fácilmente la información de distancia entre objetos, reformateamos los resultados de la función dist() en una matriz usando la función as.matrix(). En esta matriz, el valor en la celda formada por la fila i, la columna j, representa la distancia entre el objeto i y el objeto j en el conjunto de datos original.(Kassambara 2017)
Si se tiene una matriz de distancia “res.dist” generada por dist() , la función base R hclust() se puede usar para crear el árbol jerárquico.
Este enfoque funciona “de arriba hacia abajo.” Comienza con la raíz, en la que todos los objetos se incluyen en un solo clúster. Este proceso es similar al de los aglomerativos, solo que, inicialmente todos los individuos forman un solo grupo y se van sucesivamente desgajando de el, formando dos grupos, tres grupos y así hasta el final del proceso, cada caso forma un único grupo. la agrupación desagregativa es buena para identificar agrupaciones largas. (Kassambara 2017)
Explicación de la librería y sintaxis para implementarla en R.
Un mapa de calor (o mapa de calor) es otra forma de visualizar la agrupación jerárquica. Es también se denomina imagen de color falso, donde los valores de los datos se transforman en escala de color. Los mapas de calor nos permiten visualizar simultáneamente grupos de muestras y características. La primera agrupación jerárquica se realiza tanto de las filas como de las columnas de la matriz de datos. Las columnas/filas de la matriz de datos se reordenan de acuerdo con el resultado de agrupación jerárquica, poniendo observaciones similares cerca unas de otras. Los bloques de ‘alto’ y los valores “bajos” son adyacentes en la matriz de datos. Finalmente, se aplica un esquema de color para la visualización y se muestra la matriz de datos.
Visualizar la matriz de datos de esta manera puede ayudar a encontrar las variables que parecen ser características de cada muestra. (Kassambara 2017)
data("USArrests") # Cargando el conjunto de datos
df <- scale(USArrests) # Escalando los datos
# Ver las primeras 3 filas de los 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
#kmeans(x, centers, iter.max = 10, nstart = 1)
library(factoextra)
fviz_nbclust(df, kmeans, method = "wss") +
geom_vline(xintercept = 4, linetype = 2)
# Calcule k-medias con k = 4
set.seed(123)
km.res <- kmeans(df, 4, nstart = 25)
# Imprime los resultados
print(km.res)
## K-means clustering with 4 clusters of sizes 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"
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
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
# 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
# Medios de agrupación
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
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()
)
data("USArrests") # Load the data set
df <- scale(USArrests) # Scale the data
head(df, n = 3) # View the firt 3 rows of the data
## 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
#pam(x, k, metric = "euclidean", stand = FALSE)
library(factoextra)
library(cluster)
library(cluster)
library(factoextra)
fviz_nbclust(df, pam, method = "silhouette")+
theme_classic()
pam.res <- pam(df, 2)
print(pam.res)
## Medoids:
## ID Murder Assault UrbanPop Rape
## New Mexico 31 0.8292944 1.3708088 0.3081225 1.1603196
## Nebraska 27 -0.8008247 -0.8250772 -0.2445636 -0.5052109
## Clustering vector:
## Alabama Alaska Arizona Arkansas California
## 1 1 1 2 1
## Colorado Connecticut Delaware Florida Georgia
## 1 2 2 1 1
## Hawaii Idaho Illinois Indiana Iowa
## 2 2 1 2 2
## Kansas Kentucky Louisiana Maine Maryland
## 2 2 1 2 1
## Massachusetts Michigan Minnesota Mississippi Missouri
## 2 1 2 1 1
## Montana Nebraska Nevada New Hampshire New Jersey
## 2 2 1 2 2
## New Mexico New York North Carolina North Dakota Ohio
## 1 1 1 2 2
## Oklahoma Oregon Pennsylvania Rhode Island South Carolina
## 2 2 2 2 1
## South Dakota Tennessee Texas Utah Vermont
## 2 1 1 2 2
## Virginia Washington West Virginia Wisconsin Wyoming
## 2 2 2 2 2
## Objective function:
## build swap
## 1.441358 1.368969
##
## Available components:
## [1] "medoids" "id.med" "clustering" "objective" "isolation"
## [6] "clusinfo" "silinfo" "diss" "call" "data"
dd <- cbind(USArrests, cluster = pam.res$cluster)
head(dd, n = 3)
## Murder Assault UrbanPop Rape cluster
## Alabama 13.2 236 58 21.2 1
## Alaska 10.0 263 48 44.5 1
## Arizona 8.1 294 80 31.0 1
# Medoides de 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
fviz_cluster(
pam.res,
palette = c("#00AFBB", "#FC4E07"),
# paleta de color
ellipse.type = "t",
# Elipse de concentración
repel = TRUE,
# Evitar el exceso de etiqueta (lento)
ggtheme = theme_classic()
)
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
library(cluster)
library(factoextra)
fviz_nbclust(df, clara, method = "silhouette")+
theme_classic()
# 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"
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
# Medoids
clara.res$medoids
## x y
## S121 -1.531137 1.145057
## S455 48.357304 50.233499
# agrupamiento
head(clara.res$clustering, 10)
## S1 S2 S3 S4 S5 S6 S7 S8 S9 S10
## 1 1 1 1 1 1 1 1 1 1
fviz_cluster(
clara.res,
palette = c("#00AFBB", "#FC4E07"),
ellipse.type = "t",
geom = "point",
pointsize = 1,
ggtheme = theme_classic()
)
# 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
# Calcule la matriz de disimilitud
# df = los datos estandarizados
res.dist <- dist(df, method = "euclidean")
as.matrix(res.dist)[1:6, 1:6]
## Alabama Alaska Arizona Arkansas California Colorado
## Alabama 0.000000 2.703754 2.293520 1.289810 3.263110 2.651067
## Alaska 2.703754 0.000000 2.700643 2.826039 3.012541 2.326519
## Arizona 2.293520 2.700643 0.000000 2.717758 1.310484 1.365031
## Arkansas 1.289810 2.826039 2.717758 0.000000 3.763641 2.831051
## California 3.263110 3.012541 1.310484 3.763641 0.000000 1.287619
## Colorado 2.651067 2.326519 1.365031 2.831051 1.287619 0.000000
res.hc <- hclust(d = res.dist, method = "ward.D2")
# cex: tamaño de etiqueta
library("factoextra")
fviz_dend(res.hc, cex = 0.5)
# Calcular 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
res.hc2 <- hclust(res.dist, method = "average")
cor(res.dist, cophenetic(res.hc2))
## [1] 0.7180382
# Cortar el árbol en 4 grupos
grp <- cutree(res.hc, k = 4)
head(grp, n = 4)
## Alabama Alaska Arizona Arkansas
## 1 2 2 3
# Número de miembros en cada grupo
table(grp)
## grp
## 1 2 3 4
## 7 12 19 12
# Obtener los nombres de las miembros del clúster 1
rownames(df)[grp == 1]
## [1] "Alabama" "Georgia" "Louisiana" "Mississippi"
## [5] "North Carolina" "South Carolina" "Tennessee"
# Cortar en 4 grupos y colorear por grupos
fviz_dend(
res.hc,
k = 4,
# Cortar en cuatro grupos
cex = 0.5,
# Tamaño de la etiqueta
k_colors = c("#2E9FDF", "#00AFBB", "#E7B800", "#FC4E07"),
color_labels_by_k = TRUE,
# etiquetas de color por grupos
rect = TRUE # Add rectangle around groups
)
fviz_cluster(
list(data = df, cluster = grp),
palette = c("#2E9FDF", "#00AFBB", "#E7B800", "#FC4E07"),
ellipse.type = "convex",
# Elipse de concentración
show.clust.cent = FALSE,
ggtheme = theme_minimal()
)
library("cluster")
# Anidamiento aglomerativo (agrupamiento jerárquico)
res.agnes <- agnes(
x = USArrests,
# matriz de datos
stand = TRUE,
# estandarizar los datos
metric = "euclidean",
# métrica para matriz de distancia
method = "ward" # metodos de vinculacion
)
# Agrupación de análisis visual
res.diana <- diana(x = USArrests, # data matrix
stand = TRUE, # standardize the data
metric = "euclidean" # metric for distance matrix
)
fviz_dend(res.agnes, cex = 0.6, k = 4)
df <- scale(USArrests)
# Subconjunto que contiene 10 filas
set.seed(123)
ss <- sample(1:50, 10)
df <- df[ss,]
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")
# Crea dos dendrogramas
dend1 <- as.dendrogram (hc1)
dend2 <- as.dendrogram (hc2)
# Crea una lista para contener dendrogramas
dend_list <- dendlist(dend1, dend2)
tanglegram(dend1, dend2)
tanglegram(
dend1,
dend2,
highlight_distinct_edges = FALSE,
# Desactivar líneas discontinuas
common_subtrees_color_lines = FALSE,
# Colores de línea de desactivación
common_subtrees_color_branches = TRUE,
# Colorea ramas comunes
main = paste("entanglement =", round(entanglement(dend_list), 2))
)
# Matriz de correlación cofenética
cor.dendlist(dend_list, method = "cophenetic")
## [,1] [,2]
## [1,] 1.0000000 0.9925544
## [2,] 0.9925544 1.0000000
# Matriz de correlación de Baker
cor.dendlist(dend_list, method = "baker")
## [,1] [,2]
## [1,] 1.0000000 0.9895528
## [2,] 0.9895528 1.0000000
# 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
# 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(cors, "pie", "lower")
# Cargar datos
data(USArrests)
# Calcular distancias y agrupamiento jerárquico
dd <- dist(scale(USArrests), method = "euclidean")
hc <- hclust(dd, method = "ward.D2")
library(factoextra)
fviz_dend(hc, cex = 0.5)
fviz_dend(hc, cex = 0.5,
main = "Dendrogram - ward.D2",
xlab = "Objects", ylab = "Distance", sub = "")
fviz_dend(hc, cex = 0.5, horiz = TRUE)
fviz_dend(
hc,
k = 4,
# Cortar en cuatro grupos
cex = 0.5,
# Tamaño de la etiqueta
k_colors = c("#2E9FDF", "#00AFBB", "#E7B800", "#FC4E07"),
color_labels_by_k = TRUE,
# etiquetas de color por grupos
rect = TRUE,
# Agregar un rectángulo alrededor de los grupos
rect_border = c("#2E9FDF", "#00AFBB", "#E7B800", "#FC4E07"),
rect_fill = TRUE
)
fviz_dend(
hc,
k = 4,
# Cortar en cuatro grupos
cex = 0.5,
# Tamaño de la etiqueta
k_colors = c("#2E9FDF", "#00AFBB", "#E7B800", "#FC4E07"),
color_labels_by_k = TRUE,
# etiquetas de color por grupos
ggtheme = theme_gray() # Cambiar de tema
)
fviz_dend(hc, cex = 0.5, k = 4, # Cut in four groups
k_colors = "jco")
fviz_dend(hc, k = 4, cex = 0.4, horiz = TRUE, k_colors = "jco",
rect = TRUE, rect_border = "jco", rect_fill = TRUE)
fviz_dend(hc, cex = 0.5, k = 4,
k_colors = "jco", type = "circular")
require("igraph")
fviz_dend(hc, k = 4, k_colors = "jco",
type = "phylogenic", repel = TRUE)
require("igraph")
fviz_dend(
hc,
k = 4,
# Cortar en cuatro grupos
k_colors = "jco",
type = "phylogenic",
repel = TRUE,
phylo_layout = "layout.gem"
)
fviz_dend(hc, xlim = c(1, 20), ylim = c(1, 8))
# Cree una gráfica de todo el dendrograma,
# y extraer los datos del dendrograma
dend_plot <- fviz_dend(hc,
k = 4,
# Cortar en cuatro grupos
cex = 0.5,
# Tamaño de la etiqueta
k_colors = "jco")
dend_data <- attr(dend_plot, "dendrogram") # Extraer datos de dendrograma
# Cortar el dendrograma a la altura h = 10
dend_cuts <- cut(dend_data, h = 10)
# Visualice la versión truncada que contiene
# dos ramas
fviz_dend(dend_cuts$upper)
# Trazar el dendrograma completo
print(dend_plot)
# Trazar el subárbol 1
fviz_dend(dend_cuts$lower[[1]], main = "Subtree 1")
# Trazar el subárbol 2
fviz_dend(dend_cuts$lower[[2]], main = "Subtree 2")
fviz_dend(dend_cuts$lower[[2]], type = "circular")
pdf("dendrogram.pdf", width = 30, height = 15) # Abrir un PDF
p <- fviz_dend(hc,
k = 4,
cex = 1,
k_colors = "jco") # Trazar
print(p)
dev.off() # Cerrar el PDF
## png
## 2
data <- scale(USArrests)
dist.res <- dist(data)
hc <- hclust(dist.res, method = "ward.D2")
dend <- as.dendrogram(hc)
plot(dend)
library(dendextend)
dend <- USArrests[1:5,] %>% # datos
scale %>% # Escala los 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)
library(dendextend)
# 1. Crea un dendrograma personalizado
mycols <- c("#2E9FDF", "#00AFBB", "#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. Crear trama
fviz_dend(dend)