UNIVERSIDAD DE EL SALVADOR
FACULTAD DE CIENCIAS ECONOMICAS
ESCUELA DE ECONOMIA
TEMA: LABORATORIO II
MATERIA: METODOS PARA EL ANALISIS ECONOMICO
DOCENTE: CARLOS ADEMIR PÉREZ ALAS
INTEGRANTES:
| APELLIDOS | NOMBRES | CARNET | PARTICIPACIÓN |
|---|---|---|---|
| BOLAÑOS PEÑA | ABEL ANTONIO | BP18001 | \(100\%\) |
| MOLINA MARTINEZ | MONICA VALERIA | MM18046 | \(100\%\) |
| PANIAGUA MUÑOZ | KARLA REGINA | PM18112 | \(100\%\) |
| VILLATORO ROMERO | DIANA CAROLINA | VR18003 | \(100\%\) |
CICLO: II-2022
FECHA: 25 DE NOVIEMBRE DE 2022
CIUDAD UNIVERSITARIA, SAN SALVADOR, EL SALVADOR, CENTROAMERICA
El Análisis Cluster, también conocido como Análisis de Conglomerados, es una técnica estadística multivariante que busca agrupar elementos (o variables) y que trata de lograr la máxima homogeneidad en cada grupo y la mayor diferencia entre grupos.
El Análisis Cluster tiene una gran importancia en aplicación en muchas áreas de investigación. Pero, con los beneficios del Análisis Cluster existen algunas desventajas. El Análisis de Cluster es una técnica descriptiva, ateórica y no inferencial. Este Análisis no tiene bases estadísticas para deducir inferencias estadísticas sobre una población a partir de una muestra, es un método que se basa en criterios geométricos y es utilizado fundamentalmente como una técnica exploratoria, descriptiva pero no explicativa.
Finalmente, el análisis cluster depende en su totalidad, de las variables que se utilizan, de la adición o destrucción de variables relevantes que pueden tener un impacto significativo sobre la solución resultante.
De forma sencilla, el análisis de conglomerados es una forma en la cual se crean grupos para separar elementos de una población. El objetivo general de este proceso de exploración de datos consiste en extraer información dentro de un conjunto de datos y de esta forma transformarla en una estructura comprensible para un futuro uso, dicho de otro modo, esta agrupación busca identificar patrones o grupos de objetos similares dentro de un cierto conjunto de datos que resulten de interés para el investigador.
El “análisis clúster” es una técnica estadística multivariante, la cual tiene por propósito agrupar elementos (variables) y tratar de lograr la mayor homogeneidad posible en cada grupo y mayor diferencia entre los grupos. Este método es basado en criterios geométricos y se utiliza como técnica exploratoria descriptiva.
Las soluciones propuestas bajo este método dependen de las variables usadas, la destrucción o adición de variables tiene un relevante impacto en dichas soluciones. Los algoritmos de construcción de conglomerados se agrupan en dos categorías que se verán a continuación. Existen dos grandes tipos de análisis de clusters: Jerárquicos y No Jerárquicos. (De la Fuente Fernández 2011)
Se basan en el cálculo de una matriz de distancias y se aplican con n<200, ya que los cálculos y resultados se complican al aumentar el tamaño de la muestra. Estos métodos se caracterizan por no permitir una reasignación en los grupos, es decir, que dos clusters o individuos unidos durante el proceso, no pueden separarse en etapas decisivas.
Se pueden aplicar a variables o a observaciones:
Si se agrupan variables se necesitan de tres o más variables numéricas. Si se agrupan observaciones se necesita al menos una variable numérica. Dada la matriz, los algoritmos son de dos tipos:
Aglomerativos
Disociativo
Estos métodos permiten construir un árbol de clasificación o dendograma.
Un dendograma es una representación gráfica con forma de árbol que sirve para resumir el proceso de agrupación del análisis de clusters.Los objetos similares están conectados por enlaces y su posición, en el diagrama, está determinada por el nivel de similitud o disimilitud de los objetos. (De la Fuente Fernández 2011)
También conocidos como métodos de “optimización.” Estos métodos si permiten una reasignación en los grupos, aunque se vuelve necesario fijar de antemano el número de clusters deseado.
Se utilizan cuando:
Los métodos de reasignación permiten reasignar objetos a distintos conglomerados en cada fase.
Los métodos de búsqueda de densidad se agrupan mediante la búsqueda de altas densidades (modas).
Los métodos directos permiten clasificar de forma simultánea individuos y variables. Estos métodos son:
Aproximación probabilística: Los métodos de aproximación probabilística, parten del postulado que las variables prosiguen una ley de probabilidad, por la cual, los parámetros varían de un grupo a otro. Trata de encontrar individuos pertenecientes a una misma distribución, introduciendo el cluster en la inferencia estadística. El por qué de los clusters es explicado por la existencia de poblaciones distintas y cómo descubrirlas. El método que destaca es:
Método de Wolf.
Análisis Factorial tipo Q. Es importante establecer algunas diferencias básicas entre los métodos:
Métodos Jerárquicos:
Comienza con las observaciones y no precisa determinar a priori el número de conglomerados.
La asignación de objetos es definitiva.
Operan con una matriz de similaridades.
Métodos No Jerárquicos:
Comienza con una partición inicial de conglomerados. A priori se determina el número y composición de los conglomerados.
El procedimiento es iterativo y permite la reasignación de objetos.
Operan con la matriz de datos originales.
En Resumen, los usos que se le pueden dar al análisis cluster se puede representar en los siguientes cuatro puntos:
|
Análisis
de clúster |
Técnicas
Disponibles |
Ventajas |
Desventajas |
|
Jerárquico Análisis
enfocado en la agrupación de objetos en base a su similitud. El clustering
jerárquico no requiere especificar previamente el número de clústeres que se producirán. |
Aglomerativos |
· No se necesita
conocer el número de clústeres K. · Permite
representar las sucesivas agrupaciones en forma de árbol (dendograma). · Proporcionan una
fotografía de cómo están organizados los datos. El investigador puede ver cuántos
conglomerados “existen” en los datos. · Pueden
calcularse los centros de esos conglomerados: centroides (medias). |
· No es factible
su uso para un conjunto de datos grandes. · Su tiempo de
cálculo es largo. · Si la estructura
de la muestra es desconocida resulta difícil escoger el algoritmo. · No hay manera de
deshacer los pasos anteriores producidos para corrección de decisiones. |
|
· Simple Linkage
(vecino más próximo)" · Complete Linkage
(vecino más lejano · Promedio
entre Grupos · Método del Centroide · Método de la
Mediana · Método de Ward |
|||
|
Disociativos |
|||
|
· Linkage Simple · Linkage Complejo · Promedio entre
Grupos · Método del
Centroide · Método de la
Mediana · Método de Ward · Análisis de
Asociación |
|||
|
No
Jerárquico Análisis
basado en asignar casos o grupos diferenciados y
los configura de manera que unos dependan de otros. A
su vez, produce clústeres disjuntos (cada caso es un grupo), o bien clústeres
solapados (un caso puede pertenecer a más de un grupo) |
Reasignación |
· Mayor rapidez. · Permite el
procesamiento de gran número de datos. · Es fácil de
entender y adaptable. · Es eficiente y
tiene buen desempeño. |
· Complejidad en
formar las posibles particiones para escoger la óptima. · Mayor
complejidad en los análisis. · Una mala decisión
inicial sobre el número y composición de los grupos ocasiona una
clasificación incorrecta. · No trata datos
nominales. |
|
· K – Medias · K-medoides o PAM · CLARA · Nubes Dinámicas |
|||
|
Búsqueda de Densidad |
|||
|
· Análisis Modal · Métodos Taxmap · Método de Fortin · Método de Wolf |
|||
|
Métodos Directos |
|||
|
·
Block Clustering |
|||
|
Métodos Reductivos |
|||
|
·
Análisis factorial tipo Q. |
Fuente:
Elaboración propia con base en Análisis conglomerados. De la Fuente Fernández,
S. (2011).
(De la Fuente Fernández 2011)
El agrupamiento aglomerativo funciona de manera “de abajo hacia arriba”. Es decir, cada objeto se considera inicialmente como un grupo de un solo elemento (hoja). En cada paso del algoritmo, los dos grupos que son más similares se combinan en un nuevo grupo más grande (nodos). Este procedimiento se repite hasta que todos los puntos son miembros de un solo grupo grande (raíz) (ver la figura a continuación).
Lo contrario del agrupamiento aglomerativo es el agrupamiento divisivo, que también se conoce como DIANA (Divise Analysis) y funciona de manera “de arriba hacia abajo”. Comienza con la raíz, en la que todos los objetos están incluidos en un solo clúster. En cada paso de la iteración,el grupo más heterogéneo se divide en dos. El proceso se repite hasta que todos los objetos están en su propio grupo (ver la figura a continuación).
Tenga en cuenta que el agrupamiento aglomerativo es bueno para identificar pequeños grupos. El agrupamiento divisivo es bueno para identificar grandes grupos. En este artículo, nos centraremos principalmente en el agrupamiento jerárquico aglomerativo.
Pasos para el agrupamiento jerárquico aglomerativo
Seguiremos los pasos a continuación para realizar un agrupamiento jerárquico aglomerativo usando el software R:
Estructura y preparación de datos
Los datos deben ser una matriz numérica con:
Tenga en cuenta que, por lo general, se recomienda estandarizar las variables en el conjunto de datos antes de realizar análisis posteriores. La estandarización hace que las variables sean comparables, cuando se miden en diferentes escalas. Por ejemplo, una variable puede medir la altura en metros y otra variable puede medir el peso en kg. La función R scale() se puede usar para la estandarización. Consulte la documentación de ?scale.
library(factoextra)
# Cargar los datos
data("USArrests")
# Estandarizar los datos
df <- scale(USArrests)
# Mostrar la cabeza de 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
Existen muchos métodos para calcular la información de (des)similitud, incluidas las distancias Euclidiana y Manhattan (Capítulo 3). En el software R, puede usar la función dist() para calcular la distancia entre cada par de objetos en un conjunto de datos. Los resultados de este cálculo se conocen como matriz de distancia o disimilitud.
De forma predeterminada, la función dist() calcula la distancia euclidiana entre objetos; sin embargo, es posible indicar otras métricas utilizando el método de argumento. Ver ?dist
Por ejemplo, considere el conjunto de datos base R USArrests, puede calcular la matriz de distancia de la siguiente manera:
# Compute the dissimilarity matrix
# df = the standardized data
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
Tenga en cuenta que la función dist() calcula la distancia entre las filas de una matriz de datos utilizando el método de medida de distancia especificado.
Para ver fácilmente la información de distancia entre objetos, reformateamos los resultados de la función dist() en una matriz usando la función as.matrix() . En esta matriz, el valor en la celda formada por la fila i, la columna j, representa la distancia entre el objeto i y el objeto j en el conjunto de datos original. Por ejemplo, el elemento 1,1 representa la distancia entre el objeto 1 y él mismo (que es cero). El elemento 1,2 representa la distancia entre el objeto 1 y el objeto 2, y así sucesivamente.
La función de vinculación toma la información de distancia, devuelta por la función dist(), y agrupa pares de objetos en grupos en función de su similitud. A continuación, estos grupos recién formados se vinculan entre sí para crear grupos más grandes. Este proceso se repite hasta que todos los objetos del conjunto de datos original se vinculan en un árbol jerárquico.
Por ejemplo, dada una matriz de distancia “res.dist” generada por la función dist(), la función base de R hclust() puede usarse para crear el árbol jerárquico.
res.hc <- hclust(d = res.dist, method = "ward.D2")d: una estructura de disimilitud producida por la función dist() .
método: el método de aglomeración (vinculación) que se utilizará para calcular la distancia entre clústeres. Los valores permitidos son uno de “ward.D”, “ward.D2”, “single”, “complete”, “average”, “mcquitty”, “median” o “centroid”.
Hay muchos métodos de aglomeración de grupos (es decir, métodos de vinculación). Los métodos de vinculación más comunes se describen a continuación.
Vinculación máxima o completa: La distancia entre dos conglomerados se define como el valor máximo de todas las distancias por pares entre los elementos del conglomerado 1 y los elementos del conglomerado 2. Tiende a producir conglomerados más compactos.
Enlace mínimo o único: la distancia entre dos conglomerados se define como el valor mínimo de todas las distancias por pares entre los elementos del conglomerado 1 y los elementos del conglomerado 2. Tiende a producir conglomerados largos y “sueltos”.
Enlace medio o promedio: La distancia entre dos conglomerados se define como la distancia promedio entre los elementos del conglomerado 1 y los elementos del conglomerado.
Enlace centroide: La distancia entre dos conglomerados se define como la distancia entre el centroide del conglomerado 1 (un vector medio de variables de longitud p) y el centroide del conglomerado 2.
Método de la varianza mínima de Ward: Minimiza la varianza total dentro del conglomerado .
En cada paso, se fusionan el par de clústeres con una distancia mínima entre clústeres .
Nótese que, en cada etapa del proceso de agrupamiento, los dos agrupamientos que tienen la menor distancia de vinculación están vinculados entre sí.
Por lo general, se prefieren la ligadura completa y el método de Ward.
El clúster del paquete R facilita la realización de análisis de clústeres en R. Proporciona la función agnes() y diana() para calcular el agrupamiento aglomerativo y divisivo, respectivamente. Estas funciones realizan todos los pasos necesarios por usted. No necesita ejecutar las funciones scale(), dist() y hclust() por separado.
Las funciones se pueden ejecutar de la siguiente manera:
library("cluster")
# Agglomerative Nesting (Hierarchical Clustering)
res.agnes <- agnes(USArrests, # data matrix
stand = TRUE, # Standardize the data
metric = "euclidean", # metric for distance matrix
method = "ward" # Linkage method
)
# DIvisive ANAlysis Clustering
res.diana <- diana(USArrests, # data matrix
stand = TRUE, # standardize the data
metric = "euclidean" # metric for distance matrix
)Anidamiento aglomerativo (agrupación jerárquica)
res.agnes <- agnes(x = EE.UU. arrestos, # matriz de datos stand = TRUE, # Estandarizar la métrica de datos =“euclidean”, # métrica para el método de matriz de distancia = “ward”
Analisis Divisivo Clustering res.diana <- diana(x = USAarrestos, # matriz de datos stand = TRUE, # estandarizar la métrica de datos = “euclidean” # métrica para la matriz de distancia )
Después de ejecutar agnes() y diana(), puede usar la función fviz_dend()[de factoextra] para visualizar el resultado:
fviz_dend(res.agnes, cex = 0.6, k = 4)El primer paso cuando se utiliza el agrupamiento de k-medias es indicar el número de conglomerados (k) que se generarán en la solución final.
El algoritmo comienza seleccionando aleatoriamente k objetos del conjunto de datos para que sirvan como centros iniciales para los grupos. Los objetos seleccionados también se conocen como medias de conglomerados o centroides.
A continuación, cada uno de los objetos restantes se asigna a su centroide más cercano, donde el más cercano se define mediante la distancia euclidiana (Capítulo 3) entre el objeto y la media del grupo. Este paso se llama “paso de asignación de clúster”. Tenga en cuenta que, para usar la distancia de correlación , los datos se ingresan como puntajes z.
Después del paso de asignación, el algoritmo calcula el nuevo valor medio de cada grupo.
El término “actualización del centroide” del grupo se utiliza para diseñar este paso. Ahora que se han vuelto a calcular los centros , cada observación se comprueba de nuevo para ver si podría estar más cerca de un grupo diferente. Todos los objetos se reasignan nuevamente utilizando el clúster actualizado.
Los pasos de asignación de conglomerados y actualización del centroide se repiten iterativamente hasta que las asignaciones de conglomerados dejan de cambiar (es decir, hasta que se logra la convergencia ). Eso es ellos clusters formados en la iteración actual son los mismos que los obtenidos en la iteración anterior.
El algoritmo de K-medias se puede resumir de la siguiente manera:
Usaremos los conjuntos de datos de demostración “USArrests”. Los datos deben prepararse como se describe en el capítulo 2. Los datos deben contener solo variables continuas, ya que el algoritmo de k-medias utiliza medias variables. Como no queremos que el algoritmo k-means dependa de una unidad variable arbitraria, comenzamos escalando los datos usando la función R scale() de la siguiente manera:
data("USArrests") # Loading the data set
df <- scale(USArrests) # Scaling the data
# View the firt 3 rows of the data
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
La función R estándar para el agrupamiento de k-means es kmeans() [ paquete de estadísticas], cuyo formato simplificado es el siguiente:
kmeans(USA, centers, iter.max = 10, nstart = 1)
x: matriz numérica, marco de datos numérico o un vector numérico
centros: los valores posibles son el número de conglomerados (k) o un conjunto de centros de conglomerados iniciales (distintos) . Si es un número, se elige un conjunto aleatorio de filas (distintas) en x como centros iniciales.
iter.max: El número máximo de iteraciones permitidas. El valor predeterminado es 10.
nstart: el número de particiones iniciales aleatorias cuando los centros son un número. A menudo se recomienda probar nstart > 1.
Para crear un hermoso gráfico de los clústeres generados con la función kmeans() , usaremos el paquete factoextra .
Cálculo de agrupamiento de k-medias
Como el algoritmo de agrupamiento k-means comienza con k centroides seleccionados aleatoriamente, siempre se recomienda usar la función set.seed() para establecer una semilla para R aleatoria.
# Calcula k-medias con k = 4
set.seed(123)
km.res <- kmeans(df, 4, nstart = 25)Como el resultado final del agrupamiento de k-medias es sensible al inicio aleatorio asignaciones, especificamos nstart = 25. Esto significa que R probará 25 diferentes asignaciones aleatorias tareas de inicio y luego seleccione los mejores resultados correspondientes a la que tiene la más baja dentro de la variación del conglomerado. El valor predeterminado de nstart en R es uno Se recomienda enfáticamente calcular el agrupamiento de k-means con un gran valor de nstart como 25 o 50, para tener un resultado más estable.
# 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"
La salida impresa muestra: Los medios de conglomerados o centros: una matriz, cuyas filas son número de conglomerado (1 a 4) y las columnas son variables.
El vector de agrupamiento: Un vector de enteros (de 1:k) que indica el agrupamiento a que se asigna cada punto.
El algoritmo k-medoids es un enfoque de agrupamiento relacionado con el agrupamiento de k-medias (capítulo 4) para dividir un conjunto de datos en k grupos o conglomerados. Enel agrupamiento de kmedoides, cada grupo está representado por uno de los puntos de datos en el grupo. Estos puntos se denominan medoides de racimo.
El término medoid se refiere a un objeto dentro de un grupo para el cual la diferencia promedio entre él y todos los demás miembros del grupo es mínima. Corresponde al punto más central del clúster. Estos objetos (uno por grupo) se pueden considerar como un ejemplo representativo de los miembros de ese grupo que pueden ser útiles en algunas situaciones. Recuerde que, en el agrupamiento de k-medias, el centro de un conglomerado dado se calcula como el valor medio de todos los puntos de datos en el conglomerado.
K-medoid es una alternativa robusta al agrupamiento k-means. Esto significa que el algoritmo es menos sensible al ruido y los valores atípicos, en comparación con k-means, porque usa medoids como centros de clúster en lugar de medios (usados en k-means).
El algoritmo k-medoids requiere que el usuario especifique k, el número de grupos que se generarán (como en k-means clustering). Un enfoque útil para determinar el número óptimo de clústeres es el método de la silueta , que se describe en las siguientes secciones.
El método de agrupamiento de k-medoides más común es el algoritmo PAM (Partitioning Around Medoids, Kaufman & Rousseeuw, 1990).
El uso de medias implica que la agrupación de k-medias es muy sensible a los valores atípicos. Esto puede afectar gravemente la asignación de observaciones a los conglomerados. El algoritmo PAM proporciona un algoritmo más robusto .
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, se construyen grupos asignando cada observación al medoide más cercano.
A continuación, se intercambian cada medoid m seleccionado y cada punto de datos no medoid y se calcula la función objetivo. La función objetivo corresponde a la suma de las diferencias de todos los objetos a su medoid más cercano.
El paso SWAP intenta mejorar la calidad del agrupamiento intercambiando objetos seleccionados (medoides) y objetos no seleccionados. Si la función objetivo se puede reducir intercambiando un objeto seleccionado con un objeto no seleccionado, entonces se lleva a cabo el intercambio. Esto continúa hasta que la función objetivo ya no puede disminuir. El objetivo es encontrar k objetos representativos que minimicen la suma de las diferencias de las observaciones con su objeto representativo más cercano.
Seleccione k objetos para que se conviertan en medoids, o en caso de que se hayan proporcionado estos objetos utilícelos como medoids.
Calcular la matriz de disimilitud si no se proporcionó.
Asigne cada objeto a su medoide más cercano;
Para cada búsqueda de conglomerados, si alguno de los objetos del conglomerado disminuye el coeficiente de disimilitud promedio; si es así, seleccione la entidad que más disminuya este coeficiente como el medoide para este grupo;
Si al menos un medoid ha cambiado, vaya a (3), de lo contrario finalice el algoritmo.
Cálculo de PAM en R
Datos
Usaremos los conjuntos de datos de demostración “USArrests”, que comenzamos escalando (Capítulo 2) usando la función R scale() de la siguiente manera:
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
La función pam() [ paquete de clúster] y pamk() [paquete fpc ] se pueden usar para calcular PAM.
La función pamk() no requiere que el usuario decida el número de grupos K.
En los siguientes ejemplos, describiremos solo la función pam(), cuyo formato simplificado es:
pam(x, k, metric = “euclidean”, stand = FALSE)
Matriz de disimilitud: en este caso, x suele ser la salida de daisy() o dist() •
soporte: valor lógico; si es cierto, las variables (columnas) en x se estandarizan antes de calcular las diferencias. Ignorado cuando x es una matriz de disimilitud.
CLARA - Agrupamiento grande Aplicaciones
CLARA (Clustering Large Applications, Kaufman and Rousseeuw (1990)) es una extensión de los métodos k-medoids (Capítulo 5) para manejar datos que contienen una gran cantidad de objetos (más de varios miles de observaciones) con el fin de reducir el tiempo de cálculo y la memoria RAM. problema de almacenamiento Esto se logra utilizando el método de muestreo.
En lugar de encontrar medoides para todo el conjunto de datos, CLARA considera una pequeña muestra de los datos con un tamaño fijo (tamaño de muestra) y aplica el algoritmo PAM (Capítulo 5) para generar un conjunto óptimo de medoides para la muestra. La calidad de los medoides resultantes se mide por la diferencia promedio entre cada objeto en el conjunto de datos completo y el medoide de su grupo, definido como la función de costo.
CLARA repite los procesos de muestreo y agrupación un número predeterminado de veces para minimizar el sesgo de muestreo. Los resultados finales del agrupamiento corresponden al conjunto de medoides con el costo mínimo. El algoritmo CLARA se resume en la siguiente sección.
Cálculo de CLARA en R
Formato y preparación de datos
Aquí, generaremos un conjunto de datos aleatorios. Para que el resultado sea reproducible, comenzamos usando la función set.seed().
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")
rownames(df) <- paste0("S", 1:nrow(df))
# Previewing the data
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
Paquetes y funciones de R requeridos
La función clara() [paquete de clúster ] se puede usar para calcular CLARA. El formato simplificado es el siguiente:
clara(x, k, metric = “euclidean”, stand = FALSE, samples = 5, pamLike = FALSE)
x: una matriz de datos numéricos o marco de datos, cada fila corresponde a una observación y cada columna corresponde a una variable. Se permiten valores faltantes (NA).
k: el número de conglomerados.
metric: las métricas de distancia a utilizar. Las opciones disponibles son “euclides” y “manhattan”. Las distancias euclidianas son la raíz de la suma de los cuadrados de las diferencias, y las distancias de Manhattan son la suma de las diferencias absolutas. Lea más sobre medidas de distancia (Capítulo 3). Tenga en cuenta que la distancia de Manhattan es menos sensible a los valores atípicos.
(stand) soporte: valor lógico; si es cierto, las variables (columnas) en x se estandarizan antes de calcular las diferencias. Tenga en cuenta que se recomienda estandarizar las variables antes de agruparlas.
(samples)muestras: número de muestras que se extraerán del conjunto de datos. El valor predeterminado es 5 pero se recomienda un valor mucho mayor.
pamLike: indicación lógica si se debe usar el mismo algoritmo en la función pam() . Esto debería ser siempre cierto.
library(ggplot2)
library(factoextra)
data("USArrests")
df <- scale(USArrests)
fviz_nbclust(df, kmeans, method = "wss") +
geom_vline(xintercept = 4, linetype = 2)set.seed(123)
km.res <- kmeans(df, 4, nstart = 25)
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
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
km.res$size## [1] 8 13 16 13
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",
star.plot = TRUE,
repel = TRUE,
ggtheme = theme_minimal()
)library(cluster)
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
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
head(pam.res$clustering)## Alabama Alaska Arizona Arkansas California Colorado
## 1 1 1 2 1 1
fviz_nbclust(df, clara, method = "silhouette") +
theme_classic()clara.res <- clara(df, 2, samples = 50, pamLike = TRUE)
print(clara.res)## Call: clara(x = df, k = 2, samples = 50, pamLike = TRUE)
## Medoids:
## Murder Assault UrbanPop Rape
## New Mexico 0.8292944 1.3708088 0.3081225 1.1603196
## Nebraska -0.8008247 -0.8250772 -0.2445636 -0.5052109
## Objective function: 1.368969
## Clustering vector: Named int [1:50] 1 1 1 2 1 1 2 2 1 1 2 2 1 2 2 2 2 1 ...
## - attr(*, "names")= chr [1:50] "Alabama" "Alaska" "Arizona" "Arkansas" "California" "Colorado" "Connecticut" ...
## Cluster sizes: 20 30
## Best sample:
## [1] Alabama Arizona California Colorado Connecticut
## [6] Delaware Georgia Idaho Illinois Iowa
## [11] Kansas Kentucky Louisiana Maine Maryland
## [16] Massachusetts Michigan Minnesota Mississippi Missouri
## [21] Montana Nebraska Nevada New Hampshire New Mexico
## [26] New York North Carolina North Dakota Ohio Oklahoma
## [31] Oregon Pennsylvania Rhode Island South Carolina South Dakota
## [36] Tennessee Texas Utah Vermont Virginia
## [41] Washington West Virginia Wisconsin Wyoming
##
## 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)## Murder Assault UrbanPop Rape cluster
## Alabama 1.24256408 0.7828393 -0.5209066 -0.003416473 1
## Alaska 0.50786248 1.1068225 -1.2117642 2.484202941 1
## Arizona 0.07163341 1.4788032 0.9989801 1.042878388 1
## Arkansas 0.23234938 0.2308680 -1.0735927 -0.184916602 2
clara.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
head(clara.res$clustering, 10)## Alabama Alaska Arizona Arkansas California Colorado
## 1 1 1 2 1 1
## Connecticut Delaware Florida Georgia
## 2 2 1 1
fviz_cluster(
clara.res,
palette = c("#00AFBB", "#FC4E07"),
ellipse.type = "t",
geom = "point",
pointsize = 1,
ggtheme = theme_classic()
)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")
fviz_dend(res.hc, cex = 0.5)res.coph <- cophenetic(res.hc)
cor(res.dist, res.coph)## [1] 0.6975266
res.hc2 <- hclust(res.dist, method = "average")
cor(res.dist, cophenetic(res.hc2))## [1] 0.7180382
grp <- cutree(res.hc, k = 4)
head(grp, n = 4)## Alabama Alaska Arizona Arkansas
## 1 2 2 3
table(grp)## grp
## 1 2 3 4
## 7 12 19 12
rownames(df)[grp == 1]## [1] "Alabama" "Georgia" "Louisiana" "Mississippi"
## [5] "North Carolina" "South Carolina" "Tennessee"
fviz_dend(
res.hc,
k = 4,
cex = 0.5,
k_colors = c("#2E9FDF", "#00AFBB", "#E7B800", "#FC4E07"),
color_labels_by_k = TRUE,
rect = TRUE
)fviz_cluster(
list(data = df, cluster = grp),
palette = c("#2E9FDF", "#00AFBB", "#E7B800", "#FC4E07"),
ellipse.type = "convex",
repel = TRUE,
show.clust.cent = FALSE,
ggtheme = theme_minimal()
)res.agnes <-
agnes(
x = USArrests,
stand = TRUE,
metric = "euclidean",
method = "ward"
)
res.diana <-
diana(x = USArrests, stand = TRUE, metric = "euclidean")
fviz_dend(res.agnes, cex = 0.6, k = 4)library(dendextend)
res.dist <- dist(df, method = "euclidean")
hc1 <- hclust(res.dist, method = "average")
hc2 <- hclust(res.dist, method = "ward.D2")
dend1 <- as.dendrogram (hc1)
dend2 <- as.dendrogram (hc2)
dend_list <- dendlist(dend1, dend2)
tanglegram(dend1, dend2)tanglegram(
dend1,
dend2,
highlight_distinct_edges = FALSE,
common_subtrees_color_lines = FALSE,
common_subtrees_color_branches = TRUE,
main = paste("entanglement =", round(entanglement(dend_list), 2))
)cor.dendlist(dend_list, method = "cophenetic")## [,1] [,2]
## [1,] 1.000000 0.843143
## [2,] 0.843143 1.000000
cor.dendlist(dend_list, method = "baker")## [,1] [,2]
## [1,] 1.0000000 0.8400675
## [2,] 0.8400675 1.0000000
cor_cophenetic(dend1, dend2)## [1] 0.843143
cor_bakers_gamma(dend1, dend2)## [1] 0.8400675
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
dend_list <-
dendlist(
"Complete" = dend1,
"Single" = dend2,
"Average" = dend3,
"Centroid" = dend4
)
cors <- cor.dendlist(dend_list)
round(cors, 2)## Complete Single Average Centroid
## Complete 1.00 0.50 0.86 0.49
## Single 0.50 1.00 0.58 0.71
## Average 0.86 0.58 1.00 0.61
## Centroid 0.49 0.71 0.61 1.00
library(corrplot)
corrplot(cors, "pie", "lower")library(factoextra)
data(USArrests)
dd <- dist(scale(USArrests), method = "euclidean")
hc <- hclust(dd, method = "ward.D2")
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,
cex = 0.5,
k_colors = c("#2E9FDF", "#00AFBB", "#E7B800", "#FC4E07"),
color_labels_by_k = TRUE,
ggtheme = theme_gray()
)fviz_dend(hc,
cex = 0.5,
k = 4,
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
)fviz_dend(
hc,
k = 4,
k_colors = "jco",
type = "phylogenic",
repel = TRUE,
phylo_layout = "layout.gem"
)fviz_dend(hc, xlim = c(1, 20), ylim = c(1, 8))dend_plot <- fviz_dend(hc,
k = 4,
cex = 0.5,
k_colors = "jco")
dend_data <- attr(dend_plot, "dendrogram")
dend_cuts <- cut(dend_data, h = 10)
fviz_dend(dend_cuts$upper)print(dend_plot)fviz_dend(dend_cuts$lower[[1]], main = "Sub arbol 1")fviz_dend(dend_cuts$lower[[2]], main = "Sub arbol 2")fviz_dend(dend_cuts$lower[[2]], type = "circular")data <- scale(USArrests)
dist.res <- dist(data)
hc <- hclust(dist.res, method = "ward.D2")
dend <- as.dendrogram(hc)
plot(dend)dend <-
USArrests[1:5, ] %>% scale %>% dist %>% hclust(method = "ward.D2") %>% as.dendrogram
plot(dend)mycols <- c("#2E9FDF", "#00AFBB", "#E7B800", "#FC4E07")
dend <-
as.dendrogram(hc) %>% set("branches_lwd", 1) %>% set("branches_k_color", mycols, k = 4) %>% set("labels_colors", mycols, k = 4) %>% set("labels_cex", 0.5)
fviz_dend(dend)(Kassambara 2017)