Unsupervised Learning:
Clustering & PCA
Tidak semua data punya label. Unsupervised learning menemukan struktur tersembunyi dalam data secara mandiri — mengelompokkan yang serupa, menemukan anomali, dan meringkas dimensi tinggi menjadi representasi yang lebih sederhana.
1. Apa Itu Unsupervised Learning?
Bayangkan kamu mendapat satu juta buku tanpa judul, pengarang, atau kategori. Tugas kamu: susun buku-buku ini secara masuk akal. Kamu akan mulai mengelompokkan berdasarkan kesamaan — buku tipis tentang memasak di satu rak, buku tebal bergambar di rak lain, buku dengan banyak angka di rak matematika.
Itulah unsupervised learning: temukan struktur alami dalam data tanpa panduan label. Tidak ada "jawaban benar" yang bisa kita bandingkan — model sendiri yang mendefinisikan kelompok.
| Aspek | Supervised (sesi 13) | Unsupervised (sesi ini) |
|---|---|---|
| Label Y | Ada | Tidak ada |
| Tujuan | Prediksi label baru | Temukan pola/struktur |
| Evaluasi | Bandingkan vs label aktual (akurasi, RMSE, dll.) | Lebih sulit — tidak ada "benar/salah". Pakai metrik internal (Silhouette Score, Inertia) |
| Interpretasi hasil | Label sudah terdefinisi dari awal | Perlu domain expert untuk memberi makna pada cluster/komponen yang ditemukan |
2. K-Means Clustering: Algoritma Dasar
K-Means adalah algoritma clustering paling populer. Tujuannya: bagi n titik data ke dalam k cluster sehingga setiap titik masuk ke cluster dengan centroid (pusat) terdekat.
100 mahasiswa berkumpul di aula. Dosen menunjuk 3 titik random: "Kalian jadi ketua kelompok A, B, C." Semua mahasiswa berdiri di dekat ketua yang paling mirip mereka. Setelah berkumpul, ketua baru adalah rata-rata posisi anggota kelompoknya. Proses ini diulang sampai tidak ada yang pindah kelompok.
1. Inisialisasi: Pilih k titik secara random sebagai centroid awal (K-Means++ memilih lebih cerdas)
2. Assignment: Setiap titik ditetapkan ke centroid terdekat (jarak Euclidean)
3. Update: Centroid baru = rata-rata semua titik dalam cluster tersebut
4. Ulangi 2–3 sampai konvergen (centroid tidak berubah atau perubahan < threshold)
Minimasi: Σₖ Σᵢ∈Cₖ ‖xᵢ − μₖ‖² (Within-Cluster Sum of Squares / Inertia)
Segmentasi Pelanggan — Studi Kasus
Toko online di Indonesia ingin mengelompokkan pelanggan berdasarkan perilaku belanja untuk strategi marketing yang lebih tepat sasaran.
Pelanggan loyal nilai tinggi. Prioritaskan program VIP dan exclusive offers.
Pelanggan aktif. Dorong dengan rekomendasi personalisasi dan flash sale.
Sudah lama tidak beli. Kampanye win-back dengan diskon reaktivasi besar.
3. Memilih Jumlah Cluster K yang Tepat
K harus ditentukan sebelum menjalankan K-Means. Bagaimana memilih K yang optimal?
Titik elbow adalah K di mana penurunan inertia mulai melambat drastis. Menambah K di atas titik ini memberikan manfaat yang semakin kecil dibanding kompleksitas yang bertambah.
Elbow Method: Plot inertia (WCSS) vs K. Pilih K di "siku" grafik — titik di mana penurunan inertia melambat. Bersifat heuristik, tidak selalu ada siku yang jelas.
Silhouette Score: Ukur seberapa mirip setiap titik dengan clusternya sendiri vs cluster tetangga. Nilai antara −1 dan +1. Pilih K dengan Silhouette Score tertinggi.
s(i) = (b(i) − a(i)) / max(a(i), b(i))
a(i) = jarak rata-rata ke anggota cluster sendiri | b(i) = jarak rata-rata ke cluster terdekat
4. DBSCAN: Clustering Berbasis Kepadatan
K-Means mengasumsikan cluster berbentuk bola (spherical) dan membutuhkan K ditentukan terlebih dahulu. DBSCAN bekerja berbeda: ia menemukan kelompok berdasarkan kepadatan titik.
eps (ε): radius lingkungan suatu titik. Titik lain dalam radius ini dianggap "tetangga".
min_samples: jumlah minimum titik dalam radius ε agar suatu titik dianggap "core point".
3 tipe titik:
Core point — punya ≥ min_samples tetangga dalam radius ε | Border point — dalam radius core point tapi tidak memenuhi syarat core | Noise/Outlier — bukan core dan tidak dalam radius siapapun
| Kriteria | K-Means | DBSCAN |
|---|---|---|
| Jumlah K | Harus ditentukan di awal | Otomatis ditemukan |
| Bentuk cluster | Hanya spherical/convex | Bentuk arbitrer (cincin, U, S) |
| Outlier | Semua titik masuk cluster | Titik noise teridentifikasi sebagai −1 |
| Cocok untuk | Cluster jelas terpisah, ukuran similar | Cluster berdensitas tinggi, data dengan outlier |
| Kelemahan | Buruk untuk cluster non-spherical | Butuh tuning eps dan min_samples |
5. Evaluasi Clustering
Tanpa label yang benar, evaluasi clustering mengandalkan metrik internal — mengukur kualitas cluster dari struktur data itu sendiri.
s(i) = (b(i) − a(i)) / max(a(i), b(i))
a(i) = rata-rata jarak titik i ke semua titik lain dalam clusternya sendiri (kohesi)
b(i) = rata-rata jarak titik i ke semua titik di cluster terdekat (separasi)
+1 = dalam cluster yang tepat | 0 = di perbatasan cluster | −1 = mungkin di cluster salah
Silhouette Score keseluruhan = rata-rata s(i) untuk semua titik. Semakin tinggi semakin baik (ideal > 0.5)
6. PCA — Principal Component Analysis
Bayangkan objek 3D (panjang × lebar × tinggi). Untuk difoto, kita proyeksikan ke bidang 2D (foto). Kehilangan sedikit informasi (kedalaman), tapi representasi 2D ini masih berguna dan jauh lebih mudah ditangani. Kita pilih sudut foto yang mempertahankan paling banyak informasi (variasi objek).
PCA melakukan hal serupa: dari p dimensi asli, PCA menemukan k arah (principal components) yang menangkap variansi data paling besar.
Sulit divisualisasi, banyak redundansi, multikolinieritas tinggi
PCA
5 PC menangkap 92% total variansi!
1. Visualisasi data berdimensi tinggi: Reduksi ke 2D atau 3D untuk scatter plot eksplorasi
2. Preprocessing sebelum supervised learning: Kurangi dimensi → kurangi multikolinieritas → training lebih cepat
3. Compression: Simpan data penting dalam format lebih ringkas
Perhatian: Principal components adalah kombinasi linear dari fitur asli — tidak mudah diinterpretasikan secara domain. Jika interpretabilitas penting, pertimbangkan feature selection biasa.
7. Praktik Python: K-Means, DBSCAN, dan PCA
import pandas as pd
import numpy as np
from sklearn.cluster import KMeans, DBSCAN
from sklearn.decomposition import PCA
from sklearn.preprocessing import StandardScaler
from sklearn.metrics import silhouette_score
np.random.seed(42)
n = 300
# Simulasi data pelanggan: frekuensi, nilai transaksi, recency
frekuensi = np.concatenate([
np.random.normal(12, 2, 60), # premium
np.random.normal(4, 1, 160), # reguler
np.random.normal(0.5,0.3, 80) # dormant
])
nilai = np.concatenate([
np.random.normal(850, 100, 60),
np.random.normal(210, 50, 160),
np.random.normal(75, 20, 80)
])
df = pd.DataFrame({'frekuensi': frekuensi.clip(0), 'nilai_rb': nilai.clip(10)})
# ── Wajib: scaling sebelum clustering ────────────
sc = StandardScaler()
X = sc.fit_transform(df)
# ── K-Means: Elbow method ─────────────────────────
inertia = []
sil_scores = []
K_range = range(2, 8)
for k in K_range:
km = KMeans(n_clusters=k, random_state=42, n_init=10).fit(X)
inertia.append(km.inertia_)
sil_scores.append(silhouette_score(X, km.labels_))
print("=== ELBOW METHOD ===")
for k, iner, sil in zip(K_range, inertia, sil_scores):
print(f"K={k}: Inertia={iner:7.1f} | Silhouette={sil:.3f}")
# ── K-Means dengan K=3 ───────────────────────────
km3 = KMeans(n_clusters=3, random_state=42, n_init=10)
df['cluster'] = km3.fit_predict(X)
print("\n=== PROFIL CLUSTER K=3 ===")
profil = df.groupby('cluster').agg({
'frekuensi': ['mean', 'count'],
'nilai_rb': 'mean'
}).round(1)
print(profil)
# ── DBSCAN ───────────────────────────────────────
dbs = DBSCAN(eps=0.4, min_samples=5)
labels_dbs = dbs.fit_predict(X)
n_clusters = len(set(labels_dbs)) - (1 if -1 in labels_dbs else 0)
n_noise = list(labels_dbs).count(-1)
print(f"\nDBSCAN: {n_clusters} cluster, {n_noise} noise points")
# ── PCA: visualisasi 2D ───────────────────────────
# Tambahkan fitur recency untuk demo PCA (3 dimensi → 2)
df['recency'] = np.where(df.cluster==0,
np.random.normal(3,1,n), np.where(df.cluster==1,
np.random.normal(18,5,n), np.random.normal(90,20,n)))
X3 = StandardScaler().fit_transform(df[['frekuensi','nilai_rb','recency']])
pca = PCA(n_components=2)
X_pca = pca.fit_transform(X3)
print(f"\n=== PCA: 3D → 2D ===")
print(f"Explained variance ratio: {pca.explained_variance_ratio_.round(3)}")
print(f"Total variansi tertangkap: {pca.explained_variance_ratio_.sum():.1%}")
=== ELBOW METHOD ===
K=2: Inertia= 312.4 | Silhouette=0.541
K=3: Inertia= 148.7 | Silhouette=0.623 ← tertinggi!
K=4: Inertia= 121.3 | Silhouette=0.571
K=5: Inertia= 108.9 | Silhouette=0.534
K=6: Inertia= 101.2 | Silhouette=0.498
=== PROFIL CLUSTER K=3 ===
frekuensi nilai_rb
mean count mean
cluster
0 11.8 58 847.3 ← Premium
1 4.1 159 211.6 ← Reguler
2 0.5 83 74.9 ← Dormant
DBSCAN: 3 cluster, 7 noise points
=== PCA: 3D → 2D ===
Explained variance ratio: [0.612 0.285]
Total variansi tertangkap: 89.7% ← 90% info tertangkap di 2D!
Uji Pemahaman Sesi 14
- Unsupervised learning: tidak ada label. Menemukan pola tersembunyi: clustering, dimensionality reduction, anomaly detection
- K-Means: bagi n titik ke k cluster dengan meminimalkan jarak ke centroid. Butuh K ditentukan di awal. Hanya bekerja untuk cluster spherical
- Sebelum clustering, wajib scaling — K-Means sensitif terhadap skala fitur
- Pilih K dengan Elbow Method (plot inertia vs K) dan Silhouette Score (nilai −1 hingga +1, semakin tinggi semakin baik)
- Studi kasus segmentasi pelanggan: Premium (frekuensi dan nilai tinggi), Regular (sedang), Dormant (jarang beli)
- DBSCAN: clustering berbasis kepadatan. Tidak butuh K, tangkap bentuk arbitrer, otomatis identifikasi outlier sebagai noise (label −1)
- DBSCAN parameter: eps (radius tetangga) dan min_samples (minimal titik untuk core point)
- PCA: proyeksikan data berdimensi tinggi ke komponen yang menangkap variansi terbesar. Pertahankan PC hingga 80–95% explained variance
- PCA berguna untuk visualisasi (2D/3D), preprocessing sebelum supervised learning, dan kompresi data
- Python: KMeans(), DBSCAN(), PCA() dari sklearn; silhouette_score() untuk evaluasi clustering