# clear-up the environment
rm(list = ls())
# chunk options
knitr::opts_chunk$set(
message = FALSE,
warning = FALSE,
fig.align = "center",
comment = "#>"
)
Artikel ini dibuat untuk memenuhi tugas Learning by Building (LBB) pada materi P4DS - Programming for Data Science. Materi berikut ditujukan untuk semua orang yang tertarik pada bidang Data Science dan R-Language secara umum. Materi ini dipersilahkan untuk direproduksi, didistribusikan, diterjemahkan, atau diadaptasikan sesuai dengan kebutuhan pembaca.
Penulis tertarik mengangkat topik tentang Film karena penulis memiliki hobi menonton Film dan TV Series di waktu senggang dan sering menggunakan Website IMdb sebagai referensi untuk mencari judul film yang menarik untuk ditonton, mencari aktor/aktris favorit penulis, dan membaca sinopsis film yang akan penulis tonton. Selain itu penulis juga mendapatkan referensi dataset yang dirasa cukup lengkap untuk diolah sehingga akhirnya penulis tertarik untuk mengolah dataset ini untuk dijadikan material tugas di Algoritma : Data Visualization Course.
Artikel ini bertujuan untuk eksplorasi data dari film-film yang masuk ke dalam List Top 250 di IMDb. Susunan dari artikel ini terdiri dari metodologi untuk proses analisa data diantaranya : Seleksi Dataset, Data Cleaning dan Pre-Processing, dan Eksplorasi Data dan Pengambilan Kesimpulan. Setiap langkah dari metodologi ini akan diikuti oleh penjelasan yang dijabarkan oleh Penulis untuk memperjelas maksud dan tujuan dari setiap langkah yang dilakukan. Selain itu juga dapat bermanfaat untuk pembaca ketika ingin mencoba memulai belajar untuk mengolah sebuah dataset.
Dilansir dari Wikipedia, IMDb merupakan singkatan dari Internet Movie Database adalah sebuah basis data daring informasi yang berkaitan dengan film, acara televisi, video rumahan, dan permainan video, dan acara internet, termasuk daftar pemeran, biografi kru produksi dan personil, ringkasan alur cerita, trivia, dan ulasan serta penilaian oleh penggemar. Sebuah fitur penggemar tambahan, papan pesan, telah dinonaktifkan pada Februari 2017. Awalnya situs ini dioperasikan oleh penggemar, lalu basis data kemudian dimiliki dan dioperasikan oleh IMDB.com Inc., sebuah anak perusahaan dari Amazon.
knitr::include_graphics("images/IMDb-Wiki.png")
IMDb Top 250 adalah daftar dari 250 film berperingkat teratas, berdasarkan peringkat oleh pengguna terdaftar dari situs web menggunakan metode yang dijelaskan. Pada 7 Februari 2019, The Shawshank Redemption berada di urutan pertama dalam daftar. Peringkat “Top 250” hanya berdasarkan pada peringkat “regular voters”. Jumlah suara yang harus dilakukan oleh pengguna terdaftar untuk dianggap sebagai pengguna yang memilih secara teratur telah dirahasiakan. IMDb telah menyatakan bahwa untuk mempertahankan keefektifan daftar Top 250 mereka “dengan sengaja tidak mengungkapkan kriteria yang digunakan seseorang untuk dihitung sebagai pemilih biasa”. Selain bobot lainnya, 250 film Top juga didasarkan pada formula peringkat tertimbang yang disebut dalam ilmu aktuaria sebagai formula kredibilitas. Label ini muncul karena suatu statistik dianggap lebih kredibel, semakin besar jumlah informasi individu; dalam hal ini dari pengguna yang memenuhi syarat yang mengirimkan peringkat. Meskipun rumus saat ini tidak diungkapkan, IMDb awalnya menggunakan rumus berikut untuk menghitung peringkat tertimbang mereka:
knitr::include_graphics("images/rumus-review.png")
Yang dimana :
Daftar Top 250 terdiri dari berbagai film fitur, termasuk rilis utama, film kultus, film independen, film yang mendapat pujian kritis, film bisu, dan film berbahasa non-Inggris. Dokumenter, film pendek, dan episode TV saat ini tidak termasuk.
Penulis mendapatkan datasets berbentuk .csv yang diambil dari Kaggle : Data Science Comunity. File ini terdiri dari 250 data film yang menurut user pengunggah dikumpulkan menggunakan metode webscraping di *Bulan Juni 2022. Untuk tiap identitas film sendiri terdiri dari nilai rating IMDb, tahun, peringkat, durasi, jumlah votes, dan lain-lain. Pada Dataset ini juga terdiri dari beberapa data pendukung pada Film seperti Genre, Penulis Naskah, Sutradara dan Aktor/Aktris yang bisa membantu untuk analisa lebih lanjut untuk pertanyaan bisnis yang lebih luas.
Sebagai catatan, IMDb Top 250 adalah list yang selalu diupdate setiap waktu sehingga ketika Penulis menganalisis dataset pada waktu ini akan berbeda dengan dataset secara real-time, ditambah selalu ada film yang diproduksi setiap waktunya dan sangat amat memungkinkan akan ada film yang keluar masuk ke dalam list ini. Maka dari itu penulis membatasi analisa list top 250 ini hanya ketika dataset ini diambil dari web.
Penulis merasa bahwa IMDb Top 250 memiliki kredibilitas review yang paling baik dibanding situs lainnya karena mencampurkan votes dari Penonton Film Biasa yang Kasual (Penonton Umum) dan Kritikus Film, walaupun mungkin tidak dijelaskan secara rinci bagaimana proporsi penilaiannya. Hal ini menurut penulis akan menyeimbangkan penilaian dari sisi hiburan dan dari sisi seni.
Pada bagian ini, Penulis akan coba menjabarkan proses pengambilan data dan proses awal apa saja yang harus dilakukan agar sebuah dataset siap untuk dianalisa.
Penulis akan menggunakan beberapa library pada Artikel ini. Berhubung dataset dan artikel ini kemungkinan akan dikembangkan untuk Tugas LBB yang lainnya, penulis akan mengupload library yang akan digunakan pada materi selanjutnya sehingga dokumen lebih futureproof.
# load library
options(scipen = 99) #me-non-aktifkan scientific annotation
library(tidyverse) #koleksi beberapa library R
library(dplyr) #grammar of data manipulation
library(readr) #membaca data
library(ggplot2) #plot statis
library(plotly) #plot interaktif
library(glue) #setting tooltip
library(scales) # mengatur skala pada plot
Data ditaruh pada folder data_input pada working directory dimana file R Markdown penulis tempatkan.
#Import Dataset
imdb_top250 <- read.csv(file = "data_input/movies-top250-imdb.csv")
#Glimpse Dataset
glimpse(imdb_top250)
#> Rows: 250
#> Columns: 15
#> $ rank <int> 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 1…
#> $ id <chr> "tt0111161", "tt0068646", "tt0468569", "tt0071562", "tt0…
#> $ name <chr> "The Shawshank Redemption", "The Godfather", "The Dark K…
#> $ year <int> 1994, 1972, 2008, 1974, 1957, 1993, 2003, 1994, 2001, 19…
#> $ imbd_votes <int> 2601152, 1796656, 2572662, 1237934, 768548, 1322917, 178…
#> $ imdb_rating <dbl> 9.3, 9.2, 9.0, 9.0, 9.0, 9.0, 9.0, 8.9, 8.8, 8.8, 8.8, 8…
#> $ certificate <chr> "A", "A", "UA", "A", "U", "A", "U", "A", "U", "A", "UA",…
#> $ duration <dbl> 142, 175, 152, 202, 96, 195, 201, 154, 178, 161, 142, 13…
#> $ genre <chr> "Drama", "Crime,Drama", "Action,Crime,Drama", "Crime,Dra…
#> $ cast_id <chr> "nm0000209,nm0000151,nm0348409,nm0006669,nm0000317,nm000…
#> $ cast_name <chr> "Tim Robbins,Morgan Freeman,Bob Gunton,William Sadler,Cl…
#> $ director_id <chr> "nm0001104", "nm0000338", "nm0634240", "nm0000338", "nm0…
#> $ director_name <chr> "Frank Darabont", "Francis Ford Coppola", "Christopher N…
#> $ writter_name <chr> "Stephen King,Frank Darabont", "Mario Puzo,Francis Ford …
#> $ writter_id <chr> "nm0000175,nm0001104", "nm0701374,nm0000338", "nm0634300…
Deskripsi Kolom :
head(imdb_top250)
Ketika kita melihat beberapa kolom di atas, ada beberapa yang berupa list. Ini akan sedikit menyulitkan proses analisa data sehingga penulis akan mengubah beberapa Kolom untuk menjadi single data. Dimana penulis mengasumsikan bahwa data yang pertama ditulis adalah data yang utama/dominan dalam sebuah list tersebut.
Misalnya, di Kolom Genre, nilai pertama penulis anggap sebagai Genre Utama pada sebuah Identitas Film, begitu selanjutnya nilai kedua sebagai Genre Sekunder, dan seterusnya. Karena Penulis sudah mempelajari library dplyr dan merasa lebih mudah menggunakan library tersebut, penulis memilih untuk menggunakannya untuk pre-processing data di artikel ini.
#memisahkan genre 1 2 3 dst
imdb_top250 <- separate_rows(imdb_top250, genre, sep = ",")
#menambahkan n untuk genre_n
imdb_top250 <-
imdb_top250 %>%
group_by(name) %>%
mutate(n = row_number()) %>%
#pivot wider untuk genre 1 2 3, membuat kolom baru
pivot_wider(names_from = "n",
names_prefix = "genre_",
values_from = "genre")
Penulis juga merasa bahwa karakter utama pada Film menarik untuk dianalisa, sehingga penulis mengambil 3 karakter terdepan pada list cast_name dan mengasumsikan bahwa 3 karakter tersebut adalah karakter sentral dalam sebuah Film.
#memisahkan cast name
imdb_top250 <- separate_rows(imdb_top250,cast_name, sep = ",")
#menambahkan n untuk cast_n
imdb_top250 <-
imdb_top250 %>%
group_by(name) %>%
mutate(n = row_number()) %>%
#pivot wider untuk cast 1 2 3 dst, membuat kolom baru
pivot_wider(names_from = "n",
names_prefix = "cast_",
values_from = "cast_name") %>%
#membuang kolom cast 4-dan seterusnya
select(-(cast_4:cast_18))
Berdasarkan Glimpse Dataset di atas, penulis memilih untuk menjadikan beberapa Kolom sebagai Factor untuk mempermudah proses analisa data. Penulis juga membuang beberapa kolom yang dianggap tidak penting lagi seperti ID, Cast ID, Director ID, dan Writer ID karena pada Dataset sudah dicombine beserta Nama Orangnya (Aktor, Aktris, Sutradara, dan Penulis Naskah)
#cek missing value
colSums(is.na(imdb_top250))
#> rank id name year imbd_votes
#> 0 0 0 0 0
#> imdb_rating certificate duration cast_id director_id
#> 0 0 1 0 0
#> director_name writter_name writter_id genre_1 genre_2
#> 0 0 0 0 23
#> genre_3 cast_1 cast_2 cast_3
#> 100 0 0 0
Penulis melihat ada beberapa film yang memiliki missing value di genre_2 dan genre_3 diakibatkan memang beberapa film hanya memiliki 1 genre. Maka dari itu untuk kemudahan analisa penulis mengisi missing value di genre_2 dan genre_3 dengan value dari genre di atasnya.
#transpose untuk mengubah kolom menjadi baris
imdb_top250 <-
as.data.frame(t(imdb_top250)) %>%
#fill down
fill(1:250)
#transpose kembali untuk mengubah baris menjadi kolom
imdb_top250 <-
as.data.frame(t(imdb_top250))
#mengembalikan row id dengan rank menggunakan function(x)
proc.df <- function(x) {
rownames(x) <- x[,1]
x[,]
}
imdb_top250 <- proc.df(imdb_top250)
#replace typo column
imdb_top250$imdb_votes <- imdb_top250$imbd_votes
#cleansing data
imdb_top250_clean <-
imdb_top250 %>%
mutate(
certificate = as_factor(certificate),
rank = as.integer(rank),
duration = as.integer(duration),
imdb_rating = as.integer(imdb_rating),
imdb_votes = as.integer(imdb_votes),
genre_1 = as_factor(genre_1),
genre_2 = as_factor(genre_2),
genre_3 = as_factor(genre_3),
cast_1 = as_factor(cast_1),
cast_2 = as_factor(cast_2),
cast_3 = as_factor(cast_3)
) %>%
#drop kategori yang tidak akan digunakan
select(-c(id, cast_id, director_id, writter_id,imbd_votes))
glimpse(imdb_top250_clean)
#> Rows: 250
#> Columns: 15
#> $ rank <int> 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 1…
#> $ name <chr> "The Shawshank Redemption", "The Godfather", "The Dark K…
#> $ year <chr> "1994", "1972", "2008", "1974", "1957", "1993", "2003", …
#> $ imdb_rating <int> 9, 9, 9, 9, 9, 9, 9, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8,…
#> $ certificate <fct> A, A, UA, A, U, A, U, A, U, A, UA, A, UA, UA, UA, A, A, …
#> $ duration <int> 142, 175, 152, 202, 96, 195, 201, 154, 178, 161, 142, 13…
#> $ director_name <chr> "Frank Darabont", "Francis Ford Coppola", "Christopher N…
#> $ writter_name <chr> "Stephen King,Frank Darabont", "Mario Puzo,Francis Ford …
#> $ genre_1 <fct> Drama, Crime, Action, Crime, Crime, Biography, Action, C…
#> $ genre_2 <fct> Drama, Drama, Crime, Drama, Drama, Drama, Adventure, Dra…
#> $ genre_3 <fct> Drama, Drama, Drama, Drama, Drama, History, Drama, Drama…
#> $ cast_1 <fct> Tim Robbins, Marlon Brando, Christian Bale, Al Pacino, H…
#> $ cast_2 <fct> Morgan Freeman, Al Pacino, Heath Ledger, Robert De Niro,…
#> $ cast_3 <fct> Bob Gunton, James Caan, Aaron Eckhart, Robert Duvall, Ma…
#> $ imdb_votes <int> 2601152, 1796656, 2572662, 1237934, 768548, 1322917, 178…
#cek ukuran data
nrow(imdb_top250_clean)
#> [1] 250
Pada artikel ini, penulis tertarik untuk mengajukan beberapa pertanyaan untuk Dataset yang telah dibuat. Diantaranya :
Pertanyaan Kategorikal
Pertanyaan Numerikal
Berdasarkan Pertanyaan 1. metodologi sebagai berikut : Pengelompokan Data berdasarkan ‘Year’, disimpulkan dengan membuat kolom baru yang mengandung frekuensi ‘Year’ muncul pada dataset. Lalu diarrange berdasarkan ‘Year’ yang paling sering muncul, diambil 10 data paling atas.
imdb_top_year <-
imdb_top250_clean %>%
group_by(year) %>%
summarise(count_year = n()) %>%
ungroup() %>%
arrange(desc(count_year)) %>%
head(10)
imdb_top_year
Berdasarkan Pertanyaan 2. metodologi sebagai berikut : Pembuatan Kolom baru berdasarkan value genre_1 sampai dengan genre_3, lalu Pengelompokan Data berdasarkan ‘Genre’, disimpulkan dengan membuat kolom baru yang mengandung frekuensi ‘Genre’ muncul pada dataset. Lalu diarrange berdasarkan ‘Genre’ yang paling sering muncul, diambil 10 data paling atas.
imdb_top_genre <-
imdb_top250_clean %>%
pivot_longer(cols=c('genre_1', 'genre_2', 'genre_3'),
names_to = 'level_genre',
values_to = 'genre') %>%
group_by(genre) %>%
summarise(count_genre = n()) %>%
ungroup() %>%
arrange(desc(count_genre)) %>%
head(10)
imdb_top_genre
Apabila kita lihat di website IMDb, penulisan karakter pada umumnya dituliskan berdasarkan urutan peran paling utama ke yang paling figuran. Sehingga asumsi pertama mengambil 3 karakter pertama pada ‘Cast’ bisa kita pakai.
Contoh, Film Se7en :
knitr::include_graphics("images/imdb-se7en.png")
imdb_top250_clean[imdb_top250_clean$name == "Se7en",c("cast_1","cast_2","cast_3")]
Berdasarkan Pertanyaan 3. metodologi sebagai berikut : Pembuatan Kolom baru berdasarkan value cast_1 sampai dengan cast_3, lalu Pengelompokan Data berdasarkan ‘Cast’, disimpulkan dengan membuat kolom baru yang mengandung frekuensi ‘Cast’ muncul pada dataset. Lalu diarrange berdasarkan ‘Cast’ yang paling sering muncul, diambil 10 data paling atas.
imdb_top_cast <-
imdb_top250_clean %>%
pivot_longer(cols=c('cast_1', 'cast_2', 'cast_3'),
names_to = 'order_cast',
values_to = 'cast') %>%
group_by(cast) %>%
summarise(count_cast = n()) %>%
ungroup() %>%
arrange(desc(count_cast)) %>%
head(10)
imdb_top_cast
Berdasarkan Pertanyaan 4. metodologi sebagai berikut : Pengelompokan Data berdasarkan ‘Director’, disimpulkan dengan membuat kolom baru yang mengandung frekuensi ‘Director’ muncul pada dataset. Lalu diarrange berdasarkan ‘Director’ yang paling sering muncul, diambil 10 data paling atas.
imdb_top_director <-
imdb_top250_clean %>%
group_by(director_name) %>%
summarise(count_director_name = n()) %>%
ungroup() %>%
arrange(desc(count_director_name)) %>%
head(10)
imdb_top_director
Penulis akan coba menganalisa data ‘Durasi’ dan ‘Nilai Review’ menggunakan fungsi summary() dan diagram BoxPlot
summary(imdb_top250_clean)
#> rank name year imdb_rating
#> Min. : 1.00 Length:250 Length:250 Min. :8.000
#> 1st Qu.: 63.25 Class :character Class :character 1st Qu.:8.000
#> Median :125.50 Mode :character Mode :character Median :8.000
#> Mean :125.50 Mean :8.028
#> 3rd Qu.:187.75 3rd Qu.:8.000
#> Max. :250.00 Max. :9.000
#>
#> certificate duration director_name writter_name
#> U :79 Min. : 45.0 Length:250 Length:250
#> A :74 1st Qu.:107.0 Class :character Class :character
#> UA :47 Median :126.0 Mode :character Mode :character
#> Passed :13 Mean :128.8
#> R : 9 3rd Qu.:145.0
#> Not Rated: 8 Max. :238.0
#> (Other) :20 NA's :1
#> genre_1 genre_2 genre_3 cast_1
#> Drama :67 Drama :102 Drama :71 Robert De Niro : 6
#> Action :46 Adventure: 35 Thriller:29 Tom Hanks : 5
#> Crime :35 Romance : 15 War :23 Leonardo DiCaprio: 5
#> Comedy :24 Mystery : 14 Sci-Fi :20 Charles Chaplin : 5
#> Biography:23 Crime : 13 Romance :16 Christian Bale : 4
#> Animation:23 Comedy : 12 Mystery :16 Clint Eastwood : 4
#> (Other) :32 (Other) : 59 (Other) :75 (Other) :221
#> cast_2 cast_3 imdb_votes
#> Robert De Niro: 3 Carrie Fisher : 3 Min. : 28680
#> Harrison Ford : 3 Joe Pesci : 3 1st Qu.: 209945
#> Matt Damon : 3 Mark Ruffalo : 3 Median : 482315
#> Ian McKellen : 2 Robert Duvall : 2 Mean : 620429
#> Brad Pitt : 2 Orlando Bloom : 2 3rd Qu.: 935673
#> Linda Hamilton: 2 Jennifer Connelly: 2 Max. :2601152
#> (Other) :235 (Other) :235
boxplot(imdb_top250_clean$duration)
boxplot(imdb_top250_clean$imdb_rating)
# scatter plot
# memeriksa hubungan nilai rating dengan jumlah votes
rating <- imdb_top250_clean$imdb_rating
votes <- imdb_top250_clean$imdb_votes
plot(rating, votes)
abline(lm(rating ~ votes), # garis linear `lm`
col = 'red') # warna garis
Berdasarkan data di atas, penulis dapat mengambil beberapa insight sebagai berikut :