Grupo 1

Presentado por

Cabanillas Atto, Jadira Milagre ()

Campuzano Galarza, Sofia Gabriela ()

CCollana Orosco, Jorge Alberto ()

Chucas Mera, Ana Lisset ()

3 de julio de 2022

Departamento académico de Estadística e Informática - Mg. Jesús Salinas Flores

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