1 Sebelum Mulai

Hari ini kita kenalan dengan machine learning lewat praktik langsung di R, tanpa menghafal definisi. Alurnya:

  1. Pengantar: komputer belajar dari data
  2. Statistika vs Machine Learning
  3. Supervised vs Unsupervised
  4. Supervised: regresi dan klasifikasi
  5. Unsupervised: clustering, association, dimensionality reduction
  6. Latihan

1.1 Kamus istilah singkat

Istilah Artinya Contoh
Peubah / input (X) Hal yang kita tahu dan dipakai untuk menebak Luas tanah, jumlah kamar
Respon / output (Y) Hal yang ingin ditebak Harga rumah
Model “Resep” yang menghubungkan X ke Y Harga = 12 x luas + …
Data training Data untuk belajar (soal latihan) 70% data
Data testing Data untuk menguji (soal ujian baru) 30% data
Overfitting Model “menghafal” data latihan, gagal di data baru Hafal kunci jawaban, bingung saat ujian
Supervised Belajar dengan kunci jawaban (ada Y) Menebak harga rumah
Unsupervised Belajar tanpa kunci jawaban (tidak ada Y) Mengelompokkan pelanggan

Analogi yang kita pakai terus: machine learning itu seperti siswa. Ia belajar dari soal latihan (training), lalu dinilai lewat ujian soal baru (testing). Siswa yang bagus bukan yang nilai latihannya sempurna, tetapi yang nilai ujiannya bagus.

1.2 Persiapan

paket <- c("rpart", "randomForest")
baru <- paket[!(paket %in% installed.packages()[, "Package"])]
if (length(baru) > 0) install.packages(baru)

library(rpart)
library(randomForest)

Kita sering memakai data simulasi dengan set.seed() supaya hasil di laptop kalian sama dengan modul. Kalau angkanya beda, kemungkinan ada baris yang terlewat dijalankan.


2 Pengantar: Komputer yang Belajar dari Data

Machine learning adalah bagian dari kecerdasan buatan (AI): komputer membangun model dari data contoh supaya keputusan bisa diambil otomatis. Contoh sehari-hari: filter spam di email, rekomendasi video YouTube, dan bank yang menandai transaksi mencurigakan. Tidak ada yang menulis aturannya satu per satu. Komputernya belajar dari data.

Kita coba dengan data iris (ukuran bunga dari tiga spesies). Tugasnya: menebak spesies dari ukuran bunga.

Cara lama: kita tulis aturan sendiri. Dari boxplot, panjang kelopak (Petal.Length) terlihat membedakan spesies.

boxplot(Petal.Length ~ Species, data = iris, col = c("lightgreen", "lightblue", "salmon"),
        main = "Panjang Kelopak per Spesies", ylab = "Petal.Length (cm)")

tebak_manual <- function(x) {
  ifelse(x < 2.5, "setosa", ifelse(x < 4.8, "versicolor", "virginica"))
}
mean(tebak_manual(iris$Petal.Length) == iris$Species)   # akurasi
## [1] 0.9533333

Lumayan, tetapi angka 2,5 dan 4,8 itu kita tebak dengan mata. Kalau datanya punya 50 peubah dan sejuta baris, cara ini mustahil.

Cara machine learning: komputer yang mencari aturannya. Kita pakai decision tree (pohon keputusan), mirip permainan “20 pertanyaan”: komputer bertanya berturut-turut sampai tiba pada tebakan.

pohon <- rpart(Species ~ ., data = iris, method = "class")
plot(pohon, margin = 0.1); text(pohon, use.n = TRUE, cex = 0.8)

Batas-batasnya dihitung dari data, bukan ditebak. Itulah inti machine learning.


3 Statistika vs Machine Learning

Keduanya memakai data dan sering memakai model yang sama. Bedanya ada di pertanyaan yang dijawab. Analogi: dua orang melihat data penjualan es teh. Statistikawan bertanya, “Apakah hujan benar-benar memengaruhi penjualan, dan seberapa besar?” Praktisi machine learning bertanya, “Besok terjual berapa, supaya saya tahu harus stok berapa?”

3.1 Studi Kasus 1: Regresi Linear dari Dua Sudut Pandang

Kita buat data simulasi 300 rumah. Harga (juta rupiah) dibentuk dari luas, jumlah kamar, dan jarak ke pusat kota, ditambah noise.

set.seed(2025)
n <- 300
luas  <- round(runif(n, 36, 250))
kamar <- sample(1:5, n, replace = TRUE, prob = c(.1, .3, .35, .15, .1))
jarak <- round(runif(n, 1, 25), 1)
harga <- 150 + 12 * luas + 80 * kamar - 25 * jarak + rnorm(n, 0, 150)

rumah <- data.frame(luas, kamar, jarak, harga)
head(rumah)
##   luas kamar jarak    harga
## 1  193     3   5.4 2450.970
## 2  138     3  20.7 1571.963
## 3  146     2   9.8 1657.955
## 4  143     3  10.0 1966.908
## 5  203     2  13.9 2438.208
## 6  144     2  13.9 1710.747

Sudut pandang statistika: pakai seluruh data, lalu baca koefisien dan p-value untuk tahu peubah mana yang berpengaruh.

summary(lm(harga ~ luas + kamar + jarak, data = rumah))
## 
## Call:
## lm(formula = harga ~ luas + kamar + jarak, data = rumah)
## 
## Residuals:
##     Min      1Q  Median      3Q     Max 
## -447.08  -99.33    2.39  101.35  472.41 
## 
## Coefficients:
##             Estimate Std. Error t value Pr(>|t|)    
## (Intercept)  95.8554    36.6350   2.616  0.00934 ** 
## luas         12.2013     0.1458  83.686  < 2e-16 ***
## kamar        76.9649     8.0830   9.522  < 2e-16 ***
## jarak       -22.2878     1.3606 -16.381  < 2e-16 ***
## ---
## Signif. codes:  0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
## 
## Residual standard error: 159.6 on 296 degrees of freedom
## Multiple R-squared:  0.9616, Adjusted R-squared:  0.9612 
## F-statistic:  2468 on 3 and 296 DF,  p-value: < 2.2e-16

Misalnya koefisien luas sekitar 12: tiap tambahan 1 m², harga naik sekitar 12 juta. Koefisien jarak negatif: makin jauh dari pusat kota, makin murah. Fokusnya memahami hubungan antar peubah.

Sudut pandang machine learning: yang penting adalah seberapa akurat prediksi untuk rumah baru. Maka data dibagi dua: 70% untuk training, 30% untuk testing yang tidak boleh disentuh saat membentuk model. Akurasi diukur dengan RMSE (rata-rata “meleset” prediksi dalam satuan harga; makin kecil makin bagus).

set.seed(123)
idx_train <- sample(1:n, size = 0.7 * n)
train <- rumah[idx_train, ]
test  <- rumah[-idx_train, ]

rmse <- function(aktual, prediksi) sqrt(mean((aktual - prediksi)^2))

model_ml  <- lm(harga ~ luas + kamar + jarak, data = train)
pred_test <- predict(model_ml, newdata = test)
rmse(test$harga, pred_test)
## [1] 161.4533
plot(test$harga, pred_test, pch = 19, col = "steelblue",
     xlab = "Harga sebenarnya (juta)", ylab = "Harga prediksi (juta)",
     main = "Prediksi vs Aktual pada Data Testing")
abline(0, 1, col = "red", lwd = 2)

Makin dekat titik ke garis merah, makin bagus prediksinya.

Poin penting. Modelnya sama persis (lm). Yang beda adalah pertanyaannya: statistika bertanya “apa hubungannya?”, machine learning bertanya “seberapa baik prediksinya untuk data baru?”

3.1.1 Kenapa harus ada data testing?

Karena model yang terlalu rumit bisa menghafal data latihan (overfitting), seperti siswa yang hafal kunci jawaban latihan tapi bingung saat soal ujian berubah. Buktikan sendiri: kita cocokkan polinomial berderajat 1 sampai 12 pada data kecil.

set.seed(1)
x <- runif(40, 0, 10)
y <- 5 + 2 * sin(x) + 0.5 * x + rnorm(40, 0, 1)
dat <- data.frame(x, y)
idx <- sample(1:40, 20)
dtr <- dat[idx, ]; dte <- dat[-idx, ]

derajat <- 1:12
hasil <- t(sapply(derajat, function(k) {
  m <- lm(y ~ poly(x, k), data = dtr)
  c(train = rmse(dtr$y, predict(m, dtr)), test = rmse(dte$y, predict(m, dte)))
}))

matplot(derajat, hasil, type = "b", pch = 19, lty = 1, col = c("blue", "red"),
        xlab = "Derajat polinomial (kerumitan model)", ylab = "RMSE")
legend("topleft", c("Training", "Testing"), col = c("blue", "red"), lty = 1, pch = 19)

RMSE training terus turun, tetapi RMSE testing turun lalu naik lagi. Kalau hanya melihat data training, kita akan mengira model paling rumit yang terbaik, padahal justru paling buruk untuk data baru.

Diskusi 1. Pada derajat berapa RMSE testing paling kecil? Apa yang terjadi pada RMSE training di derajat yang sama?

3.2 Studi Kasus 2: Mencari Gen yang Berpengaruh

Bayangkan data ekspresi gen dari dua kelompok (misalnya pasien sakit dan sehat). Dari 100 gen, hanya 10 yang benar-benar berbeda antar kelompok (sisanya noise). Ibarat mencari 10 “jarum” di antara 100 “jerami”. Kita adu dua pendekatan:

  • Statistika: uji-t per gen, lihat p-value.
  • Machine learning: random forest, lihat feature importance (seberapa besar kontribusi gen dalam memisahkan kelompok).
buat_data_gen <- function(n_per = 30, p = 100, k = 10) {
  perbedaan <- seq(1.6, 0.4, length.out = k)
  kelompok  <- factor(rep(c("A", "B"), each = n_per))
  X <- matrix(rnorm(2 * n_per * p), ncol = p)
  for (j in 1:k) X[kelompok == "B", j] <- X[kelompok == "B", j] + perbedaan[j]
  colnames(X) <- paste0("G", 1:p)
  list(X = X, kelompok = kelompok)
}

set.seed(1)
d <- buat_data_gen()

pval <- apply(d$X, 2, function(v) t.test(v ~ d$kelompok)$p.value)
rf   <- randomForest(x = d$X, y = d$kelompok, ntree = 100, importance = TRUE)
pentingnya <- importance(rf, type = 2)[, 1]

top10_uji <- names(sort(pval))[1:10]
top10_rf  <- names(sort(pentingnya, decreasing = TRUE))[1:10]
benar     <- paste0("G", 1:10)

c(benar_uji_klasik = sum(top10_uji %in% benar),
  benar_random_forest = sum(top10_rf %in% benar))
##    benar_uji_klasik benar_random_forest 
##                   7                   8

Satu percobaan bisa kebetulan bagus atau jelek, seperti melempar koin sekali. Maka kita ulang 100 kali lalu lihat rata-ratanya (sekitar 10 detik).

satu_percobaan <- function() {
  d <- buat_data_gen()
  pv  <- apply(d$X, 2, function(v) t.test(v ~ d$kelompok)$p.value)
  rf  <- randomForest(d$X, d$kelompok, ntree = 100, importance = TRUE)
  imp <- importance(rf, type = 2)[, 1]
  c(uji_klasik    = sum(order(pv)[1:10] <= 10),
    random_forest = sum(order(imp, decreasing = TRUE)[1:10] <= 10))
}

set.seed(42)
hasil_sim <- t(replicate(100, satu_percobaan()))
colMeans(hasil_sim)
##    uji_klasik random_forest 
##          7.91          7.18
boxplot(hasil_sim, col = c("lightblue", "lightgreen"),
        ylab = "Jumlah gen benar yang ditemukan (maks. 10)")

Kedua metode sama-sama baik dan sama-sama tidak sempurna. Bedanya hanya bahasa: statistika bicara p-value dan signifikansi, machine learning bicara kontribusi prediktif.

Statistika Machine Learning
Pertanyaan Apa hubungannya? Signifikan? Seberapa baik prediksi data baru?
Data training/testing Tidak wajib Wajib dipisah
Ukuran sukses p-value, interpretasi koefisien Akurasi / RMSE di data testing

Gabungan keduanya disebut Statistical Learning. Keduanya bukan lawan, tetapi saling melengkapi.


4 Supervised vs Unsupervised

  • Supervised: ada input dan output (Y). Tugasnya memprediksi Y dari X.
  • Unsupervised: hanya ada input, tanpa Y. Tugasnya menemukan struktur di dalam data.

Pada iris: kalau kita punya kolom Species (jawaban), itu supervised. Kalau kolom itu kita sembunyikan dan hanya bertanya “apakah bunga-bunga ini terlihat berkelompok?”, itu unsupervised.

plot(iris$Petal.Length, iris$Petal.Width, pch = 19,
     xlab = "Petal.Length", ylab = "Petal.Width",
     main = "Tanpa label: terlihat ada kelompok?")

Kelompok Tugas Contoh
Supervised Regression (Y angka) Prediksi harga rumah, deteksi penipuan
Supervised Classification (Y kategori) Diagnosis penyakit, prediksi klik iklan
Unsupervised Clustering Segmentasi pelanggan
Unsupervised Association Barang yang sering dibeli bersamaan
Unsupervised Dimensionality reduction Meringkas banyak peubah untuk divisualisasikan

5 Supervised Learning

5.1 Regression: Y berupa angka

Kita pakai lagi model harga rumah dari Studi Kasus 1. Regresi punya beberapa kegunaan.

Prediksi kasus baru. Tiga rumah baru datang, berapa harganya?

rumah_baru <- data.frame(luas = c(60, 120, 200), kamar = c(2, 3, 4), jarak = c(15, 8, 3))
cbind(rumah_baru, harga_prediksi = round(predict(model_ml, rumah_baru)))
##   luas kamar jarak harga_prediksi
## 1   60     2    15            663
## 2  120     3     8           1629
## 3  200     4     3           2794

Aturan yang mudah dipahami. Koefisien model bisa dibaca manusia, jadi bisa dijelaskan ke orang lain.

round(coef(model_ml), 1)
## (Intercept)        luas       kamar       jarak 
##       123.0        12.2        74.2       -22.7

Deteksi outlier. Data yang jauh dari pola model patut dicurigai (misalnya transaksi penipuan). Kita sengaja mengubah harga tiga rumah menjadi tidak wajar (misalnya rumah kecil yang harganya tiba-tiba miliaran), lalu lihat apakah model bisa menemukannya lewat residual (selisih aktual dan prediksi) yang mencolok.

set.seed(99)
rumah_aneh <- rumah
baris_aneh <- sample(1:n, 3)
rumah_aneh$harga[baris_aneh] <- rumah_aneh$harga[baris_aneh] + c(1500, -1400, 1800)

m_aneh    <- lm(harga ~ luas + kamar + jarak, data = rumah_aneh)
resid_std <- rstandard(m_aneh)

sort(baris_aneh)                 # rumah yang sengaja kita ubah
## [1]  22 246 289
which(abs(resid_std) > 3)        # yang terdeteksi model
##  22 246 289 
##  22 246 289
plot(resid_std, pch = 19, col = ifelse(abs(resid_std) > 3, "red", "grey60"),
     ylab = "Residual baku", main = "Deteksi Outlier")
abline(h = c(-3, 3), lty = 2)

Titik merah adalah kasus yang tidak dijelaskan baik oleh aturan model.

5.2 Classification: Y berupa kategori

Y-nya berupa kelas: sakit/sehat, klik/tidak, spesies A/B/C. Contoh nyata: buka kunci HP dengan wajah, membaca tulisan tangan, asisten suara. Kita praktikkan di iris dengan alur yang benar: bagi data, latih di training, uji di testing.

set.seed(2025)
idx <- sample(1:nrow(iris), size = 0.7 * nrow(iris))
iris_train <- iris[idx, ]
iris_test  <- iris[-idx, ]

pohon_iris <- rpart(Species ~ ., data = iris_train, method = "class")
plot(pohon_iris, margin = 0.1); text(pohon_iris, use.n = TRUE, cex = 0.8)

prediksi <- predict(pohon_iris, newdata = iris_test, type = "class")
tabel <- table(Prediksi = prediksi, Aktual = iris_test$Species)
tabel
##             Aktual
## Prediksi     setosa versicolor virginica
##   setosa         15          0         0
##   versicolor      0         15         0
##   virginica       0          4        11
sum(diag(tabel)) / sum(tabel)   # akurasi
## [1] 0.9111111

Tabel itu disebut confusion matrix. Angka di diagonal adalah tebakan benar, di luar diagonal adalah kesalahan. Akurasi adalah proporsi tebakan yang benar.

Diskusi 2. Spesies mana yang paling sering tertukar? Lalu, apakah akurasi di data training akan lebih tinggi atau lebih rendah daripada di testing? Hubungkan dengan overfitting.


6 Unsupervised Learning

Tidak ada Y yang ditebak. Analogi: membereskan lemari pakaian tanpa label, kamu sendiri yang menentukan mana yang mirip.

6.1 Clustering: segmentasi pelanggan

Clustering mengelompokkan objek sehingga yang satu kelompok mirip dan antar kelompok berbeda. Contoh akrab: YouTube ingin menampilkan iklan yang tepat, jadi pengguna dikelompokkan berdasarkan usia, kebiasaan menonton, dan kebiasaan belanja.

Kita buat data 300 pengguna dengan tiga peubah: usia, jam_nonton (per minggu), dan belanja (ribu rupiah per bulan). Ada tiga kelompok tersembunyi, tetapi algoritma tidak diberi tahu.

buat_kelompok <- function(n, usia, jam, belanja) {
  data.frame(usia       = round(rnorm(n, usia[1], usia[2])),
             jam_nonton = round(rnorm(n, jam[1], jam[2]), 1),
             belanja    = round(rnorm(n, belanja[1], belanja[2])))
}

set.seed(11)
pengguna <- rbind(
  buat_kelompok(100, c(24, 4), c(18, 4), c(400, 120)),
  buat_kelompok(100, c(30, 5), c(10, 3), c(1500, 300)),
  buat_kelompok(100, c(38, 6), c(6, 2),  c(500, 150))
)
pengguna <- pengguna[sample(1:300), ]
rownames(pengguna) <- NULL
head(pengguna)
##   usia jam_nonton belanja
## 1   38        2.0     522
## 2   23       19.0     243
## 3   37        2.3     684
## 4   28       14.0    1127
## 5   25       10.7    2408
## 6   31        7.5     682

Langkah 1: standarisasi. Satuan peubahnya beda jauh (usia puluhan, belanja ribuan), jadi belanja akan mendominasi kalau tidak disamakan skalanya.

pengguna_z <- scale(pengguna)

Langkah 2: tentukan jumlah kelompok (metode elbow). Coba k = 1 sampai 8, lalu cari titik “siku” di mana penurunannya mulai melandai.

set.seed(1)
wss <- sapply(1:8, function(k) kmeans(pengguna_z, centers = k, nstart = 20)$tot.withinss)
plot(1:8, wss, type = "b", pch = 19, xlab = "Banyak kelompok (k)",
     ylab = "Total within sum of squares", main = "Metode Elbow")
abline(v = 3, lty = 2, col = "red")

Sikunya di k = 3.

Langkah 3: jalankan k-means. Cara kerjanya: bayangkan 3 “pos pengumpulan” di peta. (1) Tiap pengguna bergabung ke pos terdekat, (2) tiap pos pindah ke titik tengah anggotanya, (3) ulangi sampai posnya tidak banyak bergeser. nstart = 25 artinya mencoba 25 posisi awal dan memilih yang terbaik.

set.seed(1)
km <- kmeans(pengguna_z, centers = 3, nstart = 25)

plot(pengguna$jam_nonton, pengguna$belanja, col = km$cluster, pch = 19,
     xlab = "Jam nonton per minggu", ylab = "Belanja online (ribu Rp)",
     main = "Hasil Segmentasi (k-means)")
legend("topright", legend = paste("Segmen", 1:3), col = 1:3, pch = 19)

Langkah 4: beri arti pada segmen. Algoritma hanya memberi nomor. Memberi nama adalah tugas manusia, caranya lihat rata-rata tiap peubah per segmen.

aggregate(pengguna, by = list(Segmen = km$cluster), FUN = mean)
##   Segmen     usia jam_nonton   belanja
## 1      1 29.71875  10.219792 1549.7708
## 2      2 23.52525  18.640404  393.7778
## 3      3 38.46667   6.155238  511.5238

Contoh tafsirannya (nomor segmen bisa tertukar, cocokkan dengan angkanya):

  • Muda, nonton banyak, belanja rendah: cocok untuk iklan game atau layanan streaming terjangkau.
  • Belanja sangat tinggi: cocok untuk iklan produk premium.
  • Usia lebih tua, nonton sedikit: cocok untuk iklan singkat dan langsung ke inti.

Itulah gunanya segmentasi: tiap segmen mendapat kampanye yang berbeda.

6.2 Association: Market Basket Analysis

Association mencari barang yang sering dibeli bersamaan, lalu hasilnya dipakai untuk menata rak, membuat paket hemat, atau menentukan promosi. Kita buat 300 struk belanja minimarket (1 = dibeli, 0 = tidak) dengan beberapa kebiasaan: yang beli mie instan cenderung beli telur, yang beli roti cenderung beli susu, dan seterusnya.

set.seed(7)
n_trx <- 300
barang <- c("mie instan", "telur", "roti", "susu", "kopi",
            "gula", "teh botol", "keripik", "air mineral", "sabun")

keranjang <- matrix(0, nrow = n_trx, ncol = length(barang), dimnames = list(NULL, barang))
keranjang[, "mie instan"]  <- rbinom(n_trx, 1, .35)
keranjang[, "telur"]       <- rbinom(n_trx, 1, ifelse(keranjang[, "mie instan"] == 1, .60, .15))
keranjang[, "roti"]        <- rbinom(n_trx, 1, .30)
keranjang[, "susu"]        <- rbinom(n_trx, 1, ifelse(keranjang[, "roti"] == 1, .55, .15))
keranjang[, "kopi"]        <- rbinom(n_trx, 1, .25)
keranjang[, "gula"]        <- rbinom(n_trx, 1, ifelse(keranjang[, "kopi"] == 1, .60, .10))
keranjang[, "teh botol"]   <- rbinom(n_trx, 1, .30)
keranjang[, "keripik"]     <- rbinom(n_trx, 1, ifelse(keranjang[, "teh botol"] == 1, .50, .12))
keranjang[, "air mineral"] <- rbinom(n_trx, 1, .40)
keranjang[, "sabun"]       <- rbinom(n_trx, 1, .10)
head(keranjang, 5)
##      mie instan telur roti susu kopi gula teh botol keripik air mineral sabun
## [1,]          1     1    1    1    0    1         0       1           1     0
## [2,]          0     0    0    0    1    0         1       1           0     1
## [3,]          0     1    0    1    0    0         0       0           0     0
## [4,]          0     0    1    0    0    0         1       0           0     0
## [5,]          0     0    0    0    0    0         0       1           0     0

Pola “A dibeli, lalu B juga dibeli” dinilai dengan tiga ukuran:

  • Support: proporsi struk yang memuat A dan B sekaligus (seberapa sering). Support 0,15 artinya 15 dari 100 struk.
  • Confidence (A → B): dari struk yang ada A, berapa persen yang juga ada B (seberapa kuat).
  • Lift (A → B): confidence dibagi proporsi B secara umum (apakah A dan B benar-benar berhubungan). Lift > 1 berarti berhubungan positif, = 1 tidak berhubungan.
sup_tunggal <- colMeans(keranjang)
sup_pasang  <- crossprod(keranjang) / n_trx

aturan <- expand.grid(A = barang, B = barang, stringsAsFactors = FALSE)
aturan <- aturan[aturan$A != aturan$B, ]
aturan$support    <- mapply(function(a, b) sup_pasang[a, b], aturan$A, aturan$B)
aturan$confidence <- aturan$support / sup_tunggal[aturan$A]
aturan$lift       <- aturan$confidence / sup_tunggal[aturan$B]

aturan <- aturan[aturan$support >= 0.05, ]
aturan <- aturan[order(-aturan$lift), ]
rownames(aturan) <- NULL
aturan[, c("support", "confidence", "lift")] <- round(aturan[, c("support", "confidence", "lift")], 2)
head(aturan, 8)
##            A          B support confidence lift
## 1       gula       kopi    0.16       0.65 2.68
## 2       kopi       gula    0.16       0.64 2.68
## 3    keripik  teh botol    0.16       0.70 2.09
## 4  teh botol    keripik    0.16       0.48 2.09
## 5       roti       susu    0.19       0.59 1.96
## 6       susu       roti    0.19       0.62 1.96
## 7 mie instan      telur    0.27       0.68 1.85
## 8      telur mie instan    0.27       0.72 1.85

Contoh membaca “gula → kopi”: dari semua struk berisi gula, sekitar 65% juga berisi kopi, dan lift jauh di atas 1, jadi keduanya memang berkaitan. Keputusannya: taruh gula berdekatan dengan kopi, buat paket hemat mie instan + telur, atau pajang keripik di dekat kulkas teh botol.

Diskusi 3. Kenapa tidak cukup melihat confidence saja? (Petunjuk: bayangkan barang B yang dibeli hampir semua orang, seperti air mineral.)

6.3 Dimensionality Reduction: meringkas banyak peubah

Data dengan banyak peubah tidak bisa digambar sekaligus. Dimensionality reduction meringkas banyak peubah menjadi sedikit peubah baru yang tetap membawa sebagian besar informasi, sehingga data besar bisa divisualisasikan. Metode paling dikenal: PCA (Principal Component Analysis).

Analogi: memotret patung 3 dimensi. Fotonya 2 dimensi, tetapi kalau sudut fotonya pas, fotonya tetap mewakili bentuk patung. PCA mencari “sudut foto” terbaik itu. Sumbu barunya disebut komponen utama (PC1, PC2, …), dan PC1 membawa informasi terbanyak.

Kita pakai mtcars: 32 mobil dengan 11 peubah. scale. = TRUE penting karena satuannya berbeda-beda.

pca <- prcomp(mtcars, scale. = TRUE)
summary(pca)$importance[, 1:3]
##                             PC1      PC2       PC3
## Standard deviation     2.570681 1.628026 0.7919579
## Proportion of Variance 0.600760 0.240950 0.0570200
## Cumulative Proportion  0.600760 0.841720 0.8987300

Lihat baris Proportion of Variance: PC1 menangkap sekitar 60% informasi, dan PC1 + PC2 sekitar 84%. Artinya 11 dimensi bisa diringkas jadi 2 dimensi dengan kehilangan informasi yang kecil.

biplot(pca, cex = 0.7, main = "Biplot PCA pada Data mtcars")

round(pca$rotation[, 1:2], 2)
##        PC1   PC2
## mpg  -0.36  0.02
## cyl   0.37  0.04
## disp  0.37 -0.05
## hp    0.33  0.25
## drat -0.29  0.27
## wt    0.35 -0.14
## qsec -0.20 -0.46
## vs   -0.31 -0.23
## am   -0.23  0.43
## gear -0.21  0.46
## carb  0.21  0.41

Cara membaca biplot: mobil yang berdekatan karakteristiknya mirip; panah yang searah berkorelasi positif, yang berlawanan berkorelasi negatif. Di PC1, cyl, disp, wt, hp mengarah ke satu sisi dan mpg ke sisi berlawanan, jadi PC1 bisa kita tafsirkan sebagai “ukuran dan tenaga mobil”: mobil besar dan boros di satu sisi, mobil kecil dan irit di sisi lain.


7 Latihan Mandiri

Latihan 1: Statistika vs ML. Pakai mtcars, modelkan mpg dari wt dan hp. a. Buat lm dengan seluruh data, interpretasikan koefisien dan p-value. b. Bagi 70% training dan 30% testing (set.seed(1)), hitung RMSE di data testing. c. Jelaskan dengan kalimat sendiri: apa beda pertanyaan yang dijawab (a) dan (b)?

# Tulis jawabanmu di sini

Latihan 2: Klasifikasi. Pada iris, gunakan 80% training dan 20% testing (set.seed(10)). Latih pohon klasifikasi, lalu bandingkan akurasi di training dan testing. Mana yang lebih tinggi, dan kenapa?

# Tulis jawabanmu di sini

Latihan 3: Clustering dan PCA. Pakai USArrests: standarisasi, tentukan k dengan elbow, jalankan kmeans, beri nama tiap klaster dari profilnya, lalu lakukan PCA dan gambar biplot-nya. Negara bagian mana yang tampak paling berbeda?

# Tulis jawabanmu di sini

Latihan 4: Jenis metodenya apa? Tentukan supervised atau unsupervised, serta tugasnya (regression, classification, clustering, association, atau dimensionality reduction):

  1. Bank memprediksi apakah nasabah akan gagal bayar atau tidak.
  2. Toko online mengelompokkan pelanggan ke dalam segmen tanpa kategori awal.
  3. Perusahaan properti memperkirakan harga jual apartemen.
  4. Aplikasi e-commerce menampilkan “yang membeli ini juga membeli…”.
  5. Peneliti punya 200 peubah dan ingin menggambarnya dalam grafik 2 dimensi.

8 Rangkuman

  1. Machine learning = komputer belajar aturan dari data.
  2. Statistika menekankan hubungan dan interpretasi, machine learning menekankan prediksi pada data baru, sehingga data dipisah jadi training dan testing untuk menghindari overfitting.
  3. Supervised (ada Y): regression untuk Y angka, classification untuk Y kategori.
  4. Unsupervised (tanpa Y): clustering untuk mengelompokkan, association untuk pola bersamaan, dimensionality reduction untuk meringkas peubah.

Tidak ada metode yang paling hebat. Pilih metode sesuai pertanyaan dan jenis datanya.