BELAJAR DATA SCIENCE MENYENANGKAN
Visualisasi Data di R
# Target penyimpanan di partisi Drive
dir.create("D:/lab/datasets/raw", recursive = TRUE, showWarnings = FALSE)
target_file <- "D:/lab/datasets/raw/data_bencana_indonesia.csv"
url_target <- "https://raw.githubusercontent.com/datasets-id/bencana-indonesia/main/data/bencana_indonesia.csv"
# Validasi koneksinya
url_hidup <- function(url) {
con <- suppressWarnings(try(url(url, open = "rb"), silent = TRUE))
if (inherits(con, "try-error")) return(FALSE)
close(con)
return(TRUE)
}
# Eksekusi pengunduhan
if (url_hidup(url_target)) {
message("URL GitHub aktif. Mengunduh data asli...")
df_bencana <- read.csv(url_target, stringsAsFactors = FALSE)
write_csv(df_bencana, target_file)
message("Dataset berhasil disimpan di Drive D.")
} else {
message("URL luar tidak merespons. Mengaktifkan dataset simulasi BNPB...")
set.seed(42)
jenis <- c("Banjir", "Tanah Longsor", "Puting Beliung", "Gempa Bumi", "Kekeringan")
kabupaten <- c("Kab. Cilacap", "Kab. Bogor", "Kab. Sukabumi", "Kab. Bandung",
"Kota Semarang", "Kab. Malang", "Kab. Garut", "Kab. Lebak")
df_bencana <- data.frame(
id = 1:300,
tanggal_kejadian = seq(as.Date("2021-01-01"), as.Date("2023-12-31"), length.out = 300),
jenis_bencana = sample(jenis, 300, replace = TRUE, prob = c(0.4, 0.25, 0.2, 0.1, 0.05)),
kabupaten_kota = sample(kabupaten, 300, replace = TRUE),
meninggal = rpois(300, lambda = 1.2),
menderita_mengungsi = round(rlnorm(300, meanlog = 7.5, sdlog = 1.8)),
rumah_rusak_berat = round(rlnorm(300, meanlog = 3.5, sdlog = 1.4)),
stringsAsFactors = FALSE
)
write_csv(df_bencana, target_file)
message("Dataset simulasi BNPB berhasil dibuat dan disimpan.")
}
head.matrix(df_bencana)## id tanggal_kejadian jenis_bencana kabupaten_kota meninggal
## 1 1 2021-01-01 Gempa Bumi Kab. Cilacap 1
## 2 2 2021-01-04 Gempa Bumi Kab. Lebak 0
## 3 3 2021-01-08 Banjir Kab. Malang 2
## 4 4 2021-01-11 Puting Beliung Kab. Lebak 1
## 5 5 2021-01-15 Tanah Longsor Kab. Cilacap 1
## 6 6 2021-01-19 Tanah Longsor Kota Semarang 1
## menderita_mengungsi rumah_rusak_berat
## 1 173 3
## 2 1151 2
## 3 2460 21
## 4 875 42
## 5 2183 1
## 6 1018 50
# Buat objek visualisasi dasar
grafik1 <- ggplot(data = df_bencana, aes(x = jenis_bencana, y = rumah_rusak_berat)) # teknik 1
grafik2 <- ggplot(data = df_bencana, aes(x = jenis_bencana, y = rumah_rusak_berat)) + geom_point() #teknik 2
grafik3 <- ggplot(data = df_bencana) + geom_point(aes(x = jenis_bencana, y = rumah_rusak_berat)) #teknik 3
# Tampilkan masing-masing grafik
grafik1ggplot(df_bencana, aes(x = jenis_bencana, y = rumah_rusak_berat)) +
geom_point(aes(color = jenis_bencana), size = 2.5, alpha = 0.6) +
theme_light() +
labs(
title = "Scatter Plot Jenis Bencana vs Rumah Rusak Berat",
x = "Jenis Bencana",
y = "Jumlah Rumah Rusak Berat"
) +
theme(axis.text.x = element_text(angle = 30, hjust = 1))# Menyaring wilayah yang korban pengungsinya > 1.000 jiwa dan mengambil peringkat 5 teratas
q11 <- df_bencana %>%
filter(menderita_mengungsi > 1000) %>%
count(kabupaten_kota, sort = TRUE) %>%
slice_head(n = 5)
q11 <- data.frame(q11)
# Visualisasi Bar Chart terurut
ggplot(q11, aes(x = reorder(kabupaten_kota, n), y = n)) +
geom_bar(stat = "identity", fill = "steelblue") +
labs(
title = "Top 5 Wilayah Dengan Frekuensi Bencanan Besar (>1000 Orang) ",
x = "Kabupaten / Kota",
y = "Jumlah Kejadian"
) +
coord_flip() +
theme_light()# Memfilter kejadian bencana berdampak besar
q22 <- df_bencana %>%
filter(rumah_rusak_berat > 50)
# Menghitung rata-rata kerusakan per jenis bencana
q222 <- aggregate(q22$rumah_rusak_berat, by = list(q22$jenis_bencana), FUN = mean)
head(q222)## Group.1 x
## 1 Banjir 255.3556
## 2 Gempa Bumi 612.0000
## 3 Kekeringan 262.2500
## 4 Puting Beliung 162.9500
## 5 Tanah Longsor 200.6061
# Membuat visualisasi Needle Chart
ggplot(data = q222, aes(x = reorder(Group.1, x), y = x)) +
geom_point(color = "navyblue", size = 4, alpha = 0.8) +
geom_segment(aes(x = reorder(Group.1, x), xend = reorder(Group.1, x), y = 0, yend = x),
color = "navyblue", linewidth = 1) +
labs(
title = "Rerata Kerusakan Rumah Berat per Jenis Bencana",
x = "Jenis Bencana",
y = "Rerata Rumah Rusak Berat"
) +
coord_flip() +
theme_light()# Histogram Sebaran Korban Meninggal
ggplot(df_bencana, aes(x = meninggal)) +
geom_histogram(bins = 20, fill = "firebrick", color = "white") +
labs(
title = "Sebaran Korban Meninggal Akibat Bencana",
x = "Jumlah Korban Meninggal",
y = "Frekuensi Kejadian"
) +
theme_light()# Histogram Sebaran Korban Mengungsi
ggplot(df_bencana, aes(x = menderita_mengungsi)) +
geom_histogram(bins = 30, fill = "darkgreen", color = "white") +
labs(
title = "Sebaran Jumlah Korban Mengungsi",
x = "Jumlah Korban Mengungsi",
y = "Frekuensi Kejadian"
) +
theme_light()# Boxplot membandingkan pengungsi dengan Jenis Bencananya
ggplot(df_bencana, aes(x = jenis_bencana, y = menderita_mengungsi, fill = jenis_bencana)) +
geom_boxplot(outlier.color = "red", outlier.shape = 16, alpha = 0.7) +
scale_y_log10() +
labs(
title = "Perbandingan Sebaran Korban Mengungsi Berdasarkan Jenis Bencana",
x = "Jenis Bencana",
y = "Korban Mengungsi"
) +
theme_light() +
theme(legend.position = "none", axis.text.x = element_text(angle = 25, hjust = 1))# Boxplot membandingkan kerusakan rumah berat dengan Jenis Bencana diderita
ggplot(df_bencana, aes(x = jenis_bencana, y = rumah_rusak_berat, fill = jenis_bencana)) +
geom_boxplot(outlier.color = "darkred", alpha = 0.7) +
scale_y_log10() +
labs(
title = "Perbandingan Kerusakan Rumah Berat Berdasarkan Jenis Bencana",
x = "Jenis Bencana",
y = "Rumah Rusak Berat (Skala Logaritmik)"
) +
theme_light() +
theme(legend.position = "none", axis.text.x = element_text(angle = 25, hjust = 1))# Scatterplot Kerusakan Rumah Berat dengan Jumlah Korban Mengungsi
ggplot(df_bencana, aes(x = rumah_rusak_berat, y = menderita_mengungsi)) +
geom_point(alpha = 0.6, color = "darkslategrey") +
scale_x_log10() +
scale_y_log10() +
geom_smooth(method = "lm", se = FALSE, color = "red") +
labs(
title = "Hubungan Kerusakan Rumah Berat dengan Jumlah Korban Mengungsi",
x = "Rumah Rusak Berat (log (10))",
y = "Korban Mengungsi (log (10))"
) +
theme_light()# Scatterplot korelasi kategori bencana
ggplot(df_bencana, aes(x = rumah_rusak_berat, y = menderita_mengungsi, color = jenis_bencana)) +
geom_point(alpha = 0.7, size = 2.5) +
scale_x_log10() +
scale_y_log10() +
labs(
title = "Hubungan Kerusakan Rumah vs Pengungsi Berdasarkan Karakteristik Bencana",
x = "Rumah Rusak Berat (log(10))",
y = "Korban Mengungsi (Log(10))",
color = "Jenis Bencana"
) +
theme_light()