Caso de estudio
En la búsqueda de competividad, las empresas buscan brindar el mejor servicio a sus clientes y maximizar su ganancia. Es por ello que en el siguiente trabajo se analizará el comportamiento del cliente de una empresa de comestibles. Esto ayudará a la compañía a comprenderlos mejor y les facilitará la modificación de sus productos de acuerdo con las necesidades, comportamientos e inquietudes específicas de los diferentes tipos de clientes. La empresa podrá analizar qué segmento de clientes es más probable que compre tal producto y por qué medio, para luego comercializar tal producto en ese segmento en particular.
Objetivos
- Predecir qué segmentos de clientes son los que más productos compran.
- Predecir por qué medio realizan sus compras.
Conjunto de datos
El archivo “marketing_campaign.csv” contiene datos recopilados de 2440 personas de una campaña de marketing, donde nuestra tarea es predecir cómo responderán los diferentes segmentos de clientes, de las cuales se registran los siguientes atributos:
Cliente
- ID: Identificador único del cliente.
- Year_Birth: Año de nacimiento del cliente.
- Education: Nivel de educación del cliente.
- Marital_Status: Estado civil del cliente.
- Income: Ingresos familiares anuales del cliente.
- Kidhome: Número de niños en el hogar del cliente.
- Teenhome: Número de adolescentes en el hogar del cliente.
- Dt_Customer: Fecha de alta del cliente en la empresa.
- Recency: Número de días desde la última compra del cliente.
- Complain: 1 si el cliente se quejó en los últimos 2 años, 0 en caso contrario.
Productos
- MntWines: Cantidad gastada en vino en los últimos 2 años.
- MntFruits: Cantidad gastada en frutas en los últimos 2 años.
- MntMeatProducts: Cantidad gastada en carne en los últimos 2 años.
- MntFishProducts: Cantidad gastada en pescado en los últimos 2 años.
- MntSweetProducts: Cantidad gastada en dulces en los últimos 2 años.
- MntGoldProds: Cantidad gastada en oro en los últimos 2 años.
Promoción
- NumDealsPurchases: Número de compras realizadas con descuento
- AcceptedCmp1: 1 si el cliente aceptó la oferta en la 1.ª campaña, 0 en caso contrario.
- AcceptedCmp2: 1 si el cliente aceptó la oferta en la 2ª campaña, 0 en caso contrario.
- AcceptedCmp3: 1 si el cliente aceptó la oferta en la 3ra campaña, 0 en caso contrario.
- AcceptedCmp4: 1 si el cliente aceptó la oferta en la 4ª campaña, 0 en caso contrario.
- AcceptedCmp5: 1 si el cliente aceptó la oferta en la 5ª campaña, 0 en caso contrario.
- Respuesta: 1 si el cliente aceptó la oferta en la última campaña, 0 en caso contrario.
Lugar
- NumWebPurchases: Número de compras realizadas a través de la web de la empresa.
- NumCatalogPurchases: Número de compras realizadas utilizando un catálogo.
- NumStorePurchases: Número de compras realizadas directamente en las tiendas.
- NumWebVisitsMonth: Número de visitas al sitio web de la empresa en el último mes.
Pre-procesamiento de datos
Limpieza de datos
clientes1<-read.csv("marketing_campaign.csv",sep = "")
str(clientes1)
## 'data.frame': 2440 obs. of 29 variables:
## $ ID : int 5524 2174 4141 6182 5324 7446 965 6177 4855 5899 ...
## $ Year_Birth : int 1957 1954 1965 1984 1981 1967 1971 1985 1974 1950 ...
## $ Education : chr "Graduation" "Graduation" "Graduation" "Graduation" ...
## $ Marital_Status : chr "Single" "Single" "Together" "Together" ...
## $ Income : chr "58138" "46344" "71613" "26646" ...
## $ Kidhome : int 0 1 0 1 1 0 0 1 1 1 ...
## $ Teenhome : chr "0" "1" "0" "0" ...
## $ Dt_Customer : chr "04-09-2012" "08-03-2014" "21-08-2013" "10-02-2014" ...
## $ Recency : chr "58" "38" "26" "26" ...
## $ MntWines : int 635 11 426 11 173 520 235 76 14 28 ...
## $ MntFruits : int 88 1 49 4 43 42 65 10 0 0 ...
## $ MntMeatProducts : int 546 6 127 20 118 98 164 56 24 6 ...
## $ MntFishProducts : int 172 2 111 10 46 0 50 3 3 1 ...
## $ MntSweetProducts : int 88 1 21 3 27 42 49 1 3 1 ...
## $ MntGoldProds : int 88 6 42 5 15 14 27 23 2 13 ...
## $ NumDealsPurchases : int 3 2 1 2 5 2 4 2 1 1 ...
## $ NumWebPurchases : int 8 1 8 2 5 6 7 4 3 1 ...
## $ NumCatalogPurchases: int 10 1 2 0 3 4 3 0 0 0 ...
## $ NumStorePurchases : int 4 2 10 4 6 10 7 4 2 0 ...
## $ NumWebVisitsMonth : int 7 5 4 6 5 6 6 8 9 20 ...
## $ AcceptedCmp3 : int 0 0 0 0 0 0 0 0 0 1 ...
## $ AcceptedCmp4 : int 0 0 0 0 0 0 0 0 0 0 ...
## $ AcceptedCmp5 : int 0 0 0 0 0 0 0 0 0 0 ...
## $ AcceptedCmp1 : int 0 0 0 0 0 0 0 0 0 0 ...
## $ AcceptedCmp2 : int 0 0 0 0 0 0 0 0 0 0 ...
## $ Complain : int 0 0 0 0 0 0 0 0 0 0 ...
## $ Z_CostContact : int 3 3 3 3 3 3 3 3 3 3 ...
## $ Z_Revenue : int 11 11 11 11 11 11 11 11 11 11 ...
## $ Response : int 1 0 0 0 0 0 0 0 1 0 ...
Se observa que existen variables binarias y variables character. Por lo que se tendrán que eliminar, ya que el algoritmo solo trabaja con variables cuantitativas.
clientes1$ID<-NULL
clientes1$Year_Birth<-NULL
clientes1$Education<-NULL
clientes1$Marital_Status<-NULL
clientes1$Dt_Customer<-NULL
clientes1$AcceptedCmp3<-NULL
clientes1$AcceptedCmp4<-NULL
clientes1$AcceptedCmp5<-NULL
clientes1$AcceptedCmp1<-NULL
clientes1$AcceptedCmp2<-NULL
clientes1$Z_CostContact<-NULL
clientes1$Z_Revenue<-NULL
clientes1$Response<-NULL
clientes1$Complain<-NULL
summary(clientes1)
## Income Kidhome Teenhome Recency
## Length:2440 Min. : 0 Length:2440 Length:2440
## Class :character 1st Qu.: 0 Class :character Class :character
## Mode :character Median : 0 Mode :character Mode :character
## Mean : 4253
## 3rd Qu.: 1
## Max. :96547
## NA's :200
## MntWines MntFruits MntMeatProducts MntFishProducts
## Min. : 0.0 Min. : 0.00 Min. : 0.0 Min. : 0.00
## 1st Qu.: 25.0 1st Qu.: 2.00 1st Qu.: 14.0 1st Qu.: 3.00
## Median : 138.0 Median : 9.00 Median : 57.0 Median : 13.00
## Mean : 288.5 Mean : 42.39 Mean : 156.8 Mean : 45.34
## 3rd Qu.: 476.5 3rd Qu.: 38.00 3rd Qu.: 211.5 3rd Qu.: 55.00
## Max. :1493.0 Max. :1215.00 Max. :1725.0 Max. :974.00
## NA's :200 NA's :200 NA's :200 NA's :200
## MntSweetProducts MntGoldProds NumDealsPurchases NumWebPurchases
## Min. : 0.00 Min. : 0.00 Min. : 0.000 Min. : 0.000
## 1st Qu.: 1.00 1st Qu.: 7.00 1st Qu.: 1.000 1st Qu.: 2.000
## Median : 9.00 Median : 22.00 Median : 2.000 Median : 3.000
## Mean : 28.44 Mean : 42.45 Mean : 6.326 Mean : 3.929
## 3rd Qu.: 35.00 3rd Qu.: 54.00 3rd Qu.: 4.000 3rd Qu.: 6.000
## Max. :362.00 Max. :321.00 Max. :246.000 Max. :27.000
## NA's :200 NA's :200 NA's :200 NA's :200
## NumCatalogPurchases NumStorePurchases NumWebVisitsMonth
## Min. : 0.000 Min. : 0.000 Min. : 0.000
## 1st Qu.: 1.000 1st Qu.: 3.000 1st Qu.: 3.000
## Median : 2.000 Median : 5.000 Median : 6.000
## Mean : 2.817 Mean : 5.503 Mean : 5.278
## 3rd Qu.: 4.000 3rd Qu.: 8.000 3rd Qu.: 7.000
## Max. :28.000 Max. :13.000 Max. :20.000
## NA's :200 NA's :200 NA's :200
Las variables de tipo character serán convertidas en variables númericas.
clientes1$Income<-as.integer(clientes1$Income)
clientes1$Teenhome<-as.integer(clientes1$Teenhome)
clientes1$Recency<-as.integer(clientes1$Recency)
Finalmente, con estas variables serán con las cuales trabajaremos.
- Income: Ingresos familiares anuales del cliente.
- Kidhome: Número de niños en el hogar del cliente.
- Teenhome: Número de adolescentes en el hogar del cliente.
- Recency: Número de días desde la última compra del cliente.
- MntWines: Cantidad gastada en vino en los últimos 2 años.
- MntFruits: Cantidad gastada en frutas en los últimos 2 años.
- MntMeatProducts: Cantidad gastada en carne en los últimos 2 años.
- MntFishProducts: Cantidad gastada en pescado en los últimos 2 años.
- MntSweetProducts: Cantidad gastada en dulces en los últimos 2 años.
- MntGoldProds: Cantidad gastada en oro en los últimos 2 años.
- NumWebPurchases: Número de compras realizadas a través de la web de la empresa.
- NumCatalogPurchases: Número de compras realizadas utilizando un catálogo.
- NumStorePurchases: Número de compras realizadas directamente en las tiendas.
- NumWebVisitsMonth: Número de visitas al sitio web de la empresa en el último mes.
plot_str(clientes1)
Detección y eliminación de datos perdidos
plot_missing(clientes1, ggtheme = theme_bw())
colSums(is.na(clientes1))
## Income Kidhome Teenhome Recency
## 403 200 221 400
## MntWines MntFruits MntMeatProducts MntFishProducts
## 200 200 200 200
## MntSweetProducts MntGoldProds NumDealsPurchases NumWebPurchases
## 200 200 200 200
## NumCatalogPurchases NumStorePurchases NumWebVisitsMonth
## 200 200 200
Aplicando el método Caret por imputación de la mediana para los valores perdidos
RNGkind(sample.kind = "Rejection")
pre.Proc <- preProcess(clientes1, method = "medianImpute")
df_sin_na <- predict(pre.Proc, clientes1)
options(width=80)
summary(df_sin_na)
## Income Kidhome Teenhome Recency
## Min. : 0 Min. : 0 Min. :0.0000 Min. : 0.0
## 1st Qu.: 38235 1st Qu.: 0 1st Qu.:0.0000 1st Qu.: 29.0
## Median : 51518 Median : 0 Median :0.0000 Median : 50.0
## Mean : 52055 Mean : 3905 Mean :0.4648 Mean : 50.7
## 3rd Qu.: 65318 3rd Qu.: 1 3rd Qu.:1.0000 3rd Qu.: 69.0
## Max. :666666 Max. :96547 Max. :2.0000 Max. :861.0
## MntWines MntFruits MntMeatProducts MntFishProducts
## Min. : 0.0 Min. : 0.00 Min. : 0.0 Min. : 0.00
## 1st Qu.: 29.0 1st Qu.: 2.00 1st Qu.: 16.0 1st Qu.: 3.00
## Median : 138.0 Median : 9.00 Median : 57.0 Median : 13.00
## Mean : 276.1 Mean : 39.65 Mean : 148.6 Mean : 42.69
## 3rd Qu.: 437.2 3rd Qu.: 34.00 3rd Qu.: 180.0 3rd Qu.: 49.00
## Max. :1493.0 Max. :1215.00 Max. :1725.0 Max. :974.00
## MntSweetProducts MntGoldProds NumDealsPurchases NumWebPurchases
## Min. : 0.00 Min. : 0.00 Min. : 0.000 Min. : 0.000
## 1st Qu.: 2.00 1st Qu.: 8.00 1st Qu.: 1.000 1st Qu.: 2.000
## Median : 9.00 Median : 22.00 Median : 2.000 Median : 3.000
## Mean : 26.85 Mean : 40.78 Mean : 5.971 Mean : 3.852
## 3rd Qu.: 30.00 3rd Qu.: 50.00 3rd Qu.: 3.000 3rd Qu.: 5.000
## Max. :362.00 Max. :321.00 Max. :246.000 Max. :27.000
## NumCatalogPurchases NumStorePurchases NumWebVisitsMonth
## Min. : 0.00 Min. : 0.000 Min. : 0.000
## 1st Qu.: 1.00 1st Qu.: 3.000 1st Qu.: 3.000
## Median : 2.00 Median : 5.000 Median : 6.000
## Mean : 2.75 Mean : 5.462 Mean : 5.337
## 3rd Qu.: 4.00 3rd Qu.: 7.000 3rd Qu.: 7.000
## Max. :28.00 Max. :13.000 Max. :20.000
Descripción de los datos
my_dfstatus <- df_status(df_sin_na)
## variable q_zeros p_zeros q_na p_na q_inf p_inf type unique
## 1 Income 9 0.37 0 0 0 0 numeric 1803
## 2 Kidhome 1385 56.76 0 0 0 0 numeric 182
## 3 Teenhome 1359 55.70 0 0 0 0 numeric 3
## 4 Recency 25 1.02 0 0 0 0 numeric 111
## 5 MntWines 17 0.70 0 0 0 0 numeric 758
## 6 MntFruits 390 15.98 0 0 0 0 numeric 229
## 7 MntMeatProducts 14 0.57 0 0 0 0 numeric 538
## 8 MntFishProducts 366 15.00 0 0 0 0 numeric 232
## 9 MntSweetProducts 415 17.01 0 0 0 0 numeric 187
## 10 MntGoldProds 79 3.24 0 0 0 0 numeric 210
## 11 NumDealsPurchases 44 1.80 0 0 0 0 numeric 91
## 12 NumWebPurchases 52 2.13 0 0 0 0 numeric 17
## 13 NumCatalogPurchases 524 21.48 0 0 0 0 numeric 15
## 14 NumStorePurchases 76 3.11 0 0 0 0 numeric 14
## 15 NumWebVisitsMonth 31 1.27 0 0 0 0 numeric 18
Se comprueba que ya no hay valores faltantes en nuestra data.
Filtros en la columna Kidhome y TeenHome
data <- filter(df_sin_na, Kidhome<10 & Teenhome<10)
Analizar variables númericas usando gráficos
plot_num(data)
Detección de outliers
boxplot(data, col = rainbow(ncol(data)))
Se observa que la variable “Income” tiene outliers, por lo que se procede a eliminarlos.
Boxplot de la variable “Income”
caja2 <- boxplot(data$Income, col="skyblue", frame.plot=F)
Eliminación de los outliers de la variable “Income”
data<-data[!(data$Income %in% caja2$out),]
boxplot(data, col = rainbow(ncol(data)))
Se observa que se ha logrado eliminar los outliers de la variable “Income”.
Clustering Clara
Comprobar si es posible una agrupación en nuestros datos con el test estadístico de Hopkings
\(H_{0}:\) Los datos siguen una distribución uniforme (no hay grupos significativos).
\(H_{1}:\) Los datos no siguen una distribución uniforme (sí hay grupos significativos).
set.seed(123)
data<- scale(data.frame(data))
hopkins(data, n = ceiling(nrow(data)/10))
## $H
## [1] 0.09454433
El estadístico de Hopkins tiene un valor de 0.0945, como este valor es menor a 0.5, entonces se rechaza la hipotesis nula. Por lo tanto, sí existe suficiente evidencia estadística para justificar el agrupamiento en nuestros datos.
Pruebas para escoger el número de clústeres óptimos
Average silhouette method
fviz_nbclust(data, clara, method ="silhouette") + theme_classic()
Se observa que con el metodo “silhouette” la cantidad óptima de clústeres es 2.
Elbow
fviz_nbclust(x = data, FUNcluster = clara, method = "wss", k.max = 10,
diss = dist(data, method = "manhattan"))
Se observa que la mejor elección estaría en escoger 3 clústeres, ya que la varianza total intra-clase comienza a estabilizarse a partir del tercer clúster.
Función NbClust
res.nbclust <- NbClust(data, distance = "manhattan",
min.nc = 2, max.nc = 5,
method = "average", index ="all")
## [1] "Frey index : No clustering structure in this data set"
## *** : The Hubert index is a graphical method of determining the number of clusters.
## In the plot of Hubert index, we seek a significant knee that corresponds to a
## significant increase of the value of the measure i.e the significant peak in Hubert
## index second differences plot.
##
## *** : The D index is a graphical method of determining the number of clusters.
## In the plot of D index, we seek a significant knee (the significant peak in Dindex
## second differences plot) that corresponds to a significant increase of the value of
## the measure.
##
## *******************************************************************
## * Among all indices:
## * 8 proposed 2 as the best number of clusters
## * 6 proposed 3 as the best number of clusters
## * 7 proposed 4 as the best number of clusters
## * 2 proposed 5 as the best number of clusters
##
## ***** Conclusion *****
##
## * According to the majority rule, the best number of clusters is 2
##
##
## *******************************************************************
De acuerdo a los índices, hay 8 que proponen que la mejor elección para el número de clústeres es 2. Sin embargo, hay 7 índices que proponen que sean 4 clústeres y la información previa que se tiene sobre la data también indica que se pueden formar 4 clústeres. Además, a la empresa de comestibles le conviene que sean más tipos de clientes para poder dar un mejor servicio. Es por ello que el clustering CLARA se realizará con 4 clústeres.
Algoritmo
set.seed(321)
clara_clusters <- clara(x = data, k = 4, metric = "manhattan", stand = T,
samples = 50, pamLike = TRUE)
clara_clusters
## Call: clara(x = data, k = 4, metric = "manhattan", stand = T, samples = 50, pamLike = TRUE)
## Medoids:
## Income Kidhome Teenhome Recency MntWines MntFruits
## 314 0.967785348 -0.7591279 -0.8576597 -0.22081578 1.4256108 0.4485480
## 718 -1.276268564 1.1310666 -0.8576597 -0.14544246 -0.8744625 -0.5132806
## 2223 0.002496405 -0.7591279 -0.8576597 -0.01982027 -0.4835409 -0.3930521
## 144 0.841189260 -0.7591279 0.9875078 -0.09519358 0.9589293 -0.2247321
## MntMeatProducts MntFishProducts MntSweetProducts MntGoldProds
## 314 1.8879517 0.8184406 0.4884110 -0.5536194
## 718 -0.6537467 -0.5315796 -0.5106053 -0.7350123
## 2223 -0.4711938 -0.4158636 -0.4081421 -0.3923812
## 144 -0.1201305 0.1627165 0.2066372 -0.1706787
## NumDealsPurchases NumWebPurchases NumCatalogPurchases NumStorePurchases
## 314 -0.7008302 0.7732593 1.2489257 1.3675382
## 718 -0.1670125 -0.7708370 -0.9777817 -0.8900563
## 2223 -0.1670125 -0.3848129 -0.2355459 -0.2450293
## 144 0.3668053 1.5453075 0.8778078 1.0450247
## NumWebVisitsMonth
## 314 -0.9820979
## 718 0.7010674
## 2223 0.2802761
## 144 0.2802761
## Objective function: 9.221693
## Clustering vector: Named int [1:2231] 1 2 1 2 3 4 4 2 2 2 3 2 1 3 2 1 2 3 ...
## - attr(*, "names")= chr [1:2231] "1" "2" "3" "4" "5" "6" "7" ...
## Cluster sizes: 433 772 618 408
## Best sample:
## [1] 133 143 144 168 199 231 235 272 311 314 392 495 559 572 662
## [16] 665 681 704 718 727 750 754 776 786 843 845 939 947 959 963
## [31] 990 1032 1167 1231 1390 1450 1491 1565 1600 1725 1770 1786 1842 1943 1972
## [46] 2102 2223 2227
##
## Available components:
## [1] "sample" "medoids" "i.med" "clustering" "objective"
## [6] "clusinfo" "diss" "call" "silinfo" "data"
La función clara() del paquete cluster permite aplicar el algoritmo CLARA. Entre sus argumentos destaca: Una matriz numérica x donde cada fila es una observación, el número de clústeres k, la medida de distancia empleada metric (euclídea o manhattan), si los datos se tienen que estandarizar stand, el número de partes samples en las que se divide el set de datos (recomendable 50) y si se utiliza el algoritmo PAM pamLike.
Gráfico
fviz_cluster(object = clara_clusters, ellipse.type = "t", geom = "point",
pointsize = 2) +
theme_bw() +
labs(title = "Resultados clustering CLARA") +
theme(legend.position = "right")
Análisis
Medoides para los 4 clústeres
Cliente representativo en cada clúster.
clara_clusters$medoids
## Income Kidhome Teenhome Recency MntWines MntFruits
## 314 0.967785348 -0.7591279 -0.8576597 -0.22081578 1.4256108 0.4485480
## 718 -1.276268564 1.1310666 -0.8576597 -0.14544246 -0.8744625 -0.5132806
## 2223 0.002496405 -0.7591279 -0.8576597 -0.01982027 -0.4835409 -0.3930521
## 144 0.841189260 -0.7591279 0.9875078 -0.09519358 0.9589293 -0.2247321
## MntMeatProducts MntFishProducts MntSweetProducts MntGoldProds
## 314 1.8879517 0.8184406 0.4884110 -0.5536194
## 718 -0.6537467 -0.5315796 -0.5106053 -0.7350123
## 2223 -0.4711938 -0.4158636 -0.4081421 -0.3923812
## 144 -0.1201305 0.1627165 0.2066372 -0.1706787
## NumDealsPurchases NumWebPurchases NumCatalogPurchases NumStorePurchases
## 314 -0.7008302 0.7732593 1.2489257 1.3675382
## 718 -0.1670125 -0.7708370 -0.9777817 -0.8900563
## 2223 -0.1670125 -0.3848129 -0.2355459 -0.2450293
## 144 0.3668053 1.5453075 0.8778078 1.0450247
## NumWebVisitsMonth
## 314 -0.9820979
## 718 0.7010674
## 2223 0.2802761
## 144 0.2802761
Vector de clustering
Vector que contiene el clúster al que pertenece cada cliente.
head(clara_clusters$clustering,20)
## 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20
## 1 2 1 2 3 4 4 2 2 2 3 2 1 3 2 1 2 3 4 3
Medias de cada variable en cada clúster
Esto nos podría dar una descripción sobre los clientes.
aggregate(data, by=list(cluster=clara_clusters$cluster), mean)
## cluster Income Kidhome Teenhome Recency MntWines
## 1 1 1.28150542 -0.7023784 -0.712773522 -0.037169474 1.0435215
## 2 2 -0.99981110 0.9694697 -0.095213502 -0.009503624 -0.8075346
## 3 3 -0.05049273 -0.4349197 0.008195641 0.046365150 -0.3289121
## 4 4 0.60825203 -0.4301970 0.924193265 -0.012800202 0.9187245
## MntFruits MntMeatProducts MntFishProducts MntSweetProducts MntGoldProds
## 1 1.0706823 1.5888425 1.2765834 1.1431225 0.6976057
## 2 -0.4932841 -0.6365755 -0.5485923 -0.5123639 -0.5547942
## 3 -0.2503341 -0.4006251 -0.3278595 -0.3411596 -0.1589380
## 4 0.1762656 0.1251320 0.1798281 0.2730625 0.5501508
## NumDealsPurchases NumWebPurchases NumCatalogPurchases NumStorePurchases
## 1 -0.66754368 0.34622578 1.2652103 0.8759472
## 2 -0.06951466 -0.76983689 -0.7878963 -0.8892208
## 3 0.10162399 -0.05563054 -0.2391490 -0.1401341
## 4 0.68604928 1.17347547 0.5103283 0.9651868
## NumWebVisitsMonth
## 1 -1.17937419
## 2 0.56807116
## 3 0.06715684
## 4 0.07503716
Conclusiones
Los 4 perfiles de los clientes son los siguientes:
Acerca del número de clúster: 1
- Tienen mayor ingreso anual.
- Son los que menos niños y adolescentes tienen.
- Son los que compran más productos.
- Son los que menos han hecho compras con descuentos.
- Suelen comprar por la página web.
- Son los que más compran utilizando un catálogo.
- Son los que más compran en tienda física.
- Son los que menos visitan la página web.
Acerca del número de clúster: 2
- Son los que perciben menor ingreso anual.
- Son los que más niños tienen.
- Son los que compran menos productos.
- No suelen comprar con descuentos.
- Son los que menos compran por la página web.
- Son los que menos compran utilizando un catálogo.
- Son los que menos compran en tienda física.
- Son los que más visitan la página web.
Acerca del número de clúster: 3
- Perciben un bajo ingreso anual.
- No suelen tener niños, pero sí adolescentes.
- Suelen comprar pocos productos.
- Suelen comprar con descuentos.
- No suelen comprar por la página web.
- No suelen comprar utilizando un catálogo.
- No suelen comprar en tienda física.
- No visitan, usualmente, la página web.
Acerca del número de clúster: 4
- Perciben un ingreso anual estable.
- Son los que más adolescentes tienen.
- Suelen comprar moderadamente.
- Son los que más compran con descuentos.
- Son los que más compran por la página web.
- Suelen comprar utilizando un catálogo.
- Son los que más compran en tienda física.
- No visitan, usualmente, la página web.
De esta manera, la empresa de comestibles brindará un mejor servicio y atenderá las inquietudes de los diferentes tipos de clientes. Además, podrá percibir mayores ingresos.
Referencias bibliográficas
Kapoor, K. (7 de octubre de 2021). Customer Segmentation: Clustering. Kaggle. https://www.kaggle.com/code/karnikakapoor/customer-segmentation-clustering
Kassambara, A. (2018). CLARA in R : Clustering Large Applications. Data Novia. https://www.datanovia.com/en/lessons/clara-in-r-clustering-large-applications/
Rodrigo, J. A. (2017). Clustering y heatmaps: aprendizaje no supervisado. Ciencia de datos. https://www.cienciadedatos.net/documentos/37_clustering_y_heatmaps#K-medoids_clustering_(PAM)/