Agrupación jerárquica en R: ejemplo paso a paso

El agrupamiento es una técnica en el aprendizaje automático que intenta encontrar grupos o grupos de observaciones dentro de un conjunto de datos de manera que las observaciones dentro de cada grupo sean bastante similares entre sí, mientras que las observaciones en diferentes grupos son bastante diferentes entre sí.

La agrupación es una forma de aprendizaje no supervisado porque simplemente intentamos encontrar una estructura dentro de un conjunto de datos en lugar de predecir el valor de alguna variable de respuesta .

La agrupación en clústeres se utiliza a menudo en marketing cuando las empresas tienen acceso a información como:

  • Ingresos del hogar
  • Tamaño del hogar
  • Ocupación del jefe de hogar
  • Distancia del área urbana más cercana

Cuando esta información está disponible, la agrupación se puede utilizar para identificar hogares que son similares y pueden tener más probabilidades de comprar ciertos productos o responder mejor a cierto tipo de publicidad.

Una de las formas más comunes de agrupación en clústeres se conoce como agrupación de k-medias . Por desgracia, este método requiere que pre-especificar el número de agrupaciones K .

Una alternativa a este método se conoce como agrupación jerárquica , que no requiere que pre-especifiquemos el número de agrupaciones que se utilizarán y también puede producir una representación basada en árboles de las observaciones conocida como dendrograma .

¿Qué es la agrupación jerárquica?

Similar al agrupamiento de k-medias, el objetivo del agrupamiento jerárquico es producir grupos de observaciones que sean bastante similares entre sí, mientras que las observaciones en diferentes grupos son bastante diferentes entre sí.

En la práctica, utilizamos los siguientes pasos para realizar agrupaciones jerárquicas:

1. Calcule la disimilitud por pares entre cada observación en el conjunto de datos.

  • Primero, debemos elegir alguna métrica de distancia, como la distancia euclidiana , y usar esta métrica para calcular la diferencia entre cada observación en el conjunto de datos.
  • Para un conjunto de datos con n observaciones, habrá un total de n ( n -1) / 2 disimilitudes por pares.

2. Fusionar las observaciones en grupos.

  • En cada paso del algoritmo, fusione las dos observaciones más similares en un solo grupo.
  • Repita este procedimiento hasta que todas las observaciones sean miembros de un grupo grande. El resultado final es un árbol, que se puede trazar como un dendrograma .

Para determinar qué tan cerca están dos grupos, podemos usar algunos métodos diferentes, que incluyen:

  • Agrupación de enlaces completa: encuentre la distancia máxima entre los puntos que pertenecen a dos agrupaciones diferentes.
  • Agrupación de enlace único: encuentre la distancia mínima entre puntos que pertenecen a dos agrupaciones diferentes.
  • Agrupación de enlace media: Encuentre todas las distancias por pares entre puntos que pertenecen a dos conglomerados diferentes y luego calcule el promedio.
  • Agrupación de enlaces de centroides: encuentre el centroide de cada grupo y calcule la distancia entre los centroides de dos grupos diferentes.
  • Método de variación mínima de Ward: Minimizar el total

Dependiendo de la estructura del conjunto de datos, uno de estos métodos puede tender a producir agrupaciones mejores (es decir, más compactas) que los otros métodos.

Agrupación jerárquica en R

El siguiente tutorial proporciona un ejemplo paso a paso de cómo realizar agrupaciones jerárquicas en R.

Paso 1: cargue los paquetes necesarios

Primero, cargaremos dos paquetes que contienen varias funciones útiles para la agrupación jerárquica en R.

biblioteca (factoextra)
 biblioteca (clúster)

Paso 2: Cargue y prepare los datos

Para este ejemplo, usaremos el conjunto de datos USArrests integrado en R, que contiene el número de arrestos por cada 100,000 residentes en cada estado de EE. UU. En 1973 por asesinato , asalto y violación junto con el porcentaje de la población en cada estado que vive en áreas urbanas. , UrbanPop .

El siguiente código muestra cómo hacer lo siguiente:

  • Cargar el conjunto de datos de USArrests
  • Elimina las filas con valores faltantes
  • Escale cada variable en el conjunto de datos para tener una media de 0 y una desviación estándar de 1
#Cargar datos
df <- USArrests

# eliminar filas con valores perdidos
 df <- na. Omitir (df)

#escala cada variable para que tenga una media de 0 y una
 df de 1 df <- scale (df)

#ver las primeras seis filas del conjunto de datos
cabeza (df)

               Asesinato Asalto UrbanPop Violación
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

Paso 3: busque el método de vinculación que desee utilizar

Para realizar un agrupamiento jerárquico en R, podemos usar la función agnes () del paquete de clúster , que usa la siguiente sintaxis:

agnes (datos, método)

dónde:

  • data: Nombre del conjunto de datos.
  • método: el método que se utilizará para calcular la diferencia entre conglomerados.

Dado que no sabemos de antemano qué método producirá los mejores clústeres, podemos escribir una función corta para realizar un clúster jerárquico utilizando varios métodos diferentes.

Tenga en cuenta que esta función calcula el coeficiente de aglomeración de cada método, que es una métrica que mide la fuerza de los conglomerados. Cuanto más cerca esté este valor de 1, más fuertes serán los grupos.

#definir métodos de vinculación
 m <- c ("promedio", "único", "completo", "barrio")
nombres (m) <- c ("promedio", "soltero", "completo", "barrio")

# función para calcular el coeficiente de aglomeración
 ac <- función (x) {
  agnes (gl, método = x) $ ac
}

#calcular el coeficiente de aglomeración para cada método de enlace de agrupamiento
 sapply (m, ac)

  promedio de una sala completa 
0,7379371 0,6276128 0,8531583 0,9346210 

Podemos ver que el método de varianza mínima de Ward produce el coeficiente de aglomeración más alto, por lo que lo usaremos como método para nuestro agrupamiento jerárquico final:

# realizar agrupaciones jerárquicas utilizando la agrupación de varianza mínima de Ward
 <- agnes (df, method = " ward ")

#produce dendrogram
 pltree (clust, cex = 0.6, hang = -1, main = " Dendrogram ")

Dendrograma en R

Cada hoja en la parte inferior del dendrograma representa una observación en el conjunto de datos original. A medida que avanzamos por el dendrograma desde la parte inferior, las observaciones que son similares entre sí se fusionan en una rama.

Paso 4: Determine la cantidad óptima de clústeres

Para determinar en cuántos conglomerados se deben agrupar las observaciones, podemos usar una métrica conocida como estadística de brecha , que compara la variación intragrupo total para diferentes valores de k con sus valores esperados para una distribución sin conglomerados.

Podemos calcular la estadística de brechas para cada número de clústeres usando la función clusGap () del paquete de clústeres junto con un gráfico de clústeres frente a la estadística de brechas usando la función fviz_gap_stat () :

#calcular la estadística de brecha para cada número de conglomerados (hasta 10 conglomerados)
 gap_stat <- clusGap (df, FUN = hcut, nstart = 25, K.max = 10, B = 50)

#producir gráfico de conglomerados frente a la estadística de
 brechas fviz_gap_stat (gap_stat)

Clústeres óptimos para la agrupación jerárquica

En el gráfico podemos ver que la estadística de brecha es más alta en k = 4 conglomerados. Por lo tanto, elegiremos agrupar nuestras observaciones en 4 grupos distintos.

Paso 5: aplique etiquetas de clúster al conjunto de datos original

Para agregar etiquetas de grupo a cada observación en nuestro conjunto de datos, podemos usar el método cutree () para cortar el dendrograma en 4 grupos:

#calcular matriz de distancias
 d <- dist (df, method = " euclidiana ")

# realizar agrupaciones jerárquicas utilizando el método de Ward
 final_clust <- hclust (d, method = " ward.D2 ")

#corte el dendrograma en 4 grupos de clusters
 <- cutree (final_clust, k = 4)

# encontrar el número de observaciones en cada tabla de conglomerados
 (grupos)

 1 2 3 4 
 7 12 19 12

Luego, podemos agregar las etiquetas de clúster de cada estado al conjunto de datos original:

#anexar etiquetas de clúster a los datos originales
 final_data <- cbind (USArrests, cluster = groups)

#muestra las primeras seis filas de los datos finales
head (final_data)
 
               Asesinato Asalto UrbanPop Rape Cluster
Alabama 13,2 236 58 21,2 1
Alaska 10,0 263 48 44,5 2
Arizona 8.1 294 80 31.0 2
Arkansas 8,8 190 50 19,5 3
California 9,0 276 91 40,6 2
Colorado 7,9 204 78 38,7 2

Por último, podemos usar la función aggregate () para encontrar la media de las variables en cada grupo:

# encontrar valores medios para cada grupo
 agregado (final_data, by = list (cluster = final_data $ cluster), mean)
 
  cluster Murder Assault UrbanPop Rape cluster
1 1 14.671429 251.2857 54.28571 21.68571 1
2 2 10.966667 264.0000 76.50000 33.60833 2
3 3 6.210526 142.0526 71.26316 19.18421 3
4 4 3.091667 76.0000 52.08333 11.83333 4

Interpretamos que esta salida es la siguiente:

  • El número medio de asesinatos por cada 100.000 ciudadanos entre los estados del grupo 1 es 14,67 .
  • El número medio de agresiones por cada 100.000 ciudadanos entre los estados del grupo 1 es 251,28 .
  • El porcentaje medio de residentes que viven en un área urbana entre los estados del conglomerado 1 es 54,28% .
  • El número medio de violaciones por cada 100.000 ciudadanos entre los estados del grupo 1 es 21,68 .

Puede encontrar el código R completo utilizado en este ejemplo aquí .

  • https://r-project.org
  • https://www.python.org/
  • https://www.stata.com/

Deja un comentario

En estadística, una puntuación z nos dice cuántas desviaciones estándar de un valor dado se encuentra de la media .…
statologos comunidad-2

Compartimos información EXCLUSIVA y GRATUITA solo para suscriptores (cursos privados, programas, consejos y mucho más)

You have Successfully Subscribed!