AI
Artificial Intelligence (IF1706)
FSTT • ISTN Jakarta • Semester Ganjil 2025/2026
Sesi 13 – K-Means & PCA

Pembelajaran unsupervised mencoba menemukan struktur tersembunyi tanpa label. K-Means mengelompokkan data ke K klaster dengan meminimalkan jarak ke centroid; PCA mereduksi dimensi dengan mempertahankan varians terbesar untuk memudahkan visualisasi dan mempercepat pemodelan.

Tujuan: memilih K yang baik, membaca metric inersia/silhouette, dan memakai PCA untuk visualisasi/kompresi
Ulasan Materi: Definisi, Intuisi, dan Contoh

K-Means

K-Means efektif untuk klaster berbentuk bulat/seragam varians. Perhatikan inisialisasi (k-means++) dan skala fitur. Gunakan elbow untuk indikasi K awal, kemudian konfirmasi dengan silhouette.

PCA

PCA mencari sumbu baru (komponen utama) yang menangkap varians terbesar. Tidak menggunakan label, sehingga cocok untuk eksplorasi awal dan mengurangi noise sebelum clustering.

Ringkasan Intuisi & Rumus:

1) K-Means Clustering
   • Tujuan: bagi data menjadi K klaster dengan meminimalkan inersia (jumlah kuadrat jarak ke centroid).
   • Algoritma: (a) inisialisasi centroid (k-means++), (b) assign tiap titik ke centroid terdekat,
     (c) update centroid = rata-rata titik di klaster, (d) iterasi sampai konvergen.
   • Inersia: ∑_k ∑_{x∈C_k} ||x − μ_k||².
   • Pemilihan K: elbow method (lihat penurunan inersia), Silhouette score (−1..1, makin tinggi makin baik).
   • Sensitif skala → lakukan standarisasi fitur.

2) PCA (Principal Component Analysis)
   • Tujuan: reduksi dimensi dengan memaksimalkan varians proyeksi.
   • Langkah: sentroid nol → dekomposisi kovarians → eigenvector (komponen utama) & eigenvalue (varians).
   • Variance Explained Ratio: proporsi varians yang ditangkap oleh tiap komponen.
   • Gunakan untuk visualisasi 2D/3D dan sebagai pra-proses sebelum clustering.

3) Pipeline Praktik
   • Scaling → PCA (opsional) → K-Means. Uji berbagai K & komponen PCA; bandingkan inersia & silhouette.

Studi Kasus

  • Blobs/Clusters: bandingkan K berbeda pada data sintetis; lihat inersia & silhouette.
  • Wine/Iris: PCA → 2D, kemudian K-Means; lihat struktur alami data.
Lab: K-Means, Elbow/Silhouette, PCA, Pipeline
A. K-Means Dasar
# ====== K-Means Dasar (Data Sintetis) ======
# Jika perlu: !pip install scikit-learn
import numpy as np
import matplotlib.pyplot as plt
from sklearn.datasets import make_blobs
from sklearn.cluster import KMeans
from sklearn.preprocessing import StandardScaler

X, y_true = make_blobs(n_samples=600, centers=4, cluster_std=0.80, random_state=0)
sc = StandardScaler()
Xs = sc.fit_transform(X)

kmeans = KMeans(n_clusters=4, n_init=10, random_state=0)
labels = kmeans.fit_predict(Xs)

plt.figure(figsize=(5,4))
plt.scatter(Xs[:,0], Xs[:,1], c=labels, s=12)
plt.title('K-Means (K=4) pada Data Terskala')
plt.show()

print('Inersia:', kmeans.inertia_)
print('Centroid (scaled space):\n', kmeans.cluster_centers_)
B. Elbow & Silhouette
# ====== Elbow Method & Silhouette Score ======
import numpy as np
import matplotlib.pyplot as plt
from sklearn.cluster import KMeans
from sklearn.metrics import silhouette_score
from sklearn.preprocessing import StandardScaler
from sklearn.datasets import make_blobs

X, _ = make_blobs(n_samples=800, centers=5, cluster_std=0.9, random_state=42)
Xs = StandardScaler().fit_transform(X)

Ks = range(2, 10)
inertias = []
sils = []
for k in Ks:
    km = KMeans(n_clusters=k, n_init=10, random_state=0).fit(Xs)
    inertias.append(km.inertia_)
    sils.append(silhouette_score(Xs, km.labels_))

plt.figure(figsize=(5,3))
plt.plot(list(Ks), inertias, marker='o')
plt.title('Elbow Method (Inertia vs K)')
plt.xlabel('K'); plt.ylabel('Inertia'); plt.grid(True, alpha=0.3)
plt.show()

plt.figure(figsize=(5,3))
plt.plot(list(Ks), sils, marker='o')
plt.title('Silhouette Score vs K')
plt.xlabel('K'); plt.ylabel('Silhouette'); plt.grid(True, alpha=0.3)
plt.show()

best_k = Ks[int(np.argmax(sils))]
print('K terbaik (menurut Silhouette) ≈', best_k)
C. PCA: Visualisasi & Variance
# ====== PCA: Visualisasi 2D & Variance Explained ======
from sklearn.decomposition import PCA
from sklearn.preprocessing import StandardScaler
from sklearn.datasets import load_wine
import numpy as np
import matplotlib.pyplot as plt

X, y = load_wine(return_X_y=True)
Xs = StandardScaler().fit_transform(X)

pca = PCA(n_components=2)
X2 = pca.fit_transform(Xs)

print('Explained variance ratio (2 komponen):', pca.explained_variance_ratio_)

plt.figure(figsize=(5,4))
plt.scatter(X2[:,0], X2[:,1], c=y, s=12)
plt.title('PCA 2D pada Wine Dataset')
plt.xlabel('PC1'); plt.ylabel('PC2')
plt.show()

# Scree plot untuk beberapa komponen
pca_full = PCA().fit(Xs)
plt.figure(figsize=(5,3))
plt.plot(np.cumsum(pca_full.explained_variance_ratio_), marker='o')
plt.title('Cumulative Explained Variance')
plt.xlabel('Jumlah Komponen'); plt.ylabel('Var Cum.')
plt.grid(True, alpha=0.3)
plt.show()
D. Pipeline PCA → K-Means
# ====== Pipeline: Scaling → PCA (2D) → K-Means ======
from sklearn.pipeline import Pipeline
from sklearn.preprocessing import StandardScaler
from sklearn.decomposition import PCA
from sklearn.cluster import KMeans
from sklearn.metrics import silhouette_score
from sklearn.datasets import load_iris
import matplotlib.pyplot as plt

X, _ = load_iris(return_X_y=True)
pipe = Pipeline([
    ('sc', StandardScaler()),
    ('pca', PCA(n_components=2)),
    ('km', KMeans(n_clusters=3, n_init=10, random_state=0))
])
Xt = pipe.fit_transform(X)  # output setelah PCA
labels = pipe.named_steps['km'].labels_

print('Silhouette (PCA 2D + KMeans K=3):', silhouette_score(Xt, labels))

plt.figure(figsize=(5,4))
plt.scatter(Xt[:,0], Xt[:,1], c=labels, s=14)
plt.title('Iris: PCA 2D + K-Means (K=3)')
plt.xlabel('PC1'); plt.ylabel('PC2')
plt.show()
E. Silhouette Plot (Visual)
# ====== Silhouette Plot (Visual) untuk K-Means ======
import numpy as np
import matplotlib.pyplot as plt
from sklearn.datasets import make_blobs
from sklearn.preprocessing import StandardScaler
from sklearn.cluster import KMeans
from sklearn.metrics import silhouette_samples, silhouette_score

X, _ = make_blobs(n_samples=700, centers=4, cluster_std=0.9, random_state=10)
Xs = StandardScaler().fit_transform(X)

k = 4
km = KMeans(n_clusters=k, n_init=10, random_state=0).fit(Xs)
labels = km.labels_

silhouette_avg = silhouette_score(Xs, labels)
sample_silhouette_values = silhouette_samples(Xs, labels)

print('Rata-rata Silhouette:', silhouette_avg)

y_lower = 10
plt.figure(figsize=(6,4))
for i in range(k):
    ith_cluster_silhouette_values = sample_silhouette_values[labels == i]
    ith_cluster_silhouette_values.sort()
    size_cluster_i = ith_cluster_silhouette_values.shape[0]
    y_upper = y_lower + size_cluster_i
    plt.fill_betweenx(np.arange(y_lower, y_upper), 0, ith_cluster_silhouette_values)
    y_lower = y_upper + 10
plt.axvline(x=silhouette_avg, color='k', linestyle='--')
plt.title('Silhouette Plot (K=4)')
plt.xlabel('Nilai Silhouette'); plt.ylabel('Sampel')
plt.show()
F. Kuis 13 (Cek Mandiri)
# ====== Kuis 13 (cek mandiri) ======
qs=[
  ("Tujuan K-Means adalah...",{"a":"Maksimalkan jarak antar-centroid","b":"Minimalkan inersia (sum of squared distances)","c":"Maksimalkan Silhouette","d":"Minimalkan MAE"},"b"),
  ("Mengapa scaling penting sebelum K-Means?",{"a":"Untuk mempercepat GPU","b":"Agar fitur berskala besar tidak mendominasi jarak","c":"Mengubah jumlah klaster","d":"Supaya PCA tidak perlu"},"b"),
  ("PCA memilih komponen berdasarkan...",{"a":"Korelasi dengan label","b":"Varians proyeksi","c":"Jumlah sampel","d":"Random"},"b"),
  ("Silhouette score tinggi menunjukkan...",{"a":"Klaster tumpang tindih","b":"Klaster kompak & terpisah baik","c":"Banyak outlier","d":"Tidak bisa ditentukan"},"b"),
]
print('Kunci jawaban:')
for i,(_,__,ans) in enumerate(qs,1):
    print(f'Q{i}: {ans}')
Penugasan & Referensi

Tugas Koding 9: Gunakan satu dataset nyata (mis. Wine/Iris/Mall Customers). Lakukan: (i) scaling; (ii) PCA (pilih 2–3 komponen, laporkan explained variance); (iii) K-Means dengan K∈{2..8}; (iv) laporkan kurva elbow & silhouette dan pilih K terbaik; (v) visualisasikan hasil klaster di ruang PCA. Ringkasan ≤ 1 halaman.

  • Jolliffe, I. — Principal Component Analysis.
  • Geron — Hands-On Machine Learning, bab PCA & clustering.