Transformasi Yeo-Johnson

Prep

Transformasi Yeo-Johnson

Dibuat: Pembaruan terakhir: Waktu baca: 2 menit

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

Contoh penggunaan (diagram)

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

Contoh penggunaan (diagram)

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.