| Komponen | Keterangan |
|---|---|
| Mata kuliah | Data Mining |
| Pertemuan | 03 |
| Topik | langkah-langkah penting dalam mempersiapkan data |
| Perangkat lunak | R dan RStudio |
Setelah menyelesaikan praktikum, mahasiswa mampu:
Sebuah perusahaan retail ingin memahami pola perilaku pelanggannya untuk dua kebutuhan sekaligus:
Mahasiswa diminta mempraktikkan tahapan inti data mining — mulai dari eksplorasi data, penerapan teknik mining dasar (klasifikasi, clustering, dan asosiasi), hingga interpretasi hasil.
Prinsip utama: data mining bukan sekadar menjalankan fungsi di R. Setiap pola yang ditemukan harus dievaluasi: apakah pola tersebut masuk akal, cukup kuat secara statistik, dan berguna bagi pengambilan keputusan.
praktikum_mining_data.## [1] "C:/Users/MyBook Hype AMD/Downloads"
## [1] "R version 4.4.1 (2024-06-14 ucrt)"
Modul ini menggunakan fungsi dasar R (stats,
graphics) sehingga dapat dijalankan tanpa memasang paket
tambahan. Jika di kelas Anda ingin mencoba analisis asosiasi yang lebih
lengkap, paket arules dapat dipasang secara opsional dengan
install.packages("arules"); modul ini tetap membahas
konsepnya menggunakan R dasar agar dapat dijalankan di semua
komputer.
Jalankan kode berikut untuk membangun dua dataset praktikum: data profil transaksi pelanggan (untuk klasifikasi dan clustering) dan data keranjang belanja (untuk analisis asosiasi).
data_pelanggan <- data.frame(
customer_id = sprintf("C%03d", 1:15),
usia = c(22, 35, 28, 41, 30, 55, 24, 38, 45, 27, 33, 29, 50, 26, 37),
pendapatan = c(4500000, 7200000, 5100000, 8900000, 6000000, 9500000,
4200000, 6800000, 9100000, 5400000, 6100000, 4700000,
8700000, 5300000, 7000000),
frekuensi_belanja = c(3, 12, 5, 15, 8, 18, 2, 10, 16, 4, 7, 3, 14, 5, 9),
total_belanja = c(900000, 5400000, 1500000, 7200000, 3600000, 9800000,
600000, 4800000, 8200000, 1300000, 2900000, 850000,
7100000, 1600000, 3800000),
kategori_pelanggan = c("Reguler", "Premium", "Reguler", "Premium",
"Reguler", "Premium", "Reguler", "Premium",
"Premium", "Reguler", "Reguler", "Reguler",
"Premium", "Reguler", "Reguler"),
stringsAsFactors = FALSE
)
transaksi_keranjang <- list(
c("Kopi", "Gula", "Susu"),
c("Roti", "Mentega"),
c("Kopi", "Gula"),
c("Roti", "Mentega", "Susu"),
c("Kopi", "Susu"),
c("Teh", "Gula"),
c("Kopi", "Gula", "Roti"),
c("Roti", "Mentega", "Kopi"),
c("Kopi", "Gula", "Susu", "Roti"),
c("Teh", "Susu")
)
data_pelanggankategori_pelanggan berperan sebagai label yang sudah
diketahui (ground truth) sehingga dapat digunakan untuk
membangun sekaligus mengevaluasi model klasifikasi pada bagian
selanjutnya.
Data mining adalah proses menemukan pola, hubungan, atau pengetahuan yang tersembunyi dan berpotensi berguna dari sekumpulan data berukuran besar. Han, Kamber, dan Pei menempatkan data mining sebagai satu tahap inti dari proses yang lebih besar, yaitu Knowledge Discovery in Databases (KDD), yang secara umum terdiri atas:
Dengan kata lain, teknik mining (klasifikasi, clustering, asosiasi, dan sejenisnya) hanya efektif jika dijalankan pada data yang sudah melalui tahap preprocessing yang memadai.
## [1] 15 6
## 'data.frame': 15 obs. of 6 variables:
## $ customer_id : chr "C001" "C002" "C003" "C004" ...
## $ usia : num 22 35 28 41 30 55 24 38 45 27 ...
## $ pendapatan : num 4500000 7200000 5100000 8900000 6000000 9500000 4200000 6800000 9100000 5400000 ...
## $ frekuensi_belanja : num 3 12 5 15 8 18 2 10 16 4 ...
## $ total_belanja : num 900000 5400000 1500000 7200000 3600000 9800000 600000 4800000 8200000 1300000 ...
## $ kategori_pelanggan: chr "Reguler" "Premium" "Reguler" "Premium" ...
Pada dataset nyata, jumlah baris dan kolom bisa jauh lebih besar sehingga pola tidak mungkin ditemukan hanya dengan membaca tabel secara manual. Di sinilah teknik mining berperan: mengubah data mentah menjadi informasi yang dapat ditindaklanjuti.
Secara umum, tugas data mining dibedakan menjadi dua kelompok besar.
Tugas deskriptif bertujuan mengenali karakteristik umum data:
Tugas prediktif bertujuan memperkirakan nilai suatu atribut berdasarkan atribut lain:
tugas_mining <- data.frame(
jenis = c("Deskriptif", "Deskriptif", "Prediktif", "Prediktif"),
teknik = c("Clustering", "Association rule", "Klasifikasi", "Regresi"),
contoh_pada_kasus = c(
"Mengelompokkan pelanggan berdasarkan pola belanja",
"Menemukan produk yang sering dibeli bersamaan",
"Memprediksi kategori Premium/Reguler",
"Memprediksi total belanja pelanggan"
)
)
tugas_miningKetiga bagian berikutnya (Bagian IV, V, dan VI) masing-masing mempraktikkan satu teknik: klasifikasi, clustering, dan asosiasi.
Sebelum menerapkan teknik mining, data perlu dipahami terlebih dahulu melalui statistik ringkasan dan visualisasi sederhana.
## usia pendapatan frekuensi_belanja total_belanja
## Min. :22.00 Min. :4200000 Min. : 2.000 Min. : 600000
## 1st Qu.:27.50 1st Qu.:5200000 1st Qu.: 4.500 1st Qu.:1400000
## Median :33.00 Median :6100000 Median : 8.000 Median :3600000
## Mean :34.67 Mean :6566667 Mean : 8.733 Mean :3970000
## 3rd Qu.:39.50 3rd Qu.:7950000 3rd Qu.:13.000 3rd Qu.:6250000
## Max. :55.00 Max. :9500000 Max. :18.000 Max. :9800000
fitur_numerik <- data_pelanggan[, c("usia", "pendapatan",
"frekuensi_belanja", "total_belanja")]
round(cor(fitur_numerik), 2)## usia pendapatan frekuensi_belanja total_belanja
## usia 1.00 0.95 0.94 0.95
## pendapatan 0.95 1.00 0.99 0.98
## frekuensi_belanja 0.94 0.99 1.00 1.00
## total_belanja 0.95 0.98 1.00 1.00
boxplot(total_belanja ~ kategori_pelanggan, data = data_pelanggan,
main = "Sebaran Total Belanja per Kategori Pelanggan",
xlab = "Kategori Pelanggan", ylab = "Total Belanja (Rp)",
col = c("#f4a261", "#2a9d8f"))plot(data_pelanggan$frekuensi_belanja, data_pelanggan$total_belanja,
pch = 19, col = "#264653",
main = "Frekuensi Belanja vs Total Belanja",
xlab = "Frekuensi Belanja", ylab = "Total Belanja (Rp)")Dari boxplot terlihat pemisahan yang cukup jelas antara kategori Premium dan Reguler berdasarkan total belanja, dan dari scatter plot terlihat kecenderungan hubungan positif antara frekuensi belanja dan total belanja. Pola awal ini menjadi dasar untuk teknik mining pada bagian berikutnya.
Klasifikasi digunakan untuk memprediksi label
kategori_pelanggan berdasarkan atribut lain. Pada praktikum
ini digunakan regresi logistik sebagai model klasifikasi dasar.
data_pelanggan$target_premium <- ifelse(
data_pelanggan$kategori_pelanggan == "Premium", 1, 0
)
table(data_pelanggan$kategori_pelanggan)##
## Premium Reguler
## 6 9
model_klasifikasi <- glm(
target_premium ~ frekuensi_belanja + total_belanja,
data = data_pelanggan,
family = binomial
)## Warning: glm.fit: algorithm did not converge
## Warning: glm.fit: fitted probabilities numerically 0 or 1 occurred
##
## Call:
## glm(formula = target_premium ~ frekuensi_belanja + total_belanja,
## family = binomial, data = data_pelanggan)
##
## Coefficients:
## Estimate Std. Error z value Pr(>|z|)
## (Intercept) -1.166e+02 3.455e+05 0 1
## frekuensi_belanja -1.968e+01 1.747e+05 0 1
## total_belanja 6.998e-05 3.118e-01 0 1
##
## (Dispersion parameter for binomial family taken to be 1)
##
## Null deviance: 2.0190e+01 on 14 degrees of freedom
## Residual deviance: 8.5979e-10 on 12 degrees of freedom
## AIC: 6
##
## Number of Fisher Scoring iterations: 25
Perhatikan jika muncul peringatan “fitted probabilities numerically 0 or 1 occurred”. Ini bukan galat pemrograman, melainkan tanda bahwa kedua kelas pada data contoh terpisah dengan cukup jelas (separation) — hal yang wajar terjadi pada dataset kecil buatan dan patut didiskusikan di kelas.
prob_prediksi <- predict(model_klasifikasi, type = "response")
kelas_prediksi <- ifelse(prob_prediksi >= 0.5, "Premium", "Reguler")
tabel_konfusi <- table(Prediksi = kelas_prediksi,
Aktual = data_pelanggan$kategori_pelanggan)
tabel_konfusi## Aktual
## Prediksi Premium Reguler
## Premium 6 0
## Reguler 0 9
## [1] 1
Akurasi yang tinggi pada data latih perlu dibaca hati-hati: dataset
ini kecil dan labelnya dibuat berkorelasi kuat dengan
total_belanja, sehingga performa yang sangat baik di sini
belum tentu terulang pada data pelanggan baru yang belum pernah dilihat
model.
Clustering mengelompokkan pelanggan tanpa menggunakan label
kategori_pelanggan, murni berdasarkan kemiripan atribut
numerik.
Karena skala pendapatan dan total_belanja
jauh lebih besar daripada usia dan
frekuensi_belanja, atribut perlu distandardisasi agar tidak
mendominasi perhitungan jarak.
## usia pendapatan frekuensi_belanja total_belanja
## [1,] -1.30382758 -1.1569385 -1.0962500 -1.0252922
## [2,] 0.03431125 0.3545457 0.6246076 0.4775791
## [3,] -0.68622504 -0.8210531 -0.7138372 -0.8249094
## [4,] 0.65191379 1.3062209 1.1982268 1.0787276
## [5,] -0.48035753 -0.3172251 -0.1402180 -0.1235694
## [6,] 2.09298638 1.6421063 1.7718460 1.9470533
## usia pendapatan frekuensi_belanja total_belanja
## 1 0.8577813 0.8983601 0.8977596 0.8831158
## 2 -0.7505586 -0.7860651 -0.7855396 -0.7727263
## Kategori
## Cluster Premium Reguler
## 1 6 1
## 2 0 8
plot(data_pelanggan$frekuensi_belanja, data_pelanggan$total_belanja,
col = data_pelanggan$cluster, pch = 19,
main = "Hasil Clustering (k = 2)",
xlab = "Frekuensi Belanja", ylab = "Total Belanja (Rp)")
legend("topleft", legend = paste("Cluster", sort(unique(data_pelanggan$cluster))),
col = sort(unique(data_pelanggan$cluster)), pch = 19)Jika hasil cluster sejalan dengan
kategori_pelanggan, ini menunjukkan bahwa perbedaan pola
belanja yang tampak di data memang cukup kuat untuk ditemukan tanpa
label — sebuah indikasi bahwa segmentasi tersebut valid secara data,
bukan hanya asumsi bisnis.
Analisis asosiasi mencari pola “jika membeli A, cenderung juga
membeli B” dari data keranjang belanja transaksi_keranjang
yang telah dibangun sebelumnya.
Support mengukur seberapa sering suatu itemset muncul di seluruh transaksi.
ada_kopi <- sapply(transaksi_keranjang, function(x) "Kopi" %in% x)
ada_gula <- sapply(transaksi_keranjang, function(x) "Gula" %in% x)
support_kopi <- mean(ada_kopi)
support_gula <- mean(ada_gula)
support_kopi_gula <- mean(ada_kopi & ada_gula)
data.frame(itemset = c("{Kopi}", "{Gula}", "{Kopi, Gula}"),
support = c(support_kopi, support_gula, support_kopi_gula))Confidence mengukur kekuatan aturan “Kopi → Gula”, sedangkan lift menunjukkan apakah hubungan tersebut lebih kuat daripada kebetulan.
confidence_kopi_ke_gula <- support_kopi_gula / support_kopi
lift_kopi_gula <- confidence_kopi_ke_gula / support_gula
data.frame(aturan = "Kopi -> Gula",
support = support_kopi_gula,
confidence = confidence_kopi_ke_gula,
lift = lift_kopi_gula)Nilai lift lebih besar dari 1 menunjukkan bahwa pembelian Kopi dan Gula berasosiasi positif — keduanya lebih sering dibeli bersamaan dibandingkan jika pembelian keduanya saling bebas. Pola inilah yang biasa dimanfaatkan untuk strategi product bundling atau penempatan produk pada rak yang berdekatan.
Ketiga teknik yang dipraktikkan menjawab kebutuhan yang berbeda:
Ketiganya saling melengkapi dan sering digunakan bersamaan dalam proyek data mining nyata, bukan dipilih salah satu saja.
Alur yang telah dipraktikkan adalah:
Data mining bukan proses satu langkah. Kualitas hasilnya bergantung pada pemahaman data, ketepatan pemilihan teknik, dan interpretasi yang kritis terhadap pola yang ditemukan — bukan hanya menjalankan fungsi R dan membaca output apa adanya.
Han, J., Kamber, M., & Pei, J. (2012). Data Mining: Concepts and Techniques (3rd ed.). Morgan Kaufmann.
Tan, P. N., Steinbach, M., & Kumar, V. (2019). Introduction to Data Mining (2nd ed.). Pearson.