Sari la conținutul principal

Transformarea Box-Cox: stabilizează varianța fără presupuneri

Află cum funcționează transformarea Box-Cox, cum alegi parametrul lambda și când să o folosești pentru a stabiliza varianța, a reduce asimetria și a îmbunătăți modelele statistice.
Actualizat 15 oct. 2026  · 9 min. citește

Descoperă cu AI

ChatGPTClaudePerplexity

Construiești un model de regresie liniară pe prețuri de locuințe. Graficul reziduurilor arată ca un megafon (îngust în stânga, se lărgește în dreapta). Tehnic, modelul rulează. Doar că rezultatele nu sunt de încredere. Acest tipar este eteroscedasticitate și e una dintre abaterile care îți invalidează discret inferențele fără să arunce o eroare evidentă.

O opțiune este să transformi variabila răspuns. Și în loc să ghicești dacă să încerci logaritm, rădăcină pătrată sau reciprocă, poți lăsa datele să sugereze varianta potrivită. Asta e ideea din spatele transformării Box-Cox și despre asta vorbim aici: formula, cum alegi lambda și cum o implementezi în Python și R.

Ce este transformarea Box-Cox?

Transformarea Box-Cox este o familie de transformări de tip putere pentru date strict pozitive. În loc să alegi tu o transformare anume, îți oferă o modalitate de a căuta într-o gamă întreagă, fiecare indexată de un parametru numit lambda (λ).

Când lambda este 0, obții o transformare logaritmică. Când este 0,5, obții ceva apropiat de rădăcina pătrată. Când este -1, ești aproape de o transformare reciprocă. Toate acestea sunt cazuri speciale ale aceleiași formule, ceea ce înseamnă că nu trebuie să alegi între ele dinainte. Estimezi din date care se potrivește cel mai bine.

Un lucru important de clarificat de la început: Box-Cox nu doar „face datele normale”. În funcție de problema ta de modelare, poate ajuta la stabilizarea varianței, îmbunătățirea liniaritāții între predictori și răspuns sau satisfacerea mai bună a presupunerilor modelului. De asemenea, necesită valori de intrare strict pozitive. Zerourile și negativele nu sunt permise. Mai multe în secțiunea de limitări.

Cum funcționează transformarea Box-Cox

Înainte de formulă, merită să construim un pic de intuiție. Să zicem că ai o variabilă precum veniturile săptămânale din vânzări și este asimetrică spre dreapta: o coadă lungă spre dreapta, varianță care crește odată cu media. Întrebarea este ce putere a acelei variabile se comportă mai degrabă ca un răspuns bine „cuminte”.

Valorile diferite ale lui lambda corespund transformărilor pe care le știi deja:

  • lambda = 1: deplasare liniară a lui x (păstrează forma distribuției)
  • lambda = 0: transformare logaritmică
  • lambda = 0,5: înrudită cu o transformare prin rădăcină pătrată
  • lambda = -1: înrudită cu o transformare reciprocă

Formularea standard Box-Cox include convenții de scalare și translație, așa că acestea sunt cel mai bine înțelese ca echivalente familiare, nu formule literal identice. Cazul log (lambda = 0) este tratat ca o limită. Acolo formula devine log(x) dintr-un motiv de continuitate, nu ca o excepție arbitrară.

Formula transformării Box-Cox

Formula standard, pe bucăți, este:

Aici, x este valoarea pozitivă transformată, iar lambda este parametrul transformării. Forma (xλ - 1) / λ poate părea neobișnuită la început. Aceasta este convenția de scalare care menține transformarea continuă pe măsură ce lambda se apropie de zero. Fără ea, ai avea o discontinuitate în salt la lambda = 0, iar cazul log ar fi complet deconectat de restul familiei. Cu ea, formula trece lin în ln(x) pe măsură ce lambda → 0.

Nu te îngrijora acum de deducție. Operațional: alegi sau estimezi lambda, introduci valorile pozitive și lucrezi cu ieșirea transformată.

Cum alegi lambda pentru o transformare Box-Cox

Lambda nu e ceva ce setezi „din ochi”. Îl estimezi din date. Asta deosebește Box-Cox de abordarea „hai să încercăm un log”. Există o procedură statistică solidă în spate.

Estimarea prin verosimilitate maximă

Ideea este să găsești lambda care face ca datele tale să se potrivească cel mai bine modelului presupus. În context de regresie, asta înseamnă să găsești lambda pentru care răspunsul transformat respectă cel mai bine presupunerile modelului, de obicei normalitatea și varianța constantă a reziduurilor. Nu alegi lambda care face ca distribuția marginală a răspunsului să pară cel mai normală în izolare. O alegi pe cea care funcționează cel mai bine în contextul modelului. Această distincție contează și revenim la ea în secțiunea de greșeli.

Profilul de verosimilitate Box-Cox

Unul dintre cele mai utile diagnostice aici este graficul profilului de verosimilitate: valorile lambda pe axa x, log-verosimilitatea pe axa y. Vârful îți indică lambda optim estimat. La fel de util este intervalul de încredere în jurul acelui vârf, de obicei afișat ca o linie orizontală la un prag sub maxim. Orice lambda din acel interval este nedistinct statistic de optim.

Alegerea unui lambda ușor de interpretat

Iată un aspect practic pe care lumea îl subestimează. Dacă lambda optim este ceva precum 0,43, iar lambda = 0,5 cade în intervalul de încredere, mergi pe 0,5. O transformare prin rădăcină pătrată e mai ușor de explicat, mai ușor de inversat și pierde aproape nimic la performanță. Aceeași logică se aplică pentru 0 (log) și 1 (fără transformare). Interpretabilitatea contează, mai ales când explici modelul cuiva care nu știe ce înseamnă lambda = 0,43.

Cum folosești transformarea Box-Cox în Python și R

Acum că știm ce este lambda și cum se selectează, să punem în practică. Întâi Python, apoi R.

Transformarea Box-Cox în Python

Modulul stats din SciPy se ocupă direct de asta. Funcția boxcox() estimează lambda și returnează valorile transformate într-un singur apel. Iată un exemplu minimal folosind date simulate asimetrice spre dreapta:

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}")

Aici, estimated_lambda este valoarea care maximizează log-verosimilitatea sub presupunerea de normalitate. Apoi ai folosi aceeași valoare când transformi date noi pentru predicție.

Reține că aici se estimează lambda din distribuția marginală a răspunsului, nu într-un model de regresie. Pentru un flux de modelare, ai evalua lambda în contextul modelului. Exemplul R de mai jos arată cum, folosind funcția boxcox() din MASS.

Transformarea Box-Cox în R

În R, funcția boxcox() din pachetul MASS este construită pentru fluxuri de lucru în regresie. Primește un obiect de model ajustat și trasează direct profilul verosimilității, ceea ce este mai natural, deoarece evaluezi lambda în contextul unui model, nu pe un vector izolat.

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)

Funcția boxcox() din R desenează automat profilul verosimilității, așa că primești gratuit vizualizarea intervalului de încredere. Asta face ușoară decizia de a rotunji lambda la o valoare mai simplă.

Cum interpretezi și inversezi o transformare Box-Cox

După ce ai transformat răspunsul și ai ajustat un model, predicțiile sunt pe scala transformată, nu pe cea originală. O predicție de 3,2 înseamnă 3,2 unități de (xλ - 1) / λ, nu 3,2 unități de venit.

Interpretează cu atenție coeficienții

Interpretarea coeficienților se schimbă după transformare. Pe scala transformată, o creștere de o unitate a unui predictor corespunde unei anumite schimbări în y(λ), nu în y original. Dacă lambda este aproape de 0 (aproape log), poți aproxima schimbări procentuale pe scala originală. Pentru alte valori ale lui lambda, relația e mai complicată și depinde de nivelul curent al lui x.

Transformarea inversă

Pentru a converti predicțiile înapoi pe scala originală, aplică inversa:

Pentru lambda = 0, inversa lui ln(x) este pur și simplu exp(y).

Un cuvânt despre biasul la retransfomare

Re-transformarea mediei prezise pe scala transformată nu îți oferă o estimare neînclinată a mediei pe scala originală. Aceasta este o consecință cunoscută a inegalității lui Jensen și contează cel mai mult în contexte precum prognozarea valorilor medii în modele log-liniare. A intra în detalii despre corecția biasului depășește scopul nostru aici. Cursul nostru Introducere în regresie în Python acoperă mai pe larg predicția și interpretarea în modelele de regresie, dacă vrei acest context.

Box-Cox vs alte transformări

Când chiar ar trebui să alegi Box-Cox în locul alternativelor pe care le folosești deja?

Box-Cox vs transformarea logaritmică

Transformarea logaritmică este cazul lambda = 0 al lui Box-Cox. Punct. Dacă ai folosit transformarea log, ai folosit un caz specific de Box-Cox cu lambda fix, nu estimat. Avantajul Box-Cox este că nu se angajează din start la lambda = 0. Totuși, dacă vârful profilului de verosimilitate e clar la lambda = 0, folosește log. Nu are rost să adaugi complexitate.

Box-Cox vs transformarea Yeo-Johnson

Transformarea Yeo-Johnson este o extensie directă a lui Box-Cox, concepută pentru a gestiona zerouri și valori negative. E varianta la care apelezi când datele includ zerouri (de exemplu, numărători) sau valori negative. Transformările sunt matematic similare. Yeo-Johnson doar relaxează constrângerea de pozitivitate. În scikit-learn, PowerTransformer suportă ambele, method='box-cox' și method='yeo-johnson', ceea ce face ușor de încercat comutarea.

Box-Cox vs standardizare

Standardizarea (z-scoring) deplasează și scalează datele: schimbă media la 0 și deviația standard la 1. Box-Cox schimbă forma distribuției printr-o transformare neliniară. Rezolvă probleme diferite. Standardizarea nu reduce asimetria și nu stabilizează varianța. Box-Cox nu îți centrează datele și nu face caracteristicile comparabile ca magnitudine. Le poți face pe ambele în secvență, întâi transformare, apoi standardizare, dar nu sunt alternative.

Limitări și greșeli frecvente

Unele dintre acestea sunt evidente în retrospectivă. Asta nu le împiedică să se întâmple, iar câteva sunt suficient de subtile încât „evident” muncește din greu.

Aplicarea Box-Cox pe valori zero sau negative

Formula se prăbușește la sau sub zero. 0λ este 0 pentru lambda pozitiv și nedefinit pentru lambda negativ; log(0) este minus infinit. Dacă datele tale au zerouri sau negative, Box-Cox fie va da eroare, fie va produce pe furiș non-sens. Folosește Yeo-Johnson în schimb, sau adaugă o mică constantă pozitivă pentru a deplasa datele. Aceasta din urmă e o aproximație pe care merită să o privești cu scepticism.

Transformarea datelor doar ca să forțezi normalitatea

Box-Cox ar trebui aplicată ca răspuns la o problemă specifică de modelare: varianță ne-constantă, linearitate slabă, presupuneri ale reziduurilor încălcate. Să o folosești ca pas de preprocesare automat pentru a face distribuția marginală să „pară normală” înainte de orice model este invers. Lambda care normalizează răspunsul în izolare s-ar putea să nu fie lambda care chiar îți îmbunătățește reziduurile modelului.

Ignorarea diagnosticelor modelului

Estimarea lui lambda este doar jumătate din treabă. După transformare și re-ajustare, verifică din nou graficele reziduurilor. Box-Cox nu garantează că presupunerile sunt îndeplinite. Îți oferă o șansă mai bună. Dacă reziduurile tot se evazează sau apare curbură, altceva se întâmplă.

A uita că interpretarea se schimbă

După transformare, coeficienții nu mai descriu relații pe scala originală. Asta îi încurcă pe mulți când raportează rezultate sau fac predicții. Ține evidența scării pe care lucrezi la fiecare pas.

Evaluarea lui lambda în afara contextului de modelare

Lambda estimat dintr-o distribuție univariată (doar uitându-te la histograma variabilei răspuns) poate diferi de lambda estimat într-un model de regresie. Abordarea bazată pe regresie este cea corectă. Ținta este să satisfaci presupunerile reziduurilor, nu pe cele ale distribuției marginale.

A uita să aplici transformarea la predicții

Când pui în producție un model antrenat pe date transformate, trebuie să transformi noile intrări la fel, folosind același lambda, și apoi să re-transformi predicțiile. Dacă sari oricare dintre pași, obții predicții pe scara greșită. Sună evident și totuși e uitat frecvent.

Concluzie

Box-Cox este o familie de transformări, nu una singură. Lambda determină ce membru al familiei obții, iar transformarea log este doar cazul special lambda = 0. Majoritatea analiștilor folosesc log din reflex, fără să se gândească. Box-Cox face alegerea explicită și îți oferă o metodă principială de a întreba dacă o altă valoare a lui lambda ar servi mai bine modelului.

Folosește-o când diagnostichezi ceva specific: eteroscedasticitate în reziduuri, neliniaritate, presupuneri clar neîndeplinite. Aplicarea ei automat pe fiecare variabilă răspuns e un obicei de abandonat. Iar dacă datele tale au zerouri sau negative, nu e teritoriu Box-Cox. E Yeo-Johnson.

Pentru o bază mai solidă în metodele de regresie pe care Box-Cox le sprijină de obicei, cursul nostru Intermediate Regression in R și Introduction to Regression with statsmodels in Python sunt următori pași buni.


Vinod Chugani's photo
Author
Vinod Chugani
LinkedIn

Vinod Chugani și-a început cariera la Tokyo ca cel mai tânăr șef al desk-ului de vânzări pentru fonduri speculative al JPMorgan, iar ulterior a stabilit un record individual de vânzări la Lehman Brothers, apoi a construit o afacere de distribuție de electronice în 30 de țări care a depășit SG$100 de milioane în venituri, înainte de a se orienta către date. Absolvent de Economie la Duke și alumn al NYC Data Science Academy, a fost unul dintre cei trei beneficiari ai bursei din peste 100 de candidați pentru cursul lui Hugo Bowne-Anderson, Building AI Applications, pe Maven. Astăzi, scrie pentru DataCamp, KDnuggets, Machine Learning Mastery și Statology despre subiecte de la statistică la IA agențială și îndrumă profesioniști în domeniul datelor la NYC Data Science Academy, cu peste 1.000 de sesiuni unu-la-unu la activ.

 

Întrebări frecvente

Transformarea Box-Cox necesită date de intrare distribuite normal?

Nu. Box-Cox nu face presupuneri despre distribuția de intrare, ci doar că valorile sunt strict pozitive. Scopul este să producă date transformate care satisfac mai bine presupunerile modelului tău din aval, precum varianța constantă și normalitatea aproximativă a reziduurilor. Normalitatea la intrare nu este necesară.

Pot aplica Box-Cox pe variabilele predictori sau doar pe răspuns?

Tehnic da, dar în practică este cel mai des folosită pe variabila răspuns în regresie, unde scopul este să satisfaci presupunerile reziduurilor. Transformarea predictorilor este o problemă separată, de obicei abordată cu tehnici diferite. Aplicarea Box-Cox pe fiecare coloană dintr-un set de date nu este ceea ce a fost proiectată să facă.

Ce ar trebui să fac dacă datele mele includ zerouri?

Box-Cox nu poate gestiona zerouri sau valori negative, deoarece formula este nedefinită acolo. Ai două opțiuni. Prima, folosește transformarea Yeo-Johnson, care extinde același cadru la valori nepozitive. A doua, adaugă o mică constantă pozitivă pentru a deplasa datele înainte de transformare, deși aceasta este o aproximație și poate afecta estimarea lui lambda.

Cum aplic Box-Cox în mod consecvent pe date noi după antrenarea unui model?

Salvează lambda estimat în timpul antrenării. Când sosesc date noi, aplică aceeași formulă folosind acel lambda fix. Nu re-estima lambda pe observații noi. În PowerTransformer din scikit-learn, apelarea fit() stochează lambda, iar transform() îl aplică în mod consecvent. Acesta este cel mai sigur mod într-un pipeline.

De ce folosește formula Box-Cox (x^λ - 1) / λ în loc de simplul x^λ?

Această convenție de scalare menține transformarea continuă pe măsură ce lambda se apropie de zero. Fără forma (x^λ - 1) / λ, formula ar sări discontinuu la lambda = 0, în loc să convergă lin spre transformarea log. Este o comoditate matematică ce permite ca toate cazurile speciale, inclusiv log, rădăcina pătrată și reciproca, să aparțină aceleiași familii conectate.

Lambda estimat pe datele de antrenare va rezolva garantat presupunerile modelului meu?

Nu. Estimarea lui lambda crește șansele ca presupunerile modelului să fie mai bine satisfăcute, dar nu este o garanție. După transformare și re-ajustare, trebuie totuși să examinezi graficele reziduurilor. Dacă problemele persistă, este posibil ca Box-Cox pur și simplu să nu fie instrumentul potrivit pentru acel set de date sau model.

Care este diferența între Box-Cox în SciPy și `PowerTransformer` din scikit-learn?

boxcox() din SciPy este o funcție statistică simplă. Estimează lambda și returnează vectorul transformat, ceea ce funcționează bine pentru analize izolate. PowerTransformer din scikit-learn, cu method='box-cox', învelește aceeași logică într-un obiect transformer care se integrează în pipeline-uri, gestionează separat fit() și transform() și suportă și Yeo-Johnson. Pentru fluxuri de lucru de machine learning, PowerTransformer este de obicei alegerea mai convenabilă.

Ar trebui să aleg o valoare rotunjită a lui lambda chiar dacă estimarea optimă este puțin diferită?

Adesea, da. Dacă lambda optim este 0,48 dar lambda = 0,5 se află în intervalul de încredere din graficul profilului de verosimilitate, transformarea prin rădăcină pătrată este apărată statistic și mult mai ușor de explicat și inversat. Diferența de performanță este neglijabilă, în timp ce câștigul de interpretabilitate este real. Aceeași logică se aplică atunci când lambda = 0 (log) sau lambda = 1 (deplasare care păstrează forma) se află în interval.

Subiecte
Data Science

Învață cu DataCamp

{count, plural, one {Curs} few {Cursuri} other {Cursuri}}

Introducere în vizualizarea datelor cu Seaborn

{hours} ore
184.9K
Învață să creezi vizualizări informative și atractive în Python folosind biblioteca Seaborn.
Vezi detaliiRight Arrow
Începe Cursul
Afișează mai multRight Arrow