PCA Parte Prima

Tra i vari progetti di Luglio e Agosto ci potrebbe essere un progetto di ottimizzazione dei costi per una società UK (non è la stessa dei cupcakes) che potrebbe richiedere l’applicazione della PCA.
In questo articolo (e forse anche un successivo) proverò a spiegare un concetto fondamentale e particolarmente utile.
Devo premettere che la trattazione è volutamente semplificata ed esistono persone decisamente più competenti e brave di me che illustrano (in inglese) l’argomento, Youtube è pieno.
Allora perchè un articolo supernoioso?
Semplice! Per me spiegare le cose è uno dei migliori metodi per apprendere.
Questo lo insegna il sommo Feyman, mica Ciccio Paduccio, maggiori info sul metodo di apprendimento Feyman qui -> https://www.focus.it/comportamento/scuola-e-universita/le-tre-regole-di-feynman-per-preparare-un-esame-e-imparare-tutto
 
Tornando a noi.
L’analisi in componenti principali, in inglese PCA, è una trasformazione lineare.

Fare una PCA è come prendere la lista dei 50 “capisardi” della vita e ridurli a 3:
“La femmina, il danaro e la mortazza”.

[youtube https://www.youtube.com/watch?v=aLEfp7js620]
La PCA permette di ridurre le variabili identificando quelle realmente importanti(termine statisticamente insignificante) e non correlate tra loro (termine statisticamente fondamentale).
In termini tecnici è una trasformata, un operatore matematico, in questo caso lineare, che trasforma una funzione in un’altra funzione.
E’ molto utilizzata nell’ambito del Machine Learning nella risoluzione dei probelmi di regressione e classificazione perchè permette di ridurre il numero di variabili in gioco (feature reduction) considerando quelle fondamentali.
Nell’esempio che vi propongo, si è applicata la PCA non tanto per ridurre il numero di variabili (che è rimasto il medesimo 2), ma per decorrelarle
E’ una versione leggermente modificata di un esercizio di DataCamp.Com di questo capitolo (https://www.datacamp.com/courses/unsupervised-learning-in-python).
Nella prima fase dell’esempio si studia la correlazione tra due variabili e nella seconda parte si applica una PCA
Sono stati presi 209 semi e si è misurata la loro lunghezza e larghezza e le informazioni sono state salvate in un file *csv
Inzialmente ho realizzato uno scatter plot per vedere quale fosse la correlazione tra le due variabili ed ho calcolato il coefficiente di pearson, successivamente ho applicato una PCA per decorrelare le due variabili e identificare le componenti principali che definiscono due nuove variabili, dove quella con la maggiore varianza raprpesenta il primo asse, mentre la seconda quella con varianza minore.
Nel caso noi avessimo avuto m variabili e dalla PCA avessimo ottenuto n variabili, con m>n, allora il secondo asse sarebbe stato descritto dalla seconda variabile con varianza maggiore, il terzo asse con la terza variabile con varianza maggiore fino alla n-essima variabile.
Nei prossimi articoli cercherò di illustrare meglio il concetto con esempi pratici, fino a quando non riuscirò a elaborare un articolo dal titolo “PCA Guida definitiva” o “PCA spiegata a mia nonna”.

In [10]:
#Analisi PCA 
# Importiamo le librerie necessarie matplot scipy.stats e pandas 
import matplotlib.pyplot as plt
from scipy.stats import pearsonr
import pandas as pd
#Carichiamo il file 
grains=pd.read_csv("seeds-width-vs-length.csv")
#Vediam sempre di che si tratta e come si caratterizzano i nostri dati
print(grains.info())
print(grains.describe())
#Estraiamo dal dataframe solo i valori per poter successivamente lavorare con specifici array
grains=grains.values
#La 0-sima colonna del dataframe rappresenta la larghezza
width = grains[:,0]
#La 1-a colonna del dataframe rappresenta la lunghezza
length = grains[:,1]
# Grafichiamo tutto con uno scatter plot larghezza-lunghezza
plt.scatter(width, length)
plt.axis('equal')
plt.show()
#Calcoliamo il coefficiente di pearson detto anche coefficente di correlazione lineare ed il p-value dei dati
correlation, pvalue = pearsonr(width,length)
# Visualizziamo in due valori appena calcolati
print("Correlazione tra le due  variabili larghezza e lunghezza", round(correlation, 4))
print("P-value dei dati",pvalue)
<class 'pandas.core.frame.DataFrame'>
RangeIndex: 209 entries, 0 to 208
Data columns (total 2 columns):
3.312    209 non-null float64
5.763    209 non-null float64
dtypes: float64(2)
memory usage: 3.3 KB
None
            3.312       5.763
count  209.000000  209.000000
mean     3.258349    5.627890
std      0.378603    0.444029
min      2.630000    4.899000
25%      2.941000    5.262000
50%      3.232000    5.520000
75%      3.562000    5.980000
max      4.033000    6.675000
Correlazione tra le due  variabili larghezza e lunghezza 0.8604
P-value dei dati 1.5696623081483666e-62
Addesso possiamo valutare quelle che sono le componenti principali della nostra distribuzione e decorrelarre le due variabili attraverso una PCA
In [4]:
#Carichiamo il modulo della libreria che ci interessa per l'operazione
#PCA Analysis 
# Import PCA
from sklearn.decomposition import PCA
#Creiamo l'istanza pca modello
modello = PCA()
# Applichiamo il metodo fit_transform method al nostro dataset sul grano
#Otterremo un nuovo array con due nuove variabili decorrelate
pca_features = modello.fit_transform(grains)
# Assegniamo la 0-sima colonna di pca_features alla variabile xs
xs = pca_features[:,0]
# Assegniamo la 1-a colonna di pca_features alla variabile ys
ys = pca_features[:,1]
# Grafichiamo tutto con uno scatter plot le due nuove variabili
plt.scatter(xs, ys)
plt.axis('equal')
plt.show()
# Calcoliamo coefficiente di pearson per le due nuove variabili xs ys
correlation, pvalue = pearsonr(xs, ys)
# Visualizziamo i due risultati approssimati
print("Correlazione tra le due nuove variabili xs ed ys", round(correlation,4))
print("P-value dei dati",pvalue)
Correlazione tra le due nuove variabili xs ed ys -0.0
"P-value dei dati 1.0

1 commento su “PCA Parte Prima”

Lascia un commento