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")
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)"
names(clientes)<-c("ID","gender","age","income","SpSc")
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