K-means

Este documento te muestra paso a paso como realizar e implementar el algoritmo K-means a partir de una base de datos en formato .csv, este archivo podrás descargarlo desde la sección de material de consulta de la semana 6.

Paso 1: Cargar la base de datos

En primer lugar, cargaremos la base de datos desde el archivo base_datos_clientes.csv, este archivo debe estar en el mismo directorio donde esté ubicada tu consola o Script de R en el que estés trabajando.

#Cargamos el data set desde el archivo CSV 
clientes<-read.csv("base_datos_clientes.csv")

#ver las filas del dataset
head(clientes)
##   ID_Cliente Edad Ingreso_Anual Gasto_Anual
## 1          1   33         63999        2768
## 2          2   59         39954        9642
## 3          3   39         53975        6213
## 4          4   64         95903        5393
## 5          5   67         53461        4324
## 6          6   20         90132        8862

Paso 2: Preparación de los datos para K-means y Visualización

Seleccionamos las columnas relevantes para realizar el clustering, para este ejercicio se decide considerar: Ingreso_Anual y Gasto_Anual.

# Seleccionar las columnas relevantes para el clustering (Ingreso Anual y Gasto Anual)
datos_clustering <- clientes[, c("Ingreso_Anual", "Gasto_Anual")]

# Ver una muestra de los datos seleccionados
head(datos_clustering)
##   Ingreso_Anual Gasto_Anual
## 1         63999        2768
## 2         39954        9642
## 3         53975        6213
## 4         95903        5393
## 5         53461        4324
## 6         90132        8862
#Graficamos para ver los datos antes de agrupar
library(ggplot2)
ggplot(clientes, aes(x = Ingreso_Anual, y = Gasto_Anual)) +
  geom_point(size = 3, color = "blue") +
  labs(title = "Visualización de los Clientes por Ingreso y Gasto Anual",
       x = "Ingreso Anual",
       y = "Gasto Anual") +
  theme_minimal()

Paso 3: Aplicar algoritmos K-means

Aplicaremos el algoritmo K-means, especificando que queremos agrupas a los clientes en 3 clusters.

# Establecer el número de clusters
set.seed(123) # esta linea es para que todos obtengan los mismos resultados
kmeans_resultado <- kmeans(datos_clustering, centers = 3, nstart = 20)
kmeans_resultado
## K-means clustering with 3 clusters of sizes 43, 20, 37
## 
## Cluster means:
##   Ingreso_Anual Gasto_Anual
## 1      33481.19    5401.628
## 2      91297.85    4469.250
## 3      63847.95    5137.730
## 
## Clustering vector:
##   [1] 3 1 3 2 3 2 2 3 1 1 2 1 1 2 3 1 3 2 3 1 3 1 1 1 1 2 1 1 1 3 3 2 3 3 3 3 2
##  [38] 2 2 3 1 1 1 1 2 1 1 1 1 3 2 3 1 1 1 1 3 1 3 1 3 1 3 1 1 3 3 1 1 1 3 1 2 3
##  [75] 3 3 1 3 2 3 2 1 3 1 3 3 1 3 2 2 1 1 2 3 2 3 1 3 1 3
## 
## Within cluster sum of squares by cluster:
## [1] 4372790219  634129034 2554163131
##  (between_SS / total_SS =  86.6 %)
## 
## Available components:
## 
## [1] "cluster"      "centers"      "totss"        "withinss"     "tot.withinss"
## [6] "betweenss"    "size"         "iter"         "ifault"

Paso 4: Visualización de los clusters

Usamos ggplot2 para visualizar los clusters resultantes.

# Añadir el cluster al dataset original
clientes$Cluster <- as.factor(kmeans_resultado$cluster)

# Visualización con ggplot2
ggplot(clientes, aes(x = Ingreso_Anual, y = Gasto_Anual, color = Cluster)) +
  geom_point(size = 3) +
  labs(title = "Clusters de Clientes según Ingreso y Gasto Anual") +
  theme_minimal()

## Paso 5: Interpretación de los resultados A continuación se listan los elementos que regresa como resultado al ejecutar el algortimo K-means:

  1. centroides (centers): Te indican las coordenadas del centro de cada cluster.
  2. Asignación de clusters (cluster): Te permite ver a qué cluster pertenece cada observación de tu conjunto de datos.
  3. Suma de cuadrados (withinss, tot.withinss, betweenss): Te ayudan a entender cuán compactos y separados están tus clusters.
  4. Número de iteraciones (iter): Te da una idea de cuántas veces el algoritmo ajustó los centroides antes de llegar a una solución estable.
# Ver los centroides de cada cluster
kmeans_resultado$centers
##   Ingreso_Anual Gasto_Anual
## 1      33481.19    5401.628
## 2      91297.85    4469.250
## 3      63847.95    5137.730
# Ver a qué cluster pertenece cada punto
kmeans_resultado$cluster
##   [1] 3 1 3 2 3 2 2 3 1 1 2 1 1 2 3 1 3 2 3 1 3 1 1 1 1 2 1 1 1 3 3 2 3 3 3 3 2
##  [38] 2 2 3 1 1 1 1 2 1 1 1 1 3 2 3 1 1 1 1 3 1 3 1 3 1 3 1 1 3 3 1 1 1 3 1 2 3
##  [75] 3 3 1 3 2 3 2 1 3 1 3 3 1 3 2 2 1 1 2 3 2 3 1 3 1 3
# Suma total de cuadrados dentro de los clusters
kmeans_resultado$tot.withinss
## [1] 7561082384
# Separación entre los clusters
kmeans_resultado$betweenss
## [1] 49006812680
# Tamaño de cada cluster
kmeans_resultado$size
## [1] 43 20 37
# Número de iteraciones necesarias para la convergencia
kmeans_resultado$iter
## [1] 2

Con esto hemos concluido la práctica básica del algoritmo Kmeans, en el cual de manera arbitraría decidí generar 3 clusters, sin embargo existe un método denominado del codo, que nos permite encontrar el número adecuado de cluster de manera análitica.El cual describiremos a continuación:

Determinar el número óptimo de clusters con el Método del Codo

# Función para calcular el método del codo
set.seed(123)
inercia_total <- sapply(1:10, function(k){
  kmeans(datos_clustering, centers = k, nstart = 20)$tot.withinss
})

# Graficar el método del codo
plot(1:10, inercia_total, type = "b", pch = 19, frame = FALSE,
     xlab = "Número de clusters K",
     ylab = "Inercia total dentro del cluster",
     main = "Método del Codo para encontrar el número óptimo de Clusters")

Con esta gráfica podemos determinar el número adecuado de clusters, en este caso podemos observar que después de 4 la inercia ya no disminuye significativamente, con lo que el número adecuado de cluster es de 3, el último punto antes de estabilizarce la gráfica.Finalmente otro parametro muy importante del algoritmo K-means es nstart, este número es muy importante porque controla el número de veces que el algoritmo K-means se ejecuta con diferentes inicializaciones de centroides. La inicialización de los centroides en K-means es crucial, ya que puede afectar el resultado del agrupamiento debido a que el algoritmo puede converger a soluciones subóptimas si los centroides iniciales no están bien ubicados.

Beneficios de un valor mayor de nstart:

Evitar soluciones subóptimas: Al ejecutar el algoritmo varias veces con diferentes inicializaciones, se aumenta la probabilidad de encontrar una buena solución, ya que K-means puede quedar atrapado en mínimos locales. Resultados más robustos: Los resultados del clustering son más estables y consistentes, especialmente en datasets más complejos. De manera generales recomendable aumentar el valor de nstart cuando se trabaja con datasets grandes o complejos, o cuando se observa que el resultado varía mucho entre ejecuciones con diferentes inicializaciones.

En resumen, nstart es una medida para mejorar la calidad y la estabilidad de los resultados del algoritmo K-means al ejecutar múltiples inicializaciones y elegir la mejor solución.

Conclusión de la práctica

Con estos pasos, habrás aprendido a:

  1. Cargar una base de datos desde un archivo CSV.
  2. Seleccionar datos relevantes para aplicar el algoritmo K-means.
  3. Visualizar los clusters resultantes.
  4. Determinar el número óptimo de clusters utilizando el método del codo.

Esta práctica cubre los aspectos básicos del clustering con K-means y te permitirá explorar más sobre el agrupamiento de datos en R, con esto hemos segmentado a nuestros usuarios en tres grupos. Ahora es tu turno para aplicar esta técnica y generar agrupamientos en tus propias bases de datos.