Analisis klaster ini bertujuan untuk mengelompokkan karakteristik perilaku pendonor darah di Blood Transfusion Service Center menggunakan konsep RFM (Recency, Frequency, Monetary) ditambah variabel waktu (Time). Pengelompokan ini penting bagi manajemen organisasi donor darah untuk menyusun strategi pendekatan yang tepat sasaran bagi setiap segmen pendonor.
Data dibaca langsung dari file Excel asli berformat .xlsx. Variabel target/label asli dipisahkan terlebih dahulu untuk mematuhi kaidah unsupervised learning, kemudian nama kolom disesuaikan agar lebih intuitif saat dibaca oleh sistem.
path_data <- "data projek sml uas.xlsx"
data_raw <- read_excel(path_data)
# Mengganti nama kolom
colnames(data_raw) <- c("Recency", "Frequency", "Monetary", "Time", "Target")
# Memisahkan fitur klaster (kolom 1-4) dan label asli (kolom 5)
data_cluster <- data_raw[, 1:4]
label_asli <- as.factor(data_raw$Target)Sebelum melakukan klasterisasi, dilakukan visualisasi matriks korelasi menggunakan library GGally. Hal ini berguna untuk melihat bentuk sebaran data dan keeratan hubungan linier awal antar variabel pendonor darah.
# Visualisasi 1: Matriks Korelasi dan Sebaran Data Pendonor
print("Menampilkan matriks korelasi antar variabel...")## [1] "Menampilkan matriks korelasi antar variabel..."
ggpairs(data_cluster, title = "Matriks Korelasi Variabel Perilaku Pendonor Darah") + theme_minimal()Dikarenakan adanya perbedaan skala satuan yang cukup jauh (contohnya variabel Monetary bernilai ribuan c.c. sedangkan Recency hanya satuan bulan), proses standardisasi menggunakan Z-score scaling wajib dilakukan agar tidak ada variabel tertentu yang mendominasi perhitungan jarak Euclidean antar objek.
penentuan nilai \(k\) (jumlah kelompok) terbaik diuji menggunakan dua pendekatan kriteria relatif, yaitu metode Elbow (melihat penurunan WSS) dan Average Silhouette (melihat lebar Silhouette tertinggi).
# Visualisasi 2: Metode Elbow (Melihat penurunan WSS)
fviz_nbclust(data_scaled, kmeans, method = "wss") +
labs(title = "Penentuan Jumlah Cluster Optimal: Metode Elbow") + theme_minimal()# Visualisasi 3: Metode Silhouette (Melihat lebar Silhouette tertinggi)
fviz_nbclust(data_scaled, kmeans, method = "silhouette") +
labs(title = "Penentuan Jumlah Cluster Optimal: Metode Silhouette") + theme_minimal()Analisis: Kedua grafik pembanding di atas menunjukkan bahwa pembentukan jumlah kelompok sebanyak \(k = 2\) adalah pilihan yang paling optimal secara matematis karena menghasilkan nilai rata-rata lebar Silhouette yang paling tinggi dan belokan grafik Elbow yang mulai melandai.
Metode Distance-Based: Menggunakan algoritma K-Means. Metode Spectral (Graph-Based): Mentransformasikan data menggunakan nilai eigenvalues dan eigenvectors dari matriks kemiripan berbasis graf sebelum akhirnya dikelompokkan dengan K-Means.
# --- METODE A: Distance-Based Clustering (K-Means) ---
km_res <- kmeans(data_scaled, centers = 2, nstart = 25)
km_assignments <- km_res$cluster
# --- METODE B: Spectral Clustering ---
# A. Membuat Matriks Kemiripan (Similarity Matrix) menggunakan rbf kernel
sim_matrix <- exp(-dist(data_scaled)^2)
# B. Melakukan Dekomposisi Eigen (Eigen-decomposition)
eigen_res <- eigen(sim_matrix)
# C. Mengambil top-2 eigenvector (karena k = 2)
k_eigenvectors <- eigen_res$vectors[, 1:2]
# D. Menjalankan K-Means di atas matriks eigenvector hasil transformasi graf
spectral_res <- kmeans(k_eigenvectors, centers = 2, nstart = 25)
spectral_assignments <- spectral_res$clusterNilai yang mendekati angka 1 mengindikasikan struktur klaster yang sangat baik (objek padat di dalam kelompok sendiri dan terpisah jauh dari kelompok lain).
sil_km_stat <- cluster.stats(dist(data_scaled), km_assignments)
sil_spec_stat <- cluster.stats(dist(data_scaled), spectral_assignments)
cat("Rata-rata Silhouette Width K-Means :", sil_km_stat$avg.silwidth, "\n")## Rata-rata Silhouette Width K-Means : 0.4355637
## Rata-rata Silhouette Width Spectral: 0.1845912
Visualisasi Perbandingan Silhouette Plot Grafik di bawah ini memetakan kualitas kekuatan pengelompokan tiap objek data pada masing-masing metode secara visual:
# Visualisasi 4: Silhouette Plot K-Means
sil_km_val <- silhouette(km_assignments, dist(data_scaled))
fviz_silhouette(sil_km_val) +
theme_minimal() +
labs(title = "Silhouette Plot - K-Means Clustering")## cluster size ave.sil.width
## 1 1 580 0.49
## 2 2 168 0.25
# Visualisasi 5: Silhouette Plot Spectral Clustering
sil_spec_val <- silhouette(spectral_assignments, dist(data_scaled))
fviz_silhouette(sil_spec_val) +
theme_minimal() +
labs(title = "Silhouette Plot - Spectral Clustering")## cluster size ave.sil.width
## 1 1 211 0.69
## 2 2 537 -0.01
Validasi eksternal dilakukan dengan mencocokkan hasil tebakan klaster bentukan algoritma dengan label riil di lapangan (Target). Di mana Target 1 berarti pendonor riil kembali mendonor pada Maret 2007, dan 0 berarti tidak kembali mendonor.
## --- Matriks Kontingensi K-Means ---
## Target_Riil
## Klaster_KMeans 0 1
## 1 456 124
## 2 114 54
##
## --- Matriks Kontingensi Spectral ---
## Target_Riil
## Klaster_Spectral 0 1
## 1 141 70
## 2 429 108
Visualisasi sebaran spasial seluruh titik data pendonor setelah direduksi ke dalam ruang dimensi utama menggunakan Principal Component Analysis (PCA) untuk membandingkan bentuk geometris klaster.
# Visualisasi 6: Plot Pemetaan Data Berdasarkan Klaster K-Means
fviz_cluster(list(data = data_scaled, cluster = km_assignments),
ellipse.type = "convex", geom = "point", stand = FALSE,
main = "Pemetaan Klaster Pendonor Darah (K-Means)") + theme_minimal()# Visualisasi 7: Plot Pemetaan Data Berdasarkan Klaster Spectral Clustering
fviz_cluster(list(data = data_scaled, cluster = spectral_assignments),
ellipse.type = "convex", geom = "point", stand = FALSE,
main = "Pemetaan Klaster Pendonor Darah (Spectral)") + theme_minimal()Berikut adalah nilai rata-rata (mean) variabel asli berdasarkan kelompok terbaik yang terbentuk untuk interpretasi keputusan manajemen:
## Klaster Recency Frequency Monetary Time
## 1 1 10.163793 3.248276 812.069 25.79483
## 2 2 7.238095 13.339286 3334.821 63.58333
Kesimpulan Karakteristik Kelompok:
Klaster 1 (Pendonor Pasif / Risiko Churn): Karakteristik utama kelompok ini adalah nilai Recency yang sangat tinggi (rata-rata sudah belasan bulan tidak mendonor kembali) dan kontribusi frekuensi donor yang rendah.
Klaster 2 (Pendonor Aktif / Loyal Menengah-Tinggi): Karakteristik utamanya adalah nilai Recency yang sangat rendah (aktif mendonor dalam waktu dekat ini) serta memiliki nilai total volume donor darah (Monetary) dan Frequency yang sangat tinggi.
Saran Rekomendasi untuk Manajemen Medis:
Strategi Kamar Aktif (Klaster 2): Cukup diberikan sistem apresiasi otomatis (reward loyalitas atau kartu anggota prioritas) untuk menjaga ritme kehadiran mereka agar tetap mendonor secara konsisten.
Strategi Reaktivasi (Klaster 1): Pihak manajemen wajib melakukan strategi “jemput bola” secara masif, seperti mengirimkan pesan pengingat jadwal donor via WhatsApp/SMS, atau mengadakan unit donor darah keliling (Mobile Clinic) langsung ke area perkantoran atau universitas terdekat guna memicu emosi kemanusiaan mereka untuk kembali aktif mendonor darahnya.