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.