Corso

Introduzione alla Principal Component Analysis (PCA)
Come data scientist nel settore retail, immagina di voler capire cosa rende un cliente soddisfatto a partire da un dataset con queste cinque caratteristiche: spesa mensile, età, genere, frequenza d'acquisto e valutazione del prodotto. Per analizzare meglio e trarre conclusioni operative, dobbiamo comprendere il dataset o, quanto meno, visualizzarlo. Gli esseri umani non riescono a visualizzare facilmente più di tre dimensioni; quindi, rappresentare i dati clienti con cinque caratteristiche (dimensioni) non è immediato. È qui che entra in gioco la principal component analysis (in breve, PCA).
“Ma, che cos’è la principal component analysis?”
È un approccio statistico che permette di analizzare dati ad alta dimensionalità e di catturarne le informazioni più importanti. Lo fa trasformando i dati originali in uno spazio a dimensionalità inferiore raggruppando insieme le variabili altamente correlate. Nel nostro scenario, la PCA potrebbe selezionare tre caratteristiche come spesa mensile, frequenza d'acquisto e valutazione del prodotto. Questo può rendere più semplice visualizzare e comprendere i dati.
In questo tutorial, ti guiderò tra i concetti chiave della principal component analysis e su come applicarla a scenari reali usando il pacchetto corrr in R.
Guarda e scopri di più sulla Principal Component Analysis in R in questo video tratto dal nostro corso.
TL;DR
- La PCA riduce i dati ad alta dimensionalità a un numero minore di dimensioni preservando la maggior parte della varianza
- Normalizza sempre i dati con
scale()prima di eseguire la PCA per garantire pari contributo delle variabili - Usa
princomp()oprcomp()in R con i pacchettiFactoMineRefactoextraper analisi e visualizzazione - Le prime due componenti principali spiegano tipicamente l'80–90% della varianza e sono spesso sufficienti per la visualizzazione
- Usa gli scree plot per decidere quante componenti mantenere e i biplot per interpretare le relazioni tra variabili
Prerequisiti
Per seguire questo tutorial, dovresti avere:
- Nozioni base di programmazione in R — se ti serve un ripasso, vedi il tutorial Guida introduttiva al Tidyverse
- Familiarità con il caricamento e il subsetting dei data frame in R
- R 4.x o versioni successive installato
- I seguenti pacchetti:
corrr,ggcorrplot,FactoMineR,factoextra(installazione trattata nel tutorial)
Come funziona la PCA? Guida in 5 passaggi
Anche se il nostro focus è la PCA, teniamo a mente le seguenti cinque principali tecniche basate su componenti principali che mirano a sintetizzare e visualizzare dati multivariati. La PCA, a differenza delle altre tecniche, funziona solo con variabili quantitative.

Metodi basati su componenti principali
Non entreremo nella spiegazione del concetto matematico, che può essere piuttosto complesso. Tuttavia, comprendere i cinque passaggi seguenti può aiutare ad avere un’idea migliore di come calcolare la PCA.

I cinque passaggi principali per calcolare le componenti principali
Passaggio 1 - Normalizzazione dei dati
Riprendendo l’esempio dell’introduzione, consideriamo, ad esempio, le seguenti informazioni per un dato cliente.
- Spese mensili: $300
- Età: 27
- Valutazione: 4,5
Queste informazioni hanno scale diverse e svolgere la PCA su tali dati porterà a un risultato distorto. Qui entra in gioco la normalizzazione dei dati. Garantisce che ogni attributo abbia lo stesso livello di contributo, impedendo che una variabile domini sulle altre. Per ciascuna variabile, la normalizzazione si effettua sottraendo la sua media e dividendo per la sua deviazione standard.
Passaggio 2 - Matrice di covarianza
Come suggerisce il nome, questo passaggio consiste nel calcolare la matrice di covarianza a partire dai dati normalizzati. È una matrice simmetrica e ciascun elemento (i, j) corrisponde alla covarianza tra le variabili i e j.
Passaggio 3 - Autovettori e autovalori
Geometricamente, un autovettore rappresenta una direzione come “verticale” o “90 gradi”. Un autovalore, invece, è un numero che rappresenta la quantità di varianza presente nei dati per una data direzione. Ogni autovettore ha il suo autovalore corrispondente.
Passaggio 4 - Selezione delle componenti principali
Esistono tante coppie di autovettori e autovalori quante sono le variabili nei dati. Nei dati con sole spese mensili, età e valutazione, ci saranno tre coppie. Non tutte le coppie sono rilevanti. L’autovettore con l’autovalore più alto corrisponde alla prima componente principale. La seconda componente principale è l’autovettore con il secondo autovalore più alto, e così via.
Passaggio 5 - Trasformazione dei dati in un nuovo spazio dimensionale
Questo passaggio prevede di ri-orientare i dati originali in un nuovo sottospazio definito dalle componenti principali. Questa ri-orientazione si ottiene moltiplicando i dati originali per gli autovettori calcolati in precedenza.
È importante ricordare che questa trasformazione non modifica i dati originali, ma fornisce una nuova prospettiva per rappresentarli meglio.
Applicazioni della Principal Component Analysis
La principal component analysis trova applicazioni in vari ambiti della vita quotidiana, tra cui (ma non solo) finanza, elaborazione di immagini, sanità e sicurezza.
Finanza
Prevedere i prezzi azionari a partire dai prezzi passati è un’idea utilizzata in ricerca da anni. La PCA può essere usata per la riduzione della dimensionalità e l’analisi dei dati, aiutando gli esperti a trovare componenti rilevanti che spiegano gran parte della variabilità. Puoi approfondire la riduzione della dimensionalità in R nel nostro corso dedicato.
Elaborazione di immagini
Un’immagine è composta da molteplici caratteristiche. La PCA è applicata principalmente nella compressione delle immagini per conservare i dettagli essenziali riducendo il numero di dimensioni. Inoltre, può essere utilizzata per compiti più complessi come il riconoscimento di immagini.
Sanità
Con la stessa logica della compressione delle immagini, la PCA è usata nelle scansioni di risonanza magnetica (MRI) per ridurre la dimensionalità delle immagini a fini di migliore visualizzazione e analisi medica. Può anche essere integrata in tecnologie mediche utilizzate, ad esempio, per riconoscere una determinata malattia dalle immagini.
Sicurezza
I sistemi biometrici usati per il riconoscimento delle impronte digitali possono integrare tecnologie basate sulla principal component analysis per estrarre le caratteristiche più rilevanti, come la texture dell’impronta e ulteriori informazioni.
Esempio reale di PCA in R
Ora che conosci la teoria alla base della PCA, sei finalmente pronto per vederla in azione.
Questa sezione copre tutti i passaggi: dall’installazione dei pacchetti pertinenti, al caricamento e alla preparazione dei dati, all’applicazione della principal component analysis in R e all’interpretazione dei risultati.
Il codice sorgente è disponibile su DataLab.
Configurazione dell’ambiente
Per portare a termine con successo questo tutorial, ti serviranno le seguenti librerie, e per ciascuna sono necessari due passaggi principali per usarla in modo efficiente:
- Installare la libreria per accedere a tutte le funzioni.
- Caricarla per poter utilizzare tutte le funzioni.
Pacchetto corrr in R
È un pacchetto R per l’analisi delle correlazioni. Si concentra principalmente sulla creazione e gestione dei data frame in R. Di seguito i passaggi per installare e caricare la libreria.
install.packages("corrr")
library('corrr')Pacchetto ggcorrplot in R
Il pacchetto ggcorrplot fornisce diverse funzioni, tra cui la funzione ggplot2 che rende semplice visualizzare la matrice di correlazione. Analogamente alle istruzioni sopra, l’installazione è diretta.
install.packages("ggcorrplot")
library(ggcorrplot)Pacchetto FactoMineR in R
Usato principalmente per l’analisi esplorativa dei dati multivariati; il pacchetto factoMineR offre il modulo PCA per eseguire la principal component analysis.
install.packages("FactoMineR")
library("FactoMineR")Pacchetto factoextra in R
Quest’ultimo pacchetto fornisce tutte le funzioni necessarie per visualizzare gli output della principal component analysis. Tra queste funzioni rientrano, ma non solo, lo scree plot e il biplot: due delle tecniche di visualizzazione che tratteremo più avanti nell’articolo.
install.packages("factoextra")
library(factoextra)Esplorazione dei dati
Prima di caricare i dati ed effettuare ulteriori esplorazioni, è utile comprendere e avere le informazioni di base relative ai dati con cui lavorerai.
Dataset delle proteine
Il dataset delle proteine è un dataset multivariato a valori reali che descrive il consumo medio di proteine da parte dei cittadini di 25 paesi europei.
Per ciascun paese ci sono dieci colonne. Le prime otto corrispondono ai diversi tipi di proteine. L’ultima corrisponde al valore totale delle medie di proteine.
Facciamo una rapida panoramica dei dati.
Per prima cosa, carichiamo i dati usando la funzione read.csv(), quindi str() che restituisce l’immagine qui sotto.
protein_data <- read.csv("protein.csv")
str(protein_data)Possiamo vedere che il dataset contiene 25 osservazioni e 11 colonne. Ogni variabile è numerica tranne la colonna Country, che è una stringa di caratteri.

Descrizione del dataset delle proteine
Verifica dei valori nulli
La presenza di valori mancanti può distorcere il risultato della PCA. Pertanto, è fortemente consigliato adottare l’approccio appropriato per gestirli. Il nostro tutorial Top Techniques to Handle Missing Values Every Data Scientist Should Know può aiutarti a fare la scelta giusta.
colSums(is.na(protein_data))La funzione colSums() combinata con is.na() restituisce il numero di valori mancanti in ogni colonna. Come si vede sotto, nessuna colonna presenta valori mancanti.

Numero di valori mancanti in ciascuna colonna
Normalizzazione dei dati
Come detto all’inizio dell’articolo, la PCA funziona solo con valori numerici. Quindi dobbiamo rimuovere la colonna Country. Inoltre, la colonna Total non è rilevante per l’analisi poiché è la combinazione lineare delle restanti variabili numeriche.
Il codice seguente crea nuovi dati contenenti solo colonne numeriche.
numerical_data <- protein_data[,2:10]
head(numerical_data)
Prima della normalizzazione dei dati (sono mostrate solo le prime cinque colonne)
Ora, possiamo applicare la normalizzazione usando la funzione scale().
data_normalized <- scale(numerical_data)
head(data_normalized)
Dati normalizzati (mostrate solo le prime cinque colonne)
Visualizzare la matrice di correlazione
Prima di eseguire la PCA, visualizzare le correlazioni tra variabili conferma che la PCA sarà efficace. Alte intercorrelazioni indicano ridondanza che la PCA può comprimere. Userò i pacchetti corrr e ggcorrplot installati in precedenza.
corr_matrix <- cor(data_normalized)
ggcorrplot(corr_matrix,
hc.order = TRUE,
type = "lower",
lab = TRUE)La heatmap mostra forti correlazioni positive tra le fonti proteiche animali (carne rossa, carne bianca, uova e latte), il che spiega perché la prima componente principale catturi quasi il 77% della varianza totale. Questa struttura di correlazione è esattamente ciò che la PCA è progettata per sfruttare.
Nota sulle funzioni di PCA in R: Questo tutorial usa princomp(), che applica la decomposizione spettrale sulla matrice di covarianza. Per la maggior parte dei casi pratici, prcomp() è l’alternativa preferita — usa la decomposizione ai valori singolari (SVD), più stabile numericamente per dataset con molte variabili. La differenza principale nell’output: princomp() salva i loadings in $loadings, mentre prcomp() usa $rotation. Entrambe producono risultati equivalenti su dati ben condizionati come il dataset delle proteine usato qui.
Applicare la PCA
Ora abbiamo tutte le risorse per condurre l’analisi PCA. Per prima cosa, princomp() calcola la PCA e la funzione summary() mostra il risultato.
data.pca <- princomp(data_normalized)
summary(data.pca)
Riepilogo PCA in R
Dal precedente screenshot, notiamo che sono state generate nove componenti principali (Comp.1 a Comp.9), che corrispondono anche al numero di variabili nei dati.
Ogni componente spiega una percentuale della varianza totale del dataset. Nella sezione Cumulative Proportion, la prima componente principale spiega quasi il 77% della varianza totale. Ciò implica che quasi due terzi dei dati nell’insieme di 9 variabili possono essere rappresentati dalla sola prima componente principale. La seconda spiega il 12,08% della varianza totale.
La proporzione cumulata di Comp.1 e Comp.2 spiega quasi l’89% della varianza totale. Questo significa che le prime due componenti principali possono rappresentare accuratamente i dati.
Ottimo avere le prime due componenti, ma cosa significano davvero?
Possiamo rispondere esplorando come si relazionano a ciascuna colonna usando i loadings di ogni componente principale.
data.pca$loadings[, 1:2]
Matrice dei loadings delle prime due componenti principali
La matrice dei loadings mostra che la prima componente principale ha valori positivi elevati per carne rossa, carne bianca, uova e latte. Tuttavia, i valori per cereali, legumi, frutta a guscio e semi oleosi, e frutta e verdura sono relativamente negativi. Questo suggerisce che i paesi con un maggiore apporto di proteine animali sono in eccesso, mentre i paesi con un apporto minore sono in deficit.
Per quanto riguarda la seconda componente principale, presenta valori negativi elevati per pesce, cibi amidacei e frutta e verdura. Ciò implica che le diete dei paesi sottostanti sono fortemente influenzate dalla loro posizione, ad esempio regioni costiere per il pesce e regioni interne per una dieta ricca di verdure e patate.
Visualizzazione delle componenti principali
L’analisi precedente della matrice dei loadings ha fornito una buona comprensione della relazione tra ciascuna delle prime due componenti principali e gli attributi nei dati. Tuttavia, potrebbe non essere visivamente accattivante.
Esistono un paio di strategie di visualizzazione standard che possono aiutare a trarre insight dai dati; questa sezione mira a coprirne alcune, a partire dallo scree plot.
Scree Plot
Il primo approccio è lo scree plot. Serve a visualizzare l’importanza di ciascuna componente principale e può essere utilizzato per determinare il numero di componenti da mantenere. Lo scree plot può essere generato con la funzione fviz_eig().
fviz_eig(data.pca, addlabels = TRUE)
Scree plot delle componenti
Questo grafico mostra gli autovalori in una curva discendente, dal più alto al più basso. Le prime due componenti possono essere considerate le più significative poiché contengono quasi l’89% dell’informazione totale dei dati.
Biplot degli attributi
Con il biplot è possibile visualizzare somiglianze e differenze tra i campioni, e mostrare inoltre l’impatto di ciascun attributo su ciascuna componente principale.
# Grafico delle variabili
fviz_pca_var(data.pca, col.var = "black")
Biplot delle variabili rispetto alle componenti principali
Dal grafico precedente si possono osservare tre informazioni principali.
- Innanzitutto, tutte le variabili raggruppate tra loro sono positivamente correlate, e questo è il caso, ad esempio, per carne bianca/rossa, latte e uova che hanno una correlazione positiva tra loro. Questo risultato non sorprende perché hanno i valori più alti nella matrice dei loadings rispetto alla prima componente principale.
- Poi, maggiore è la distanza tra la variabile e l’origine, migliore è la rappresentazione di quella variabile. Dal biplot, uova, latte e carne bianca hanno una magnitudine più elevata rispetto alla carne rossa e sono quindi meglio rappresentate rispetto alla carne rossa.
- Infine, le variabili negativamente correlate sono visualizzate sui lati opposti rispetto all’origine del biplot.
Contributo di ciascuna variabile
L’obiettivo della terza visualizzazione è determinare quanto ciascuna variabile sia rappresentata in una data componente. Tale qualità di rappresentazione è detta Cos2 e corrisponde al coseno quadrato; si calcola con la funzione fviz_cos2().
- Un valore basso significa che la variabile non è rappresentata perfettamente da quella componente.
- Un valore alto, invece, indica una buona rappresentazione della variabile su quella componente.
fviz_cos2(data.pca, choice = "var", axes = 1:2)Il codice sopra calcola il valore del coseno quadrato per ciascuna variabile rispetto alle prime due componenti principali.
Dall’illustrazione qui sotto, cereali, legumi/frutta a guscio/semi oleosi, uova e latte sono le quattro variabili con i cos2 più alti e quindi contribuiscono maggiormente a PC1 e PC2.

Contributo delle variabili alle componenti principali
Biplot combinato con cos2
Le ultime due tecniche di visualizzazione — biplot e importanza degli attributi — possono essere combinate per creare un unico biplot, in cui gli attributi con valori di cos2 simili avranno colori simili. Questo si ottiene perfezionando la funzione fviz_pca_var come segue:
fviz_pca_var(data.pca, col.var = "cos2",
gradient.cols = c("black", "orange", "green"),
repel = TRUE)Dal biplot qui sotto:
- Gli attributi con cos2 alto sono colorati in verde: cereali, legumi, semi oleosi, uova e latte.
- Gli attributi con cos2 medio sono arancioni: carne bianca, cibi amidacei, pesce e carne rossa.
- Infine, gli attributi con cos2 basso sono neri: frutta e verdura,

Combinazione di biplot e punteggio cos2
Come scegliere il numero di componenti
Due regole pratiche aiutano a decidere quante componenti principali mantenere:
- Regola del gomito: Osserva lo scree plot e individua dove la curva piega bruscamente. Le componenti a destra del gomito aggiungono poca varianza aggiuntiva.
- Soglia di varianza: Mantieni un numero di componenti sufficiente a spiegare l’80%–90% della varianza totale. In questo dataset, le prime due componenti spiegano già circa l’89%.
Conclusione
In questo tutorial abbiamo visto cos’è la principal component analysis e la sua importanza nella data analytics. Dalle basi matematiche al codice pratico in R, abbiamo seguito un workflow completo di PCA sul dataset delle proteine — dalla normalizzazione e l’uso di princomp() fino all’interpretazione di scree plot, biplot e visualizzazioni cos2 per comprendere la relazione tra componenti principali e variabili originali.
Applica queste tecniche per ridurre la dimensionalità, far emergere strutture nascoste e costruire pipeline di machine learning più pulite sui tuoi dataset.
Per approfondire, esplora queste risorse correlate:
- Principal Component Analysis in Python — la stessa tecnica applicata a dataset tabellari e di immagini
- Understanding UMAP — un’alternativa di riduzione non lineare per strutture di dati complesse
- Understanding Dimensionality Reduction — una panoramica più ampia di tecniche tra cui PCA, t-SNE e UMAP
- The Curse of Dimensionality — perché i dati ad alta dimensionalità sono sfidanti e come la PCA aiuta
- Introduction to R — rafforza le basi di R con esercizi pratici
FAQ sull'analisi PCA
La PCA è estrazione o selezione di caratteristiche?
La PCA utilizza una trasformazione lineare non supervisionata per effettuare estrazione di caratteristiche e riduzione della dimensionalità.
Quando dovresti usare la PCA?
È consigliabile usare la PCA quando si hanno variabili fortemente correlate. In caso di correlazioni deboli, la PCA può non riuscire a ridurre efficacemente i dati.
Quali sono i limiti della PCA?
Innanzitutto, la PCA funziona solo con variabili numeriche. Inoltre, non dà buoni risultati quando le variabili non sono fortemente correlate. La PCA è sensibile alla scala delle feature e il risultato è influenzato dagli outlier.
Qual è il principale vantaggio della PCA?
La PCA offre numerosi vantaggi, tra cui:
- Ridurre il numero di variabili nei dati rimuovendo quelle rumorose, il che può anche ridurre l’overfitting.
- Migliorare le prestazioni degli algoritmi concentrandosi solo sulle feature rilevanti.
- Migliorare la visualizzazione dei dati per una migliore comprensione.
Che cosa sono PC1 e PC2 nell’analisi delle componenti principali?
L’asse PC1 corrisponde alla prima direzione principale lungo la quale i dati mostrano la maggiore variazione. L’asse PC2 corrisponde alla seconda direzione più importante lungo la quale i dati mostrano la maggiore variazione. Inoltre, PC1 è sempre ortogonale a PC2.
Quali sono le assunzioni della principal component analysis?
Le seguenti sono le assunzioni fatte dalla principal component analysis:
- Esiste una combinazione lineare tra variabili.
- Si assume che le componenti principali con varianza più alta siano più importanti di quelle che non lo sono, considerate come rumore nei dati.
- Più outlier nei dati indicano errori sperimentali.
- Il dataset derivato dalla PCA offre una buona rappresentazione dei dati originali.
Come fare la PCA in R?
Per eseguire la PCA in R, normalizza i dati con scale(), poi usa prcomp() (consigliato — usa SVD per maggiore stabilità numerica) o princomp() della base R, oppure la funzione PCA() del pacchetto FactoMineR. Usa il pacchetto factoextra per visualizzare i risultati con fviz_eig() per gli scree plot e fviz_pca_var() per i biplot.
Qual è la differenza tra prcomp() e princomp() in R?
prcomp() usa la decomposizione ai valori singolari (SVD), che è numericamente più stabile ed è generalmente il metodo preferito. princomp() usa la decomposizione spettrale sulla matrice di covarianza. Entrambi producono risultati equivalenti su dati ben condizionati, ma prcomp() è raccomandato nella maggior parte dei casi pratici. La differenza principale nell’output è che i loadings sono salvati in $rotation per prcomp() e in $loadings per princomp().
La PCA può essere utilizzata per il preprocessing nel machine learning in R?
Sì. La PCA è comunemente usata come fase di preprocessing nelle pipeline di machine learning per ridurre il numero di feature in input, rimuovere la multicollinearità tra i predittori e velocizzare l’addestramento dei modelli. In R, puoi estrarre le component score da prcomp() tramite $x e usarle come feature in input per i modelli a valle. I pacchetti caret e tidymodels supportano entrambi la PCA come passo di preprocessing tramite preProcess(method = "pca") e step_pca() rispettivamente.
Come scelgo il numero di componenti principali da mantenere?
Tre approcci comuni aiutano a decidere quante componenti mantenere:
- Regola del gomito: Osserva lo scree plot e individua dove la curva piega — le componenti a destra del gomito spiegano varianza sempre minore.
- Soglia di varianza: Mantieni abbastanza componenti da spiegare l’80–90% della varianza totale.
- Criterio di Kaiser: Mantieni le componenti con autovalore maggiore di 1 (più affidabile per dataset più grandi).
In R, usa fviz_eig() dal pacchetto factoextra per visualizzare la varianza spiegata da ciascuna componente.

