Cursus
Omgaan met ontbrekende data is een veelvoorkomend en inherent probleem bij het verzamelen van data, zeker bij grote datasets. Er zijn uiteenlopende redenen voor ontbrekende data, zoals onvolledige informatie van deelnemers, non-respons van mensen die geen informatie willen delen, slecht ontworpen enquêtes of het verwijderen van data omwille van vertrouwelijkheid.
Als je ontbrekende data niet goed afhandelt, kan dat de conclusies van alle statistische analyses op de data vertekenen, waardoor het bedrijf verkeerde beslissingen kan nemen.
Dit artikel richt zich op enkele technieken om missende waarden efficiënt af te handelen en hoe je die in Python implementeert. We laten de voor- en nadelen van elke techniek zien, zodat je voor een gegeven situatie de juiste keuze kunt maken.
Ontbrekende data identificeren
Ontbrekende data komt in verschillende vormen voor. In deze sectie leggen we de verschillende typen ontbrekende data uit en hoe je ze herkent.
Typen ontbrekende data
Er zijn drie hoofdtypen ontbrekende data: (1) Missing Completely at Random (MCAR), (2) Missing at Random (MAR) en (3) Missing Not at Random (MNAR).
Het is belangrijk om elk type goed te begrijpen om de juiste methode te kiezen om ermee om te gaan.
1) MCAR - Missing completely at random
Dit gebeurt als alle variabelen en observaties dezelfde kans hebben om te ontbreken. Stel je voor dat je een kind Lego in verschillende kleuren geeft om een huis te bouwen. Elk Legosteentje staat voor een stukje informatie, zoals vorm en kleur. Het kind kan tijdens het spelen wat steentjes kwijtraken. Die kwijtgeraakte steentjes staan voor ontbrekende informatie, net zoals wanneer ze zich de vorm of kleur niet meer herinneren. Die informatie ging willekeurig verloren, maar verandert niets aan de informatie die het kind nog over de andere steentjes heeft.
2) MAR - Missing at random
Bij MAR hangt de kans dat een waarde ontbreekt samen met de waarde van de variabele zelf of met andere variabelen in de dataset. Dit betekent dat niet alle observaties en variabelen dezelfde kans hebben om te ontbreken. Een voorbeeld van MAR is een enquête in de datacommunity waarin data scientists die hun skills niet vaak bijwerken, minder geneigd zijn om op de hoogte te zijn van nieuwe state-of-the-art algoritmes of technologieën, en daardoor bepaalde vragen overslaan. De ontbrekende data hangt in dit geval samen met hoe vaak de data scientist bijschoolt.
3) MNAR- Missing not at random
MNAR wordt gezien als het moeilijkste scenario van de drie typen ontbrekende data. Het is van toepassing wanneer noch MAR noch MCAR gelden. In deze situatie is de kans op ontbreken volledig verschillend voor verschillende waarden van dezelfde variabele, en de redenen daarvoor kunnen onbekend zijn. Een voorbeeld van MNAR is een enquête over getrouwde stellen. Stellen met een slechte relatie willen bepaalde vragen misschien niet beantwoorden omdat ze dat gênant vinden.
Methoden om ontbrekende data te identificeren
Er zijn meerdere methoden om ontbrekende data in pandas te identificeren. Hieronder staan de meest gangbare.
|
Functies |
Beschrijvingen |
|
.isnull() |
Deze functie geeft een pandas-dataframe terug waarin elke waarde een booleaanse waarde is: True als de waarde ontbreekt, anders False. |
|
.notnull() |
Net als de vorige functie, maar de waarden zijn False wanneer een NaN- of None-waarde wordt gedetecteerd. |
|
.info() |
Deze functie genereert drie hoofdkolommen, waaronder de “Non-Null Count”, die het aantal niet-ontbrekende waarden per kolom toont. |
|
.isna() |
Deze is vergelijkbaar met isnull en notnull. Hij geeft echter alleen True weer wanneer de ontbrekende waarde van het type NaN is. |
Omgaan met ontbrekende data
Er bestaan meerdere benaderingen om ontbrekende data af te handelen. In deze sectie behandelen we er een aantal met hun voor- en nadelen.
Om de use case beter te illustreren gebruiken we Loan Data op DataLab samen met de broncode uit de tutorial.
Aangezien de dataset geen ontbrekende waarden heeft, gebruiken we een subset van de data (100 rijen) en introduceren we vervolgens handmatig missende waarden.
import pandas as pd
sample_customer_data = pd.read_csv("data/customer_churn.csv", nrows=100)
sample_customer_data.info()

Voorbeeld van 100 willekeurige steekproeven vóór het introduceren van missende waarden
Laten we 50% missende waarden in elke kolom van het dataframe introduceren met behulp van.
import numpy as np
def introduce_nan(x,percentage):
n = int(len(x)*(percentage - x.isna().mean()))
idxs = np.random.choice(len(x), max(n,0), replace=False, p=x.notna()/x.notna().sum())
x.iloc[idxs] = np.nan
Het toepassen van de functie op de data levert dit resultaat op.
sample_customer_data.apply(introduce_nan, percentage=.5)
sample_customer_data.info()

Voorbeeld van 100 willekeurige steekproeven na het introduceren van missende waarden
Hieronder staan de eerste vijf rijen van de dataset.
sample_customer_data.head()

Eerste vijf rijen met null-waarden
Data verwijderen
De functie dropna() is de eenvoudigste manier om observaties of features met missende waarden uit het dataframe te verwijderen. Hieronder staan enkele technieken.
1) Observaties met missende waarden verwijderen
Deze drie scenario’s kunnen optreden wanneer je observaties uit een dataset probeert te verwijderen:
dropna(): verwijdert alle rijen met missende waarden.
drop_na_strategy = sample_customer_data.dropna()
drop_na_strategy.info()

Observaties verwijderen met de standaardfunctie dropna()
We zien dat alle observaties uit de dataset zijn verwijderd, wat bijzonder riskant kan zijn voor de rest van de analyse.
dropna(how = ‘all’): de rijen waarbij alle kolomwaarden ontbreken.
drop_na_all_strategy = sample_customer_data.dropna(how="all")
drop_na_all_strategy.info()
Uit de onderstaande output blijkt dat er geen observatie is waarbij alle kolommen ontbreken.

Observaties verwijderen met de “all”-strategie
dropna(thresh = minimum_value): rijen verwijderen op basis van een drempel. Deze strategie stelt een minimum aan niet-ontbrekende waarden in om rijen te behouden.
drop_na_thres_strategy = sample_customer_data.dropna(thresh=0.6)
drop_na_thres_strategy.info()
Met de drempel op 60% is het resultaat hetzelfde als bij de vorige.

Observaties verwijderen met een drempel
2) Kolommen met missende waarden verwijderen
De parameter axis = 1 kun je gebruiken om expliciet aan te geven dat we kolommen bedoelen in plaats van rijen.
dropna(axis = 1): verwijdert alle kolommen met missende waarden.
drop_na_cols_strategy = sample_customer_data.dropna(axis=1)
drop_na_cols_strategy.info()
Er zijn geen kolommen meer in de data. Dat komt doordat alle kolommen minstens één missende waarde hebben.

Leeg dataframe na dropna() op kolommen
Zoals veel andere benaderingen heeft dropna() ook voor- en nadelen.
Voordelen
- Eenvoudig en makkelijk te gebruiken.
- Handig wanneer missende waarden geen belang hebben.
Nadelen
- Deze aanpak kan tot informatieverlies leiden, wat bias kan introduceren in de uiteindelijke dataset.
- Niet geschikt wanneer data niet volledig willekeurig ontbreekt.
- Een dataset met een groot aandeel missende waarden kan aanzienlijk krimpen, wat de resultaten van alle statistische analyses op die dataset kan beïnvloeden.
Gemiddelde/Mediaan-imputatie
Deze vervangingsstrategieën spreken voor zich. Met gemiddelde- en mediaan-imputatie vervang je respectievelijk de missende waarden in een kolom door het gemiddelde en de mediaan van de niet-missende waarden in die kolom.
Een normale verdeling is het ideale scenario. Helaas is dat niet altijd zo. Dan kan mediaan-imputatie nuttig zijn, omdat die niet gevoelig is voor uitschieters.
In Python kun je hiervoor de fillna()-functie uit pandas gebruiken.
- Illustratie van gemiddelde-imputatie.
mean_value = sample_customer_data.mean()
mean_imputation = sample_customer_data.fillna(mean_value)

Resultaat van de gemiddelde-imputatie
- Illustratie van mediaan-imputatie
median_value = sample_customer_data.median()
median_imputation = sample_customer_data.fillna(median_value)
median_imputation.head()

Resultaat van de mediaan-imputatie
Voordelen
- Simpel en eenvoudig te implementeren.
- De imputatie gebeurt met bestaande informatie uit de niet-missende data; er is dus geen extra data nodig.
- Gemiddelde- en mediaan-imputatie kunnen een goede schatting geven van missende waarden: respectievelijk bij normaal verdeelde data en bij scheef verdeelde data.
Nadelen
- We kunnen deze twee strategieën niet toepassen op categorische kolommen. Ze werken alleen voor numerieke.
- Gemiddelde-imputatie is gevoelig voor uitschieters en representeert mogelijk niet goed de centrale tendens van de data. Net als het gemiddelde kan ook de mediaan soms de centrale tendens niet goed weergeven.
- Mediaan-imputatie gaat ervan uit dat data volledig willekeurig ontbreekt (MCAR), wat niet altijd waar is.
Random sample-imputatie
Het idee achter random sample-imputatie verschilt van de vorige en omvat extra stappen.
- Eerst maak je twee subsets van de originele data.
- De eerste subset bevat alle observaties zonder ontbrekende data, en de tweede bevat die met ontbrekende data.
- Vervolgens selecteer je willekeurig een observatie uit elke subset.
- Daarna vervang je de ontbrekende data uit de eerder geselecteerde observatie door bestaande waarden uit de observatie waarin alle data beschikbaar is.
- Tot slot herhaal je dit proces totdat er geen ontbrekende informatie meer is.
def random_sample_imputation(df):
cols_with_missing_values = df.columns[df.isna().any()].tolist()
for var in cols_with_missing_values:
# extract a random sample
random_sample_df = df[var].dropna().sample(df[var].isnull().sum(),
random_state=0)
# re-index the randomly extracted sample
random_sample_df.index = df[
df[var].isnull()].index
# replace the NA
df.loc[df[var].isnull(), var] = random_sample_df
return df
df = sample_customer_data.copy()
random_sample_imp_df = random_sample_imputation(sample_customer_data)
random_sample_imp_df.head()

Random sample-imputatie
Voordelen
- Een makkelijke en duidelijke techniek.
- Werkt voor zowel numerieke als categorische datatypes.
- Minder vertekening van de variantie en behoud van de oorspronkelijke verdeling van de data, in tegenstelling tot bijvoorbeeld gemiddelde- en mediaan-imputatie.
Nadelen
- Willekeurigheid werkt niet in elke situatie en kan ruis in de data brengen, wat tot verkeerde statistische conclusies kan leiden.
- Net als bij gemiddelde en mediaan gaat ook deze aanpak uit van volledig willekeurig ontbrekende data (MCAR).
Multiple imputation
Dit is een multivariate imputatietechniek, wat betekent dat de missende informatie wordt aangevuld met inachtneming van informatie uit andere kolommen.
Als bijvoorbeeld het inkomenscijfer voor een persoon ontbreekt, is het onzeker of diegene een hypotheek heeft. Om de juiste waarde te bepalen, moet je andere kenmerken beoordelen, zoals kredietscore, beroep en of de persoon een huis bezit.
Multiple Imputation by Chained Equations (kortweg MICE) is een van de populairste methoden in multivariate imputatie. Om de MICE-aanpak beter te begrijpen, bekijken we de set variabelen X1, X2, … Xn, waarvan sommige of allemaal missende waarden hebben.
Het algoritme werkt als volgt:
- Vervang voor elke variabele de missende waarden met een eenvoudige imputatiestrategie, zoals gemiddelde-imputatie, als “placeholder”.
- De “placeholders” voor de eerste variabele, X1, worden geregregeerd met een regressiemodel waarbij X1 de afhankelijke variabele is en de rest de onafhankelijke variabelen. Daarna wordt X2 de afhankelijke variabele en de rest de onafhankelijke. Dit gaat zo door totdat elke variabele minstens één keer als afhankelijke variabele is beschouwd.
- Die oorspronkelijke “placeholders” worden vervolgens vervangen door de voorspellingen uit het regressiemodel.
- Het vervangingsproces wordt herhaald voor een aantal cycli, doorgaans tien volgens Raghunathan et al. 2002, en de imputatie wordt bij elke cyclus bijgewerkt.
- Aan het eind van de cyclus zijn de missende waarden idealiter vervangen door voorspelde waarden die de relaties in de data het best weerspiegelen.
De implementatie gebeurt met de bibliotheek miceforest.
Eerst moeten we de bibliotheek installeren met pip.
pip install miceforest
Vervolgens importeren we de module ImputationKernel en maken we de kernel voor imputatie.
from miceforest import ImputationKernel
mice_kernel = ImputationKernel(
data = sample_customer_data,
save_all_iterations = True,
random_state = 2023
)
Daarna draaien we de kernel twee iteraties op de data en maken we de geïmputeerde data aan.
mice_kernel.mice(2)
mice_imputation = mice_kernel.complete_data()
mice_imputation.head()

Multiple imputation
Voordelen
- Multiple imputation is krachtig bij ontbrekende data in meerdere variabelen en meerdere datatypes.
- De aanpak kan veel betere resultaten opleveren dan gemiddelde- en mediaan-imputatie.
- Veel andere algoritmes, zoals K-Nearest Neighbors, Random Forest en neurale netwerken, kunnen als ruggengraat voor de multiple-imputation-voorspellingen worden gebruikt.
Nadelen
- Multiple imputation gaat ervan uit dat data Missing at Random (MAR) is.
- Ondanks de voordelen kan deze aanpak computationeel duur zijn vergeleken met andere technieken, zeker bij grote datasets.
- Deze aanpak vergt meer inspanning dan de voorgaande.
Uit alle imputaties kun je bepalen welke het dichtst bij de verdeling van de originele data ligt.
Het gemiddelde (geel) en de mediaan (rood) liggen ver van de oorspronkelijke verdeling van de kolom “Charge amount”, en zijn daarom niet ideaal voor de imputatie.
mean_imputation["Charge Amount Mean Imp"] = mean_imputation["Charge Amount"]
median_imputation["Charge Amount Median Imp"] = median_imputation["Charge Amount"]
random_sample_imp_df["Charge Amount Random Imp"] = random_sample_imp_df["Charge Amount"]
Met de nieuwe kolommen voor elk type imputatie kunnen we nu de verdeling plotten.
import matplotlib.pyplot as plt
plt.figure(figsize=(12,8))
sample_customer_data["Charge Amount"].plot(kind='kde',color='blue')
mean_imputation["Charge Amount Mean Imp"].plot(kind='kde',color='yellow')
median_imputation["Charge Amount Median Imp"].plot(kind='kde',color='red')

Verdeling van “Charge Amount”: originele data vs. gemiddelde vs. mediaan.
Bij het plotten van multiple imputation en random imputation hieronder overlappen deze verdelingen perfect met de originele data. Dat betekent dat deze imputaties beter zijn dan gemiddelde- en mediaan-imputatie.
random_sample_imp_df["Charge Amount Random Imp"] = random_sample_imp_df["Charge Amount"]
mice_imputation["Charge Amount MICE Imp"] = mice_imputation["Charge Amount"]
mice_imputation["Charge Amount MICE Imp"].plot(kind='kde',color='black')
random_sample_imp_df["Charge Amount Random Imp"].plot(kind='kde',color='purple')
plt.legend()

Verdeling van “Charge Amount”: originele data vs. gemiddelde vs. mediaan vs. MICE vs. random
De cursus Handling Missing Data with Imputations in R is een geweldige bron om meer te leren over strategieën om met missende waarden om te gaan. Je leert hoe je visualisaties en statistische toetsen toepast om patronen van ontbrekende data te herkennen en hoe je ze kunt imputeren met statistische en machinelearning-technieken.
In dezelfde lijn legt de cursus dealing with missing data in python uit hoe je ontbrekende data in Python identificeert, analyseert, verwijdert en imputeert.
Best practices
De juiste imputatiemethode kiezen op basis van het type ontbrekende data
Er zijn meerdere imputatiestrategieën, die je niet blindelings moet toepassen. De juiste aanpak voorkomt dat je bias in de data introduceert en verkeerde beslissingen neemt.
De volgende tabel laat zien welke imputatiemethode je gebruikt op basis van het type ontbrekende data. De lijst met methoden is niet uitputtend, maar dit zijn de meest gebruikte.
|
Type ontbrekende data |
Imputatiemethode |
|
Missing Completely At Random |
Gemiddelde, mediaan, modus of een andere imputatiemethode |
|
Missing At Random |
Multiple imputation, regressie-imputatie |
|
Missing Not At Random |
Pattern substitution, maximum likelihood-schatter |
De impact van imputatie op de algehele analyse beoordelen
Houd er rekening mee dat de originele data niet kan worden teruggehaald, ongeacht de imputatietechniek. Wel kun je technieken gebruiken die geïmputeerde datasets genereren die zo dicht mogelijk bij de werkelijkheid liggen.
Hieronder staan een paar belangrijke stappen voor tijdens de beoordeling.
- Voer meerdere imputatietechnieken uit om de meest robuuste te vinden. Dit kan helpen om bias en variaties tussen technieken te identificeren.
- Vergelijk de uiteindelijk geïmputeerde data met de originele, niet-geïmputeerde data om de betrouwbaarheid van de methode te beoordelen.
- Neem het imputatieproces op in de gehele analysepipeline, van datacleaning tot het bouwen van machinelearningmodellen.
Ontbrekende data en imputatiemethoden communiceren naar stakeholders
Datapraktijkmensen en stakeholders streven allemaal naar data van goede kwaliteit.
Eerlijkheid en transparantie zijn essentieel wanneer je ontbrekende data in de analyse communiceert. Hieronder enkele belangrijke aandachtspunten.
- Wees je bewust van de context van de ontbrekende data: MCAR, MAR of MNAR.
- Leg de gebruikte methoden om met ontbrekende data om te gaan duidelijk uit en documenteer ze, en bespreek de voor- en nadelen van elke aanpak.
- Communiceer de resultaten op een manier die stakeholders begrijpen.
Conclusie
In dit artikel bespraken we wat ontbrekende data is en de impact ervan op datagedreven besluitvorming. Ook liepen we door enkele strategieën om ermee om te gaan, inclusief hun voordelen en nadelen voor beslissingen in de praktijk.
Hopelijk heb je hiermee relevante strategieën in handen om efficiënt met jouw problemen rond missende data om te gaan.
Veelgestelde vragen over missende waarden
Wat is ontbrekende data?
Ontbrekende data betekent dat sommige of alle variabelen in de data een missende waarde hebben.
Wat zijn de verschillende typen ontbrekende data?
Er zijn drie hoofdtypen ontbrekende data: Missing Completely at Random (MCAR), Missing At Random (MAR) en Missing Not At Random (MNAR)
Hoe ga je om met ontbrekende data?
Deze benaderingen kun je toepassen om met missende waarden om te gaan: gemiddelde-, mediaan- en modus-imputatie, random sample-imputatie en multiple imputations. De lijst is niet uitputtend en elke methode heeft voor- en nadelen.
Waarom zijn ontbrekende data belangrijk?
Ze zijn belangrijk om rekening mee te houden omdat ze de prestaties van je machinelearningmodellen kunnen beïnvloeden en de conclusies uit alle statistische analyses op de data kunnen vertekenen, waardoor het bedrijf verkeerde beslissingen kan nemen.
