TL;DR
PCA (Principal Component Analysis) adalah teknik yang meringkas banyak kolom numerik yang saling berkaitan jadi sedikit kolom baru bernama komponen utama, sambil nahan sebanyak mungkin variasi data aslinya. Tiap komponen adalah kombinasi berbobot dari kolom asli, dan komponen pertama selalu nangkap variasi terbesar. Sebelum jalanin PCA, kolomnya wajib distandardisasi dulu supaya kolom bersatuan rupiah nggak ngedominasi kolom bersatuan persen. Hasilnya dibaca lewat explained variance ratio dan loading tiap kolom.
PCA adalah cara meringkas banyak kolom angka yang saling berkaitan jadi beberapa kolom baru yang lebih sedikit, tanpa buang terlalu banyak informasi.
Kepanjangannya Principal Component Analysis. Kolom baru hasilnya disebut komponen utama.
Kasus yang paling sering: kamu punya 28 kolom numerik per toko, dan setengahnya sebenernya ngomongin hal yang sama. Omzet, jumlah transaksi, jumlah pelanggan, dan jumlah item terjual bakal naik turun bareng. PCA ngerapihin tumpang tindih itu.
Di bawah ini cara pakainya, cara baca hasilnya, dan kapan sebaiknya kamu nggak pakai PCA sama sekali.
PCA nyari arah baru di dalam datamu yang variasinya paling besar, lalu bikin kolom baru sepanjang arah itu. Komponen pertama nangkap variasi terbesar. Komponen kedua nangkap sisa terbesar berikutnya, dan seterusnya. Tiap komponen adalah campuran berbobot dari semua kolom asli.
Tiga situasi yang bikin PCA kepakai:
Yang PCA nggak lakuin: milih kolom mana yang penting. Dia nggak buang kolom, dia nyampur semuanya. Kalau kamu butuh tau kolom mana yang boleh dihapus, itu urusan feature selection, beda barang.
Karena PCA ngejar variasi terbesar, dan besarnya variasi ikut satuan kolomnya. Kolom omzet dalam rupiah nilainya jutaan. Kolom margin dalam persen nilainya puluhan. Tanpa disamain dulu skalanya, komponen pertama bakal hampir seluruhnya nyerap kolom omzet, dan kolom lain nggak kebagian peran.
Cara nyamainnya pakai StandardScaler: tiap kolom diubah jadi rata-rata nol dan simpangan baku satu.
from sklearn.preprocessing import StandardScaler
from sklearn.decomposition import PCA
from sklearn.pipeline import make_pipeline
pipe = make_pipeline(StandardScaler(), PCA(n_components=4))
skor = pipe.fit_transform(X)
Bungkus dalam pipeline biar penskalaannya ikut kebawa waktu kamu terapin ke data baru. Ini kesalahan yang sering kejadian: scaler dilatih ulang di data uji, lalu hasilnya bergeser.
Anggap kamu punya tabel toko berisi satu baris per cabang, dengan kolom omzet bulanan, jumlah transaksi, rata-rata nilai belanja, margin, jumlah SKU, luas toko, jumlah karyawan, dan seterusnya.
Kode lengkapnya:
import pandas as pd
from sklearn.preprocessing import StandardScaler
from sklearn.decomposition import PCA
numerik = toko.select_dtypes('number').dropna()
X = StandardScaler().fit_transform(numerik)
pca = PCA()
skor = pca.fit_transform(X)
rasio = pd.Series(
pca.explained_variance_ratio_,
index=[f'PC{i+1}' for i in range(pca.n_components_)]
)
print(rasio.round(3))
print(rasio.cumsum().round(3))
Atribut explained_variance_ratio_ ngasih tau porsi variasi yang ditahan tiap komponen. Jumlah semuanya selalu 1. Penjelasan resmi tiap parameter ada di dokumentasi PCA scikit-learn.
Kalau kamu mau langsung nentuin target variasi, isi n_components pakai desimal:
pca = PCA(n_components=0.90)
skor = pca.fit_transform(X)
print(pca.n_components_) # jumlah komponen yang kepilih otomatis
Dua hal yang kamu lihat: berapa variasi yang ketahan, dan kolom apa yang nyusun tiap komponen.
Buat yang kedua, lihat matriks loading. Tiap angka nunjukin seberapa besar kolom asli nyumbang ke komponen itu.
loading = pd.DataFrame(
pca.components_.T,
index=numerik.columns,
columns=[f'PC{i+1}' for i in range(pca.n_components_)]
)
print(loading['PC1'].sort_values(ascending=False).head(5))
Kalau lima loading teratas PC1 isinya omzet, jumlah transaksi, jumlah pelanggan, dan jumlah item, komponen itu wajar kamu sebut ukuran toko. Kasih nama begitu di laporan. Sebutan PC1 nggak berarti apa-apa buat orang di luar tim data.
Tanda plus minus pada loading nggak punya arti mutlak. Arah komponen bisa kebalik tanpa ngubah hasilnya. Yang penting pola relatif antar kolom.
Aku olah data 62 cabang toko sembako di Jawa Barat dengan 28 kolom numerik per cabang. Isinya angka penjualan, stok, karyawan, dan operasional selama enam bulan.
Hasil PCA setelah standardisasi:
| Komponen | Variasi ditahan | Kumulatif | Loading terbesar | Nama yang aku pakai |
|---|---|---|---|---|
| PC1 | 41,3% | 41,3% | omzet, jumlah transaksi, jumlah SKU | Ukuran toko |
| PC2 | 22,6% | 63,9% | margin, rasio produk non pangan | Bauran produk |
| PC3 | 14,1% | 78,0% | rasio transaksi akhir pekan, jam sibuk sore | Pola waktu ramai |
| PC4 | 9,2% | 87,2% | frekuensi kehabisan stok, jeda kirim | Kesehatan pasokan |
Empat komponen nyimpen 87,2% variasi dari 28 kolom asli. Sisanya 24 komponen cuma nyumbang 12,8% total.
Yang menarik ada di PC2. Sepuluh cabang dengan skor PC2 tertinggi punya margin rata-rata 19,4%, sementara sepuluh cabang dengan skor terendah cuma 11,8%. Selisih 7,6 poin persen itu nggak kelihatan waktu aku lihat kolom margin sendirian, karena cabang bermargin tinggi tersebar di semua ukuran toko.
Waktu skor PC1 dan PC2 aku gambar jadi grafik sebar, muncul empat kelompok yang cukup jelas. Kelompok itu jadi dasar segmentation cabang yang dipakai buat nentuin bauran stok, gantiin pengelompokan lama yang cuma pakai omzet.
Empat situasi yang bikin PCA malah nyusahin:
Kolomnya cuma sedikit dan udah gampang dibaca. Kalau kamu punya 6 kolom yang semuanya jelas artinya, meringkasnya jadi 3 komponen cuma nambah kebingungan.
Kamu butuh jelasin pengaruh tiap kolom. Komponen adalah campuran belasan kolom. Kalau atasan nanya seberapa besar pengaruh margin, kamu nggak bisa jawab langsung dari model yang dibangun di atas komponen. Buat kasus itu, regression biasa dengan kolom aslinya lebih berguna.
Data kamu mayoritas kategori. PCA ngandelin hubungan linear antar angka. Kolom nol satu hasil one-hot bisa dipaksa masuk, tapi hasilnya susah dimaknai.
Kolom yang penting justru yang variasinya kecil. PCA milih arah berdasarkan besar variasi, bukan berdasarkan relevansi ke target. Kolom yang nilainya hampir seragam tapi menentukan bisa kebuang di komponen belakang.
PCA adalah cara meringkas banyak kolom angka yang saling berkaitan jadi beberapa kolom baru yang lebih sedikit. Kolom baru itu namanya komponen utama, isinya campuran berbobot dari kolom aslimu. Komponen pertama dipilih supaya nangkap variasi paling besar, komponen kedua nangkap sisa variasi terbesar berikutnya, dan seterusnya. Tujuannya bikin data lebih ringkas tanpa buang terlalu banyak informasi.
Karena PCA ngejar variasi terbesar, dan variasi itu ikut satuan kolomnya. Kolom omzet dalam rupiah punya angka jutaan, kolom margin dalam persen cuma puluhan. Tanpa standardisasi, komponen pertama bakal hampir seluruhnya nyerap kolom omzet doang dan kolom lain nggak kebagian. StandardScaler dari scikit-learn nyamain skalanya jadi rata-rata nol dan simpangan baku satu.
Ambil komponen secukupnya sampai explained variance kumulatifnya mencapai target kamu, biasanya antara 80% dan 95%. Cara lain, lihat scree plot dan berhenti di titik tempat garisnya mulai landai. Kalau tujuannya cuma buat divisualisasikan, ambil dua atau tiga aja supaya bisa digambar. Nggak ada angka baku, jadi sebutin alasan pilihanmu waktu lapor.
Nggak cocok langsung. PCA kerjanya di data numerik dan ngandelin hubungan linear antar kolom. Kolom kategori yang di-one-hot jadi nol dan satu bisa dipaksa masuk, tapi hasilnya sering susah dibaca. Buat data kategori murni, cari teknik yang emang dirancang buat itu, misalnya multiple correspondence analysis. Atau ubah kategorinya jadi angka yang bermakna dulu, kayak rata-rata belanja per kota.
Jangan sebut nama komponennya. Kasih nama sesuai isi loading terbesarnya, misalnya komponen pertama yang didominasi omzet dan jumlah transaksi bisa kamu sebut ukuran toko. Tunjukkan satu grafik sebar dua komponen pertama dengan titik yang diwarnai per kelompok. Orang bisnis butuh nama dan gambar, bukan tabel loading berisi angka desimal.
Tiga hal yang perlu kamu inget.
Standardisasi dulu, selalu. Tanpa itu hasilnya cuma nyeritain kolom dengan angka terbesar.
Baca loading dan kasih nama tiap komponen sebelum dilaporkan. Komponen tanpa nama nggak dipakai siapa-siapa.
Sebutin berapa persen variasi yang ketahan. Angka itu yang bikin orang tau seberapa banyak yang hilang.
Mau bagian visualnya rapi juga? Ada cheat sheet memilih grafik yang bisa nemenin waktu nyusun grafik sebar hasil PCA. Buat kamu yang lagi nyusun prioritas kerja di tim data baru, cek rencana 90 hari pertama sebagai analis data.
Punya tabel dengan lebih dari 15 kolom numerik? Coba jalanin PCA-nya minggu ini, lalu lihat berapa komponen yang cukup buat nahan 85% variasinya.
Mau praktek langsung? Mulai latihan SQL gratis
Latihan interaktif, langsung di browser.
Kolom datetime nyimpen tanggal, jam, hari, semuanya nempel jadi satu. Accessor .dt di pandas ngeluarin tiap bagian jadi kolom sendiri buat dianalisa.
Nama toko ketik campur huruf besar-kecil, spasi nyasar di ujung, atau kode produk nempel jadi satu. Accessor .str di pandas ngerapiin semua itu tanpa loop.
Model machine learning cuma ngerti angka, bukan teks kayak merah atau biru. get_dummies ngubah kolom kategori jadi kolom 0/1 dalam satu baris kode.