Marilena Pillati
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
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
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
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
(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
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
1.326
2.026
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:
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]))
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
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")