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_normmaxcalcula (\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()

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()

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_boxcoxa las predicciones. - Combina Box-Cox con
StandardScalercuando 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.