Transformación Box-Cox

Prep

Transformación Box-Cox

La transformación Box-Cox reduce la asimetría y estabiliza la varianza siempre que todas las observaciones sean estrictamente positivas. Si aparecen ceros o valores negativos, desplaza los datos o utiliza la transformación de Yeo-Johnson.

Definición #

Para (x > 0) y parámetro (\lambda):

$$ T_\lambda(x) = \begin{cases} \dfrac{x^\lambda - 1}{\lambda}, & \lambda \ne 0,\\ \log x, & \lambda = 0. \end{cases} $$

  • (\lambda = 1) deja los valores iguales; (\lambda = 0) equivale al logaritmo natural.
  • La inversa está disponible como scipy.special.inv_boxcox.
  • scipy.stats.boxcox_normmax calcula (\lambda) por máxima verosimilitud.

Ejemplo práctico #

import numpy as np
import matplotlib.pyplot as plt

x = np.random.default_rng(42).lognormal(mean=1.5, sigma=0.6, size=1_000)
plt.figure(figsize=(6, 4))
plt.hist(x, bins=30, color="steelblue")
plt.title("Distribución original (positiva pero asimétrica)")
plt.show()

Ejemplo práctico (figura)

from scipy.stats import boxcox, boxcox_normmax

lmbda = boxcox_normmax(x)\n
x_trans = boxcox(x, lmbda=lmbda)
plt.figure(figsize=(6, 4))
plt.hist(x_trans, bins=30, color="seagreen")
plt.title("Después de la transformación Box-Cox")
plt.show()

Ejemplo práctico (figura)

Recomendaciones #

  • Calcula (\lambda) sólo con los datos de entrenamiento y reutilízalo en validación y prueba para evitar fugas de información.
  • Si necesitas volver a la escala original, aplica inv_boxcox a las predicciones.
  • Combina Box-Cox con StandardScaler cuando el modelo requiera media cero y varianza unitaria.
  • Si la característica puede ser negativa, desplázala antes de aplicar Box-Cox o utiliza la transformación Yeo-Johnson.