Tidak semua data hadir lengkap dengan jawaban benar. Log transaksi jutaan pelanggan jarang disertai kolom “segmen pelanggan”, dan data sensor jarang diberi label “normal” atau “aneh”. Unsupervised learning bekerja pada data tanpa label: algoritma mencari struktur tersembunyi, misalnya kelompok alami atau arah variansi terbesar. Pada chapter ini kita menjalankan k-means untuk segmentasi pelanggan, belajar memilih jumlah klaster, lalu memakai PCA untuk memvisualisasikan data berdimensi banyak.

Clustering dengan k-Means #

Algoritma k-means membagi data menjadi k klaster dengan cara mengiterasi dua langkah: tiap titik ditugaskan ke pusat klaster terdekat, lalu tiap pusat digeser ke rata-rata anggotanya, diulang hingga posisi pusat stabil. Sebagai bahan uji, kita buat 90 pelanggan sintetis dari tiga kelompok alami dengan dua fitur: persentase diskon yang dipakai dan frekuensi belanja per bulan:

python
import numpy as np
from sklearn.cluster import KMeans

rng = np.random.RandomState(42)
hemat = rng.normal(loc=[30, 3], scale=3, size=(30, 2)).round(1)
menengah = rng.normal(loc=[60, 7], scale=4, size=(30, 2)).round(1)
premium = rng.normal(loc=[95, 12], scale=5, size=(30, 2)).round(1)
pelanggan = np.vstack([hemat, menengah, premium])

model = KMeans(n_clusters=3, n_init="auto", random_state=42)
label = model.fit_predict(pelanggan)
print("Label 15 pelanggan pertama:", label[:15])
print("Pusat klaster:")
print(model.cluster_centers_.round(1))

Output yang Dihasilkan:

text
Label 15 pelanggan pertama: [2 2 2 2 2 2 2 2 2 2 2 2 2 2 2]
Pusat klaster:
[[59.6  7.4]
 [94.6 13.3]
 [29.6  2.5]]

Mari kita bedah kode di atas:

  1. Baris 4-6 (rng.normal(...)): tiga kelompok pelanggan dibuat di sekitar pusat berbeda: segmen hemat (diskon 30 persen, belanja 3 kali), menengah (60 dan 7), dan premium (95 dan 12). NumPy RandomState(42) membuat data ini dapat direproduksi.
  2. Baris 8 (model.fit_predict(...)): method gabungan fit_predict() menjalankan iterasi k-means sekaligus mengembalikan nomor klaster tiap baris. Kelima belas pelanggan pertama (segmen hemat) seluruhnya menerima label 2.
  3. Atribut cluster_centers_: berisi koordinat pusat akhir tiap klaster. Baris [29.6, 2.5] adalah pusat klaster 2, persis dijantung segmen hemat yang kita tanam.

Perhatikan bahwa penomoran klaster (0, 1, 2) tidak berarti apa-apa; k-means tidak tahu mana segmen “premium”. Untuk memberi nama, kita baca pusat klaster: klaster dengan pusat belanja 13 kali per bulan layak disebut segmen setia, bukan sekadar “klaster 1”.

Memilih Jumlah Klaster #

Pertanyaan berikutnya: dari mana tahu k=3? Dua alat bantu standar menjawabnya. Pertama, metode elbow: jalankan k-means untuk berbagai k lalu amati inertia_, yaitu total jarak kuadrat tiap titik ke pusat klasternya. Titik di mana penurunan inertia melandai bentuk “siku”:

python
for k in range(1, 7):
    km = KMeans(n_clusters=k, n_init="auto", random_state=42).fit(pelanggan)
    print(f"k={k}: inertia={km.inertia_:.0f}")

Output yang Dihasilkan:

text
k=1: inertia=68098
k=2: inertia=16560
k=3: inertia=2698
k=4: inertia=2226
k=5: inertia=1800
k=6: inertia=1470

Inertia anjlok drastis dari 68.098 ke 2.698 saat k naik dari 1 ke 3, lalu penurunan selanjutnya melandai (2.226, 1.800, 1.470). Siku terletak di k=3, cocok dengan tiga kelompok yang kita tanam. Karena elbow kadang ambigu, alat kedua adalah silhouette score yang mengukur seberapa cocok tiap titik berada di klasternya sendiri dibanding klaster tetangga; nilainya dari -1 (salah penempatan) hingga 1 (klaster rapat dan terpisah jelas):

python
from sklearn.metrics import silhouette_score

for k in [2, 3, 4, 5]:
    km = KMeans(n_clusters=k, n_init="auto", random_state=42).fit(pelanggan)
    skor = silhouette_score(pelanggan, km.labels_)
    print(f"k={k}: silhouette={skor:.3f}")

Output yang Dihasilkan:

text
k=2: silhouette=0.672
k=3: silhouette=0.785
k=4: silhouette=0.634
k=5: silhouette=0.660

Silhouette tertinggi jatuh pada k=3 (0.785), mengonfirmasi pilihan elbow. Berbeda dari supervised learning, kedua metrik ini tidak memakai label jawaban benar karena memang tidak ada; keduanya mengukur kualitas struktur yang ditemukan algoritma dari data itu sendiri.

Reduksi Dimensi dengan PCA #

Dataset nyata sering memiliki puluhan hingga ribuan kolom. Principal Component Analysis (PCA) merangkum informasi tersebut menjadi beberapa sumbu baru yang disebut komponen utama, terurut dari yang menampung variansi terbesar. Kegunaan paling sederhana: memampatkan data berdimensi banyak menjadi dua dimensi agar bisa digambar:

python
from sklearn.decomposition import PCA
from sklearn.datasets import load_iris

iris = load_iris()
pca = PCA(n_components=2)
X_2d = pca.fit_transform(iris.data)
print(X_2d[:5].round(2))
print(pca.explained_variance_ratio_.round(3))

Output yang Dihasilkan:

text
[[-2.68  0.32]
 [-2.71 -0.18]
 [-2.89 -0.14]
 [-2.75 -0.32]
 [-2.73  0.33]]
[0.925 0.053]

Method fit_transform() memproyeksikan 150 bunga iris dari empat dimensi ke dua dimensi; baris pertama hasilnya adalah koordinat baru lima bunga pertama. Atribut explained_variance_ratio_ menunjukkan komponen pertama menampung 92.5 persen variansi dan komponen kedua 5.3 persen, total 97.8 persen. Artinya, sebaran iris yang tadinya empat dimensi nyaris seluruhnya terekam pada bidang dua dimensi, sehingga sebaran titik pada X_2d dapat langsung diplot dengan matplotlib untuk melihat struktur kelas.

Kapan Unsupervised Learning Dipakai #

Tiga keluarga penggunaan paling umum:

  • Segmentasi. Mengelompokkan pelanggan, produk, atau dokumen tanpa perlu label; hasil klaster menjadi bahan strategi pemasaran atau rekomendasi.
  • Eksplorasi dan visualisasi. PCA merangkum puluhan fitur menjadi dua-tiga sumbu agar pola besar terlihat mata sebelum modeling dimulai.
  • Deteksi anomali. Titik yang jauh dari semua klaster adalah kandidat penipuan atau kerusakan sensor; scikit-learn menyediakan class khusus seperti IsolationForest untuk skenario ini.

Karena tidak ada label, evaluasi unsupervised learning memang lebih lentur: silhouette dan inertia mengukur struktur, bukan kebenaran. Keputusan bisnis “apakah tiga segmen ini bermakna” tetap kembali pada penafsiran manusia atas pusat klaster dan karakteristik tiap kelompok.