ANALISIS KOMPLEKSITAS PENERBANGAN DI INDONESIA

Pada tutorial kali ini, jokoding.com akan membahas mengenai kompleksitas penerbangan di Indonesia hari ini (08/02/2024). Data yang digunakan dalan analisis ini bersumber dari platform Flightradar24, sebuah situs penyedia informasi realtime penerbangan internasional, termasuk penerbangan di Indonesia. Beberapa package yang dibutuhkan dalam analisis kompleksitas penerbangan ini adalan rvest, stringr, jsonlite, sf, dan ggplot2.

library(rvest)
library(stringr)
library(jsonlite)
library(sf)
library(ggplot2)

WEB SCRAPING DATA

Web scraping yang diterapkan dalam kasus ini menggunakan API Flightradar24 kemudian melakukan ekstraksi terhadap sejumlah variabel yang dibutuhkan dalam analisis, seperti koordinat asal dan tujuan serta nama tempat asal dan tujuannya. Sebagai catatan, dalam kasus ini, diterapkan pula proses data streaming, karena sumber data yang digunakan lebih dari satu. Untuk memperoleh data penerbangan dari setiap bandara, diperlukan data kode IATA dan tidak tersedia langsung dalam situs Flightradar24, sehingga dalam kasus ini, digunakanlah situs penyedia kode IATA pada tautan berikut https://www.prokerala.com

laman <- read_html("https://www.prokerala.com/travel/airports/indonesia/")
bandara <- laman %>% html_nodes('.td-airport-width+ .td-width-60') %>% html_text() %>%
  str_to_lower()
gabung <- data.frame(bandara)

#Membuat link JSON
link <- data.frame()
for(i in gabung$bandara){
  x <- paste0("https://api.flightradar24.com/common/v1/airport.json?code=",i)
  link <- rbind(link, data.frame(x))
}

dptdata <- function(x){
  x <- fromJSON(x)
  return(x)
}

library(jsonlite)
gabung <- data.frame(gabung, link)
data <- sapply(gabung, FUN = dptdata, USE.NAMES = F)
## Error in open.connection(con, "rb"): HTTP error 520.
datagabung <- data.frame()
for(i in seq(1,n)){
  if (!is.null(data[[i]]$response$airport$pluginData$schedule$departures$data$flight$airport$destination$position)) {
    # jumlah perulangan
    j <- nrow(data[[i]]$response$airport$pluginData$schedule$departures$data$flight$airport$destination$position)

    #perulangan asal penerbangan ke tujuan
    okeasal <- data.frame(latasal = rep(data[[i]]$response$airport$pluginData$details$position$latitude, j),
                          lonasal = rep(data[[i]]$response$airport$pluginData$details$position$longitude, j),
                          asal = rep(data[[i]]$response$airport$pluginData$details$position$region$city, j))

    oketujuan <- data.frame(lattujuan = data[[i]]$response$airport$pluginData$schedule$departures$data$flight$airport$destination$position$latitude,
                            lontujuan = data[[i]]$response$pluginData$schedule$departures$data$flight$airport$destination$position$longitude,
                            tujuan = data[[i]]$response$airport$pluginData$schedule$departures$data$flight$airport$destination$position$region$city)
    datagabung <- rbind(datagabung, data.frame(okeasal, oketujuan))
  }
}

# Sekilas Data
head(datagabung)
##    latasal  lonasal   asal lattujuan lontujuan  tujuan
## 1 -7.92655 112.7145 Malang  -6.26660  106.8911 Jakarta
## 2 -7.92655 112.7145 Malang  -6.26660  106.8911 Jakarta
## 3 -7.92655 112.7145 Malang  -6.12556  106.6558 Jakarta
## 4 -7.92655 112.7145 Malang  -6.12556  106.6558 Jakarta
## 5 -7.92655 112.7145 Malang  -6.26660  106.8911 Jakarta
## 6 -7.92655 112.7145 Malang  -6.12556  106.6558 Jakarta

VISUALISASI RUTE PENERBANGAN

Visualisasi rute penerbangan dalam kasus ini bertujuan untuk melihat kompleksitas penerbangan di seluruh bandara udara di Indonesia sehingga dapat diketahui darimana dan kemana saja arus penerbangan yang ada.

peta_dunia <- map_data("world")
flightradar2024 <- na.omit(datagabung)
ggplot() +
  geom_polygon(data = peta_dunia, aes(x = long, y = lat, group = group), fill = "black") +
  geom_point(data = flightradar2024, aes(x = lonasal, y = latasal), color = "yellow", size = 0.05) +
  geom_point(data = flightradar2024, aes(x = lontujuan, y = lattujuan), color = "white", size = 0.1) +
  geom_segment(data = flightradar2024, aes(x = lonasal, y = latasal, xend = lontujuan, yend = lattujuan), color = "yellow", size = 0.1) +
  labs(title = "Kompleksitas Penerbangan di Indonesia menurut Rute per 08 Februari 2024",
       caption = "Sumber data: Flightradar24 | jokoding.com") +
  theme_dark()

plot of chunk unnamed-chunk-14

VISUALISASI DIAGRAM SANKEY

Visualisasi ini bertujuan untuk mengurai arus penerbangan di Indonesia sehingga lebih mudah untuk dijelaskan sekaligus menambah insight dalam analisis.

myflight <- flightradar2024 %>%
  group_by(asal, tujuan) %>%
  summarize(jml = n())
## `summarise()` has grouped output by 'asal'. You can override using the `.groups` argument.
nodes <- data.frame(name = c(as.character(myflight$asal), as.character(myflight$tujuan)) %>% unique())
myflight$IDsource <- match(myflight$asal, nodes$name)-1
myflight$IDtarget <- match(myflight$tujuan, nodes$name)-1
sankey <- sankeyNetwork(Links = as.data.frame(myflight), Nodes = nodes,
                        Source = "IDsource", Target = "IDtarget",
                        Value = "jml", NodeID = "name", 
                        sinksRight=FALSE, iterations = 0,
                        margin = list(top = 10, bottom = 10, left = 10, right = 10))
sankey

plot of chunk unnamed-chunk-15

Terlihat bahwa terdapat 1.427 penerbangan yang terjadi di Indonesia pada 8 Februari 2024. Dari sekian penerbangan, bandara udara dengan lalu lintas tersibuk berada di wilayah DKI Jakarta, Denpasar Bali, Surabaya, Makassar, Balikpapan, dan Batam. Demikian sedikit sharing kali ini, jangan lupa untuk berkunjung ke blog https://www.jokoding.com/ untuk belajar mengenai R dan Python serta penerapannya dalam Data Science dan Big Data. Terima kasih.