K-significa ClusterIngresando en R con el ejemplo

¿Qué es el Cluster ¿análisis?

Cluster El análisis es parte del aprendizaje sin supervisiónUn clúster es un grupo de datos que comparten características similares. Podemos decir que el análisis de clústeres tiene más que ver con el descubrimiento que con la predicción. La máquina busca similitudes en los datos. Por ejemplo, puede utilizar el análisis de clústeres para la siguiente aplicación:

  • Segmentación de clientes: busca similitud entre grupos de clientes
  • Agrupamiento del mercado de valores: agrupar acciones en función de su rendimiento
  • Reducir la dimensionalidad de un conjunto de datos agrupando observaciones con valores similares

ClusterEl análisis de software no es demasiado difícil de implementar y es significativo y procesable para las empresas.

La diferencia más llamativa 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 profesional en la búsqueda de etiquetar los datos en función de su estrecha relación. Corresponde al analista hacer uso de los grupos y darles un nombre.

Vamos a poner un ejemplo para entender el concepto de clusterización. Para simplificar, trabajamos en dos dimensiones. Tienes datos sobre el gasto total de los clientes y sus edades. Para mejorar la publicidad, el equipo de marketing quiere enviar correos electrónicos más específicos a sus clientes.

En el siguiente gráfico se representa 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()

Cluster Analisis

En este punto se ve un patrón.

  1. En la parte inferior izquierda se pueden ver jóvenes con menor poder adquisitivo.
  2. El nivel medio superior refleja que las personas con un trabajo que pueden pagar gastan más
  3. Por último, personas mayores con menor presupuesto.

Cluster Analisis

En la figura anterior, agrupa las observaciones manualmente y define cada uno de los tres grupos. Este ejemplo es bastante sencillo y muy visual. Si se añaden nuevas observaciones al conjunto de datos, puede etiquetarlas dentro de los círculos. Usted define el círculo en función de su criterio. En cambio, puede utilizar Aprendizaje automático (Machine learning & LLM) agrupar los datos objetivamente.

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

Algoritmo de K-medias

K-mean es, sin duda, el método de agrupamiento más popular. Los investigadores publicaron el algoritmo hace décadas y se le han realizado muchas mejoras.

El algoritmo intenta encontrar grupos minimizando la distancia entre las observaciones, llamado óptimo local soluciones. Las distancias se miden en base a las coordenadas de las observaciones. Por ejemplo, en un espacio bidimensional, las coordenadas son simples y.

Algoritmo de K-medias

El algoritmo funciona de la siguiente manera:

  • Paso 1: elija grupos en el plan de funciones al azar
  • Paso 2: Minimizar la distancia entre el centro del cúmulo y las diferentes observaciones (centroide). Da como resultado grupos con observaciones.
  • Paso 3: Shift el centroide inicial a la media de las coordenadas dentro de un grupo.
  • Paso 4: Minimiza la distancia según los nuevos centroides. Se crean nuevos límites. Así, las observaciones pasarán de un grupo a otro.
  • Repetir hasta que ninguna observación cambie de grupo.

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

Algoritmo de K-medias

Existen 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 la misma agrupación.

Seleccione el número de clústeres

Otra dificultad encontrada con k-mean es la elección del número de clústeres. Puede establecer un valor alto de , es decir, un gran número de grupos, para mejorar la estabilidad, pero podría terminar con sobreajustado de datos. El sobreajuste significa que el rendimiento del modelo disminuye sustancialmente con los nuevos datos que se incorporan. La máquina aprendió los pequeños detalles del conjunto de datos y le cuesta generalizar el patrón general.

La cantidad de clústeres depende de la naturaleza del conjunto de datos, la industria, el negocio, etc. Sin embargo, existe una regla general para seleccionar la cantidad adecuada de clústeres:

Seleccione el número de Clusters

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

En general, es interesante dedicar tiempo a buscar el mejor valor que se ajuste a las necesidades del negocio.

Utilizaremos 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 computadoras personales en los EE. UU. entre 1995 y 486. Las variables son precio, velocidad, memoria RAM, pantalla, CD, entre otras.

Procederá de la siguiente manera:

  • Importar fechas
  • Entrenar a la modelo
  • Evaluar el modelo

Importar fechas

K medias no es adecuada para variables factoriales 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 faltan valores 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)

Salida

## 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  <int> 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1...

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

summary(df)

Salida:

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

Puedes cambiar 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 sola observación con la media. Si un valor estandarizado (o puntaje z) es alto, puede estar seguro de que esta observación está efectivamente 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 z de dos indica que el valor es 2 estándar desviaciones 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 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

Entrenar a la modelo

En la figura tres, detallaste cómo funciona el algoritmo. Puede ver cada paso gráficamente con el excelente 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 de instalar el paquete con install.packages(“animación”). Puede verificar 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. A modo de ejemplo, solo ejecutará el algoritmo con las variables reescaladas hd y ram con tres clústeres.

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.

Entrena el modelo

Entrena el modelo

Puedes interpretar la animación de la siguiente manera:

  • Paso 1: R elige aleatoriamente tres puntos
  • Paso 2: Calcula la distancia euclidiana y dibuja los grupos. Tienes un grupo en verde en la parte inferior izquierda, un grupo grande coloreado en negro a la derecha y uno rojo entre ellos.
  • Paso 3: Calcular el centroide, es decir, la media de los grupos.
  • Repetir hasta que no haya cambios en los datos del clúster

El algoritmo convergió después de siete iteraciones. Puedes 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 clúster 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 de los cuadrados. La cantidad de componentes devueltos es igual a `k`
  • pc_cluster$tot.withinss: Suma de withinss
  • pc_clusterbetweenss: Suma total de cuadrados menos Suma interna de cuadrados
  • pc_cluster$size: Número de observaciones dentro de cada grupo

Utilizará la suma de los cuadrados de la suma interna (es decir, tot.withinss) para calcular el número óptimo de grupos k. Encontrar k es, en efecto, una tarea importante.

k óptimo

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

En este tutorial, encontramos este punto utilizando la medida de heterogeneidad. La suma de cuadrados del total dentro de los conglomerados es el tot.withinss en la lista devuelta por kmean().

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

  • Paso 1: Construya una función para calcular la suma total de cuadrados dentro de los conglomerados
  • Paso 2: ejecutar los tiempos del algoritmo
  • Paso 3: Crea un marco de datos con los resultados del algoritmo.
  • Paso 4: trazar los resultados

Paso 1) Construya una función para calcular la suma total de cuadrados dentro de los clústeres

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

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 la suma de cuadrados de los clústeres

Puedes probar la función con igual a 2.

Salida:

## Try with 2 cluster
kmean_withinss(2)

Salida:

## [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 cluster 
max_k <-20 
# Run algorithm over a range of k 
wss <- 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): ejecuta la función kmean_withinss() en un rango 2:max_k, es decir, de 2 a 20.

Paso 3) Crear 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 y almacenar los valores tot.withinss.

# Create a data frame to plot the graph
elbow <-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) Grafica los resultados

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

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

k óptimo

En el gráfico se 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 clústeres.

Examinando el cluster

pc_cluster_2 <-kmeans(rescale_df, 7)

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

pc_cluster_2$cluster
pc_cluster_2$centers
pc_cluster_2$size

La parte de evaluación es subjetiva y depende del uso del algoritmo. Nuestro objetivo aquí es reunir computadoras con características similares. Un experto en computadoras puede hacer el trabajo a mano y agrupar las computadoras según su experiencia. Sin embargo, el proceso llevará mucho tiempo y será propenso a errores. El algoritmo K-mean puede preparar el terreno para él/ella sugiriendo grupos.

Como evaluación previa, puedes examinar el tamaño de los clusters.

pc_cluster_2$size

Salida:

## [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 grupos, si no, podría requerirse una preparación de datos más delgada.

El componente central permite obtener una visión más profunda de los datos. Las filas hacen referencia 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 clúster para la columna de interés. La estandarización facilita la interpretación. Los valores positivos indican que la puntuación z de un clúster determinado está por encima de la media general. Por ejemplo, el clúster 2 tiene el precio medio más alto entre todos los clústeres.

center <-pc_cluster_2$centers
center

Salida:

##   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. Puedes usar la conda. bibliotecas y el código para ejecutar en la terminal:

instalación de conda -c r r-rcolorbrewer

Para crear un mapa de calor, debes seguir tres pasos:

  • Construye un marco de datos con los valores del centro y crea una variable con el número del cluster
  • 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 color.RampFunción paleta()

Paso 1) Construir un marco de datos

Creemos el conjunto de datos de remodelación

library(tidyr)

# create dataset with the cluster number

cluster <- c(1: 7)
center_df <- data.frame(cluster, center)

# Reshape the data

center_reshape <- gather(center_df, features, values, price_scal: trend_scal)
head(center_reshape)

Salida:

##   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) Reformar los datos

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

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

Paso 3) Visualizar

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

# Plot the heat map
ggplot(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()

Examinando el Cluster

Resum

Podemos resumir el algoritmo k-mean en la siguiente tabla

PREMIUM Objetivo Función Argumento
bases Tren k-media kmeans () df,k
Clúster de acceso kmeans()$clúster
Cluster centros kmeans()$centros
Tamaño del grupo kmeans()$tamaño