Corso
L’analisi fattoriale (FA) è un metodo di analisi esplorativa dei dati usato per individuare fattori sottostanti o variabili latenti a partire da un insieme di variabili osservate. Aiuta l’interpretazione dei dati riducendo il numero di variabili. Estrae la massima varianza comune da tutte le variabili e la condensa in un punteggio comune.
L’analisi fattoriale è ampiamente utilizzata in ricerche di mercato, pubblicità, psicologia, finanza e ricerca operativa. I ricercatori di mercato la usano per identificare i clienti sensibili al prezzo, individuare le caratteristiche del brand che influenzano le scelte dei consumatori e comprendere i criteri di selezione dei canali per la distribuzione.
Analisi fattoriale
L’analisi fattoriale è un modello statistico lineare. Viene usata per spiegare la varianza tra le variabili osservate e condensare un insieme di variabili osservate in variabili non osservate chiamate fattori. Le variabili osservate sono modellate come combinazioni lineari di fattori e termini di errore (Fonte). Un fattore o variabile latente è associato a più variabili osservate che presentano schemi di risposta comuni. Ogni fattore spiega una certa quota di varianza nelle variabili osservate. Aiuta l’interpretazione dei dati riducendo il numero di variabili.
L’analisi fattoriale è un metodo per verificare se un certo numero di variabili di interesse X1, X2,……, Xl, sono linearmente collegate a un numero più piccolo di fattori non osservabili F1, F2,……, Fk.
Fonte: questa immagine è stata ricreata da un’immagine trovata in appunti di analisi fattoriale. L’immagine offre una vista completa dell’analisi fattoriale.
Assunzioni:
- Non ci sono outlier nei dati.
- La dimensione del campione dovrebbe essere maggiore del numero di fattori.
- Non deve esserci multicollinearità perfetta.
- Non dovrebbe esserci omoschedasticità tra le variabili.
Tipi di analisi fattoriale
- Analisi fattoriale esplorativa: è l’approccio più usato tra i ricercatori sociali e di management. L’assunzione di base è che qualsiasi variabile osservata possa essere direttamente associata a qualsiasi fattore.
- Analisi fattoriale confermativa (CFA): l’assunzione di base è che ogni fattore sia associato a un insieme specifico di variabili osservate. La CFA conferma quanto atteso sulla base del modello.
Come funziona l’analisi fattoriale?
L’obiettivo principale dell’analisi fattoriale è ridurre il numero di variabili osservate e trovare variabili non osservabili. Queste variabili non osservate aiutano il ricercatore di mercato a trarre conclusioni dal sondaggio. Questa conversione delle variabili osservate in variabili non osservate può essere ottenuta in due passaggi:
- Estrazione dei fattori: in questo passaggio, il numero di fattori e l’approccio di estrazione sono selezionati usando metodi di partizionamento della varianza, come l’analisi delle componenti principali e l’analisi dei fattori comuni.
- Rotazione dei fattori: in questo passaggio, la rotazione cerca di convertire i fattori in fattori non correlati — l’obiettivo principale è migliorare l’interpretabilità complessiva. Esistono molti metodi di rotazione, ad esempio: Varimax, Quartimax e Promax.
Terminologia
Cos’è un fattore?
Un fattore è una variabile latente che descrive l’associazione tra più variabili osservate. Il numero massimo di fattori è pari al numero di variabili osservate. Ogni fattore spiega una certa quota di varianza nelle variabili osservate. I fattori con la minore varianza vengono eliminati. I fattori sono noti anche come variabili latenti, nascoste, non osservate o ipotetiche.
Cosa sono i factor loadings?
I factor loadings sono una matrice che mostra la relazione di ciascuna variabile con il fattore sottostante. Mostra il coefficiente di correlazione tra variabile osservata e fattore. Indica la varianza spiegata dalle variabili osservate.
Cosa sono gli autovalori (Eigenvalues)?
Gli autovalori rappresentano la varianza spiegata da ciascun fattore rispetto alla varianza totale. Sono noti anche come radici caratteristiche.
Cosa sono le comunalità (Communalities)?
Le comunalità sono la somma dei loadings al quadrato per ciascuna variabile. Rappresentano la varianza comune. Vanno da 0 a 1 e valori vicini a 1 indicano più varianza.
Cos’è la rotazione dei fattori?
La rotazione è uno strumento per una migliore interpretazione dell’analisi fattoriale. La rotazione può essere ortogonale o obliqua. Ridistribuisce le comunalità con uno schema di loadings più chiaro.
Scelta del numero di fattori
Il criterio di Kaiser è un approccio analitico basato sulla selezione del fattore che spiega una quota più significativa di varianza. L’autovalore è un buon criterio per determinare il numero di fattori. In generale, un autovalore maggiore di 1 è considerato criterio di selezione della caratteristica.
L’approccio grafico si basa sulla rappresentazione visiva degli autovalori dei fattori, chiamata anche scree plot. Questo scree plot aiuta a determinare il numero di fattori nel punto in cui la curva forma un “gomito”.
Analisi fattoriale vs Principal Component Analysis
- Le componenti PCA spiegano la massima quantità di varianza, mentre l’analisi fattoriale spiega la covarianza nei dati.
- Le componenti PCA sono completamente ortogonali tra loro, mentre l’analisi fattoriale non richiede fattori ortogonali.
- La componente PCA è una combinazione lineare delle variabili osservate, mentre in FA le variabili osservate sono combinazioni lineari della variabile non osservata o fattore.
- Le componenti PCA sono difficili da interpretare. In FA, i fattori sottostanti possono essere etichettati e interpretati.
- La PCA è un metodo di riduzione della dimensionalità, mentre l’analisi fattoriale è un metodo a variabili latenti.
- La PCA è un tipo di analisi fattoriale. La PCA è osservazionale, mentre la FA è una tecnica di modellazione.
Analisi fattoriale in Python con il pacchetto factor_analyzer
Importare le librerie necessarie
# Import required libraries
import pandas as pd
from sklearn.datasets import load_iris
from factor_analyzer import FactorAnalyzer
import matplotlib.pyplot as plt
Caricare i dati
Eseguiamo l’analisi fattoriale su BFI (dataset basato su un progetto di valutazione della personalità), raccolto usando una scala di risposta a 6 punti: 1 Molto impreciso, 2 Moderatamente impreciso, 3 Leggermente impreciso, 4 Leggermente preciso, 5 Moderatamente preciso e 6 Molto preciso. Puoi anche scaricare questo dataset dal seguente link: https://vincentarelbundock.github.io/Rdatasets/datasets.html
df= pd.read_csv("bfi.csv")
Preprocessare i dati
df.columns
Index(['A1', 'A2', 'A3', 'A4', 'A5', 'C1', 'C2', 'C3', 'C4', 'C5', 'E1', 'E2',
'E3', 'E4', 'E5', 'N1', 'N2', 'N3', 'N4', 'N5', 'O1', 'O2', 'O3', 'O4',
'O5', 'gender', 'education', 'age'],
dtype='object')
# Dropping unnecessary columns
df.drop(['gender', 'education', 'age'],axis=1,inplace=True)
# Dropping missing values rows
df.dropna(inplace=True)
df.info()
<class 'pandas.core.frame.DataFrame'>
Int64Index: 2436 entries, 0 to 2799
Data columns (total 25 columns):
A1 2436 non-null float64
A2 2436 non-null float64
A3 2436 non-null float64
A4 2436 non-null float64
A5 2436 non-null float64
C1 2436 non-null float64
C2 2436 non-null float64
C3 2436 non-null float64
C4 2436 non-null float64
C5 2436 non-null float64
E1 2436 non-null float64
E2 2436 non-null float64
E3 2436 non-null float64
E4 2436 non-null float64
E5 2436 non-null float64
N1 2436 non-null float64
N2 2436 non-null float64
N3 2436 non-null float64
N4 2436 non-null float64
N5 2436 non-null float64
O1 2436 non-null float64
O2 2436 non-null int64
O3 2436 non-null float64
O4 2436 non-null float64
O5 2436 non-null float64
dtypes: float64(24), int64(1)
memory usage: 494.8 KB
df.head()
| A1 | A2 | A3 | A4 | A5 | C1 | C2 | C3 | C4 | C5 | ... | N1 | N2 | N3 | N4 | N5 | O1 | O2 | O3 | O4 | O5 | |
|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
| 0 | 2.0 | 4.0 | 3.0 | 4.0 | 4.0 | 2.0 | 3.0 | 3.0 | 4.0 | 4.0 | ... | 3.0 | 4.0 | 2.0 | 2.0 | 3.0 | 3.0 | 6 | 3.0 | 4.0 | 3.0 |
| 1 | 2.0 | 4.0 | 5.0 | 2.0 | 5.0 | 5.0 | 4.0 | 4.0 | 3.0 | 4.0 | ... | 3.0 | 3.0 | 3.0 | 5.0 | 5.0 | 4.0 | 2 | 4.0 | 3.0 | 3.0 |
| 2 | 5.0 | 4.0 | 5.0 | 4.0 | 4.0 | 4.0 | 5.0 | 4.0 | 2.0 | 5.0 | ... | 4.0 | 5.0 | 4.0 | 2.0 | 3.0 | 4.0 | 2 | 5.0 | 5.0 | 2.0 |
| 3 | 4.0 | 4.0 | 6.0 | 5.0 | 5.0 | 4.0 | 4.0 | 3.0 | 5.0 | 5.0 | ... | 2.0 | 5.0 | 2.0 | 4.0 | 1.0 | 3.0 | 3 | 4.0 | 3.0 | 5.0 |
| 4 | 2.0 | 3.0 | 3.0 | 4.0 | 5.0 | 4.0 | 4.0 | 5.0 | 3.0 | 2.0 | ... | 2.0 | 3.0 | 4.0 | 4.0 | 3.0 | 3.0 | 3 | 4.0 | 3.0 | 3.0 |
5 righe × 25 colonne
Test di adeguatezza
Prima di eseguire l’analisi fattoriale, devi valutare la “fattorizzabilità” del dataset. Fattorizzabilità significa: "possiamo trovare dei fattori nel dataset?". Esistono due metodi per verificare la fattorizzabilità o l’adeguatezza del campionamento:
- Test di Bartlett
- Test di Kaiser-Meyer-Olkin
Il test di Bartlett di sfericità verifica se le variabili osservate sono intercorrelate usando la matrice di correlazione osservata rispetto alla matrice identità. Se il test risulta statisticamente non significativo, non dovresti impiegare un’analisi fattoriale.
from factor_analyzer.factor_analyzer import calculate_bartlett_sphericity
chi_square_value,p_value=calculate_bartlett_sphericity(df)
chi_square_value, p_value
(18146.065577234807, 0.0)
In questo test di Bartlett, il p-value è 0. Il test è risultato statisticamente significativo, indicando che la matrice di correlazione osservata non è una matrice identità.
Il test Kaiser-Meyer-Olkin (KMO) misura l’idoneità dei dati all’analisi fattoriale. Determina l’adeguatezza per ciascuna variabile osservata e per l’intero modello. Il KMO stima la proporzione di varianza tra tutte le variabili osservate. Una proporzione inferiore è più adatta all’analisi fattoriale. I valori KMO variano tra 0 e 1. Un valore KMO inferiore a 0,6 è considerato inadeguato.
from factor_analyzer.factor_analyzer import calculate_kmo
kmo_all,kmo_model=calculate_kmo(df)
kmo_model
0.8486452309468382
Il KMO complessivo per i nostri dati è 0,84, che è eccellente. Questo valore indica che puoi procedere con l’analisi fattoriale pianificata.
Scelta del numero di fattori
Per scegliere il numero di fattori, puoi usare il criterio di Kaiser e lo scree plot. Entrambi si basano sugli autovalori.
# Create factor analysis object and perform factor analysis
fa = FactorAnalyzer()
fa.analyze(df, 25, rotation=None)
# Check Eigenvalues
ev, v = fa.get_eigenvalues()
ev
| Original_Eigenvalues | |
|---|---|
| 0 | 5.134311 |
| 1 | 2.751887 |
| 2 | 2.142702 |
| 3 | 1.852328 |
| 4 | 1.548163 |
| 5 | 1.073582 |
| 6 | 0.839539 |
| 7 | 0.799206 |
| 8 | 0.718989 |
| 9 | 0.688089 |
| 10 | 0.676373 |
| 11 | 0.651800 |
| 12 | 0.623253 |
| 13 | 0.596563 |
| 14 | 0.563091 |
| 15 | 0.543305 |
| 16 | 0.514518 |
| 17 | 0.494503 |
| 18 | 0.482640 |
| 19 | 0.448921 |
| 20 | 0.423366 |
| 21 | 0.400671 |
| 22 | 0.387804 |
| 23 | 0.381857 |
| 24 | 0.262539 |
Qui puoi vedere che solo per 6 fattori gli autovalori sono maggiori di uno. Significa che dobbiamo scegliere solo 6 fattori (o variabili non osservate).
# Create scree plot using matplotlib
plt.scatter(range(1,df.shape[1]+1),ev)
plt.plot(range(1,df.shape[1]+1),ev)
plt.title('Scree Plot')
plt.xlabel('Factors')
plt.ylabel('Eigenvalue')
plt.grid()
plt.show()
Il metodo dello scree plot traccia una linea per ciascun fattore e i suoi autovalori. Il numero di autovalori maggiori di uno è considerato il numero di fattori.
Qui puoi vedere che solo per 6 fattori gli autovalori sono maggiori di uno. Significa che dobbiamo scegliere solo 6 fattori (o variabili non osservate).
Esecuzione dell’analisi fattoriale
# Create factor analysis object and perform factor analysis
fa = FactorAnalyzer()
fa.analyze(df, 6, rotation="varimax")
fa.loadings
| Factor1 | Factor2 | Factor3 | Factor4 | Factor5 | Factor6 | |
|---|---|---|---|---|---|---|
| A1 | 0.040783 | 0.095220 | 0.048734 | -0.113057 | -0.530987 | 0.161216 |
| A2 | 0.235538 | 0.033131 | 0.133714 | 0.063734 | 0.661141 | -0.006244 |
| A3 | 0.343008 | -0.009621 | 0.121353 | 0.033990 | 0.605933 | 0.160106 |
| A4 | 0.219717 | -0.081518 | 0.235140 | -0.125338 | 0.404594 | 0.086356 |
| A5 | 0.414458 | -0.149616 | 0.106382 | 0.030977 | 0.469698 | 0.236519 |
| C1 | 0.077248 | -0.004358 | 0.554582 | 0.190124 | 0.007511 | 0.095035 |
| C2 | 0.038370 | 0.068330 | 0.674545 | 0.087593 | 0.057055 | 0.152775 |
| C3 | 0.031867 | -0.039994 | 0.551164 | -0.011338 | 0.101282 | 0.008996 |
| C4 | -0.066241 | 0.216283 | -0.638475 | -0.143846 | -0.102617 | 0.318359 |
| C5 | -0.180812 | 0.284187 | -0.544838 | 0.025837 | -0.059955 | 0.132423 |
| E1 | -0.590451 | 0.022280 | 0.053915 | -0.071205 | -0.130851 | 0.156583 |
| E2 | -0.684578 | 0.233624 | -0.088497 | -0.045561 | -0.116716 | 0.115065 |
| E3 | 0.556774 | -0.000895 | 0.103390 | 0.241180 | 0.179396 | 0.267291 |
| E4 | 0.658395 | -0.136788 | 0.113798 | -0.107808 | 0.241143 | 0.158513 |
| E5 | 0.507535 | 0.034490 | 0.309813 | 0.200821 | 0.078804 | 0.008747 |
| N1 | 0.068011 | 0.805806 | -0.051264 | -0.074977 | -0.174849 | -0.096266 |
| N2 | 0.022958 | 0.789832 | -0.037477 | 0.006726 | -0.141134 | -0.139823 |
| N3 | -0.065687 | 0.725081 | -0.059039 | -0.010664 | -0.019184 | 0.062495 |
| N4 | -0.345072 | 0.578319 | -0.162174 | 0.062916 | 0.000403 | 0.147551 |
| N5 | -0.161675 | 0.523097 | -0.025305 | -0.161892 | 0.090125 | 0.120049 |
| O1 | 0.225339 | -0.020004 | 0.133201 | 0.479477 | 0.005178 | 0.218690 |
| O2 | -0.001982 | 0.156230 | -0.086047 | -0.496640 | 0.043989 | 0.134693 |
| O3 | 0.325954 | 0.011851 | 0.093880 | 0.566128 | 0.076642 | 0.210777 |
| O4 | -0.177746 | 0.207281 | -0.005671 | 0.349227 | 0.133656 | 0.178068 |
| O5 | -0.014221 | 0.063234 | -0.047059 | -0.576743 | -0.057561 | 0.135936 |
- Il Fattore 1 ha alti loadings per E1, E2, E3, E4 ed E5 (Estroversione)
- Il Fattore 2 ha alti loadings per N1, N2, N3, N4 e N5 (Nevroticismo)
- Il Fattore 3 ha alti loadings per C1, C2, C3, C4 e C5 (Coscienziosità)
- Il Fattore 4 ha alti loadings per O1, O2, O3, O4 e O5 (Apertura mentale)
- Il Fattore 5 ha alti loadings per A1, A2, A3, A4 e A5 (Amicalità)
- Il Fattore 6 non ha alti loadings per nessuna variabile ed è difficilmente interpretabile. È meglio considerare solo cinque fattori.
Eseguiamo l’analisi fattoriale con 5 fattori.
# Create factor analysis object and perform factor analysis using 5 factors
fa = FactorAnalyzer()
fa.analyze(df, 5, rotation="varimax")
fa.loadings
| Factor1 | Factor2 | Factor3 | Factor4 | Factor5 | |
|---|---|---|---|---|---|
| A1 | 0.040465 | 0.111126 | 0.022798 | -0.077931 | -0.428166 |
| A2 | 0.213716 | 0.029588 | 0.139037 | 0.062139 | 0.626946 |
| A3 | 0.317848 | 0.009357 | 0.109331 | 0.056196 | 0.650743 |
| A4 | 0.204566 | -0.066476 | 0.230584 | -0.112700 | 0.435624 |
| A5 | 0.393034 | -0.122113 | 0.087869 | 0.066708 | 0.537087 |
| C1 | 0.070184 | 0.010416 | 0.545824 | 0.209584 | 0.038878 |
| C2 | 0.033270 | 0.089574 | 0.648731 | 0.115434 | 0.102782 |
| C3 | 0.023907 | -0.030855 | 0.557036 | -0.005183 | 0.111578 |
| C4 | -0.064984 | 0.240410 | -0.633806 | -0.107535 | -0.037498 |
| C5 | -0.176395 | 0.290318 | -0.562467 | 0.036822 | -0.047525 |
| E1 | -0.574835 | 0.042819 | 0.033144 | -0.058795 | -0.104813 |
| E2 | -0.678731 | 0.244743 | -0.102483 | -0.042010 | -0.112517 |
| E3 | 0.536816 | 0.024180 | 0.083010 | 0.280877 | 0.257906 |
| E4 | 0.646833 | -0.115614 | 0.102023 | -0.073422 | 0.306101 |
| E5 | 0.504069 | 0.036145 | 0.312899 | 0.213739 | 0.090354 |
| N1 | 0.078923 | 0.786807 | -0.045997 | -0.084704 | -0.216363 |
| N2 | 0.027301 | 0.754109 | -0.030568 | -0.010304 | -0.193744 |
| N3 | -0.061430 | 0.731721 | -0.067084 | -0.004217 | -0.027712 |
| N4 | -0.345388 | 0.590602 | -0.178902 | 0.075225 | 0.005886 |
| N5 | -0.161291 | 0.537858 | -0.037309 | -0.149769 | 0.100931 |
| O1 | 0.213005 | -0.002224 | 0.115080 | 0.504907 | 0.061550 |
| O2 | 0.004560 | 0.175788 | -0.099729 | -0.468925 | 0.081809 |
| O3 | 0.310956 | 0.026736 | 0.076873 | 0.596007 | 0.126889 |
| O4 | -0.191196 | 0.220582 | -0.021906 | 0.369012 | 0.155475 |
| O5 | -0.005347 | 0.085401 | -0.062730 | -0.533778 | -0.010384 |
# Get variance of each factors
fa.get_factor_variance()
| Factor1 | Factor2 | Factor3 | Factor4 | Factor5 | |
|---|---|---|---|---|---|
| SS Loadings | 2.473090 | 2.709633 | 2.041106 | 1.522153 | 1.844498 |
| Proportion Var | 0.098924 | 0.108385 | 0.081644 | 0.060886 | 0.073780 |
| Cumulative Var | 0.098924 | 0.207309 | 0.288953 | 0.349839 | 0.423619 |
In totale il 42% della varianza cumulativa è spiegata dai 5 fattori.
Pro e contro dell’analisi fattoriale
L’analisi fattoriale esplora grandi dataset e trova associazioni interconnesse. Riduce le variabili osservate in poche variabili non osservate o identifica gruppi di variabili intercorrelate, aiutando i ricercatori di mercato a sintetizzare le situazioni di mercato e trovare le relazioni nascoste tra gusti, preferenze e influenze culturali dei consumatori. Inoltre, aiuta a migliorare i questionari per sondaggi futuri. I fattori rendono più naturale l’interpretazione dei dati.
I risultati dell’analisi fattoriale possono essere controversi. Le interpretazioni possono essere oggetto di discussione perché dalla stessa struttura fattoriale possono derivare più interpretazioni. Dopo l’identificazione dei fattori, l’assegnazione dei nomi richiede conoscenza del dominio.
Conclusione
Congratulazioni, sei arrivato alla fine di questo tutorial!
In questo tutorial hai imparato cos’è l’analisi fattoriale, i diversi tipi di analisi fattoriale, come funziona l’analisi fattoriale, la terminologia di base, come scegliere il numero di fattori, il confronto tra principal component analysis e analisi fattoriale, l’implementazione in Python usando il pacchetto FactorAnalyzer e i pro e contro dell’analisi fattoriale.
Sarei felice di ricevere feedback o domande. Puoi lasciare un commento con la tua domanda e farò del mio meglio per rispondere.
Se vuoi approfondire i fattori in Python, segui il corso di DataCamp Unsupervised Learning in Python.

