PowerTransformer#
- Aplica transformaciones de potencias para llevar la distribución de los datos a una que sea lo más cercana posible a una distribución normal. 
- Implementa una familia de transformaciones monotónicas paramétricas. 
- Es útil para datos heterocedásticos o en situaciones donde la normalidad es deseada. 
Transformación de Yeo-Johnson
x_i^{(\lambda)} = \begin{cases} [(x_i+1)^\lambda - 1] / \lambda & \text{Si } \lambda \ne 0, \; x_i \ge 0, \\ \text{ln}(x_i + 1) & \text{Si } \lambda = 0, \; x_i \ge 0, \\ -[(-x_i+1)^{2 - \lambda} - 1] / (2 - \lambda) & \text{Si } \lambda \ne 2, \; x_i < 0, \\ -\text{ln}(-x_i + 1) & \text{Si } \lambda = 2, \; x_i < 0, \\ \end{cases}
- Admite datos positivos y negativos. 
Transformación de Box-Cox
x_i^{(\lambda)} = \begin{cases} \frac{x_i^\lambda - 1}{\lambda} & \text{Si } \lambda \ne 0, \\ \text{ln}(x_i) & \text{Si } \lambda = 0 \end{cases}
- Requiere datos estrictamente positivos. 
[1]:
import seaborn as sns
penguins = sns.load_dataset("penguins")
data = penguins[["bill_length_mm"]]
data = data.rename(columns={"bill_length_mm": "original"})
[2]:
from sklearn.preprocessing import PowerTransformer
powerTransformer_boxcox = PowerTransformer(
    # -------------------------------------------------------------------------
    # The power transform method. 'box-cox' / 'yeo-johnson'
    method="box-cox",
    # -------------------------------------------------------------------------
    # Set to True to apply zero-mean, unit-variance normalization to the
    # transformed output.
    standardize=True,
)
powerTransformer_boxcox.fit(data[["original"]])
data["box-cox"] = powerTransformer_boxcox.transform(data[["original"]])
[3]:
powerTransformer_yeojohnson = PowerTransformer(
    method="yeo-johnson",
    standardize=True,
)
powerTransformer_yeojohnson.fit(data[["original"]])
data["yeo-johnson"] = powerTransformer_yeojohnson.transform(data[["original"]])
[4]:
g = sns.jointplot(x="original", y="box-cox", data=data, kind="scatter")
g.fig.set_figwidth(3)
g.fig.set_figheight(3)
 
[5]:
g = sns.jointplot(x="original", y="yeo-johnson", data=data, kind="scatter")
g.fig.set_figwidth(3)
g.fig.set_figheight(3)
 
[6]:
display(
    powerTransformer_boxcox.lambdas_,
    powerTransformer_yeojohnson.lambdas_,
)
array([0.62017395])
array([0.61531059])