Script R

Pembuatan Peta Choropleth dengan R

# Aktivasi Package Web Scraping JSON
library(jsonlite)
library(dplyr)
library(stringr)

#aktivasi Package Import & Visualisasi Peta SHP
library(rgdal)
library(sf)

# Aktivasi Package Visualisasi Point of Interest (POI)
library(ggplot2)
library(leaflet)

#nyimpen dan tampil leaflet
library(htmlwidgets)

# Web Scraping JSON
bri <- 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")

# Restrukturisasi
bri$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))

# Manipulasi
bri2 <- 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 shpnya
jatim <- readOGR(dsn = "D:\\Joko Ade\\KERJAAN 2024\\petajatim", layer = "jatim")
# Cek Sistem Referensi Koordinat Peta
st_crs(jatim)

#sekilas Petanya
plot(jatim)

#konversi ke simple feature (sf)
# CRS itu sistem referensi koordinat obyek spasial
pt <- 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: 4326
st_crs(pt) <- 4326
st_crs(cobi_sf) <- 4326
cobi_sf <- st_transform(cobi_sf, st_crs(pt))
cobi_sf <- cobi_sf %>%
  mutate(x = st_coordinates(.)[,1], 
         y = st_coordinates(.)[,2])

#pewarnaan
warna_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 kategori
warna_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 aneh
gabung2 <- gabung %>%
  mutate(obyek = trimws(tolower(as.character(obyek)))) %>%
  filter(obyek %in% names(warna_gradasi))

#palet Warna
pal <- colorFactor(palette = warna_gradasi, domain = names(warna_gradasi))

#Leafletnya
hasil <- 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 dulu
saveWidget(hasil, "hasil.html", selfcontained = FALSE)
browseURL("hasil.html")

Penerapan ETL dengan R dan Tableau

library(rvest) # untuk scraping
library(jsonlite) # scraping file json
library(stringr) # untuk olah data teks
library(dplyr) # untuk data manipulation
library(googlesheets4) # untuk export data hasil olah scraping ke dalm google spreadsheet
install.packages("nama packgae")
# baca situs
html <- read_html("https://siskaperbapo.jatimprov.go.id/tren")

# buat id komoditas
id <- html %>% html_elements(xpath='//*[@id="komoditas"]/option') %>% html_attr("value")  %>%
  str_trim()
# labelnya
label <- html %>% html_elements(xpath='//*[@name="komoditas"]/option') %>% html_text() %>%
  str_trim()

# id dan label jdikan satu data frame
commodities <- data.frame(id = id, label = label)

# melakukan perulangan masing2 baris sebanyak 30 kali krn 30 tanggal
comm_rep <- commodities[rep(seq_len(nrow(commodities)), each = 30), ]

#bikin link JSON
link <- data.frame()
for(hasil in as.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 in seq(2, 134, 2)){
  dataku <- data[i][1] %>% unlist() %>% as.data.frame() %>% na.omit()
  datamu <- rbind(datamu, data.frame(dataku))
}

# ubah dataframe jd dua kolom
tgl <- datamu[seq(1, nrow(datamu), 2), ]  #ganjil
hrg <- datamu[seq(2, nrow(datamu), 2), ]  #genap
df <- data.frame(tgl = tgl, hrg = hrg)

#penggabungan data harian selama 30 harian
datatiganolhari <- data.frame(id = comm_rep$id, label = comm_rep$label, tgl = df$tgl, hrg = df$hrg)

#mengubah tipe variabel hrg
datatiganolhari$hrg <- as.numeric(datatiganolhari$hrg)

#mengubah tipe variabel tgl
datatiganolhari$tgl <- as.Date(datatiganolhari$tgl)

# autentifikasi akun
gs4_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")

#penggabungan
gabung <- union(datatiganolhari, before)

#menghapus duplikasi tanggal yang sama
gabung <- gabung %>%
  distinct(id, label, tgl, .keep_all = TRUE)

#menupdate data
write_sheet(gabung, sheetku, sheet = "Sheet1")

Data Storytelling dengan R