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

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!

Web Scraping dengan API Data Harga Emas dalam Satuan Rupiah per Gram - Harga Emas Terkini

Web Scraping dengan API Data Harga Emas dalam Satuan Rupiah per Gram - Harga Emas Terkini

Web scraping dengan API data harga emas rupiah per gram

Jumpa kembali dalam sharing session di blog sederhana ini. Kali ini saya akan sedikit sharing bagaimana menerapkan web scraping suatu data  yang bersifat publik di mana data tersebut memiliki API sebagai bentuk dapat dibagipakaikan datanya.

Data dengan API biasanya sepengalaman saya itu dapat diperoleh dalam bentuk JSON. Selain itu, data-data semacam ini juga dapat diperoleh dengan cukup mudah serta umumnya meliputi banyak variabel di dalamnya.

Dalam penerapan web scraping dengan R sendiri, untuk menangani jenis data dengan API dapat menggunakan library jsonlite dengan terlebih dahulu kita aktivasi dengan fungsi library(jsonlite). Package ini dapat diinstal secara mudah dengan memanfaatkan code install.packages("jsonlite") atau dapat pula dengan menggunakan fungsi remote:: dan install_github().

Adapun obyek data yang akan kita scrape kali ini adalah data harga emas dalam rupiah per gramnya. Data ini bersumber dari situs pluang.com dan sifatnya runtun waktu (time series). Untuk memperoleh API dari data emas ini seperti biasanya dapat menggunakan teknik inspect element dan merambah satu demi satu DOM dalam situs tersebut untuk kemudian menemukan API datanya yang berbentuk JSON.

Emas sendiri merupakan salah satu komoditas yang mampu menyimpan nilai sekaligus aset dewasa ini. Tak sedikit ekonom juga menyebutkan bahwa emas merupakan komoditas yang menjadi indikator situasi perekonomian global. Ketika perekonomian global dalam situasi tidak menentu, tak stabil, atau bahkan krisis, emas menjadi komoditas "pelarian" pada pemilik aset agar mampu melindungi asetnya dari inflasi atau penurunan nilai riil dari aset.

Diketahui, harga emas hingga 22 Maret 2024 juga terlihat masih pada posisi tren naik. Kendati pada periode pendek harganya sangat berfluktuatif, tren jangka panjangnya cukup mengesankan. Terlebih setelah Pandemi Covid-19 yang mengusik ekonomi global selama 2020 hingga akhir 2021 silam. Kini, harga emas per gramnya dalam kurs rupiah tercatat menyentuh 1 juta per gramnya. Dengan ketangguhannya di tengah situasi ketidakpastian ekonomi global, bisa diperkirakan bahwa 5 atau 10 tahun ke depan harga emas per gramnya dapat menembus angka 3-4 juta.

Itu sekilas pengantar dari pentingnya mengetahui data harga emas. Selanjutnya, dalam artikel kali ini akan di-share terkait teknik melakukan web scraping data dengan API berbahasa R. Adapun code secara runtun tertera sebagai berikut:

 

# Aktivasi library
# Scrape data dengan API
coba <- fromJSON("https://pluang.com/api/asset/gold/pricing?daysLimit=2001")

# manipulasi data dan transformasi periode data
hargaemas <- data.frame(coba$data$history)
hargaemas$tgl <- as.Date(substr(hargaemas$updated_at, 1, 10), "%Y-%m-%d")
hargaemas <- hargaemas[,c(2,3,4,6)]

# sekilas data
head(hargaemas)
##      sell     buy installment        tgl
## 1 1152467 1123655     1152467 2024-03-22
## 2 1162327 1133268     1162327 2024-03-21
## 3 1142402 1113841     1142402 2024-03-20
## 4 1142394 1113834     1142394 2024-03-19
## 5 1135450 1107063     1135450 2024-03-18
## 6 1135054 1106677     1135054 2024-03-17
# memvisualisasikan hasil scrape data dengan API
x<- hargaemas %>%
  ggplot(mapping = aes(x = tgl, y = as.numeric(sell))) +
  geom_line(col = "blue") +
  labs(x = "Tanggal", y = "Harga", title = "Perkembangan Harga Emas selama 29 Sep 2018 - 22 Mar 2024 (Rp/gr)",
       caption = "Sumber Visualisasi: jokoding.com") +
  theme(legend.position = "none") +
  transition_reveal(tgl)

animate(x, height = 7,
        width = 9, units = "in", res = 150, fps = 7)
## geom_path: Each group consists of only one observation. Do you need to adjust
## the group aesthetic?
## geom_path: Each group consists of only one observation. Do you need to adjust
## the group aesthetic?
## 
Rendering [==============================================] at 0.88 fps ~ eta:  0s

plot of chunk unnamed-chunk-7

Demikian sedikit sharing kali ini, jangan lupa untuk terus mengikuti, menshare, dan meninggalkan komentar di blog ini sebagai wujud dukungan Anda. Selamat memahami dan mempraktikkan!