Sei sulla pagina 1di 11

ANALISI DEI DATI 2015/2016

Marilena Pillati

Esercitazione 4: Analisi discriminante

ESERCIZIO 1 Il file iris_sp.dat contiene i dati di 150 fiori relativi a 4 caratteristiche ritenute importanti per stabilire la specie di appartenenza del fiore: lunghezza e larghezza del sepalo, lunghezza e larghezza del petalo. I fiori sono di tre differenti specie: setosa, versicolor, virginica.

1. Apertura ed esplorazione del dataset

iris.sp<-read.table(file.choose(), header=T, sep=",", dec=".")

str(iris.sp)

'data.frame':

150 obs. of

5 variables:

$ Sepal.Length: num

$ Sepal.Width : num

$ Petal.Length: num

$ Petal.Width : num

$ Species: Factor w/ 3 levels "setosa","versicolor",

5.1 4.9 4.7 4.6 5 5.4 4.6 5 4.4 4.9

3.5 3 3.2 3.1 3.6 3.9 3.4 3.4 2.9 3.1

1.4 1.4 1.3 1.5 1.4 1.7 1.4 1.5 1.4 1.5

0.2 0.2 0.2 0.2 0.2 0.4 0.3 0.2 0.2 0.1

:

1

1

levels(iris.sp[,5])

[1] "setosa"

"versicolor" "virginica"

1

1

1

1

head(iris.sp) Sepal.Length Sepal.Width Petal.Length Petal.Width Species

1 5.1

3.5

1.4

0.2 setosa

2 4.9

3.0

1.4

0.2 setosa

3 4.7

3.2

1.3

0.2 setosa

4 4.6

3.1

1.5

0.2 setosa

5 5.0

3.6

1.4

0.2 setosa

6 5.4

3.9

1.7

0.4 setosa

summary(iris.sp)

Sepal.Length

Sepal.Width

Petal.Length

Petal.Width

Species

Min.

:4.300

Min.

:2.000

Min.

:1.000

Min.

:0.100

setosa

:50

1st Qu.:5.100

1st Qu.:2.800

1st Qu.:1.600

1st Qu.:0.300

versicolor:50

Median :5.800

Median :3.000

Median :4.350

Median :1.300

virginica :50

Mean

:5.843

Mean

:3.057

Mean

:3.758

Mean

:1.199

3rd Qu.:6.400

3rd Qu.:3.300

3rd Qu.:5.100

3rd Qu.:1.800

 

Max.

:7.900

Max.

:4.400

Max.

:6.900

Max.

:2.500

iris.sp$Species [1] setosa

setosa

setosa

setosa

setosa

setosa

[7] setosa

setosa

setosa

setosa

setosa

setosa

[13] setosa

setosa

setosa

setosa

setosa

setosa

[19] setosa

setosa

setosa

setosa

setosa

setosa

[25] setosa

setosa

setosa

setosa

setosa

setosa

[31] setosa

setosa

setosa

setosa

setosa

setosa

[37] setosa

setosa

setosa

setosa

setosa

setosa

[43] setosa

setosa

setosa

setosa

setosa

setosa

[49] setosa

setosa

versicolor versicolor versicolor versicolor

[55] versicolor versicolor versicolor versicolor versicolor versicolor [61] versicolor versicolor versicolor versicolor versicolor versicolor [67] versicolor versicolor versicolor versicolor versicolor versicolor

Analisi dei dati a.a. 2015/2016

[73] versicolor versicolor versicolor versicolor versicolor versicolor [79] versicolor versicolor versicolor versicolor versicolor versicolor [85] versicolor versicolor versicolor versicolor versicolor versicolor [91] versicolor versicolor versicolor versicolor versicolor versicolor [97] versicolor versicolor versicolor versicolor virginica virginica [103] virginica virginica virginica virginica virginica virginica [109] virginica virginica virginica virginica virginica virginica [115] virginica virginica virginica virginica virginica virginica [121] virginica virginica virginica virginica virginica virginica [127] virginica virginica virginica virginica virginica virginica [133] virginica virginica virginica virginica virginica virginica [139] virginica virginica virginica virginica virginica virginica [145] virginica virginica virginica virginica virginica virginica Levels: setosa versicolor virginica

Le 150 osservazioni provengono in numero uguale dalle tre popolazioni e sono ordinate in ragione della specie di appartenenza: i primi 50 fiori sono della specie setosa, i secondi 50 di versicolor e gli ultimi 50 di virginica. Vogliamo condurre l’analisi per determinare la regola discriminante per individuare la specie sulla base delle 4 caratteristiche dei fiori.

2. Analisi discriminante su 2 popolazioni

Semplifichiamo inizialmente il problema e consideriamo 2 sole specie (2 popolazioni): virginica e versicolor.

#salviamo la matrice che utilizzeremo per i calcoli (escludiamo la colonna specie)

iris<- as.matrix(iris.sp[51:150,1:4]) dim(iris) [1] 100

4

summary(iris)

 

Sepal.Length

Sepal.Width

Petal.Length

Petal.Width

Min.

:4.900

Min.

:2.000

Min.

:3.000

Min.

:1.000

1st Qu.:5.800

1st Qu.:2.700

1st Qu.:4.375

1st Qu.:1.300

Median :6.300

Median :2.900

Median :4.900

Median :1.600

Mean

:6.262

Mean

:2.872

Mean

:4.906

Mean

:1.676

3rd Qu.:6.700

3rd Qu.:3.025

3rd Qu.:5.525

3rd Qu.:2.000

Max.

:7.900

Max.

:3.800

Max.

:6.900

Max.

:2.500

#creiamo 2 matrici separate per le due specie e vediamone le principali statistiche descrittive #specie versicolor:

iris.ve <-iris[1:50,] summary(iris.ve)

Sepal.Length

Sepal.Width

Petal.Length

Petal.Width

Min.:

4.900

Min.

:2.000

Min.

:3.00

Min.

:1.000

1st Qu.:5.600

1st Qu.:2.525

1st Qu.:4.00

1st Qu.:1.200

Median :5.900

Median :2.800

Median :4.35

Median :1.300

Mean:

5.936

Mean

:2.770

Mean

:4.26

Mean

:1.326

3rd Qu.:6.300

3rd Qu.:3.000

3rd Qu.:4.60

3rd Qu.:1.500

Max.:

7.000

Max.

:3.400

Max.

:5.10

Max.

:1.800

#specie virginica:

iris.vi <- iris[51:100,] summary(iris.vi) Sepal.Length Sepal.Width Petal.Length Petal.Width

Min.:

4.900

Min.

:2.200

Min.

:4.500

Min.

:1.400

1st Qu.:6.225

1st Qu.:2.800

1st Qu.:5.100

1st Qu.:1.800

Median :6.500

Median :3.000

Median :5.550

Median :2.000

Mean:

6.588

Mean

:2.974

Mean

:5.552

Mean

:2.026

3rd Qu.:6.900

3rd Qu.:3.175

3rd Qu.:5.875

3rd Qu.:2.300

Max.:

7.900

Max.

:3.800

Max.

:6.900

Max.

:2.500

Analisi dei dati a.a. 2015/2016

Notiamo già dalle misure di sintesi che la specie virginica rispetto alla versicolor presenta in media valori più alti per tutte e 4 le variabili. Non c’è però una separazione netta tra le due popolazioni, infatti ci sono valori delle 4 variabili comuni ad entrambe (in blu i valori di virginica che sono compatibili con la specie versicolor).

#salviamo le dimensioni delle varie matrici

n.ve<-nrow(iris.ve); n.ve [1] 50 n.vi<-nrow(iris.vi); n.vi [1] 50 n<-n.ve+n.vi;

n

[1] 100 p<-ncol(iris);

p

[1] 4

g<-2;

L’idea centrale dell’analisi discriminante canonica di Fisher è quella di trovare una combinazione lineare delle variabili osservate Y=a’X tale che la varianza tra sia massima e la varianza entro sia minima. La combinazione lineare Y è detta variabile canonica. E’ possibile mostrare che il vettore dei coefficienti che serve per determinare Y, a meno di una costante moltiplicativa, è dato da = 1 1 −̅ 2 ).

Possiamo quindi calcolare agevolmente il vettore a dei coefficienti:

#calcoliamo la matrice S di varianza e covarianza entro (determiniamo prima la matrice di varianza e covarianza di ogni gruppo poi ne facciamo la media)

S.ve <- cov(iris.ve) S.vi <- cov(iris.vi)

S <- ((n.ve-1)*S.ve+(n.vi-1)*S.vi)/(n-2)

S

Sepal.Length Sepal.Width Petal.Length Petal.Width Sepal.Length 0.33538776 0.08947347 0.24309388 0.05243673 Sepal.Width 0.08947347 0.10123673 0.07701633 0.04441633 Petal.Length 0.24309388 0.07701633 0.26270204 0.06096327 Petal.Width 0.05243673 0.04441633 0.06096327 0.05726939

#calcoliamo i vettori delle medie nei due gruppi, col comando colMeans()

mean.ve <-apply(iris.ve,2,mean) mean.ve

Sepal.Length Sepal.Width Petal.Length Petal.Width

5.936

2.770

4.260

1.326

mean.vi <-apply(iris.vi,2,mean) mean.vi Sepal.Length Sepal.Width Petal.Length Petal.Width

6.588

2.974

5.552

2.026

a<-solve(S)%*%(mean.ve-mean.vi)

a

[,1]

Sepal.Length

3.556303

Sepal.Width

5.578621

Petal.Length -6.970128 Petal.Width -12.386041

La funzione discriminante diventa Y=3.56*x1+5.58*x2−6.97*x3−12.39*x4

Analisi dei dati a.a. 2015/2016

#calcoliamo i valori che Y assume sulle unità campionarie (mediante l’espressione nota come equazione discriminante di Fisher Y=Xa)

Y<-iris%*%a

dim(Y)

[1] 100

1

summary(Y)

V1

:-34.694

1st Qu.:-23.447 Median :-17.298

Mean

:-16.663

3rd Qu.: -9.935

: -2.006

Min.

Max.

Y è negativa e varia tra -34.7 e -2.0.

#Calcoliamo il punto di separazione sulla base del quale costruire la regola di assegnazione, che è dato dalla media tra i due baricentri:

Y.medio.ve<- mean.ve%*%a Y.medio.ve

[,1]

[1,] -9.553643

Y.medio.vi<- mean.vi%*%a Y.medio.vi

[,1]

[1,] -23.77253

pto.sep<- (Y.medio.ve+Y.medio.vi)/2 pto.sep

[,1]

[1,] -16.66309

Quindi se una nuova unità statistica avrà punteggio di Y< -16.66 sarà assegnata a virginica, se avrà punteggio maggiore sarà assegnata a versicolor.

Supponiamo di non sapere la specie di appartenenza e verifichiamo la previsione fatta dalla nostra regola discriminante.

Il comando ifelse() ci permette di specificare una condizione da verificare (test) e due

possibili esiti (yes, no) nel caso che la condizione si verifichi o meno. Restituisce un vettore.

?ifelse() ifelse(test, yes, no)

Utilizziamo ifelse() per vedere a quale specie la regola assegna ogni unità statistica.

vet.pto.sep<-rep(pto.sep, times=100) sp.prev<-ifelse(Y>vet.pto.sep, "versicolor", "virginica") table(sp.prev) sp.prev versicolor virginica

49

51

La regola discriminante assegna alla popolazione versicolor 49 unità mentre le altre 51 le assegna

a virginica.

#salviamo il vettore con la vera specie e confrontiamolo con la previsione:

sp.vera<-as.vector(iris.sp$Species[51:150])

Analisi dei dati a.a. 2015/2016

table(sp.prev, sp.vera) sp.vera

Sp.prev

versicolor virginica

versicolor

48

1

virginica

2

49

# graficamente plot(Y, type="n", ylab="Y", xlim=c(0,50)) text(Y[1:50], labels="ve", col="blue") text(Y[51:100], labels="vi", col="red") abline(h=pto.sep)

labels="vi", col="red") abline(h=pto.sep) Ci sono 3 unità mal classificate (2 nere 1 rossa), quindi

Ci sono 3 unità mal classificate (2 nere 1 rossa), quindi per tre fiori la regola discriminante non è

in grado di determinare correttamente la specie di appartenenza. E’ necessario tener presente che il basso numero di unità mal classificate è legato al fatto che la regola discriminante è stata costruita proprio sulla base delle informazioni relative a queste unità.

3. Analisi discriminante col comando lda()

Nel pacchetto MASS ci sono funzioni disponibili per eseguire l’analisi discriminante. La funzione per l'analisi discriminante lineare è lda()

library (MASS)

?lda lda(formula, data,

, subset, na.action)

In input è richiesto:

formula: formula del tipo: groups ~ x1 + x2 +

gruppi, mentre x1, x2 … sono le variabili osservate su cui costruire la regola discriminante; altri parametri

dove

groups è la variabile che determina i

In output restituisce:

Analisi dei dati a.a. 2015/2016

- le medie delle variabili osservate per ogni gruppo - i coefficienti delle variabili discriminanti altri parametri.

3.1 Analisi sul dataset con 2 sole popolazioni

#analisi discriminante su due gruppi

discr.2 <- lda(iris,sp.vera)

discr.2

Call:

lda(iris, grouping = sp.vera)

Prior probabilities of groups:

versicolor virginica

0.5

0.5

Group means:

Sepal.Length Sepal.Width Petal.Length Petal.Width

versicolor

5.936

2.770

4.260

1.326

virginica

6.588

2.974

5.552

2.026

Coefficients of linear discriminants:

LD1

Sepal.Length -0.9431178 Sepal.Width -1.4794287 Petal.Length 1.8484510 Petal.Width 3.2847304

# confronto i coefficienti della variabile canonica con quelli trovati in precedenza

a

[,1]

Sepal.Length 3.556303 Sepal.Width 5.578621 Petal.Length -6.970128 Petal.Width -12.386041

discr.2$scaling

LD1

Sepal.Length -0.9431178 Sepal.Width -1.4794287 Petal.Length 1.8484510

Petal.Width

3.2847304

discr.2$scaling[1]/a[1]

[1] -0.2651962

a*-0.2651962

[,1]

Sepal.Length -0.943118 Sepal.Width -1.479429 Petal.Length 1.848451

Petal.Width

3.284731

I coefficienti della variabile canonica non sono identici a quelli trovati precedentemente, perché lda() trova la variabile canonica Y normalizzata, ma sono a essi proporzionali, ovvero coincidono a meno di una costante moltiplicativa.

Per vedere il valore della variabile canonica per ogni unità e la popolazione d’assegnazione utilizziamo il comando predict.lda() applicato all’oggetto prodotto da lda:

Analisi dei dati a.a. 2015/2016

predict.lda prende in input l’oggetto creato col comando lda e restituisce:

class: un vettore che identifica la popolazione a cui ogni unità è assegnata x: il vettore che contiene i valori della variabile canonica

pred.2 <- predict(discr.2)

#vediamo la classificazione ottenuta con la regola discriminante

table(pred.2$class)

versicolor virginica

49

51

#vediamo la descrizione della variabile canonica

summary(round(pred.2$x,3))

LD1

Min.

1st Qu.:-1.78425 Median : 0.16850

:-3.88700

: 0.00002

3rd Qu.: 1.79900

Max.

: 4.78200

Mean

La variabile canonica Y ha media 0 poiché è normalizzata.

#Confrontiamo l’allocazione delle unità individuata dalla regola discriminante con la popolazione di appartenenza:

table(pred.2$class, sp.vera) specie.vera versicolor virginica

versicolor

48

1

virginica

2

49

Come succedeva in precedenza ci sono 3 unità mal classificate.

3.2 Analisi sul dataset completo (3 popolazioni)

discr.3 <- lda(Species ~.,iris.sp)

discr.3

Call:

lda(Species ~ ., data = iris.sp)

Prior probabilities of groups:

setosa versicolor virginica 0.3333333 0.3333333 0.3333333

Group means:

 

Sepal.Length Sepal.Width Petal.Length Petal.Width

setosa

5.006

3.428

1.462

0.246

versicolor

5.936

2.770

4.260

1.326

virginica

6.588

2.974

5.552

2.026

Coefficients of linear discriminants:

LD2

Sepal.Length 0.8293776 0.02410215 Sepal.Width 1.5344731 2.16452123 Petal.Length -2.2012117 -0.93192121 Petal.Width -2.8104603 2.83918785

LD1

Proportion of trace:

LD2

0.9912 0.0088

LD1

Analisi dei dati a.a. 2015/2016

# calcolo la predizione dellanalisi discriminante pred.3 <-predict(discr.3)

#principali statistiche descrittive delle due variabili canoniche ottenute

summary(round(pred.3$x,5))

LD1

LD2

Min.: -9.171000 Min. :-2.6434100

1st Qu.:-5.048000 Median :-1.828000

Mean: -0.000003 Mean : 0.0000004

3rd Qu.: 6.915000

Max.: 9.850000 Max. : 2.7376000

3rd Qu.: 0.6681800

1st Qu.:-0.7797450 Median :-0.0676200

#Confronto lallocazione delle unità individuata dalla regola discriminante con la popolazione di appartenenza:

table(pred.3$class, iris.sp$Species) setosa versicolor virginica

setosa

50

0

0

versicolor

0

48

1

virginica

0

2

49

Permangono 3 unità mal classificate riguardo le specie virginica e versicolor, la specie setosa invece è tutta ben identificata.

#Vediamo il grafico della classificazione rispetto allo spazio delle variabili canoniche

plot(pred.3$x, type="n", xlab="Y1", ylab="Y2") text(pred.3$x, labels=substring(iris.sp$Species,1,2), col=as.integer(iris.sp$Species)) abline(v=mean(pred.3$x[,1]), h=mean(pred.3$x[,2]))

col=as.integer(iris.sp$Species)) abline(v=mean(pred.3$x[,1]), h=mean(pred.3$x[,2])) Analisi dei dati a.a. 2015/2016

Analisi dei dati a.a. 2015/2016

ESERCIZIO 2

Il file bnotes.csv contiene alcune informazioni relative a 200 banconote, di cui 100 autentiche e 100 contraffatte. Le 6 caratteristiche ritenute importanti per stabilire l’autenticità del denaro e misurate sulle 220 banconote sono: lunghezza totale, lunghezza della diagonale, lunghezza del bordo sinistro, di quello destro, di quello superiore e di quello inferiore.

1. Apertura ed esplorazione del dataset

bnotes<- read.csv(file.choose(), head=T, sep=",", dec=".") str(bnotes)

'data.frame':

200 obs. of 7 variables:

$ Length

: num

215 215 215 215 215

$ Left

: num

131 130 130 130 130

$ Right

: num

131 130 130 130 130

$ Bottom

: num

9 8.1 8.7 7.5 10.4 9 7.9 7.2 8.2 9.2

$ Top

: num

9.7 9.5 9.6 10.4 7.7 10.1 9.6 10.7 11 10

$ Diagonal: num

141 142 142 142 142

$ genuine : Factor w/ 2 levels "no","yes": 2 2 2 2 2 2 2 2 2 2

summary(bnotes)

Length

Left

Right

Bottom

Top

Min.

:213.8

Min.

:129.0

Min.

:129.0

Min.

: 7.200

Min.

: 7.70

1st Qu.:214.6

1st Qu.:129.9

1st Qu.:129.7

1st Qu.: 8.200

1st Qu.:10.10

Median :214.9

Median :130.2

Median :130.0

Median : 9.100

Median :10.60

Mean

:214.9

Mean

:130.1

Mean

:130.0

Mean

: 9.418

Mean

:10.65

3rd Qu.:215.1

3rd Qu.:130.4

3rd Qu.:130.2

3rd Qu.:10.600

3rd Qu.:11.20

Max.

:216.3

Max.

:131.0

Max.

:131.1

Max.

:12.700

Max.

:12.30

Diagonal

genuine

Min.

:137.8

no :100

1st Qu.:139.5

yes:100

Median :140.4

Mean

:140.5

3rd Qu.:141.5

 

Max.

:142.4

head(bnotes)

Length Left Right Bottom Top Diagonal genuine

1 214.8 131.0 131.1

9.0

9.7

141.0

yes

2 214.6 129.7 129.7

8.1

9.5

141.7

yes

3 214.8 129.7 129.7 8.7

9.6

142.2

yes

4 214.8 129.7 129.6

7.5 10.4

142.0

yes

5 215.0 129.6 129.7

10.4

7.7

141.8

yes

6 215.7 130.8 130.5

9.0 10.1

141.4

yes

Le prime 100 osservazioni si riferiscono alle 100 banconote vere, mentre le altre 100 a quelle contraffatte. Sulla base delle 6 caratteristiche misurate, vogliamo costruire una regola discriminante per classificare le banconote come autentiche o contraffatte.

2 Analisi discriminante

library(MASS) bnotes.lda<-lda(bnotes[,1:6], bnotes$genuine) bnotes.lda Call:

lda(bnotes[, 1:6], bnotes$genuine)

Prior probabilities of groups:

no yes

0.5 0.5

Analisi dei dati a.a. 2015/2016

Group means:

Top Diagonal

no 214.823 130.300 130.193 10.530 11.133 139.450 yes 214.969 129.943 129.720 8.305 10.168 141.517

Length

Left

Right Bottom

Coefficients of linear discriminants:

LD1

Length 0.005011113 Left 0.832432523 Right -0.848993093 Bottom -1.117335597 Top -1.178884468 Diagonal 1.556520967

I 2 gruppi hanno medie molto simili per le prime 3 grandezze, mentre differiscono di più rispetto alle ultime 3. Analizzando i coefficienti della variabile canonica, notiamo che length praticamente non incide, mentre la variabile diagonal è quella con coefficiente più grande in valore assoluto. Inoltre c’è un contrasto tra diagonal e left rispetto a right, bottom e top (segni opposti).

Verifichiamo qual è la bontà della classificazione #salviamo la predizione e visualizziamo la classificazione bnotes.pred <- predict(bnotes.lda) table(bnotes.pred$class, bnotes$genuine) no yes

no

100

1

yes

0

99

La classificazione è sbagliata per una sola banconota che viene classificata come contraffatta anche se è autentica.

# visualizziamo le statistiche descrittive della variabile canonica bnotes.Y<-(bnotes.pred$x) summary(bnotes.Y)

LD1

Min. :-5.670e+00 1st Qu.:-3.559e+00 Median :-7.153e-01 Mean :-5.865e-15 3rd Qu.: 3.619e+00

Max.

: 5.761e+00

#valutiamo graficamente la bontà della classificazione plot(bnotes.Y, type="n", ylab="Y", main="banknotes", xlim=c(0,100)) text(bnotes.Y[1:100,], label="yes", col="blue") text(bnotes.Y[101:200,], label="no", col="red") abline(h=0, col="black")

Analisi dei dati a.a. 2015/2016

Analisi dei dati a.a. 2015/2016

Analisi dei dati a.a. 2015/2016