## metodi gerarchici agglomerativi library(cluster) data(eurodist) # nella forma di una matrice mat_d<-as.matrix(eurodist) View(mat_d) str(eurodist) # Help #?hclust #?agnes # single linkage agnes.single<-agnes(eurodist, method = "single") # coefficiente agglomerativo agnes.single$ac # otteniamo il dendrogramma pltree(agnes.single, main="Dendrogram (SL)", cex=1.2, hang=-1) abline(h=700, col=2) #abline(h=500, col=4) # in alternativa: hclust() hc<-hclust(eurodist, method = "single") plot(hc, hang=-1) # complete linkage agnes.complete<-agnes(eurodist, method = "complete") agnes.complete$ac pltree(agnes.complete, main="Dendrogram (CL)", cex=1.2, hang=-1) abline(h=2000, col=2) abline(h=1500, col=4) # average linkage agnes.average<-agnes(eurodist, method = "average") agnes.average$ac pltree(agnes.average, main="Dendrogram (AL)", cex=1.2, hang=-1) # taglio a k=4 gruppi rect.hclust(agnes.average, k=4, border=2:5) # k=4 hc<-cutree(agnes.average, 4) cnames<-colnames(mat_d) # estraiamo le città (i nomi) che appartengono ai clusters # 1, 2, 3 e 4 cnames[hc==1] cnames[hc==2] cnames[hc==3] cnames[hc==4] ## metodo di Ward si utilizza agnes() # method="ward" ## Esercizio############################# # install.packages("maps") library(maps) library(cluster) data("world.cities") ?world.cities capital<-subset(world.cities, capital==1) #View(capital) d0<-capital[ , c(4,5)] #View(d0) # d0 è la matrice dei dati 230x2 ?agnes # 1. effettuare AHC con average linkage e distanza euclidea # 2. tagliare il dendrogramma a 4 e 8 gruppi, ottenendo i due # raggruppamenti # 3. ottenere una mappa dei gruppi # 4. ottenere la silhouette # soluzione ris.agnes<-agnes(d0, metric = "euclidean", method = "average") pltree(ris.agnes, main="") abline(h=90) gruppi_4<-cutree(ris.agnes, k=4) gruppi_4 # vettore table(gruppi_4) # ampiezza dei clusters gruppi_8<-cutree(ris.agnes, k=8) table(gruppi_8) par(mar=c(0,0,0,0)) map("world", interior = FALSE) points(d0[, 2], d0[, 1], col=gruppi_4+1, pch=gruppi_4, cex=1.2) # oppure col=rainbow(4)[gruppi_4] # otteniamo l'indice di silhouette media al variare di # del numero di cluster K library(fpc) asw<-c() kmin<-2 kmax<-8 ran.k<-length(c(kmin:kmax)) nc<-1 for(nc in 1:ran.k){ gruppi<-cutree(ris.agnes, nc+1) stat<-cluster.stats(d=dist(d0), gruppi) asw[nc]<-stat$avg.silwidth } plot(2:8, asw, main="", ylab="asw", xlab="k", type="o", pch=19, cex=0.8) abline(v=4, lty=2)