Transformasi Yeo-Johnson merupakan perluasan dari transformasi Box-Cox yang menormalkan skewness sekaligus dapat diterapkan pada data yang mengandung nol maupun bilangan negatif.
Definisi #
Untuk sebuah observasi (y) dan parameter daya (\lambda), transformasi Yeo-Johnson (T_\lambda(y)) didefinisikan sebagai berikut:
$$ T_\lambda(y)= \begin{cases} \dfrac{(y + 1)^\lambda - 1}{\lambda}, & y \ge 0,\ \lambda \ne 0,\\ \log(y + 1), & y \ge 0,\ \lambda = 0,\\ -\dfrac{(1 - y)^{2 - \lambda} - 1}{2 - \lambda}, & y < 0,\ \lambda \ne 2,\\ -\log(1 - y), & y < 0,\ \lambda = 2. \end{cases} $$
- Jika (\lambda = 1) hasilnya sama seperti data awal.
- Nilai positif diperlakukan seperti transformasi Box-Cox pada (y + 1).
- Nilai negatif direfleksikan terhadap nol sehingga transformasi tetap monoton meskipun tanda berubah.
- Transformasi balik disediakan SciPy melalui
scipy.stats.yeojohnson_inverse.
Estimasi (\lambda) biasanya dilakukan dengan memaksimumkan log-likelihood (MLE) dari data yang telah ditransformasikan. Fungsi yeojohnson_normmax pada SciPy mengembalikan estimasi ini.
I. Yeo dan R. A. Johnson, “A New Family of Power Transformations to Improve Normality or Symmetry”, Biometrika 87(4), 2000.
Contoh penggunaan #
from scipy import stats
import matplotlib.pyplot as plt
x = stats.loggamma.rvs(1, size=1_000) - 0.5
plt.hist(x, bins=30)
plt.axvline(x=0, color="r")
plt.title("Distribusi awal (termasuk nilai negatif)")
plt.show()

from scipy.stats import yeojohnson, yeojohnson_normmax
lmbda = yeojohnson_normmax(x) # estimasi maksimum likelihood
print(f"λ terestimasi: {lmbda:.3f}")
x_trans = yeojohnson(x, lmbda=lmbda)
plt.hist(x_trans, bins=30)
plt.title("Sesudah transformasi Yeo-Johnson")
plt.show()

Setelah transformasi, histogram menjadi jauh lebih simetris. Karena kita menyimpan nilai (\lambda), parameter tersebut dapat dipakai kembali untuk data validasi atau pengujian:
X_train_trans = yeojohnson(X_train, lmbda=lmbda)
X_valid_trans = yeojohnson(X_valid, lmbda=lmbda) # gunakan λ yang sama
Tips praktis #
- Lakukan standarisasi tambahan (
StandardScaler,RobustScaler, dsb.) bila model membutuhkan fitur yang terpusat dan ter-skala. - Hitung (\lambda) hanya dengan data pelatihan kemudian terapkan ke seluruh split lain agar tidak terjadi kebocoran informasi.
- Jika ekor distribusi masih berat, kombinasikan dengan skala robust untuk mengurangi pengaruh outlier.
Transformasi Yeo-Johnson dapat menjadi pengganti langsung Box-Cox pada pipeline praproses yang tidak dapat menjamin seluruh nilai positif.