Agrupación de datos geográficos basados ​​en la ubicación del punto y los valores de puntos asociados

15

Puntos de datos dados con longitud, latitud y un tercer valor de propiedad de este punto. ¿Cómo puedo agrupar puntos en grupos (subregiones geográficas) en función del valor de la propiedad? Busqué en Google y descubrí que este problema parece llamarse "agrupamiento restringido espacial" o "regionalización". Sin embargo, no estoy familiarizado con el manejo de datos geográficos y no tengo idea de qué tipo de algoritmos son buenos y qué paquetes de python / R son buenos para esta tarea.

Para dar una idea más intuitiva sobre lo que quiero, digamos que mis diagramas de dispersión de datos son los siguientes: ingrese la descripción de la imagen aquí

Por lo tanto, cada punto es un punto, x es la longitud, y es la latitud y el mapa de colores muestra si el valor es grande o pequeño. Quiero dividir esos puntos en subregiones / grupos / grupos según la ubicación y la similitud de valores. Como el siguiente (no es exactamente lo que quiero, solo para mostrar una idea intuitiva): ingrese la descripción de la imagen aquí

Entonces, ¿cómo puedo lograr esto?

Excalibur
fuente
Su pregunta es un poco amplia tal como está. ¿Has probado alguno de los paquetes R o Python?
John Powell
@ JohnBarça Actualmente creo que el paquete clusterPy parece útil y rise-group.org/risem/clusterpy/clusterpy0_9_9/… muestra cómo usarlo. Sin embargo, mis datos son tres puntos de columna: latitud, longitud y valor. Deseo dividir los puntos en grupos de subregiones según el valor del punto. El formato de entrada del paquete parece un polígono o una cuadrícula, y no he descubierto cómo usarlo directamente para manejar puntos espaciales.
Excalibur
1
consulte las preguntas relacionadas con su pregunta, por ejemplo: gis.stackexchange.com/questions/17638/…
Iris
@ Iris Gracias! He revisado la página web, pero parece que todavía no puedo encontrar una manera de manejar tales puntos espaciales de 3 columnas con propiedad directamente.
Excalibur
@Excalibur para cualquier agrupación geográfica que actualmente recomendaría HDBScan. Con respecto a su tercer valor, supongo que esto podría verse como una especie de peso. Sin proyectar todos los valores en el mismo espacio, esta podría ser una tarea difícil. ¿Puedes proporcionar información de fondo sobre tu objetivo?
Timothy Dalton

Respuestas:

4

El paquete rioja proporciona funcionalidad para la agrupación jerárquica restringida. Para lo que está pensando como "limitado espacialmente", especificaría sus cortes en función de la distancia, mientras que para la "regionalización" podría usar k vecinos más cercanos. Recomiendo encarecidamente proyectar sus datos para que estén en un sistema de coordenadas basado en la distancia.

require(sp)
require(rioja)

data(meuse)
  coordinates(meuse) <- ~x+y
  cdat <- data.frame(x=coordinates(meuse)[,1],y=coordinates(meuse)[,2])
  rownames(cdat) <- rownames(meuse@data)

# Constrained hierarchical clustering 
chc <- chclust(dist(cdat), method="conslink")

# Using kNN with 3 neighbors
chc.n3 <- cutree(chc, k=3) 

# Using distance 
chc.d200 <- cutree(chc, h=200) 

meuse@data <- data.frame(meuse@data, KNN=as.factor(chc.n3), DClust=chc.d200)

opar <- par
  par(mfcol=c(1,2))  
   cols <- topo.colors(length(unique(meuse@data$KNN)))  
    color <- rep("xx", nrow(meuse@data))
      for(i in 1:length(unique(meuse@data$KNN))) {
        v <- unique(meuse@data$KNN)[i] 
          color[(meuse@data$KNN == v)] <- cols[i]
        }
    plot(meuse, col=color, pch=19, main="kNN Clustering")
      box()

    cols <- topo.colors(length(unique(meuse@data$DClust)))  
    color <- rep("xx", nrow(meuse@data))
      for(i in 1:length(unique(meuse@data$DClust))) {
        v <- unique(meuse@data$DClust)[i] 
          color[(meuse@data$DClust == v)] <- cols[i]
        }
    plot(meuse, col=color, pch=19, main="Distance Clustering")
      box() 
par <- opar
Jeffrey Evans
fuente
1
Hola @JeffreyEvans, ¡gracias por tu respuesta! ¿Está sugiriendo que proyecte el tercer valor de la propiedad en otro tipo de coordenada, verdad? Sin embargo, creo que debería haber algunos algoritmos existentes que distingan (lon, lat) con los atributos asociados, y luego agrupen y hagan puntos en regiones continuas, y los puntos en las mismas regiones tendrán valores similares (por supuesto, hay algunos valores atípicos) . ¿Hay algún paquete que pueda lograr esto? Actualicé mi problema para un ejemplo más intuitivo. Gracias.
Excalibur