#ejemplo 1 d<-matrix(c(0,1,4,2.5,1,0,2,3,4,2,0,4,2.5,3,4,0),ncol=4) help(dist) D<-as.dist(d) help(hclust) ht_comp<-hclust(D,method = "single") plot(ht_comp,hang = -1) cutree(ht_comp,2)#separa en dos grupos analizando el dendograma abline(h=2.25,col=2) ht_sing<-hclust(D,method = "complete") plot(ht_sing,hang = -1) ht_av<-hclust(as.dist(d),method = "average") plot(ht_av,hang = -1) par(mfrow=c(1,3)) plot(ht_comp,hang = -1) plot(ht_sing,hang = -1) plot(ht_av,hang = -1) par(mfrow=c(1,1)) #ejemplo 2 help("USArrests") #usamos una base de datos con los datos para los 50 estados de USA datos<-USArrests #datos que ta trae R sin tener que cargar ningun paquete plot(datos, pch=20) help("dist") ht_c<-hclust(dist(datos),method = "complete") plot(ht_c,hang = -1) #ahora quiero separar por ejemplo en 10 grupos rect.hclust(ht_c,k=10,border = "red") plot(datos,col=cutree(ht_c,3),pch=20) #help("rect.hclust") #con otro metodo ht_a<-hclust(dist(datos),method = "average") plot(ht_a,hang = -1) rect.hclust(ht_a,k=10,border = "red") plot(datos,col=cutree(ht_a,10),pch=20) par(mfrow=c(1,2)) plot(ht_c,hang = -1) rect.hclust(ht_c,k=10,border = "red") plot(ht_a,hang = -1) rect.hclust(ht_a,k=10,border = "blue") par(mfrow=c(1,1)) # agrego la columna de cluster datos$cluster<-cutree(ht_c, 10) par(mfrow=c(1,2)) plot(datos[,1:2],col=cutree(ht_c,5),pch=20) plot(datos[,1:2],col=cutree(ht_a,6),pch=20) par(mfrow=c(1,1)) ################################ #usando el metodo de k-medias pedimos que separe en dos grupos y graficamos datos<-datos[,-5] k_medias<-kmeans(datos,2) names(k_medias) k_medias$cluster k_medias$tot.withinss # me da la variabilidad total dentro de los grupos, quiero que sea minima plot(datos,col=k_medias$cluster+2,pch=20,cex=1) #si pruebo con mas clusters... k_medias<-kmeans(datos,3) plot(datos,col=k_medias$cluster+2,pch=20,cex=1) k_medias<-kmeans(datos,4) plot(datos,col=k_medias$cluster+2,pch=20,cex=1) # ¿que valor de k elijo? # la idea es buscar minimizar la traza de W # (que es la variabilidad dentro de cada grupo) # o lo que es equivalente, maximizar la traza de B within_sof<-c() for(i in 1:15) { k_medias<-kmeans(datos,i) within_sof[i]<-k_medias$tot.withinss } plot(1:15,within_sof) lines(1:15,within_sof) #a partir de k=7 parece bastante estable, elijo k=7 k_medias<-kmeans(datos,7) plot(datos,col=k_medias$cluster+2,pch=20,cex=1) k_medias$centers cluster<-cutree(ht_c,6) library(MASS) #los proyecto usando coordenadas discriminantes LDA_medias<-lda(k_medias$cluster~datos[,1]+datos[,2]+datos[,3]+datos[,4]) LDA_medias$scaling x1<-t(LDA_medias$scaling[,1])%*%t(datos) x2<-t(LDA_medias$scaling[,2])%*%t(datos) col<-c(col1,col2,col3,col4,col5,col6) plot(x1,x2,col=col[k_medias$cluster],pch=20) text(x1,x2,rownames(datos),pos = 1,cex=0.5) LDA_cluster<-lda(cluster~datos[,1]+datos[,2]+datos[,3]+datos[,4]) LDA_cluster$scaling x11<-t(LDA_cluster$scaling[,1])%*%t(datos) x22<-t(LDA_cluster$scaling[,2])%*%t(datos) plot(x11,x22,col=rainbow(6)[cluster],pch=20) text(x11,x22,rownames(datos),pos = 1,cex=0.5) par(mfrow=c(1,2)) plot(x1,x2,col=rainbow(6)[k_medias$cluster],pch=20) text(x1,x2,rownames(datos),pos = 1,cex=0.5) plot(x11,x22,col=rainbow(6)[cluster],pch=20) text(x11,x22,rownames(datos),pos = 1,cex=0.5) par(mfrow=c(1,1))