Contexto

El conjunto de datos corresponde a un escenario empresarial relacionado con el comportamiento de compras de clientes de una empresa comercial que vende productos mediante distintos canales, como aplicación móvil, sitio web, tienda física y atención telefónica.

Cada registro representa a un cliente y contiene información demográfica, económica y de comportamiento de compra.

El conjunto contiene aproximadamente 1000 clientes y fue construido con la intención de simular un contexto realista de segmentación comercial. Las variables permiten analizar aspectos como:

Este tipo de información puede ser útil para campañas de mercadotecnia, fidelización de clientes, identificación de clientes en riesgo, estrategias de promoción y diseño de servicios personalizados.

El caso de estudio se puede enxcontrar en el servicoo rpubs.com en https://rpubs.com/rpizarrog/1448338

Los datos se encuentran en github.com en https://raw.githubusercontent.com/rpizarrog/Libro-Aprendizaje-Automatico.-Casos-de-Estudio-con-R-y-Python/refs/heads/main/datos/datos_clientes_kprototypes_1000.csv .

Las funciones se pueden ubicar en https://raw.githubusercontent.com/rpizarrog/Libro-Aprendizaje-Automatico.-Casos-de-Estudio-con-R-y-Python/refs/heads/main/R%20MarkDown/funciones/funciones%20para%20K-Prototypes.R .

Objetivo

Implementar modelo de clasificación K-Prototypes para identificar perfiles o segmentos de clientes a partir de variables relacionadas con el comportamiento de compras de clientes con valores numéricos y categóricos para clústeres de K=2 y K=3.

Se busca la interpretación para dos y tres gropos de clientes con similares características.

Descripcon

Cargar librerías

library(readr)        # Para conjuntos de datos
library(ggplot2)      # Gráficos
library(patchwork)    # Para tablas Word
library (psych)       # Para describir datos
library(scales)       # PAra graficos y escalas
library(clustMixType)  # Para K-Prototypes

cargar funciones

# url <- "../funciones/funciones para K-Prototypes.R" # local
url <- "https://raw.githubusercontent.com/rpizarrog/Libro-Aprendizaje-Automatico.-Casos-de-Estudio-con-R-y-Python/refs/heads/main/R%20MarkDown/funciones/funciones%20para%20K-Prototypes.R" # WEB
source (url)

cargar datos

Se cargan los datos originales y solo se utilizan las variables de interés numéricas: edad, ingreso, visitasmes, gasto; y las variables categóricas: canal ,region, satisfaccion, promocion, al final, el conjunto de datos se almacena en datos. Se presentan los primeros y últimos registros.

url <- "https://raw.githubusercontent.com/rpizarrog/Libro-Aprendizaje-Automatico.-Casos-de-Estudio-con-R-y-Python/refs/heads/main/datos/datos_clientes_kprototypes_1000.csv"
datos_originales <- f_cargar_datos(url)

variables <- c("edad", "ingreso", "visitasmes", "gasto", 
               "canal" ,"region", "satisfaccion", "promocion")

datos <- datos_originales[,variables]
f_visualizar_head_tail_reducido_word(datos)

edad

ingreso

visitasmes

gasto

...

canal

region

satisfaccion

promocion

37

27314

6

1029

...

App

Centro

Baja

Alta

33

20752

5

879

...

Tienda

Norte

Alta

Baja

58

18618

7

920

...

Web

Occidente

Baja

Media

41

19504

4

1311

...

Web

Centro

Alta

Media

22

28646

10

400

...

App

Occidente

Media

Media

43

42390

16

3699

...

App

Norte

Alta

Media

...

...

...

...

...

...

...

...

...

42

24809

2

183

...

Telefono

Occidente

Baja

Baja

47

49053

18

2887

...

App

Norte

Alta

Media

26

48145

20

3198

...

Web

Norte

Media

Media

41

13439

5

1078

...

Tienda

Sur

Media

Media

39

12892

2

817

...

Tienda

Norte

Baja

Media

26

20206

5

1549

...

Tienda

Occidente

Media

Baja

Estadísticos descriptivos

Se presentan los estadísticos descriptivos para las variables numéricas de edad, ingreso, visitasmes y gasto.

f_describir_datos(datos[,c("edad", "ingreso", "visitasmes", "gasto")])
## $describe
##            vars    n     mean       sd  median  trimmed      mad  min   max
## edad          1 1000    37.78    11.20    37.0    37.20    11.86   18    75
## ingreso       2 1000 27185.34 11889.12 24830.5 26195.05 10636.91 5000 70936
## visitasmes    3 1000     7.85     4.93     7.0     7.51     5.93    0    22
## gasto         4 1000  1592.78  1098.94  1294.0  1464.47   902.90  100  5245
##            range skew kurtosis     se
## edad          57 0.51     0.00   0.35
## ingreso    65936 0.74     0.06 375.97
## visitasmes    22 0.50    -0.59   0.16
## gasto       5145 0.96     0.03  34.75
## 
## $structure
## [1] "'data.frame':\t1000 obs. of  4 variables:\n $ edad      : num  37 33 58 41 22 43 20 33 57 70 ...\n $ ingreso   : num  27314 20752 18618 19504 28646 ...\n $ visitasmes: num  6 5 7 4 10 16 5 4 1 2 ...\n $ gasto     : num  1029 879 920 1311 400 ..."

Las variables categóricas se hacen de tipo factor con la finalidad de conocer su frecuencia.

datos <- f_convertir_factor(datos)
f_summary_factores(datos)
##       canal           region    satisfaccion promocion  
##  App     :302   Centro   :340   Alta :342    Alta :409  
##  Telefono: 93   Norte    :216   Baja :228    Baja :272  
##  Tienda  :346   Occidente:219   Media:430    Media:319  
##  Web     :259   Sur      :225
resultado_frecuencias <- f_frecuencias(
  datos = datos
)

resultado_frecuencias$grafico

Estandarización de datos numéricos

Se estandarizan todas la variables numéricas y se dejan en un conjunto de datos llamado datos_estandarizados. Se muestran los primeros y últimos registros de los datos estandarizados al igual que las primeras cuatro y últimas cuatro columnas.

resultados <- f_estandarizar(datos)
datos_estandarizados <- resultados$datos_estandarizados
f_visualizar_head_tail_reducido_word(f_redondear_datos(datos_estandarizados, 4))

edad

ingreso

visitasmes

gasto

...

canal

region

satisfaccion

promocion

-0.0696

0.0108

-0.3754

-0.513

...

App

Centro

Baja

Alta

-0.4269

-0.5411

-0.5783

-0.6495

...

Tienda

Norte

Alta

Baja

1.8062

-0.7206

-0.1725

-0.6122

...

Web

Occidente

Baja

Media

0.2877

-0.6461

-0.7813

-0.2564

...

Web

Centro

Alta

Media

-1.4094

0.1229

0.4363

-1.0854

...

App

Occidente

Media

Media

0.4663

1.2789

1.6539

1.9166

...

App

Norte

Alta

Media

...

...

...

...

...

...

...

...

...

0.377

-0.1999

-1.1871

-1.2828

...

Telefono

Occidente

Baja

Baja

0.8236

1.8393

2.0597

1.1777

...

App

Norte

Alta

Media

-1.0521

1.7629

2.4656

1.4607

...

Web

Norte

Media

Media

0.2877

-1.1562

-0.5783

-0.4684

...

Tienda

Sur

Media

Media

0.1091

-1.2022

-1.1871

-0.7059

...

Tienda

Norte

Baja

Media

-1.0521

-0.587

-0.5783

-0.0398

...

Tienda

Occidente

Media

Baja

Desarrollo

Se construyen modelos K-Prototypes para K=2 y K-3.

Modelo K-Prototypes K=2

modelo_Kprototypes_K2 <- f_crear_KPrototypes (datos_estandarizados, variables, k = 2, iter_max = 50, semilla = 2026)
## # NAs in variables:
##         edad      ingreso   visitasmes        gasto        canal       region 
##            0            0            0            0            0            0 
## satisfaccion    promocion 
##            0            0 
## 0 observation(s) with NAs.
## 
## Estimated lambda: 1.451572

Resultados K=2

modelo_Kprototypes_K2$prototipos_finales

Frecuencia por cluster

modelo_Kprototypes_K2$frecuencia_cluster

Dispersión de pares de variables numéricas K-Prototypes K=2

Se manda llamar la función f_dispersion_variables_clusters() y se observan las dispersiones de pares de variables numéricas identificando los grupos formados.

Se muestran combinaciones de pares de las variables, edad, ingreso, visitasmes, gasto, que son las variables numéricas.

Se puede apreciar que el clúster 1 son clientes de mayor valor comercial. Porque presentan mayor ingreso, mayor gasto y más frecuencia de visitas; tal vez mayor actividad de compra. Una etiqueta adecuada podría ser: clientes de alto valor o alta actividad comercial.

El clúster 2 se puede interpretar como: clientes de menor actividad o menor valor comercial, porque presentan, en promedio: menor ingreso; menor gasto; menor frecuencia de visitas; menor intensidad de relación con la empresa. Una etiqueta adecuada podría ser: clientes de bajo consumo o actividad moderada-baja.

La edad no es significativa en el modelo.

datos_estandarizados$cluster_kprototypes <- modelo_Kprototypes_K2$cluster

variables_numericas <- c("edad", "ingreso", "visitasmes", "gasto")

f_dispersion_variables_clusters(
  datos = datos_estandarizados,
  variable_cluster = "cluster_kprototypes",
  variables = variables_numericas,
  centroides = modelo_Kprototypes_K2$prototipos_finales[,variables_numericas],
  titulo = "K-Prototypes: dispersión por pares de variables numéricas. K=3",
  ncol = 3
)

Diagramas de cajas K-Prototypes para variables numéricas K=2

Se manda llamar la función f_diagramas_cajas(), se observan de manera más amigable los grupos y se observan algunas incidencias: las variables con valores altos en ingreso, gasto y visitasmes de compra son representativas para el cluster 1, y con valores a la inversa (bajos), representan al cluster 2. La edad no se observa tan representativa.

f_diagramas_cajas(
  datos = datos_estandarizados,
  variable_cluster = "cluster_kprototypes",
  variables = variables_numericas,
  titulo = "K-Prototypes: comparación de variables numéricas por clúster. K=3",
  ncol = 2
)

Frecuencias por cluster K=2

Se observa en el GRAFICO de la frecuencia de las variables categóricas que en el clúster 1, existen clientes digitales de alto valor y alta satisfacción; el clúster se caracteriza por: mayor uso de App y Web; alta respuesta a promociones; alta satisfacción; mayor presencia en región Centro y Norte.

Si se combina con la gráfica de variables numéricas, este mismo clúster también presentaba mayores niveles de ingreso, gasto y visitas mensuales. Por tanto, puede interpretarse como: clientes digitales de alto valor comercial, satisfechos y con alta respuesta promocional.

Con respecto al clúster 2, son clientes presenciales de menor compromiso, se caracteriza por: mayor uso de tienda; respuesta promocional media o baja; satisfacción media o baja; mayor presencia relativa en región Sur y Occidente.

Combinado con la gráfica numérica, este grupo también mostraba menores niveles de ingreso, visitas y gasto. Por tanto, puede interpretarse como: clientes presenciales o de menor actividad comercial, con satisfacción moderada o baja y menor respuesta promocional.

variables_categoricas <- c("canal", "region", "satisfaccion", "promocion")

resultado_visual <- f_visualizar_clusters_categoricos(
  datos = datos_estandarizados,
  variable_cluster = "cluster_kprototypes",
  variables = variables_categoricas,
  ncol = 2,
  titulo = "Distribución porcentual de variables categóricas por clúster K Prototypes. K=2"
)

resultado_visual$grafico

Modelo K-Prototypes K=3

modelo_Kprototypes_K3 <- f_crear_KPrototypes (datos_estandarizados, variables, k = 3, iter_max = 50, semilla = 2026)
## # NAs in variables:
##         edad      ingreso   visitasmes        gasto        canal       region 
##            0            0            0            0            0            0 
## satisfaccion    promocion 
##            0            0 
## 0 observation(s) with NAs.
## 
## Estimated lambda: 1.451572

Resultados K=3

modelo_Kprototypes_K3$prototipos_finales

Frecuencia por cluster

modelo_Kprototypes_K3$frecuencia_cluster

Dispersión de pares de variables numéricas K-Prototypes K=3

Se manda llamar la función f_dispersion_variables_clusters() y se observan las dispersiones de pares de variables numéricas identificando los grupos formados.

Se muestran combinaciones de pares de las variables, edad, ingreso, visitasmes, gasto, que son las variables numéricas.

El clúster 1 identifica clientes de alto valor, se ubica principalmente en la zona superior de las gráficas relacionadas con ingreso, visitasmes y gasto.

Se observa que ingreso vs gasto; visitasmes vs gasto y ingreso vs visitasmes el grupo representa clientes con mayor ingreso, mayor frecuencia de visitas y mayor gasto promedio. Una posible etiqueta que describe a este cluster 1 sería: clientes de alto valor comercial.

Un clúster 2 son clientes de bajo valor o baja actividad. se concentra en valores bajos de: ingreso, visitasmes y gasto. Aparece en la parte inferior de las gráficas ingreso vs gasto y visitasmes vs gasto. Este grupo representa clientes con menor capacidad de consumo, menor interacción mensual y menor gasto promedio; una etiqueta posible sería: clientes de baja actividad comercial.

El clúster 3 representa un punto intermedio, son clientes precisamente con valores medios; el clúster 3 aparece entre los clústeres 1 y 2. No tiene los valores altos del clúster 1, pero tampoco cae tan bajo como el clúster 2. Este grupo parece representar clientes con: ingreso medio; visitas moderadas; gasto medio o moderado y comportamiento comercial intermedio. Una etiqueta posible y sugerida pudiera ser:clientes de valor medio o actividad moderada.

Las variables que más separan los clústeres gasto, ingreso y vistasmes con valores altos. La edad al igual que en K=2, no parece ser la variable principal de separación. En los gráficos donde aparece edad, los tres clústeres se traslapan bastante. Esto indica que clientes de distintas edades pueden pertenecer a cualquiera de los grupos. En cambio, las variables de comportamiento económico y comercial separan mejor los clústeres.

datos_estandarizados$cluster_kprototypes <- modelo_Kprototypes_K3$cluster

variables_numericas <- c("edad", "ingreso", "visitasmes", "gasto")

f_dispersion_variables_clusters(
  datos = datos_estandarizados,
  variable_cluster = "cluster_kprototypes",
  variables = variables_numericas,
  centroides = modelo_Kprototypes_K3$prototipos_finales[,variables_numericas],
  titulo = "K-Prototypes: dispersión por pares de variables numéricas K=3",
  ncol = 3
)

Diagramas de cajas K-Prototypes para variables numéricas K=3

Se manda llamar la función f_diagramas_cajas(), se observan de manera más amigable los grupos y se observan algunas incidencias: las variables con valores altos en ingreso, gasto y visitasmes de compra son representativas para el cluster 1, y con valores bajos, representan al cluster 2. De manera intermedia se observa el cluster 3 con valores intermedios. La edad no se observa tan representativa.

f_diagramas_cajas(
  datos = datos_estandarizados,
  variable_cluster = "cluster_kprototypes",
  variables = variables_numericas,
  titulo = "K-Prototypes: comparación de variables numéricas por clúster K=3",
  ncol = 2
)

Frecuencias por cluster K=3

El clúster 1 se caracteriza por el uso principal de como canal de compra la App; *alta satisfacción; alta respuesta promocional y presencia en Centro y Norte. Esto sugiere un perfil de clientes digitales satisfechos y de buena respuesta comercial. Si se combina y mezcla la gráfica de variables numéricas descritas, probablemente coincide con el grupo de alto valor comercial. La etiqueta sugerida sería clientes digitales de alto valor comnercial

En el clúster 2 los atributos son fuerte predominio de Tienda; mayor presencia en Sur; respuesta promocional baja y satisfacción media/baja. Este grupo parece ser el de menor compromiso comercial. Etiqueta sugerida: clientes presenciales de bajo compromiso o también clientes tradicionales con menor respuesta comercial

El clúster 3, se caracteriza por: predominio de Web; alta respuesta a promociones; satisfacción principalmente media y fuerte presencia en Centro. Este grupo parece intermedio: no tan fuerte como el clúster 1 en satisfacción, pero sí muy atractivo en promociones. La clasificación sugerida sería clientes web promocionales de valor medio.

variables_categoricas <- c("canal", "region", "satisfaccion", "promocion")

resultado_visual <- f_visualizar_clusters_categoricos(
  datos = datos_estandarizados,
  variable_cluster = "cluster_kprototypes",
  variables = variables_categoricas,
  ncol = 2,
  titulo = "Distribución porcentual de variables categóricas por clúster K Prototypes K=3"
)

resultado_visual$grafico

Evalaucuón de modelos

Al evaluar modelos, \(K=3\) disminuye el costo de 5308.435 a 4440.249 una diferencia de 868.186; además de que al observar las interpretaciones en ambos modelos el modelo con \(K=3\) es mas detallado y específico en la formualación de clústeres; sin embargo el lector científico de datos tienen la última palabra en la elección y definición de clusteres e interpretación de resultaados.

resultado_costo_KPrototypes <- f_evaluar_costo_KPrototypes(
  modelos = list(
    modelo_Kprototypes_K2,
    modelo_Kprototypes_K3
  ),
  nombres_modelos = c(
    "K-Prototypes K=2",
    "K-Prototypes K=3"
  ),
  graficar = TRUE,
  titulo = "Evaluación del costo en K-Prototypes K=2 y K=3"
)

resultado_costo_KPrototypes$tabla_costos
resultado_costo_KPrototypes$grafico

Interpretación del caso

Se construyó modelo de clustering K-Prototypes con un conjunto de datos relacionados con el comportamiento de compras de clientes. La estrucutura de los datos de mil registros se compone de: cuatro variables numéricas: edad. ingreso, visitasmes y gasto; cuatro variables categóricas: canal, region, satisfaccion y prompocion.

El caso de estudio cumple con objetivo planteado de implementar para dis y tres clústeres.

Con respecto a K=2 el modelo distingue entre clientes con un alto valor comercial y cliente que no lo son

Con respecto a K=3 el modelo hace mas fina la clasificación para clientes con alto valor comercial, bajo yn un tercer lo clasifica como moderado.

Con respecto a la valoración de responder a la pregunta ¿cuál modelo es mejor entre \(K=2\) y \(K=3\) para el algoritmo K-Prototypes con estos datos?, el modelo sugerido es K=3 comparado contra K=2.

Al final el caso de estudio aquì presentado de K-Prototypes puede servir y ser útil al modificar y experimentar con otra la cantidad de clusteres diferentes y la posibilidad de reutilizar las funciones para otros datos y encontrar resultados comparativos personalziados por el lector.