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 )