R,按值进行空间聚类

R, Spatial clustering by value

我有这个简单的数据集。数据集由假设的地理单位(即邮政编码)组成,有 3 个变量:经度、纬度和 someValue(销售额)。

lon<-rep(1:10,each=10) lat<-rep(1:10,10) someValue<-rnorm(100, mean = 20, sd = 5) dataset<-data.frame(lon,lat,someValue)

我面临的问题是领土对齐。给定建议的地区数量,我需要将邮政编码分组为地区,使得地区由相邻的邮政编码组成,并且 someValue 的总和大致相同(+/- 指定地区数量的平均值的 15% )

此时我的最佳想法是: 1. 首先在 lon/lat 上进行聚类以建立候选人; 2. 使用步骤 1 中的质心作为中心 iter.max=1 对 someValue 进行聚类; 3 迭代 1 和 2 直到某个收敛截止点。

我想问一下社区:在 R 中实现这样的东西的正确方法是什么?我确实搜索了空间聚类,但找不到任何相关内容

您可以使用 kmeans 仅考虑前两列(x 和 y)进行聚类:

#How Many cluster do you want to have initially?
initialClasses <- 2

#clustering using kmeans
initClust            <- kmeans(dataset[,1:2], initialClasses, iter.max = 100)
dataset$classes <- initClust$cluster

initClust$cluster 然后包含您的集群 类。您可以将它们添加到您的数据框并使用 dplyr 来计算一些统计数据。例如每个集群 someValue 的总和:

library(dplyr)
statistics      <- dataset %>% group_by(classes) %>%summarize(sum=sum(someValue))

这里例如 someValue 超过两个 类 的总和:

  classes      sum
    (int)    (dbl)
1       1 975.7783
2       2 978.9166

假设您的数据分布均匀,并且您希望每个集群的 someValue 总和更小。然后你需要用更多(即 3)类:

重新运行聚类
newRun            <- kmeans(dataset[,1:2], 3, iter.max = 100)
dataset$classes <- newRun$cluster

这里是三个类的输出统计:

  classes      sum
    (int)    (dbl)
1       1 577.6573
2       2 739.9668
3       3 637.0707

通过将其包装在一个循环中并计算更多标准(即方差),您可以将聚类调整到合适的大小。希望对你有帮助。