Memasuki unsupervised learning: clustering dengan k-Means, DBSCAN, dan hierarchical beserta evaluasi silhouette, lalu dimensionality reduction memakai PCA untuk reduksi fitur serta t-SNE dan UMAP untuk visualisasi data berdimensi tinggi.

Sejauh ini kita selalu punya label (y) untuk diawasi. Pada episode ini kita masuk ke unsupervised learning: tidak ada label, hanya X. Model harus menemukan struktur tersembunyi sendiri.
Mengapa unsupervised penting di dunia nyata? Karena label itu mahal dan sering tidak ada. Segmen pelanggan mana yang paling menguntungkan? Transaksi mana yang aneh? Gambar mana yang mirip? Pertanyaan-pertanyaan ini tidak butuh label — butuh kemampuan menemukan pola. Kita akan membahas dua pilar: clustering dan dimensionality reduction.
Clustering mengelompokkan data sehingga anggota satu kelompok lebih mirip satu sama lain dibanding kelompok lain. Mirip organisasi file: dokumen yang bertema sama dikumpulkan dalam folder yang sama, tanpa perlu label tema di awal.
k-Means adalah algoritma clustering paling populer. Cara kerjanya:
from sklearn.cluster import KMeans
kmeans = KMeans(n_clusters=3, n_init=10, random_state=42)
labels = kmeans.fit_predict(X)
print(labels[:10])Karena berbasis jarak, k-Means wajib scaling — ingat pelajaran episode 4. Nilai k tidak diketahui sebelumnya; kita harus memilihnya, misalnya dengan elbow method atau silhouette (di bawah).
DBSCAN berbeda pendekatan: ia mengelompokkan berdasarkan kepadatan titik. Kelebihannya:
from sklearn.cluster import DBSCAN
dbscan = DBSCAN(eps=0.5, min_samples=5)
labels = dbscan.fit_predict(X)
# label -1 = outlier
print(set(labels))Bayangkan k-Means sebagai menggambar lingkaran berpusat; DBSCAN sebagai menandai "kerumunan" — titik yang dikelilingi titik lain bergabung, yang sendirian dibiarkan (label -1 = noise).
Hierarchical clustering membangun hierarki: mulai dari setiap titik sebagai cluster sendiri, lalu menggabungkan yang paling mirip secara bertahap. Hasilnya divisualisasikan sebagai dendrogram — peta pohon yang menunjukkan struktur berlapis.
from sklearn.cluster import AgglomerativeClustering
agglo = AgglomerativeClustering(n_clusters=3)
labels = agglo.fit_predict(X)Kelebihannya: kita tidak harus memilih jumlah cluster di awal — potong dendrogram di level mana pun untuk mendapat jumlah cluster berbeda.
Tanpa label, bagaimana tahu clustering kita bagus? Metrik paling populer: silhouette score, bernilai -1 sampai 1.
from sklearn.metrics import silhouette_score
for k in range(2, 7):
kmeans = KMeans(n_clusters=k, n_init=10, random_state=42)
labels = kmeans.fit_predict(X)
score = silhouette_score(X, labels)
print(f"k={k}: silhouette={score:.3f}")Kita juga bisa membandingkan nilai k untuk memilih jumlah cluster terbaik — k dengan silhouette tertinggi biasanya pilihan yang masuk akal.
Ketika fitur sangat banyak, masalah muncul: komputasi lambat, visualisasi mustahil, dan model rawan overfit. Dimensionality reduction mereduksi jumlah dimensi sambil mempertahankan informasi penting.
PCA menemukan arah (komponen) di mana data paling bervariasi, lalu memproyeksikan data ke arah-arah itu. Komponen pertama menangkap variansi terbesar, komponen kedua menangkap sisanya, dan seterusnya.
from sklearn.decomposition import PCA
pca = PCA(n_components=2)
X_reduced = pca.fit_transform(X)
print(X_reduced.shape)
print(f"variansi dijelaskan: {pca.explained_variance_ratio_.sum():.2%}")Fitur baru (komponen) adalah kombinasi linear fitur lama — jadi interpretasi per-fiturnya hilang. Tapi untuk keperluan reduksi dan visualisasi, ini sangat efektif.
| Teknik | Tujuan | Kecepatan | Interpretasi |
|---|---|---|---|
| PCA | Reduksi fitur & visualisasi | Cepat, deterministik | Linear (komponen kombinasi fitur) |
| t-SNE | Visualisasi | Lambat di dataset besar | Menjaga kedekatan lokal |
| UMAP | Visualisasi | Lebih cepat dari t-SNE | Menjaga struktur lokal & global |
t-SNE dan UMAP memetakan data berdimensi tinggi ke 2D/3D khusus untuk visualisasi. Mereka berusaha menjaga titik yang berdekatan di ruang asli tetap berdekatan di ruang proyeksi.
import umap
embedding = umap.UMAP(n_components=2, random_state=42)
X_2d = embedding.fit_transform(X)
import matplotlib.pyplot as plt
plt.scatter(X_2d[:, 0], X_2d[:, 1], c=labels, s=5)
plt.show()Warning
t-SNE dan UMAP adalah alat visualisasi, bukan reduksi fitur untuk modeling. Jarak dan cluster yang terlihat di plot tidak boleh dianggap sebagai hasil clustering — mereka bisa menyesatkan. Gunakan PCA untuk reduksi yang dipakai model, t-SNE/UMAP untuk eksplorasi visual.
Gabungkan pipeline yang sudah kita pelajari:
from sklearn.preprocessing import StandardScaler
from sklearn.pipeline import Pipeline
from sklearn.cluster import KMeans
pipeline = Pipeline([
("scale", StandardScaler()),
("pca", PCA(n_components=5)),
("kmeans", KMeans(n_clusters=3, n_init=10, random_state=42)),
])
labels = pipeline.fit_predict(X)
segmen = df.assign(segment=labels)
print(segmen.groupby("segment").mean())Perhatikan alurnya: scaling → PCA → k-Means, dalam satu Pipeline. Hasil groupby memberi profil tiap segmen — misalnya segmen 0 berisi customer muda berpendapatan rendah, segmen 1 customer lama berpendapatan tinggi. Profil inilah bahan keputusan bisnis.
k secara asal — pakai silhouette/elbow.Pada episode 8 ini, kalian telah menguasai dua pilar unsupervised learning.
Inti yang harus dibawa pulang:
k dan scaling; DBSCAN mendeteksi outlier dan bentuk bebas; hierarchical memberi struktur berlapis.Di episode 9 selanjutnya kita akan membahas feature engineering & feature selection — membuat fitur turunan, binning, interaksi, penanganan tanggal/kategori, lalu memilih fitur terbaik dengan metode filter, wrapper, dan embedded. Sampai jumpa di episode 9!