# ###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,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 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 misrua diversa. Con il comando scale riportiamo tutte sulla stessa scala di misura standardizzata ## 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$g2 # Esempio: unità statistiche raggruppate nel gruppo 2 #silhouette per raggruppamento in 5 cluster (per esercizio fatelo anche con 3 cluster!) ?silhouette si <- silhouette(C5,dist(Auto),nmax.lab=60) summary(si) plot(si, main="", col=1:5) # grafico dell'indice di suilhouette per cluaster gerarchica con 5 gruppi con colori diversi per gruppo Autosi = cbind(Auto[,1], si[,1:3]) # uniamo i nomi delle unità statistiche e i risultati dell'indice di silhouette Autosi <- as.data.frame(Autosi) Autosi[order(Autosi$sil_width, decreasing = FALSE),] # ordiniamo dal "peggiore" classificato (con silhouette negativa) al migliore ################ Metedo delle K MEDIE ?kmeans auto.kmean=kmeans(Auto,centers=5, nstart=10) # voglio 5 gruppi (centers=5) partendo da una partizione casuale in 5 gruppi (nstart=10) 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$g5 # u.s. ragguppate nel gruppo 5 plot(silhouette(auto.kmean$cluster, dist(Auto)), main=" ", col=1:5) # la silhouette si puo calcolare anche per questo metodo ################################################################ ## CLUSTER ANALYSIS SU VOTER DATA (per report 28/01) ############################################################### # d è il vostro dataframe di partenza a cui avrete già tolto gli na con la funzione na.omit # usate il vettore dei nomi delle variabili che vi interessano per fare analisi dei gruppi (attenzione solo variabili quantitative!) nomi=c("ft_black_2016", "ft_white_2016", "ft_hisp_2016", "ft_asian_2016", "ft_muslim_2016", "ft_jew_2016", "ft_christ_2016", "ft_fem_2016", "ft_immig_2016", "ft_blm_2016", "ft_wallst_2016", "ft_gays_2016", "ft_unions_2016", "ft_police_2016", "ft_altright_2016") dati_solo_ft <- d[,c(nomi)] # selezionate solo quelle variabili dati_solo_ft <- na.omit(dati_solo_ft) # togliete gli na (gia dovreste averlo fatto!) esempio <- hclust(dist(dati_solo_ft),method="ward.D") # cluster gerarchica newDati <- cbind(d, prova$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)