PENDAHULUAN
Pada kesempatan kali ini kita akan mencoba teknik Web scraping atau proses ekstrasi data dari sebuah website. Website yang digunakan yaitu IMDb (Internet Movie Database) page pertama yang berisikan informasi 100 film popular tahun 2018. Variabel yang akan diekstrasi pada kali ini adalah :
1. Rank : Ranking film
2. Title : Judul fiml
3. Genre : Genre film
4. Runtime (Minutes): Durasi film dalam hitungan menit.
5. Metascore : Rata-rata keseluruhan skor kritikus filma. Nilainya antara 0 dan 100. Skor yang lebih tinggi mewakili ulasan positif.
6. Rating : Penilaian pengguna untuk film rentang 0-10
7. Votes : Jumlah suara yang memilih film tersebut
8. Gross : Penghasilan (Jutaan Dollar) Penghasilan film dalam jutaan
Kemudian kedelapan variabel akan digabungkan dalam sebuah data frame.
MEMULAI SCRAPING
Membutuhkan library ‘rvest’ Masukkan url page website yang akan discraping dan membaca kode HTML dari url web dengan function ‘read_html’
library('rvest')
#url <- 'https://www.imdb.com/search/title?count=100&release_date=2018,2018&title_type=feature'
#webpage <- read_html(url)Langkah selanjutkan akan diproses satu persatu dari setiap variabel. Menggunakan fuction ‘html_nodes’, dengAn parameter :
x = object HTML yang telah dibaca melalui url
xpath = (….)(kode HTML yang didapatkan dengan menggunakan salah satu extension chrome yaitu : selector gadget
1. RANK
Menggunakan extension Selector Gadget untuk membaca kode HTML
#rank_data_html <- html_nodes(webpage,'.text-primary')
##UBAH RANKING KE TEXT
#rank_data <- html_text(rank_data_html)
#head(rank_data)Menghapus Titik dan tanda Kutip
2. TITLE
Langkah selanjutnya adalah ekstraksi data judul film.
Converting the title data to text
3. GENRE Ekstraksi data genre setiap film
Mengubah menjadi class ‘text’
Menghapus dan spasi berlebih
Mengambil genre pertama saja
#genre_data<-gsub(",.*","",genre_data)
## ubah dari format text menjadi factor
#genre_data<-as.factor(genre_data)
#head(genre_data)4. RUNTIME
Ekstraksi data runtime setiap film
#runtime_data_html <- html_nodes(webpage,'.runtime')
##convert ke text
#runtime_data <- html_text(runtime_data_html)
#head(runtime_data)Menghapus minutes dan mengganti ke numeric
#runtime_data<-gsub(" min","",runtime_data)
#runtime_data<-as.numeric(runtime_data)
#head(runtime_data)5. METASCORE
Ekstraksi metascore setiap film
##metascore
#metascore_data_html <- html_nodes(webpage,'.metascore')
##ubah METASCORE menjadi class 'text'
#metascore_data <- html_text(metascore_data_html)
#head(metascore_data)Menghapus spasi berlebih
Karena data yang akan ditarik sebanyak 100 film, sedangkan banyaknya metascore sebesar 98, artinya ada 2 film yang tidak terdapat nilai metascore. diantaranya film dnegan rank 74 dan 88. Oleh karena itu kita harus mengisi nilai metascore menjadi NA pada film dengan 2 rank tersebut.
#for (i in c(74,88)){
#a<-metascore_data[1:(i-1)]
#b<-metascore_data[i:length(metascore_data)]
#metascore_data<-append(a,list("NA"))
#metascore_data<-append(metascore_data,b)
#}Mengubah bentuk text menjadi numeric
#metascore_data<-as.numeric(metascore_data)
##periksa kembali banyaknya metascore
#length(metascore_data)
#kita juga dapat melihat nilai ringkasan statistika dari metascore
#summary(metascore_data)6. RATING Ekstraksi nilai rating setiap film
#rating<- html_nodes(webpage,'.ratings-imdb-rating strong')
##text
#rating_data <- html_text(rating)
#head(rating_data)Mengubah format data dari text ke numeric
7. VOTES Ekstraksi jumlah votes masing-masing film
#votes_data_html <- html_nodes(webpage,'.sort-num_votes-visible span:nth-child(2)')
#votes_data <- html_text(votes_data_html)
#head(votes_data)
#votes_data<-gsub(",","",votes_data)
#votes_data<-as.numeric(votes_data)
#head(votes_data)8. Gross Ekstraksi jumlah gross masing-masing film
#gross_data_html <- html_nodes(webpage,'.ghost~ .text-muted+ span')
#gross_data <- html_text(gross_data_html)
#head(gross_data)Menghapus lambang $ dan huruf M
Mengisi NA pada film yang grossnya tidak ada
#for (i in c(5,21,22,43,45,57,59,65,66,74,80,83,86,88)){
#a<-gross_data[1:(i-1)]
#b<-gross_data[i:length(gross_data)]
#gross_data<-append(a,list("NA"))
#gross_data<-append(gross_data,b)
#}Mengubah format text menjadi numeric
Membuat data Frame dari 8 variabel yang telah di buat.
#df_imdb<-data.frame(Rank = rank_data, Title = title_data,
#Genre = genre_data,Genre3=genre_data3, Runtime=runtime_data, Metascore = metascore_data, Rating=rating_data, #Votes=votes_data,Gross=gross_data)
##Structure dari data frame
#str(df_imdb)
#View(df_imdb)
#str(genre_data)menyimpan data yang telah di ekstrak dan dalam bentuk data frame ke direktory kita
Untuk mempermudah, saya mencoba menyimpan object df_imdb dalam bentuk.rds
## Save an object to a file
##saveRDS(df_imdb, file = "df_imdb.rds")
## Restore the object
df_imdb <- readRDS(file = "df_imdb.rds")Melihat visualisasi antara 4 variabel : Rating, Votes, Genre, dan Runtime
library(ggplot2)
plot1 <- ggplot(df_imdb,aes(x=Runtime,y=Rating))+
geom_point(aes(size=Votes,col=Genre))+labs(title = "Gross Most Popular Movie by IMDb")+
theme(legend.key = element_rect(fill="#FAFAD2"),
legend.background = element_rect(color="white", fill="#F08080"),
plot.subtitle = element_text(size=6, color="008080"),
panel.background = element_rect(fill="#FAFAD2"),
panel.border = element_rect(fill=NA),
panel.grid.minor.x = element_blank(),
panel.grid.major.x = element_blank(),
panel.grid.major.y = element_line(color="darkgrey", linetype=2),
panel.grid.minor.y = element_blank(),
plot.background = element_rect(fill="#F08080"),
text = element_text(color="black"),
axis.text = element_text(color="black"),
axis.title.x = element_text(color="black", size=11, face="bold"),
axis.title.y = element_text(color="black", size=11, face="bold"),
plot.title = element_text(hjust = 0.4, size = 18, colour = "black")
)
plot1dari plot1 di atas dapat dilihat bahwa movie bergenre ‘action’ yang paing besar mempunyai nilai rating dan votes dengan runtime = 150mins
movie2 yang mempunyai nilai rating tinggi serta nilai votes banyak dimiliki oleh movie yang mempunyai nilai runtime berkisar 112.5 mins sampai 162.5mins (mungkin bisa dijadikan pertimbangan bagi movie maker)
#summarize gross berdasarkan genre pakai summarize dplyr
NA karena mean yang ada NA nya nya hasilnya NA. Oleh karena itu yang dilakukan adalah menghapus setiap kolom yang mengandung NA
## X Rank Title Genre
## Min. : 1.00 Min. : 1.00 12 Strong : 1 Action :30
## 1st Qu.: 25.25 1st Qu.: 25.25 A Quiet Place : 1 Comedy :12
## Median : 48.50 Median : 48.50 A Simple Favor: 1 Drama :12
## Mean : 49.49 Mean : 49.49 A Star Is Born: 1 Biography:11
## 3rd Qu.: 74.50 3rd Qu.: 74.50 Adrift : 1 Adventure: 6
## Max. :100.00 Max. :100.00 All Is True : 1 Animation: 6
## (Other) :80 (Other) : 9
## Genre3 Runtime Metascore
## Action,Adventure,Sci-Fi : 6 Min. : 85.0 Min. :19.00
## Action,Adventure,Thriller: 4 1st Qu.:106.2 1st Qu.:53.25
## Biography,Drama,History : 4 Median :117.0 Median :61.50
## Comedy : 4 Mean :118.3 Mean :61.74
## Action,Adventure,Comedy : 3 3rd Qu.:130.0 3rd Qu.:69.00
## Action,Adventure,Fantasy : 3 Max. :189.0 Max. :90.00
## (Other) :62
## Rating Votes Gross
## Min. :5.300 Min. : 84 Min. : 0.020
## 1st Qu.:6.300 1st Qu.: 23865 1st Qu.: 9.867
## Median :6.900 Median : 61462 Median : 47.355
## Mean :6.801 Mean :104579 Mean : 99.412
## 3rd Qu.:7.300 3rd Qu.:143413 3rd Qu.:138.875
## Max. :8.500 Max. :674375 Max. :700.000
##
## [1] 10
library(plotly)
plot2<-ggplot(rata2genre, aes(x = reorder(Genre, Gross), y=Gross, fill = Genre)) +xlab("Genre") + ylab("Gross")+ theme( legend.background = element_rect(fill = "white", colour = NA),
legend.key = element_rect(fill = NA, colour = NA),
plot.background = element_rect(fill = "black", colour = "hotpink", linetype = 1),
axis.line = element_line(colour = "white"),
axis.text.x = element_text( color ="white",size = 11, hjust = 1, vjust = 1, angle = 45),
axis.text.y = element_text(color = "white",size = 11),
plot.title = element_text(hjust = 1, size = 18, colour = "yellow"),
plot.subtitle = element_text(hjust = 0.5,
size = 8),
panel.border = element_rect(fill = "NA"),
panel.background = element_blank(),
panel.grid.major = element_blank(),
panel.grid.minor = element_blank(),
axis.title.x = element_text(color="white", size=11, face="bold"),
axis.title.y = element_text(color="white", size=11, face="bold")) +
geom_col(aes( y = Gross))+labs(title="Nilai Gross film Popular IMDb 2018")
ggplotly(plot2)Dari plot2 di atas dapat dikatakan untuk film dengan rata-rata gross tertinggi yaitu film yang bergenre “Animation” disusul bertururt-turut oleh “Action” dan “Horor”.
Catatan: Syntax yang memiliki tanda # dibelakangkanya berarti syntax tersebut dijalankan hanya boleh satu kali. Karena jika dijalankan berulang-ulang akan menyebabkan data akan berubah-ubah. Mengingat website IMDb selalu meng-update urutan film terpopuler.