Descripción

Para el presente trabajo vamos a utilizar resultados previos del Análisis de Componentes Principales. Como se está analizando la variable Response, tomaremos las variables que estan correlacionadas (positivamente y negativamente).

Tenemos correlaciones positivas por ejemplo MntWines, MntMeatProducts, NumCatalogPurchases y NumWebPurchases y podemos decir que cuanto mayores sean los valores de estas variables, mayores serán las posibilidades de que un cliente acepte una oferta.

Para correlaciones negativas, variables como Recency, Teenhome, y Kidhome donde cuanto más bajos sean los valores de estas características, mayores serán las posibilidades de que un cliente acepte una oferta.

Ahora, procedemos con la lectura de los datos, selección de los datos previamente especificados y de ser necesario la corrección del tipo de dato.

data_r1 <- datos_marketing
data_r1$Response<-ifelse(data_r1$Response=="No acepta",0,1)
data_r1$Response <- as.numeric(data_r1$Response)

Análisis de Clusters

Cuando hablamos de clusters nos referimos a las distintas técnicas (no supervisadas) que sirven para encontrar patrones o grupos dentro de un connjutno de observaciones. Se busca que estas observaciones sean los mas parecidad entre ellas y se diferencien significativamente entre los otros grupos. Consideraremos métodos que requieren de antemano que el usuario especifique un número de clusters que se va a crear y tambien uno que no requiere que el usuario especifique el número de clusters.

Con los datos previamente tratados, vamos a comenzar a realizar los clusters mediante los métodos de: k-means, k-medoides e Hierarchical Clustering

K-means

Este método agrupa las observaciones en K clusters distintos y de este modo se busca que la varianza dentro de los clusters sea lo mas pequeña posible. Cada cluster es representado por un centroide, que es el promedio de todas las observaciones del cluster.

Ahora, realizando esto con nuestros datos:

library(factoextra)
## Welcome! Want to learn more? See two factoextra-related books at https://goo.gl/ve3WBa
fviz_nbclust(x = data_r1, FUNcluster = kmeans, method = "wss", k.max = 15, 
             diss = get_dist(data_r1, method = "euclidean"), nstart = 50)

Podemos observar que en k=4 parece estabilizarse por eso se toma ese número de clusters y por tanto ese será el número de clusters que usaremos.

set.seed(123)
km_clusters <- kmeans(x = data_r1, centers = 4, nstart = 50)

# Las funciones del paquete factoextra emplean el nombre de las filas del
# dataframe que contiene los datos como identificador de las observaciones.
# Esto permite añadir labels a los gráficos.
fviz_cluster(object = km_clusters, data = data_r1, show.clust.cent = TRUE,
             ellipse.type = "euclid", star.plot = TRUE, repel = TRUE) +
  labs(title = "Resultados clustering K-means") +
  theme_bw() +
  theme(legend.position = "none")
## Warning: ggrepel: 2 unlabeled data points (too many overlaps). Consider
## increasing max.overlaps

K-medoides

Este método es muy similar al método de k-means en el sentido de que ambos agrupan las observaciones en K clusters con la diferencia de que en este método el cluster está representado por una observación presente en el cluster (medoid).

Ahora, con nuestros datos:

library(cluster)
library(factoextra)
fviz_nbclust(x = data_r1, FUNcluster = pam, method = "wss", k.max = 15,
             diss = dist(data_r1, method = "manhattan"))

set.seed(123)
pam_clusters <- pam(x = data_r1, k = 4, metric = "manhattan")
pam_clusters
## Medoids:
##      ID MntWines MntMeatProducts NumCatalogPurchases NumWebPurchases Recency
## 1406 58      248              81                   1               7      62
## 1188  9       12              13                   0               3      52
## 259   5      823             459                   6               6      10
## 1694 82      532             490                   5               5      75
##      Teenhome Kidhome Response
## 1406        0       0        0
## 1188        1       1        0
## 259         0       0        1
## 1694        0       0        1
## Clustering vector:
## 1539  887  718 2229  259 1771  340 1176 1188 1596 1519 2095 1530  292 1579 1709 
##    1    2    2    2    3    4    1    2    2    3    4    1    1    3    4    2 
## 2177  564 1253  582 1688 1745 1008   26  337 2007  533 1595  258  871 1831 1106 
##    4    2    2    1    4    2    2    2    2    4    1    2    3    1    3    1 
##  398  838  809 1841 1795  729 1759 2235 2058  635 2239 1794 1411  223  315 1162 
##    2    4    2    3    2    2    3    1    3    2    4    2    2    3    1    3 
## 1797  517 1959  239 1178 1175 1773 1804 1996 1406 1606  280 2234  806  811 2168 
##    2    2    1    1    4    2    4    2    1    1    1    2    2    4    3    4 
## 1612 1700 1370  448 2010 1877  639  827 1108   65  250 1069 1485  471  966 1309 
##    3    4    3    2    2    2    1    1    3    1    4    4    2    3    1    2 
## 1815 1694   59 1423 1803  112  599 1248 1522  813 2034 1364 1912 1134 1939 
##    3    4    4    1    2    2    1    2    2    1    2    1    1    2    4 
## Objective function:
##    build     swap 
## 194.0632 190.9053 
## 
## Available components:
##  [1] "medoids"    "id.med"     "clustering" "objective"  "isolation" 
##  [6] "clusinfo"   "silinfo"    "diss"       "call"       "data"

De manera similar, podemos observar que en k=4 parece estabilizarse por eso se toma ese número de clusters y por tanto ese será el número de clusters que usaremos.

fviz_cluster(object = pam_clusters, data = data_r1, ellipse.type = "t",
             repel = TRUE) +
  theme_bw() +
  labs(title = "Resultados clustering PAM") +
  theme(legend.position = "none")
## Warning: ggrepel: 15 unlabeled data points (too many overlaps). Consider
## increasing max.overlaps

Hierarchical clustering

A diferencia de los métodos de partitioning clustering, en este caso usaremos el método divise clustering donde iniciamos con todas las observaciones contenidas en un mismo cluster y se creand divisiones hasta que se crean un cluster individual.

set.seed(123)

hc_euclidea_completo <- hclust(d = dist(x = data_r1, method = "euclidean"),
                               method = "complete")

fviz_dend(x = hc_euclidea_completo, k = 4, cex = 0.6) +
  geom_hline(yintercept = 5.5, linetype = "dashed") +
  labs(title = "Herarchical clustering",
       subtitle = "Distancia euclídea, Lincage complete, K=4")

fviz_cluster(object = list(data=data_r1, cluster=cutree(hc_euclidea_completo, k=4)),
             ellipse.type = "convex", repel = TRUE, show.clust.cent = FALSE,
             labelsize = 8)  +
  labs(title = "Hierarchical clustering + Proyección PCA",
       subtitle = "Distancia euclídea, Lincage complete, K=4") +
  theme_bw() +
  theme(legend.position = "bottom")

Conclusiones

Como pudimos observar en los tres métodos, los datos siempre se agrupaban de 4 clusters y esto puede deberse a que un cliente puede tener las características de un grupo este no pertenece a dicho grupo. Y de este modo se tienen 4 grupos distintos (basandonos en la correlación que existe entre la variable Response y las Variables MntWines, MntMeatProducts, NumCatalogPurchases, NumWebPurchases, Recency, Teenhome, y Kidhome):

  • Los clientes que tienen altas oportunidades de pertenecer al grupo que acepta la última publicidad y aceptan.

  • Los clientes que tienen altas oportunidades de pertenecer al grupo que acepta la última publicidad y NO aceptan.

  • Los clientes que tienen bajas oportunidades de pertenecer al grupo que acepta la última publicidad y aceptan.

  • Los clientes que tienen bajas oportunidades de pertenecer al grupo que acepta la última publicidad y NO aceptan.