Dalam tutorial kali ini, jokoding.com akan berbagi mengenai cara melakukan analisis terhadap data gempa bumi di Indonesia dan wilayah sekitar yang mungkin berdampak ke Indonesia. Data yang digunakan dalam tutorial ini diperoleh dari data gempa bumi yang realtime dan terupdate dalam situs https://ds.iris.edu.
Dalam analisis gempa bumi ini, terdapat beberapa package yang harus diaktivasi terlebih dahulu, seperti rvest, dplyr, lubridate, dan beberapa package yang bermanfaat untuk memvisualisasikan data gempa bumi nantinya, di antaranya ggplot2
library(rvest)
library(dplyr)
library(lubridate)
library(gganimate)
Mengingat data yang tersimpan dalam situs tersebut tidak dapat dilakukan web scraping secara langsung karena datanya dalam bentuk peta java script, maka dilakukanlah teknik web scraping yang lain, yakni action click kemudian mendownload datanya ke dalam storage lokal. Setelah itu, dilakukan pembersihan data menggunakan sedikit teknik Natural Language Processing (NLP).
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)]
formatbaris <- paste("|", gempa, "|", sep = "")
splitbaris <- strsplit(formatbaris, "\\|")
kolak <- sapply(splitbaris, function(x) tail(x, n = 1)[1])
splitbaris <- lapply(splitbaris, function(x) head(x, -1))
data <- as.data.frame(do.call(rbind, splitbaris), stringsAsFactors = FALSE)
names(data) <- paste0("v", 1:(length(splitbaris[[1]]) - 2))
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")
datagempaku <- na.omit(datagempaku)
# menampilkan sekilas data hasil
head(datagempaku)
## lat lon dept mag reg time
## 1 -7.0838 116.9238 482.291 4.4 BALI SEA 2024-02-05 21:54:50
## 2 -4.1197 140.1903 80.967 5 IRIAN JAYA, INDONESIA 2024-02-05 14:05:22
## 3 -0.2912 124.2643 10 4.9 SOUTHERN MOLUCCA SEA 2024-02-05 12:38:43
## 4 0.7028 121.2895 85.531 4.7 MINAHASSA PENINSULA, SULAWESI 2024-02-05 10:25:17
## 5 2.3298 126.8171 36.098 4.6 NORTHERN MOLUCCA SEA 2024-02-05 07:51:52
## 6 -2.1404 100.4567 52.896 5.3 SOUTHERN SUMATRA, INDONESIA 2024-02-05 00:52:23
Penambahan variabel waktu dalam data gempa ini bertujuan untuk mengelompokkan time ke dalam situasi waktu, pagi, siang, sore, dan malam. Sedangkan variabel daya rusak bertujuan untuk mengelompokkan risiko kerusakan yang ditimbulkan oleh magnitudo setiap gempa. Kedua variabel ini nantinya akan menjadi tambahan insight dalam analisis gempa di bagian visualisasi data.
grupwaktu <- function(t) {
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")
}
}
# Tambah variabel kelompokwaktu
datagempaku <- datagempaku %>%
mutate(kelompokwaktu = sapply(time, grupwaktu))
# Tambah variabel daya rusak
batas <- c(2.5, 5.4, 5.5, 6.0, 6.1, 6.9, Inf)
label <- c("daya rusak ringan", "daya rusak cukup berat", "daya rusak cukup berat", "daya rusak berat", "daya rusak berat", "daya rusak sangat berat")
datagempaku$dayarusak <- cut(as.numeric(datagempaku$mag), breaks = batas, labels = label, right = FALSE)
Visualisasi ini bertujuan untuk melihat persentase kejadian gempa menurut waktu yang telah dikelompokkan, kemudian divisualisasikan pula persentase kejadian gempa menurut daya rusaknya, lalu dilanjutkan dengan visualisasi jumlah kejadian gempa secara terurut.
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"))
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 = 5, 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.
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()
Pada bagian akhir ini, divisualisasikan sejumlah gempa bumi di Indonesia terakhir yang disatukan layernya dengan peta. Tujuan dari visualisasi ini adalah melihat wilayah di Indonesia secara astronomisnya untuk menambah insight dari data.
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"))
Berdasarkan visualisasi di atas, terlihat bahwa mayoritas gempa bumi yang terjadi di Indonesia dan wilayah di sekitar Indonesia yang mungkin berdampak ke Indonesia terjadi pada waktu malam hari (50,9%). Ini menjadi perhatian bagi seluruh masyarakat di Indonesia, khususnya wilayah yang dilewati lempeng Asia-Pasifik dan Hindia atau Ring of Fire untuk tetap waspada dan meningkatkan kewaspadaannya di malam hari sebagai upaya preventif apabila terjadi gempa bumi. Kemudian, dari 3.379 kejadian gempa bumi yang ada selama Januari hingga 7 Februari 2024, mayoritas memiliki daya rusak ringan karena magnitudonya 2.5 - 5.4 SR, diikuti oleh 3% gempa berdaya rusak cukup berat (merusak bangunan). Secara kewilayahan, mayoritas kejadian gempa bumi selama Januari hingga 7 Februari 2024 berada di Maluku, Maluku Utara, dan Sumatera Selatan. Dengan demikian, diimbau masyarakat di wilayah tersebut untuk lebih waspada dalam mengantisipasi kemungkinan adanya gempa bumi yang terjadi sewaktu-waktu. Terakhir, secara astronomis, wilayah yang relatif aman dari gempa bumi di Indonesia adalah Pulau Kalimantan, termasuk di dalamnya wilayah IKN. Tetapi, wilayah tersebut masih mungkin berisiko terdampak oleh jenis bencana alam lainnya, seperti banjir, longsor, dan kebakaran hutan. Demikian sekilas sharing kali ini, semoga bermanfaat dan menambah insight dalam melakukan analisis data gempa bumi. Jangan lupa untuk berkunjung ke laman situs https://www.jokoding.com/ untuk belajar mengenai praktikum R dan Python. Terima kasih.