Sepanjang section ini kita menganalisis data dua fitur — belanja dan frekuensi — karena dua sumbu muat di satu grafik dan mata kita bisa langsung membaca gumpalannya. Data nyata jarang sebaik itu: profil pelanggan bisa punya belasan fitur, dan tidak ada cara menggambar 15 dimensi di kertas. Principal Component Analysis (PCA) menjawab kebutuhan itu dengan logika unsupervised yang murni: tanpa label, tanpa pertanyaan target, algoritma hanya mencari arah pandang dari mana data terlihat paling “gemuk” variansinya — lalu memroyalkan arah-arah itu menjadi sumbu baru yang lebih hemat. Pada chapter ini kita membedah cara kerjanya pada data 24 pelanggan kafe dengan empat fitur, lalu memakai dua komponen utamanya untuk melihat struktur data itu sendiri di bidang dua dimensi.

Mencari Arah Variansi Terbesar #

Bayangkan sebaran titik data sebagai awan di ruang berdimensi banyak. PCA memutar sistem sumbu sedemikian rupa sehingga sumbu pertama menempel pada arah tempat awan itu paling memanjang — arah dengan variansi terbesar. Sumbu kedua dipasang tegak lurus sumbu pertama, mengambil variansi terbesar yang tersisa, dan seterusnya. Tiga sifat penting mengikuti dari mekanisme ini:

  • Komponen adalah kombinasi linear fitur asli, bukan fitur tunggal; PC1 dari data kafe nanti berbunyi semacam “0,43×belanja − 0,51×frekuensi + 0,55×cangkir + 0,51×durasi”.
  • Komponen saling tegak lurus sehingga tidak ada informasi yang dihitung dua kali; variansi yang dirangkum tiap komponen bisa dijumlahkan.
  • Urutannya menurun: PC1 selalu membawa variansi terbanyak, PC2 berikutnya, sehingga beberapa komponen pertama biasanya sudah menangkap sebagian besar informasi.

Dua langkah persiapan menentukan mutunya. Pertama, standarisasi: PCA mengukur variansi, dan fitur berskala besar (belanja ratusan ribu rupiah) akan menghasilkan variansi yang menenggelamkan fitur berskala kecil (cangkir 1-3) — pelajaran yang sama dengan clustering pada chapter Pengenalan Clustering . Kedua, dan ini yang menegaskan posisinya di unsupervised learning: tidak ada label yang terlibat sama sekali. PCA hanya melihat matriks fitur X; ia tidak tahu dan tidak peduli ada tidaknya kolom target. Struktur yang ditemukannya murni milik data itu sendiri.

Empat Fitur Kafe, Dua Angka Baru #

Kita bekerja dengan 24 pelanggan sebuah kafe di Bandung, masing-masing tercatat pada empat fitur: belanja (ribu rupiah per bulan), frekuensi (kunjungan per bulan), cangkir (cangkir per kunjungan), dan durasi (menit rata-rata per kunjungan). Tidak ada kolom segmen, tidak ada label — hanya pola belanja mentah. Kita standarisasi keempat fitur, memasang PCA penuh, lalu membaca berapa variansi yang ditangkap tiap komponen beserta isi kombinasi linearnya:

python
import pandas as pd
from sklearn.decomposition import PCA
from sklearn.preprocessing import StandardScaler

# 24 pelanggan kafe: empat fitur, tanpa label
kafe = pd.DataFrame({
    "belanja": [70, 230, 420, 85, 260, 480, 60, 240,
                390, 95, 280, 510, 75, 250, 450, 80,
                300, 470, 65, 270, 400, 90, 220, 500],
    "frekuensi": [12, 18, 8, 10, 20, 6, 14, 16,
                  9, 11, 22, 7, 13, 19, 10, 15,
                  17, 8, 16, 21, 7, 12, 18, 9],
    "cangkir": [1, 1, 2, 1, 1, 3, 1, 1,
                2, 1, 1, 3, 1, 1, 2, 1,
                1, 3, 1, 1, 2, 1, 1, 3],
    "durasi": [110, 15, 160, 125, 20, 185, 130, 12,
               170, 105, 18, 200, 120, 22, 155, 135,
               10, 190, 115, 25, 175, 140, 14, 205],
})

fitur = ["belanja", "frekuensi", "cangkir", "durasi"]
X = StandardScaler().fit_transform(kafe[fitur])

pca = PCA()
pca.fit(X)

rasio = pca.explained_variance_ratio_
for i, r in enumerate(rasio, start=1):
    print("PC%d menjelaskan %5.2f%% variansi (kumulatif %6.2f%%)"
          % (i, 100 * r, 100 * rasio[:i].sum()))

print()
muat = pd.DataFrame(pca.components_[:2].round(3), columns=fitur, index=["PC1", "PC2"])
print(muat.to_string())

Output yang Dihasilkan:

text
PC1 menjelaskan 76.39% variansi (kumulatif  76.39%)
PC2 menjelaskan 20.25% variansi (kumulatif  96.65%)
PC3 menjelaskan  2.50% variansi (kumulatif  99.15%)
PC4 menjelaskan  0.85% variansi (kumulatif 100.00%)

     belanja  frekuensi  cangkir  durasi
PC1    0.428     -0.512    0.547   0.505
PC2    0.726      0.419    0.264  -0.477

Mari kita telaah baris-baris kode dan hasilnya:

  1. StandardScaler().fit_transform(kafe[fitur]) mengubah keempat fitur ke z-skor lebih dulu; tanpa ini, PC1 akan hampir seluruhnya menjadi “sumbu belanja” semata karena rentang rupiahnya jauh melampaui satuan lain.
  2. PCA() tanpa argumen memasang sebanyak mungkin komponen — di sini empat, sama dengan jumlah fitur; kita sengaja memasang penuh dulu untuk melihat peta variansi sebelum memotong.
  3. explained_variance_ratio_ adalah pangsa variansi data yang dibawa tiap komponen: PC1 menyedot 76,39% dan PC2 menambah 20,25%, sehingga dua komponen pertama bersama menangkap 96,65% informasi. Dua sisanya nyaris kosong — 3,35% saja.
  4. pca.components_[:2] berisi koefisien kombinasi linear tiap komponen terhadap fitur asli, yang kita bungkus ke DataFrame agar mudah dibaca. Baris PC1 berbunyi: belanja +0,428, frekuensi −0,512, cangkir +0,547, durasi +0,505.

Membaca muatan (loading) ini adalah keahlian tersendiri. PC1 menekankan cangkir, durasi, dan belanja dengan tanda positif sambil menekan frekuensi dengan tanda negatif — sumbu ini mempertentangkan pelanggan yang jarang datang tetapi sekali datang lama dan belanja besar melawan pelanggan yang sering mampir sekadar ambil bungkus. PC2 menonjolkan belanja dan frekuensi positif serta durasi negatif — arah total belanja besar dari kunjungan yang sering namun singkat. Dengan kata lain, PCA menemukan dua gaya hidup pelanggan yang mendasar pada data itu, tanpa ada satu pun label yang menyuruhnya.

Berapa Komponen yang Cukup? #

Pertanyaan praktis PCA selalu turun ke satu angka: berapa komponen yang kita simpan? Pedoman umumnya memakai variansi kumulatif: pertahankan komponen sampai totalnya mencapai sekitar 85-95% — angka pastinya keputusan, bukan hukum. Pada data kafe kita, dua komponen (96,65%) sudah melewati ambang itu dengan nyaman; menambah PC3 hanya memberi 2,50% informasi tambahan dengan biaya satu dimensi lagi. Cara kedua adalah mencari siku pada grafik variansi per komponen — kekeluargaan yang sama dengan elbow method inertia pada chapter Evaluasi Clustering : penurunan yang melandai menandakan komponen berikutnya tinggal membawa derau.

Kalau komponen pertama mendominasi terlalu ekstrem (misalnya PC1 = 99%), periksa ulang datanya — biasanya ada satu fitur berskala jauh lebih besar yang luput distandarisasi, atau beberapa fitur saling menyalin informasi yang sama. PCA yang sehat menunjukkan variansi yang tersebar pada beberapa arah pertama, karena itulah tanda ada struktur berdimensi lebih dari satu.

Melihat Struktur pada Bidang Dua Dimensi #

Sekarang bagian yang paling memuaskan: memakai PCA sebagai jendela. Dengan n_components=2, kita memroyalkan keempat fitur menjadi dua skor per pelanggan — koordinat baru pada bidang komponen utama — lalu menggambarkan ke-24 titiknya tanpa label apa pun:

python
import pandas as pd
from sklearn.decomposition import PCA
from sklearn.preprocessing import StandardScaler

kafe = pd.DataFrame({
    "belanja": [70, 230, 420, 85, 260, 480, 60, 240,
                390, 95, 280, 510, 75, 250, 450, 80,
                300, 470, 65, 270, 400, 90, 220, 500],
    "frekuensi": [12, 18, 8, 10, 20, 6, 14, 16,
                  9, 11, 22, 7, 13, 19, 10, 15,
                  17, 8, 16, 21, 7, 12, 18, 9],
    "cangkir": [1, 1, 2, 1, 1, 3, 1, 1,
                2, 1, 1, 3, 1, 1, 2, 1,
                1, 3, 1, 1, 2, 1, 1, 3],
    "durasi": [110, 15, 160, 125, 20, 185, 130, 12,
               170, 105, 18, 200, 120, 22, 155, 135,
               10, 190, 115, 25, 175, 140, 14, 205],
})

fitur = ["belanja", "frekuensi", "cangkir", "durasi"]
X = StandardScaler().fit_transform(kafe[fitur])

pca2 = PCA(n_components=2)
skor = pca2.fit_transform(X)

hasil = pd.DataFrame(skor.round(3), columns=["PC1", "PC2"])
print(hasil.head(6))
print()
print("total variansi 2 komponen: %.2f%%"
      % (100 * pca2.explained_variance_ratio_.sum()))

Output yang Dihasilkan:

text
     PC1    PC2
0 -0.725 -1.202
1 -1.631  0.732
2  1.750  0.075
3 -0.359 -1.412
4 -1.727  1.013
5  3.031  0.350

total variansi 2 komponen: 96.65%

Bedahnya ringkas: PCA(n_components=2) memangkas hasil menjadi dua komponen pertama, fit_transform sekaligus memasang sumbu dan memroyalkan data, dan skor adalah koordinat baru setiap pelanggan — dua angka pengganti empat. Baris ke-0 kini hidup di titik (−0,725, −1,202), pelanggan ke-5 di (3,031, 0,350), dan seterusnya. Angka “total variansi 2 komponen” mengingatkan harga kompresi ini: 96,65% informasi bertahan, 3,35% dibuang. Terakhir, kita gambar seluruhnya:

python
import matplotlib.pyplot as plt
import pandas as pd
from sklearn.decomposition import PCA
from sklearn.preprocessing import StandardScaler

kafe = pd.DataFrame({
    "belanja": [70, 230, 420, 85, 260, 480, 60, 240,
                390, 95, 280, 510, 75, 250, 450, 80,
                300, 470, 65, 270, 400, 90, 220, 500],
    "frekuensi": [12, 18, 8, 10, 20, 6, 14, 16,
                  9, 11, 22, 7, 13, 19, 10, 15,
                  17, 8, 16, 21, 7, 12, 18, 9],
    "cangkir": [1, 1, 2, 1, 1, 3, 1, 1,
                2, 1, 1, 3, 1, 1, 2, 1,
                1, 3, 1, 1, 2, 1, 1, 3],
    "durasi": [110, 15, 160, 125, 20, 185, 130, 12,
               170, 105, 18, 200, 120, 22, 155, 135,
               10, 190, 115, 25, 175, 140, 14, 205],
})

fitur = ["belanja", "frekuensi", "cangkir", "durasi"]
X = StandardScaler().fit_transform(kafe[fitur])
skor = PCA(n_components=2).fit_transform(X)

fig, ax = plt.subplots(figsize=(7, 5))
ax.scatter(skor[:, 0], skor[:, 1], s=45, color="#4a7ba6")
ax.set_xlabel("Komponen utama 1 (arah variansi terbesar)")
ax.set_ylabel("Komponen utama 2")
ax.set_title("24 pelanggan kafe pada bidang PCA - data tanpa label")
ax.grid(alpha=0.3)
plt.tight_layout()
plt.show()

Bayangkan hasilnya di layar: 24 titik biru tersebar di bidang ber-sumbu PC1 (mendatar) dan PC2 (tegak), dan tiga konsentrasi terbaca jelas tanpa perlu satu pun label. Di sisi kanan berkerumun titik-titik bernilai PC1 tinggi — pelanggan yang datang jarang tetapi sekali datang belanja besar, minum beberapa cangkir, dan menghabiskan berjam-jam. Di kiri-atas berkumpul titik dengan PC2 tinggi — tipe mampir nyaris setiap hari untuk sekali sepoci singkat. Di kiri-bawah berbaris sisanya — belanja kecil, frekuensi sedang, tetapi duduk paling lama. Mata kita kini bisa “melihat” data empat dimensi sebagai peta dua dimensi yang masih memuat hampir seluruh informasinya; dari peta inilah clustering atau diskusi dengan tim pemasaran bisa dimulai.

Positif dan Negatifnya dalam Alur Kerja #

Dalam kerangka unsupervised, PCA mengisi tiga peran sekaligus: visualisasi seperti yang baru kita kerjakan, kompresi fitur sebelum masuk pipeline modeling (pembahasan mendalam ada di chapter Reduksi Dimensi pada Section Feature Engineering), dan peredaman derau dengan membuang komponen bervariansi kecil. Berbeda dengan K-Means, PCA tidak punya unsur acak — tidak ada random_state yang perlu dipegang; hasilnya identik setiap dijalankan pada data yang sama. Harganya ada dua: komponen baru kehilangan satuan asli sehingga harus dibaca lewat muatannya, dan ia hanya menjalin hubungan linear antar fitur.

Rangkuman #

  • PCA memutar sumbu data ke arah variansi terbesar tanpa melibatkan label apa pun — teknik unsupervised yang murni bekerja dari struktur data itu sendiri.
  • Standarisasi fitur wajib dikerjakan lebih dulu; tanpa itu, fitur berskala besar mencuri seluruh perhatian komponen pertama.
  • explained_variance_ratio_ memberi tahu pangsa informasi tiap komponen; pada data kafe, PC1 (76,39%) + PC2 (20,25%) menangkap 96,65% variansi, cukup untuk pedoman kumulatif 85-95%.
  • Muatan komponen (components_) dibaca sebagai kombinasi linear fitur asli — dua arah gaya hidup pelanggan kafe tersusun darinya, tanda absolutnya bebas dibalik.
  • PCA(n_components=2) + scatter plot menjadi jendela untuk melihat struktur data berdimensi banyak; keterbatasannya adalah sifat linear yang tidak sanggup menangkap bentuk melengkung.

Dua komponen PCA tadi sudah menolong untuk data kafe yang struktur hubungan fiturnya lumayan lurus. Tetapi bagaimana bila benang kusutnya nonlinear — cluster berbentuk cincin, lengkung, atau lembaran yang terlipat? Chapter berikutnya melebarkan kotak peralatan reduksi dimensi: membandingkan PCA dengan feature selection, memanfaatkan PCA untuk peredaman derau, dan berkenalan konseptual dengan teknik nonlinear t-SNE beserta jebakan-jebakannya. Lanjut ke chapter Reduksi Dimensi Nonlinear .

Referensi #

  1. scikit-learn — Preprocessing Data
  2. NumPy — Singular Value Decomposition
  3. Matplotlib — Plot Types