Está en la página 1de 4

################################

# ANÁLISIS CLUSTER #
# CLUSTER BASADO EN DENSIDAD #
# Mg. Jesús Salinas Flores #
# jsalinas@lamolina.edu.pe #
################################

#--------------------------------------------------------------
# Para limpiar el workspace, por si hubiera algun dataset
# o información cargada
rm(list = ls())
dev.off()

#--------------------------------------------------------------
# Cambiar el directorio de trabajo
setwd(dirname(rstudioapi::getActiveDocumentContext()$path))
getwd()

#--------------------------------------------------------------
# Otras opciones
options(scipen=999) # Eliminar la notación científica
options(digits = 3) # Número de decimales

#--------------------------------------------------------------
# Paquetes
library(fpc)
library(dbscan)
library(factoextra)

##########################################
# I. CLUSTER BASADO EN DENSIDAD: DBSCAN #
##########################################

#--------------------------------------------------------------
# 1. Analizando la data multishapes

library(factoextra)
data(multishapes)

# La data multishapes contiene 1100 observaciones con 3


# variables.

head(multishapes)

# x: un vector numérico que contiene las coordenadas x de


# observaciones.
# y: un vector numérico que contiene las coordenadas y de
# observaciones.
# shape: un vector numérico que corresponde al número de grupo
# de cada observación.

datos <- multishapes[, 1:2]

cluster_real<-multishapes[3]

plot(datos)

head(datos)
# El cerebro humano identifica fácilmente 5 agrupaciones
# y estas son 2 racimos de ovales, 2 grupos lineales
# y un grupo compacto

#--------------------------------------------------------------
# 2. Realizando un cluster k-means

set.seed(123)
km.res <- kmeans(x=datos,
centers=5,
nstart = 25)
km.res

# Visualización de los clusters con k-means


g_kmeans<-fviz_cluster(km.res,
datos,
ellipse.type = "convex",
geom = "point")
g_kmeans

# Sabemos que hay 5 grupos en los datos, pero se puede


# ver que el metodo k-means identifica incorrectamente
# los 5 grupos

# K-Means necesariamente agrupa a los outliers


# no es robusto para la detección de valores atípicos

#--------------------------------------------------------------
# 3. Realizando un DBSCAN

library(fpc)
library(dbscan)
library(factoextra)

data("multishapes")
datos <- multishapes[, 1:2]

# y son los clusters


y <- multishapes[,3]

# Selección del valor óptimo de epsilon.


# Como valor de minPts se emplea 5.

# La función kNNdistplot () en el paquete dbscan


# se puede usar para dibujar el diagrama de k-distancia

dbscan::kNNdistplot(datos, k = 5)

# Observamos un punto de quiebre en 0.15

abline(h = 0.15, lty = 2)

# DBSCAN con epsilon = 0.15 y minPts = 5

# La función fpc::dbscan() proporciona un objeto de la clase


# 'dbscan' que contiene los siguientes componentes
# CLUSTER: Membresía de clúster de codificación vectorial
# entera con observaciones de ruido codificadas como 0.
# ISSEED: Vector lógico que indica si un punto es punto centro
# EPS: Parámetro eps
# MINPTS: Parámetro MinPts

# Usando el paquete fpc


set.seed(123)
dbscan_cluster <- fpc::dbscan(data = datos,
eps = 0.15,
MinPts = 5)

# Resultados de la asignación
print(dbscan_cluster)

## dbscan Pts=1100 MinPts=5 eps=0.15

## 0 1 2 3 4 5
## border 31 24 1 5 7 1
## seed 0 386 404 99 92 50
## total 31 410 405 104 99 5

# Muestra una estadística del número de puntos que


# pertenecen a los clústers que son semillas o centrales
# y los puntos de borde.

# En la tabla anterior, los nombres de la columna son el


# número de clúster. El grupo 0 corresponde a los valores
# atípicos (puntos negros en el diagrama DBSCAN)

# Usando el paquete dbscan


set.seed(123)
dbscan::dbscan(datos, 0.15, 5)

# Visualización de los clusters con DBSCAN

library(factoextra)

# Primera forma de mostrar el gráfico con la función


# fviz_cluster del paquete factoextra
fviz_cluster(dbscan_cluster,
datos, stand = FALSE,
ellipse = FALSE,
geom = "point")

# Segunda forma de mostrar el gráfico, solo ploteando


plot(dbscan_cluster,
datos,
main = "DBSCAN",
frame = FALSE)

# Se puede ver que DBSCAN funciona mejor para estos conjuntos


# de datos y puede identificar los clústeres "correctos" en
# comparación con el algoritmo k-means.

pred <- predict(dbscan_cluster, datos)


pred

# Verificando las predicciones del clúster real


X <- cluster_real[1,]

for(i in 2:dim(cluster_real)[ 1 ]){


X<-cbind(X,cluster_real[i,])
}

suma<-0
for(i in 1:1100){
if(pred[i]==X[i]){
suma= suma + 1
}

}
suma

suma/1100

# El 90.63% de las observaciones han sido predichas en su


# cluster real

table(multishapes$shape)
table(pred)
pred[pred==0] = 6
table(pred)

cbind(multishapes,pred) -> datos2


(table(datos2$shape,datos2$pred)) -> tabla
tabla
sum(diag(tabla))

También podría gustarte