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