BELAJAR DATA SCIENCE MENYENANGKAN


Visualisasi Data di R

Import data dari URL (Github)

# 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

1. Visualisasi Data Dasar (Dengan ggplot2 )

# 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
grafik1

grafik2

grafik3

ggplot(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))

2. Visualisasikan Nilai Data

Bar Chart (Bencana yang skalanya besar)

# 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()

Needle Chart (Rata - rata kerusakan yang terjadi)

# 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()

3. Visualisasi Sebaran Data

Histogram

# 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))

4. Visualisasi Peubah Numeriknya

Scatterplot dengan Line Tren Linear

# 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 Pengelompokan Kategori

# 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()

Thanks U For All