Analisis ini bertujuan memeriksa asumsi-asumsi ANOVA satu arah menggunakan data kesehatan menurut provinsi tahun 2025. Variabel respons adalah angka kesakitan Demam Berdarah Dengue (DBD) per 100.000 penduduk, sedangkan faktor pengelompokan adalah wilayah.
file_data <- "C:/Users/Marcella/Downloads/Kasus Penyakit Menurut Provinsi dan Jenis Penyakit, 2025 (3).xlsx"
Penyakit <- read_excel(file_data)
kolom_prov <- "Provinsi"
kolom_dbd <- grep(
"Angka Kesakitan DBD per 100.000 Penduduk",
names(Penyakit), fixed = TRUE, value = TRUE
)[1]
if (is.na(kolom_dbd)) stop("Kolom DBD tidak ditemukan. Periksa names(Penyakit).")
dat <- data.frame(
Provinsi = trimws(as.character(Penyakit[[kolom_prov]])),
DBD = suppressWarnings(as.numeric(as.character(Penyakit[[kolom_dbd]])))
)
wilayah_list <- list(
Sumatra = c("Aceh", "Sumatera Utara", "Sumatera Barat", "Riau", "Jambi",
"Sumatera Selatan", "Bengkulu", "Lampung",
"Kepulauan Bangka Belitung", "Kepulauan Riau"),
Jawa = c("DKI Jakarta", "Jawa Barat", "Jawa Tengah", "DI Yogyakarta",
"Daerah Istimewa Yogyakarta", "Jawa Timur", "Banten"),
`Bali-Nusa Tenggara` = c("Bali", "Nusa Tenggara Barat", "Nusa Tenggara Timur"),
Kalimantan = c("Kalimantan Barat", "Kalimantan Tengah", "Kalimantan Selatan",
"Kalimantan Timur", "Kalimantan Utara"),
Sulawesi = c("Sulawesi Utara", "Sulawesi Tengah", "Sulawesi Selatan",
"Sulawesi Tenggara", "Gorontalo", "Sulawesi Barat"),
Maluku = c("Maluku", "Maluku Utara"),
Papua = c("Papua", "Papua Barat", "Papua Barat Daya", "Papua Selatan",
"Papua Tengah", "Papua Pegunungan")
)
wilayah_prov <- setNames(rep(names(wilayah_list), lengths(wilayah_list)),
unlist(wilayah_list))
dat$Wilayah <- unname(wilayah_prov[dat$Provinsi])
dat <- dat[!is.na(dat$Wilayah) & !is.na(dat$DBD), ]
dat$Wilayah <- factor(dat$Wilayah, levels = names(wilayah_list))
knitr::kable(head(dat, 10),
col.names = c("Provinsi", "Angka Kesakitan DBD", "Wilayah"),
digits = 2, caption = "Cuplikan 10 observasi pertama yang dianalisis")| Provinsi | Angka Kesakitan DBD | Wilayah |
|---|---|---|
| Aceh | 37.08 | Sumatra |
| Sumatera Utara | 27.91 | Sumatra |
| Sumatera Barat | 41.63 | Sumatra |
| Riau | 54.07 | Sumatra |
| Jambi | 37.87 | Sumatra |
| Sumatera Selatan | 45.57 | Sumatra |
| Bengkulu | 41.35 | Sumatra |
| Lampung | 69.21 | Sumatra |
| Kepulauan Bangka Belitung | 104.72 | Sumatra |
| Kepulauan Riau | 91.31 | Sumatra |
ringkasan <- data.frame(
Keterangan = c("Jumlah observasi valid", "Jumlah provinsi unik",
"Jumlah nama provinsi ganda"),
Hasil = c(nrow(dat), length(unique(dat$Provinsi)), sum(duplicated(dat$Provinsi)))
)
knitr::kable(ringkasan, caption = "Ringkasan data")| Keterangan | Hasil |
|---|---|
| Jumlah observasi valid | 36 |
| Jumlah provinsi unik | 36 |
| Jumlah nama provinsi ganda | 0 |
Independensi berarti satu pengamatan tidak dipengaruhi oleh pengamatan lainnya. Pemeriksaan awal dilakukan dengan mengecek apakah nama provinsi muncul lebih dari satu kali.
## Jumlah provinsi unik: 36
## Jumlah provinsi ganda: 0
## character(0)
model <- aov(DBD ~ Wilayah, data = dat)
hasil_anova <- summary(model)
knitr::kable(as.data.frame(hasil_anova[[1]]), digits = 4,
caption = "Hasil ANOVA satu arah")| Df | Sum Sq | Mean Sq | F value | Pr(>F) | |
|---|---|---|---|---|---|
| Wilayah | 6 | 20877.20 | 3479.533 | 2.3023 | 0.0612 |
| Residuals | 29 | 43827.93 | 1511.308 | NA | NA |
Model ini membandingkan rata-rata angka kesakitan DBD antarwilayah.
Uji normalitas dilakukan terhadap residual model menggunakan uji Shapiro-Wilk.
##
## Shapiro-Wilk normality test
##
## data: res
## W = 0.86979, p-value = 0.0005624
qqnorm(res, main = "Q-Q Plot Residual ANOVA", pch = 19, col = warna_ungu)
qqline(res, col = warna_pink, lwd = 2)Q-Q Plot untuk memeriksa normalitas residual
hist(res, main = "Histogram Residual", xlab = "Residual", ylab = "Frekuensi",
col = warna_biru, border = "white")Distribusi residual model ANOVA
Kriteria pada taraf signifikansi 5%: p-value > 0,05 berarti tidak ada bukti yang cukup untuk menolak normalitas; p-value ≤ 0,05 berarti normalitas residual tidak terpenuhi berdasarkan uji tersebut.
Uji homogenitas dilakukan dengan pendekatan Brown-Forsythe, yaitu membandingkan deviasi absolut dari median setiap kelompok menggunakan ANOVA.
median_kelompok <- ave(dat$DBD, dat$Wilayah, FUN = median)
dat$Deviasi <- abs(dat$DBD - median_kelompok)
uji_bf <- aov(Deviasi ~ Wilayah, data = dat)
hasil_bf <- summary(uji_bf)
knitr::kable(as.data.frame(hasil_bf[[1]]), digits = 4,
caption = "Hasil uji Brown-Forsythe")| Df | Sum Sq | Mean Sq | F value | Pr(>F) | |
|---|---|---|---|---|---|
| Wilayah | 6 | 7877.426 | 1312.904 | 1.2216 | 0.3239 |
| Residuals | 29 | 31168.693 | 1074.783 | NA | NA |
Kriteria pada taraf signifikansi 5%: p-value > 0,05 berarti tidak ada bukti yang cukup bahwa varians berbeda; p-value ≤ 0,05 menunjukkan bukti bahwa varians antarkelompok berbeda.
knitr::kable(
data.frame(
Ukuran = c("Rataan residual", "Jumlah residual"),
Nilai = c(mean(res), sum(res))
),
digits = 12, caption = "Pemeriksaan residual"
)| Ukuran | Nilai |
|---|---|
| Rataan residual | 0 |
| Jumlah residual | 0 |
Pada model ANOVA yang memuat rata-rata kelompok, rataan residual seharusnya mendekati nol. Nilai sangat kecil dapat muncul akibat ketelitian numerik komputer.
Model yang digunakan hanya memiliki satu faktor, yaitu wilayah. Karena itu, efek aditif antardua faktor tidak dapat diuji secara terpisah dengan model ini. Pemeriksaan interaksi membutuhkan model faktorial dan data yang sesuai.
p_normal <- uji_normal$p.value
p_homogen <- hasil_bf[[1]][["Pr(>F)"]][1]
p_anova <- hasil_anova[[1]][["Pr(>F)"]][1]
cat("**Uji normalitas residual:** p-value = ", format.pval(p_normal, digits=4), ". ", sep="")Uji normalitas residual: p-value = 0.0005624.
if (p_normal > 0.05) {
cat("Tidak ada bukti yang cukup untuk menolak normalitas residual.\n\n")
} else {
cat("Normalitas residual tidak terpenuhi berdasarkan uji Shapiro-Wilk.\n\n")
}Normalitas residual tidak terpenuhi berdasarkan uji Shapiro-Wilk.
cat("**Uji homogenitas Brown-Forsythe:** p-value = ", format.pval(p_homogen, digits=4), ". ", sep="")Uji homogenitas Brown-Forsythe: p-value = 0.3239.
if (p_homogen > 0.05) {
cat("Tidak ada bukti yang cukup bahwa varians antarkelompok berbeda.\n\n")
} else {
cat("Terdapat bukti bahwa varians antarkelompok berbeda.\n\n")
}Tidak ada bukti yang cukup bahwa varians antarkelompok berbeda.
Uji ANOVA: p-value = 0.0612.
if (p_anova < 0.05) {
cat("Terdapat bukti perbedaan rata-rata angka kesakitan DBD antarwilayah pada taraf 5%.\n\n")
} else {
cat("Belum terdapat bukti yang cukup untuk menyatakan perbedaan rata-rata angka kesakitan DBD antarwilayah pada taraf 5%.\n\n")
}Belum terdapat bukti yang cukup untuk menyatakan perbedaan rata-rata angka kesakitan DBD antarwilayah pada taraf 5%.
cat("**Catatan:** hasil ANOVA perlu ditafsirkan hati-hati karena normalitas residual tidak terpenuhi. Independensi tidak dapat dipastikan hanya dari pemeriksaan duplikasi, dan efek aditif antarfaktor tidak dapat diuji dalam model satu faktor.")Catatan: hasil ANOVA perlu ditafsirkan hati-hati karena normalitas residual tidak terpenuhi. Independensi tidak dapat dipastikan hanya dari pemeriksaan duplikasi, dan efek aditif antarfaktor tidak dapat diuji dalam model satu faktor.
Sumber data:
Badan Pusat Statistik. (2026, 16 Februari). Kasus penyakit menurut provinsi dan jenis penyakit, 2025. https://www.bps.go.id/id/statistics-table/3/YTA1Q1ptRmhUMEpXWTBsQmQyZzBjVzgwUzB4aVp6MDkjMw%3D%3D/kasus-penyakit-menurut-provinsi-dan-jenis-penyakit.html