Agrupando dados geográficos com base na localização do ponto e nos valores de pontos associados

15

Dados dados pontos com longitude, latitude e um terceiro valor de propriedade desse ponto. Como posso agrupar pontos em grupos (sub-regiões geográficas) com base no valor da propriedade? Eu procurei pelo google e descobri que esse problema parece ser chamado de "agrupamento espacial restrito" ou "regionalização". No entanto, não estou familiarizado com o tratamento de dados geográficos e não tenho uma idéia sobre que tipo de algoritmos são bons e quais pacotes python / R são bons para esta tarefa.

Para dar uma idéia mais intuitiva sobre o que eu quero, digamos que meus gráficos de dispersão de dados sejam os seguintes: insira a descrição da imagem aqui

Portanto, cada ponto é um ponto, x é longitude, y é latitude e o mapa de cores mostra se o valor é grande ou pequeno. Quero dividir esses pontos em sub-regiões / grupos / clusters com base na localização e semelhança de valores. Como o seguinte (não é exatamente o que eu quero, apenas para mostrar uma ideia intuitiva.): insira a descrição da imagem aqui

Então, como posso conseguir isso?

Excalibur
fonte
Sua pergunta é um pouco ampla como está. Você já experimentou algum dos pacotes R ou Python?
John Powell
@ JohnBarça Atualmente, acho que o pacote clusterPy parece útil e rise-group.org/risem/clusterpy/clusterpy0_9_9/… mostra como usá-lo. No entanto, meus dados são três pontos da coluna: latitude, longitude e valor. Desejo dividir pontos em grupos de sub-regiões com base no valor em pontos. O formato de entrada do pacote parece algum polígono ou grade, e não descobri como usá-lo diretamente para lidar com pontos espaciais.
Excalibur
1
confira as questões relacionadas à sua pergunta, por exemplo: gis.stackexchange.com/questions/17638/...
Iris
@Iris Thanks! Verifiquei a página da Web, mas parece que ainda não consigo encontrar uma maneira de lidar diretamente com esses pontos espaciais de 3 colunas com propriedade.
Excalibur
@Excalibur para qualquer cluster geográfico Eu atualmente recomendaria o HDBScan. Em relação ao seu terceiro valor, isso pode ser visto como algum tipo de peso, eu acho. Sem projetar todos os valores no mesmo espaço, isso pode ser uma tarefa complicada. Você pode fornecer algumas informações básicas sobre seu objetivo?
Timothy Dalton

Respostas:

4

O pacote rioja fornece funcionalidade para armazenamento em cluster hierárquico restrito. Para o que você considera "restrito espacialmente", você deve especificar seus cortes com base na distância, enquanto que para "regionalização" você poderá usar k vizinhos mais próximos. Eu recomendo projetar seus dados para que estejam em um sistema de coordenadas baseado em distância.

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
fonte
1
Olá @JeffreyEvans, obrigado pela sua resposta! Então você está sugerindo que eu projete o terceiro valor da propriedade em outro tipo de coordenada, certo? No entanto, acho que deveria haver alguns algoritmos existentes que distinguem (lon, lat) com atributos associados e, em seguida, fazem agrupamentos e fazem pontos em regiões contínuas, e os pontos nas mesmas regiões devem ter valores semelhantes (é claro que existem alguns outliers) . Existe algum pacote capaz de conseguir isso? Atualizei meu problema para um exemplo mais intuitivo. Obrigado.
Excalibur