Chapter sebelumnya memperlihatkan bagaimana PCA memroyalkan empat fitur menjadi dua sumbu yang bisa digambar. Sesungguhnya itu hanya satu pintu masuk ke keluarga teknik yang lebih luas: reduksi dimensi — disiplin mengecilkan jumlah variabel tanpa kehilangan struktur yang berharga. Dalam kerangka unsupervised learning, reduksi dimensi melayani tiga tujuan sekaligus: memampatkan data, memvisualisasikan data tak berlabel, dan meredam derau. Pada chapter ini kita susuri ketiganya: membandingkan jalur PCA dengan feature selection, memakai PCA sebagai penyaring derau pada pembacaan sensor, lalu berkenalan secara konseptual dengan teknik nonlinear t-SNE dan UMAP beserta jebakan-jebakan yang sering menjebak penggunanya.

Tiga Tugas Reduksi Dimensi #

Sebelum memilih alat, kita perlu jelas sedang mengerjakan tugas yang mana — ketiganya sering tertukar dan menghasilkan keputusan yang keliru:

TugasPertanyaan yang dijawabUkuran keberhasilan
Kompresibagaimana menyimpan data lebih hemat tanpa banyak kehilangan informasi?variansi kumulatif yang dipertahankan
Visualisasibagaimana melihat struktur data berdimensi banyak di layar dua dimensi?gumpalan/pola yang terbaca mata
Peredaman deraubagaimana membuang getaran acak tanpa membuang sinyal?kualitas struktur setelah disaring

Satu teknik bisa melayani dua tugas sekaligus — PCA adalah contohnya — tetapi penekanannya berbeda. Untuk kompresi, kita menoleransi kehilangan 5-15% variansi; untuk visualisasi, yang penting mata kita melihat kelompok; untuk peredaman derau, justru komponen kecil yang dibuang itulah inti kerjanya.

Dua Jalur Menyusut: PCA dan Feature Selection #

Ada dua cara memperkecil jumlah variabel yang bekerja dengan logika berbeda. PCA membangun fitur baru: komponen utama adalah campuran linear seluruh fitur asli, sehingga informasi yang tersebar di banyak kolom tergabung ke beberapa sumbu. Feature selection memilih fitur lama: kolom yang tidak informatif dibuang, sisanya dibiarkan utuh dengan satuan dan makna aslinya. Perbandingannya:

AspekPCAFeature selection
Keluaranfitur baru (komponen)subset fitur asli
Makna satuanhilang — harus dibaca lewat muatantetap — “omzet” tetap berarti rupiah
Hubungan antar fiturdimanfaatkan (informasi tumpang tindih digabungkan)diabaikan
Cocok untukfitur berkorelasi tinggi, pipeline modelingpelaporan, model yang harus dijelaskan ke awam

Versi paling sederhana dari feature selection di dunia tak berlabel adalah variansi: fitur yang nilainya nyaris tidak bergerak tidak membawa informasi apa pun, siapa pun yang melihatnya. scikit-learn menyediakannya sebagai VarianceThreshold. Kita uji pada 14 hari data operasional kedai kopi — lima kolom pengukuran harian, satu di antaranya sensor tekanan udara yang menetap di angka 1011:

python
import pandas as pd
from sklearn.decomposition import PCA
from sklearn.feature_selection import VarianceThreshold
from sklearn.preprocessing import StandardScaler

# 14 hari operasional kedai kopi: lima pembacaan harian
kedai = pd.DataFrame({
    "pengunjung": [180, 120, 110, 130, 200, 260, 240,
                   190, 125, 115, 135, 210, 270, 250],
    "cangkir": [168, 105, 102, 124, 185, 238, 225,
                176, 118, 104, 128, 198, 251, 232],
    "omzet": [3180, 2120, 2010, 2340, 3610, 4620, 4290,
              3390, 2210, 2080, 2430, 3780, 4810, 4460],
    "suhu_ruangan": [24, 25, 26, 24, 23, 25, 27,
                     24, 25, 26, 24, 23, 25, 26],
    "tekanan_udara": [1011.2, 1011.4, 1011.1, 1011.3, 1011.2, 1011.5, 1011.1,
                      1011.2, 1011.3, 1011.2, 1011.4, 1011.1, 1011.2, 1011.3],
})

print("varians tiap fitur (skala asli):")
print(kedai.var().round(2).to_string())
print()

pilih = VarianceThreshold(threshold=0.5)
pilih.fit(kedai)
tersaring = [n for n, ok in zip(kedai.columns, pilih.get_support()) if ok]
dibuang = [n for n, ok in zip(kedai.columns, pilih.get_support()) if not ok]
print("VarianceThreshold(0.5) membuang:", dibuang)
print("fitur yang bertahan:", tersaring)
print()

X_semua = StandardScaler().fit_transform(kedai)
pca_semua = PCA(n_components=0.95).fit(X_semua)
print("PCA 95%% pada 5 fitur asli      -> %d komponen" % pca_semua.n_components_)

X_saring = StandardScaler().fit_transform(kedai[tersaring])
pca_saring = PCA(n_components=0.95).fit(X_saring)
print("PCA 95%% pada %d fitur tersaring -> %d komponen"
      % (len(tersaring), pca_saring.n_components_))

Output yang Dihasilkan:

text
varians tiap fitur (skala asli):
pengunjung          3435.30
cangkir             2987.98
omzet            1081125.82
suhu_ruangan           1.41
tekanan_udara          0.01

VarianceThreshold(0.5) membuang: ['tekanan_udara']
fitur yang bertahan: ['pengunjung', 'cangkir', 'omzet', 'suhu_ruangan']

PCA 95% pada 5 fitur asli      -> 3 komponen
PCA 95% pada 4 fitur tersaring -> 2 komponen

Mari kita telaah kode dan hasilnya:

  1. kedai.var() memperlihatkan masalahnya dari sudut pandang selection: pengunjung, cangkir, dan omzet berayun ribuan satuan, suhu_ruangan sedikit, dan tekanan_udara praktis diam di variansi 0,01 — getarannya lebih kecil dari ketelitian sensor.
  2. VarianceThreshold(threshold=0.5) menandai fitur bervariansi di bawah 0,5 untuk dibuang; hanya tekanan_udara yang tersingkir, empat lainnya dipertahankan apa adanya.
  3. PCA(n_components=0.95) pada kelima fitur (setelah z-skor) meminta PCA menyimpan komponen sampai 95% variansi kumulatif — hasilnya tiga komponen.
  4. Baris terakhir mengulang PCA hanya pada empat fitur hasil penyaringan — kini cukup dua komponen. Mengapa bisa berbeda? Standarisasi mengubah fitur nyaris konstan menjadi arah bervariansi penuh: derau sensor tekanan yang semula remeh ternyata dinaikkan pangkatnya oleh pembagian z-skor, dan PCA terpaksa menyediakan satu komponen ekstra untuk membungkusnya.

Kesimpulan praktisnya: kedua alat ini bekerja sebagai satu dua langkah, bukan saingan. Buang dulu fitur yang memang tidak informatif lewat variansi (atau pertimbangan domain), baru PCA meringkas yang tersisa. Untuk pemilihan fitur yang menimbang hubungan dengan target pada kasus supervised, pembahasannya ada di chapter Feature Selection .

Meredam Derau dengan PCA #

Sekarang tugas ketiga: peredaman derau (de-noising). Idenya bertumpu pada satu sifat alami data: sinyal cenderung bersekutu — banyak fitur bergerak bersama karena sama-sama dipengaruhi fenomena yang sama — sedangkan derau menyebar ke semua arah secara acak. Akibatnya sinyal memusat di komponen pertama dan derau menggerogoti komponen-komponen kecil. Membuang komponen kecil lalu memroyalkan sisanya kembali ke dimensi asli berarti menahan data hanya pada subspace yang bermakna.

Demonstrasi paling jernih memakai dua sensor yang mengukur benda yang sama. Suhu air 20 seduhan teh diukur serentak oleh sensor A dan sensor B, keduanya dengan galat acak sekitar ±1,5 derajat. Kalau PCA diminta mempertahankan satu komponen saja, ia menahan arah “kesepakatan kedua sensor” dan membuang arah “ketidaksesuaian keduanya”:

python
import numpy as np
import pandas as pd
from sklearn.decomposition import PCA

# 20 seduhan teh: dua sensor mengukur suhu air yang sama (derajat C)
rng = np.random.default_rng(42)
suhu_sebenarnya = np.linspace(60.0, 80.0, 20)
sensor_A = suhu_sebenarnya + rng.normal(0, 1.5, size=20)
sensor_B = suhu_sebenarnya + rng.normal(0, 1.5, size=20)

X = np.column_stack([sensor_A, sensor_B])

# peta variansi dulu: berapa sinyal, berapa derau
penuh = PCA().fit(X)
print("PC1 (sinyal) : %.1f%% variansi" % (100 * penuh.explained_variance_ratio_[0]))
print("PC2 (derau)  : %.1f%% variansi" % (100 * penuh.explained_variance_ratio_[1]))
print()

# proyeksikan ke PC1 saja, lalu kembalikan ke koordinat sensor
pca = PCA(n_components=1).fit(X)
proyeksi = pca.inverse_transform(pca.transform(X))

hasil = pd.DataFrame({
    "sensor_A": sensor_A.round(1),
    "sensor_B": sensor_B.round(1),
    "A_bersih": proyeksi[:, 0].round(1),
    "B_bersih": proyeksi[:, 1].round(1),
})
print(hasil.head(8).to_string(index=False))
print()
koreksi = np.abs(X - proyeksi).mean()
print("rata-rata koreksi per pembacaan: %.2f derajat C" % koreksi)

Output yang Dihasilkan:

text
PC1 (sinyal) : 98.5% variansi
PC2 (derau)  : 1.5% variansi

 sensor_A  sensor_B  A_bersih  B_bersih
     60.5      59.7      59.8      60.4
     59.5      60.0      59.4      60.1
     63.2      63.9      63.3      63.8
     64.6      62.9      63.5      64.0
     61.3      63.6      62.1      62.7
     63.3      64.7      63.8      64.3
     66.5      67.1      66.6      67.0
     66.9      67.9      67.2      67.6

rata-rata koreksi per pembacaan: 0.62 derajat C

Bedah kode dan hasilnya:

  1. rng.normal(0, 1.5, size=20) menambahkan derau buatan yang sama kuatnya ke kedua sensor; seed 42 dari default_rng membuat tabel ini bisa direproduksi persis.
  2. PCA().fit(X) penuh memetakan variansi dulu: 98,5% hidup di PC1 (perbedaan antar-seduhan — sinyal) dan hanya 1,5% di PC2 (ketidakcocokan antar-sensor — derau). Pembagian ini adalah alasan kita berani membuang PC2.
  3. pca.transform(X) menjatuhkan data ke sumbu PC1 (menjadi satu angka per seduhan), lalu inverse_transform mengangkatnya kembali ke dua koordinat sensor — berada tepat di garis PC1.
  4. Kolom A_bersih dan B_bersih memperlihatkan efeknya: pembacaan yang semula berselisih 1,7 derajat (baris keempat: 64,6 lawan 62,9) ditarik saling mendekat (63,5 lawan 64,0). Setiap pasangan pembacaan bergerak menuju konsensus diagonal — rata-rata koreksinya 0,62 derajat.

Inilah peredaman derau dalam bentuknya yang paling murni: dua pendapat yang berbeda soal benda yang sama disatukan menjadi satu suara bersama. Prinsip yang sama bekerja pada data 50 sensor pabrik atau 300 fitur profil pelanggan — selama sinyalnya bersekutu dan deraunya menyebar, komponen kecil adalah tempat sampahnya.

t-SNE dan UMAP: Melihat yang Tidak Lurus #

PCA punya satu batas keras yang sudah kita tandai di chapter PCA : komponennya berupa garis dan bidang. Padahal banyak data nyata berbaring di permukaan yang melengkung — cincin, tabung, lembaran terlipat. Keluarga teknik nonlinear menjawabnya, dan dua namanya paling sering terdengar: t-SNE dan UMAP. Keduanya tidak bisa kita kodekan di sini tanpa melewati batas kedalaman course, tetapi idenya penting dipahami agar kita tidak salah memakainya.

t-SNE (t-distributed Stochastic Neighbor Embedding) bekerja dua tahap. Di ruang asli, ia mengubah jarak antar titik menjadi probabilitas bertetangga: titik dekat jadi tetangga berprobabilitas tinggi, titik jauh berprobabilitas nyaris nol. Di ruang dua dimensi, ia menata ulang titik-titik sampai peta probabilitas tetangga yang baru sedekat mungkin dengan yang lama — yang dijaga adalah kebertetanggaan lokal, bukan jarak absolut. Parameter perplexity mengatur berapa tetangga yang dianggap “dekat”; mengubahnya bisa mengubah wajah peta secara drastis. UMAP berangkat dari gagasan serupa dengan matematis yang berbeda, jauh lebih cepat pada data besar, dan relatif lebih baik menjaga struktur antar-kelompok, bukan hanya sekelompok kecil tetangga.

Keduanya tersedia di ekosistem Python (t-SNE di scikit-learn sebagai TSNE, UMAP sebagai pustaka terpisah), dan keduanya berstatus unsupervised murni: tidak ada label yang disentuh. Yang perlu kita pahami sekarang adalah cara membaca hasilnya secara jujur — karena di situlah letak perangkapnya.

Perangkap Membaca Peta t-SNE #

Peta t-SNE adalah karya seni yang mudah dibaca terlalu jauh. Lima perangkap ini paling sering menjatuhkan analis:

  • Jarak antar gumpalan tidak bermakna. Dua kelompok yang tampak berjauhan di peta bisa saja bersebelahan di ruang asli; t-SNE tidak menjanjikan kelestarian jarak global.
  • Ukuran gumpalan tidak bermakna. Kelompok yang tampak rapat dan besar bisa jadi cuma efek kerapatan lokal yang diperbesar algoritma.
  • Gumpalan bisa muncul dari data acak. t-SNE hampir selalu menghasilkan pulau-pulau yang terlihat bermakna — bahkan pada data yang sesungguhnya tak berstruktur. Selalu uji dengan PCA atau metrik internal sebelum percaya.
  • Hasil berganti dengan perplexity. Peta dari perplexity 5, 30, dan 100 bisa bercerita beda; tidak ada satu nilai “benar”, jadi coba beberapa nilai dan lihat cerita mana yang konsisten.
  • Sumbunya tidak bisa ditafsirkan. Berbeda dari PCA (PC1 = arah variansi terbesar), sumbu t-SNE tidak punya makna; jangan pernah menamai sumbu atau menghitung gradien darinya.

Kapan Memakai Apa #

Kita tutup dengan satu tabel keputusan yang merangkai seluruh perbincangan:

SituasiPilihan pertamaAlasannya
Memampatkan fitur berkorelasi untuk pipeline modelingPCAmenangkap informasi tumpang tindih; deterministik; cepat
Menggambarkan data yang strukturnya lumayan linearPCA 2 komponensumbu tetap bermakna; variansi terukur
Menggambarkan data berstruktur melengkung/komplekst-SNE atau UMAPmenjaga kebertetanggaan lokal yang tak sanggup ditangkap PCA
Menyingkirkan sensor/fitur yang nyaris diamVarianceThresholdmurah, jujur, tidak butuh asumsi bentuk
Fitur harus tetap dalam satuan asli untuk pelaporanfeature selectionmakna bisnis kolom tidak boleh hilang
Hasil reduksi akan dipakai model downstreamPCA (atau UMAP untuk data besar)t-SNE tidak dirancang menghasilkan fitur untuk model

Rangkuman #

  • Reduksi dimensi dalam unsupervised learning melayani tiga tugas: kompresi, visualisasi data tak berlabel, dan peredaman derau — tiga ukuran keberhasilannya berbeda.
  • PCA membangun fitur baru dari kombinasi linear; feature selection membuang fitur tak informatif dan mempertahankan satuan asli; VarianceThreshold adalah bentuk paling sederhana yang bekerja dari variansi saja.
  • Fitur nyaris konstan sebaiknya dibuang sebelum PCA: setelah z-skor, deraunya justru terangkat setara sinyal dan memaksa PCA memakai komponen ekstra — terbukti 3 komponen turun menjadi 2.
  • Peredaman derau bekerja karena sinyal bersekutu di komponen awal dan derau menyebar: dua sensor yang saling mengoreksi menjadi satu konsensus setelah PC2 dibuang.
  • t-SNE dan UMAP menjaga kebertetanggaan lokal pada struktur nonlinear, tetapi jarak antar gumpalan, ukuran gumpalan, dan sumbunya tidak bermakna — peta mereka alat eksplorasi, bukan bukti.

Struktur data kini bisa kita kelompokkan, dinilai, dan lihat. Tetapi unsupervised learning masih menyimpan satu pola yang sama sekali tidak berbentuk gumpalan: kebiasaan barang yang dibeli bersama. Kopi dan gula yang selalu satu struk, mie instan dan roti yang berdua di rak kasir — pola seperti ini digali bukan dengan jarak maupun variansi, melainkan dengan menghitung bersamaan. Lanjut ke chapter Association Rule Mining .

Referensi #

  1. scikit-learn — Preprocessing Data (VarianceThreshold)
  2. scikit-learn — FAQ