viernes, 19 de septiembre de 2014

Segmentar Clientes con KMeans

Si se tienen datos de clientes, y se quiere agrupar los individuos más parecidos según sus atributos o variables, teniendo algo como:

















Para esto puede usarse el algoritmo KMEANS, el cual agrupa usando variables numéricas.

KMEANS sigue estos pasos:
1. Se eligen puntos en el espacio ó Centroides para cada K-Grupo (para este ejemplo K=3)
2. Se asigna cada individuo al Centroide mas cercano usando la "Distancia Euclidiana".
3. Se redefine cada Centroide con el valor medio de los individuos que ahora lo componen.
4. Con los nuevos Centroides, se vuelve a reasignar cada individuo al Centroide mas cercano.
5. Se repite el paso 3 y 4 hasta que ninguno de los individuos cambie de grupo (convergencia).

NOTAS:
• Las variables usadas para segmentar NO deben estar significativamente correlacionadas.
• Las variables deben tener misma escala para una mejor segmentacion. Ver nota "Normalizar de cero a uno un data frame" publicada AQUI
• Para saber la cantidad ideal de K ó Grupos, ver nota publicada AQUI
• Para graficar k-means con mas de 2 dimensiones, ver nota publicada AQUI



El resultado es un archivo cvs de la tabla Clientes que contiene el grupo asignado, quedando así:



















#---------------------------------------------------------------------------------
# Crea data.frame con datos de ejemplo
Clientes <- data.frame(
  Nombre=c("Juan", "Pedro", "Maria", "Isabel", "Diego", "Luis", 
           "Lucia", "Francisca", "Alejandro", "Fernando"),
  Edad=c(19, 51, 33, 30, 23, 26, 45, 43, 38, 60),
  MontoConsumo= c(971, 271, 614, 521, 585, 898, 310, 848, 979, 189)
  )
 
 
#---------------------------------------------------------------------------------
# Crea 3 Cluster o grupos usando algoritmo KMEANS
#Luego asigna grupo a cada cliente en tabla Cliente
ModeloKMEANS <- kmeans(Clientes[-1],3)
Clientes$Grupo <- ModeloKMEANS$cluster
 
#---------------------------------------------------------------------------------
#Grafica los puntos de dispersión y luego le asigna etiquetas
plot(Clientes$Edad,Clientes$MontoConsumo,
     col=Clientes$Grupo,cex.axis=.7,cex.lab=.7)
 
text(Clientes$Edad,Clientes$MontoConsumo,
     labels=Clientes$Nombre,pos=1,col=Clientes$Grupo,cex=.7)
 
#---------------------------------------------------------------------------------
# Guarda csv de Clientes con segmento de cada cliente
write.csv(Clientes,"C:/ArchivosKMEANS/Clientes_Grupos.csv")



Referencia:
http://people.revoledu.com/kardi/tutorial/kMean/EjemploNumerico.htm


7 comentarios:

  1. y una vez que tengo a cada cliente asociado su cluster, cómo puedo obtener las reglas que utiliza el k-means para realizar esta clasificación? con un árbol que explique mi variable cluster a través del resto de vbles?

    ResponderEliminar
  2. Buenas noches, respecto a la data a utilizar, como acotarlo? es decir, si tengo disponibilidad de datos de varios años, y una cantidad de clientes en el orden de 10 millones, se trabaja con todos los clientes y por ejemplo 1 año de comportamiento? o cual sería el criterio para acotarlo?, gracias

    ResponderEliminar
  3. Hola EdsonQB. El escenario ideal es hacer cluster con todos los datos. Si esto no es posible por problemas de volumen, podrías entrenar con un conjunto de datos representativos y luego predecir el resto de los clientes.

    ResponderEliminar
  4. Buenos días,
    Estoy ejecutando mi dataset para clasificar mis clientes con kmeans y qlikview, pero quisiera ejecutar con otro algoritmo para validar que la clasificación obtenida es buena y cual es la mejor opción. ¿Qué otro tipo de algoritmo me recomiendas y como lo llamo desde qlikview?

    ResponderEliminar
    Respuestas
    1. Hola Beatriz
      Para integrar R y qlikview no conozco una forma nativa de hacerlo. Hay varias tecncias usando script de qlik, aqui te dejo una opcion:
      http://qlikviewapuntes.blogspot.com/2015/03/qlikview-r-para-kmeans.html

      Para evaluar la eficiencia del cluster, tambien existen varias tecnicas, aqui te dejo algunas:
      http://apuntes-r.blogspot.com/2014/09/determinar-numero-de-cluster.html
      http://www.sthda.com/english/wiki/wiki.php?id_contents=7952

      espero te sirva

      suerte!

      Eliminar
    2. Muchas gracias, estoy aprendiendo mucho y viendo diferentes opciones. Explicas muy bien, se agradece mucho.

      Eliminar
    3. En R también puedes usar otro paquete estadístico como factoextra, el cual se baja y se aplica como librería con el mismo nombre, una vez lo das de alta, utilizas la función nbclust para verificar el número óptimo de clústeres.

      Por ejemplo:

      Codo de Jambú
      fviz_nbclust(your_data_normalized, kmeans, method = "wss", k.max = 30)

      Coeficiente Silhouette
      fviz_nbclust(your_data_normalized, kmeans, method = "silhouette", k.max = 30)

      Análisis de brecha estadística de clústeres o gap statistic
      fviz_nbclust(your_data_normalized, kmeans, method = "gap_stat", k.max = 30)

      Eliminar