K-MEANS CLUSTERING
Importar la base de datos
Se escoge la base de datos que se trabajara.
file.choose()
bd12 <- read.csv("C:\\Users\\sofia\\OneDrive\\Documentos\\datos_clientes.csv")
Agregar el CustomerID como nombre de los renglones
bd13 <- bd12
rownames(bd13)<- bd13$CustomerID
Eliminar la columna de CustomerID
bd14 <- bd13
bd14 <- subset (bd14, select = -c (CustomerID))
Revisar presencia de datos anormales
summary(bd14)
## Total Visitas
## Min. : 3.45 Min. : 1.000
## 1st Qu.: 178.30 1st Qu.: 1.000
## Median : 292.00 Median : 2.000
## Mean : 415.62 Mean : 4.227
## 3rd Qu.: 426.63 3rd Qu.: 5.000
## Max. :84236.25 Max. :209.000
plot(bd14$Total,bd14$Visitas)

Los datos fuera de lo normal están fuera de los siguientes
límites:
Límite Inferior = Q1 - 1.5IQR
Límite Superior = Q3 + 1.5IQR
Q1: Cuartil 1, Q3: Cuartil 3, IQR: Rango Intercuartil = Q3 - Q1
Calcular el Límite Superior del Total
iqr_total <- IQR(bd14$Total)
limite_superior_total <- 426.63 + 1.5*iqr_total
limite_superior_total
## [1] 799.1277
Conservar sólo los Tickets Promedios menores a 800
bd15 <- bd14
bd15 <- bd15[bd15$Total < 800, ]
summary(bd15)
## Total Visitas
## Min. : 3.45 Min. : 1.000
## 1st Qu.:172.96 1st Qu.: 1.000
## Median :272.23 Median : 2.000
## Mean :298.21 Mean : 4.125
## 3rd Qu.:390.24 3rd Qu.: 5.000
## Max. :799.62 Max. :209.000
Calcular el Límite Superior de las Visitas
iqr_visitas <- IQR(bd14$Visitas)
limite_superior_visitas <- 5 + 1.5*iqr_visitas
limite_superior_visitas
## [1] 11
Conservar sólo las Visitas menores a 12
bd16<-bd15
bd16 <- bd16[bd16$Visitas < 12, ]
summary(bd16)
## Total Visitas
## Min. : 3.45 Min. : 1.000
## 1st Qu.:168.67 1st Qu.: 1.000
## Median :267.13 Median : 2.000
## Mean :293.99 Mean : 2.971
## 3rd Qu.:384.80 3rd Qu.: 4.000
## Max. :799.62 Max. :11.000
plot(bd16$Total,bd16$Visitas)

k-means Clustering
Paso 1. Normalizar variables
bd17 <- bd16
bd17 <- as.data.frame(scale(bd17))
plot(bd17$Total,bd17$Visitas)

Paso 2. k-means Clustering
segmentos <- kmeans(bd17, 3)
segmentos
asignacion <- cbind(bd16, cluster = segmentos$cluster)
head(asignacion,10)
## Total Visitas cluster
## 12347 615.7143 7 3
## 12350 334.4000 1 2
## 12352 313.2550 8 3
## 12353 89.0000 1 2
## 12355 459.4000 1 1
## 12358 584.0300 2 1
## 12361 189.9000 1 2
## 12362 522.6230 10 3
## 12363 276.0000 2 2
## 12364 328.2750 4 2
Exportar csv
write.csv(asignacion,"clientes_segmentados.csv")
Visualizar Segmentos
install.packages(“factoextra”)
library(factoextra)
## Loading required package: ggplot2
## Welcome! Want to learn more? See two factoextra-related books at https://goo.gl/ve3WBa
fviz_cluster(segmentos, data = bd17,
palette=c("red", "blue", "black", "darkgreen"),
ellipse.type = "euclid",
star.plot = T,
repel = T,
ggtheme = theme())
## Warning: ggrepel: 3734 unlabeled data points (too many overlaps). Consider
## increasing max.overlaps

Optimizar k
library(cluster)
library(data.table)
set.seed(123)
optimizacion <- clusGap(bd17, FUN = kmeans, nstart = 25, K.max = 10, B = 50)
## Warning: did not converge in 10 iterations
## Warning: did not converge in 10 iterations
## Warning: did not converge in 10 iterations
## Warning: did not converge in 10 iterations
## Warning: did not converge in 10 iterations
## Warning: did not converge in 10 iterations
## Warning: did not converge in 10 iterations
## Warning: did not converge in 10 iterations
## Warning: did not converge in 10 iterations
## Warning: did not converge in 10 iterations
## Warning: did not converge in 10 iterations
## Warning: did not converge in 10 iterations
plot(optimizacion, xlab = "Numero de clusters k")

Conclusiones
En la base de datos se realizó una segmentación de mercado en base a
la frecuencia de clientes al supermercado, asi como tambien la cantidad
total por cada ticket, en este caso obtuvimos 3 clusters. Las
recomendaciones para realizar un K-means Clustering, es revisar los
datos y eliminar, agregar o modificar de la base de datos para que se
pueda correr el programa. Tambien es muy importante el despues de
realizar el Clustring, optomizar la K y realizar el plot.
La estrategia propuesta para el supermercado es realizar una campaña de
marketing digital por medio de correos en los que a cada segmento de
cliente en específico, hacerles promociones por los productos que mas
compran cada uno y adaptados también a los precios que normalmente
compran. Además de mandar cupones cada semana con cierto tiempo
limitado.
LS0tDQp0aXRsZTogPHNwYW4gc3R5bGU9IkNvbG9yOkdyYXkiPiJTVVBFUk1FUkNBRE8tS01FQU5TQ0xVU1RFUklORyINCmF1dGhvcjogIkFuYSBBcnZpenUtIEEwMTQxMjIyMCINCmRhdGU6ICIyMDIyLTA5LTA4Ig0Kb3V0cHV0OiANCiAgaHRtbF9kb2N1bWVudDoNCiAgICB0b2M6IHRydWUNCiAgICB0b2NfZmxvYXQ6IHRydWUNCiAgICBjb2RlX2Rvd25sb2FkOiB0cnVlDQotLS0NCg0KIVtdKGh0dHBzOi8vd3d3LnVuaXIubmV0L3dwLWNvbnRlbnQvdXBsb2Fkcy8yMDIxLzAyL01hcmtldDItMS5wbmcpDQojIyAiRWwgZ2VuZXJhZG9yIGRlIHZhbG9yIGRlIGRhdG9zIg0KPGltZyBzcmM9IkM6XFxVc2Vyc1xcc29maWFcXERvd25sb2Fkc1xcTWluZCBNYXBwaW5nIENyZWF0aXZlIFRoaW5raW5nIFRpcHMgSW5mb2dyYXBoaWMgR3JhcGggKDMpLnBuZyI+DQoNCiMjIEstTUVBTlMgQ0xVU1RFUklORw0KDQojIyMgSW1wb3J0YXIgbGEgYmFzZSBkZSBkYXRvcw0KDQo+IFNlIGVzY29nZSBsYSBiYXNlIGRlIGRhdG9zIHF1ZSBzZSB0cmFiYWphcmEuDQoNCmZpbGUuY2hvb3NlKCkNCmBgYHtyfQ0KYmQxMiA8LSByZWFkLmNzdigiQzpcXFVzZXJzXFxzb2ZpYVxcT25lRHJpdmVcXERvY3VtZW50b3NcXGRhdG9zX2NsaWVudGVzLmNzdiIpDQpgYGANCg0KIyMjIEFncmVnYXIgZWwgQ3VzdG9tZXJJRCBjb21vIG5vbWJyZSBkZSBsb3MgcmVuZ2xvbmVzDQpgYGB7cn0NCmJkMTMgPC0gYmQxMg0Kcm93bmFtZXMoYmQxMyk8LSBiZDEzJEN1c3RvbWVySUQNCmBgYA0KDQojIyMgRWxpbWluYXIgbGEgY29sdW1uYSBkZSBDdXN0b21lcklEDQpgYGB7cn0NCmJkMTQgPC0gYmQxMw0KYmQxNCA8LSBzdWJzZXQgKGJkMTQsIHNlbGVjdCA9IC1jIChDdXN0b21lcklEKSkNCmBgYA0KDQojIyMgUmV2aXNhciBwcmVzZW5jaWEgZGUgZGF0b3MgYW5vcm1hbGVzDQpgYGB7cn0NCnN1bW1hcnkoYmQxNCkNCnBsb3QoYmQxNCRUb3RhbCxiZDE0JFZpc2l0YXMpDQpgYGANCg0KTG9zIGRhdG9zIGZ1ZXJhIGRlIGxvIG5vcm1hbCBlc3TDoW4gZnVlcmEgZGUgbG9zIHNpZ3VpZW50ZXMgbMOtbWl0ZXM6ICANCkzDrW1pdGUgSW5mZXJpb3IgPSBRMSAtIDEuNSpJUVIgIA0KTMOtbWl0ZSBTdXBlcmlvciA9IFEzICsgMS41KklRUiAgDQpRMTogQ3VhcnRpbCAxLCBRMzogQ3VhcnRpbCAzLCBJUVI6IFJhbmdvIEludGVyY3VhcnRpbCA9IFEzIC0gUTEgIA0KDQojIyMgQ2FsY3VsYXIgZWwgTMOtbWl0ZSBTdXBlcmlvciBkZWwgVG90YWwNCmBgYHtyfQ0KaXFyX3RvdGFsIDwtIElRUihiZDE0JFRvdGFsKQ0KbGltaXRlX3N1cGVyaW9yX3RvdGFsIDwtIDQyNi42MyArIDEuNSppcXJfdG90YWwNCmxpbWl0ZV9zdXBlcmlvcl90b3RhbA0KYGBgDQoNCiMjIyBDb25zZXJ2YXIgc8OzbG8gbG9zIFRpY2tldHMgUHJvbWVkaW9zIG1lbm9yZXMgYSA4MDANCmBgYHtyfQ0KYmQxNSA8LSBiZDE0DQpiZDE1IDwtIGJkMTVbYmQxNSRUb3RhbCA8IDgwMCwgXQ0Kc3VtbWFyeShiZDE1KQ0KYGBgDQoNCiMjIyBDYWxjdWxhciBlbCBMw61taXRlIFN1cGVyaW9yIGRlIGxhcyBWaXNpdGFzDQpgYGB7cn0NCmlxcl92aXNpdGFzIDwtIElRUihiZDE0JFZpc2l0YXMpDQpsaW1pdGVfc3VwZXJpb3JfdmlzaXRhcyA8LSA1ICsgMS41Kmlxcl92aXNpdGFzDQpsaW1pdGVfc3VwZXJpb3JfdmlzaXRhcw0KYGBgDQoNCiMjIyBDb25zZXJ2YXIgc8OzbG8gbGFzIFZpc2l0YXMgbWVub3JlcyBhIDEyDQpgYGB7cn0NCmJkMTY8LWJkMTUNCmJkMTYgPC0gYmQxNltiZDE2JFZpc2l0YXMgPCAxMiwgXQ0KDQpzdW1tYXJ5KGJkMTYpDQpwbG90KGJkMTYkVG90YWwsYmQxNiRWaXNpdGFzKQ0KYGBgDQoNCiMjIyBrLW1lYW5zIENsdXN0ZXJpbmcNCg0KIyMjIFBhc28gMS4gTm9ybWFsaXphciB2YXJpYWJsZXMNCg0KYGBge3J9DQpiZDE3IDwtIGJkMTYNCmJkMTcgPC0gYXMuZGF0YS5mcmFtZShzY2FsZShiZDE3KSkNCg0KcGxvdChiZDE3JFRvdGFsLGJkMTckVmlzaXRhcykNCmBgYA0KDQojIyMgUGFzbyAyLiBrLW1lYW5zIENsdXN0ZXJpbmcNCmBgYHtyfQ0Kc2VnbWVudG9zIDwtIGttZWFucyhiZDE3LCAzKQ0KYGBgDQpzZWdtZW50b3MNCmBgYHtyfQ0KYXNpZ25hY2lvbiA8LSBjYmluZChiZDE2LCBjbHVzdGVyID0gc2VnbWVudG9zJGNsdXN0ZXIpDQpoZWFkKGFzaWduYWNpb24sMTApDQpgYGANCg0KIyMjIEV4cG9ydGFyIGNzdg0KYGBge3J9DQp3cml0ZS5jc3YoYXNpZ25hY2lvbiwiY2xpZW50ZXNfc2VnbWVudGFkb3MuY3N2IikNCmBgYA0KDQojIyMgVmlzdWFsaXphciBTZWdtZW50b3MNCmluc3RhbGwucGFja2FnZXMoImZhY3RvZXh0cmEiKQ0KYGBge3J9DQpsaWJyYXJ5KGZhY3RvZXh0cmEpDQpmdml6X2NsdXN0ZXIoc2VnbWVudG9zLCBkYXRhID0gYmQxNywNCiAgICAgICAgICAgICBwYWxldHRlPWMoInJlZCIsICJibHVlIiwgImJsYWNrIiwgImRhcmtncmVlbiIpLA0KICAgICAgICAgICAgIGVsbGlwc2UudHlwZSA9ICJldWNsaWQiLA0KICAgICAgICAgICAgIHN0YXIucGxvdCA9IFQsDQogICAgICAgICAgICAgcmVwZWwgPSBULA0KICAgICAgICAgICAgIGdndGhlbWUgPSB0aGVtZSgpKQ0KYGBgDQoNCiMjIyBPcHRpbWl6YXIgaw0KDQpgYGB7cn0NCmxpYnJhcnkoY2x1c3RlcikNCmxpYnJhcnkoZGF0YS50YWJsZSkNCg0Kc2V0LnNlZWQoMTIzKQ0Kb3B0aW1pemFjaW9uIDwtIGNsdXNHYXAoYmQxNywgRlVOID0ga21lYW5zLCBuc3RhcnQgPSAyNSwgSy5tYXggPSAxMCwgQiA9IDUwKQ0KcGxvdChvcHRpbWl6YWNpb24sIHhsYWIgPSAiTnVtZXJvIGRlIGNsdXN0ZXJzIGsiKQ0KYGBgDQoNCiMjIyBDb25jbHVzaW9uZXMNCkVuIGxhIGJhc2UgZGUgZGF0b3Mgc2UgcmVhbGl6w7MgdW5hIHNlZ21lbnRhY2nDs24gZGUgbWVyY2FkbyBlbiBiYXNlIGEgbGEgZnJlY3VlbmNpYSBkZSBjbGllbnRlcyBhbCBzdXBlcm1lcmNhZG8sIGFzaSBjb21vIHRhbWJpZW4gbGEgY2FudGlkYWQgdG90YWwgcG9yIGNhZGEgdGlja2V0LCBlbiBlc3RlIGNhc28gb2J0dXZpbW9zIDMgY2x1c3RlcnMuDQpMYXMgcmVjb21lbmRhY2lvbmVzIHBhcmEgcmVhbGl6YXIgdW4gSy1tZWFucyBDbHVzdGVyaW5nLCBlcyByZXZpc2FyIGxvcyBkYXRvcyB5IGVsaW1pbmFyLCBhZ3JlZ2FyIG8gbW9kaWZpY2FyIGRlIGxhIGJhc2UgZGUgZGF0b3MgcGFyYSBxdWUgc2UgcHVlZGEgY29ycmVyIGVsIHByb2dyYW1hLiBUYW1iaWVuIGVzIG11eSBpbXBvcnRhbnRlIGVsIGRlc3B1ZXMgZGUgcmVhbGl6YXIgZWwgQ2x1c3RyaW5nLCBvcHRvbWl6YXIgbGEgSyB5IHJlYWxpemFyIGVsIHBsb3QuICANCkxhIGVzdHJhdGVnaWEgcHJvcHVlc3RhIHBhcmEgZWwgc3VwZXJtZXJjYWRvIGVzIHJlYWxpemFyIHVuYSBjYW1wYcOxYSBkZSBtYXJrZXRpbmcgZGlnaXRhbCBwb3IgbWVkaW8gZGUgY29ycmVvcyBlbiBsb3MgcXVlIGEgY2FkYSBzZWdtZW50byBkZSBjbGllbnRlIGVuIGVzcGVjw61maWNvLCBoYWNlcmxlcyBwcm9tb2Npb25lcyBwb3IgbG9zIHByb2R1Y3RvcyBxdWUgbWFzIGNvbXByYW4gY2FkYSB1bm8geSBhZGFwdGFkb3MgdGFtYmnDqW4gYSBsb3MgcHJlY2lvcyBxdWUgbm9ybWFsbWVudGUgY29tcHJhbi4gQWRlbcOhcyBkZSBtYW5kYXIgY3Vwb25lcyBjYWRhIHNlbWFuYSBjb24gY2llcnRvIHRpZW1wbyBsaW1pdGFkby4NCg==