Para el siguiente caso propuesto, Cargaremos la data del repositorio en github.
data=read.csv("https://raw.githubusercontent.com/VictorGuevaraP/BI/master/CINE%20PREFERIDO.csv",sep = ";",header = TRUE)
head(data)
Ahora seleccionaremos solo las 5 primeras columnas
data=data[,1:5]
str(data)
'data.frame': 500 obs. of 5 variables:
$ edad : int 37 32 51 37 43 75 27 38 79 12 ...
$ frecuencia_mensual : int 1 4 2 4 6 5 2 6 14 5 ...
$ Genero_peli : chr "Romance" "Suspenso" "Suspenso" "Ciencia Ficción" ...
$ Gasto : int 80 75 83 77 72 75 83 72 43 75 ...
$ Numero_acompañantes: int 6 1 1 2 6 1 2 3 3 5 ...
A continuación, vamos a cambiar los géneros de película por números.
data$Genero_peli[data$Genero_peli == "Romance"] <- 1
data$Genero_peli[data$Genero_peli == "Suspenso"] <- 2
data$Genero_peli[data$Genero_peli == "Ciencia Ficción"] <- 3
data$Genero_peli[data$Genero_peli == "Terror"] <- 4
data$Genero_peli[data$Genero_peli == "Accion y drama"] <- 5
data$Genero_peli[data$Genero_peli == "Comedia"] <- 6
data$Genero_peli[data$Genero_peli == "Dibujos animados"] <- 7
data$Genero_peli=as.numeric(data$Genero_peli)
str(data)
'data.frame': 500 obs. of 5 variables:
$ edad : int 37 32 51 37 43 75 27 38 79 12 ...
$ frecuencia_mensual : int 1 4 2 4 6 5 2 6 14 5 ...
$ Genero_peli : num 1 2 2 3 4 2 5 1 1 2 ...
$ Gasto : int 80 75 83 77 72 75 83 72 43 75 ...
$ Numero_acompañantes: int 6 1 1 2 6 1 2 3 3 5 ...
Ahora aplicaremos el método del codo para saber en cuántos clusters agrupar la informacion.
wss=double()
for (k in 2:10){
set.seed(111)
segmentcodo=kmeans(data,k)
wss[k-1]=segmentcodo$tot.withinss
}
plot(2:10,wss,type="b")
Como vemos la curva se acentúa en el punto 3, así que haremos 3 grupos.
clust=kmeans(data,3)
print(clust)
K-means clustering with 3 clusters of sizes 133, 190, 177
Cluster means:
edad frecuencia_mensual Genero_peli Gasto
1 74.13534 7.045113 3.849624 66.97744
2 35.42105 13.536842 3.926316 45.62632
3 34.10734 3.293785 3.813559 79.55932
Numero_acompañantes
1 3.157895
2 2.800000
3 2.841808
Clustering vector:
[1] 3 3 3 3 3 1 3 3 1 3 1 1 2 3 1 1 3 3 2 2 2 1 3 1 3 1 3 3 1 1 2 1
[33] 3 2 3 3 2 1 3 1 2 1 2 1 3 3 3 1 2 2 2 2 2 1 2 3 2 3 1 1 3 2 3 2
[65] 2 1 3 2 2 2 1 2 2 3 3 3 3 2 3 3 3 1 2 3 2 3 1 2 1 3 1 3 1 1 2 1
[97] 2 1 2 2 1 1 2 2 3 1 3 1 2 2 2 3 2 2 2 1 2 1 1 3 2 1 3 1 2 3 2 1
[129] 2 2 2 2 2 2 3 1 2 3 2 2 1 1 2 1 1 2 3 2 2 1 1 2 2 2 2 3 2 2 3 2
[161] 1 3 3 3 2 2 2 2 3 1 2 3 2 1 3 1 3 3 2 3 3 1 1 2 3 2 2 3 1 1 1 1
[193] 2 2 1 3 3 3 3 2 2 3 2 2 1 1 1 1 3 2 1 3 1 2 2 1 1 2 3 3 3 3 2 1
[225] 3 2 3 2 2 1 2 1 3 3 1 3 1 2 3 1 1 3 1 3 3 3 1 1 3 3 1 2 2 2 2 3
[257] 2 3 3 2 2 3 3 3 3 2 2 2 3 2 1 1 2 3 3 1 2 2 1 3 2 2 3 3 2 3 2 2
[289] 3 1 3 1 3 2 1 2 3 3 3 2 2 1 3 2 3 3 3 1 3 2 2 2 3 3 3 1 3 3 2 3
[321] 3 3 2 1 1 2 1 2 1 3 2 2 1 3 1 2 2 2 1 1 1 1 2 2 3 2 3 1 3 2 3 2
[353] 1 1 1 3 2 3 2 2 3 3 2 3 1 3 2 3 1 2 2 3 2 3 1 3 2 2 2 2 2 1 1 2
[385] 1 1 1 3 2 3 1 1 3 1 3 2 3 1 3 3 3 3 3 1 2 2 3 3 1 2 3 2 2 2 2 2
[417] 2 3 3 2 3 2 3 1 3 3 2 3 3 2 2 3 2 2 2 2 1 3 1 2 3 2 3 3 3 3 2 2
[449] 2 3 2 3 2 1 1 2 1 1 3 3 3 2 1 1 1 1 3 2 3 2 2 3 2 2 2 3 3 1 2 1
[481] 2 2 2 1 1 3 3 3 3 3 3 1 2 2 2 1 2 1 2 2
Within cluster sum of squares by cluster:
[1] 47364.90 72203.39 26513.73
(between_SS / total_SS = 64.8 %)
Available components:
[1] "cluster" "centers" "totss" "withinss"
[5] "tot.withinss" "betweenss" "size" "iter"
[9] "ifault"
Ahora vamos a agrupar el cluster y la data que teníamos.
grupo=clust$cluster
segmentacion=cbind(data,grupo)
head(segmentacion)
Y plotearemos los grupos y la segmentación hecha.
library(cluster)
clusplot(segmentacion,grupo)
A continuación, tenemos una comparación entre los gastos y la frecuencia mensual de los consumidores.
plot(segmentacion$frecuencia_mensual ,segmentacion$Gasto ,col=segmentacion$grupo)
Del gráfico anterior podemos ver que, las personas que van menos veces al cine, gastan más que las personas que suelen acudir constantemente.