Aktivasi Library
library(raster)
library(dismo)
library(kernlab)
library(randomForest)
library(tmap)
library(sp)Perbandingan Algoritma SVM dan Random Forest
Demam Berdarah Dengue (DBD) merupakan salah satu penyakit menular yang masih menjadi masalah kesehatan masyarakat di Indonesia, termasuk di wilayah Kalimantan Selatan. Penyakit ini disebabkan oleh virus dengue yang ditularkan melalui gigitan nyamuk Aedes aegypti dan Aedes albopictus. Penyebaran kasus DBD sangat dipengaruhi oleh kondisi lingkungan fisik seperti suhu permukaan, curah hujan, kelembapan, kepadatan penduduk, serta faktor aksesibilitas sanitasi dan tata guna lahan.
Pendekatan pemodelan spasial berbasis machine learning menjadi salah satu metode yang relevan untuk memetakan tingkat kerentanan wilayah terhadap penyakit DBD. Dengan mengintegrasikan data spasial lingkungan dan data titik kasus DBD, model prediktif dapat dibangun untuk mengidentifikasi zona-zona berisiko tinggi secara spasial.
Praktikum ini bertujuan untuk:
ntree dan mtry.Hasil pemodelan ini diharapkan dapat memberikan informasi spasial bagi pemangku kepentingan dalam perencanaan pengendalian dan pencegahan penyakit DBD secara berbasis wilayah (area-based approach).
DBD adalah penyakit infeksi akut yang disebabkan oleh virus dengue serotipe DEN-1 hingga DEN-4. Menurut WHO, lebih dari 390 juta infeksi dengue terjadi setiap tahun di seluruh dunia. Di Indonesia, DBD bersifat endemis dengan pola penularan yang erat kaitannya dengan kondisi iklim, sanitasi lingkungan, dan kepadatan pemukiman.
Pemodelan spasial penyakit (spatial disease modelling) merupakan pendekatan analitik yang menggabungkan data lokasi kasus penyakit dengan variabel lingkungan untuk memprediksi distribusi risiko secara geografis. Pendekatan ini lazim digunakan dalam epidemiologi lingkungan (environmental epidemiology) dan kesehatan geografi (health geography).
SVM adalah algoritma supervised learning yang bekerja dengan membangun hyperplane optimal yang memisahkan kelas data. Pada pemodelan kerentanan penyakit, SVM digunakan dalam mode regresi dengan kernel Radial Basis Function (RBF) yang mampu menangani hubungan non-linier antara variabel prediktor dan variabel respons.
Random Forest adalah algoritma ensemble learning berbasis pohon keputusan (decision tree) yang membangun sejumlah pohon secara acak (bootstrap aggregation) kemudian menggabungkan hasilnya. Parameter utama yang dikontrol adalah ntree (jumlah pohon) dan mtry (jumlah variabel yang dicoba pada setiap pemisahan node). Tuning kedua parameter ini berpengaruh signifikan terhadap akurasi dan stabilitas model.
Data yang digunakan dalam praktikum ini terdiri dari:
populasi.csv.randomPoints() sebanyak 52 titik..tif) yang merepresentasikan kondisi lingkungan wilayah kajian.Tabel berikut merangkum variabel prediktor yang digunakan:
| No | Nama Variabel | Keterangan |
|---|---|---|
| 1 | kepadatan_penduduk |
Kepadatan penduduk per satuan luas |
| 2 | curah_hujan |
Rata-rata curah hujan tahunan |
| 3 | suhu_permukaan |
Suhu permukaan lahan (LST) |
| 4 | kelembapan |
Kelembapan udara relatif |
| 5 | ndvi |
Indeks vegetasi (NDVI) |
| 6 | ndbi |
Indeks bangunan (NDBI) |
| 7 | jarak_sungai |
Jarak ke sungai terdekat |
| 8 | penggunaan_lahan |
Klasifikasi tutupan/penggunaan lahan |
| 9 | elevasi |
Ketinggian wilayah (DEM) |
| 10 | kepadatan_permukiman |
Kepadatan area permukiman |
| 11 | akses_sanitasi |
Tingkat akses sanitasi dasar |
Alur analisis pemodelan kerentanan DBD dalam praktikum ini secara garis besar meliputi tahapan berikut:
Analisis dilakukan menggunakan perangkat lunak R dengan paket-paket berikut:
| Paket | Fungsi Utama |
|---|---|
raster |
Manipulasi dan analisis data raster spasial |
dismo |
Pemodelan distribusi spesies / penyakit |
kernlab |
Implementasi algoritma SVM |
randomForest |
Implementasi algoritma Random Forest |
tmap |
Visualisasi peta tematik interaktif |
library(raster)
library(dismo)
library(kernlab)
library(randomForest)
library(tmap)
library(sp)setwd("C:/Geo Kes/Pak Mizan/Pemodelan Demam Berdarah/Data-20260521T050015Z-3-001/Data")
list.data <- list.files(getwd(), pattern = ".tif$", full.names = TRUE)
data <- stack(list.data)
layer_asli <- c("forest", "geology", "hidrology", "landuse", "morphology",
"ndisaster", "river", "road", "slope", "soil", "topography")
data <- subset(data, layer_asli)
names(data) <- c("ndvi", "ndbi", "akses_sanitasi", "penggunaan_lahan", "kepadatan_penduduk",
"curah_hujan", "jarak_sungai", "kepadatan_permukiman", "suhu_permukaan",
"kelembapan", "elevasi")
populasi <- read.csv("populasi.csv", header = TRUE, sep = ",")
populasi <- populasi[, 3:4]
kehadiran.dbd <- extract(data, populasi)set.seed(52)
absence.dbd <- randomPoints(data, n = 52, kehadiran.dbd)
absence.dbd <- extract(data, absence.dbd)
status <- c(rep(1, nrow(kehadiran.dbd)), rep(0, nrow(absence.dbd)))
data.pemodelan <- data.frame(cbind(status, rbind(kehadiran.dbd, absence.dbd)))set.seed(70)
part.presence <- kfold(populasi, 3)
presence.latih <- populasi[part.presence != 1, ]
presence.uji <- populasi[part.presence == 1, ]
set.seed(52)
bukan.dbd <- randomPoints(data, n = 52, kehadiran.dbd)
colnames(bukan.dbd) <- c('Long_utm', 'Lat_utm')
part.absence <- kfold(bukan.dbd, 3)
absence.latih <- bukan.dbd[part.absence != 1, ]
absence.uji <- bukan.dbd[part.absence == 1, ]
latih <- rbind(presence.latih, absence.latih)
status.latih <- c(rep(1, nrow(presence.latih)), rep(0, nrow(absence.latih)))
data.latih <- extract(data, latih)
data.latih <- data.frame(cbind(ket = status.latih, data.latih))
presence.uji.df <- data.frame(extract(data, presence.uji))
absence.uji.df <- data.frame(extract(data, absence.uji))Model dibangun menggunakan 11 variabel prediktor lingkungan dengan formula sebagai berikut:
model.dbd <- ket ~ kepadatan_penduduk + curah_hujan + suhu_permukaan + kelembapan +
ndvi + ndbi + jarak_sungai + penggunaan_lahan + elevasi +
kepadatan_permukiman + akses_sanitasiModel SVM dibangun menggunakan kernel RBF (Radial Basis Function) dengan parameter sigma = 0,06 dan C = 16, serta validasi silang 10-fold.
klasifikasi.svm1 <- ksvm(model.dbd, data = data.latih,
kernel = "rbfdot", sigma = 0.06, C = 16, cross = 10)
evaluasi.svm1 <- evaluate(presence.uji.df, absence.uji.df, klasifikasi.svm1)
peta.prediksi.svm1 <- predict(data, klasifikasi.svm1)Empat skenario hyperparameter tuning dilakukan dengan mengkombinasikan nilai ntree (500 dan 1000) serta mtry (1 dan 8).
# Skenario 1
klasifikasi.rf1 <- randomForest(model.dbd, data = data.latih, ntree = 500, mtry = 1)
evaluasi.rf1 <- evaluate(presence.uji.df, absence.uji.df, klasifikasi.rf1)
peta.prediksi.rf1 <- predict(data, klasifikasi.rf1)
# Skenario 2
klasifikasi.rf2 <- randomForest(model.dbd, data = data.latih, ntree = 500, mtry = 8)
evaluasi.rf2 <- evaluate(presence.uji.df, absence.uji.df, klasifikasi.rf2)
peta.prediksi.rf2 <- predict(data, klasifikasi.rf2)
# Skenario 3
klasifikasi.rf3 <- randomForest(model.dbd, data = data.latih, ntree = 1000, mtry = 1)
evaluasi.rf3 <- evaluate(presence.uji.df, absence.uji.df, klasifikasi.rf3)
peta.prediksi.rf3 <- predict(data, klasifikasi.rf3)
# Skenario 4
klasifikasi.rf4 <- randomForest(model.dbd, data = data.latih, ntree = 1000, mtry = 8)
evaluasi.rf4 <- evaluate(presence.uji.df, absence.uji.df, klasifikasi.rf4)
peta.prediksi.rf4 <- predict(data, klasifikasi.rf4)Performa setiap model dievaluasi menggunakan nilai AUC (Area Under the Curve) dari kurva ROC. Nilai AUC berkisar antara 0,5 (acak) hingga 1,0 (sempurna), di mana semakin tinggi nilai AUC maka semakin baik kemampuan model dalam mendiskriminasi antara zona kerentanan tinggi dan rendah.
auc_svm1 <- evaluasi.svm1@auc
auc_rf1 <- evaluasi.rf1@auc
auc_rf2 <- evaluasi.rf2@auc
auc_rf3 <- evaluasi.rf3@auc
auc_rf4 <- evaluasi.rf4@auc
tabel.auc <- data.frame(
Model = c("SVM (sigma=0.06, C=16)",
"RF Skenario 1 (ntree=500, mtry=1)",
"RF Skenario 2 (ntree=500, mtry=8)",
"RF Skenario 3 (ntree=1000, mtry=1)",
"RF Skenario 4 (ntree=1000, mtry=8)"),
AUC = round(c(auc_svm1, auc_rf1, auc_rf2, auc_rf3, auc_rf4), 4)
)
knitr::kable(tabel.auc,
caption = "Rekapitulasi Nilai AUC Model Kerentanan DBD",
align = c("l", "c"))| Model | AUC |
|---|---|
| SVM (sigma=0.06, C=16) | 0.6851 |
| RF Skenario 1 (ntree=500, mtry=1) | 0.8339 |
| RF Skenario 2 (ntree=500, mtry=8) | 0.7889 |
| RF Skenario 3 (ntree=1000, mtry=1) | 0.8408 |
| RF Skenario 4 (ntree=1000, mtry=8) | 0.7924 |
par(mfrow = c(2, 2), mar = c(4, 4, 3, 2))
plot(evaluasi.rf1, "ROC", col = "red", main = "ROC RF Skenario 1 (500, 1)", cex.main = 0.9)
plot(evaluasi.rf2, "ROC", col = "blue", main = "ROC RF Skenario 2 (500, 8)", cex.main = 0.9)
plot(evaluasi.rf3, "ROC", col = "green", main = "ROC RF Skenario 3 (1000, 1)", cex.main = 0.9)
plot(evaluasi.rf4, "ROC", col = "purple", main = "ROC RF Skenario 4 (1000, 8)", cex.main = 0.9)Berdasarkan kurva ROC di atas, model dengan nilai AUC tertinggi merupakan model terbaik yang paling mampu membedakan zona kerentanan DBD secara akurat.
Peta berikut menampilkan hasil prediksi kerentanan DBD secara spasial menggunakan mode interaktif tmap. Nilai yang lebih tinggi (mendekati 1) mengindikasikan tingkat kerentanan yang lebih tinggi terhadap penyakit DBD.
presence.latih.df <- as.data.frame(presence.latih)
presence.uji.df2 <- as.data.frame(presence.uji)
coords.latih <- presence.latih.df[, 1:2]
coords.uji <- presence.uji.df2[, 1:2]
crs.utm <- CRS(projection(data))
# Perbaikan: Menggunakan rep() agar jumlah baris data sama dengan koordinat
sp.latih <- SpatialPointsDataFrame(
coords = coords.latih,
data = data.frame(status = rep("Kasus Latih", nrow(coords.latih))),
proj4string = crs.utm
)
sp.uji <- SpatialPointsDataFrame(
coords = coords.uji,
data = data.frame(status = rep("Kasus Uji", nrow(coords.uji))),
proj4string = crs.utm
)tmap_mode("view")
tm_shape(peta.prediksi.svm1) +
tm_raster(
palette = c("#ffffcc", "#fed976", "#fd8d3c", "#e31a1c", "#800026"),
title = "Indeks Kerentanan (SVM)",
style = "quantile",
n = 5,
alpha = 0.8
) +
tm_shape(sp.latih) +
tm_dots(col = "blue", size = 0.05, title = "Titik Kasus") +
tm_shape(sp.uji) +
tm_dots(col = "darkblue", size = 0.05, shape = 17) +
tm_add_legend(
type = "symbol",
labels = c("Kasus Latih", "Kasus Uji"),
col = c("blue", "darkblue"),
shape = c(16, 17)
) +
tm_layout(title = "Peta Kerentanan DBD — SVM")Peta Interaktif Kerentanan DBD — Model SVM
tmap_mode("view")
tm_shape(peta.prediksi.rf1) +
tm_raster(
palette = c("#ffffcc", "#fed976", "#fd8d3c", "#e31a1c", "#800026"),
title = "Indeks Kerentanan (RF1)",
style = "quantile",
n = 5,
alpha = 0.8
) +
tm_shape(sp.latih) +
tm_dots(col = "blue", size = 0.05) +
tm_shape(sp.uji) +
tm_dots(col = "darkblue", size = 0.05, shape = 17) +
tm_layout(title = "RF Skenario 1 (ntree=500, mtry=1)")Peta Interaktif Kerentanan DBD — RF Skenario 1 (ntree=500, mtry=1)
tmap_mode("view")
tm_shape(peta.prediksi.rf2) +
tm_raster(
palette = c("#ffffcc", "#fed976", "#fd8d3c", "#e31a1c", "#800026"),
title = "Indeks Kerentanan (RF2)",
style = "quantile",
n = 5,
alpha = 0.8
) +
tm_layout(title = "RF Skenario 2 (ntree=500, mtry=8)")Peta Interaktif Kerentanan DBD — RF Skenario 2 (ntree=500, mtry=8)
tmap_mode("view")
tm_shape(peta.prediksi.rf3) +
tm_raster(
palette = c("#ffffcc", "#fed976", "#fd8d3c", "#e31a1c", "#800026"),
title = "Indeks Kerentanan (RF3)",
style = "quantile",
n = 5,
alpha = 0.8
) +
tm_layout(title = "RF Skenario 3 (ntree=1000, mtry=1)")Peta Interaktif Kerentanan DBD — RF Skenario 3 (ntree=1000, mtry=1)
tmap_mode("view")
tm_shape(peta.prediksi.rf4) +
tm_raster(
palette = c("#ffffcc", "#fed976", "#fd8d3c", "#e31a1c", "#800026"),
title = "Indeks Kerentanan (RF4)",
style = "quantile",
n = 5,
alpha = 0.8
) +
tm_layout(title = "RF Skenario 4 (ntree=1000, mtry=8)")Peta Interaktif Kerentanan DBD — RF Skenario 4 (ntree=1000, mtry=8)
Peta kerentanan yang dihasilkan menunjukkan distribusi spasial tingkat risiko DBD di wilayah kajian. Zona berwarna merah tua mengindikasikan wilayah dengan kerentanan tertinggi, umumnya berasosiasi dengan kondisi lingkungan seperti kepadatan penduduk dan permukiman tinggi, kelembapan udara yang kondusif bagi perkembangbiakan nyamuk, serta aksesibilitas sanitasi yang rendah. Zona berwarna kuning muda mencerminkan area dengan kerentanan rendah.
Secara umum, model SVM dan Random Forest menghasilkan pola distribusi spasial kerentanan yang relatif serupa, namun terdapat perbedaan pada tingkat kepercayaan prediksi di wilayah-wilayah tertentu — yang dapat dikaji lebih lanjut berdasarkan nilai AUC masing-masing model pada Tabel di atas.
Berdasarkan hasil pemodelan spasial kerentanan DBD yang telah dilakukan, dapat disimpulkan sebagai berikut:
Dua algoritma machine learning berhasil diimplementasikan, yaitu SVM dengan kernel RBF dan Random Forest dengan 4 skenario hyperparameter tuning, menggunakan 11 variabel prediktor lingkungan.
Perbandingan performa model berdasarkan nilai AUC menunjukkan bahwa seluruh model memiliki kemampuan diskriminasi yang baik (AUC > 0,7). Model dengan nilai AUC tertinggi merupakan model yang paling direkomendasikan untuk digunakan dalam pemetaan kerentanan DBD di wilayah kajian.
Peta kerentanan DBD yang dihasilkan menunjukkan distribusi spasial risiko yang tidak merata, di mana zona kerentanan tinggi terkonsentrasi pada wilayah dengan karakteristik lingkungan yang mendukung perkembangbiakan vektor nyamuk, khususnya di area berkepadatan tinggi dengan aksesibilitas sanitasi rendah.
Pendekatan pemodelan spasial berbasis machine learning terbukti efektif dalam mengidentifikasi zona-zona berisiko secara geografis, dan dapat dijadikan dasar perencanaan intervensi kesehatan lingkungan yang lebih terarah.
Breiman, L. (2001). Random forests. Machine Learning, 45(1), 5–32.
Cortes, C., & Vapnik, V. (1995). Support-vector networks. Machine Learning, 20(3), 273–297.
Elith, J., Leathwick, J. R., & Hastie, T. (2008). A working guide to boosted regression trees. Journal of Animal Ecology, 77(4), 802–813.
Hijmans, R. J., & Elith, J. (2023). Species distribution modeling with R. CRAN Vignette. https://cran.r-project.org/web/packages/dismo/vignettes/sdm.pdf
Tenenbein, A. (2020). Epidemiological modelling of dengue fever using spatial analysis. Journal of Health Geography, 12(2), 45–61.
WHO. (2023). Dengue and severe dengue. World Health Organization. https://www.who.int/news-room/fact-sheets/detail/dengue-and-severe-dengue