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 .
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.
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
# 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)
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 |
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
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 |
Se construyen modelos K-Prototypes para K=2 y K-3.
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
modelo_Kprototypes_K2$prototipos_finales
modelo_Kprototypes_K2$frecuencia_cluster
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
)
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
)
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_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
modelo_Kprototypes_K3$prototipos_finales
modelo_Kprototypes_K3$frecuencia_cluster
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
)
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
)
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
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
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.