Generiamo una nube casuale di punti nel piano con distribuzione Gaussiana.
Come prima ma rendendo le varianze differenti
Non è cambiato nulla nella figura precedente. Per apprezzare la differenza richiediamo che le unità di misura sui due assi siano le stesse.
Cambiamo anche le medie
Applichiamo una rotazione
Generiamo una nube di punti con distribuzione Gaussiana nello spazio, usando un campionamento Gaussiano con componenti indipendenti e ugual varianza
Per visualizzare i grafici tridimensionali, useremo la libreria rgl
.
library(rgl)
X=rnorm(5000)
Y=rnorm(5000)
Z=rnorm(5000)
open3d()
plot3d(X,Y,Z)
axes3d(c('x','y','z'),pos=c(0,0,0),labels=FALSE,tick=FALSE,col=2,lwd=3)
Esaminiamo il campionamento di dati con distribuzione Gaussiana con componenti indipendenti ma con varianze differenti.
plot3d(X,Y,Z,xlim=c(-20,20),ylim=c(-20,20),zlim=c(-20,20))
axes3d(c('x','y','z'),pos=c(0,0,0),labels=FALSE,tick=FALSE,col=2,lwd=3)
Determiniamo la covarianza
A=matrix(c(X,Y,Z),5000,3)
Q=cov(A)
Q
cor(A)
eigen(Q)
eigen(Q)$values
eigen(Q)$vectors
round(eigen(Q)$vectors,2)
Calcoliamo la radice quadrata della matrice Q.
U=eigen(Q)$vectors
U%*%t(U)
round(U%*%t(U),2)
round(t(U)%*%U,2)
D=diag(eigen(Q)$values)
D
U%*%D%*%t(U) - Q
sqQ=U%*%sqrt(D)%*%t(U)
round(sqQ%*%sqQ - Q,6)
Generiamo una matrice simmetrica semidefinita positiva mediante numeri casuali.
Generiamo dei dati casuali che abbiano la matrice trovata come matrice di covarianza. La corrispondenza è naturalmente solo approssimativa.
X=rnorm(5000)
Y=rnorm(5000)
Z=rnorm(5000)
B=matrix(c(X,Y,Z),5000,3)
G=t(A%*%t(B))
dim(G)
round(Q-cov(G),2)
open3d()
plot3d(G)
Si può ottenere una matrice casuale usando la covarianza di dati casuali. Il risultato però sarà vicino alla matrice identica.
Primo esempio con matrice artificiosamente 2-dimensionale
X=rnorm(50)
Y=rnorm(50)
A=matrix(nrow=50,ncol=5)
A[,1]=X
A[,2]=X+0.1*Y
A[,3]=(X+Y)/2
A[,4]=Y+0.1*X
A[,5]=Y
round(cor(A),2)
Le prime due componenti principali catturano praticamente tutta la proporzione di varianza.
Consideriamo il dataset mtcars sulle caratteristiche di alcune auto (dataset standard di R). Prima di procedere con l’analisi, rimuoviamo due variabili categoriche).
Le variabili rappresentano le seguenti caratteristiche:
mpg
: miglia per gallonecyl
: numero di cilindridisp
: cilindratahp
: cavallidrat
: quoziente volante/assewt
: peso (in migliaia di libbre)qsec
: tempo necessario a percorrere 1/4 di migliogear
: numero delle marcecarb
: numero di carburatoriLa tabella richiede chiaramente standardizzazione.
Una prima valutazione della bontà dell’analisi.
mt.pca=princomp(scale(mt))
summary(mt.pca)
screeplot(mt.pca)
plot(cumsum(mt.pca$sdev^2)/sum(mt.pca$sdev^2),type="b",ylim=c(0,1))
segments(1,0.8,9,0.8,col="red")
Proviamo ad associare i fattori alle nuove variabili. Dal grafico si potrebbe ipotizzare:
mpg
, cyl
, disp
, wt
drat
, qsec
, gear
, carb
hp
Approfondiamo l’associazione per mezzo dei loadings.
mpg
, cyl
, disp
, wt
qsec
, gear
, carb
hp
, drat
Integriamo con il contributo delle rotazioni.
mpg
, cyl
, disp
, drat
, wt
hp
, qsec
, gear
, carb
Rotazioni successive in questo caso non aiutano.
Concludiamo con una possibile interpretazione:
mpg
, cyl
, disp
, hp
, wt
): caratteristiche legate alla potenza, o al consumo.drat
, qsec
, gear
, carb
): caratteristiche dotazionali (e prestazionali).Alla luce di questa interpretazione, osserviamo dal biplot
che mpg
è concorde alla prima coomponente, mentre cyl
, disp
, hp
e wt
sono discordi, in accordo con l’idea che l’asse rappresenti un indice di consumo (a sinistra le auto meno prestazionali dal punto di vista del consumo, a destra le auto più prestazioni dal punto di vista del consumo).
Analogamente, tutte le frecce dei fattori associati alla seconda componente sono concordi alla seconda componente (inclusa, in effetti, qsec
, in quanto minore è il valore di questo fattore, maggiore la prestazione). Il fattore carb
, al contrario degli altri fattori associati alla seconda componente, ha una proiezione negativa sulla prima componente, in accordo con l’interpretazione data. Infine, carb
e qsec
sono opposti.
Scopriamo che la rappresentazione sul piano delle componenti principali può rivelare aspetti inaspettati. Indichiamo con colori differenti auto di provenienza differente.
orig=rep(2,32)
orig[c(1:3,19:21)]=3
orig[c(4:7,15:17,22:25,29)]=1
plot(mt.pca$scores,pch=20,col=orig)
text(mt.pca$scores,labels=as.character(row.names(mt)),col=orig,pos=3,cex=.6)
Chiediamoci se questo aspetto poteva emergere senza l’analisi delle componenti principali.
Proviamo a indagare sulla stabilità del risultato.
Esempio con i dati sulla produzione agricola delle regioni.
Svolgiamo l’analisi delle componenti principali.
Il grafico delle varianze e delle varianze cumulate:
plot(pa.pca)
plot(cumsum(pa.pca$sdev^2)/sum(pa.pca$sdev^2),type="b",ylim=c(0,1))
segments(1,0.8,7,0.8,col="red")
Rappresentiamo il piano principale.
Osserviamo la presenza di frecce più corte e più lunghe, standardizziamo i dati e verifichiamo la validità dell’analisi.
pa_s.pca=princomp(scale(pa))
summary(pa_s.pca)
plot(cumsum(pa_s.pca$sdev^2)/sum(pa_s.pca$sdev^2),type="b",ylim=c(0,1))
segments(1,0.8,7,0.8,col="red")
Confrontiamo le analisi con/senza standardizzazione
Possiamo associare alla prima componente la produttività, la seconda permette di distinguere coltivazioni che hanno necessità di climi più caldi/freddi.
Verifichiamo l’interpretazione con le informazioni quantitative. In effetti tutti i fattori contribuiscono in diverse misure alle componenti principali.
Usiamo l’asse principale per classificare le regioni rispetto alla produzione agricola.
Esplorazione dei piani.
Avendo in mente il significato delle prime componenti principali, si può usare l’analisi delle componenti principali in presenza di nuovi dati per capire che produttività e tipo di coltivazioni hanno i nuovi individui. Per esempio:
Un altro esempio di analisi delle componenti principali usando uno dei dataset
standard di R. I dati si riferiscono alle misure (in centimetri) di lunghezza e larghezza dei sepali e dei petali di 50 fiori da tre diverse specie di iris.
Per ora dimentichiamo la variabile categoriale. La salviamo però in un vettore per uso successivo.
Valutiamo numericamente e graficamente le correlazioni.
o meglio ancora, per evidenziare le differenze tra le specie,
Analisi delle componenti principali.
Le proporzioni di varianza spiegata.
Il biplot
mostra frecce di lunghezza disomogenea (l’opzione cex
è il character expansion factor, qui usato per rendere i numeri più piccoli e poter osservare le frecce). Risulta opportuno (come sempre nell’analisi PCA) standardizzare.
L’analisi delle componenti principali continua ad essere buona.
ir_s.pca=princomp(scale(ir))
summary(ir_s.pca)
plot(cumsum(ir_s.pca$sdev^2)/sum(ir_s.pca$sdev^2),type="b",ylim=c(0,1))
Notiamo il miglioramento con la standardizzazione.
layout(t(1:2))
biplot(ir.pca,main="iris",cex=0.6)
biplot(ir_s.pca,main="iris std.",cex=0.6)
layout(1)
Interpretazione delle componenti: la prima componente sembra venire dal contributo (approssimativamente) simile di tre dei quattro fattori, con il ruolo di separare il quarto fattore dagli altri. La seconda componente principale ha tutti i valori negativi e si potrebbe interpretare come una misura della dimensione (principalmente dei sepali).
Studiamo gli assembramenti, utilizzando la variabile categoriale.
levels(species)<-c("red","blue","green3")
ir_s.pt <- predict(ir_s.pca)
layout(t(1:2))
plot(ir_s.pt[,c(1,2)],pch=20,asp=1,col=species)
plot(ir_s.pt[,c(1,3)],pch=20,asp=1,col=species)
layout(1)
Eventualmente anche…
Consideriamo i dati contenuti in un dataset relativo a dati socio-economici di alcuni paesi europei.
Education
la percentuale della popolazione che risulta diplomata o laureata;Health
la percentuale della popolazione che ritiene di essere in buono stato di salute;Accidents
il numero di incidenti sul lavoro che hanno richiesto almeno 4 giorni di assenza dal posto di lavoro, calcolati sulla percentuale di popolazione lavoratrice;Employment
lo stipendio annuale medio;Export
le quote di mercato sulle esportazioni;HealthyYears
la speranza di vita media (media tra uomini e donne);GenderPaymentGap
una sorta di indicatore della diversità di retribuzione tra uomini e donne;IndustrialProduction
un indicatore della produzione industriale del Paese;TaxesLabour
e TaxesTotal
, due indicatori riguardanti la pressione fiscale.Una prima analisi delle correlazioni.
L’analisi delle componenti principali.
Valutazione della bontà dell’analisi. Per arrivare a circa l’80% è necessario considerare tre componenti principali.
Ancora una volta il biplot rivela la necessità della standardizzazione.
Ripetiamo l’analisi delle componenti principali.
Valutazione della bontà dell’analisi. Il problema si rivela più complesso dimensionalmente.
plot(eu.pca)
plot(cumsum(eu.pca$sdev^2)/sum(eu.pca$sdev^2),type="b",ylim=c(0,1))
segments(1,0.8,9,0.8,col="red")
L’attribuzione di significato risulta più complessa.
Anche guardando alle informazioni quantitative.
L’assegnazione di Health, HealthyYears, IndustrialProduction, TaxesTotal alla prima componente sembra essere abbastanza stabile.
Export e TaxesLabour sembrano essere associati alla seconda componente.
Si può tentare di esplorare anche i piani principali successivi.
Generare una matrice A simmetrica e semidefinita positiva con 3 righe e 3 colonne. Implementare il calcolo della radice quarta di A, ovvero di una matrice Q tale che Q^4=A.
Generare 100 coppie di dati Gaussiani che abbiano la bisettrice del primo quadrante come asse principale e varianza 9 lungo tale direzione. Dire quale deve essere l’altro asse principale.
Si generi una tabella di 3 colonne e 25 righe. Le prime due colonne siano Gaussiane (media e varianza a piacere), la terza colonna sia la somma delle prime due colonne più un piccolo rumore. Ottenere le varianze spiegate delle componenti principali della tabella, rappresentarle in un grafico illustrativo e visualizzare il grafico delle prime due componenti principali.
Generare un vettore Gaussiano di 5000 punti con componenti principali di varianze 9, 4 e 1 ed in modo che i suoi assi principali siano le bisettrici dei quadranti del piano xy e l’asse delle quote. Ottenere il grafico della proiezione dei punti sul piano xz.
Generare un campione Gaussiano quadri-dimensionale di numerosità 100, in modo che questo risulti approssimativamente bidimensionale e che la prima componente principale sia la somma delle prime due componenti.
Creare una tabella con 5 colonne e 350 righe, e popolarla di valori in modo che il biplot dell’analisi delle componenti principali per la tabella creata presenti alcune frecce molto corte.
Generare una tabella di dati in modo che, analizzata attraverso l’analisi delle componenti principali, riveli un accumulo di dati sul piano principale che però si rivela ingannevole se visto attraverso gli altri piani.
Considerare nuovamente i dati (non standardizzati) relativi alla produzione agricola delle regioni.
09prodagri.csv
.Considerare la tabella di dati iris
. Studiare la corrispondente tabella ottenuta attraverso i logaritmi dei dati originari (ovvero, indagare rispetto a una dipendenza di tipo potenza tra i fattori).
Ripetere una completa analisi delle componenti principali della tabella 10euecosoc
, alla quale però è stata rimossa la colonna IndustrialProduction
. Confrontare i risultati con l’analisi della tabella completa.