Regroupement des données géographiques en fonction de l'emplacement des points et des valeurs de points associées

15

Étant donné les points de données avec la longitude, la latitude et une troisième valeur de propriété de ce point. Comment puis-je regrouper des points en groupes (sous-régions géographiques) en fonction de la valeur de la propriété? J'ai recherché par google et compris que ce problème semble être appelé "clustering contraint spatial" ou "régionalisation". Cependant, je ne suis pas familier avec la gestion des données géographiques et je n'ai aucune idée du type d'algorithmes qui sont bons et des packages python / R qui conviennent à cette tâche.

Pour donner une idée plus intuitive de ce que je veux, disons que mes diagrammes de dispersion de données sont les suivants: entrez la description de l'image ici

Ainsi, chaque point est un point, x est la longitude, y est la latitude et la palette de couleurs indique si la valeur est grande ou petite. Je veux diviser ces points en sous-régions / groupes / grappes en fonction de l'emplacement et de la similitude des valeurs. Comme ce qui suit (ce n'est pas exactement ce que je veux, juste pour montrer une idée intuitive.): entrez la description de l'image ici

Alors, comment puis-je y parvenir?

Excalibur
la source
Votre question est un peu large en l'état. Avez-vous essayé l'un des packages R ou Python?
John Powell,
@ JohnBarça Actuellement, je pense que le package clusterPy semble utile et rise-group.org/risem/clusterpy/clusterpy0_9_9/… montre comment l'utiliser. Cependant, mes données sont constituées de trois points de colonne: latitude, longitude et valeur. Je souhaite diviser les points en groupes de sous-régions en fonction de la valeur des points. Le format d'entrée du package ressemble à un polygone ou à une grille, et je n'ai pas compris comment l'utiliser directement pour gérer les points spatiaux.
Excalibur
1
consultez les questions connexes à votre question, par exemple: gis.stackexchange.com/questions/17638/…
Iris
@Iris Merci! J'ai vérifié la page Web, mais il semble que je ne trouve toujours pas de moyen de gérer directement ces points spatiaux à 3 colonnes avec une propriété.
Excalibur
@Excalibur pour tout clustering géographique, je recommanderais actuellement HDBScan. En ce qui concerne votre troisième valeur, cela pourrait être considéré comme une sorte de poids, je suppose. Sans projeter toutes les valeurs dans le même espace, cela pourrait être une tâche délicate. Pouvez-vous fournir des informations générales sur votre objectif?
Timothy Dalton,

Réponses:

4

Le package rioja fournit des fonctionnalités pour le clustering hiérarchique contraint. Pour ce que vous considérez comme "contraint spatialement", vous spécifieriez vos coupes en fonction de la distance alors que pour la "régionalisation", vous pourriez utiliser k voisins les plus proches. Je recommande fortement de projeter vos données afin qu'elles soient dans un système de coordonnées basé sur la distance.

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
la source
1
Salut @JeffreyEvans, merci pour votre réponse! Vous proposez donc que je projette la troisième valeur de la propriété dans un autre type de coordonnées, n'est-ce pas? Cependant, je pense qu'il devrait y avoir des algorithmes existants qui distinguent (lon, lat) avec les attributs associés, puis font le clustering et font des points en régions continues, et les points dans les mêmes régions auront des valeurs similaires (bien sûr, il y a des valeurs aberrantes) . Existe-t-il un package pouvant atteindre cet objectif? J'ai mis à jour mon problème pour un exemple plus intuitif. Merci.
Excalibur