Cursus

Introductie tot Principal Component Analysis (PCA)
Stel, je bent data scientist in de retail en je wilt achterhalen wat een klant blij maakt op basis van een dataset met deze vijf kenmerken: maandelijkse uitgave, leeftijd, geslacht, aankoopfrequentie en productbeoordeling. Om beter te analyseren en tot concrete conclusies te komen, moeten we de dataset begrijpen of op z’n minst visualiseren. Mensen kunnen niet gemakkelijk meer dan drie dimensies visualiseren; daarom is het niet eenvoudig om klantdata met vijf kenmerken (dimensies) te visualiseren. Dit is waar principal component analysis (kortweg PCA) van pas komt.
“Maar wat is principal component analysis?”
Het is een statistische methode om hoog-dimensionale data te analyseren en de belangrijkste informatie eruit te destilleren. Dit gebeurt door de oorspronkelijke data te transformeren naar een ruimte met minder dimensies, terwijl sterk gecorreleerde variabelen worden gebundeld. In ons scenario zou PCA bijvoorbeeld drie kenmerken kiezen, zoals maandelijkse uitgave, aankoopfrequentie en productbeoordeling. Dat maakt het visualiseren en begrijpen van de data eenvoudiger.
In deze tutorial neem ik je mee door de kernconcepten van principal component analysis en laat ik zien hoe je PCA toepast in praktijksituaties met het corrr-pakket in R.
Bekijk en leer meer over Principal Component Analysis in R in deze video uit onze cursus.
TL;DR
- PCA reduceert hoge-dimensiedata naar minder dimensies terwijl zoveel mogelijk variantie behouden blijft
- Normaliseer je data altijd met
scale()voordat je PCA draait, zodat variabelen evenveel bijdragen - Gebruik
princomp()ofprcomp()in R met de pakkettenFactoMineRenfactoextravoor analyse en visualisatie - De eerste twee hoofdcomponenten verklaren meestal 80–90% van de variantie en zijn vaak genoeg voor visualisatie
- Gebruik screeplots om te bepalen hoeveel componenten je behoudt, en biplots om variablerelaties te interpreteren
Vereisten
Om deze tutorial te volgen, heb je nodig:
- Basiskennis van R — heb je een opfrisser nodig, bekijk dan de tutorial Aan de slag met de Tidyverse
- Bekendheid met het laden en subsetten van data frames in R
- R 4.x of later geïnstalleerd
- De volgende pakketten:
corrr,ggcorrplot,FactoMineR,factoextra(installatie komt later in de tutorial aan bod)
Hoe werkt PCA? Een gids in 5 stappen
Hoewel we focussen op PCA, is het goed om de vijf belangrijkste methoden voor hoofdcomponenten te onthouden die multivariate data samenvatten en visualiseren. In tegenstelling tot de andere technieken werkt PCA alleen met kwantitatieve variabelen.

Methoden voor hoofdcomponenten
We gaan niet in op de wiskundige details, die vrij complex kunnen zijn. Met het volgende vijfstappenplan krijg je echter een beter idee van hoe je PCA berekent.

De vijf hoofdstappen voor het berekenen van hoofdcomponenten
Stap 1 - Normaliseren van data
Kijkend naar het voorbeeld uit de introductie, stel dat we voor een bepaalde klant de volgende informatie hebben.
- Maandelijkse uitgaven: $300
- Leeftijd: 27
- Beoordeling: 4,5
Deze gegevens hebben verschillende schalen en PCA op zulke data levert een vertekend resultaat op. Daarom normaliseren we de data: zo draagt elk kenmerk gelijk bij en domineert geen variabele de rest. Voor elke variabele trek je het gemiddelde af en deel je door de standaarddeviatie.
Stap 2 - Covariantiematrix
Zoals de naam aangeeft, bereken je in deze stap de covariantiematrix op basis van de genormaliseerde data. Dit is een symmetrische matrix waarbij elk element (i, j) de covariantie tussen variabelen i en j weergeeft.
Stap 3 - Eigenvectoren en eigenwaarden
Geometrisch staat een eigenvector voor een richting, zoals “verticaal” of “90 graden”. Een eigenwaarde is het getal dat de hoeveelheid variantie in de data in die richting weergeeft. Elke eigenvector heeft een bijbehorende eigenwaarde.
Stap 4 - Selectie van hoofdcomponenten
Het aantal paren eigenvectoren en eigenwaarden is gelijk aan het aantal variabelen in de data. In data met alleen maandelijkse uitgaven, leeftijd en beoordeling zijn er dus drie paren. Niet alle paren zijn relevant. De eigenvector met de hoogste eigenwaarde is de eerste hoofdcomponent. De tweede hoofdcomponent komt overeen met de eigenvector met de op een na hoogste eigenwaarde, enzovoort.
Stap 5 - Transformatie naar een nieuwe dimensieruimte
In deze stap projecteer je de oorspronkelijke data op een nieuwe subruimte gedefinieerd door de hoofdcomponenten. Dit doe je door de oorspronkelijke data te vermenigvuldigen met de eerder berekende eigenvectoren.
Belangrijk: deze transformatie wijzigt de oorspronkelijke data niet, maar biedt een nieuw perspectief om de data beter te representeren.
Toepassingen van principal component analysis
PCA kent tal van toepassingen in het dagelijks leven, waaronder (maar zeker niet beperkt tot) financiën, beeldverwerking, gezondheidszorg en beveiliging.
Financiën
Het voorspellen van aandelenkoersen op basis van historische prijzen wordt al jaren onderzocht. PCA kan worden gebruikt voor dimensiereductie en data-analyse om componenten te vinden die het grootste deel van de variabiliteit verklaren. Leer meer over dimensiereductie in R in onze cursus.
Beeldverwerking
Een afbeelding bestaat uit veel kenmerken. PCA wordt vooral gebruikt voor beeldcompressie: de essentiële details blijven behouden terwijl het aantal dimensies afneemt. Daarnaast kan PCA worden ingezet voor complexere taken zoals beeldherkenning.
Gezondheidszorg
In dezelfde geest als beeldcompressie wordt PCA gebruikt bij MRI-scans om de dimensionaliteit te verlagen voor betere visualisatie en medische analyse. Het kan ook worden geïntegreerd in medische technologieën om bijvoorbeeld een ziekte op basis van scans te herkennen.
Beveiliging
Biometrische systemen voor vingerafdrukherkenning kunnen PCA inzetten om de meest relevante kenmerken te extraheren, zoals textuur en aanvullende informatie.
Praktijkvoorbeeld van PCA in R
Nu je de theoretische basis begrijpt, is het tijd om PCA in actie te zien.
In dit onderdeel doorlopen we alle stappen: pakketten installeren, data laden en voorbereiden, PCA toepassen in R en de resultaten interpreteren.
De broncode is beschikbaar in DataLab.
De omgeving inrichten
Voor deze tutorial heb je de volgende libraries nodig. Elk pakket vereist twee stappen voor effectief gebruik:
- Installeer de library om toegang te krijgen tot de functies.
- Laad de library om de functies te kunnen gebruiken.
corrr-pakket in R
Dit R-pakket is bedoeld voor correlatieanalyse. Het richt zich vooral op het maken en bewerken van R data frames. Hieronder de stappen om te installeren en te laden.
install.packages("corrr")
library('corrr')ggcorrplot-pakket in R
Het ggcorrplot-pakket biedt meerdere functies en bevat onder meer de ggplot2-functie om eenvoudig een correlatiematrix te visualiseren. Net als hierboven is de installatie rechttoe rechtaan.
install.packages("ggcorrplot")
library(ggcorrplot)FactoMineR-pakket in R
Vooral gebruikt voor multivariate, verkennende data-analyse. Het factoMineR-pakket biedt toegang tot het PCA-module om principal component analysis uit te voeren.
install.packages("FactoMineR")
library("FactoMineR")factoextra-pakket in R
Dit laatste pakket levert alle relevante functies om de uitkomsten van de principal component analysis te visualiseren. Denk aan screeplot en biplot — twee visualisatietechnieken die later in dit artikel aan bod komen.
install.packages("factoextra")
library(factoextra)De data verkennen
Voordat je de data laadt en verder verkent, is het goed om basisinformatie over de data te kennen waarmee je gaat werken.
Proteinedata
De protein-dataset is een reële, multivariate dataset die de gemiddelde eiwitconsumptie van inwoners uit 25 Europese landen beschrijft.
Voor elk land zijn er tien kolommen. De eerste acht corresponderen met verschillende soorten eiwitten. De laatste correspondeert met de totale waarde van de gemiddelde eiwitinname.
Laten we snel een overzicht van de data nemen.
Eerst laden we de data met de functie read.csv(), vervolgens str(), wat tot de onderstaande weergave leidt.
protein_data <- read.csv("protein.csv")
str(protein_data)We zien dat de dataset 25 observaties en 11 kolommen heeft. Elke variabele is numeriek, behalve de kolom Country, die een tekstveld is.

Beschrijving van de proteinedata
Controleren op ontbrekende waarden
Ontbrekende waarden kunnen het PCA-resultaat vertekenen. Het is daarom aan te raden de juiste aanpak te kiezen om met die waarden om te gaan. Onze tutorial Toptechnieken om ontbrekende waarden te behandelen helpt je bij die keuze.
colSums(is.na(protein_data))De functie colSums() gecombineerd met is.na() geeft het aantal ontbrekende waarden per kolom. Zoals hieronder te zien, hebben geen van de kolommen ontbrekende waarden.

Aantal ontbrekende waarden per kolom
De data normaliseren
Zoals eerder vermeld werkt PCA alleen met numerieke waarden. We verwijderen daarom de kolom Country. Ook is de kolom Total niet relevant, omdat dit de lineaire combinatie is van de overige numerieke variabelen.
De onderstaande code maakt nieuwe data met alleen numerieke kolommen.
numerical_data <- protein_data[,2:10]
head(numerical_data)
Voor de normalisatie van de data (alleen de eerste vijf kolommen getoond)
Nu kunnen we normaliseren met de functie scale().
data_normalized <- scale(numerical_data)
head(data_normalized)
Genormaliseerde data (alleen de eerste vijf kolommen getoond)
De correlatiematrix visualiseren
Voor je PCA draait, helpt het om correlaties tussen variabelen te visualiseren. Sterke onderlinge correlaties duiden op redundantie die PCA kan comprimeren. Ik gebruik de eerder geïnstalleerde pakketten corrr en ggcorrplot.
corr_matrix <- cor(data_normalized)
ggcorrplot(corr_matrix,
hc.order = TRUE,
type = "lower",
lab = TRUE)De heatmap laat sterke positieve correlaties zien tussen dierlijke eiwitbronnen (rood vlees, wit vlees, eieren en melk). Dit verklaart waarom de eerste hoofdcomponent bijna 77% van de totale variantie verklaart. Deze correlatiestructuur is precies wat PCA benut.
Opmerking over PCA-functies in R: Deze tutorial gebruikt princomp(), dat spectrale decompositie toepast op de covariantiematrix. Voor de meeste praktische toepassingen verdient prcomp() de voorkeur — dit gebruikt singular value decomposition (SVD), wat numeriek stabieler is bij datasets met veel variabelen. Het belangrijkste verschil in output: princomp() slaat loadings op in $loadings, terwijl prcomp() $rotation gebruikt. Op goed geconditioneerde data, zoals de proteinedataset hier, leveren beide equivalente resultaten op.
PCA toepassen
Alle middelen zijn nu aanwezig om de PCA-analyse uit te voeren. Eerst berekent princomp() de PCA en summary() toont het resultaat.
data.pca <- princomp(data_normalized)
summary(data.pca)
R PCA-samenvatting
In de bovenstaande weergave zien we dat er negen hoofdcomponenten zijn gegenereerd (Comp.1 t/m Comp.9), wat overeenkomt met het aantal variabelen in de data.
Elke component verklaart een percentage van de totale variantie in de dataset. In de sectie Cumulative Proportion verklaart de eerste hoofdcomponent bijna 77% van de totale variantie. Dit betekent dat bijna twee derde van de data in de set van 9 variabelen door alleen de eerste hoofdcomponent kan worden weergegeven. De tweede verklaart 12,08% van de totale variantie.
De cumulatieve proportie van Comp.1 en Comp.2 verklaart bijna 89% van de totale variantie. Dit betekent dat de eerste twee hoofdcomponenten de data nauwkeurig kunnen representeren.
Mooi, die eerste twee componenten, maar wat betekenen ze nu precies?
Dat kun je beantwoorden door te bekijken hoe ze samenhangen met elke kolom via de loadings van elke hoofdcomponent.
data.pca$loadings[, 1:2]
Loadingmatrix van de eerste twee hoofdcomponenten
De loadingmatrix laat zien dat de eerste hoofdcomponent hoge positieve waarden heeft voor rood vlees, wit vlees, eieren en melk. De waarden voor granen, peulvruchten, noten en oliehoudende zaden, en groente en fruit zijn juist relatief negatief. Dit suggereert dat landen met een hogere inname van dierlijke eiwitten in surplus zijn, terwijl landen met een lagere inname in tekort zijn.
Voor de tweede hoofdcomponent zien we hoge negatieve waarden voor vis, zetmeelrijke voeding en groente en fruit. Dit impliceert dat het dieet van de betreffende landen sterk wordt beïnvloed door de ligging, zoals kustregio’s voor vis, en binnenlandregio’s met een dieet rijk aan groente en aardappelen.
Visualisatie van de hoofdcomponenten
De analyse van de loadingmatrix gaf een goed beeld van de relatie tussen elk van de eerste twee hoofdcomponenten en de kenmerken in de data. Maar visueel is dat misschien minder aantrekkelijk.
Er zijn een paar standaardvisualisaties die helpen om inzichten uit de data te halen. Dit gedeelte behandelt enkele van die benaderingen, te beginnen met de screeplot.
Screeplot
De eerste benadering is de screeplot. Die gebruik je om het belang van elke hoofdcomponent te visualiseren en om te bepalen hoeveel componenten je behoudt. De screeplot maak je met de functie fviz_eig().
fviz_eig(data.pca, addlabels = TRUE)
Screeplot van de componenten
Deze plot toont de eigenwaarden in een dalende curve van hoog naar laag. De eerste twee componenten zijn het belangrijkst, omdat ze samen bijna 89% van de totale informatie in de data bevatten.
Biplot van de kenmerken
Met de biplot kun je de overeenkomsten en verschillen tussen de samples visualiseren en zie je bovendien de impact van elk kenmerk op de hoofdcomponenten.
# Grafiek van de variabelen
fviz_pca_var(data.pca, col.var = "black")
Biplot van de variabelen ten opzichte van de hoofdcomponenten
Drie hoofdobservaties uit de bovenstaande plot:
- Ten eerste zijn variabelen die gegroepeerd zijn positief gecorreleerd met elkaar. Dat geldt bijvoorbeeld voor wit/rood vlees, melk en eieren; die hebben onderling een positieve correlatie. Dit sluit aan bij de hoogste waarden in de loadingmatrix voor de eerste hoofdcomponent.
- Hoe groter de afstand van de variabele tot de oorsprong, hoe beter die variabele wordt gerepresenteerd. In de biplot hebben eieren, melk en wit vlees een grotere magnitude dan rood vlees en zijn dus beter vertegenwoordigd.
- Tot slot: variabelen die negatief gecorreleerd zijn, staan aan tegenovergestelde kanten van de oorsprong in de biplot.
Bijdrage van elke variabele
Het doel van de derde visualisatie is te bepalen in welke mate elke variabele in een bepaalde component wordt gerepresenteerd. Deze representatiekwaliteit heet Cos2 en komt overeen met de kwadraatcosinus. Je berekent dit met de functie fviz_cos2().
- Een lage waarde betekent dat de variabele niet goed door die component wordt weergegeven.
- Een hoge waarde betekent juist een goede representatie van de variabele op die component.
fviz_cos2(data.pca, choice = "var", axes = 1:2)De bovenstaande code berekent de kwadraatcosinus voor elke variabele ten opzichte van de eerste twee hoofdcomponenten.
Uit de onderstaande illustratie blijkt dat granen, peulvruchten en oliehoudende zaden, eieren en melk de vier variabelen met de hoogste cos2 zijn en dus het meest bijdragen aan PC1 en PC2.

Bijdrage van variabelen aan hoofdcomponenten
Biplot gecombineerd met cos2
De laatste twee visualisaties — biplot en belangrijkheid van kenmerken — kun je combineren in één biplot, waarbij kenmerken met vergelijkbare cos2-scores vergelijkbare kleuren hebben. Dat doe je door de functie fviz_pca_var als volgt te fine-tunen:
fviz_pca_var(data.pca, col.var = "cos2",
gradient.cols = c("black", "orange", "green"),
repel = TRUE)In de biplot hieronder:
- Kenmerken met hoge cos2 zijn groen: granen, peulvruchten, oliehoudende zaden, eieren en melk.
- Kenmerken met gemiddelde cos2 zijn oranje: wit vlees, zetmeelrijke voeding, vis en rood vlees.
- Kenmerken met lage cos2 zijn zwart: groente en fruit.

Combinatie van biplot en cos2-score
Hoe kies je het aantal componenten
Twee praktische regels helpen bepalen hoeveel hoofdcomponenten je behoudt:
- Elbow-regel: Bekijk de screeplot en zoek waar de curve scherp buigt. Componenten rechts van de knik voegen weinig extra variantie toe.
- Variantie‑drempel: Behoud genoeg componenten om 80% tot 90% van de totale variantie te verklaren. In deze dataset verklaren de eerste twee al circa 89%.
Conclusie
In deze tutorial heb ik uitgelegd wat principal component analysis is en waarom het belangrijk is in data-analyse. Van de wiskundige basis tot en met hands-on R-code doorliepen we een volledige PCA‑workflow op de proteinedataset — van normaliseren en princomp() toepassen tot het interpreteren van screeplots, biplots en cos2‑visualisaties om de relatie tussen hoofdcomponenten en de oorspronkelijke variabelen te begrijpen.
Pas deze technieken toe om dimensionaliteit te reduceren, verborgen structuur zichtbaar te maken en schonere machine‑learning‑pijplijnen te bouwen met je eigen datasets.
Ga verder met deze gerelateerde resources:
- Principal Component Analysis in Python — dezelfde techniek toegepast op tabel- en afbeeldingsdata
- Understanding UMAP — een niet-lineair alternatief voor dimensiereductie bij complexe datastructuren
- Understanding Dimensionality Reduction — een bredere kijk op technieken zoals PCA, t‑SNE en UMAP
- The Curse of Dimensionality — waarom hoge-dimensiedata uitdagend is en hoe PCA helpt
- Introduction to R — versterk je R‑basis met hands‑on oefeningen
PCA-analyse FAQ
Is PCA feature-extractie of -selectie?
PCA gebruikt een onbewaakte lineaire transformatie voor feature-extractie en dimensiereductie.
Wanneer gebruik je PCA-analyse?
Gebruik PCA wanneer je te maken hebt met sterk gecorreleerde variabelen. Bij zwakke correlaties lukt dimensiereductie met PCA mogelijk minder goed.
Wat zijn de beperkingen van PCA?
Ten eerste werkt PCA alleen met numerieke variabelen. Verder werkt het minder goed wanneer variabelen niet sterk gecorreleerd zijn. Ook is PCA gevoelig voor de schaal van features en worden resultaten beïnvloed door outliers.
Wat is het belangrijkste voordeel van PCA?
PCA heeft meerdere voordelen, waaronder:
- Het aantal variabelen reduceren door ruis te verwijderen, wat ook overfitting kan verminderen.
- De prestaties van algoritmen verbeteren door te focussen op relevante features.
- De datavisualisatie verbeteren voor beter begrip van de data.
Wat zijn PC1 en PC2 in principal component analysis?
De PC1-as komt overeen met de eerste hoofdrichting waarin de data de grootste variatie vertoont. De PC2-as komt overeen met de tweede belangrijkste richting met de grootste variatie. Bovendien staat PC1 altijd loodrecht op PC2.
Wat zijn de aannames van principal component analysis?
PCA gaat uit van de volgende aannames:
- Er bestaat een lineaire combinatie tussen variabelen.
- Hoofdcomponenten met de hoogste variantie zijn belangrijker dan degenen met weinig variantie; die laatste worden gezien als ruis.
- Meer outliers in de data duiden op experimentele fouten.
- De dataset die uit PCA komt, geeft een goede representatie van de oorspronkelijke data.
Hoe doe je PCA in R?
Om PCA in R uit te voeren, normaliseer je data met scale(), en gebruik je vervolgens prcomp() (aanbevolen — gebruikt SVD voor numerieke stabiliteit) of princomp() uit base R, of de functie PCA() uit het pakket FactoMineR. Gebruik het pakket factoextra om resultaten te visualiseren met fviz_eig() voor screeplots en fviz_pca_var() voor biplots.
Wat is het verschil tussen prcomp() en princomp() in R?
prcomp() gebruikt singular value decomposition (SVD), wat numeriek stabieler is en doorgaans de voorkeur heeft. princomp() gebruikt spectrale decompositie op de covariantiematrix. Beide leveren equivalente resultaten op voor goed geconditioneerde data, maar prcomp() is aanbevolen voor de meeste praktische toepassingen. Het belangrijkste outputverschil is dat loadings in $rotation staan bij prcomp() en in $loadings bij princomp().
Kan PCA worden gebruikt voor machine‑learning‑preprocessing in R?
Ja. PCA wordt vaak gebruikt als preprocessing-stap in machine‑learning‑pijplijnen om het aantal inputfeatures te verminderen, multicollineariteit tussen voorspellers te verwijderen en modeltraining te versnellen. In R kun je de scores van de hoofdcomponenten uit prcomp() halen via $x en deze als inputfeatures gebruiken voor vervolgmodellen. De pakketten caret en tidymodels ondersteunen PCA als preprocessing-stap via respectievelijk preProcess(method = "pca") en step_pca().
Hoe kies ik het aantal te behouden hoofdcomponenten?
Drie gangbare aanpakken helpen bepalen hoeveel componenten je behoudt:
- Elbow‑regel: Bekijk de screeplot en zoek waar de curve buigt — componenten rechts van de knik leveren afnemende variantie.
- Variantie‑drempel: Behoud genoeg componenten om 80–90% van de totale variantie te verklaren.
- Kaiser‑criterium: Behoud componenten met een eigenwaarde groter dan 1 (betrouwbaarder voor grotere datasets).
Gebruik in R fviz_eig() uit het pakket factoextra om de verklaarde variantie per component te visualiseren.
