Page cover

Detección de datos atípicos de forma Multivariante

LOF es un algoritmo de detección de valores atípicos basado en densidad. Evalúa la densidad local de los puntos de datos para identificar valores atípicos. A diferencia de algoritmos de agrupación como k-Nearest Neighbors (KNN), LOF se centra en encontrar observaciones que se desvíen del patrón de densidad local.

Comparación con k-Nearest Neighbors (KNN):

  • Similitud en KNN: En KNN, el enfoque se centra en encontrar observaciones que compartan características similares. Identifica vecinos según la proximidad, y los puntos con muchos vecinos cercanos se consideran similares.

  • Diferencia en LOF: LOF, por otro lado, busca observaciones que no sean similares. Evalúa la densidad local alrededor de cada punto e identifica observaciones que se desvíen del patrón de densidad esperado. Los valores atípicos en LOF pueden tener menos vecinos cercanos o una densidad local significativamente diferente.

Resumen del Algoritmo: Aquí tienes un esquema básico del algoritmo LOF:

  • Para cada punto de datos:

    • Calcula la distancia a sus k vecinos más cercanos.

    • Evalúa la densidad local en función de la distancia promedio a los vecinos.

    • Compara la densidad local del punto con las densidades locales de sus vecinos.

    • Calcula el Factor Local de Atipicidad (LOF) como la relación entre la densidad del punto y la densidad promedio de sus vecinos.

Interpretación:

  • LOF > 1: Un valor LOF mayor que 1 indica que el punto tiene una densidad local significativamente menor que la de sus vecinos. En otras palabras, el punto se encuentra en una región donde la densidad de puntos es menor de lo esperado en comparación con su entorno local. Esto sugiere que el punto podría ser un valor atípico.

  • LOF ≈ 1: Un valor LOF cercano a 1 indica que el punto tiene una densidad local similar a la de sus vecinos. En este caso, el punto se encuentra en una región donde la densidad de puntos es consistente con su entorno local. No se considera un valor atípico según LOF.

  • LOF < 1: Un valor LOF menor que 1 indica que el punto tiene una densidad local más alta que la de sus vecinos. Esto puede suceder en regiones de alta densidad donde el punto está más densamente rodeado que la media de sus vecinos. En este caso, el punto puede considerarse menos atípico que sus vecinos.

Puedes establecer un umbral para definir qué puntuaciones LOF se considerarán valores atípicos. Un umbral típico podría ser 1.5, donde puntos con LOF superior a este valor se considerarían atípicos.

Ejemplo

# Instala y carga los paquetes necesarios
install.packages(c("dbscan", "class", "ggplot2"))
library(dbscan)
library(class)
library(ggplot2)

# Carga el conjunto de datos iris
data(iris)

# Añade un valor atípico al conjunto de datos
iris$Species<-as.character(iris$Species)
iris_atipico <- rbind(iris, c(7, 5, 5, 1, "Atipico"))
iris_atipico$Species<-as.factor(iris_atipico$Species)
iris_atipico$Sepal.Length<-as.numeric(iris_atipico$Sepal.Length)
iris_atipico$Sepal.Width<-as.numeric(iris_atipico$Sepal.Width)
iris_atipico$Petal.Length<-as.numeric(iris_atipico$Petal.Length)
iris_atipico$Petal.Width<-as.numeric(iris_atipico$Petal.Width)
iris$Species<-as.factor(iris$Species)

# Gráfico de dispersión para mostrar el conjunto de datos con un valor atípico
ggplot(iris_atipico, aes(x = Sepal.Length, y = Sepal.Width, color = Species)) +  
geom_point() + 
geom_text(data = iris_atipico[nrow(iris_atipico), , drop = FALSE], aes(label = "Atipico"), vjust = -1) +  
labs(title = "Conjunto de Datos Iris con un Valor Atípico",       x = "Longitud del Sépalo", y = "Anchura del Sépalo")

# Aplica KNN para clasificación
set.seed(123)
knn_resultados <- knn(train = iris[, 1:4], test = iris_atipico[nrow(iris_atipico), 1:4], cl = iris$Species, k = 3)

# Imprime el resultado de KNN para el valor atípico
print(knn_resultados)

# Aplica LOF para detección de valores atípicos
lof_resultados <- lof(iris_atipico[, 1:4], minPts = 6)

# Imprime las puntuaciones LOF
print(lof_resultados)

# Gráfico de dispersión con colores según las puntuaciones LOF
ggplot(iris_atipico, aes(x = Sepal.Length, y = Sepal.Width, colour = lof_resultados)) +  
geom_point() +  
scale_color_gradient(low = "blue", high = "red", name = "LOF Score") +  
labs(title = "Detección de Valores Atípicos con LOF",       x = "Longitud del Sépalo", y = "Anchura del Sépalo")