我有这个简单的数据集。数据集是假设的地理单位(即邮政编码),有3个变量:经度,纬度和某些价值(销售)。
lon<-rep(1:10,each=10)
lat<-rep(1:10,10)
someValue<-rnorm(100, mean = 20, sd = 5)
dataset<-data.frame(lon,lat,someValue)
我面临的问题是领土对齐。鉴于建议的领土数量,我需要将邮政编码分组到地区,使得地区由相邻的邮政编码组成,并且某些值的总和大致相同(指定领土数量的平均值的+/- 15%) )
我现在最好的想法是:1。首先在lon / lat上进行聚类以建立候选者; 2.使用步骤1中心的质心对someValue进行聚类,作为iter.max = 1的中心; 3迭代超过1和2直到收敛截止。
我想问一下社区:在R中实现类似这样的东西的适当方法是什么?我确实搜索了空间聚类,但无法找到任何相关的内容
答案 0 :(得分:1)
只需考虑前两列(x和y),就可以使用kmeans
进行聚类:
#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
我们假设您的数据是均匀分布的,并且您希望每个群集的某些值的总和更小。然后,您需要使用更多(即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
通过将其包装在循环中并计算更多条件(即方差),您可以将聚类调整为正确的大小。希望它有所帮助。