library(readxl)
library(ggplot2)
library(dplyr)
library(tidyr)
library(scales)
library(knitr)
library(kableExtra)
data <- read_excel("Jumlah Bencana Alam Menurut Provinsi dan Jenis Bencana Alam.xlsx")
# Pisahkan data Indonesia dan provinsi
data_indonesia <- data %>% filter(PROVINSI == "Indonesia")
data_provinsi <- data %>% filter(PROVINSI != "Indonesia")
# Data jenis bencana
df_bencana <- data_indonesia %>%
select(-PROVINSI, -`Jumlah total`) %>%
pivot_longer(everything(), names_to="Jenis_Bencana", values_to="Jumlah") %>%
filter(Jumlah > 0) %>%
mutate(
Persen = Jumlah / sum(Jumlah),
Label = paste0(Jenis_Bencana, "\n", Jumlah, " (", percent(Persen, 0.1), ")")
) %>%
arrange(desc(Jumlah)) %>%
mutate(Label = factor(Label, levels=Label))
ggplot(df_bencana, aes(x="", y=Jumlah, fill=Label)) +
geom_col(width=1, color="white") +
coord_polar(theta="y") +
scale_fill_brewer(palette="Set3") +
theme_void() +
labs(title="Distribusi Jenis Bencana di Indonesia",
subtitle="Total 4.728 kejadian dari 38 provinsi",
fill="Jenis Bencana") +
theme(plot.title=element_text(hjust=0.5, face="bold"),
legend.text=element_text(size=10))
Pie chart ini menunjukkan proporsi 10 jenis bencana alam yang terjadi di Indonesia berdasarkan data total nasional. Dari 4.728 total kejadian bencana, terlihat jelas bahwa distribusinya tidak merata dan didominasi oleh beberapa jenis bencana tertentu.
Berdasarkan pie chart distribusi jenis bencana di Indonesia, ditemukan bahwa banjir merupakan bencana paling dominan dengan 2.009 kejadian (42,5% dari total), menjadikannya ancaman utama yang paling sering terjadi akibat tingginya curah hujan dan faktor lingkungan. Dua bencana signifikan lainnya adalah kebakaran hutan dan lahan dengan 1.329 kejadian (28,1%) serta cuaca ekstrem sebanyak 958 kejadian (20,3%). Ketiga bencana ini secara akumulatif mencapai 90,9% dari total 4.728 kejadian bencana, yang berarti 9 dari 10 bencana di Indonesia didominasi oleh banjir, kebakaran hutan, dan cuaca ekstrem. Sementara itu, tanah longsor menempati proporsi menengah dengan 330 kejadian (7,0%) yang tetap signifikan mengingat karakteristik wilayah Indonesia yang berbukit dan rawan longsor pasca hujan deras.
ggplot(df_bencana, aes(x=reorder(Jenis_Bencana, Jumlah), y=Jumlah, fill=Jumlah)) +
geom_col() +
geom_text(aes(label=paste0(Jumlah, " (", round(Persen*100,1), "%)")), hjust=-0.1, size=3.5) +
coord_flip() +
scale_y_continuous(expand = expansion(mult = c(0, 0.30))) +
scale_fill_gradient(low="skyblue", high="darkblue") +
labs(title="Jumlah Kejadian Bencana per Jenis",
x="Jenis Bencana", y="Jumlah Kejadian") +
theme_minimal() +
theme(
legend.position="none",
plot.title=element_text(hjust=0.5, face="bold")
)
Bar chart menunjukkan perbandingan jumlah kejadian antar jenis bencana secara lebih eksplisit. Tampak jelas bahwa banjir mendominasi dengan 2.009 kejadian, jauh meninggalkan kebakaran hutan dan lahan (1.329) serta cuaca ekstrem (958) yang menempati posisi kedua dan ketiga. Ketiga bencana ini membentuk kelompok dominan dengan total 90,9% dari seluruh kejadian. Tanah longsor (330 kejadian) berada di posisi keempat dengan selisih yang cukup jauh, diikuti oleh kelompok bencana berfrekuensi rendah seperti kekeringan (37), gempa bumi (29), gelombang pasang (28), letusan gunung api (7), dan tsunami (1) yang secara bersama hanya mencakup 2,1% dari total kejadian. Visualisasi ini menegaskan bahwa upaya mitigasi bencana nasional perlu diprioritaskan pada tiga bencana utama, khususnya banjir sebagai ancaman paling dominan.
# numeric
data_provinsi <- data_provinsi %>%
mutate(`Jumlah total` = as.numeric(gsub(",", "", `Jumlah total`)))
# Fungsi modus
get_mode <- function(x) unique(x)[which.max(tabulate(match(x,x)))]
# Hitung statistik
stats_total <- list(
mean = mean(data_provinsi$`Jumlah total`, na.rm=TRUE),
median = median(data_provinsi$`Jumlah total`, na.rm=TRUE),
mode = get_mode(data_provinsi$`Jumlah total`),
q1 = quantile(data_provinsi$`Jumlah total`, 0.25, na.rm=TRUE),
q3 = quantile(data_provinsi$`Jumlah total`, 0.75, na.rm=TRUE),
range = diff(range(data_provinsi$`Jumlah total`, na.rm=TRUE)),
variance = var(data_provinsi$`Jumlah total`, na.rm=TRUE),
sd = sd(data_provinsi$`Jumlah total`, na.rm=TRUE)
)
# Plot Histogram
ggplot(data_provinsi, aes(x=`Jumlah total`)) +
geom_histogram(bins=10, fill="steelblue", color="black", alpha=0.7) +
geom_vline(xintercept = stats_total$mean, color="red", linetype="dashed", size=1) +
geom_vline(xintercept = stats_total$median, color="darkgreen", linetype="dotted", size=1) +
geom_vline(xintercept = stats_total$mode, color="purple", linetype="dotdash", size=1) +
labs(
title="Histogram Total Bencana per Provinsi",
subtitle="Merah=Mean | Hijau=Median | Ungu=Modus",
x="Jumlah Total Bencana",
y="Jumlah Provinsi"
) +
theme_minimal() +
theme(
plot.title=element_text(face="bold", hjust=0.5),
plot.subtitle=element_text(hjust=0.5, color="gray40")
)
Histogram distribusi total bencana per provinsi menunjukkan bahwa sebagian besar provinsi di Indonesia (73,7%) memiliki total kejadian bencana kurang dari 200, dengan konsentrasi tertinggi berada di rentang 0-150 kejadian. Sebaran data membentuk pola menceng ke kanan (right-skewed) , yang mengindikasikan bahwa hanya sedikit provinsi yang mengalami bencana dalam jumlah sangat tinggi. Terdapat 4 provinsi outlier dengan total bencana di atas 300 kejadian, yaitu Jawa Barat (586), Riau (396), Jawa Timur (390), dan Sumatera Utara (336). Keempat provinsi ini memerlukan perhatian khusus dalam upaya mitigasi dan penanganan bencana karena tingkat kerawanannya yang jauh di atas provinsi lainnya. Sementara itu, provinsi seperti Papua Selatan (1 kejadian) dan Papua Tengah (4 kejadian) berada di ujung paling kiri distribusi dengan tingkat bencana sangat rendah.
# Plot Density
ggplot(data_provinsi, aes(x=`Jumlah total`)) +
geom_density(fill="skyblue", alpha=0.5) +
geom_vline(xintercept = stats_total$mean, color="red", linetype="dashed", size=1) +
geom_vline(xintercept = stats_total$median, color="darkgreen", linetype="dotted", size=1) +
geom_vline(xintercept = stats_total$mode, color="purple", linetype="dotdash", size=1) +
labs(
title="Density Plot Total Bencana per Provinsi",
subtitle="Merah=Mean | Hijau=Median | Ungu=Modus",
x="Jumlah Total Bencana",
y="Kepadatan"
) +
theme_minimal() +
theme(
plot.title=element_text(face="bold", hjust=0.5),
plot.subtitle=element_text(hjust=0.5, color="gray40")
)
Density plot memperlihatkan distribusi total bencana per provinsi dalam bentuk kurva kepadatan yang halus. Kurva mencapai puncak tertinggi di sekitar nilai 50-80 kejadian, mengonfirmasi bahwa sebagian besar provinsi terkonsentrasi pada rentang bencana rendah hingga menengah. Bentuk kurva yang menceng ke kanan (right-skewed) dengan ekor panjang di sebelah kanan menunjukkan bahwa hanya sedikit provinsi yang memiliki nilai ekstrem tinggi, sementara mayoritas data mengumpul di sisi kiri. Setelah melewati nilai 150 kejadian, kurva mulai melandai drastis, dan memasuki area >300 kejadian kurva hampir menyentuh sumbu datar, merepresentasikan 4 provinsi outlier (Jawa Barat, Jawa Timur, Riau, dan Sumatera Utara) yang berada jauh dari konsentrasi utama. Visualisasi ini menegaskan bahwa kerawanan bencana di Indonesia tidak terdistribusi merata, dengan sebagian besar provinsi memiliki tingkat bencana rendah hingga menengah, sementara beberapa provinsi tertentu menjadi titik rawan utama dengan frekuensi bencana sangat tinggi.
df_total <- data_provinsi %>% select(PROVINSI, `Jumlah total`) %>% arrange(desc(`Jumlah total`))
summary_stats <- stats_total
stat_text <- paste0("Mean: ", round(stats_total$mean,1),
" | Median: ", stats_total$median,
" | Q1-Q3: ", round(stats_total$q1,1), "-", round(stats_total$q3,1))
ggplot(data_provinsi, aes("", `Jumlah total`)) +
geom_boxplot(fill="#4A90E2", color="#1F2D3A", width=.35, coef=Inf, outlier.shape=NA) +
geom_jitter(width=.08, alpha=.5, size=2, color="#2C3E50") +
stat_summary(fun=mean, geom="point", shape=23, size=4, fill="#F1C40F") +
labs(title="Distribusi Jumlah Bencana per Provinsi",
subtitle="Boxplot total kejadian bencana (median dan mean)",
y="Jumlah Bencana") +
theme_minimal() +
theme(axis.title.x=element_blank(),
axis.text.x=element_blank(),
plot.title=element_text(hjust=.5, face="bold"),
plot.subtitle=element_text(hjust=.5))
Boxplot menggambarkan penyebaran data jumlah bencana per provinsi melalui lima nilai ringkasan statistik yaitu nilai minimum, kuartil pertama (Q1), median, kuartil ketiga (Q3), dan maksimum. Dari grafik boxplot terlihat bahwa sebagian besar data berada dalam rentang interkuartil (IQR), yang menunjukkan bahwa mayoritas provinsi memiliki jumlah kejadian bencana pada rentang nilai tersebut.
Titik-titik yang berada di luar kotak menunjukkan adanya variasi jumlah bencana antar provinsi. Beberapa provinsi memiliki jumlah kejadian bencana yang jauh lebih tinggi dibandingkan provinsi lainnya sehingga muncul sebagai nilai ekstrem. Secara inferensia, kondisi ini menunjukkan adanya ketimpangan distribusi jumlah bencana antar wilayah di Indonesia, di mana beberapa provinsi memiliki tingkat kerawanan bencana yang lebih tinggi dibandingkan provinsi lainnya.
stats_table <- data.frame(
Mean = stats_total$mean,
Median = stats_total$median,
Modus = stats_total$mode,
Q1 = as.numeric(stats_total$q1),
Q3 = as.numeric(stats_total$q3),
Range = stats_total$range,
Varians = stats_total$variance,
`Standar Deviasi` = stats_total$sd
)
stats_table <- stats_table %>%
mutate(across(everything(), scales::comma))
kable(stats_table, caption="Statistik Deskriptif Total Bencana per Provinsi") %>%
kable_styling(full_width = FALSE)
| Mean | Median | Modus | Q1 | Q3 | Range | Varians | Standar.Deviasi |
|---|---|---|---|---|---|---|---|
| 124 | 86 | 135 | 38 | 144 | 585 | 17,414 | 132 |
Berdasarkan hasil perhitungan statistik deskriptif terhadap jumlah total bencana per provinsi di Indonesia, diperoleh beberapa ukuran pemusatan dan penyebaran data.
Nilai mean (rata-rata) sebesar 124 menunjukkan bahwa secara rata-rata setiap provinsi mengalami sekitar 124 kejadian bencana. Namun nilai median sebesar 86 menunjukkan bahwa setengah dari provinsi memiliki jumlah bencana di bawah 86 kejadian dan setengah lainnya di atas nilai tersebut.
Nilai modus sebesar 135 menunjukkan bahwa jumlah kejadian bencana yang paling sering muncul pada data adalah sekitar 135 kejadian.
Berdasarkan ukuran kuartil, Q1 (kuartil pertama) sebesar 38 menunjukkan bahwa sekitar 25% provinsi memiliki jumlah bencana kurang dari atau sama dengan 38 kejadian. Sementara itu Q3 (kuartil ketiga) sebesar 144 menunjukkan bahwa sekitar 75% provinsi memiliki jumlah bencana kurang dari atau sama dengan 144 kejadian. Dengan demikian, sebagian besar provinsi memiliki jumlah kejadian bencana pada rentang 38 hingga 144 kejadian.
Ukuran penyebaran data menunjukkan bahwa range sebesar 585, yang berarti selisih antara jumlah bencana tertinggi dan terendah antar provinsi mencapai 585 kejadian. Nilai varians sebesar 17.414 dan standar deviasi sebesar 132 menunjukkan bahwa terdapat penyebaran data yang cukup besar antar provinsi, sehingga jumlah kejadian bencana tidak merata di setiap wilayah.
Secara keseluruhan, hasil ini menunjukkan bahwa distribusi jumlah bencana antar provinsi cukup bervariasi, di mana beberapa provinsi mengalami jumlah bencana yang jauh lebih tinggi dibandingkan provinsi lainnya.