Instalar paquetes factoextra y dbscan

install.packages("factoextra")
install.packages("dbscan")

Cargamos los paquetes necesarios y la base de datos

library(data.table)
library(factoextra)
library(dbscan)
library(ggplot2)
clientes<-fread("Mall_Customers.csv")
  1. Realizamos un inspección de la base de datos
head(clientes) #Observamos las primeras 6 observaciones
##    CustomerID Gender Age Annual Income (k$) Spending Score (1-100)
## 1:          1   Male  19                 15                     39
## 2:          2   Male  21                 15                     81
## 3:          3 Female  20                 16                      6
## 4:          4 Female  23                 16                     77
## 5:          5 Female  31                 17                     40
## 6:          6 Female  22                 17                     76
summary(clientes) #Resume las variables
##    CustomerID        Gender               Age        Annual Income (k$)
##  Min.   :  1.00   Length:200         Min.   :18.00   Min.   : 15.00    
##  1st Qu.: 50.75   Class :character   1st Qu.:28.75   1st Qu.: 41.50    
##  Median :100.50   Mode  :character   Median :36.00   Median : 61.50    
##  Mean   :100.50                      Mean   :38.85   Mean   : 60.56    
##  3rd Qu.:150.25                      3rd Qu.:49.00   3rd Qu.: 78.00    
##  Max.   :200.00                      Max.   :70.00   Max.   :137.00    
##  Spending Score (1-100)
##  Min.   : 1.00         
##  1st Qu.:34.75         
##  Median :50.00         
##  Mean   :50.20         
##  3rd Qu.:73.00         
##  Max.   :99.00
names(clientes) #Vemos el nombre de las variables
## [1] "CustomerID"             "Gender"                 "Age"                   
## [4] "Annual Income (k$)"     "Spending Score (1-100)"
  1. Cambiamos los nombres de las variables para no tener problemas con el espaciado ni con carácteres.
names(clientes)<-c("ID","gender","age","income","SpSc")
  1. Necesitamos crear una variable dummy para gender, ya que las funciones de cluster no aceptan variables factor ni character. Necesitamos variables numericas o enteras.
clientes[gender=="Male",male:=1]
clientes[gender!="Male",male:=0]

Pensar, ¿Cuales son las variables tiene sentido segmentar?, crear una base de datos más pequeña con esas variables

datacl<-clientes[,.(age,income)]

Realicemos una inspección visual

ggplot(data = datacl,aes(x=age,y=income))+
  geom_point()

Gráfico de codo

fviz_nbclust(x = datacl, FUNcluster = kmeans, method = "wss", k.max = 15, 
             diss = get_dist(datacl, method = "euclidean"), nstart = 50)

Utilicemos la función kmeans para obtener nuestros cluster

k1<-kmeans(x=datacl,centers=6,nstart=25)

fviz_cluster(k1,data=datacl,geom = "point")

Agreguemos la subdivisión de los cluster a la base de datos

clientes$clkme<-k1$cluster

Para encontrar la distancia del radio eps “óptima”

kNNdistplot(x=datacl,k=7)

No se nota un comportamiento pronunciado, pero si se muestra un incremento sustancial de la distancia desde la obs 140, por tanto eps=5

k2<-dbscan(x=datacl,eps = 6,minPts = 4)

fviz_cluster(dbscan(x=datacl,eps = 5,minPts = 3),data=datacl,geom = "point")

Agreguemos la subdivisión de los cluster a la base de datos

clientes$cldbscan<-k2$cluster