Univariate analyse
Analyseer elke kolom afzonderlijk: visualiseer verdelingen van numerieke gegevens en waardetellingen van categorische gegevens en let op uitschieters en scheefheid.
Univariate analyse is een gratis Pandas & NumPy Academy-les op CoddyKit. Dit is les 2 van 4. Je kunt de volledige les hieronder gratis lezen en daarna in de browser praktisch oefenen met een ingebouwde code-editor en een AI-begeleider die 24/7 beschikbaar is. Deze les maakt deel uit van het leertraject Pandas & NumPy Academy. Je voortgang wordt gesynchroniseerd op het web en in de CoddyKit-app. De cursus Pandas & NumPy Academy bevat in totaal 4 lessen.
Wat is univariate analyse?
Univariate analyse onderzoekt telkens één kolom afzonderlijk en negeert relaties tussen kolommen. Het doel is om de verdeling van elke variabele te begrijpen, uitschieters te detecteren, scheefheid vast te stellen en problemen met de gegevenskwaliteit te herkennen voordat modellering begint. Univariate analyse verschilt voor numerieke en categorische kolommen: voor numerieke kolommen zijn verdelingsgrafieken en samenvattende statistieken nodig, terwijl je voor categorische kolommen frequentietellingen en verhoudingen gebruikt.
import pandas as pd
import seaborn as sns
df = sns.load_dataset('titanic')
numeric_cols = df.select_dtypes('number').columns.tolist()
categoric_cols = df.select_dtypes('object').columns.tolist()
print('Numeric columns:', numeric_cols)
print('Categorical columns:', categoric_cols)Histogrammen voor numerieke kolommen
Maak voor elke numerieke kolom een histogram om de vorm van de verdeling te zien. Let op symmetrie versus scheefheid (een staart aan één kant), modaliteit (één piek versus meerdere) en duidelijke afwijkingen (waarden aan de uiterste uiteinden die onwaarschijnlijk lijken). In Pandas maakt df.hist() snel een raster met histogrammen voor meerdere kolommen, zonder dat je een lus hoeft te schrijven, maar Seaborns histplot biedt meer controle voor afzonderlijke kolommen.
import pandas as pd
import matplotlib.pyplot as plt
import seaborn as sns
df = sns.load_dataset('titanic')
# Quick multi-column histogram grid
numeric = df.select_dtypes('number')
numeric.hist(bins=20, figsize=(12, 8), layout=(2, 3), color='steelblue', edgecolor='white')
plt.suptitle('Univariate Distributions (Numeric Columns)', y=1.02)
plt.tight_layout()
plt.show()Samenvattende statistieken voor numerieke kolommen
Bereken en vergelijk voor elke numerieke kolom het gemiddelde versus de mediaan. Als het gemiddelde aanzienlijk groter is dan de mediaan, is de verdeling rechtsscheef (een lange staart naar rechts, wat vaak voorkomt bij inkomens- en prijsgegevens). Als het gemiddelde kleiner is dan de mediaan, is de verdeling linksscheef. Controleer ook de standaardafwijking ten opzichte van het gemiddelde: een standaardafwijking die groter is dan het gemiddelde bij een niet-negatieve variabele wijst op een grote variabiliteit of uitschieters. Bereken de scheefheid rechtstreeks met df.skew().
import pandas as pd
import seaborn as sns
df = sns.load_dataset('titanic')
numeric = df.select_dtypes('number')
summary = pd.DataFrame({
'mean': numeric.mean(),
'median': numeric.median(),
'std': numeric.std(),
'skewness': numeric.skew(),
'missing_pct': (numeric.isna().sum() / len(df) * 100).round(1)
}).round(2)
print(summary)Boxplots voor het detecteren van uitschieters
Boxplots zijn het snelste visuele hulpmiddel om uitschieters in numerieke kolommen te herkennen. Elk punt buiten de snorharen (1,5×IQR vanaf Q1 of Q3) wordt afzonderlijk weergegeven en gemarkeerd als mogelijke uitschieter. Een kolom met veel uitschieters verdient nader onderzoek: zijn het invoerfouten, legitieme extreme waarden of aanwijzingen voor een niet-normale verdeling? Boxplots laten ook rechtse of linkse scheefheid zien aan de hand van de asymmetrische positie van de mediaan in de box.
import pandas as pd
import matplotlib.pyplot as plt
import seaborn as sns
df = sns.load_dataset('titanic')
fig, axes = plt.subplots(1, 3, figsize=(14, 5))
for ax, col in zip(axes, ['age', 'fare', 'sibsp']):
df[[col]].boxplot(ax=ax)
ax.set_title(f'Box Plot: {col}')
plt.tight_layout()
plt.show()Uitschietertellingen op basis van IQR
De IQR-methode (interkwartielafstand) definieert uitschieters als waarden onder Q1 - 1,5×IQR of boven Q3 + 1,5×IQR. Je kunt dit programmatisch berekenen om uitschieters in elke numerieke kolom te tellen en te bekijken, zonder grafieken te maken. Dit is nuttig in geautomatiseerde gegevenspijplijnen waarin je aantallen afwijkingen wilt vastleggen in plaats van grafieken te genereren. Bepalen wat je met uitschieters doet — verwijderen, afkappen of markeren — moet een bewuste keuze zijn die is gebaseerd op domeinkennis.
import pandas as pd
import seaborn as sns
df = sns.load_dataset('titanic')
numeric = df.select_dtypes('number')
Q1 = numeric.quantile(0.25)
Q3 = numeric.quantile(0.75)
IQR = Q3 - Q1
lower = Q1 - 1.5 * IQR
upper = Q3 + 1.5 * IQR
outlier_counts = ((numeric < lower) | (numeric > upper)).sum()
print('Outlier counts per column:')
print(outlier_counts[outlier_counts > 0])Waardetellingen voor categorische kolommen
Roep voor elke categorische kolom value_counts() aan om te zien hoe waarnemingen over de categorieën zijn verdeeld. Controleer altijd: domineert één categorie (>80%)? Dit veroorzaakt klasse-onbalans bij classificatietaken. Zijn er zeldzame categorieën met slechts 1-2 waarnemingen (typefouten of invoerfouten)? Komt de verdeling overeen met de verwachtingen vanuit het bedrijf (bijvoorbeeld een kolom 'country' die laat zien dat de meeste bestellingen uit een onverwacht land komen)?
import pandas as pd
import seaborn as sns
df = sns.load_dataset('titanic')
for col in ['sex', 'embarked', 'class', 'who']:
counts = df[col].value_counts(dropna=False)
pct = (counts / len(df) * 100).round(1)
result = pd.DataFrame({'count': counts, 'pct%': pct})
print(f'\n--- {col} ---')
print(result)Staafdiagrammen voor categorische variabelen
Visualiseer categorische waardetellingen als staafdiagrammen met sns.countplot of door value_counts().plot(kind='bar') aan te roepen. Sorteer de staven van meest naar minst frequent, zodat de kijker dominante categorieën direct ziet. Voor binaire variabelen (ja/nee, man/vrouw) is een cirkeldiagram acceptabel, maar voor meer dan 3 categorieën zijn staafdiagrammen altijd duidelijker. Draai de labels op de markeringen 45 graden wanneer categorienamen lang zijn.
import pandas as pd
import matplotlib.pyplot as plt
import seaborn as sns
df = sns.load_dataset('titanic')
fig, axes = plt.subplots(1, 2, figsize=(12, 5))
sns.countplot(data=df, x='embarked', order=df['embarked'].value_counts().index, ax=axes[0])
axes[0].set_title('Embarkation Port Counts')
sns.countplot(data=df, x='class', order=['First', 'Second', 'Third'], ax=axes[1])
axes[1].set_title('Passenger Class Counts')
plt.tight_layout()
plt.show()Scheefheid detecteren en transformaties toepassen
Sterk rechtsscheve numerieke kolommen (scheefheid > 1,5) hebben vaak baat bij een logaritmische transformatie om ze symmetrischer te maken. Dit is belangrijk voor veel statistische toetsen en sommige ML-algoritmen die normaliteit veronderstellen. Pas np.log1p() toe (log(x+1), veilig voor waarden rond nul) en controleer de scheefheid opnieuw. Vergelijk histogrammen vóór en na de transformatie om te bevestigen dat de verdeling meer de vorm van een klok heeft gekregen.
import pandas as pd
import numpy as np
import matplotlib.pyplot as plt
import seaborn as sns
df = sns.load_dataset('titanic')
fig, axes = plt.subplots(1, 2, figsize=(10, 4))
sns.histplot(df['fare'], bins=30, kde=True, ax=axes[0])
axes[0].set_title(f'fare (skew={df["fare"].skew():.2f})')
log_fare = np.log1p(df['fare'])
sns.histplot(log_fare, bins=30, kde=True, ax=axes[1], color='coral')
axes[1].set_title(f'log1p(fare) (skew={log_fare.skew():.2f})')
plt.tight_layout()
plt.show()Kolommen met variantie nul controleren
Een kolom met variantie nul (alle waarden zijn identiek) levert geen informatie voor een model en moet worden verwijderd. Een kolom met vrijwel geen variantie (99% van de rijen heeft dezelfde waarde) is op dezelfde manier nutteloos. Bereken de variantie met df.var() en filter de kolommen. Controleer ook op kolommen waarvoor nunique() == len(df) geldt: dit zijn waarschijnlijk ID-kolommen die je niet als kenmerken moet gebruiken, maar die wel nuttig kunnen zijn als rij-id's.
import pandas as pd
import seaborn as sns
df = sns.load_dataset('titanic')
numeric = df.select_dtypes('number')
# Zero-variance columns
zero_var = numeric.columns[numeric.var() == 0].tolist()
print('Zero-variance columns:', zero_var)
# Near-zero variance (std < 0.01)
nzv = numeric.columns[numeric.std() < 0.01].tolist()
print('Near-zero variance:', nzv)
# Likely ID columns (all unique values)
id_candidates = [c for c in df.columns if df[c].nunique() == len(df)]
print('Likely ID columns:', id_candidates)Automatiseringslus voor univariate analyse
In plaats van voor elke kolom handmatig dezelfde analyse te herhalen, schrijf je een lus die alle numerieke kolommen doorloopt en belangrijke statistieken in een gestructureerd formaat afdrukt. Zo kun je snel tientallen kolommen scannen en markeren welke aandacht nodig hebben. De uitvoer kan worden opgeslagen in een CSV-bestand als onderdeel van een controlelogboek van de gegevenspijplijn, dat belanghebbenden kunnen bekijken voordat de gegevens voor modellering worden gebruikt.
import pandas as pd
import seaborn as sns
df = sns.load_dataset('titanic')
numeric = df.select_dtypes('number')
rows = []
for col in numeric.columns:
s = df[col]
Q1, Q3 = s.quantile(0.25), s.quantile(0.75)
IQR = Q3 - Q1
n_outliers = ((s < Q1 - 1.5*IQR) | (s > Q3 + 1.5*IQR)).sum()
rows.append({
'column': col,
'missing_pct': round(s.isna().mean() * 100, 1),
'mean': round(s.mean(), 2),
'std': round(s.std(), 2),
'skew': round(s.skew(), 2),
'outliers': int(n_outliers)
})
report = pd.DataFrame(rows)
print(report.to_string(index=False))Bevindingen van univariate analyse documenteren
Documenteer je bevindingen systematisch nadat je de univariate analyse hebt afgerond. Noteer voor elke kolom: de vorm van de verdeling (scheef, bimodaal, ongeveer normaal), het percentage ontbrekende waarden en de geplande imputatiestrategie, het aantal uitschieters en de beslissing daarover (afkappen, verwijderen, markeren), en verdachte waarden waarvoor verduidelijking vanuit het domein nodig is. Deze documentatie wordt het logboek voor gegevenskwaliteit dat de opschoningsstappen aanstuurt en voorkomt dat beslissingen later worden vergeten of betwist.
Korte controle
Toets je begrip van univariate analyse uit deze les.
Samenvatting van de les
In deze les heb je geleerd dat histogrammen de vorm van de verdeling van numerieke kolommen onthullen, dat boxplots en IQR-afbakeningen uitschieters identificeren en dat value_counts de frequentie van categorieën in categorische kolommen onthult. Door deze controles in een lus te automatiseren, maak je een herbruikbaar kwaliteitsrapport. Hierna verkennen we bivariate analyse en correlatieanalyse: relaties tussen paren kolommen begrijpen.
Leer Python met een AI-tutor — gratis
Schrijf echte code en voer die uit in je browser, krijg direct hulp van een AI-tutor die 24/7 beschikbaar is en ga verder waar je gebleven bent op het web of in de app.
- Cursussen
- 30
- Lessen
- 120
Veelgestelde vragen
Is de les “Univariate analyse” gratis?
Ja — de volledige tekst van “Univariate analyse” kun je hier gratis op het web lezen. Als je interactief wilt oefenen met een ingebouwde code-editor en een AI-begeleider die 24/7 beschikbaar is, en de rest van de cursus Pandas & NumPy Academy wilt ontgrendelen, kun je upgraden naar CoddyKit PRO. De cursus Pandas & NumPy Academy bevat in totaal 4 lessen.
Wat leer ik in “Univariate analyse”?
Analyseer elke kolom afzonderlijk: visualiseer verdelingen van numerieke gegevens en waardetellingen van categorische gegevens en let op uitschieters en scheefheid. Je oefent met Pandas & NumPy Academy door code rechtstreeks in de browser uit te voeren. Een AI-begeleider die 24/7 beschikbaar is beantwoordt je vragen terwijl je de les doorwerkt.
Heb ik ervaring nodig om met Pandas & NumPy Academy te beginnen?
Ervaring vooraf is niet nodig. Pandas & NumPy Academy op CoddyKit is opgebouwd voor beginners tot gevorderden, zodat je hier of bij het begin kunt starten en in je eigen tempo kunt leren. Dit is les 2 van 4.
Hoe lang duurt de les “Univariate analyse”?
De meeste lessen van CoddyKit duren ongeveer 5–10 minuten. Elke les is kort en interactief, zodat je gestaag vooruitgaat en op het web en in de app precies verdergaat waar je was gebleven.
Kan ik code schrijven en uitvoeren in deze les over Pandas & NumPy Academy?
Ja. Elke les over Pandas & NumPy Academy bevat een ingebouwde code-editor, zodat je rechtstreeks in je browser echte code kunt schrijven en uitvoeren en direct feedback van AI krijgt — lokale installatie is niet nodig.
Alle lessen in deze cursus
- Checklist voor datasetprofilering
- Univariate analyse
- Bivariate en correlatieanalyse
- Bevindingen samenvatten in een rapport