Hari ini kita kenalan dengan machine learning lewat praktik langsung di R, tanpa menghafal definisi. Alurnya:
| 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.
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.
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.
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?”
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.
##
## 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?”
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?
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:
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.
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 |
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.
## (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
## 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.
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
## [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.
Tidak ada Y yang ditebak. Analogi: membereskan lemari pakaian tanpa label, kamu sendiri yang menentukan mana yang mirip.
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.
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.
## 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):
Itulah gunanya segmentasi: tiap segmen mendapat kampanye yang berbeda.
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:
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.)
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.
## 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.
## 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.
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)?
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?
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?
Latihan 4: Jenis metodenya apa? Tentukan supervised atau unsupervised, serta tugasnya (regression, classification, clustering, association, atau dimensionality reduction):
Tidak ada metode yang paling hebat. Pilih metode sesuai pertanyaan dan jenis datanya.