Analisis Gempa Bumi di Indonesia 22 Maret sampai 24 Maret 2024 dengan R

Analisis Gempa Bumi di Indonesia 22 Maret sampai 24 Maret 2024

Gempa bumi merupakan kejadian yang biasa di Indonesia. Sebagai negara kepulauan yang dilintasi oleh lempengan Asia Pasifik atau biasa diistilahkan Ring of Fire, Indonesia demikian besar mempunyai risiko terjadi gempa bumi.

Posisi yang berisiko itu tentu menjadi tantangan besar bagaimana melakukan analisis dini dan prediksi kejaadian gempa bumi secara akurat, realtime, sehingga tidak sampai menimbulkan banyak korban. Pada posisi inilah data historis mengenai kejadian gempa bumi di Indonesia perlu disediakan karena penting sebagai bekal melakukan mitigasi risiko bahkan dapat dijadikan landasan membuat kebijakan preventif kerusakan infrastruktur akibat magnitudo yang dihasilkan oleh gempa bumi.

Data historis dari situs BMKG sendiri diketahui tidak tersedia dalam periode waktu yang panjang, tetapi hanya berkisar dua minggu terakhir. Sementara data realtime yang dirilis BMKG di akun Twitter yang dapat dideteksi dengan hastags #Gempa dan Gempa Dirasakan atau #BMKG tidak selalu menginformasikan mengenai kejadian gempa bumi itu sendiri karena juga tercampur aduk dengan informasi lain serta akun lain yang juga melakukan tweet mengenai kejadian gempa bumi.

Oleh karena itu, melalui blog sederhana ini, penulis tergerak untuk melakukan share sedikit mengenai bagaimana memperoleh data gempa bumi di Indonesia dan sekitarnya yang berpotensi memberi dampak ke wilayah Indonesia sebagai ajang menyebarkan ilmu pengetahuan sekaligus dalam rangka melakukan analisis dini terhadap kejadian gempa bumi yang terjadi.

Dalam proses cleaning data gempa bumi dalam unggahan ini cukup rumit karena harus menerapkan teknik data manipulation serta Natural Language Processing (NLP). Adapun langkah-langkah yang dapat dilakukan dalam memperoleh dan mengolah data gempa bumi di Indonesia untuk periode 22 Maret 2024 hingga 24 Maret 2024 adalah sebagai berikut:

# Aktivasi beberapa package
library(rvest)
library(stringr)
library(dplyr)
library(lubridate)
library(maps)
library(gganimate)
# Unduh data gempa dari URL dengan atur periode terlebih dahulu
dari <- "2022-03-22"
sampai <- "2024-03-24"
filepath <- file.path("C:", "Users", "Joko Ade", "Documents", paste0("gempa_", dari,"_", sampai, ".txt"))

# Download file ke direktori Documents
download.file(paste0("https://ds.iris.edu/ieb/ws/event/1/query/?format=text&nodata=404&caller=ieb&starttime=",dari,"&endtime=",sampai,"&minmag=0&maxmag=10&mindepth=0&maxdepth=900&orderby=time-desc&src=iris&limit=25000&maxlat=7.986&minlat=-12.670&maxlon=141.385&minlon=93.045"), destfile = filepath, mode = "wb")
gempa <- readLines(filepath)
gempa <- gempa[!grepl(paste0("count=",nrow(gempa),""), gempa)]

# Melihat sekilas data
head(gempa)
## [1] "11820278|2024-03-23T23:47:12|-0.157|123.033|123.033|113.888|us|NEIC PDE|us|us6000mkv6|mb|4.9|us|MINAHASSA PENINSULA, SULAWESI"                      
## [2] "11820232|2024-03-23T18:23:08|4.9203|127.1703|127.1703|105.345|us|NEIC PDE|us|us6000mksg|mb|4.3|us|TALAUD ISLANDS, INDONESIA"                        
## [3] "11820182|2024-03-23T13:20:28|-4.5852|102.7516|102.7516|60.91|us,usauto|NEIC PDE|us|usauto6000mkqg,us6000mkqg|Mww|5.3|us|SOUTHERN SUMATRA, INDONESIA"
## [4] "11820088|2024-03-23T05:05:12|-4.6839|101.9678|101.9678|56.55|us|NEIC PDE|us|us6000mknq|mb|4.6|us|SOUTHERN SUMATRA, INDONESIA"                       
## [5] "11820051|2024-03-23T01:53:49|6.1362|123.8409|123.8409|547.353|us|NEIC PDE|us|us6000mkmv|mb|4|us|MINDANAO, PHILIPPINES"                              
## [6] "11819757|2024-03-22T09:19:27|-5.9192|112.4622|112.4622|10|us|NEIC PDE|us|us6000mkgc|mb|4.5|us|JAVA SEA"
# Penerapan Natural Language Processing dan Data Manipulation
# Format setiap baris
formatbaris <- paste("|", gempa, "|", sep = "")

# Pisahkan setiap baris berdasarkan pemisah "|"
splitbaris <- strsplit(formatbaris, "\\|")

# Ambil teks setelah karakter '|' terakhir sebagai kolom terakhir
kolak <- sapply(splitbaris, function(x) tail(x, n = 1)[1])

# Hapus elemen terakhir yang merupakan teks setelah karakter '|' terakhir
splitbaris <- lapply(splitbaris, function(x) head(x, -1))

# Konversi hasilnya menjadi data frame
data <- as.data.frame(do.call(rbind, splitbaris), stringsAsFactors = FALSE)

# Tetapkan nama kolom sesuai dengan struktur data yang diinginkan
names(data) <- paste0("v", 1:(length(splitbaris[[1]]) - 2))

# Tambahkan kolom terakhir dari teks setelah karakter '|' terakhir
data$var_terakhir <- kolak

datagempa <- data[-1]
names(datagempa) <- paste0("v", 1:length(datagempa))
datagempa$tgl <- as_datetime(ymd_hms(datagempa$v2))
datagempaku <- datagempa[c(3, 4, 6, 12, 14, 15)]
names(datagempaku) <- c("lat", "lon", "dept", "mag", "reg", "time")

# tambah 8 jam untuk time karena waktu di Indonesia
tambah8jam <- function(t){
  t <- ymd_hms(t)
  t <- t + hours(8)
  return(t)
}

datagempaku$time <- tambah8jam(datagempaku$time)

# nambah variabel posisi
grupwaktu <- function(t) {
  # Cek jika nilai waktu adalah NA
  if (is.na(t)) {
    return(NA)
  }

  dt <- ymd_hms(t)
  hour <- hour(dt)
  if (hour >= 5 && hour < 12) {
    return("pagi")
  } else if (hour >= 12 && hour < 15) {
    return("siang")
  } else if (hour >= 15 && hour < 18) {
    return("sore")
  } else {
    return("malam")
  }
}

datagempaku <- na.omit(datagempaku)

# Menerapkan fungsi ke data frame menggunakan mutate()
datagempaku <- datagempaku %>%
  mutate(kelompokwaktu = sapply(time, grupwaktu))

# Definisikan batas untuk setiap kategori
batas <- c(2.5, 5.4, 5.5, 6.0, 6.1, 6.9, Inf)

# Definisikan label untuk setiap kategori
label <- c("daya rusak ringan", "daya rusak cukup berat", "daya rusak cukup berat", "daya rusak berat", "daya rusak berat", "daya rusak sangat berat")

# Buat kolom baru yang menunjukkan kelompok magnitudo
datagempaku$dayarusak <- cut(as.numeric(datagempaku$mag), breaks = batas, labels = label, right = FALSE)

# lihat sekilas data
head(datagempaku)
##       lat      lon    dept mag                           reg                time
## 1  -0.157  123.033 113.888 4.9 MINAHASSA PENINSULA, SULAWESI 2024-03-24 07:47:12
## 2  4.9203 127.1703 105.345 4.3     TALAUD ISLANDS, INDONESIA 2024-03-24 02:23:08
## 3 -4.5852 102.7516   60.91 5.3   SOUTHERN SUMATRA, INDONESIA 2024-03-23 21:20:28
## 4 -4.6839 101.9678   56.55 4.6   SOUTHERN SUMATRA, INDONESIA 2024-03-23 13:05:12
## 5  6.1362 123.8409 547.353   4         MINDANAO, PHILIPPINES 2024-03-23 09:53:49
## 6 -5.9192 112.4622      10 4.5                      JAVA SEA 2024-03-22 17:19:27
##   kelompokwaktu         dayarusak
## 1          pagi daya rusak ringan
## 2         malam daya rusak ringan
## 3         malam daya rusak ringan
## 4         siang daya rusak ringan
## 5          pagi daya rusak ringan
## 6          sore daya rusak ringan
# Visualisasi Pie Chart Persentasei Kejadian Gempa di Indonesia
jumlah <- table(datagempaku$kelompokwaktu)
ggplot(data.frame(waktu = names(jumlah), jumlah = as.numeric(jumlah)), aes(x = "", y = jumlah, fill = waktu)) +
  geom_bar(stat = "identity", width = 1) +
  coord_polar("y", start = 0) +
  scale_fill_manual(values = c("pagi" = "#7FFF00", "siang" = "#32CD32", "sore" = "#3CB371", "malam" = "#228B22")) + # Warna sesuaikan dengan keinginan
  geom_text(aes(label = scales::percent(jumlah/sum(jumlah)), y = jumlah),
            position = position_stack(vjust = 0.5),
            size = 5, color = "black") + # Menambahkan label persentase
  theme_void() +
  labs(title = paste0("Persentase Kejadian Gempa di Indonesia\nmenurut Waktu periode ",dari," sampai ",sampai),
       caption = "Sumber data: ds.iris.edu | jokoding.com") +
  theme(legend.position = "bottom", plot.title = element_text(hjust = 0.5,
                                                              color = "#228B22"))

plot of chunk unnamed-chunk-15

# Pie Chart Persentase Gempa menurut Daya Rusaknya
dr <- table(datagempaku$dayarusak)
ggplot(data.frame(dayarusak = names(dr), jumlah = as.numeric(dr)), aes(x = "", y = dr, fill = dayarusak)) +
  geom_bar(stat = "identity", width = 1) +
  coord_polar("y", start = 0) +
  scale_fill_manual(values = c("daya rusak ringan" = "green", "daya rusak cukup berat" = "yellow", "daya rusak berat" = "orange", "daya rusak sangat berat" = "red")) +
  geom_text(aes(label = scales::percent(jumlah/sum(jumlah)), y = jumlah),
            position = position_stack(vjust = 0.5),
            size = 3, color = "black") + # Menambahkan label persentase
  theme_void() +
  labs(title = paste0("Persentase Kejadian Gempa di Indonesia\nmenurut Daya Rusak periode ",dari," sampai ",sampai),
       caption = "Sumber data: ds.iris.edu | jokoding.com") +
  theme(legend.position = "bottom", plot.title = element_text(hjust = 0.5,
                                                              color = "#228B22"))
## Don't know how to automatically pick scale for object of type table. Defaulting to continuous.

plot of chunk unnamed-chunk-16

# Bar Chart Kejadian Gempa menurut Lokasi
jmlwil <- table(datagempaku$reg)
df <- data.frame(wilayah = names(jmlwil), jumlah = as.numeric(jmlwil))
df <- df[order(df$jumlah), ]
df$top_10 <- ifelse(rank(-df$jumlah) <= 10, "Top 10", "Others")

ggplot(df, aes(x = reorder(wilayah, jumlah), y = jumlah, fill = top_10)) +
  geom_bar(stat = "identity") +
  ylab("Wilayah") +
  labs(title = paste0("Jumlah Kejadian Gempa di Indonesia\nmenurut Wilayah periode ", dari, " sampai ", sampai),
       caption = "Sumber data: ds.iris.edu | jokoding.com",
       x = "Wilayah") +
  theme(legend.position = "none",
        plot.title = element_text(hjust = 0.5, color = "#228B22"),
        axis.text.x = element_text(angle = 45, hjust = 1, size = 5)) +  # Mengatur orientasi teks sumbu x
  scale_fill_manual(values = c("Top 10" = "green", "Others" = "grey")) +
  coord_flip()

plot of chunk unnamed-chunk-17

# Visualisasi Peta Spasial Kejadian Gempa di Indonesia
county_info <- map_data("world", region = "Indonesia")
base_map <- ggplot(data = county_info, mapping = aes(x = long, y = lat, group = group)) +
  geom_polygon(color = "#32CD32", fill = "#32CD32") +
  coord_quickmap() +
  theme_void()
base_map +
  geom_point(data = datagempaku, aes(x = as.numeric(lon),
                                     y = as.numeric(lat), group = time), col = "#228B22") +
  labs(title = paste0("Sebaran Gempa Bumi di Indonesia\nperiode ",dari," sampai ",sampai),
       caption = "Sumber data: ds.iris.edu | jokoding.com") +
  theme(legend.position = "none", plot.title = element_text(hjust = 0.5,
                                                            color = "#228B22"))

plot of chunk unnamed-chunk-18

Berdasarkan visualisasi hasil olah data gempa bumi, terlihat bahwa persentase terbanyak kejadian gempa bumi di Indonesia selama 22-24 Maret 2024 adalah malam hari, yakni sebesar 45,90 persen diikuti kejadian pada pagi hari sebesar 32,40 persen. Oleh karena itu, masyarakat Indonesia diimbau agar meningkatkan kewaspadaan khususnya pada wilayah-wilayah sangat berisiko besar terjadi gempa bumi selama malam dan pagi hari.

Kendati persentase daya rusak gempa bumi ringan mencapai 95,49 persen selama 22-24 Maret 2024, namun persentase daya rusak gempa bumi cukup berat mencapai 3,26 persen. Ini tentu menjadi bahan perhatian bagi pemerintah untuk menerapkan regulasi mengenai konstruksi bangunan anti gempa di Indonesia lebih intensif lagi.

Untuk wilayah Jawa sendiri, kejadian gempa bumi yang terjadi selama 22-24 Maret 2024 tercatat sekitar 196 kali dengan intensitas terjadi di Laut Jawa bagian Selatan. Dari hasil filter data, diketahui bahwa Gempa Bumi yang terjadi di Tuban dan Pulau Bawean, Jawa Timur pada 22 Maret 2024 lalu terjadi pada waktu siang hari dengan daya rusak cukup berat karena magnitudo gempa yang terpantau mencapai 6,4 SR.

Demikian sedikit sharing mengenai analisis gempa bumi di Indonesia. Semoga bermanfaat, selamat memahami dan mempraktikkan!

Add Comments


EmoticonEmoticon