Airline Data Scraping and Visualization

Nama : Rizky Ardhani

NIM : G1501231074

Statistical Machine Learning

Pendahuluan

Airline quality mengacu pada tingkat layanan dan kinerja yang disediakan oleh sebuah maskapai penerbangan kepada penumpangnya. Kualitas ini biasanya dievaluasi dan dinilai berdasarkan berbagai faktor yang diantaranya mencakup keselamatan, kenyamanan, efisiensi, dan layanan pelanggan.

Deskripsi Web

Pada project kali ini, yaitu melakukan scraping pada website https://www.airlinequality.com/. Situs web ini dikenal dengan nama “Skytrax.” Ini adalah platform yang menyediakan penilaian dan ulasan tentang maskapai penerbangan dan bandara di seluruh dunia. Skytrax dikenal karena memberikan informasi terperinci tentang pengalaman penumpang dan peringkat kualitas layanan maskapai dan bandara.

Skytrax dianggap sebagai sumber tepercaya untuk evaluasi kualitas layanan dalam industri penerbangan, dan digunakan oleh penumpang serta profesional industri untuk membuat keputusan yang lebih baik terkait perjalanan udara.

Dalam hal ini, data yang akan dilakukan scraping berkaitan dengan airline ratings, lounge ratings, seat ratings dan airport ratings.

Hasil Data Scraping

Dalam hal ini, data yang akan dilakukan scraping berkaitan dengan airline ratings, lounge ratings, seat ratings dan airport ratings.

#Library yang digunakan
library(rvest)
## Warning: package 'rvest' was built under R version 4.3.3
library(dplyr)
## 
## Attaching package: 'dplyr'
## The following objects are masked from 'package:stats':
## 
##     filter, lag
## The following objects are masked from 'package:base':
## 
##     intersect, setdiff, setequal, union

Airline Ratings

link_airline = "https://www.airlinequality.com/review-pages/a-z-airline-reviews/airline-review-ratings/"
page_airline = read_html(link_airline)

airline = page_airline %>% html_nodes(".clearfix+ .clearfix .aggregateColumn_two")%>% html_text()
score = page_airline %>% html_nodes(".clearfix+ .clearfix .aggregateColumn_three")%>% html_text()
total_review = page_airline%>% html_nodes(".clearfix+ .clearfix .aggregateColumn_four")%>% html_text()

airline_ratings = data.frame (airline, score, total_review, stringsAsFactors = FALSE)
airline_ratings$score <- as.numeric(airline_ratings$score)
airline_ratings$total_review <- as.numeric(airline_ratings$total_review)

Terdapat 564 data airline hasil scraping

glimpse(airline_ratings)
## Rows: 564
## Columns: 3
## $ airline      <chr> "AB Aviation", "Adria Airways", "Aegean Airlines", "Aer L…
## $ score        <dbl> 4, 6, 7, 5, 9, 3, 6, 2, 5, 3, 4, 5, 3, 5, 4, 4, 3, 3, 8, …
## $ total_review <dbl> 3, 91, 780, 1004, 3, 3, 595, 2, 247, 9, 708, 11, 9, 29, 1…

Menampilkan 10 contoh data hasil scraping

head(airline_ratings,10)
##                      airline score total_review
## 1                AB Aviation     4            3
## 2              Adria Airways     6           91
## 3            Aegean Airlines     7          780
## 4                 Aer Lingus     5         1004
## 5                   Aero VIP     9            3
## 6              Aerocaribbean     3            3
## 7  Aeroflot Russian Airlines     6          595
## 8                 AeroItalia     2            2
## 9      Aerolineas Argentinas     5          247
## 10                   Aeromar     3            9

Lounge Ratings

link_lounge = "https://www.airlinequality.com/review-pages/a-z-lounge-reviews/airline-lounge-review-ratings/"
page_lounge = read_html(link_lounge)

airline_lounge = page_lounge %>% html_nodes(".clearfix+ .clearfix .aggregateColumn_two")%>% html_text()
score_lounge = page_lounge %>% html_nodes(".clearfix+ .clearfix .aggregateColumn_three")%>% html_text()
total_review_lounge = page_lounge%>% html_nodes(".clearfix+ .clearfix .aggregateColumn_four")%>% html_text()

airline_lounge_ratings = data.frame (airline_lounge, score_lounge, total_review_lounge, stringsAsFactors = FALSE)
airline_lounge_ratings$score_lounge <- as.numeric(airline_lounge_ratings$score_lounge)
airline_lounge_ratings$total_review_lounge <- as.numeric(airline_lounge_ratings$total_review_lounge)

Terdapat 156 data lounge hasil scraping

glimpse(airline_lounge_ratings)
## Rows: 156
## Columns: 3
## $ airline_lounge      <chr> "Adria Airways", "Aegean Airlines", "Aer Lingus", …
## $ score_lounge        <dbl> 5, 6, 3, 6, 4, 2, 4, 4, 5, 3, 6, 5, 4, 3, 6, 6, 4,…
## $ total_review_lounge <dbl> 2, 15, 37, 19, 20, 9, 11, 122, 1, 36, 1, 7, 85, 34…

Menampilkan 10 contoh data hasil scraping

head(airline_lounge_ratings,10)
##               airline_lounge score_lounge total_review_lounge
## 1              Adria Airways            5                   2
## 2            Aegean Airlines            6                  15
## 3                 Aer Lingus            3                  37
## 4  Aeroflot Russian Airlines            6                  19
## 5                 Aeromexico            4                  20
## 6                 Air Astana            2                   9
## 7                 Air Berlin            4                  11
## 8                 Air Canada            4                 122
## 9               Air Caraibes            5                   1
## 10                 Air China            3                  36

Seat Ratings

link_seat = "https://www.airlinequality.com/review-pages/a-z-seat-reviews/airline-seat-review-ratings/"
page_seat = read_html(link_seat)

airline_seat = page_seat %>% html_nodes(".clearfix+ .clearfix .aggregateColumn_two")%>% html_text()
score_seat = page_seat %>% html_nodes(".clearfix+ .clearfix .aggregateColumn_three")%>% html_text()
total_review_seat = page_seat%>% html_nodes(".clearfix+ .clearfix .aggregateColumn_four")%>% html_text()

airline_seat_ratings = data.frame (airline_seat, score_seat, total_review_seat, stringsAsFactors = FALSE)
airline_seat_ratings$score_seat <- as.numeric(airline_seat_ratings$score_seat)
airline_seat_ratings$total_review_seat <- as.numeric(airline_seat_ratings$total_review_seat)

Terdapat 202 data seat hasil scraping

glimpse(airline_seat_ratings)
## Rows: 202
## Columns: 3
## $ airline_seat      <chr> "Aegean Airlines", "Aer Lingus", "Aeroflot Russian A…
## $ score_seat        <dbl> 6, 5, 6, 10, 5, 1, 4, 9, 4, 3, 4, 5, 8, 5, 4, 4, 1, …
## $ total_review_seat <dbl> 16, 9, 20, 1, 9, 2, 23, 1, 77, 22, 15, 2, 1, 2, 114,…

Menampilkan 10 contoh data hasil scraping

head(airline_seat_ratings,10)
##                 airline_seat score_seat total_review_seat
## 1            Aegean Airlines          6                16
## 2                 Aer Lingus          5                 9
## 3  Aeroflot Russian Airlines          6                20
## 4      Aerolineas Argentinas         10                 1
## 5                 Aeromexico          5                 9
## 6                 Air Astana          1                 2
## 7                 Air Berlin          4                23
## 8                  Air Busan          9                 1
## 9                 Air Canada          4                77
## 10          Air Canada rouge          3                22

Airport Ratings

link_airport = "https://www.airlinequality.com/review-pages/a-z-airport-reviews/airport-review-ratings/"
page_airport = read_html(link_airport)

airline_airport = page_airport %>% html_nodes(".clearfix+ .clearfix .aggregateColumn_two")%>% html_text()
score_airport = page_airport %>% html_nodes(".clearfix+ .clearfix .aggregateColumn_three")%>% html_text()
total_review_airport = page_airport%>% html_nodes(".clearfix+ .clearfix .aggregateColumn_four")%>% html_text()

airline_airport_ratings = data.frame (airline_airport, score_airport, total_review_airport, stringsAsFactors = FALSE)
airline_airport_ratings$score_airport <- as.numeric(airline_airport_ratings$score_airport)
airline_airport_ratings$total_review_airport <- as.numeric(airline_airport_ratings$total_review_airport)

Terdapat 965 data airport hasil scraping

glimpse(airline_airport_ratings)
## Rows: 965
## Columns: 3
## $ airline_airport      <chr> "Aalborg Airport", "Aarhus Airport", "Abbotsford …
## $ score_airport        <dbl> 6, 1, 4, 3, 6, 3, 3, 10, 4, 3, 3, 5, 4, 1, 9, 7, …
## $ total_review_airport <dbl> 14, 2, 4, 84, 7, 256, 8, 1, 32, 3, 164, 66, 4, 3,…

Menampilkan 10 contoh data hasil scraping

head(airline_airport_ratings,10)
##            airline_airport score_airport total_review_airport
## 1          Aalborg Airport             6                   14
## 2           Aarhus Airport             1                    2
## 3  Abbotsford Intl Airport             4                    4
## 4         Aberdeen Airport             3                   84
## 5          Abidjan Airport             6                    7
## 6        Abu Dhabi Airport             3                  256
## 7            Abuja Airport             3                    8
## 8         Acapulco Airport            10                    1
## 9     Accra Kotoka Airport             4                   32
## 10           Adana Airport             3                    3
airline_airport_ratings$airline_airport <- gsub("[^[:alnum:]///' ]", "", airline_airport_ratings$airline_airport)

Data Visualisasi

Airline Ratings

Top 5 Airlines by Score

top_5_airlines_score <- airline_ratings %>%
  arrange(desc(score)) %>%
  select(airline, score) %>%
  head(5)

print(top_5_airlines_score)
##              airline score
## 1      Air Rarotonga    10
## 2              AIRDO    10
## 3          Auric Air    10
## 4            FMI Air    10
## 5 Grand Cru Airlines    10
barplot(
  height = top_5_airlines_score$score,
  names.arg = top_5_airlines_score$airline,
  col="skyblue",
  main = "Top 5 Airlines by Score",
  xlab = "Airline",
  ylab = "Score",
  las = 1,        
  cex.names = 0.8, 
  horiz = FALSE
)

Top 5 Airlines by Total Review

top_5_airlines_totalreview <- airline_ratings %>%
  arrange(desc(total_review)) %>%
  select(airline, total_review) %>%
  head(5)

print(top_5_airlines_totalreview)
##             airline total_review
## 1 American Airlines         6002
## 2   Spirit Airlines         5149
## 3   United Airlines         4890
## 4   British Airways         3807
## 5 Frontier Airlines         3631
barplot(
  height = top_5_airlines_totalreview$total_review,
  names.arg = top_5_airlines_totalreview$airline,
  col="skyblue",
  main = "Top 5 Airlines by Total Review",
  xlab = "Airline",
  ylab = "Total Review",
  las = 1,       
  cex.names = 0.8, 
  horiz = FALSE 
)

Bottom 5 Airlines by Score

bottom_5_airlines_score <- airline_ratings %>%
  arrange(score) %>%
  select(airline, score) %>%
  head(5)

print(bottom_5_airlines_score)
##               airline score
## 1   Air Cote d'Ivoire     1
## 2            Air Juan     1
## 3         Air Senegal     1
## 4          AirConnect     1
## 5 Andes Líneas Aéreas     1
barplot(
  height = bottom_5_airlines_score$score,
  names.arg = bottom_5_airlines_score$airline,
  col="skyblue",
  main = "Bottom 5 Airlines by Score",
  xlab = "Airline",
  ylab = "Score",
  las = 1,        
  cex.names = 0.8, 
  horiz = FALSE
)

Bottom 5 Airlines by Total Review

bottom_5_airlines_totalreview <- airline_ratings %>%
  arrange(total_review) %>%
  select(airline, total_review) %>%
  head(5)

print(bottom_5_airlines_totalreview)
##             airline total_review
## 1       Air Belgium            1
## 2         Air Costa            1
## 3 Air Cote d'Ivoire            1
## 4      Air Labrador            1
## 5       Air Senegal            1
barplot(
  height = bottom_5_airlines_totalreview$total_review,
  names.arg = bottom_5_airlines_totalreview$airline,
  col="skyblue",
  main = "Bottom 5 Airlines by Total Review",
  xlab = "Airline",
  ylab = "Total Review",
  las = 1,       
  cex.names = 0.8, 
  horiz = FALSE 
)

Lounge Ratings

Top 5 Lounge by Score

top_5_lounge_score <- airline_lounge_ratings %>%
  arrange(desc(score_lounge)) %>%
  select(airline_lounge, score_lounge) %>%
  head(5)

print(top_5_lounge_score)
##         airline_lounge score_lounge
## 1  Azerbaijan Airlines           10
## 2               IndiGo           10
## 3 Sky Express Airlines           10
## 4         Thai AirAsia           10
## 5          Air Transat            9
barplot(
  height = top_5_lounge_score$score_lounge,
  names.arg = top_5_lounge_score$airline_lounge,
  col="brown",
  main = "Top 5 Lounge by Score",
  xlab = "Lounge",
  ylab = "Score",
  las = 1,        
  cex.names = 0.8, 
  horiz = FALSE
)

Top 5 Lounge by Total Reviews

#top_5_seat_totalreview
top_5_lounge_totalreview <- airline_lounge_ratings %>%
  arrange(desc(total_review_lounge)) %>%
  select(airline_lounge, total_review_lounge) %>%
  head(5)

print(top_5_lounge_totalreview)
##    airline_lounge total_review_lounge
## 1 British Airways                 421
## 2  Qantas Airways                 253
## 3 United Airlines                 222
## 4        Emirates                 216
## 5       Lufthansa                 199
barplot(
  height = top_5_lounge_totalreview$total_review_lounge,
  names.arg = top_5_lounge_totalreview$airline_lounge,
  col="brown",
  main = "Top 5 Lounge by Total Review",
  xlab = "Lounge",
  ylab = "Total Review",
  las = 1,        
  cex.names = 0.7, 
  horiz = FALSE
)

Bottom 5 Lounge by Score

bottom_5_lounge_score <- airline_lounge_ratings %>%
  arrange(score_lounge) %>%
  select(airline_lounge, score_lounge) %>%
  head(5)

print(bottom_5_lounge_score)
##         airline_lounge score_lounge
## 1        ASKY Airlines            1
## 2 Le Saigonnais Lounge            1
## 3   SATA International            1
## 4      Thomson Airways            1
## 5           Air Astana            2
barplot(
  height = bottom_5_lounge_score$score_lounge,
  names.arg = bottom_5_lounge_score$airline_lounge,
  col="brown",
  main = "Bottom 5 Lounge by Score",
  xlab = "Lounge",
  ylab = "Score",
  las = 1,        
  cex.names = 0.7, 
  horiz = FALSE
)

Bottom 5 Lounge by Total Review

bottom_5_lounge_totalreview <- airline_lounge_ratings %>%
  arrange(total_review_lounge) %>%
  select(airline_lounge, total_review_lounge) %>%
  head(5)

print(bottom_5_lounge_totalreview)
##        airline_lounge total_review_lounge
## 1        Air Caraibes                   1
## 2   Air Cote d'Ivoire                   1
## 3               AIRDO                   1
## 4       ASKY Airlines                   1
## 5 Azerbaijan Airlines                   1
barplot(
  height = bottom_5_lounge_totalreview$total_review_lounge,
  names.arg = bottom_5_lounge_totalreview$airline_lounge,
  col="brown",
  main = "Bottom 5 Lounge by Total Review",
  xlab = "Lounge",
  ylab = "Total Review",
  las = 1,        
  cex.names = 0.7, 
  horiz = FALSE
)

Seat Ratings

Top 5 Seat by Score

top_5_seat_score <- airline_seat_ratings %>%
  arrange(desc(score_seat)) %>%
  select(airline_seat, score_seat) %>%
  head(5)

print(top_5_seat_score)
##            airline_seat score_seat
## 1 Aerolineas Argentinas         10
## 2             Air Italy         10
## 3          BA CityFlyer         10
## 4           Germanwings         10
## 5              Iran Air         10
barplot(
  height = top_5_seat_score$score_seat,
  names.arg = top_5_seat_score$airline_seat,
  col="green",
  main = "Top 5 Seat by Score",
  xlab = "Seat",
  ylab = "Score",
  las = 1,        
  cex.names = 0.8, 
  horiz = FALSE
)

Top 5 Seat by Total Reviews

#top_5_seat_totalreview
top_5_seat_totalreview <- airline_seat_ratings %>%
  arrange(desc(total_review_seat)) %>%
  select(airline_seat, total_review_seat) %>%
  head(5)

print(top_5_seat_totalreview)
##             airline_seat total_review_seat
## 1        British Airways               197
## 2 Cathay Pacific Airways               142
## 3               Emirates               138
## 4        Virgin Atlantic               124
## 5              Lufthansa               123
barplot(
  height = top_5_seat_totalreview$total_review_seat,
  names.arg = top_5_seat_totalreview$airline_seat,
  col="green",
  main = "Top 5 Seat by Total Review",
  xlab = "Seat",
  ylab = "Total Review",
  las = 1,        
  cex.names = 0.7, 
  horiz = FALSE
)

Bottom 5 Seat by Score

bottom_5_seat_score <- airline_seat_ratings %>%
  arrange(score_seat) %>%
  select(airline_seat, score_seat) %>%
  head(5)

print(bottom_5_seat_score)
##            airline_seat score_seat
## 1            Air Astana          1
## 2     Air India Express          1
## 3 El Al Israel Airlines          1
## 4           ITA Airways          1
## 5           Juneyao Air          1
barplot(
  height = bottom_5_seat_score$score_seat,
  names.arg = bottom_5_seat_score$airline_seat,
  col="green",
  main = "Bottom 5 Seat by Score",
  xlab = "Seat",
  ylab = "Score",
  las = 1,        
  cex.names = 0.7, 
  horiz = FALSE
)

Bottom 5 Seat by Total Review

bottom_5_seat_totalreview <- airline_seat_ratings %>%
  arrange(total_review_seat) %>%
  select(airline_seat, total_review_seat) %>%
  head(5)

print(bottom_5_seat_totalreview)
##            airline_seat total_review_seat
## 1 Aerolineas Argentinas                 1
## 2             Air Busan                 1
## 3          Air Dolomiti                 1
## 4     Air India Express                 1
## 5             Air Italy                 1
barplot(
  height = bottom_5_seat_totalreview$total_review_seat,
  names.arg = bottom_5_seat_totalreview$airline_seat,
  col="green",
  main = "Bottom 5 Seat by Total Review",
  xlab = "Seat",
  ylab = "Total Review",
  las = 1,       
  cex.names = 0.8, 
  horiz = FALSE 
)

Airport Ratings

Top 5 Airport by Score

top_5_airport_score <- airline_airport_ratings %>%
  arrange(desc(score_airport)) %>%
  select(airline_airport, score_airport) %>%
  head(5)

print(top_5_airport_score)
##           airline_airport score_airport
## 1        Acapulco Airport            10
## 2     AkronCanton Airport            10
## 3 Barra Eoligarry Airport            10
## 4        Bengkulu Airport            10
## 5          Bhopal Airport            10
barplot(
  height = top_5_airport_score$score_airport,
  names.arg = top_5_airport_score$airline_airport,
  col="pink",
  main = "Top 5 Airport by Score",
  xlab = "Airport",
  ylab = "Score",
  las = 1,        
  cex.names = 0.6, 
  horiz = FALSE
)

Top 5 Airport by Total Reviews

top_5_airport_totalreview <- airline_airport_ratings %>%
  arrange(desc(total_review_airport)) %>%
  select(airline_airport, total_review_airport) %>%
  head(5)

print(top_5_airport_totalreview)
##           airline_airport total_review_airport
## 1      Manchester Airport                 1373
## 2 London Heathrow Airport                 1025
## 3 London Stansted Airport                  922
## 4           Luton Airport                  798
## 5       Paris CDG Airport                  767
barplot(
  height = top_5_airport_totalreview$total_review_airport,
  names.arg = top_5_airport_totalreview$airline_airport,
  col="pink",
  main = "Top 5 Airport by Total Review",
  xlab = "Airport",
  ylab = "Total Review",
  las = 1,        
  cex.names = 0.6, 
  horiz = FALSE
)

Bottom 5 Airport by Score

bottom_5_airport_score <- airline_airport_ratings %>%
  arrange(score_airport) %>%
  select(airline_airport, score_airport) %>%
  head(5)

print(bottom_5_airport_score)
##             airline_airport score_airport
## 1            Aarhus Airport             1
## 2 Agadir Al Massira Airport             1
## 3           Baneasa Airport             1
## 4            Batumi Airport             1
## 5          Biarritz Airport             1
barplot(
  height = bottom_5_airport_score$score_airport,
  names.arg = bottom_5_airport_score$airline_airport,
  col="pink",
  main = "Bottom 5 Airport by Score",
  xlab = "Airport",
  ylab = "Score",
  las = 1,        
  cex.names = 0.7, 
  horiz = FALSE
)

Bottom 5 Airport by Total Review

bottom_5_airport_totalreview <- airline_airport_ratings %>%
  arrange(total_review_airport) %>%
  select(airline_airport, total_review_airport) %>%
  head(5)

print(bottom_5_airport_totalreview)
##     airline_airport total_review_airport
## 1  Acapulco Airport                    1
## 2 Aguadilla Airport                    1
## 3     Akita Airport                    1
## 4    Al Ula Airport                    1
## 5  Alderney Airport                    1
barplot(
  height = bottom_5_airport_totalreview$total_review_airport,
  names.arg = bottom_5_airport_totalreview$airline_airport,
  col="pink",
  main = "Bottom 5 Airport by Total Review",
  xlab = "Airport",
  ylab = "Total Review",
  las = 1,       
  cex.names = 0.8, 
  horiz = FALSE 
)