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.

Análisis de Clúster (Conglomerados)

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

ANÁLISIS DE CONGLOMERADOS

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

Ejemplo

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.

2. Cuadro Comparativo

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)

3. Describa las técnicas disponibles para realizar el análisis de clúster, tanto jerárquicas como no jerárquica.

Analisis no jerárquico.

Técnicas disponibles:

K-medias.

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)

Explicación de la función k-medias.

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)

Pasos para la implementación de k-medias en R.
  1. 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 ().”

  2. 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 ().”

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

  2. 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.”

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

  2. 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)

K-Medoides.

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)

Explicación de la función 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 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)

Pasos para la implementación de PAM en R.
  1. Preparar la data. Se carga la data a usar, usando la función “scale()” de R.

  2. 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.”

  1. Estimación del numero optimo de clusteres. Para estimar el número óptimo de clústeres, usaremos el método de silueta promedio. La idea es calcular el algoritmo PAM utilizando diferentes valores de los clústeres k. Próximo la silueta promedio de los cúmulos se dibuja de acuerdo con el número de grupos. El La silueta media mide la calidad de un agrupamiento. Una silueta media alta width indica una buena agrupación. El número óptimo de clusters k es el que maximizar la silueta media en un rango de valores posibles para k (Kassambara 2017)

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.

  1. 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.”

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

  3. 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)

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

La función CLARA es útil para:
  • 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)

Pasos para la implementación de CLARA en R.
  1. 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().”

  2. 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.”

  1. 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)

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

  3. 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)

Analisis jerárquico.

Técnicas disponibles:

Aglomerativos.

La agrupación aglomerativa funciona de manera “ascendente.” Es decir, cada objeto es inicialmente considerado como un grupo de un solo elemento (hoja). En cada paso del algoritmo, los dos clústeres que son más similares se combinan en un nuevo clúster más grande.

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:

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

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

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

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

Pasos para usar Aglomerativos en R.
  1. 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().

  2. 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)

  1. Uso de la función linkage. Es una función para agrupar objetos en árbol de clúster jerárquico, basado en la información de distancia generada en el paso 1. Los objetos/clústeres que están muy cerca se vinculan entre sí mediante la función de “linkage.”(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.

  1. Dendrogam.
    Los dendrogramas corresponden a la representación gráfica del árbol jerárquico generado por la función hclust(). El dendrograma se puede producir en R usando la función base plot(res.hc), donde res.hc es la salida de hclust(). Aquí, usaremos la función fviz_dend()[ in factoextra R package] para producir un dendrograma visualmente mas atractivo. Para ello hay que instalar el paquete factorextra y usar la librería Primero instale factoextra.

Desagregativos.

Este enfoque funciona “de arriba hacia abajo.” Comienza con la raíz, en la que todos los objetos se incluyen en un solo clúster. Este proceso es similar al de los aglomerativos, solo que, inicialmente todos los individuos forman un solo grupo y se van sucesivamente desgajando de el, formando dos grupos, tres grupos y así hasta el final del proceso, cada caso forma un único grupo. la agrupación desagregativa es buena para identificar agrupaciones largas. (Kassambara 2017)

Explicación de la librería y sintaxis para implementarla en R.

Mapa de calor.

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)

4. Replica de ejemplos

CAPITULO 4

“K-MEANS CLUSTERING”

Calcular la agrupación en clústeres de k-medias en R

Datos

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

Paquetes y funciones de R requeridos

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

Estimando el número óptimo de clústeres

library(factoextra)
fviz_nbclust(df, kmeans, method = "wss") +
   geom_vline(xintercept = 4, linetype = 2)

Computación de clústeres de k-medias

# 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

Accediendo a los resultados de la función kmeans ()

# 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

Visualización de clústeres de k-medias

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

CAPITULO 5

“K-Medoids”

Calcular PAM en R

Datos

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

Paquetes y funciones de R requeridos

#pam(x, k, metric = "euclidean", stand = FALSE)
library(factoextra)
library(cluster)

Estimando el número óptimo de clústeres

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

Computación en clústeres PAM

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

Accediendo a los resultados de la función pam ()

# 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

Visualización de clústeres PAM

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

CAPITULO 6

“CLARA - Agrupación grande de Aplicaciones”

Computing CLARA in R

Formato y preparación de datos

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

Estimando el número óptimo de clústeres

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

Computing CLARA

# 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

Visualizando clústeres CLARA

fviz_cluster(
   clara.res,
   palette = c("#00AFBB", "#FC4E07"),
   ellipse.type = "t",
   geom = "point",
   pointsize = 1,
   ggtheme = theme_classic()
)

CAPITULO 7

“Agrupación aglomerativa”

Pasos para la agrupación jerárquica aglomerativa

Estructura y preparacion de datos

# 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

Medidas de similitud

# 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

Enlace

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

Dendrograma

# cex: tamaño de etiqueta
library("factoextra")
fviz_dend(res.hc, cex = 0.5)

Verificar el árbol del clúster

# 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 dendrograma en diferentes grupos

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

Paquete de Cluster en R

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)

CAPÍTULO 8

“COMPARACIÓN DE DENDROGRAMAS”

Preparación de datos

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

Comparación de dendrogramas

library(dendextend)
# Calcular matriz de distancias
res.dist <- dist(df, method = "euclidean")

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

Comparación visual de dos dendrogramas

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 entre una lista de dendrogramas

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

CAPÍTULO 9

“VISUALIZACIÓN DE DENDROGRAMAS”

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

Visualización de dendrogramas

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

Caso de dendrograma con grandes conjuntos de datos

Zoom en el dendrograma

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

Trazar un subárbol de dendrogramas

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

Guardar dendrograma en una página PDF grande

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

Manipular dendrogramas usando dendextend

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)

Bibliografia:

Kassambara, Alboukadel. 2017. Practical Guide to Cluster Analysis in r: Unsupervised Machine Learning. Vol. 1. Sthda.
Sanz, Jesus. 2014. Tecnicas de Clusterizacion. Vol. 1. bibing.