cluster analysis
Transcript
cluster analysis
UNIVERSITA’ DEGLI STUDI DI CATANIA Facoltà di Economia Corso di Laurea Magistrale in Finanza Aziendale T ESINA DI A NALISI DEI D ATI CLUSTER ANALYSIS Docente: Dott. Antonio PUNZO Marco BARBERA Oggetto di studio del presente lavoro è la Cluster Analysis, cioè la classificazione delle unità statistiche in gruppi omogenei in base alle variabili considerate, attraverso l’uso del software “R”. Il dataset sul quale sarà effettuata l’analisi dei gruppi esistenti è “crabs” (Misure Morfologiche sui Granchi Leptograpsus), già presente in “R” all’interno del pacchetto “MASS”. > library(MASS) > crabs sp sex index FL RW CL CW BD 1 B M 1 8.1 6.7 16.1 19.0 7.0 2 B M 2 8.8 7.7 18.1 20.8 7.4 3 B M 3 9.2 7.8 19.0 22.4 7.7 4 B M 4 9.6 7.9 20.1 23.1 8.2 5 B M 5 9.8 8.0 20.3 23.0 8.2 …………………………………………………………………………………………………………… > str(crabs) 'data.frame': 200 obs. of 8 variables: $ sp : Factor w/ 2 levels "B","O": 1 1 1 1 1 1 1 1 1 1 ... $ sex : Factor w/ 2 levels "F","M": 2 2 2 2 2 2 2 2 2 2 ... $ index: int 1 2 3 4 5 6 7 8 9 10 ... $ FL : num 8.1 8.8 9.2 9.6 9.8 10.8 11.1 11.6 11.8 11.8 ... $ RW : num 6.7 7.7 7.8 7.9 8 9 9.9 9.1 9.6 10.5 ... $ CL : num 16.1 18.1 19 20.1 20.3 23 23.8 24.5 24.2 25.2 ... $ CW : num 19 20.8 22.4 23.1 23 26.5 27.1 28.4 27.8 29.3 ... $ BD : num 7 7.4 7.7 8.2 8.2 9.8 9.8 10.4 9.7 10.3 ... > summary(crabs) sp sex index B:100 F:100 Min. : 1.0 O:100 M:100 1st Qu.:13.0 Median :25.5 Mean :25.5 3rd Qu.:38.0 Max. :50.0 CL CW Min. :14.70 Min. :17.10 1st Qu.:27.27 1st Qu.:31.50 Median :32.10 Median :36.80 Mean :32.11 Mean :36.41 3rd Qu.:37.23 3rd Qu.:42.00 Max. :47.60 Max. :54.60 FL Min. : 7.20 1st Qu.:12.90 Median :15.55 Mean :15.58 3rd Qu.:18.05 Max. :23.10 BD Min. : 6.10 1st Qu.:11.40 Median :13.90 Mean :14.03 3rd Qu.:16.60 Max. :21.60 RW Min. : 6.50 1st Qu.:11.00 Median :12.80 Mean :12.74 3rd Qu.:14.30 Max. :20.20 Il data frame è composto da 200 unità statistiche (righe) e dalle seguenti 8 variabili (colonne): - sp = specie (Tipo: qualitativa; Modalità: “B” per blu, “O” per arancione; Scala di misurazione: nominale) 1 - sex = sesso (Tipo: qualitativa; Modalità: “M” per maschio, “F” per femmina; Scala di misurazione: nominale) - index = indice da 1 a 50 all’interno di ciascuno dei quattro gruppi (Tipo: quantitativa discreta; Modalità: {1, 2, 3, …, 49, 50}; Scala di misurazione: di rapporti) - FL = misura del lobo frontale in mm (Tipo: quantitativa continua; Modalità: [7 , 24]; Scala di misurazione: di rapporti) - RW = larghezza della parte posteriore in mm (Tipo: quantitativa continua; Modalità: [6 , 21]; Scala di misurazione: di rapporti) - CL = lunghezza del carapace in mm (Tipo: quantitativa continua; Modalità: [14 , 48]; Scala di misurazione: di rapporti) - CW = larghezza del carapace in mm (Tipo: quantitativa continua; Modalità: [17 , 55]; Scala di misurazione: di rapporti) - BD = grandezza del corpo in mm (Tipo: quantitativa continua; Modalità: [6 , 22]; Scala di misurazione: di rapporti) Ai fini della nostra analisi, data l’elevata numerosità delle unità statistiche, si è scelto di prendere in considerazione soltanto gli individui di sesso maschile e di individuare al loro interno a quale specie appartengono (“B” o “O”). > FL <- crabs[c(1:50, 101:150), 4] > RW <- crabs[c(1:50, 101:150), 5] > CL <- crabs[c(1:50, 101:150), 6] > CW <- crabs[c(1:50, 101:150), 7] > BD <- crabs[c(1:50, 101:150), 8] > crabs1 <- data.frame(FL, RW, CL, CW, BD) > rownames(crabs1) <- c(paste("B", 1:50, sep=""), paste("O", 1:50, sep="")) > crabs1 FL B1 8.1 B2 8.8 RW CL CW 6.7 16.1 19.0 7.7 18.1 20.8 BD 7.0 7.4 2 B3 9.2 7.8 19.0 22.4 7.7 B4 9.6 7.9 20.1 23.1 8.2 B5 9.8 8.0 20.3 23.0 8.2 ………………………………………………………………………… > str(crabs1) 'data.frame': 100 obs. of 5 variables: $ FL: num 8.1 8.8 9.2 9.6 9.8 10.8 11.1 11.6 11.8 11.8 ... $ RW: num 6.7 7.7 7.8 7.9 8 9 9.9 9.1 9.6 10.5 ... $ CL: num 16.1 18.1 19 20.1 20.3 23 23.8 24.5 24.2 25.2 ... $ CW: num 19 20.8 22.4 23.1 23 26.5 27.1 28.4 27.8 29.3 ... $ BD: num 7 7.4 7.7 8.2 8.2 9.8 9.8 10.4 9.7 10.3 ... Operando in questo modo, il nuovo dataset è composto soltanto da 100 unità statistiche e da 5 variabili quantitative continue. Esso non presenta problemi di comparabilità tra le unità statistiche sia perché non vi sono dati mancanti sia perché tutte le variabili sono espresse nella stessa unità di misura (mm). > mean(crabs1) FL RW CL CW BD 15.734 11.990 32.851 36.999 14.337 > sd(crabs1) FL RW CL CW BD 3.463379 2.160504 7.471204 8.330248 3.494228 > var(FL) [1] 11.99499 > var(RW) [1] 4.667778 > var(CL) [1] 55.81889 > var(CW) [1] 69.39303 > var(BD) [1] 12.20963 Inoltre, come si può notare dal calcolo degli scarti quadratici medi e delle varianze, non dovrebbero esserci nemmeno grossi problemi di ordine di grandezza e/o di maggiore variabilità tra le variabili in esame. Non è, quindi, necessario calcolare gli scostamenti standardizzati di ciascuna variabile. Calcoliamo adesso gli indici di concordanza (assoluti e relativi) per valutare se esiste una dipendenza lineare tra le variabili considerate che saranno quindi eliminate al fine di non appesantire l’analisi con variabili ridondanti e irrilevanti per il problema oggetto di studio. 3 > cov(crabs1) FL RW FL 11.994994 7.244283 RW 7.244283 4.667778 CL 25.459259 15.876879 CW 27.851044 17.619990 BD 12.023174 7.297040 CL 25.45926 15.87688 55.81889 61.90702 25.58304 CW 27.85104 17.61999 61.90702 69.39303 27.94377 BD 12.02317 7.29704 25.58304 27.94377 12.20963 La matrice di covarianze mostra che tutte le variabili tendono ad assumere valori concordanti tra loro (Cov (X, Y) > 0). > cor(crabs1) FL RW FL 1.0000000 0.9681448 RW 0.9681448 1.0000000 CL 0.9839095 0.9836021 CW 0.9653472 0.9790224 BD 0.9935001 0.9665859 CL 0.9839095 0.9836021 1.0000000 0.9946983 0.9799647 CW 0.9653472 0.9790224 0.9946983 1.0000000 0.9600104 BD 0.9935001 0.9665859 0.9799647 0.9600104 1.0000000 > plot(crabs1, cex=0.5, pch=16, col=c(rep("blue", 50), rep("orange", 50))) Come si evince dal grafico e dalla matrice di correlazione, essendo tutti i valori prossimi a 1, vi è una forte relazione lineare positiva tra tutte le variabili, in particolare tra la lunghezza (CL) e la larghezza (CW) del carapace e tra la misura del lobo frontale (FL) e la grandezza del corpo (BD). La considerazione, per ogni coppia, di entrambe le variabili fornirebbe scarse informazioni aggiuntive sul grado di diversità tra le due specie in esame. 4 Le variabili meno correlate tra loro sono la larghezza del carapace (CW) e la grandezza del corpo (BD) e saranno proprio loro ad essere utilizzate nella nostra analisi in quanto le informazioni fornite risultano essere meno ripetitive. > crabs2 <- data.frame(CW, BD) > rownames(crabs2) <- c(paste("B", 1:50, sep=""), paste("O", 1:50, sep="")) > crabs2 CW BD B1 19.0 7.0 B2 20.8 7.4 B3 22.4 7.7 B4 23.1 8.2 B5 23.0 8.2 ………………………………… Rappresentiamo graficamente il dataset oggetto di studio. > par(mai=c(0.9, 0.9, 0.7, 0.7)) > plot(crabs2, cex=0.5, pch=16, col=c(rep("blue", 50), rep("orange", 50)), xlab="Larghezza Carapace", ylab="Grandezza Corpo") Dall’analisi del grafico si nota una quasi netta separazione tra le due specie. Nonostante ciò, prima di applicare i vari metodi di formazione dei gruppi (gerarchici, non gerarchici e model-based clustering) è, però, sensato eseguire un’analisi preliminare per verificare l’esistenza di una reale struttura di gruppo nei dati a disposizione. 5 > library(KernSmooth) > bwCW <- density(CW)$bw > bwBD <- density(BD)$bw > griglia <- bkde2D(crabs2, gridsize=c(101, 101), bandwidth=c(bwCW, bwBD)) > par(mai=c(0.9, 0.9, 0.7, 0.7)) > contour(x=griglia$x1, y=griglia$x2, z=griglia$fhat, xlab="Larghezza Carapace", ylab="Grandezza Corpo") > points(crabs2, cex=0.5, pch=16, col=c(rep("blue", 50), rep("orange", 50))) > par(mai=c(0.02, 0.02, 0.01, 0.01)) > persp(x=griglia$x1, y=griglia$x2, z=griglia$fhat, xlab="Larghezza Carapace", ylab="Grandezza Corpo", zlab="Densità Kernel", theta=-18, axes=T, box=T) 6 Anche questo grafico conferma la presenza di due gruppi all’interno del dataset. Per proseguire la nostra analisi attraverso l’utilizzo dei metodi di classificazione gerarchici occorre prima scegliere, tra le tante possibili, una misura di diversità e calcolare la rispettiva matrice delle distanze. Si è scelto di usare la distanza euclidea in quanto è quella che risulta maggiormente impiegata in statistica. > d.euclidea <- dist(crabs2, method="euclidean") > d.euclidea B1 B2 B3 B4 B5 B6 B2 1.8439089 B3 3.4713110 1.6278821 B4 4.2720019 2.4351591 0.8602325 B5 4.1761226 2.3409400 0.7810250 0.1000000 B6 8.0056230 6.1846584 4.6065171 3.7576588 3.8483763 B7 8.5702975 6.7416615 5.1478151 4.3081318 4.4011362 0.6000000 ……………………………………………………………………………………………………………………………………………………………………………………… 7 All’interno degli algoritmi gerarchici esistono diversi metodi di classificazione che si differenziano a seconda del criterio utilizzato nel calcolare la distanza fra due gruppi: - Metodo del legame singolo o del vicino più prossimo > l.singolo <- hclust(d.euclidea, method="single") > cutree(l.singolo, 2) B1 B2 B3 B4 B5 B6 1 1 1 1 1 1 B20 B21 B22 B23 B24 B25 1 1 1 1 1 1 B39 B40 B41 B42 B43 B44 1 1 1 1 1 1 O8 O9 O10 O11 O12 O13 1 1 1 1 1 1 O27 O28 O29 O30 O31 O32 1 1 1 1 1 1 O46 O47 O48 O49 O50 1 1 1 1 1 B7 1 B26 1 B45 1 O14 1 O33 1 B8 1 B27 1 B46 1 O15 1 O34 1 B9 1 B28 1 B47 1 O16 1 O35 1 B10 1 B29 1 B48 1 O17 1 O36 1 B11 1 B30 1 B49 1 O18 1 O37 1 B12 1 B31 1 B50 2 O19 1 O38 1 B13 1 B32 1 O1 1 O20 1 O39 1 B14 1 B33 1 O2 1 O21 1 O40 1 B15 1 B34 1 O3 1 O22 1 O41 1 B16 1 B35 1 O4 1 O23 1 O42 1 B17 1 B36 1 O5 1 O24 1 O43 1 B18 1 B37 1 O6 1 O25 1 O44 1 B19 1 B38 1 O7 1 O26 1 O45 1 > par(mai=c(0.5, 0.9, 0.7, 0.7)) > plot(l.singolo, cex=0.5, main="Metodo del Legame Singolo") > rect.hclust(l.singolo, k=2, border="red") Il metodo del legame singolo, come si può vedere dal dendogramma, non riesce per nulla a classificare le unità in due gruppi, infatti, esse sono tutte assegnate al primo gruppo ad eccezione di una. 8 - Metodo del legame completo o del vicino più lontano > l.completo <- hclust(d.euclidea, method="complete") > cutree(l.completo, 2) B1 B2 B3 B4 B5 B6 B7 1 1 1 1 1 1 1 B20 B21 B22 B23 B24 B25 B26 1 1 1 1 1 1 1 B39 B40 B41 B42 B43 B44 B45 2 2 2 2 2 2 2 O8 O9 O10 O11 O12 O13 O14 1 1 1 1 1 1 1 O27 O28 O29 O30 O31 O32 O33 2 2 2 2 2 2 2 O46 O47 O48 O49 O50 2 2 2 2 2 B8 1 B27 1 B46 2 O15 1 O34 2 B9 1 B28 2 B47 2 O16 1 O35 2 B10 1 B29 2 B48 2 O17 1 O36 2 B11 1 B30 2 B49 2 O18 1 O37 2 B12 1 B31 2 B50 2 O19 1 O38 2 B13 1 B32 2 O1 1 O20 1 O39 2 B14 1 B33 2 O2 1 O21 1 O40 2 B15 1 B34 2 O3 1 O22 1 O41 2 B16 1 B35 2 O4 1 O23 1 O42 2 B17 1 B36 2 O5 1 O24 1 O43 2 B18 1 B37 2 O6 1 O25 1 O44 2 B19 1 B38 2 O7 1 O26 2 O45 2 > par(mai=c(0.5, 0.9, 0.7, 0.7)) > plot(l.completo, cex=0.5, main="Metodo del Legame Completo") > rect.hclust(l.completo, k=2, border="red") Con il metodo del legame completo 52 unità vengono assegnate al primo gruppo mentre le restanti 48 sono assegnate al secondo. Nonostante ciò, dall’analisi del dendogramma si nota che i due gruppi che si sono venuti a formare non rispecchiano quelli reali, infatti, il primo gruppo è composto da 27 unità appartenenti alla specie “B” e 25 unità appartenenti alla specie “O” mentre il secondo gruppo da 23 specie “B” e 25 specie “O”. 9 - Metodo del legame medio > l.medio <- hclust(d.euclidea, method="average") > cutree(l.medio, 2) B1 B2 B3 B4 B5 B6 1 1 1 1 1 1 B20 B21 B22 B23 B24 B25 1 1 1 1 1 1 B39 B40 B41 B42 B43 B44 2 2 2 2 2 2 O8 O9 O10 O11 O12 O13 1 1 1 1 1 1 O27 O28 O29 O30 O31 O32 2 2 2 2 2 2 O46 O47 O48 O49 O50 2 2 2 2 2 B7 1 B26 1 B45 2 O14 1 O33 2 B8 1 B27 1 B46 2 O15 1 O34 2 B9 1 B28 2 B47 2 O16 1 O35 2 B10 1 B29 2 B48 2 O17 1 O36 2 B11 1 B30 2 B49 2 O18 1 O37 2 B12 1 B31 2 B50 2 O19 1 O38 2 B13 1 B32 2 O1 1 O20 1 O39 2 B14 1 B33 2 O2 1 O21 1 O40 2 B15 1 B34 2 O3 1 O22 1 O41 2 B16 1 B35 2 O4 1 O23 1 O42 2 B17 1 B36 2 O5 1 O24 1 O43 2 B18 1 B37 2 O6 1 O25 1 O44 2 B19 1 B38 2 O7 1 O26 2 O45 2 > par(mai=c(0.5, 0.9, 0.7, 0.7)) > plot(l.medio, cex=0.5, main="Metodo del Legame Medio") > rect.hclust(l.medio, k=2, border="red") La classificazione finale ottenuta con il metodo del legame medio è uguale a quella del legame completo. 10 - Metodo del centroide > centroide <- hclust(d.euclidea, method="centroid") > cutree(centroide, 2) B1 B2 B3 B4 B5 B6 1 1 1 1 1 1 B20 B21 B22 B23 B24 B25 1 1 1 1 1 1 B39 B40 B41 B42 B43 B44 2 2 2 2 2 2 O8 O9 O10 O11 O12 O13 1 1 1 1 1 1 O27 O28 O29 O30 O31 O32 2 1 2 2 2 2 O46 O47 O48 O49 O50 2 2 2 2 2 B7 1 B26 1 B45 2 O14 1 O33 2 B8 1 B27 1 B46 2 O15 1 O34 2 B9 1 B28 2 B47 2 O16 1 O35 2 B10 1 B29 1 B48 2 O17 1 O36 2 B11 1 B30 1 B49 2 O18 1 O37 2 B12 1 B31 2 B50 2 O19 1 O38 2 B13 1 B32 2 O1 1 O20 1 O39 2 B14 1 B33 2 O2 1 O21 1 O40 2 B15 1 B34 2 O3 1 O22 1 O41 2 B16 1 B35 2 O4 1 O23 1 O42 2 B17 1 B36 2 O5 1 O24 1 O43 2 B18 1 B37 2 O6 1 O25 1 O44 2 B19 1 B38 2 O7 1 O26 2 O45 2 > par(mai=c(0.5, 0.9, 0.7, 0.7)) > plot(centroide, cex=0.5, main="Metodo del Centroide") > rect.hclust(centroide, k=2, border="red") Il dendogramma mostra che 55 unità appartengono al primo gruppo e 45 al secondo. Anche con il metodo del centroide, tuttavia, i gruppi ottenuti non rispecchiano la classificazione reale, infatti, nel primo gruppo ci rientrano 29 unità della specie “B” e 26 della specie “O” mentre nel secondo 21 unità della specie “B” e 24 della “O”. 11 - Metodo di Ward o della minima devianza > ward <- hclust(d.euclidea, method="ward") > cutree(ward, B1 B2 B3 B4 1 1 1 1 B20 B21 B22 B23 1 1 1 1 B39 B40 B41 B42 2 2 2 2 O8 O9 O10 O11 1 1 1 1 O27 O28 O29 O30 2 2 2 2 O46 O47 O48 O49 2 2 2 2 2) B5 1 B24 1 B43 2 O12 1 O31 2 O50 2 B6 1 B25 1 B44 2 O13 1 O32 2 B7 1 B26 1 B45 2 O14 1 O33 2 B8 1 B27 1 B46 2 O15 1 O34 2 B9 1 B28 2 B47 2 O16 1 O35 2 B10 1 B29 2 B48 2 O17 1 O36 2 B11 1 B30 2 B49 2 O18 1 O37 2 B12 1 B31 2 B50 2 O19 1 O38 2 B13 1 B32 2 O1 1 O20 1 O39 2 B14 1 B33 2 O2 1 O21 1 O40 2 B15 1 B34 2 O3 1 O22 1 O41 2 B16 1 B35 2 O4 1 O23 1 O42 2 B17 1 B36 2 O5 1 O24 1 O43 2 B18 1 B37 2 O6 1 O25 1 O44 2 B19 1 B38 2 O7 1 O26 2 O45 2 > par(mai=c(0.5, 0.9, 0.7, 0.7)) > plot(ward, cex=0.5, main="Metodo di Ward") > rect.hclust(ward, k=2, border="red") Anche il metodo di Ward come si può notare dal dendogramma non riesce a classificare correttamente le unità rispetto alla reale classificazione, infatti, i gruppi che ha formato sono uguali a quelli ottenuti con il metodo del legame completo e del legame medio. 12 Confronto tra metodi gerarchici > par(mfrow=c(2, 3)) > par(mai=c(0.3, 0.5, 0.3, 0.1)) > plot(l.singolo, cex=0.5, main="Metodo del Legame Singolo") > rect.hclust(l.singolo, k=2, border="red") > par(mai=c(0.3, 0.5, 0.3, 0.1)) > plot(l.completo, cex=0.5, main="Metodo del Legame Completo") > rect.hclust(l.completo, k=2, border="red") > par(mai=c(0.3, 0.5, 0.3, 0.1)) > plot(l.medio, cex=0.5, main="Metodo del Legame Medio") > rect.hclust(l.medio, k=2, border="red") > par(mai=c(0.3, 0.5, 0.3, 0.1)) > plot(centroide, cex=0.5, main="Metodo del Centroide") > rect.hclust(centroide, k=2, border="red") > par(mai=c(0.3, 0.5, 0.3, 0.1)) > plot(ward, cex=0.5, main="Metodo di Ward") > rect.hclust(ward, k=2, border="red") > par(mfrow=c(1, 1)) Nel complesso, tramite il confronto dei cinque metodi gerarchici e dei rispettivi dendogrammi, possiamo affermare che nessuno di essi è in grado di rispecchiare correttamente la classificazione reale poiché i gruppi ottenuti tendono ad includere sia elementi della specie “B” che elementi della specie “O”. 13 Proseguiamo la nostra analisi di classificazione dei gruppi attraverso l’algoritmo non gerarchico di uso più comune: il metodo delle k-medie. > cl <- kmeans(crabs2, centers=2, nstart=25) > cl K-means clustering with 2 clusters of sizes 52, 48 Cluster means: CW BD 1 30.31731 11.61346 2 44.23750 17.28750 Clustering B1 B2 B3 1 1 1 B20 B21 B22 1 1 1 B39 B40 B41 2 2 2 O8 O9 O10 1 1 1 O27 O28 O29 2 2 2 O46 O47 O48 2 2 2 vector: B4 B5 1 1 B23 B24 1 1 B42 B43 2 2 O11 O12 1 1 O30 O31 2 2 O49 O50 2 2 B6 1 B25 1 B44 2 O13 1 O32 2 B7 1 B26 1 B45 2 O14 1 O33 2 B8 1 B27 1 B46 2 O15 1 O34 2 B9 1 B28 2 B47 2 O16 1 O35 2 B10 1 B29 2 B48 2 O17 1 O36 2 B11 1 B30 2 B49 2 O18 1 O37 2 B12 1 B31 2 B50 2 O19 1 O38 2 B13 1 B32 2 O1 1 O20 1 O39 2 B14 1 B33 2 O2 1 O21 1 O40 2 B15 1 B34 2 O3 1 O22 1 O41 2 B16 1 B35 2 O4 1 O23 1 O42 2 B17 1 B36 2 O5 1 O24 1 O43 2 B18 1 B37 2 O6 1 O25 1 O44 2 B19 1 B38 2 O7 1 O26 2 O45 2 Within cluster sum of squares by cluster: [1] 1390.575 1047.965 (between_SS / total_SS = 69.8 %) Available components: [1] "cluster" "centers" [5] "tot.withinss" "betweenss" "totss" "size" "withinss" > par(mai=c(0.9, 0.9, 0.7, 0.7)) > plot(crabs2, cex=0.5, pch=16, col=cl$cluster, xlab="Larghezza Carapace", ylab="Grandezza Corpo") > points(cl$centers, col=1:2, pch=1, cex=1) 14 Come possiamo osservare dal grafico il metodo delle k-medie individua un primo gruppo di 52 unità e un secondo gruppo di 48. I due gruppi trovati non corrispondono, però, alle due diverse specie presenti nel dataset, infatti, il primo gruppo contiene 27 elementi della specie “B” e 25 elementi della specie “O” mentre il secondo gruppo ne comprende 23 della specie “B” e 25 della specie “O”. In definitiva anche il metodo non gerarchico utilizzato non riesce ad individuare la corretta separazione tra le due differenti specie. Utilizziamo, infine, il cd. model-based clustering attraverso miscugli di distribuzioni normali. > library(mclust) > MBcl <- Mclust(crabs2) > MBcl best model: ellipsoidal, unconstrained with 3 components > MBcl.BIC <- mclustBIC(crabs2) > summary(MBcl.BIC, data=crabs2) classification table: 1 2 3 48 8 44 15 best BIC values: VVV,3 VVV,4 VVV,5 -950.5722 -965.1676 -981.9644 > par(mfrow=c(2, 2)) > par(mai=c(0.7, 0.7, 0.3, 0.1)) > plot(MBcl, data=crabs2) Il modello migliore generato dall’algoritmo è quello ellissoidale non vincolato. Esso crea tre gruppi: il primo formato da 48 unità, il secondo da 8 e il terzo da 44 elementi. > apply(crabs2, 2, range) CW BD [1,] 18.6 7.0 [2,] 54.6 21.6 > x <- grid1(100, range=range(crabs2[,1])) > y <- grid1(100, range=range(crabs2[,2])) > xy <- grid2(x, y) > xyDens <- dens(modelName=MBcl$modelName, data=xy, parameters=MBcl$parameters) > xyDens <- matrix(xyDens, nrow=length(x), ncol=length(y)) > par(pty="m") > par(mai=c(0.02, 0.02, 0.01, 0.01)) 16 > persp(x=x, y=y, z=xyDens, xlab="Larghezza Carapace", ylab="Grandezza Corpo", zlab="Densità Miscuglio", theta=-45) Come si può vedere dai grafici, questo modello è l’unico che, nonostante la presenza di tre gruppi, riesce ad individuare in maniera piuttosto esatta la reale conformazione dei due gruppi, cioè delle due diverse specie, presenti all’interno del dataset considerato. 17