library(rgl)
rm(list=ls())
data <- read.table("C:/Users/LENOVO/R/Metodos No-Supervisados/DataRetailfinal3.csv", sep = ";", header=T)
str(data)
## 'data.frame': 120 obs. of 3 variables:
## $ Cliente: Factor w/ 14 levels "CLIENTE1","CLIENTE10",..: 1 7 8 9 10 11 12 13 14 2 ...
## $ Monto : int 428 436 222 452 115 468 476 242 492 125 ...
## $ Fechas : Factor w/ 94 levels "2017-01-05","2017-01-06",..: 1 2 3 4 5 33 34 35 36 37 ...
head(data)
## Cliente Monto Fechas
## 1 CLIENTE1 428 2017-01-05
## 2 CLIENTE2 436 2017-01-06
## 3 CLIENTE3 222 2017-01-07
## 4 CLIENTE4 452 2017-01-08
## 5 CLIENTE5 115 2017-01-09
## 6 CLIENTE6 468 2017-04-10
data$Fechas <- as.Date.factor(data$Fechas, format = "%Y-%m-%d")
str(data)
## 'data.frame': 120 obs. of 3 variables:
## $ Cliente: Factor w/ 14 levels "CLIENTE1","CLIENTE10",..: 1 7 8 9 10 11 12 13 14 2 ...
## $ Monto : int 428 436 222 452 115 468 476 242 492 125 ...
## $ Fechas : Date, format: "2017-01-05" "2017-01-06" ...
Creando Variables de ‘Monto total’, ‘Frecuencia’ y ‘Recencia’
data$Recencia <- round(as.numeric(difftime(Sys.Date(), data$Fechas, units="days")) )
dataM <- aggregate(data$Monto, list(data$Cliente), sum)
names(dataM) <- c("Cliente", "Monto")
dataF <- aggregate(data$Monto, list(data$Cliente), length)
names(dataF) <- c("Cliente", "Frecuencia")
dataR <- aggregate(data$Recencia, list(data$Cliente), min)
names(dataR) <- c("Cliente", "Recencia")
Combinando R,F y M
temp <- merge(dataF, dataR, "Cliente")
dataRFM <- merge(temp,dataM,"Cliente")
Creando niveles R,F,M (quintiles)
dataRFM$rankR <- cut(dataRFM$Recencia, 5, labels = F) # 5 es el más reciente, 1 el menos
dataRFM$rankF <- cut(dataRFM$Frecuencia, 5, labels = F)
dataRFM$rankM <- cut(dataRFM$Monto, 5, labels = F)
Cruzando y visualizando los 10 clientes top:
table(dataRFM[,5:6])
## rankF
## rankR 1 2 3 4 5
## 1 1 4 1 1 2
## 2 0 0 1 0 2
## 3 0 1 0 0 0
## 5 1 0 0 0 0
table(dataRFM[,6:7])
## rankM
## rankF 1 2 3 5
## 1 1 1 0 0
## 2 0 2 3 0
## 3 0 2 0 0
## 4 0 1 0 0
## 5 0 0 0 4
table(dataRFM[,5:7])
## , , rankM = 1
##
## rankF
## rankR 1 2 3 4 5
## 1 1 0 0 0 0
## 2 0 0 0 0 0
## 3 0 0 0 0 0
## 5 0 0 0 0 0
##
## , , rankM = 2
##
## rankF
## rankR 1 2 3 4 5
## 1 0 2 1 1 0
## 2 0 0 1 0 0
## 3 0 0 0 0 0
## 5 1 0 0 0 0
##
## , , rankM = 3
##
## rankF
## rankR 1 2 3 4 5
## 1 0 2 0 0 0
## 2 0 0 0 0 0
## 3 0 1 0 0 0
## 5 0 0 0 0 0
##
## , , rankM = 5
##
## rankF
## rankR 1 2 3 4 5
## 1 0 0 0 0 2
## 2 0 0 0 0 2
## 3 0 0 0 0 0
## 5 0 0 0 0 0
dataRFM <- dataRFM[with(dataRFM, order(-rankR, -rankF, -rankM)), ]
head(dataRFM, n=10)
## Cliente Frecuencia Recencia Monto rankR rankF rankM
## 11 CLIENTE6 4 504 1862 5 1 2
## 7 CLIENTE2 7 469 3473 3 2 3
## 10 CLIENTE5 13 459 4754 2 5 5
## 14 CLIENTE9 12 460 4926 2 5 5
## 9 CLIENTE4 8 467 2568 2 3 2
## 8 CLIENTE3 13 449 5491 1 5 5
## 13 CLIENTE8 13 445 5177 1 5 5
## 3 CLIENTE11 10 454 2739 1 4 2
## 12 CLIENTE7 8 446 2646 1 3 2
## 4 CLIENTE12 7 453 2897 1 2 3
Agrupando para generar el RFM
groupRFM <- dataRFM$rankR*100 + dataRFM$rankF*10 + dataRFM$rankM
dataRFM <- cbind(dataRFM,groupRFM)
head(dataRFM, n=10)
## Cliente Frecuencia Recencia Monto rankR rankF rankM groupRFM
## 11 CLIENTE6 4 504 1862 5 1 2 512
## 7 CLIENTE2 7 469 3473 3 2 3 323
## 10 CLIENTE5 13 459 4754 2 5 5 255
## 14 CLIENTE9 12 460 4926 2 5 5 255
## 9 CLIENTE4 8 467 2568 2 3 2 232
## 8 CLIENTE3 13 449 5491 1 5 5 155
## 13 CLIENTE8 13 445 5177 1 5 5 155
## 3 CLIENTE11 10 454 2739 1 4 2 142
## 12 CLIENTE7 8 446 2646 1 3 2 132
## 4 CLIENTE12 7 453 2897 1 2 3 123
Gráfico:
library(ggplot2)
ggplot(dataRFM, aes(factor(groupRFM))) + geom_bar(fill = "white", colour = "blue") + ggtitle('Segmentación de Clientes RFM') + labs(x="RFM",y="#Clientes")
library(rgl)
plot3d( dataRFM$rankR, dataRFM$rankF, dataRFM$rankM, xlab = "Recencia", ylab = "Frecuencia", zlab = "Monto",
col = dataRFM$groupRFM, type = "s", radius = 0.5 )