Ga naar hoofdinhoud

Box-Cox-transformatie: stabiliseer variantie zonder te gokken

Leer hoe de Box-Cox-transformatie werkt, hoe je de lambda-parameter kiest en wanneer je die gebruikt om variantie te stabiliseren, scheefheid te verminderen en statistische modellen te verbeteren.
Bijgewerkt 15 okt 2026  · 9 min lezen

Verken met AI

ChatGPTClaudePerplexity

Je bouwt een lineair regressiemodel voor huizenprijzen. De residuplot ziet eruit als een megafoon (smal links, wijd uitlopend rechts). Het model draait technisch gezien wel. De resultaten zijn alleen niet betrouwbaar. Dat patroon is heteroscedasticiteit, en het is een van die schendingen die je conclusies stilletjes onderuit halen zonder een duidelijke foutmelding te geven.

Eén optie is het transformeren van de responsvariabele. En in plaats van te gokken of je een log, een wortel of een reciproke moet proberen, kun je de data laten suggereren welke het beste is. Dat is het idee achter de Box-Cox-transformatie, en dat is wat we hier behandelen: de formule, hoe je lambda kiest en hoe je het in Python en R implementeert.

Wat is de Box-Cox-transformatie?

De Box-Cox-transformatie is een familie van machts­transformaties voor strikt positieve data. In plaats van zelf een specifieke transformatie te kiezen, kun je zoeken over een heel bereik, elk geïndexeerd door een parameter genaamd lambda (λ).

Als lambda 0 is, krijg je een logtransformatie. Bij 0,5 krijg je iets dat lijkt op een worteltransformatie. Bij -1 zit je dicht bij een reciproke. Dit zijn allemaal speciale gevallen van dezelfde formule, wat betekent dat je niet van tevoren tussen ze hoeft te kiezen. Je schat uit de data welke het beste past.

Eén ding om meteen duidelijk over te zijn: Box-Cox maakt data niet simpelweg “normaal”. Afhankelijk van je modelprobleem kan het de variantie stabiliseren, de lineariteit tussen voorspellers en de respons verbeteren, of beter voldoen aan de aannames van je model. Het vereist ook strikt positieve inputwaarden. Nullen en negatieve waarden vallen af. Meer daarover in de sectie met beperkingen.

Hoe de Box-Cox-transformatie werkt

Voor we naar de formule gaan, is wat intuïtie handig. Stel, je hebt een variabele zoals wekelijkse omzet en die is rechts-scheef: een lange staart naar rechts, variantie die toeneemt met het gemiddelde. De vraag is welke macht van die variabele zich meer gedraagt als een goed-gedragen respons.

Verschillende waardes van lambda komen overeen met transformaties die je al kent:

  • lambda = 1: lineaire verschuiving van x (behoudt de vorm van de verdeling)
  • lambda = 0: logaritmische transformatie
  • lambda = 0,5: verwant aan een worteltransformatie
  • lambda = -1: verwant aan een reciproke transformatie

De standaard Box-Cox-formulering bevat conventies voor schalen en transleren, dus beschouw dit als bekende equivalenten in plaats van letterlijk identieke formules. De log-variant (lambda = 0) wordt als een limiet behandeld. De formule schakelt daar over naar log(x) vanwege continuïteit, niet als willekeurige uitzondering.

Formule voor de Box-Cox-transformatie

De standaard stukgewijze formule is:

Hier is x de positieve waarde die getransformeerd wordt en is lambda de transformatieparameter. De vorm (xλ - 1) / λ oogt misschien eerst wat vreemd. Dat is de schaalconventie die de transformatie continu houdt als lambda naar nul nadert. Zonder die zou je een sprong-discontinuïteit hebben bij lambda = 0 en zou de log-variant volledig losstaan van de rest van de familie. Mét die conventie gaat de formule vloeiend over in ln(x) als lambda → 0.

Maak je nu niet druk om de afleiding. Praktisch: kies of schat lambda, vul je positieve waarden in en werk met de getransformeerde output.

Hoe kies je lambda voor een Box-Cox-transformatie

Lambda stel je niet handmatig in op gevoel. Je schat hem uit de data. Dit onderscheidt Box-Cox van zomaar “probeer een log”. Er zit een principiële statistische procedure onder.

Maximum likelihood-schatting

Het idee is om de lambda te vinden waarmee je data het best past bij het veronderstelde model. In een regressiecontext betekent dat de lambda vinden waarbij de getransformeerde respons het dichtst bij de modelaannames komt, meestal normaliteit en constante variantie van de residuen. Je kiest niet de lambda die de marginale verdeling van de respons in isolatie het meest normaal laat lijken. Je kiest degene die binnen de modelcontext het beste werkt. Dat onderscheid is belangrijk, en we komen erop terug bij de veelgemaakte fouten.

Box-Cox profiel-likelihood

Een van de nuttigste diagnostieken is de profiel-likelihood-plot: lambdawaarden op de x-as, de log-likelihood op de y-as. De top geeft de geschatte optimale lambda aan. Net zo nuttig is het betrouwbaarheidsinterval rond die top, meestal weergegeven als een horizontale lijn op een drempel onder het maximum. Elke lambda binnen dat interval is statistisch niet te onderscheiden van het optimum.

Een interpreteerbare lambda kiezen

Hier is een praktische overweging die vaak wordt onderschat. Als de optimale lambda zoiets is als 0,43, en lambda = 0,5 valt binnen het betrouwbaarheidsinterval, kies dan 0,5. Een worteltransformatie is makkelijker uit te leggen, makkelijker terug te transformeren en levert vrijwel geen prestatieverlies op. Hetzelfde geldt voor 0 (log) en 1 (geen transformatie). Interpreteerbaarheid telt, zeker als je je model uitlegt aan iemand die niet weet wat lambda = 0,43 betekent.

Hoe gebruik je de Box-Cox-transformatie in Python en R

Nu we weten wat lambda is en hoe die wordt geselecteerd, gaan we het in de praktijk brengen. Eerst Python, dan R.

Box-Cox-transformatie in Python

Het stats-module van SciPy verwerkt dit direct. De boxcox()-functie schat zowel lambda als dat ze de getransformeerde waarden in één call teruggeeft. Hier is een minimaal voorbeeld met gesimuleerde rechts-scheve data:

import numpy as np
from scipy import stats

# Simulate right-skewed data (e.g., weekly sales revenue in thousands)
rng = np.random.default_rng(42)
revenue = rng.exponential(scale=50, size=300)

# Confirm all values are positive before transforming
assert (revenue > 0).all(), "Box-Cox requires strictly positive values"

# Estimate lambda and transform
transformed, estimated_lambda = stats.boxcox(revenue)

print(f"Estimated lambda: {estimated_lambda:.4f}")
print(f"Original mean: {revenue.mean():.2f}, std: {revenue.std():.2f}")
print(f"Transformed mean: {transformed.mean():.2f}, std: {transformed.std():.2f}")

De estimated_lambda hier maximaliseert de log-likelihood onder de normaliteitsaannname. Je zou dezezelfde waarde vervolgens gebruiken bij het transformeren van nieuwe data voor voorspellingen.

Let op dat dit lambda schat uit de marginale verdeling van de respons, niet binnen een regressiemodel. Voor een modelworkflow evalueer je lambda in de modelcontext. Het R-voorbeeld hieronder laat zien hoe, met MASS’ boxcox()-functie.

Box-Cox-transformatie in R

In R is de functie boxcox() uit het MASS-pakket gemaakt voor regressieworkflows. Hij neemt een gefit modelobject en plot direct de profiel-likelihood, wat natuurlijker past omdat je lambda evalueert in de context van een model in plaats van op een losse vector.

library(MASS)

# Simulate right-skewed response (e.g., weekly revenue)
set.seed(42)
revenue <- rexp(300, rate = 1/50)
predictor <- rnorm(300)

# Fit initial model
initial_model <- lm(revenue ~ predictor)

# Estimate lambda via profile likelihood
bc_result <- boxcox(initial_model, lambda = seq(-2, 2, by = 0.1))

# Extract the lambda with highest log-likelihood
best_lambda <- bc_result$x[which.max(bc_result$y)]
cat("Best lambda:", round(best_lambda, 3), "\n")

# Refit with transformed response
revenue_transformed <- (revenue^best_lambda - 1) / best_lambda
final_model <- lm(revenue_transformed ~ predictor)

R’s boxcox() plot de profiel-likelihood automatisch, dus je krijgt de visualisatie van het betrouwbaarheidsinterval erbij. Dat maakt het makkelijk om te beslissen of je lambda kunt afronden naar een eenvoudigere waarde.

Hoe je een Box-Cox-transformatie interpreteert en omkeert

Zodra je de respons hebt getransformeerd en een model hebt gefit, staan je voorspellingen op de getransformeerde schaal, niet op de oorspronkelijke. Een voorspelling van 3,2 betekent 3,2 eenheden van (xλ - 1) / λ, niet 3,2 eenheden omzet.

Coefficients zorgvuldig interpreteren

De interpretatie van coëfficiënten verandert na transformatie. Op de getransformeerde schaal komt een toename van één eenheid in een voorspeller overeen met een bepaalde verandering in y(λ), niet in de oorspronkelijke y. Als lambda dicht bij 0 ligt (bijna-log), kun je procentuele veranderingen op de oorspronkelijke schaal benaderen. Voor andere waardes van lambda is de relatie complexer en hangt die af van het huidige niveau van x.

Inverse transformatie

Om voorspellingen terug te zetten naar de oorspronkelijke schaal, pas je de inverse toe:

Voor lambda = 0 is de inverse van ln(x) simpelweg exp(y).

Een woord over retransformatiebias

Het terugtransformeren van het voorspelde gemiddelde op de getransformeerde schaal geeft je geen onbevooroordeelde schatting van het gemiddelde op de oorspronkelijke schaal. Dit is een bekend gevolg van de ongelijkheid van Jensen en telt vooral in situaties als het voorspellen van gemiddelden in log-lineaire modellen. Diep ingaan op biascorrectie valt buiten onze scope. Onze Introduction to Regression in Python-cursus behandelt voorspellen en interpreteren in regressiemodellen breder als je die context wilt.

Box-Cox versus andere transformaties

Wanneer kies je nu echt voor Box-Cox in plaats van alternatieven die je misschien al gebruikt?

Box-Cox versus logtransformatie

De logtransformatie is het geval lambda = 0 van Box-Cox. Punt. Als je eerder een logtransformatie hebt gebruikt, heb je een specifieke Box-Cox-variant gebruikt met lambda gefixeerd in plaats van geschat. Het voordeel van Box-Cox is dat het niet vooraf vastlegt dat lambda = 0 is. Maar als je profiel-likelihood duidelijk piekt bij lambda = 0, gebruik dan gewoon een log. Geen reden om complexiteit toe te voegen.

Box-Cox versus Yeo-Johnson-transformatie

De Yeo-Johnson-transformatie is een directe uitbreiding van Box-Cox die nul- en negatieve waarden aankan. Die gebruik je wanneer je data nullen (bijv. tellingen) of negatieve waarden bevat. De transformaties zijn wiskundig vergelijkbaar. Yeo-Johnson laat alleen de positiviteitsrestrictie los. In scikit-learn ondersteunt PowerTransformer beide, method='box-cox' en method='yeo-johnson', waardoor wisselen makkelijk is.

Box-Cox versus standaardiseren

Standaardiseren (z-scoren) verschuift en schaalt data: het zet het gemiddelde op 0 en de standaarddeviatie op 1. Box-Cox verandert de vorm van de verdeling via een niet-lineaire transformatie. Ze lossen verschillende problemen op. Standaardiseren vermindert geen scheefheid en stabiliseert geen variantie. Box-Cox centreert je data niet en maakt kenmerken niet vergelijkbaar in grootte. Je kunt beide na elkaar doen, eerst transformeren en dan standaardiseren, maar het zijn geen alternatieven.

Beperkingen en veelgemaakte fouten

Sommige hiervan zijn achteraf gezien voor de hand liggend. Toch gebeuren ze, en een paar zijn subtiel genoeg dat “voor de hand liggend” veel werk verricht.

Box-Cox toepassen op nul of negatieve waarden

De formule gaat stuk bij nul of lager. 0λ is 0 voor positieve lambda en ongedefinieerd voor negatieve lambda; log(0) is min oneindig. Als je data nullen of negatieve waarden bevat, zal Box-Cox ofwel een fout geven of stilletjes onzin produceren. Gebruik in plaats daarvan Yeo-Johnson, of voeg een kleine constante verschuiving toe. Dat laatste is een benadering die je met scepsis moet behandelen.

Data transformeren alleen om normaliteit af te dwingen

Box-Cox pas je toe als reactie op een specifiek modelprobleem: niet-constante variantie, slechte lineariteit, geschonden residuaannames. Het als automatische preprocessingstap gebruiken om je marginale verdeling “normaal te laten lijken” vóórdat je een model fit, is de omgekeerde volgorde. De lambda die je respons in isolatie normaliseert, is mogelijk niet de lambda die je modelresiduen daadwerkelijk verbetert.

Modeldiagnostiek negeren

Lambda schatten is maar de helft van het werk. Controleer na transformeren en opnieuw fitten je residuplots opnieuw. Box-Cox garandeert niet dat aan de aannames wordt voldaan. Het geeft je een betere kans. Als de residuen nog steeds uitwaaieren, of er is kromming, speelt er iets anders.

Vergeten dat de interpretatie verandert

Na een transformatie beschrijven coëfficiënten geen relaties meer op de oorspronkelijke schaal. Dit gaat het vaakst mis bij het rapporteren van resultaten of het maken van voorspellingen. Houd bij elke stap bij op welke schaal je werkt.

Lambda buiten de modelcontext evalueren

Lambda geschat uit een univariate verdeling (alleen naar het histogram van je responsvariabele kijken) kan verschillen van lambda geschat binnen een regressiemodel. De regressiegebaseerde aanpak is de juiste. Het doel is te voldoen aan residuaannames, niet aan marginale verdelingsaannames.

Vergeten de transformatie toe te passen bij voorspellen

Als je een model uitrolt dat is getraind op getransformeerde data, moet je nieuwe inputs op dezelfde manier transformeren met dezelfde lambda en vervolgens de voorspellingen terugtransformeren. Een van beide stappen overslaan geeft voorspellingen op de verkeerde schaal. Het klinkt evident en wordt toch regelmatig vergeten.

Conclusie

Box-Cox is een familie van transformaties, niet één enkele. Lambda bepaalt welk familielid je krijgt, en de logtransformatie is slechts het speciale geval lambda = 0. De meeste analisten gebruiken standaard een log zonder erbij na te denken. Box-Cox maakt die keuze expliciet en geeft je een principiële manier om je af te vragen of een andere waarde van lambda het model niet beter zou dienen.

Gebruik het als je iets specifieks diagnosticeert: heteroscedasticiteit in de residuen, niet-lineariteit, aannames die duidelijk niet worden gehaald. Het automatisch toepassen op elke responsvariabele is een gewoonte die je beter kunt afleren. En als je data nullen of negatieve waarden bevat, dan is dat geen Box-Cox-terrein. Dat is Yeo-Johnson.

Voor een diepere basis in de regressiemethoden die Box-Cox doorgaans ondersteunt, zijn onze Intermediate Regression in R-cursus en Introduction to Regression with statsmodels in Python goede volgende stappen.


Vinod Chugani's photo
Author
Vinod Chugani
LinkedIn

Vinod Chugani begon zijn carrière in Tokio als JPMorgans jongste Head van de Hedge Fund Sales Desk en vestigde later een individueel verkooprecord bij Lehman Brothers, bouwde daarna een elektronicadistributiebedrijf in 30 landen uit tot voorbij SG$100 miljoen omzet en maakte vervolgens de overstap naar data. Als afgestudeerde Economie aan Duke en alumnus van de NYC Data Science Academy was hij een van de drie beursontvangers uit meer dan 100 aanmeldingen voor Hugo Bowne-Andersons Building AI Applications-cursus op Maven. Tegenwoordig schrijft hij voor DataCamp, KDnuggets, Machine Learning Mastery en Statology over onderwerpen van statistiek tot agentische AI, en coacht hij dataprofessionals bij de NYC Data Science Academy met meer dan 1.000 één-op-één-sessies op zijn naam.

 

FAQ's

Vereist de Box-Cox-transformatie normaal verdeelde inputdata?

Nee. Box-Cox doet geen aannames over de inputverdeling, behalve dat waarden strikt positief zijn. Het doel is om getransformeerde data te produceren die beter voldoen aan de aannames van je downstreammodel, zoals constante variantie en benaderende normaliteit van residuen. Normaliteit vooraf is niet vereist.

Kan ik Box-Cox toepassen op voorspellers, of alleen op de respons?

Technisch gezien kan het, maar in de praktijk wordt het het vaakst toegepast op de responsvariabele in regressie, waar het doel is te voldoen aan residuaannames. Voorspellers transformeren is een aparte kwestie, meestal aangepakt met andere technieken. Box-Cox op elke kolom in een dataset toepassen is niet waar het voor bedoeld is.

Wat moet ik doen als mijn data nullen bevat?

Box-Cox kan niet overweg met nullen of negatieve waarden omdat de formule daar ongedefinieerd is. Je hebt twee opties. Gebruik ten eerste de Yeo-Johnson-transformatie, die hetzelfde raamwerk uitbreidt naar niet-positieve waarden. Ten tweede kun je een kleine positieve constante toevoegen om de data te verschuiven vóór de transformatie, al is dit een benadering die de lambda-schatting kan beïnvloeden.

Hoe pas ik Box-Cox consistent toe op nieuwe data na het trainen van een model?

Bewaar de tijdens training geschatte lambda. Wanneer er nieuwe data binnenkomt, pas je dezelfde formule toe met die vaste lambda. Schat lambda niet opnieuw op nieuwe observaties. In scikit-learns PowerTransformer slaat fit() de lambda op en past transform() deze consistent toe. Dat is de veiligste aanpak binnen een pipeline.

Waarom gebruikt de Box-Cox-formule (x^λ - 1) / λ in plaats van gewoon x^λ?

Deze schaalconventie houdt de transformatie continu als lambda naar nul nadert. Zonder de vorm (x^λ - 1) / λ zou de formule sprongsgewijs veranderen bij lambda = 0 in plaats van vloeiend te convergeren naar de logtransformatie. Het is een wiskundig gemak dat alle speciale gevallen, inclusief log, wortel en reciproke, tot dezelfde verbonden familie laat behoren.

Garandeert de op trainingsdata geschatte lambda dat mijn modelaannames worden hersteld?

Nee. Het schatten van lambda vergroot de kans dat je modelaannames beter worden gehaald, maar het is geen garantie. Na transformeren en opnieuw fitten moet je residuplots nog steeds bekijken. Als problemen aanhouden, is Box-Cox mogelijk simpelweg niet het juiste hulpmiddel voor die dataset of dat model.

Wat is het verschil tussen Box-Cox in SciPy en scikit-learns `PowerTransformer`?

SciPy’s boxcox() is een rechttoe-rechtaan statistische functie. Het schat lambda en geeft de getransformeerde array terug, wat goed werkt voor losse analyses. Scikit-learns PowerTransformer met method='box-cox' verpakt dezelfde logica in een transformerobject dat in pipelines past, fit() en transform() afzonderlijk afhandelt, en ook Yeo-Johnson ondersteunt. Voor machinelearning-workflows is PowerTransformer meestal de handigere keuze.

Moet ik een afgeronde lambdawaarde kiezen, ook als de optimale schatting iets anders is?

Vaak wel. Als de optimale lambda 0,48 is maar lambda = 0,5 binnen het betrouwbaarheidsinterval van de profiel-likelihood-plot valt, is de worteltransformatie statistisch verdedigbaar en veel makkelijker uit te leggen en te inverteren. Het prestatieverschil is verwaarloosbaar terwijl de winst in interpreteerbaarheid echt is. Hetzelfde geldt wanneer lambda = 0 (log) of lambda = 1 (vormbehoudende verschuiving) binnen het interval valt.

Onderwerpen
Data Science

Leer met DataCamp

{count, plural, one {Cursus} other {Cursussen}}

Introductie tot datavisualisatie met Seaborn

{hours} uur
184.9K
Leer hoe je informatieve en aantrekkelijke visualisaties maakt in Python met behulp van de Seaborn-bibliotheek.
Bekijk detailsRight Arrow
Start Cursus
Meer bekijkenRight Arrow
Gerelateerd

{count, plural, one {blog} other {blogs}}

AI vanaf nul leren in 2026: een complete gids van de experts

Ontdek alles wat je moet weten om in 2026 AI te leren, van tips om te beginnen tot handige resources en inzichten van industrie-experts.
Adel Nehme's photo

Adel Nehme

15 min

Meer BekijkenMeer Bekijken