# Aktivasi Package Web Scraping JSONlibrary(jsonlite)library(dplyr)library(stringr)#aktivasi Package Import & Visualisasi Peta SHPlibrary(rgdal)library(sf)# Aktivasi Package Visualisasi Point of Interest (POI)library(ggplot2)library(leaflet)#nyimpen dan tampil leafletlibrary(htmlwidgets)# Web Scraping JSONbri <-fromJSON("https://inarisk2.bnpb.go.id/api/data_bri/35")bni <-fromJSON("https://inarisk2.bnpb.go.id/api/data_bni/35")madrasah <-fromJSON("https://inarisk2.bnpb.go.id/api/data_datamadrasah/35")pelabuhan <-fromJSON("https://inarisk2.bnpb.go.id/api/data_datapelabuhan/35")bandara <-fromJSON("https://inarisk2.bnpb.go.id/api/data_databandara/35")kampus <-fromJSON("https://inarisk2.bnpb.go.id/api/data_dataperguruan/35")ojk <-fromJSON("https://inarisk2.bnpb.go.id/api/data_datakantorojk/35")rumahsakit <-fromJSON("https://inarisk2.bnpb.go.id/api/data_rumahsakit/35")puskesmas <-fromJSON("https://inarisk2.bnpb.go.id/api/data_puskesmas/35")kantorpajak <-fromJSON("https://inarisk2.bnpb.go.id/api/data_pajak/35")pln <-fromJSON("https://inarisk2.bnpb.go.id/api/data_obvitnas/35")# Restrukturisasibri$obyek <-rep("bank", nrow(bri))bni$obyek <-rep("bank", nrow(bni))madrasah$obyek <-rep("madrasah", nrow(madrasah))pelabuhan$obyek <-rep("pelabuhan", nrow(pelabuhan))bandara$obyek <-rep("bandara", nrow(bandara))kampus$obyek <-rep("kampus", nrow(kampus))ojk$obyek <-rep("ojk", nrow(ojk))rumahsakit$obyek <-rep("rumahsakit", nrow(rumahsakit))puskesmas$obyek <-rep("puskesmas", nrow(puskesmas))kantorpajak$obyek <-rep("kantorpajak", nrow(kantorpajak))pln$obyek <-rep("pln", nrow(pln))# Manipulasibri2 <- bri[c("latitude", "longitude", "obyek")]names(bri2) <-c("lat", "lon", "obyek")bni2 <- bni[c("latitude", "longitude", "obyek")]names(bni2) <-c("lat", "lon", "obyek")madrasah2 <- madrasah[c("lat", "lon", "obyek")]pelabuhan2 <- pelabuhan[c("lat", "lon", "obyek")]bandara2 <- bandara[c("lat", "lon", "obyek")]kampus2 <- kampus[c("lat", "long", "obyek")]names(kampus2) <-c("lat", "lon", "obyek")ojk2 <- ojk[c("lat", "lon", "obyek")]rumahsakit2 <- rumahsakit[c("latitude", "longitude", "obyek")]names(rumahsakit2) <-c("lat", "lon", "obyek")puskesmas2 <- puskesmas[c("latitude", "longitude", "obyek")]names(puskesmas2) <-c("lat", "lon", "obyek")kantorpajak2 <- kantorpajak[c("lat", "lon", "obyek")]pln2 <- pln[c("lat", "lon", "obyek")]gabung <-rbind(bri2, bni2, madrasah2, pelabuhan2, bandara2, kampus2, ojk2, rumahsakit2, puskesmas2, kantorpajak2, pln2)# Panggil shpnyajatim <-readOGR(dsn ="D:\\Joko Ade\\KERJAAN 2024\\petajatim", layer ="jatim")# Cek Sistem Referensi Koordinat Petast_crs(jatim)#sekilas Petanyaplot(jatim)#konversi ke simple feature (sf)# CRS itu sistem referensi koordinat obyek spasialpt <-st_as_sf(jatim, crs =4326)cobi_sf <-st_as_sf(gabung, coords =c("lon", "lat"), crs =4326)#konversi koordinat ke World Geodetic System 1984 dengan kode EPSG: 4326st_crs(pt) <-4326st_crs(cobi_sf) <-4326cobi_sf <-st_transform(cobi_sf, st_crs(pt))cobi_sf <- cobi_sf %>%mutate(x =st_coordinates(.)[,1], y =st_coordinates(.)[,2])#pewarnaanwarna_gradasi <-c("#A5D6A7", "#C8E6C9", "#E8F5E9", "green", "#00FF00","#66FF33", "#66BB6A", "#00ff00", "white", "yellow")warna_gradasi <-c("#FF66B2", "#00FFFF", "#FFFF00", "#147DF5","#39FF14", "#FF7300", "#8D33FF", "#FF33CC", "#FFFFFF", "#FF0000")ggplot() +geom_sf(data = pt, fill ="black", color ="black") +geom_sf(data = cobi_sf, aes(color =as.factor(obyek)), size =0.4, alpha =1) +scale_color_manual(values = warna_gradasi) +theme_void() +theme(panel.background =element_rect(fill ="black", color ="black"),plot.background =element_rect(fill ="black", color ="black"),legend.background =element_rect(fill ="black"),legend.text =element_text(color ="white"),legend.title =element_text(color ="white"),legend.position ="none",plot.margin =margin(0, 0, 0, 0, "cm"), plot.title =element_text(color ="white", size =14, face ="bold", hjust =0.5),plot.subtitle =element_text(color ="white", size =10, hjust =0.5),plot.caption =element_text(color ="white", size =8, hjust =1)) +labs(title ="Sebaran Point of Interest Infrastruktur di Jawa Timur, 2024",subtitle ="Gedung perkantoran, Bandara, Pelabuhan, Faskes, Sekolah, Kampus, dan Pembangkit Listrik",caption ="Sumber: Inarisk (2025) | Visualisasi: Komunitas belajaR \n") +annotate("text", x =113.5, y =-6.2, label ="Daerah kepulauan dan pegunungan masih minim\nfasilitas, terutama fasilitas kesehatan", color ="white", size =3, fontface ="bold", hjust =0)# Buat daftar warna dengan nama kategoriwarna_gradasi <-c("bandara"="#FF69B4", "bank"="#0000FF", "kampus"="#FFFF00","kantorpajak"="#00FFFF", "madrasah"="#008000", "ojk"="#FFA500","pelabuhan"="#800080", "pln"="#FF00FF", "puskesmas"="#90EE90","rumahsakit"="#FF0000")# Pastikan obyek tidak memiliki spasi atau karakter anehgabung2 <- gabung %>%mutate(obyek =trimws(tolower(as.character(obyek)))) %>%filter(obyek %in%names(warna_gradasi))#palet Warnapal <-colorFactor(palette = warna_gradasi, domain =names(warna_gradasi))#Leafletnyahasil <-leaflet(gabung2) %>%addTiles() %>%addCircleMarkers(lng =as.numeric(gabung2$lon), lat =as.numeric(gabung2$lat),color =~pal(obyek),fillColor =~pal(obyek), radius =4, fillOpacity =0.8,stroke =TRUE,weight =1,popup =~obyek) %>%addLegend(position ="bottomright",pal = pal,values =names(warna_gradasi),title ="Infrastruktur",opacity =1)#disimpan dulusaveWidget(hasil, "hasil.html", selfcontained =FALSE)browseURL("hasil.html")
Penerapan ETL dengan R dan Tableau
library(rvest) # untuk scrapinglibrary(jsonlite) # scraping file jsonlibrary(stringr) # untuk olah data tekslibrary(dplyr) # untuk data manipulationlibrary(googlesheets4) # untuk export data hasil olah scraping ke dalm google spreadsheetinstall.packages("nama packgae")# baca situshtml <-read_html("https://siskaperbapo.jatimprov.go.id/tren")# buat id komoditasid <- html %>%html_elements(xpath='//*[@id="komoditas"]/option') %>%html_attr("value") %>%str_trim()# labelnyalabel <- html %>%html_elements(xpath='//*[@name="komoditas"]/option') %>%html_text() %>%str_trim()# id dan label jdikan satu data framecommodities <-data.frame(id = id, label = label)# melakukan perulangan masing2 baris sebanyak 30 kali krn 30 tanggalcomm_rep <- commodities[rep(seq_len(nrow(commodities)), each =30), ]#bikin link JSONlink <-data.frame()for(hasil inas.numeric(commodities$id)){ x <-paste0("https://siskaperbapo.jatimprov.go.id/tren/hargaharian/?komoditas=",hasil) link <-rbind(link, data.frame(x))}dptdata <-function(x){ x <-fromJSON(x)return(x)}gabung <-data.frame(commodities, link)data <-sapply(gabung$x, FUN = dptdata, USE.NAMES = F)datamu <-data.frame()for(i inseq(2, 134, 2)){ dataku <- data[i][1] %>%unlist() %>%as.data.frame() %>%na.omit() datamu <-rbind(datamu, data.frame(dataku))}# ubah dataframe jd dua kolomtgl <- datamu[seq(1, nrow(datamu), 2), ] #ganjilhrg <- datamu[seq(2, nrow(datamu), 2), ] #genapdf <-data.frame(tgl = tgl, hrg = hrg)#penggabungan data harian selama 30 hariandatatiganolhari <-data.frame(id = comm_rep$id, label = comm_rep$label, tgl = df$tgl, hrg = df$hrg)#mengubah tipe variabel hrgdatatiganolhari$hrg <-as.numeric(datatiganolhari$hrg)#mengubah tipe variabel tgldatatiganolhari$tgl <-as.Date(datatiganolhari$tgl)# autentifikasi akungs4_deauth()gs4_auth(email ="isikan email Anda di sini")# Import data yang ada sebelumnya di Google Sheet# deklarasi autentifikasi googlesheet: sheet_id <- "xxxxxxxxxxxxxxxxxxxxxxxxxxxxxx_xxx"# utk data baru: write_sheet(data = datatiganolhari, ss = sheet_id, sheet = "Sheet1")# autentifikasi baru karena menggunakan device berbeda: googlesheets4::gs4_auth(scopes = "https://www.googleapis.com/auth/spreadsheets")sheetku <-gs4_get("isikan link spreadsheet google Anda di sini")before <-read_sheet(sheetku, sheet ="Sheet1")#penggabungangabung <-union(datatiganolhari, before)#menghapus duplikasi tanggal yang samagabung <- gabung %>%distinct(id, label, tgl, .keep_all =TRUE)#menupdate datawrite_sheet(gabung, sheetku, sheet ="Sheet1")