Agrupación de K-medias en R con ejemplo

Tabla de contenido:

Anonim

En este tutorial, aprenderá

  • ¿Qué es el análisis de conglomerados?
  • Algoritmo de K-medias
  • Óptimo k

¿Qué es el análisis de conglomerados?

El análisis de conglomerados es parte del aprendizaje no supervisado . Un clúster es un grupo de datos que comparten características similares. Podemos decir que el análisis de agrupamiento se trata más de un descubrimiento que de una predicción. La máquina busca similitudes en los datos. Por ejemplo, puede utilizar el análisis de conglomerados para la siguiente aplicación:

  • Segmentación de clientes: busca similitudes entre grupos de clientes
  • Agrupación bursátil: acciones del grupo basadas en rendimientos
  • Reducir la dimensionalidad de un conjunto de datos agrupando observaciones con valores similares

El análisis de agrupamiento no es demasiado difícil de implementar y es significativo y útil para las empresas.

La diferencia más notable entre el aprendizaje supervisado y no supervisado radica en los resultados. El aprendizaje no supervisado crea una nueva variable, la etiqueta, mientras que el aprendizaje supervisado predice un resultado. La máquina ayuda al médico en la búsqueda de etiquetar los datos basándose en una relación cercana. Corresponde al analista hacer uso de los grupos y darles un nombre.

Hagamos un ejemplo para entender el concepto de agrupamiento. Por simplicidad, trabajamos en dos dimensiones. Tiene datos sobre el gasto total de los clientes y sus edades. Para mejorar la publicidad, el equipo de marketing desea enviar correos electrónicos más específicos a sus clientes.

En el siguiente gráfico, traza el gasto total y la edad de los clientes.

library(ggplot2)df <- data.frame(age = c(18, 21, 22, 24, 26, 26, 27, 30, 31, 35, 39, 40, 41, 42, 44, 46, 47, 48, 49, 54),spend = c(10, 11, 22, 15, 12, 13, 14, 33, 39, 37, 44, 27, 29, 20, 28, 21, 30, 31, 23, 24))ggplot(df, aes(x = age, y = spend)) +geom_point()

Un patrón es visible en este punto

  1. En la parte inferior izquierda, puede ver a los jóvenes con un poder adquisitivo más bajo.
  2. El nivel medio alto refleja a las personas con un trabajo que pueden permitirse gastar más
  3. Finalmente, personas mayores con menor presupuesto.

En la figura anterior, agrupa las observaciones a mano y define cada uno de los tres grupos. Este ejemplo es algo sencillo y muy visual. Si se agregan nuevas observaciones al conjunto de datos, puede etiquetarlas dentro de los círculos. Tú defines el círculo según nuestro juicio. En su lugar, puede utilizar el aprendizaje automático para agrupar los datos de forma objetiva.

En este tutorial, aprenderá a utilizar el algoritmo k-means .

Algoritmo de K-medias

K-mean es, sin duda, el método de agrupación más popular. Los investigadores lanzaron el algoritmo hace décadas y se han realizado muchas mejoras en k-means.

El algoritmo intenta encontrar grupos minimizando la distancia entre las observaciones, llamadas soluciones óptimas locales . Las distancias se miden en función de las coordenadas de las observaciones. Por ejemplo, en un espacio bidimensional, las coordenadas son simples y.

El algoritmo funciona de la siguiente manera:

  • Paso 1: elija grupos en el plan de funciones al azar
  • Paso 2: Minimice la distancia entre el centro del grupo y las diferentes observaciones ( centroide ). Resulta en grupos con observaciones
  • Paso 3: cambie el centroide inicial a la media de las coordenadas dentro de un grupo.
  • Paso 4: Minimice la distancia de acuerdo con los nuevos centroides. Se crean nuevos límites. Por tanto, las observaciones se moverán de un grupo a otro.
  • Repita hasta que ninguna observación cambie de grupo

K-means generalmente toma la distancia euclidiana entre la característica y la característica:

Hay diferentes medidas disponibles como la distancia de Manhattan o la distancia de Minlowski. Tenga en cuenta que K-mean devuelve diferentes grupos cada vez que ejecuta el algoritmo. Recuerde que las primeras suposiciones iniciales son aleatorias y calcule las distancias hasta que el algoritmo alcance una homogeneidad dentro de los grupos. Es decir, k-mean es muy sensible a la primera opción y, a menos que el número de observaciones y grupos sea pequeño, es casi imposible obtener el mismo agrupamiento.

Seleccione la cantidad de clústeres

Otra dificultad encontrada con k-mean es la elección del número de conglomerados. Puede establecer un valor alto de, es decir, un gran número de grupos, para mejorar la estabilidad, pero puede terminar con un ajuste excesivo de datos. El sobreajuste significa que el rendimiento del modelo disminuye sustancialmente para los nuevos datos que vienen. La máquina aprendió los pequeños detalles del conjunto de datos y tuvo problemas para generalizar el patrón general.

El número de clústeres depende de la naturaleza del conjunto de datos, la industria, el negocio, etc. Sin embargo, existe una regla general para seleccionar el número apropiado de clústeres:

con es igual al número de observaciones en el conjunto de datos.

En términos generales, es interesante dedicar tiempo a buscar el mejor valor para adaptarse a las necesidades comerciales.

Usaremos el conjunto de datos de Precios de Computadoras Personales para realizar nuestro análisis de agrupamiento. Este conjunto de datos contiene 6259 observaciones y 10 características. El conjunto de datos observa el precio de 1993 a 1995 de 486 computadoras personales en los EE. UU. Las variables son precio, velocidad, ram, pantalla, cd entre otras.

Procederá de la siguiente manera:

  • Datos de importacion
  • Entrena el modelo
  • Evaluar el modelo

Datos de importacion

K medias no es adecuado para variables de factor porque se basa en la distancia y los valores discretos no devuelven valores significativos. Puede eliminar las tres variables categóricas en nuestro conjunto de datos. Además, no hay valores perdidos en este conjunto de datos.

library(dplyr)PATH <-"https://raw.githubusercontent.com/guru99-edu/R-Programming/master/computers.csv"df <- read.csv(PATH) %>%select(-c(X, cd, multi, premium))glimpse(df)
Producción
## Observations: 6, 259## Variables: 7## $ price < int > 1499, 1795, 1595, 1849, 3295, 3695, 1720, 1995, 2225, 2… ##$ speed < int > 25, 33, 25, 25, 33, 66, 25, 50, 50, 50, 33, 66, 50, 25,… ##$ hd < int > 80, 85, 170, 170, 340, 340, 170, 85, 210, 210, 170, 210… ##$ ram < int > 4, 2, 4, 8, 16, 16, 4, 2, 8, 4, 8, 8, 4, 8, 8, 4, 2, 4,… ##$ screen < int > 14, 14, 15, 14, 14, 14, 14, 14, 14, 15, 15, 14, 14, 14,… ##$ ads < int > 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94,… ## $ trend  1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1… 

En las estadísticas de resumen, puede ver que los datos tienen valores grandes. Una buena práctica con el cálculo de k media y distancia es cambiar la escala de los datos para que la media sea igual a uno y la desviación estándar sea igual a cero.

summary(df)

Producción:

## price speed hd ram## Min. : 949 Min. : 25.00 Min. : 80.0 Min. : 2.000## 1st Qu.:1794 1st Qu.: 33.00 1st Qu.: 214.0 1st Qu.: 4.000 `## Median :2144 Median : 50.00 Median : 340.0 Median : 8.000## Mean :2220 Mean : 52.01 Mean : 416.6 Mean : 8.287## 3rd Qu.:2595 3rd Qu.: 66.00 3rd Qu.: 528.0 3rd Qu.: 8.000## Max. :5399 Max. :100.00 Max. :2100.0 Max. :32.000## screen ads trend## Min. :14.00 Min. : 39.0 Min. : 1.00## 1st Qu.:14.00 1st Qu.:162.5 1st Qu.:10.00## Median :14.00 Median :246.0 Median :16.00## Mean :14.61 Mean :221.3 Mean :15.93## 3rd Qu.:15.00 3rd Qu.:275.0 3rd Qu.:21.50## Max. :17.00 Max. :339.0 Max. :35.00

Cambia la escala de las variables con la función scale () de la biblioteca dplyr. La transformación reduce el impacto de los valores atípicos y permite comparar una única observación con la media. Si un valor estandarizado (o puntuación z ) es alto, puede estar seguro de que esta observación está por encima de la media (una puntuación z grande implica que este punto está muy lejos de la media en términos de desviación estándar. una puntuación de dos indica que el valor está a 2 desviaciones estándar de la media. Tenga en cuenta que la puntuación z sigue una distribución gaussiana y es simétrica alrededor de la media.

rescale_df <- df % > %mutate(price_scal = scale(price),hd_scal = scale(hd),ram_scal = scale(ram),screen_scal = scale(screen),ads_scal = scale(ads),trend_scal = scale(trend)) % > %select(-c(price, speed, hd, ram, screen, ads, trend))

R base tiene una función para ejecutar el algoritmo de k media. La función básica de k media es:

kmeans(df, k)arguments:-df: dataset used to run the algorithm-k: Number of clusters

Entrena el modelo

En la figura tres, detallaste cómo funciona el algoritmo. Puede ver cada paso gráficamente con el gran paquete creado por Yi Hui (también creador de Knit para Rmarkdown). La animación del paquete no está disponible en la biblioteca conda. Puede utilizar la otra forma para instalar el paquete con install.packages ("animación"). Puede comprobar si el paquete está instalado en nuestra carpeta Anaconda.

install.packages("animation") 

Después de cargar la biblioteca, agrega .ani después de kmeans y R trazará todos los pasos. Con fines ilustrativos, solo ejecuta el algoritmo con las variables reescaladas hd y ram con tres grupos.

set.seed(2345)library(animation)kmeans.ani(rescale_df[2:3], 3)

Explicación del código

  • kmeans.ani (rescale_df [2: 3], 3): Seleccione las columnas 2 y 3 del conjunto de datos rescale_df y ejecute el algoritmo con k conjuntos en 3. Trace la animación.

Puede interpretar la animación de la siguiente manera:

  • Paso 1: R elige tres puntos al azar
  • Paso 2: Calcule la distancia euclidiana y dibuje los grupos. Tiene un grupo en verde en la parte inferior izquierda, un grupo grande de color negro a la derecha y uno rojo entre ellos.
  • Paso 3: Calcule el centroide, es decir, la media de los conglomerados.
  • Repita hasta que no haya cambios de datos en el clúster

El algoritmo convergió después de siete iteraciones. Puede ejecutar el algoritmo k-mean en nuestro conjunto de datos con cinco clústeres y llamarlo pc_cluster.

pc_cluster <-kmeans(rescale_df, 5)
  • La lista pc_cluster contiene siete elementos interesantes:
  • pc_cluster $ cluster: indica el cluster de cada observación
  • pc_cluster $ centers: los centros del clúster
  • pc_cluster $ totss: La suma total de cuadrados
  • pc_cluster $ withinss: Dentro de la suma del cuadrado. El número de componentes devueltos es igual a `k`
  • pc_cluster $ tot.withinss: Suma de withinss
  • pc_clusterbetweenss: Suma total de cuadrados menos Dentro de la suma de cuadrados
  • pc_cluster $ size: número de observaciones dentro de cada grupo

Utilizará la suma de la suma interna del cuadrado (es decir, tot.withinss) para calcular el número óptimo de conglomerados k. Encontrar k es de hecho una tarea sustancial.

Óptimo k

Una técnica para elegir la mejor k se llama método del codo . Este método utiliza la homogeneidad dentro del grupo o la heterogeneidad dentro del grupo para evaluar la variabilidad. En otras palabras, le interesa el porcentaje de varianza explicado por cada grupo. Puede esperar que la variabilidad aumente con el número de conglomerados; alternativamente, la heterogeneidad disminuye. Nuestro desafío es encontrar la k que esté más allá de los rendimientos decrecientes. Agregar un nuevo grupo no mejora la variabilidad en los datos porque queda muy poca información por explicar.

En este tutorial, encontramos este punto utilizando la medida de heterogeneidad. La suma de cuadrados Total dentro de los clústeres es el total dentro de la lista devuelta por kmean ().

Puede construir el gráfico de codo y encontrar el k óptimo de la siguiente manera:

  • Paso 1: Construya una función para calcular el total dentro de los grupos suma de cuadrados
  • Paso 2: ejecutar los tiempos del algoritmo
  • Paso 3: crea un marco de datos con los resultados del algoritmo
  • Paso 4: grafica los resultados

Paso 1) Construya una función para calcular el total dentro de los grupos suma de cuadrados

Usted crea la función que ejecuta el algoritmo k-mean y almacena el total dentro de los clústeres suma de cuadrados

kmean_withinss <- function(k) {cluster <- kmeans(rescale_df, k)return (cluster$tot.withinss)}

Explicación del código

  • función (k): establece el número de argumentos en la función
  • kmeans (rescale_df, k): Ejecuta el algoritmo k veces
  • return (cluster $ tot.withinss): almacena el total dentro de los grupos suma de cuadrados

Puede probar la función con igual a 2.

Producción:

## Try with 2 cluster
kmean_withinss(2)

Producción:

## [1] 27087.07 

Paso 2) Ejecute el algoritmo n veces

Utilizará la función sapply () para ejecutar el algoritmo en un rango de k. Esta técnica es más rápida que crear un bucle y almacenar el valor.

# Set maximum clustermax_k <-20# Run algorithm over a range of kwss <- sapply(2:max_k, kmean_withinss)

Explicación del código

  • max_k <-20: establece un número máximo de 20
  • sapply (2: max_k, kmean_withinss): Ejecute la función kmean_withinss () en un rango 2: max_k, es decir, de 2 a 20.

Paso 3) Crea un marco de datos con los resultados del algoritmo

Después de la creación y prueba de nuestra función, puede ejecutar el algoritmo k-mean en un rango de 2 a 20, almacenar los valores tot.withinss.

# Create a data frame to plot the graphelbow <-data.frame(2:max_k, wss)

Explicación del código

  • data.frame (2: max_k, wss): crea un marco de datos con la salida del algoritmo almacenado en wss

Paso 4) Grafique los resultados

Traza el gráfico para visualizar dónde está el punto del codo

# Plot the graph with gglopggplot(elbow, aes(x = X2.max_k, y = wss)) +geom_point() +geom_line() +scale_x_continuous(breaks = seq(1, 20, by = 1))

En el gráfico, puede ver que el k óptimo es siete, donde la curva comienza a tener un rendimiento decreciente.

Una vez que tenga nuestro k óptimo, vuelva a ejecutar el algoritmo con k igual a 7 y evalúe los grupos.

Examinando el clúster

pc_cluster_2 <-kmeans(rescale_df, 7)

Como se mencionó anteriormente, puede acceder a la información interesante restante en la lista devuelta por kmean ().

pc_cluster_2$clusterpc_cluster_2$centerspc_cluster_2$size 

La parte de evaluación es subjetiva y se basa en el uso del algoritmo. Nuestro objetivo aquí es reunir computadoras con características similares. Un informático puede hacer el trabajo a mano y agrupar la computadora en función de su experiencia. Sin embargo, el proceso llevará mucho tiempo y será propenso a errores. El algoritmo K-mean puede prepararle el campo sugiriendo clústeres.

Como evaluación previa, puede examinar el tamaño de los clústeres.

pc_cluster_2$size

Producción:

## [1] 608 1596 1231 580 1003 699 542

El primer grupo está compuesto por 608 observaciones, mientras que el grupo más pequeño, el número 4, tiene solo 580 computadoras. Podría ser bueno tener homogeneidad entre los clústeres, de lo contrario, podría ser necesaria una preparación de datos más fina.

Obtiene una mirada más profunda a los datos con el componente central. Las filas se refieren a la numeración del clúster y las columnas a las variables utilizadas por el algoritmo. Los valores son la puntuación media de cada grupo para la columna interesada. La estandarización facilita la interpretación. Los valores positivos indican que la puntuación z para un grupo determinado está por encima de la media general. Por ejemplo, el grupo 2 tiene el precio promedio más alto entre todos los grupos.

center <-pc_cluster_2$centerscenter

Producción:

## price_scal hd_scal ram_scal screen_scal ads_scal trend_scal## 1 -0.6372457 -0.7097995 -0.691520682 -0.4401632 0.6780366 -0.3379751## 2 -0.1323863 0.6299541 0.004786730 2.6419582 -0.8894946 1.2673184## 3 0.8745816 0.2574164 0.513105797 -0.2003237 0.6734261 -0.3300536## 4 1.0912296 -0.2401936 0.006526723 2.6419582 0.4704301 -0.4132057## 5 -0.8155183 0.2814882 -0.307621003 -0.3205176 -0.9052979 1.2177279## 6 0.8830191 2.1019454 2.168706085 0.4492922 -0.9035248 1.2069855## 7 0.2215678 -0.7132577 -0.318050275 -0.3878782 -1.3206229 -1.5490909

Puede crear un mapa de calor con ggplot para ayudarnos a resaltar la diferencia entre categorías.

Los colores predeterminados de ggplot deben cambiarse con la biblioteca RColorBrewer. Puede usar la biblioteca conda y el código para iniciar en la terminal:

conda install -cr r-rcolorbrewer

Para crear un mapa de calor, proceda en tres pasos:

  • Construya un marco de datos con los valores del centro y cree una variable con el número del clúster
  • Cambie la forma de los datos con la función recopilar () de la biblioteca tidyr. Quiere transformar datos de ancho a largo.
  • Crea la paleta de colores con la función colorRampPalette ()

Paso 1) Construye un marco de datos

Creemos el conjunto de datos de remodelación

library(tidyr)# create dataset with the cluster numbercluster <- c(1: 7)center_df <- data.frame(cluster, center)# Reshape the datacenter_reshape <- gather(center_df, features, values, price_scal: trend_scal)head(center_reshape)

Producción:

## cluster features values## 1 1 price_scal -0.6372457## 2 2 price_scal -0.1323863## 3 3 price_scal 0.8745816## 4 4 price_scal 1.0912296## 5 5 price_scal -0.8155183## 6 6 price_scal 0.8830191

Paso 2) Cambiar la forma de los datos

El siguiente código crea la paleta de colores que usará para trazar el mapa de calor.

library(RColorBrewer)# Create the palettehm.palette <-colorRampPalette(rev(brewer.pal(10, 'RdYlGn')),space='Lab')

Paso 3) Visualiza

Puede trazar el gráfico y ver cómo se ven los grupos.

# Plot the heat mapggplot(data = center_reshape, aes(x = features, y = cluster, fill = values)) +scale_y_continuous(breaks = seq(1, 7, by = 1)) +geom_tile() +coord_equal() +scale_fill_gradientn(colours = hm.palette(90)) +theme_classic()

Resumen

Podemos resumir el algoritmo k-mean en la siguiente tabla

Paquete

Objetivo

función

argumento

base

Entrenar k-mean

kmeans ()

df, k

Clúster de acceso

kmeans () $ cluster

Centros de clúster

kmeans () $ centros

Clúster de tamaño

kmeans () $ tamaño