Bayangkan Anda baru diberi tanggung jawab atas program loyalitas sebuah toko ritel. Data transaksinya lengkap: 90 pelanggan dengan frekuensi kunjungan dan rata-rata belanja per transaksi. Yang tidak ada di data itu adalah kolom “segmen pelanggan” — tidak ada label yang menyatakan pelanggan mana yang hemat, rutin, atau premium. Padahal tim pemasaran ingin tepat sasaran. Inilah wilayah kerja unsupervised learning: algoritme mencari struktur tersembunyi dari data tanpa jawaban benar sebagai panduan, lalu kita menafsirkan struktur yang ditemukannya.
Ketika Label Tidak Tersedia #
Pada supervised learning, label adalah bahan bakar utama: data transaksi berlabel “penipuan” atau “sah” mengajarkan model membedakan keduanya. Namun di banyak masalah nyata label justru tidak pernah dikumpulkan, karena tiga hambatan yang berulang:
- Biaya pelabelan: menandai satu juta transaksi secara manual membutuhkan ribuan jam kerja manusia; label medis harus ditegaskan dokter spesialis yang waktunya mahal.
- Privasi: data pengeluaran pasien atau nasabah sering hanya boleh diolah tanpa anotasi identitas apa pun, sehingga pelabelan manual terkendala regulasi.
- Skala: data baru datang terus setiap hari; label yang ditegaskan hari ini belum tentu relevan untuk pola bulan depan.
Tanpa label, pertanyaannya berubah total. Supervised learning bertanya “berapa akurasi prediksi?”; unsupervised learning bertanya “struktur apa saja yang sebenarnya ada di dalam data ini?”
Empat Tugas Utama #
| Tugas | Pertanyaan khas | Contoh nyata |
|---|---|---|
| Clustering | Kelompok mana saja yang terbentuk secara alami? | Segmentasi pelanggan, pengelompokan dokumen |
| Dimensionality reduction | Bagaimana meringkas ratusan fitur tanpa kehilangan banyak informasi? | Kompresi fitur, visualisasi 2D |
| Density estimation | Seberapa padat data pada suatu wilayah? | Estimasi distribusi pendapatan pelanggan |
| Anomaly detection | Titik mana yang menyimpang dari pola umum? | Transaksi tak wajar, sensor rusak |
Section ini membedah dua tugas pertama secara mendalam: empat chapter clustering (k-means, hierarchical, DBSCAN, plus evaluasi silhouette) dan dua chapter reduksi dimensi (PCA, t-SNE). Density estimation hanya disinggung sebagai konsep karena penerapannya menuntut dasar statistika yang lebih dalam. Anomaly detection dengan pendekatan khusus menanti Anda di Section Anomaly Detection — kebetulan dua topik itu sering dipakai bersama di dunia deteksi transaksi mencurigakan.
Masalah Tanpa Ground Truth #
Ciri paling menantang dari unsupervised learning adalah tidak ada jawaban benar yang bisa dipakai menghitung akurasi. Jika sebuah algoritme menyatakan ada tiga klaster pelanggan, tidak ada kolom kebenaran untuk membandingkan. Konsekuensinya, evaluasi bergeser ke dua pegangan:
- Indeks internal: angka yang dihitung dari data itu sendiri, misalnya seberapa rapat anggota satu klaster dan seberapa terpisah antar klaster. Chapter Evaluasi Clustering dengan Silhouette membahas satu indeks semacam itu sampai ke rumusnya.
- Penilaian domain: manusia yang memeriksa profil tiap klaster. Kalau klaster “sering datang, belanja besar” memang masuk akal bagi manajer toko, hasilnya berguna — walau tidak ada angka akurasinya.
Untuk keperluan belajar, kita memakai trik yang jujur: data sintetis dibangun dari segmen yang kita tetapkan sendiri, label aslinya disimpan, tetapi algoritme hanya menerima fitur. Label rahasia itu baru dibuka setelahnya untuk memeriksa apakah struktur yang ditemukan memang sesuai struktur yang ditanam.
Supervised vs Unsupervised #
| Aspek | Supervised | Unsupervised |
|---|---|---|
| Input | Fitur + label y | Fitur saja |
| Pertanyaan | “Label apa untuk titik baru?” | “Struktur apa yang ada?” |
| Contoh tugas | Klasifikasi, regresi | Clustering, reduksi dimensi |
| Evaluasi | Akurasi, precision, recall terhadap y | Indeks internal + penilaian domain |
| Risiko khas | Overfitting pada data berlabel | Penafsiran struktur yang sebenarnya arbitrer |
Dua paradigma ini bukan dua dunia terpisah. Semi-supervised learning memanfaatkan sedikit data berlabel plus banyak data tanpa label — label mahal, jadi dipakai sehemat mungkin. Praktik lain yang umum: clustering atau reduksi dimensi dikerjakan dulu tanpa label, hasilnya menjadi masukan bagi model supervised di tahap berikutnya.
Praktik: Menemukan Tiga Segmen Tanpa Label #
Mari kita lihat mesin pertama section ini bekerja. KMeans akan diberi 90 pelanggan dua fitur tanpa label apa pun, lalu diminta membagi mereka menjadi tiga klaster:
# Konsep unsupervised learning: menemukan struktur tanpa label.
# Kisah: 90 pelanggan toko ritel, 2 fitur, TANPA label segmen.
import numpy as np
from sklearn.cluster import KMeans
from sklearn.datasets import make_blobs
# Fitur: [kunjungan per bulan, rata-rata belanja per transaksi (juta Rp)].
# Pusat tiga segmen pelanggan dipilih tangan agar kisahnya nyata.
PUSAT_SEG = [
[2.0, 2.0], # hemat: jarang datang, belanja kecil
[7.0, 4.0], # rutin: sering datang, belanja menengah
[5.0, 9.0], # premium: cukup sering, belanja besar
]
X, y_sebenarnya = make_blobs(
n_samples=90, centers=PUSAT_SEG, cluster_std=1.0, random_state=42
)
print(f"Data: {X.shape[0]} pelanggan, {X.shape[1]} fitur")
print("Label segmen TIDAK diberikan ke algoritme (disimpan hanya untuk uji):")
for c in range(3):
print(f" segmen {c}: {(y_sebenarnya == c).sum()} pelanggan")
# Perhatikan: fit() hanya menerima X. Tidak ada y di mana pun.
model = KMeans(n_clusters=3, n_init="auto", random_state=42)
model.fit(X)
print("\nHasil KMeans (algoritme tidak pernah melihat label):")
for c in range(3):
jml = (model.labels_ == c).sum()
pusat = model.cluster_centers_[c]
print(f" klaster {c}: {jml} pelanggan, pusat "
f"(kunjungan {pusat[0]:.2f}, belanja {pusat[1]:.2f})")
print("\nBukti nomor klaster hanyalah penomoran sembarang:")
model_lain = KMeans(n_clusters=3, n_init="auto", random_state=0).fit(X)
print(f" random_state=42 -> inertia {model.inertia_:.3f}, "
f"label 5 pelanggan pertama: {model.labels_[:5].tolist()}")
print(f" random_state=0 -> inertia {model_lain.inertia_:.3f}, "
f"label 5 pelanggan pertama: {model_lain.labels_[:5].tolist()}")
print("\nTab silang klaster (baris) vs segmen sebenarnya (kolom):")
print(" segmen0 segmen1 segmen2")
for c in range(3):
baris = [((model.labels_ == c) & (y_sebenarnya == k)).sum() for k in range(3)]
print(f" klaster{c} {baris[0]:>4} {baris[1]:>4} {baris[2]:>4}")
print("\nPemetaan berdasarkan mayoritas anggota:")
for c in range(3):
hitung = [((model.labels_ == c) & (y_sebenarnya == k)).sum() for k in range(3)]
seg = int(np.argmax(hitung))
print(f" klaster {c} -> segmen {seg} "
f"({hitung[seg]} dari {sum(hitung)} anggotanya)")Output yang Dihasilkan:
Data: 90 pelanggan, 2 fitur
Label segmen TIDAK diberikan ke algoritme (disimpan hanya untuk uji):
segmen 0: 30 pelanggan
segmen 1: 30 pelanggan
segmen 2: 30 pelanggan
Hasil KMeans (algoritme tidak pernah melihat label):
klaster 0: 30 pelanggan, pusat (kunjungan 1.86, belanja 1.83)
klaster 1: 30 pelanggan, pusat (kunjungan 6.89, belanja 4.10)
klaster 2: 30 pelanggan, pusat (kunjungan 4.93, belanja 9.25)
Bukti nomor klaster hanyalah penomoran sembarang:
random_state=42 -> inertia 157.522, label 5 pelanggan pertama: [2, 2, 2, 1, 2]
random_state=0 -> inertia 157.522, label 5 pelanggan pertama: [0, 0, 0, 2, 0]
Tab silang klaster (baris) vs segmen sebenarnya (kolom):
segmen0 segmen1 segmen2
klaster0 30 0 0
klaster1 0 30 0
klaster2 0 0 30
Pemetaan berdasarkan mayoritas anggota:
klaster 0 -> segmen 0 (30 dari 30 anggotanya)
klaster 1 -> segmen 1 (30 dari 30 anggotanya)
klaster 2 -> segmen 2 (30 dari 30 anggotanya)Mari kita bedah bagian-bagian pentingnya:
- Baris 8–20 (
PUSAT_SEGdanmake_blobs): data dibangun dari tiga pusat segmen yang kita pilih sendiri. Fungsimake_blobsmengembalikany_sebenarnya, tetapi variabel itu tidak pernah disentuh oleh algoritme — hanya dipakai di akhir sebagai alat uji. - Baris 27–28 (
model.fit(X)): inilah perbedaan visual paling penting dari seluruh supervised learning —fit()hanya menerimaX. Tidak aday, tidak ada jawaban benar, tidak ada akurasi yang bisa dihitung. - Baris 30–36 (
model.labels_,model.cluster_centers_): hasil pembelajaran berupa label klaster per titik dan pusat tiap klaster. Perhatikan distribusi anggotanya: 30, 30, 30 — persis menyamai jumlah tiap segmen yang ditanam, padahal algoritme tidak pernah tahu hitungan itu. - Baris 38–44 (
model_lain): KMeans dilatih ulang denganrandom_state=0. Nilaiinertia_(total jarak kuadrat tiap titik ke pusatnya — makin kecil makin rapat) sama persis, 157,522, artinya partisinya identik. Tetapi label lima pelanggan pertama berubah dari[2, 2, 2, 1, 2]menjadi[0, 0, 0, 2, 0]. - Baris 46–56 (tab silang dan pemetaan): tab silang memeriksa isi tiap klaster terhadap segmen rahasia. Di eksekusi
random_state=42penomorannya kebetulan sejajar dengan segmen — perbandingan dengan eksekusirandom_state=0di poin sebelumnya membuktikan bahwa sejajarnya itu kebetulan, bukan jaminan.
Dengan konsep dan perangkat ujinya sudah di tangan, kita siap membedah mesin yang barusan bekerja. Bagaimana persisnya KMeans menemukan tiga gumpalan itu, mengapa jumlah klaster harus kita pilih sendiri, dan bagaimana menghindarinya terjebak pada solusi yang buruk — semuanya dibahas pada Chapter k-Means Clustering.
Referensi Resmi #
- Clustering — scikit-learn User Guide — peta lengkap seluruh algoritme clustering yang dibahas section ini.
- sklearn.cluster.KMeans — API Reference — dokumentasi resmi estimator yang dipakai pada contoh.