2017-05-25 63 views
-1

我有這個簡單的數據集。數據集是由假設的地理單位(即郵政編碼)組成的,有3個變量:經度,緯度和一些價值(銷售額)。R,按值進行空間聚類

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中實現類似的東西的方法是什麼?我做了搜索空間聚類,沒能找到任何有關

回答

0

您可以通過只考慮前兩列(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 

比方說,你的數據是平均分配,並且希望每個集羣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 

通過包裝這個循環中,計算多標準(即方差)你可以將你的羣集調整到合適的大小。希望能幫助到你。

+0

謝謝@maRtin。問題是我有預先確定的領土/集羣的數量。我需要形成包含類似價值總計的集羣。這是100個郵政編碼的價值是100 * $ 20 = $ 2000,我需要10個地區。這意味着我需要創造價值大約200美元的地區 –