Anda di halaman 1dari 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
$ Sepal.Length: num
$ Sepal.Width : num
$ Petal.Length: num
$ Petal.Width : num
$ Species: Factor w/

obs. of 5 variables:
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 ...
3 levels "setosa","versicolor",..: 1 1 1 1 1 1 ...

levels(iris.sp[,5])
[1] "setosa"
"versicolor" "virginica"
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
Min.
:4.300
Min.
:2.000
1st Qu.:5.100
1st Qu.:2.800
Median :5.800
Median :3.000
Mean
:5.843
Mean
:3.057
3rd Qu.:6.400
3rd Qu.:3.300
Max.
:7.900
Max.
:4.400

Petal.Length
Min.
:1.000
1st Qu.:1.600
Median :4.350
Mean
:3.758
3rd Qu.:5.100
Max.
:6.900

Petal.Width
Min.
:0.100
1st Qu.:0.300
Median :1.300
Mean
:1.199
3rd Qu.:1.800
Max.
:2.500

Species
setosa
:50
versicolor:50
virginica :50

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


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

versicolor
versicolor
versicolor
versicolor
versicolor
virginica
virginica
virginica
virginica
virginica
virginica
virginica
virginica

versicolor
versicolor
versicolor
versicolor
virginica
virginica
virginica
virginica
virginica
virginica
virginica
virginica
virginica

versicolor
versicolor
versicolor
versicolor
virginica
virginica
virginica
virginica
virginica
virginica
virginica
virginica
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 lanalisi 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
Min.
:4.900
1st Qu.:5.800
Median :6.300
Mean
:6.262
3rd Qu.:6.700
Max.
:7.900

Sepal.Width
Min.
:2.000
1st Qu.:2.700
Median :2.900
Mean
:2.872
3rd Qu.:3.025
Max.
:3.800

Petal.Length
Min.
:3.000
1st Qu.:4.375
Median :4.900
Mean
:4.906
3rd Qu.:5.525
Max.
:6.900

Petal.Width
Min.
:1.000
1st Qu.:1.300
Median :1.600
Mean
:1.676
3rd Qu.:2.000
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
Min.:
4.900
Min.
:2.000
1st Qu.:5.600
1st Qu.:2.525
Median :5.900
Median :2.800
Mean:
5.936
Mean
:2.770
3rd Qu.:6.300
3rd Qu.:3.000
Max.:
7.000
Max.
:3.400

Petal.Length
Min.
:3.00
1st Qu.:4.00
Median :4.35
Mean
:4.26
3rd Qu.:4.60
Max.
:5.10

Petal.Width
Min.
:1.000
1st Qu.:1.200
Median :1.300
Mean
:1.326
3rd Qu.:1.500
Max.
:1.800

#specie virginica:
iris.vi <- iris[51:100,]
summary(iris.vi)
Sepal.Length
Sepal.Width
Min.:
4.900
Min.
:2.200
1st Qu.:6.225
1st Qu.:2.800
Median :6.500
Median :3.000
Mean:
6.588
Mean
:2.974
3rd Qu.:6.900
3rd Qu.:3.175
Max.:
7.900
Max.
:3.800

Petal.Length
Min.
:4.500
1st Qu.:5.100
Median :5.550
Mean
:5.552
3rd Qu.:5.875
Max.
:6.900

Petal.Width
Min.
:1.400
1st Qu.:1.800
Median :2.000
Mean
:2.026
3rd Qu.:2.300
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;

Lidea centrale dellanalisi discriminante canonica di Fisher quella di trovare una combinazione
lineare delle variabili osservate Y=aX 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
Sepal.Width
0.08947347 0.10123673
0.07701633
Petal.Length
0.24309388 0.07701633
0.26270204
Petal.Width
0.05243673 0.04441633
0.06096327

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
5.936
2.770
4.260
mean.vi <-apply(iris.vi,2,mean)
mean.vi
Sepal.Length Sepal.Width Petal.Length
6.588
2.974
5.552

Petal.Width
1.326
Petal.Width
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*x26.97*x312.39*x4


Analisi dei dati a.a. 2015/2016

#calcoliamo i valori che Y assume sulle unit campionarie


lespressione nota come equazione discriminante di Fisher Y=Xa)

(mediante

Y<-iris%*%a
dim(Y)
[1] 100
1
summary(Y)
V1
Min.
:-34.694
1st Qu.:-23.447
Median :-17.298
Mean
:-16.663
3rd Qu.: -9.935
Max.
: -2.006

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)

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 lanalisi 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 + ...dove groups la variabile che determina i
gruppi, mentre x1, x2 sono le variabili osservate su cui costruire la regola discriminante;
altri parametri
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
virginica
6.588
2.974
5.552

1.326
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 dassegnazione
utilizziamo il comando predict.lda() applicato alloggetto prodotto da lda:

Analisi dei dati a.a. 2015/2016

predict.lda prende in input loggetto 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.
:-3.88700
1st Qu.:-1.78425
Median : 0.16850
Mean
: 0.00002
3rd Qu.: 1.79900
Max.
: 4.78200

La variabile canonica Y ha media 0 poich normalizzata.


#Confrontiamo lallocazione 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:
setosa
versicolor
virginica

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


5.006
3.428
1.462
0.246
5.936
2.770
4.260
1.326
6.588
2.974
5.552
2.026

Coefficients of linear discriminants:


LD1
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
Proportion of trace:
LD1
LD2
0.9912 0.0088

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
1st Qu.:-0.7797450
Median :-1.828000
Median :-0.0676200
Mean:
-0.000003
Mean
: 0.0000004
3rd Qu.: 6.915000
3rd Qu.: 0.6681800
Max.:
9.850000
Max.
: 2.7376000
#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]))

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 lautenticit 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
Min.
:213.8
1st Qu.:214.6
Median :214.9
Mean
:214.9
3rd Qu.:215.1
Max.
:216.3
Diagonal
Min.
:137.8
1st Qu.:139.5
Median :140.4
Mean
:140.5
3rd Qu.:141.5
Max.
:142.4
head(bnotes)
Length Left
1 214.8 131.0
2 214.6 129.7
3 214.8 129.7
4 214.8 129.7
5 215.0 129.6
6 215.7 130.8

Left
Min.
:129.0
1st Qu.:129.9
Median :130.2
Mean
:130.1
3rd Qu.:130.4
Max.
:131.0
genuine
no :100
yes:100

Right
Min.
:129.0
1st Qu.:129.7
Median :130.0
Mean
:130.0
3rd Qu.:130.2
Max.
:131.1

Bottom
Min.
: 7.200
1st Qu.: 8.200
Median : 9.100
Mean
: 9.418
3rd Qu.:10.600
Max.
:12.700

Top
Min.
: 7.70
1st Qu.:10.10
Median :10.60
Mean
:10.65
3rd Qu.:11.20
Max.
:12.30

Right Bottom Top Diagonal genuine


131.1
9.0 9.7
141.0
yes
129.7
8.1 9.5
141.7
yes
129.7
8.7 9.6
142.2
yes
129.6
7.5 10.4
142.0
yes
129.7
10.4 7.7
141.8
yes
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:
Length
Left
Right Bottom
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
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

Anda mungkin juga menyukai