Web Scraping, Pivot Longer, dan Visualisasi Heatmap Data IPM (HDI) dengan R

Penerapan web scraping, pivot longer, dan visualisasi heatmap

Data manipulation merupakan istilah baru yang cukup terkenal dalam dunia Data Science. Data manipulation yang sebelumnya mengalami peyoratif makna, yakni berhubungan dengan aktivitas mengubah data sehingga tidak sama persis seperti kondisi aslinya, berubah seketika menjadi amelioratif makna yang merujuk pada bagaimana mengubah struktur data sedemikian rupa namun tidak mengubah data aslinya.

Salah satu contoh dari data manipulation adalah bagaimana mengubah struktur data dari yang awalnya berupa wide data frame menjadi longer data frame. Adapun teknik untuk menjalankan instruksi ini dikenal dengan istilah pivot longer. Dengan teknik ini, struktur data yang semula berbentuk melebar (wide) berubah menjadi format panjang. Ketika instruksi ini dijalankan, maka kolom-kolom yang terkandung dalam data tertentu akan berubah menjadi baris-baris bersesuaian dengan nilai dari setiap variabel pembentuk data awal.

Dengan pivot longer, tentu kebutuhan mengubah format data dari wide menjadi format long akan memerlukan waktu lebih cepat dibandingkan dengan melakukan transpose data yang justru perlu tahapan manual. Bila datanya masih berjumlah sedikit tentu hal ini bukanlah masalah, tetapi sebaliknya, bila datanya berjumlah puluhan kolom dan ribuan baris, tentu mengubah secara manual sangatlah kurang efisien.

Itu sekilas mengenai pivot longer. Berikutnya, praktikum dalam kesempatan kali ini diawali dengan memperoleh data frame yang bersumber dari laman jatim.bps.go.id berupa data Indeks Pembangunan Manusia atau Human Development Index (HDI) tahun 2021 - 2023. Data IPM ini akan diperoleh dengan menggunakan teknik web scraping mengingat API dari situs Badan Pusat Statistik Provinsi Jawa Timur bersifat public. Setelah datanya siap, tahapan berikutnya adalah menerapkan pivot longer sebagai praktikum data manipulation dan diakhiri dengan visualisasi data IPM atau HDI berupa heatmap untuk masing-masing kabupaten atau kota selama 2021 - 2023 menggunakan bahasa pemrograman R, berikut langkah demi langkahnya:


# aktivasi beberapa package untuk scrape data IPM atau HDI
library(rvest)
library(xml2)
library(stringr)
library(dplyr)
# deklarasi alamat url target scrape data
url <- "https://jatim.bps.go.id/indicator/26/615/1/indeks-pembangunan-manusia-hasil-long-form-sp2020-menurut-kabupaten-kota.html"
laman <- read_html(url)
laman
## {html_document}
## <html>
## [1] <head>\n<meta http-equiv="Content-Type" content="text/html; charset=UTF-8 ...
## [2] <body id="top" class="no-touch">\n\t<div style="display: none;z-index: 10 ...
# menscrape kolom nama kabupaten atau kota
kako <- laman %>% html_nodes('.vervar') %>% html_text()
kako <- kako[1:38]
kako
##  [1] "Kabupaten Pacitan"     "Kabupaten Ponorogo"    "Kabupaten Trenggalek" 
##  [4] "Kabupaten Tulungagung" "Kabupaten Blitar"      "Kabupaten Kediri"     
##  [7] "Kabupaten Malang"      "Kabupaten Lumajang"    "Kabupaten Jember"     
## [10] "Kabupaten Banyuwangi"  "Kabupaten Bondowoso"   "Kabupaten Situbondo"  
## [13] "Kabupaten Probolinggo" "Kabupaten Pasuruan"    "Kabupaten Sidoarjo"   
## [16] "Kabupaten Mojokerto"   "Kabupaten Jombang"     "Kabupaten Nganjuk"    
## [19] "Kabupaten Madiun"      "Kabupaten Magetan"     "Kabupaten Ngawi"      
## [22] "Kabupaten Bojonegoro"  "Kabupaten Tuban"       "Kabupaten Lamongan"   
## [25] "Kabupaten Gresik"      "Kabupaten Bangkalan"   "Kabupaten Sampang"    
## [28] "Kabupaten Pamekasan"   "Kabupaten Sumenep"     "Kota Kediri"          
## [31] "Kota Blitar"           "Kota Malang"           "Kota Probolinggo"     
## [34] "Kota Pasuruan"         "Kota Mojokerto"        "Kota Madiun"          
## [37] "Kota Surabaya"         "Kota Batu"
# menscrape IPM tahun 2021
ipm21 <- laman %>% html_nodes('.vervar+ .text-right') %>% html_text()
ipm21 <- ipm21[1:38] %>% as.numeric()
ipm21
##  [1] 69.45 71.81 70.40 73.29 71.48 73.31 71.48 67.65 69.20 72.62 69.24 69.34
## [13] 68.94 70.54 81.01 74.90 74.10 73.03 73.07 75.08 71.97 70.70 70.10 73.97
## [25] 76.98 65.42 64.86 68.78 67.74 79.15 79.27 82.77 75.20 76.83 79.34 82.27
## [37] 82.94 77.21
# menscrape IPM tahun 2022
ipm22 <- laman %>% html_nodes('td:nth-child(3)') %>% html_text()
ipm22 <- ipm22[3:40] %>% as.numeric()
ipm22
##  [1] 70.19 72.59 71.28 74.14 72.25 74.20 72.23 68.48 69.80 73.15 69.91 69.76
## [13] 69.56 71.29 81.37 75.61 74.66 73.95 73.51 75.76 72.62 71.15 70.79 74.83
## [25] 77.62 66.11 65.44 69.35 68.49 80.12 80.15 83.38 76.08 77.71 80.19 83.02
## [37] 83.32 78.13
# menscrape IPM tahun 2023
ipm23 <- laman %>% html_nodes('.text-right~ .text-right+ td') %>% html_text()
ipm23 <- ipm23[1:38] %>% as.numeric()
ipm23
##  [1] 70.94 73.18 71.96 74.65 72.84 74.68 73.00 69.37 70.42 73.79 70.56 70.65
## [13] 70.36 71.91 81.88 76.23 75.16 74.70 74.02 76.30 73.28 71.80 71.40 75.29
## [25] 78.44 66.82 66.19 70.32 69.13 80.97 80.78 84.00 76.93 78.30 80.90 83.71
## [37] 83.99 79.07
# menjadikan data frame
ipmjatim <- data.frame(id = seq(1:38), kabkot = kako, ipm21, ipm22, ipm23)
ipmjatim
##    id                kabkot ipm21 ipm22 ipm23
## 1   1     Kabupaten Pacitan 69.45 70.19 70.94
## 2   2    Kabupaten Ponorogo 71.81 72.59 73.18
## 3   3  Kabupaten Trenggalek 70.40 71.28 71.96
## 4   4 Kabupaten Tulungagung 73.29 74.14 74.65
## 5   5      Kabupaten Blitar 71.48 72.25 72.84
## 6   6      Kabupaten Kediri 73.31 74.20 74.68
## 7   7      Kabupaten Malang 71.48 72.23 73.00
## 8   8    Kabupaten Lumajang 67.65 68.48 69.37
## 9   9      Kabupaten Jember 69.20 69.80 70.42
## 10 10  Kabupaten Banyuwangi 72.62 73.15 73.79
## 11 11   Kabupaten Bondowoso 69.24 69.91 70.56
## 12 12   Kabupaten Situbondo 69.34 69.76 70.65
## 13 13 Kabupaten Probolinggo 68.94 69.56 70.36
## 14 14    Kabupaten Pasuruan 70.54 71.29 71.91
## 15 15    Kabupaten Sidoarjo 81.01 81.37 81.88
## 16 16   Kabupaten Mojokerto 74.90 75.61 76.23
## 17 17     Kabupaten Jombang 74.10 74.66 75.16
## 18 18     Kabupaten Nganjuk 73.03 73.95 74.70
## 19 19      Kabupaten Madiun 73.07 73.51 74.02
## 20 20     Kabupaten Magetan 75.08 75.76 76.30
## 21 21       Kabupaten Ngawi 71.97 72.62 73.28
## 22 22  Kabupaten Bojonegoro 70.70 71.15 71.80
## 23 23       Kabupaten Tuban 70.10 70.79 71.40
## 24 24    Kabupaten Lamongan 73.97 74.83 75.29
## 25 25      Kabupaten Gresik 76.98 77.62 78.44
## 26 26   Kabupaten Bangkalan 65.42 66.11 66.82
## 27 27     Kabupaten Sampang 64.86 65.44 66.19
## 28 28   Kabupaten Pamekasan 68.78 69.35 70.32
## 29 29     Kabupaten Sumenep 67.74 68.49 69.13
## 30 30           Kota Kediri 79.15 80.12 80.97
## 31 31           Kota Blitar 79.27 80.15 80.78
## 32 32           Kota Malang 82.77 83.38 84.00
## 33 33      Kota Probolinggo 75.20 76.08 76.93
## 34 34         Kota Pasuruan 76.83 77.71 78.30
## 35 35        Kota Mojokerto 79.34 80.19 80.90
## 36 36           Kota Madiun 82.27 83.02 83.71
## 37 37         Kota Surabaya 82.94 83.32 83.99
## 38 38             Kota Batu 77.21 78.13 79.07
# aktivasi package tidyr
library(tidyr)
# mengubah dari bentuk wide ke long dengan pivot_longer()
pivotku <- ipmjatim %>%
  pivot_longer(cols = -c(id, kabkot),
               names_to = c("tahun"),
               values_to = "ipm")
pivotku
## # A tibble: 114 x 4
##       id kabkot                tahun   ipm
##    <int> <chr>                 <chr> <dbl>
##  1     1 Kabupaten Pacitan     ipm21  69.4
##  2     1 Kabupaten Pacitan     ipm22  70.2
##  3     1 Kabupaten Pacitan     ipm23  70.9
##  4     2 Kabupaten Ponorogo    ipm21  71.8
##  5     2 Kabupaten Ponorogo    ipm22  72.6
##  6     2 Kabupaten Ponorogo    ipm23  73.2
##  7     3 Kabupaten Trenggalek  ipm21  70.4
##  8     3 Kabupaten Trenggalek  ipm22  71.3
##  9     3 Kabupaten Trenggalek  ipm23  72.0
## 10     4 Kabupaten Tulungagung ipm21  73.3
## # ... with 104 more rows
# visualisasi heatmap
library(ggplot2)
ggplot(pivotku, aes(x = tahun, y = kabkot, fill = ipm)) +
  geom_tile() +
  scale_fill_gradient(low = "white", high = "red") +
  labs(title = "Heatmap IPM Jawa Timur 2021 - 2023", fill = "IPM") +
  theme_minimal()

plot of chunk unnamed-chunk-12

Demikian sedikit sharing kali ini, semoga sedikit ini dapat bermanfaat. Selamat memahami dan mempraktikkan!

Add Comments


EmoticonEmoticon