Langsung ke konten utama

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!

Komentar

Postingan populer dari blog ini

Mencari P - Value dan Titik Kritis Uji F, Uji t, Uji Chi Square, dan Uji Z Normal dengan R

Mencari nilai p-value dan titik kritis Bagi teman-teman yang pernah mengenal statistika, pasti familier dengan istilah p-value dan titik kritis. P-value biasanya didefinisikan sebagai probabiltas atau peluang maksimal yang diamati dari hasil uji statistik, bahasa gampangnya adalah besarnya kesalahan penelitian berdasarkan uji statistik. Sebagai contoh sederhana, dari 100 orang dengan nama masing-masing dan diklasifikasikan ke dalam gender nama perempuan dan nama laki-laki, didapatkan nilai p-value uji statistiknya sebesar 0,05 atau 5%. Itu artinya, dari 100 orang, ada kemungkinan sebanyak 5 orang yang namanya salah klasifikasi. Dari namanya terdeteksi sebagai nama perempuan, padahal aktualnya yang bersangkutan bergender laki-laki. Sedangkan titik kritis atau titik uji adalah nilai batas pengujian hipotesis statistik, apakah masuk dalam wilayah tolak hipotesis, ataukah gagal menolaknya. Titik ini berkaitan erat dengan nilai p-value . Kalau biasanya kita mendapatkan kedua nilai ini da...

Cara Mendowload dan Install R serta RStudio di Windows (Step by Step)

Cara Download dan Install R serta R Studio di Windows Halo teman-teman, mohon maaf karena beberapa waktu ini, blog ini sempat vakum dari unggahan. Kali ini saya akan coba berbagai mengenai bagaimana cara mengunduh ( download ) dan menginstal ( install ) program R sekaligus R Studio khususnya di Windows. Unggahan kali ini sedikit terbalik karena semestinya saya unggah terlebih dahulu pertama kali di blog ini, namun bukan masalah, mengingat kemarin ada beberapa pihak yang meminta untuk menerangkap bagaimana tahapan mengunduh dan instalasi R dan R Studio, jadinya saya dahulukan pada unggahan ini sebelum pembahasan mengenai Data Mining , Data Science , atau bahasan Big Data kita terlampau jauh. Baik, kita akan mulai dengan bagaimana mengunduh R dan R Studio melalui mesin pencari Google. R dan R Studio ini memang beberapa waktu terakhir ini booming , apalagi dengan munculnya konsep mengenai Big Data , Data Modelling, Data Mining, dan Data Science serta Data Visualization . Sebenarnya, men...

Analisis Tipologi Klassen (Klassen Typology) dan Visualisasi Spasialnya dengan R

Tipologi Klassen dan visualisasinya dengan R Halo teman-teman, sebelumnya kita telah membahas tentang analisis Shift Share dan Location Quotient (LQ) dengan menggunakan R. Kali ini, kita akan membahas mengenai satu lagi alat analisis yang sebenarnya merupakan alat analisis tiga serangkai dari SS dan LQ, yaitu analisis Tipologi Klassen. Dalam penelitian ekonomi kewilayahan, ketiga analisis ini seringkali digunakan, baik dalam rangka melihat perkembangan dan transformasi struktur ekonomi suatu wilayah maupun melihat keunggulan kompetitif dan keunggulan komparatif wilayah satu dengan wilayah lainnya dengan mengacu wilayah referensi. Terlebih dulu, sebelum melakukan visualisasi spasial menggunakan fungsi plot(), ada baiknya kita bahas terlebih dahulu mengenai Tipologi Klassen itu sendiri. Tipologi Klassen merupakan teknik pengelompokan sektor, subsektor, lapangan usaha, atau komoditas tertentu di wilayah analisis berdasarkan pertumbuhan nilai tambah wilayah analisis terhadap nasional atau...