# ###Cluster Analysis # ####################################### install.packages("cluster") library(cluster) #lettura dati DataAuto=read.csv("autovetture.csv",sep=";",dec=",",row.names=1) # row.names=1 indica che nella colonna 1 ci sono i nomi delle unità statistiche auto.orig <- DataAuto # salvo i dati orginali nell'oggetto auto.orig e modifico di seguito DataAuto ## seleziono le sole auto a benzina (DataAuto conterrà solo le auto a benzina) DataAuto=subset(DataAuto,subset= alim=="b") ## seleziono solo alcune variabili mediante le quali creare la matrice di distanza tra le unità statistiche e poi raggrupparle mediante l'analisi dei gruppi names(DataAuto) var.n=c("cilindri", "cilindrata", "potenza", "lung","larg", "alt","peso","vel","acc","con_misto") # var.n contiene un vettore dei nomi delle variabili che mi interessano Auto=DataAuto[,var.n] #Auto è il sottoinsieme del dataframe che contiene solo le variabili elencate nel vettore var.n Auto=na.omit(Auto) # la funzione na.omit cancella tutte quelle unità statistiche che hanno almeno unitem nonsresponse (sovrascrivo il dataframe Auto) #standardizzazione Auto <- scale(Auto) # le variabili hanno tutte scala di misura diversa. Con il comando scale riportiamo tutte sulla stessa scala di misura standardizzata ################ Metedo delle K MEDIE ?kmeans auto.kmean=kmeans(Auto,centers=5, nstart=5) # voglio 5 gruppi (centers=5) partendo da una partizione casuale in 5 gruppi (nstart=5) class(auto.kmean) auto.kmean$cluster # i gruppi trovati G=list(g1=which(auto.kmean$cluster==1), g2=which(auto.kmean$cluster==2), g3=which(auto.kmean$cluster==3), g4=which(auto.kmean$cluster==4), g5=which(auto.kmean$cluster==5)) # Lista delle u.s. nei gruppi G G$g5# u.s. ragguppate nel gruppo 5 dist(Auto) plot(silhouette(auto.kmean$cluster, dist(Auto)), main=" Silhouette k-means 5 gruppi", col=1:5) # la silhouette si puo calcolare anche per questo metodo ################ Cluster gerarchica ## Analisi dei gruppi medianti metodo gerarchico agglomerativo (con il legame di Ward) # la funzione da usare è hclust() ?hclust # leggete l'help! auto_hc <- hclust(dist(Auto),method="ward.D") # gli argomenti della funzione hclust devono essere la matrice di distanza tra le unità statistiche sulla base delle varibili scelte e la specificazione del metodo usato per fondere i gruppi a ogni iterazione dell'algoritmo plot(auto_hc) # dendrogramma rect.hclust(auto_hc, 3) # racchiudo con un rettangolo le unità statistiche che appartengono ai 3 gruppi rect.hclust(auto_hc ,5, border = 3) # racchiudo con un rettangolo le unità statistiche che appartengono ai 5 gruppi (colore dei bordi=3 ossia verde) #raggruppamento in 5 cluster (taglio dell'albero) e elenco delle unità statistiche dentro i gruppi C5<-cutree(auto_hc, 5) table(C5) # numerosità dei gruppi G=list(g1=which(C5==1), g2=which(C5==2), g3=which(C5==3), g4=which(C5==4), g5=which(C5==5)) # elenco delle unità statistihe nei gruppi G G$g1 # Esempio: unità statistiche raggruppate nel gruppo 2 #silhouette per raggruppamento in 5 cluster (per esercizio fatelo anche con 3 cluster!) ?silhouette silhouette(C5,dist(Auto),nmax.lab=60) si <- silhouette(C5,dist(Auto),nmax.lab=60) summary(si) plot(si, main="Clustering gerarchica 5 gruppi (Ward)", col=1:5) # grafico dell'indice di suilhouette per cluaster gerarchica con 5 gruppi con colori diversi per gruppo Autosi = data.frame(rownames(Auto), si[,1:3]) # uniamo i nomi delle unità statistiche e i risultati dell'indice di silhouette Autosi Autosi[order(Autosi$sil_width, decreasing = FALSE), ] # ordiniamo dal "peggiore" classificato (con silhouette negativa) al migliore # proviamo a farlo anche per il raggruppamento secondo l'algoritmo k-means si <- silhouette(auto.kmean$cluster,dist(Auto),nmax.lab=60) summary(si) plot(si, main="", col=1:5) # grafico dell'indice di suilhouette per cluster gerarchica con 5 gruppi con colori diversi per gruppo Autosi = data.frame(rownames(Auto), si[,1:3]) # uniamo i nomi delle unità statistiche e i risultati dell'indice di silhouette Autosi[order(Autosi$sil_width, decreasing = FALSE),] # ordiniamo dal "peggiore" classificato (con silhouette negativa) al migliore ################################################################ # Usare la cluster # per es. K-means Auto_new = data.frame(Auto, ClustersKM5 = auto.kmean$cluster, ClustersHC5 = C5) Auto_new boxplot(Auto_new$con_misto ~ Auto_new$ClustersKM5) ################################################################ ## CLUSTER ANALYSIS SU VOTER DATA ############################################################### feeling <- read.csv("feeling.csv", header=T, sep=";") dim(feeling) View(feeling) feeling=na.omit(feeling) esempio <- hclust(dist(feeling),method="single") # cluster gerarchica newFeeling <- cbind(feeling, esempio$cluster) # in NewDati unite ai dati la partizione trovata con il metodo di sopra e commentate i gruppi che avete trovato mediante descrittive per ogni gruppo (caratterizzate i gruppi ceh avete trovato, ad esempio guardando la distribuzione della varibaili voto, genere, Stato, ecc)