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 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 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()
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
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.