Sistem rekomendasi merupakan komponen penting dalam berbagai layanan digital, khususnya dalam industri hiburan seperti platform streaming film. Dalam proyek ini, fokus utama adalah membangun sistem rekomendasi film berbasis content-based filtering menggunakan data publik dari TMDB (The Movie Database).
Pendekatan content-based filtering bekerja dengan menganalisis informasi atau atribut dari item itu sendiri (seperti genre, sinopsis, pemeran, sutradara, dll.) untuk merekomendasikan item lain yang mirip dengan preferensi pengguna. Metode ini sangat berguna ketika informasi historis interaksi pengguna sangat terbatas ( cold-start ), karena tidak memerlukan data dari pengguna lain, berbeda dengan collaborative filtering .
Dalam konteks industri hiburan, content-based filtering memungkinkan sistem rekomendasi untuk menyarankan film-film yang memiliki kemiripan konten dengan film yang telah disukai pengguna sebelumnya. Ini mjadikan pendekatan ini sangat cocok untuk menyaring informasi berlebih dan menyajikan konten yang relevan, personal, dan konsisten dengan preferensi individual.
Studi sebelumnya menunjukkan bahwa sistem rekomendasi berbasis konten dapat meningkatkan keterlibatan dan kepuasan pengguna, terutama dalam fase awal adopsi layanan [1]. Selain itu, pendekatan ini lebih mudah untuk dijelaskan kepada pengguna karena alasan rekomendasi dapat ditelusuri melalui atribut konten [2].
Proyek ini mengimplementasikan berbagai variasi content-based filtering menggunakan teknik representasi teks seperti TF-IDF, Word2Vec , serta gabungan bobot konten untuk membangun sistem rekomendasi yang akurat dan efisien.
Referensi:
[1] Lops, P., Gemmis, M. D., & Semeraro, G. (2011). Content-based Recommender Systems: State of the Art and Trends. Recommender Systems Handbook . Springer.
[2] Ricci, F., Rokach, L., & Shapira, B. (2015). Recommender Systems Handbook . Springer.
Sebelum merumuskan solusi, penting untuk memahami permasalahan yang ingin diselesaikan dalam proyek ini. Dalam konteks sistem rekomendasi film, kita perlu mempertimbangkan bagaimana pengguna berinteraksi dengan konten serta bagaimana karakteristik film dapat dimanfaatkan untuk menyajikan rekomendasi yang relevan. Oleh karena itu, bagian ini menguraikan pernyataan masalah yang menjadi fokus proyek, tujuan yang ingin dicapai, serta pendekatan solusi yang akan diterapkan.
Bagian laporan ini mencakup:
- Sulit merekomendasikan film yang relevan secara akurat berdasarkan karakteristik konten seperti genre, sinopsis, dan pemeran.
- Kesulitan dalam memanfaatkan pola interaksi pengguna untuk memberikan rekomendasi yang sesuai preferensi individual.
- Sistem rekomendasi saat ini kurang responsif terhadap perubahan selera pengguna dan variasi konten yang dinamis.
- Mengembangkan sistem rekomendasi film berbasis content-based filtering dengan memanfaatkan metadata film seperti genre, overview, kata kunci, dan informasi pemeran/sutradara.
- Membangun sistem rekomendasi film berbasis collaborative filtering yang dapat mengenali pola preferensi pengguna dari data interaksi pengguna-film.
- Mengevaluasi dan membandingkan performa kedua pendekatan untuk menentukan metode yang paling efektif dan relevan dalam konteks dataset dan kebutuhan pengguna.
Untuk menyelesaikan masalah di atas, tiga pendekatan utama akan digunakan:
- Membuat model content-based filtering dengan teknik ekstraksi fitur dari kolom genre, sinopsis (overview), kata kunci, serta informasi pemeran dan sutradara, dan menghitung kemiripan antar film menggunakan metode seperti TF-IDF + cosine similarity, Word2Vec + cosine similarity, dan gabungan Word2Vec dan TF-IDF menggunakan Jarak Euclidean atau Manhattan.
- Mengembangkan model collaborative filtering berbasis matriks interaksi pengguna-film, menggunakan algoritma seperti matrix factorization (misalnya SVD) atau nearest neighbors untuk mendeteksi pola preferensi pengguna.
- Melakukan evaluasi model menggunakan metrik evaluasi khusus sistem rekomendasi seperti Precision dan Recall guna menilai kualitas dan relevansi rekomendasi yang diberikan.
Dataset yang digunakan dalam proyek ini adalah TMDB 5000 Movie Dataset yang tersedia secara publik di Kaggle:
Dataset terdiri dari dua file utama:
tmdb_5000_movies.csv: Berisi metadata film seperti genre, sinopsis, kata kunci, popularitas, dll.tmdb_5000_credits.csv: Berisi informasi tentang aktor dan kru dalam setiap film.
Variabel-variabel pada TMDB 5000 Movie Dataset adalah sebagai berikut:
- Variabel
tmdb_5000_movies(20 Kolom dan 4803 Baris):
| Nama Kolom | Tipe Data | Jumlah Data | Deskripsi |
|---|---|---|---|
budget |
int64 | 4803 | Anggaran produksi film. |
genres |
object | 4803 | Kategori atau tipe film (misalnya: Action, Comedy). |
homepage |
object | 1712 | Situs resmi film. |
id |
int64 | 4803 | Identifikasi unik film. |
keywords |
object | 4803 | Kata kunci terkait tema atau elemen film. |
original_language |
object | 4803 | Bahasa asli film. |
original_title |
object | 4803 | Judul asli film sebelum translasi atau adaptasi. |
overview |
object | 4800 | Ringkasan atau sinopsis singkat film. |
popularity |
float64 | 4803 | Skor popularitas berdasarkan interaksi pengguna. |
production_companies |
object | 4803 | Nama perusahaan yang memproduksi film. |
production_countries |
object | 4803 | Negara tempat film diproduksi. |
release_date |
object | 4802 | Tanggal rilis film. |
revenue |
int64 | 4803 | Pendapatan total yang dihasilkan film. |
runtime |
float64 | 4801 | Durasi atau panjang film (dalam menit). |
spoken_languages |
object | 4803 | Bahasa yang digunakan dalam film. |
status |
object | 4803 | Status distribusi film (misalnya: Released, Post Production). |
tagline |
object | 3959 | Slogan promosi film. |
title |
object | 4803 | Judul film yang dirilis ke publik. |
vote_average |
float64 | 4803 | Rata-rata nilai rating pengguna. |
vote_count |
int64 | 4803 | Jumlah pengguna yang memberikan rating. |
- Variabel
tmdb_5000_credits(4 Kolom dan 4803 Baris):
| Nama Kolom | Tipe Data | Jumlah Data | Deskripsi |
|---|---|---|---|
movie_id |
int64 | 4803 | Identifikasi unik film (digunakan untuk penggabungan dengan tmdb_5000_movies). |
title |
object | 4803 | Judul film (duplikat dari tmdb_5000_movies). |
cast |
object | 4803 | Daftar aktor utama dalam film (format JSON string). |
crew |
object | 4803 | Daftar kru produksi, termasuk sutradara (format JSON string). |
-
Variabel
tmdb_5000_movies (Yang dirasa penting):titlegenresoverviewkeywordspopularityvote_averagevote_count
-
Variabel
tmdb_5000_credits (Yang dirasa penting):castcrew
-
Variabel
tmdb_5000_combinedtitlegenresoverviewkeywordspopularityvote_averagevote_countcastcrew
- Missing Values dari
movies_df
| Kolom | Jumlah Missing Values |
|---|---|
homepage |
3091 |
overview |
3 |
release_date |
1 |
runtime |
2 |
tagline |
844 |
- Missing Values dari
credits_df
| Kolom | Jumlah Missing Values |
|---|---|
| Seluruh kolom | 0 |
- Jumlah duplikat pada
movies_df= 0 - Jumlah duplikat pada
credits_df= 0
Tidak ditemukan duplikasi data pada kedua dataset, sehingga tidak perlu dilakukan penghapusan data ganda.
Meskipun terdapat nilai ekstrem (outlier) pada kolom budget, revenue, dan runtime, nilai-nilai tersebut tetap dipertahankan. Hal ini disebabkan karena setiap film memiliki anggaran dan pendapatan yang sangat bervariasi, serta durasi yang berbeda-beda sesuai dengan genre dan gaya produksi. Oleh karena itu, nilai ekstrem tersebut dianggap bukan outlier yang salah, melainkan representasi realistis dari variasi dalam industri film.
Pada tahap ini, dilakukan berbagai proses persiapan data guna mendapatkan dataset yang bersih, relevan, dan siap digunakan dalam pemodelan sistem rekomendasi film berbasis konten.
Data film (movies_df) dan data kredit film (credits_df) digabung menggunakan kolom id dan movie_id sebagai kunci join. Setelah penggabungan, kolom yang duplikat seperti title_y dihapus dan kolom title_x diganti namanya menjadi title untuk konsistensi.
Kolom-kolom yang tidak relevan atau berpotensi menyebabkan bias dihapus untuk menjaga efisiensi dan fokus pada fitur yang berkontribusi pada penilaian kesamaan konten, seperti id, budget, revenue, homepage, dan metadata teknis lainnya. Kolom yang dipertahankan antara lain title, genres, overview, keywords, popularity, vote_average, vote_count, cast, dan crew.
Duplikat berdasarkan judul diidentifikasi dan dihapus agar data tidak bias karena pengulangan. Baris dengan nilai kosong pada kolom overview juga dihapus karena sinopsis merupakan komponen penting dalam sistem rekomendasi berbasis konten.
Fungsi extract_names digunakan untuk mengekstrak nama dari kolom JSON yang berisi list of dictionaries, membatasi maksimal item yang diambil. Fungsi extract_director khusus mengambil nama sutradara dari kolom crew.
Kolom-kolom seperti genres, keywords, dan cast diubah dari string JSON menjadi list of names dengan batasan jumlah item. Kolom crew digunakan untuk mengekstrak nama sutradara ke kolom baru director.
Kolom overview diubah dari string menjadi list kata (tokenisasi) dan dilakukan preprocessing seperti case folding (huruf kecil semua), penghilangan karakter khusus, dan pemecahan kalimat menjadi kata-kata untuk persiapan NLP
Semua fitur yang sudah berupa list diubah menjadi string, kemudian digabung menjadi satu kolom tags yang berisi representasi teks lengkap film.
Untuk mengurangi kata-kata umum yang kurang bermakna dan menyederhanakan kata ke bentuk dasarnya, dilakukan penghapusan stopwords dan stemming pada kolom tags.
Setelah proses pembersihan, transformasi, dan penggabungan data, langkah selanjutnya adalah mengubah data teks pada kolom tags menjadi bentuk numerik. Representasi numerik ini sangat penting dalam sistem rekomendasi berbasis konten agar kesamaan antar film bisa dihitung secara matematis. Proses ini terdiri dari beberapa metode:
-
Ekstraksi Fitur dengan TF-IDF
TF-IDF (Term Frequency – Inverse Document Frequency) adalah teknik pemrosesan teks yang memberikan bobot pada setiap kata berdasarkan dua aspek:
- Seberapa sering kata tersebut muncul dalam suatu dokumen ( term frequency )
- Seberapa jarang kata tersebut muncul di seluruh dokumen ( inverse document frequency )
Bobot TF-IDF yang tinggi menandakan bahwa kata tersebut cukup khas untuk membedakan isi film tertentu.
Model TF-IDF ini dibatasi hanya pada 5000 kata terpenting menggunakan parameter
max_features=5000.Hasil dari proses ini adalah vektor berdimensi 5000 untuk setiap film, yang digunakan dalam perhitungan cosine similarity .
-
Ekstraksi Fitur dengan Word2Vec
Berbeda dengan TF-IDF yang berbasis frekuensi, Word2Vec membangun representasi vektor kata yang lebih kontekstual. Kata-kata yang sering muncul bersama dalam konteks serupa akan memiliki vektor yang berdekatan dalam ruang vektor.
Langkah-langkahnya:
- Kolom
tagsdi-tokenisasi (dipecah menjadi kata-kata). - Model Word2Vec dilatih pada token tersebut menggunakan
vector_size=100. - Setiap kata akan memiliki vektor berdimensi 100.
- Kolom
-
Representasi Dokumen dengan Rata-Rata Word2Vec
Untuk mengubah teks film menjadi satu vektor tunggal, dihitung rata-rata dari semua vektor kata valid dalam
tagsfilm tersebut. Jika sebuah kata tidak terdapat dalam Word2Vec vocabulary, maka kata tersebut diabaikan. Hasilnya adalah vektor dense berdimensi 100 untuk setiap film. Vektor ini akan digunakan dalam penghitungan kemiripan antar film berdasarkan konteks semantik kata.
Pada tahap modeling, dilakukan pengembangan tiga skema content-based filtering untuk sistem rekomendasi film. Ketiga skema menggunakan representasi teks dari fitur film yang sudah dipersiapkan sebelumnya (kolom tags), namun dengan pendekatan dan algoritma similarity yang berbeda.
Pada skema pertama, teks gabungan fitur film diubah menjadi representasi numerik menggunakan TF-IDF (Term Frequency-Inverse Document Frequency) . TF-IDF memberikan bobot pada kata berdasarkan frekuensi kemunculan kata dalam satu dokumen dan keunikannya di seluruh koleksi dokumen. Ini membantu memfilter kata-kata yang umum muncul namun kurang informatif.
Kemudian, dihitung kemiripan antar film menggunakan cosine similarity dari vektor TF-IDF tersebut. Cosine similarity mengukur sudut kemiripan antar vektor fitur sehingga cocok untuk data teks berdimensi tinggi dan sparse.
Fungsi recommend_tfidf menerima judul film dan menghasilkan 5 rekomendasi film teratas berdasarkan skor kemiripan cosine.
Contoh 5 rekomendasi teratas untuk film "Cars 2":
| Rekomendasi | Skor Cosine Similarity |
|---|---|
| Cars | 0.392 |
| Witless Protection | 0.325 |
| Toy Story | 0.285 |
| Larry the Cable Guy: Health Inspector | 0.269 |
| Cats Don't Dance | 0.243 |
Skema kedua menggunakan representasi kata yang diperoleh dari model Word2Vec yang dilatih pada token hasil preprocessing kolom tags. Word2Vec menghasilkan vektor kata yang menangkap konteks semantik dan hubungan kata lebih dalam daripada TF-IDF.
Untuk setiap film, representasi vektor diperoleh dari rata-rata vektor kata (embedding) dari kata-kata valid dalam tag film tersebut. Kemudian dihitung cosine similarity antar vektor film untuk menentukan kemiripan.
Fungsi recommend_w2v melakukan rekomendasi 5 film teratas berdasarkan kemiripan cosine dari representasi Word2Vec.
Contoh 5 rekomendasi teratas untuk film "Cars 2":
| Rekomendasi | Skor Cosine Similarity |
|---|---|
| The Ant Bully | 1.000 |
| The Jungle Book 2 | 1.000 |
| The Road to El Dorado | 1.000 |
| Ice Age: Continental Drift | 1.000 |
| Penguins of Madagascar | 1.000 |
Skema 3: Content-Based Filtering dengan Gabungan Word2Vec dan TF-IDF menggunakan Jarak Euclidean atau Manhattan
Skema ketiga merupakan pengembangan dari skema Word2Vec, di mana representasi vektor film dihitung sebagai rata-rata vektor kata Word2Vec yang dibobot oleh nilai TF-IDF tiap kata. Hal ini bertujuan menggabungkan kekuatan TF-IDF (bobot kata yang informatif) dan Word2Vec (konteks semantik).
Setelah mendapatkan vektor representasi, dihitung jarak antar vektor menggunakan metrik Euclidean dan Manhattan. Nilai jarak ini kemudian dikonversi menjadi similarity score dengan rumus similarity = 1 / (1 + distance).
Fungsi recommend_w2v_distance menerima judul film dan matriks similarity untuk memberikan rekomendasi 5 film teratas berdasarkan nilai similarity tertinggi.
Contoh 5 rekomendasi film teratas untuk film "Cars 2" dengan Euclidean Distance:
| Rekomendasi | Skor Similarity |
|---|---|
| Mulan | 0.967 |
| Sliding Doors | 0.963 |
| Shrek the Third | 0.951 |
| The Pink Panther | 0.946 |
| Barnyard | 0.944 |
Contoh 5 rekomendasi film teratas untuk film "Cars 2" dengan Manhattan Distance:
| Rekomendasi | Skor Similarity |
|---|---|
| Mulan | 0.781 |
| Sliding Doors | 0.766 |
| Shrek the Third | 0.702 |
| The Pink Panther | 0.689 |
| Serial Mom | 0.677 |
| Skema | Kelebihan | Kekurangan |
|---|---|---|
| TF-IDF + Cosine Similarity | Mudah diterapkan, cepat, efektif untuk teks sparse | Kurang menangkap konteks semantik kata |
| Word2Vec + Cosine Similarity | Menangkap hubungan semantik antar kata, lebih kaya konteks | Perlu pelatihan model embedding, butuh data cukup besar |
| Word2Vec + TF-IDF + Distance | Menggabungkan bobot penting kata dan konteks semantik; jarak bisa lebih sensitif | Lebih kompleks, perlu tuning metrik jarak, komputasi lebih berat |
Pada bagian ini, sistem rekomendasi dievaluasi menggunakan dua metrik utama, yaitu Precision dan Recall, dengan K = 5. Kedua metrik ini umum digunakan dalam sistem rekomendasi karena mampu memberikan gambaran tentang relevansi hasil rekomendasi terhadap kebutuhan pengguna.
- Precision mengukur proporsi film relevan yang berhasil direkomendasikan dalam lima rekomendasi teratas. Cara menghitungnya adalah dengan membagi jumlah film yang relevan dalam daftar rekomendasi top-5 dengan jumlah total film yang direkomendasikan, yaitu lima.
- Recall mengukur proporsi film relevan dari seluruh film relevan (ground truth) yang berhasil ditemukan oleh sistem dalam top-5. Cara menghitungnya adalah dengan membagi jumlah film relevan dalam daftar rekomendasi top-5 dengan jumlah total film relevan yang ada di ground truth.
Sebagai contoh, berikut adalah proses evaluasi untuk film Cars 2, yang memiliki daftar ground truth sebanyak 15 film relevan:
Top-5 rekomendasi:
- Cars
- Witless Protection
- Toy Story
- Larry the Cable Guy: Health Inspector
- Cats Don't Dance
Dari daftar tersebut, dua film yaitu Cars dan Toy Story termasuk dalam ground truth. Maka:
- Jumlah film relevan dalam top-5 = 2
- Total film yang direkomendasikan = 5
- Total film relevan (ground truth) = 15
Precision@5 adalah 2 dibagi 5, yaitu 0.400
Recall@5 adalah 2 dibagi 15, yaitu 0.133
Top-5 rekomendasi:
- The Ant Bully
- The Jungle Book 2
- The Road to El Dorado
- Ice Age: Continental Drift
- Penguins of Madagascar
Dari daftar tersebut, dua film yaitu The Ant Bully dan Penguins of Madagascar termasuk dalam ground truth.
- Jumlah film relevan dalam top-5 = 2
- Precision@5 = 2 dibagi 5 = 0.400
- Recall@5 = 2 dibagi 15 = 0.133
Dengan Euclidean Distance
Top-5 rekomendasi:
- Mulan
- Sliding Doors
- Shrek the Third
- The Pink Panther
- Barnyard
Tiga film, yaitu Shrek the Third, The Pink Panther, dan Barnyard, termasuk dalam ground truth.
- Jumlah film relevan dalam top-5 = 3
- Precision@5 = 3 dibagi 5 = 0.600
- Recall@5 = 3 dibagi 15 = 0.200
Evaluasi dilakukan terhadap tiga skema rekomendasi yang dikembangkan, dengan menggunakan 5 rekomendasi teratas (top-5) untuk setiap film pada ground truth "Cars 2". Berikut hasil evaluasi dari masing-masing skema:
| Skema | Precision | Recall |
|---|---|---|
| 1. TF-IDF + Cosine Similarity | 0.400 | 0.133 |
| 2. Word2Vec + Cosine Similarity | 0.400 | 0.133 |
| 3. Word2Vec + TF-IDF + Euclidean Distance | 0.600 | 0.200 |
- Skema 1 dan 2 memiliki nilai precision yang sama yaitu 0.4, artinya dari 5 rekomendasi yang diberikan, rata-rata 2 film termasuk dalam daftar film relevan pada ground truth. Namun, recall-nya masih rendah, yaitu 0.133, yang mengindikasikan sebagian besar film relevan tidak tercover oleh rekomendasi.
- Skema 3 menunjukkan peningkatan performa dengan precision 0.6 dan recall 0.2. Artinya, rekomendasi yang dihasilkan lebih tepat (3 dari 5 rekomendasi relevan) dan lebih banyak film relevan yang berhasil ditemukan dibanding skema sebelumnya.
- Hasil ini menunjukkan bahwa kombinasi Word2Vec dengan bobot TF-IDF dan penggunaan metrik jarak seperti Euclidean dapat memberikan rekomendasi yang lebih relevan secara kontekstual dibanding hanya menggunakan TF-IDF atau Word2Vec secara terpisah.