K-Means Clustering

"Mengelompokkan Data Berdasarkan Kedekatan"

1. Apa itu Clustering?

Berbeda dengan Klasifikasi (Supervised Learning) di mana kita punya "Kunci Jawaban" (Label), di Clustering (Unsupervised Learning) komputer dibiarkan sendiri mencari pola.

K-Means adalah algoritma paling populer. Dia mencoba membagi data menjadi $K$ kelompok (Cluster) dengan cara mencari Titik Pusat (Centroid) untuk setiap kelompok.

Analogi: Bayangkan Anda menyebar 3 bendera (Centroid) di lapangan penuh orang. Setiap orang diminta berlari ke bendera terdekat. Setelah semua berkumpul, bendera dipindahkan ke tengah-tengah kerumunan barunya. Ulangi terus sampai bendera tidak perlu dipindah lagi.

2. Visualisasi: Cara Kerja K-Means

Centroid (Diamond) bergerak ke tengah titik-titik (Dots)

3. Langkah-Langkah Algoritma

  1. Tentukan jumlah cluster $K$ (misal $K=2$).
  2. Pilih $K$ titik acak sebagai Centroid Awal.
  3. Assignment: Hitung jarak setiap data ke semua Centroid. Masukkan data ke Cluster milik Centroid terdekat.
  4. Update: Hitung rata-rata (Mean) posisi semua data dalam satu cluster. Pindahkan Centroid ke posisi rata-rata tersebut.
  5. Ulangi langkah 3 & 4 sampai Centroid tidak berpindah lagi (Konvergen).

4. Simulasi Perhitungan Manual

Data (1D Sederhana):

Lokasi Rumah (km): $A=2, B=3, C=10, D=11, E=12$.

Kita ingin bagi jadi $K=2$ Cluster.

Iterasi 1:

Inisialisasi Random: Centroid1 ($C_1$) = 2, Centroid2 ($C_2$) = 3.

Data Jarak ke C1 (2) Jarak ke C2 (3) Pilih Cluster
A (2) 0 1 1
B (3) 1 0 2
C (10) 8 7 2
D (11) 9 8 2
E (12) 10 9 2

Cluster 1 anggotanya: {2}.
Cluster 2 anggotanya: {3, 10, 11, 12}.

Update Centroid:
  • C1 Baru: Rata-rata {2} = $\mathbf{2}$. (Tetap)
  • C2 Baru: Rata-rata {3, 10, 11, 12} = $(3+10+11+12)/4 = 36/4 = \mathbf{9}$. (Bergeser Jauh!)

Sekarang Centroid ada di 2 dan 9. Kita ulangi hitung jarak lagi di Iterasi 2, dst...

5. Implementasi Python (Scikit-Learn)

from sklearn.cluster import KMeans
import numpy as np
import matplotlib.pyplot as plt

# 1. Data Dummy (2 kelompok jelas)
X = np.array([[1, 2], [1, 4], [1, 0],  # Kelompok Kiri
              [10, 2], [10, 4], [10, 0]]) # Kelompok Kanan

# 2. Model KMeans
# n_clusters=2 (Mau bagi 2 kelompok)
kmeans = KMeans(n_clusters=2, random_state=0, n_init="auto")

# 3. Training
kmeans.fit(X)

# 4. Hasil
print("Label Cluster:", kmeans.labels_)
# Output: [1 1 1 0 0 0] (atau sebaliknya 0 0 0 1 1 1)

print("Posisi Centroid:", kmeans.cluster_centers_)
# Output: [[10.  2.] [ 1.  2.]]

# 5. Prediksi Data Baru
data_baru = [[0, 0], [12, 3]]
print("Prediksi:", kmeans.predict(data_baru))

6. Menentukan K Terbaik (Elbow Method)

Gimana kalau kita gak tau harus bagi berapa cluster? Kita coba $K=1, K=2, \dots, K=10$ lalu hitung Inertia (Total jarak error kuadrat).

Grafiknya biasanya turun drastis lalu melandai (seperti siku tangan). Titik siku itulah $K$ terbaik.