K-significa ClusterIngresando en R con el ejemplo

ยฟQuรฉ es 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
  • Reduzca la dimensionalidad de un conjunto de datos mediante agrupamiento.ping 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 Anรกlisis

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 Anรกlisis

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

Resultado

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

Code Explicaciรณn

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

Code Explicaciรณn

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

Code Explicaciรณn

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

Code Explicaciรณn

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

Resumen

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

Resumir este post con: