Cursus
Factoranalyse (FA) is een verkennende data-analysemethode die wordt gebruikt om invloedrijke onderliggende factoren of latente variabelen te zoeken in een set geobserveerde variabelen. Het helpt bij de interpretatie van data door het aantal variabelen te verminderen. Het extraheert maximale gemeenschappelijke variantie uit alle variabelen en zet die om in een gemeenschappelijke score.
Factoranalyse wordt veel gebruikt in marktonderzoek, reclame, psychologie, financiën en operationeel onderzoek. Marktonderzoekers gebruiken factoranalyse om prijsgevoelige klanten te identificeren, om merkkenmerken te vinden die de consumentenkeuze beïnvloeden, en om criteria voor kanaalselectie binnen het distributiekanaal te begrijpen.
Factoranalyse
Factoranalyse is een lineair statistisch model. Het wordt gebruikt om de variantie tussen de geobserveerde variabele te verklaren en een set geobserveerde variabelen te reduceren tot de niet-geobserveerde variabelen die factoren worden genoemd. Geobserveerde variabelen worden gemodelleerd als een lineaire combinatie van factoren en fouttermen (Bron). Een factor of latente variabele is verbonden met meerdere geobserveerde variabelen die gemeenschappelijke antwoordpatronen hebben. Elke factor verklaart een bepaalde hoeveelheid variantie in de geobserveerde variabelen. Het helpt bij data-interpretatie door het aantal variabelen te verminderen.
Factoranalyse is een methode om te onderzoeken of een aantal variabelen van belang X1, X2,……., Xl lineair gerelateerd zijn aan een kleiner aantal niet-observeerbare factoren F1, F2,..……, Fk.
Bron: Deze afbeelding is opnieuw gemaakt op basis van een afbeelding die ik vond in collegedictaten over factoranalyse. De afbeelding geeft een volledig beeld van factoranalyse.
Aannames:
- Er zijn geen uitschieters in de data.
- De steekproefgrootte moet groter zijn dan het aantal factoren.
- Er mag geen perfecte multicollineariteit zijn.
- Er mag geen homoscedasticiteit tussen de variabelen zijn.
Soorten factoranalyse
- Exploratory Factor Analysis: Dit is de meest populaire factoranalysebenadering onder sociale en managementonderzoekers. De basisaanname is dat elke geobserveerde variabele direct verbonden kan zijn met elke factor.
- Confirmatory Factor Analysis (CFA): De basisaanname is dat elke factor geassocieerd is met een specifieke set geobserveerde variabelen. CFA bevestigt wat op basis van de theorie wordt verwacht.
Hoe werkt factoranalyse?
Het primaire doel van factoranalyse is het verminderen van het aantal geobserveerde variabelen en het vinden van niet-geobserveerde variabelen. Deze niet-geobserveerde variabelen helpen de marktonderzoeker om conclusies te trekken uit de enquête. Deze omzetting van geobserveerde naar niet-geobserveerde variabelen gebeurt in twee stappen:
- Factor-extractie: In deze stap worden het aantal factoren en de extractiebenadering gekozen met behulp van variantie-opdelingsmethoden zoals principale componentenanalyse en common factor analysis.
- Factorrotatie: In deze stap probeert rotatie factoren om te zetten in ongecorreleerde factoren — het hoofddoel is de algehele interpreteerbaarheid te verbeteren. Er zijn veel rotatiemethoden beschikbaar, zoals: Varimax-rotatie, Quartimax-rotatie en Promax-rotatie.
Terminologie
Wat is een factor?
Een factor is een latente variabele die de samenhang beschrijft tussen meerdere geobserveerde variabelen. Het maximale aantal factoren is gelijk aan het aantal geobserveerde variabelen. Elke factor verklaart een bepaalde variantie in geobserveerde variabelen. De factoren met de laagste variantie worden weggelaten. Factoren staan ook bekend als latente variabelen, verborgen variabelen, niet-geobserveerde variabelen of hypothetische variabelen.
Wat zijn factorladingen?
De factorlading is een matrix die de relatie van elke variabele met de onderliggende factor laat zien. Het toont de correlatiecoëfficiënt tussen de geobserveerde variabele en de factor. Het laat de door de geobserveerde variabelen verklaarde variantie zien.
Wat zijn eigenwaarden?
Eigenwaarden representeren de door elke factor verklaarde variantie uit de totale variantie. Ze staan ook bekend als karakteristieke wortels.
Wat zijn communaliteiten?
Communaliteiten zijn de som van de gekwadrateerde ladingen voor elke variabele. Ze vertegenwoordigen de gemeenschappelijke variantie. Ze liggen tussen 0 en 1 en een waarde dicht bij 1 staat voor meer verklaarde variantie.
Wat is factorrotatie?
Rotatie is een hulpmiddel voor een betere interpretatie van factoranalyse. Rotatie kan orthogonaal of oblieek zijn. Het herverdeelt de communaliteiten met een duidelijk patroon van ladingen.
Het aantal factoren kiezen
Het Kaiser-criterium is een analytische benadering die is gebaseerd op het kiezen van de factor met een groter aandeel verklaarde variantie. De eigenwaarde is een goed criterium om het aantal factoren te bepalen. Over het algemeen wordt een eigenwaarde groter dan 1 beschouwd als selectiecriterium voor de component.
De grafische benadering is gebaseerd op de visuele weergave van de eigenwaarden van factoren, ook wel screeplot genoemd. Deze screeplot helpt ons het aantal factoren te bepalen op het punt waar de curve een knik (elbow) vertoont.
Factoranalyse vs. principal component analysis
- PCA-componenten verklaren de maximale hoeveelheid variantie, terwijl factoranalyse de covariantie in data verklaart.
- PCA-componenten zijn volledig orthogonaal aan elkaar, terwijl factoranalyse niet vereist dat factoren orthogonaal zijn.
- Een PCA-component is een lineaire combinatie van de geobserveerde variabele, terwijl in FA de geobserveerde variabelen lineaire combinaties zijn van de niet-geobserveerde variabele of factor.
- PCA-componenten zijn moeilijk te interpreteren. In FA zijn onderliggende factoren te labelen en te interpreteren.
- PCA is een vorm van dimensionaliteitsreductie, terwijl factoranalyse een latente-variabelemethode is.
- PCA is een type factoranalyse. PCA is observationeel, terwijl FA een modelleertechniek is.
Factoranalyse in Python met het pakket factor_analyzer
Benodigde libraries importeren
# Import required libraries
import pandas as pd
from sklearn.datasets import load_iris
from factor_analyzer import FactorAnalyzer
import matplotlib.pyplot as plt
Data laden
Laten we factoranalyse uitvoeren op BFI (dataset gebaseerd op een project voor persoonlijkheidsbeoordeling), die is verzameld met een 6-puntsschaal: 1 Zeer onjuist, 2 Matig onjuist, 3 Licht onjuist, 4 Licht juist, 5 Matig juist en 6 Zeer juist. Je kunt deze dataset ook downloaden via de volgende link: https://vincentarelbundock.github.io/Rdatasets/datasets.html
df= pd.read_csv("bfi.csv")
Data preprocesen
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 rijen × 25 kolommen
Toets op geschiktheid
Voordat je factoranalyse uitvoert, moet je de “factorabiliteit” van je dataset beoordelen. Factorabiliteit betekent: kunnen we factoren in de dataset vinden? Er zijn twee methoden om de factorabiliteit of steekproefgeschiktheid te toetsen:
- Bartlett-toets
- Kaiser-Meyer-Olkin-toets
Bartlett’s sfericiteitstoets controleert of de geobserveerde variabelen onderling correleren door de geobserveerde correlatiematrix te toetsen tegen de identiteitsmatrix. Als de toets niet statistisch significant is, moet je geen factoranalyse toepassen.
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 deze Bartlett-toets is de p-waarde 0. De toets is statistisch significant, wat aangeeft dat de geobserveerde correlatiematrix geen identiteitsmatrix is.
Kaiser-Meyer-Olkin (KMO)-toets meet de geschiktheid van data voor factoranalyse. Het bepaalt de geschiktheid voor elke geobserveerde variabele en voor het volledige model. KMO schat het aandeel variantie tussen alle geobserveerde variabelen. Een lager aandeel unieke variantie is geschikter voor factoranalyse. KMO-waarden liggen tussen 0 en 1. Een KMO-waarde kleiner dan 0,6 wordt als onvoldoende beschouwd.
from factor_analyzer.factor_analyzer import calculate_kmo kmo_all,kmo_model=calculate_kmo(df)kmo_model0.8486452309468382De algehele KMO voor onze data is 0,84, wat uitstekend is. Deze waarde geeft aan dat je kunt doorgaan met de geplande factoranalyse.
Het aantal factoren kiezen
Voor het kiezen van het aantal factoren kun je het Kaiser-criterium en de screeplot gebruiken. Beide zijn gebaseerd op eigenwaarden.
# 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 Hier zie je dat alleen voor 6 factoren de eigenwaarden groter dan één zijn. Dat betekent dat we slechts 6 factoren (of niet-geobserveerde variabelen) moeten kiezen.
# 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()De screeplot tekent een lijn voor elke factor en de bijbehorende eigenwaarden. Het aantal eigenwaarden groter dan één wordt beschouwd als het aantal factoren.
Hier zie je dat alleen voor 6 factoren de eigenwaarden groter dan één zijn. Dat betekent dat we slechts 6 factoren (of niet-geobserveerde variabelen) moeten kiezen.
Factoranalyse uitvoeren
# 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
- Factor 1 heeft hoge factorladingen voor E1, E2, E3, E4 en E5 (Extraversie)
- Factor 2 heeft hoge factorladingen voor N1, N2, N3, N4 en N5 (Neuroticisme)
- Factor 3 heeft hoge factorladingen voor C1, C2, C3, C4 en C5 (Consciëntieusheid)
- Factor 4 heeft hoge factorladingen voor O1, O2, O3, O4 en O5 (Openheid)
- Factor 5 heeft hoge factorladingen voor A1, A2, A3, A4 en A5 (Vriendelijkheid)
- Factor 6 heeft geen hoge ladingen voor welke variabele dan ook en is niet gemakkelijk te interpreteren. Het is beter om slechts vijf factoren te nemen.
Laten we factoranalyse uitvoeren voor 5 factoren.
# 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 totaal wordt 42% cumulatieve variantie verklaard door de 5 factoren.
Voor- en nadelen van factoranalyse
Factoranalyse verkent grote datasets en vindt onderling verbonden samenhangen. Het reduceert de geobserveerde variabelen tot enkele niet-geobserveerde variabelen of identificeert groepen onderling gerelateerde variabelen, wat marktonderzoekers helpt om marktsituaties te comprimeren en verborgen relaties te vinden tussen smaak, voorkeur en culturele invloeden van consumenten. Ook helpt het bij het verbeteren van vragenlijsten voor toekomstige enquêtes. Factoren zorgen voor een natuurlijkere data-interpretatie.
De resultaten van factoranalyse zijn soms controversieel. De interpretaties kunnen discutabel zijn, omdat meer dan één interpretatie van dezelfde data mogelijk is. Na factoridentificatie en het benoemen van factoren is domeinkennis vereist.
Conclusie
Gefeliciteerd, je bent aan het einde van deze tutorial gekomen!
In deze tutorial heb je geleerd wat factoranalyse is, de verschillende soorten factoranalyse, hoe factoranalyse werkt, basisterminologie rond factoranalyse, het kiezen van het aantal factoren, de vergelijking tussen principal component analysis en factoranalyse, de implementatie in Python met het pakket FactorAnalyzer, en de voor- en nadelen van factoranalyse.
Ik hoor graag je feedback of vragen. Je kunt je vraag achterlaten in een reactie en ik zal mijn best doen om te antwoorden.
Wil je meer leren over factoren in Python? Volg dan de DataCamp-cursus Unsupervised Learning in Python.
