Sistem Rekomendasi Musik Spotify Menggunakan Content Based Filtering

Hlo semus, kali ini saya akan membahas tentang projek yang telah saya buat. Data dan sumber referensi nanti akan saya cantumkan sekalian, beserta alamat github projek ini.

Sekilas Ulasan Proyek

Proyek berupa sistem rekomendasi musik yang ditunjukkan bagi pengguna aplikasi Spotify. Sistem rekomendasi musik ini menggunakan pendekatan content-based filtering. Sistem rekomendasi adalah algoritma yang digunakan untuk membuat saran yang akurat berdasarkan preferensi atau kebutuhan pengguna [1]Content-based filtering melakukan rekomendasi dengan mempelajari kesamaan item konten yang telah dipilih pengguna [2].

Musik telah menjadi salah satu seni yang disenangi oleh masyarakat di seluruh dunia. Musik datang dalam berbagai genre, seperti rock, klasik, tradisional, pop, dan banyak lagi. Evolusi teknologi dalam musik saat ini memudahkan pecinta musik untuk mengakses lagu dari aplikasi yang tersedia. Salah satunya adalah aplikasi Spotify. 

Spotify adalah aplikasi pemutar musik yang menyediakan berbagai lagu dari berbagai kategori dan popularitas. Pengguna dapat mendengarkan artis dan genre favorit mereka dengan aplikasi Spotify ini. 

Karena banyaknya musik yang terdapat pada Spotify terkadang pengguna bingung untuk memilih yang cocok dengan seleranya. Dan jika hanya mendengarkan lagu yang sama terus-menerus akan timbul rasa bosan. Oleh karena itu dibuatlah sistem rekomendasi ini untuk merekomendasikan pengguna terkait lagu yang sesuai dengan seleranya.

Pemahaman Dari Segi Implementasi

Rumusan Masalah

Berdasarkan uraian dari ulasan proyek yang telah dijelaskan sebelumnya, maka dapat diperoleh rumusan masalah :

  • Bagaimana penggunaan content-based filtering untuk sistem rekomendasi musik?
Tujuan

Tujuan dari proyek yang dikerjakan adalah :

  • Membuat sistem rekomendasi dengan menggunakan content-based filtering
  • Melakukan penerapan metriks presisi untuk melihat performa dari rekomendasi sistem
Pendekatan Solusi

Solusi untuk menyelesaikan permasalahan berdasarkan tujuan proyek adalah :

  • Melakukan pengolahan data pada tahap data preparation untuk meningkatkan presisi rekomendasi
  • Menggunakan pendekatan cosine similarity untuk rekomendasi berdasarkan content-based filtering

Eksplorasi Data

Data yang digunakan untuk proyek kali ini adalah 19,000 Spotify Song yang diunduh dari Dataset Kaggle

Dataset itu memiliki 2 buah file,  yaitu song_data.csv dan song_info.csvsong_data.csv berisi informasi yang berkaitan tentang atribut audio lagu. Sedangkan song_info.csv berisi informasi yang berkaitan tentang metadata lagu. 

Untuk proyek kali ini kita hanya akan menggunakan song_info.csv_. song_info.csv memiliki jumlah data sebanyak 18835 baris dengan 4 kolom, kolom yang dimaksud adalah song_nameartist_namealbum_names, dan playlist yang bertipe sebagai object. Untuk penjelasan tentang variabel-variabel kolom tersebut, dapat dilihat pada poin-poin berikut :

  • song_name : Judul lagu yang tertampil
  • artist_name : Nama penyanyi yang menyanyikan lagu tersebut
  • album_names : Nama album dimana lagu tersebut termasuk sebagai koleksinya, album sendiri adalah koleksi lagu dari suatu penyanyi
  • playlist : Kumpulan lagu yang memiliki suatu kesamaan

Dari hasil eksplorasi unique value untuk tiap variabel kolom,hasilnya adalah sebagai berikut :

# Melihat jumlah lagu yang ada pada dataset
print("Jumlah lagu yang ada dalam dataset : ", len(song_info.song_name.unique()))

Hasilnya jumlah lagu yang ada dalam dataset adalah 13070

# Melihat jumlah artis yang ada pada dataset
print("Jumlah Penyanyi dalam dataset : ", len(song_info.artist_name.unique()))

Hasilnya jumlah penyanyi dalam dataset adalah 7564

# Melihat jumlah album dalam dataset
print("Jumlah Album dalam dataset : ", len(song_info.album_names.unique()))

Hasilnya jumlah album dalam dataset adalah 12014

# Melihat jumlah playlist dalam dataset
print("Jumlah Playlist dalam dataset : ", len(song_info.playlist.unique()))

Hasilnya jumlah playlist dalam dataset adalah 300

Kemudian berikut adalah visualiasasi terkait jumlah penyayi dan playlist dengan lagu terbanyak dalam dataset ini.

# Top 10 Penyayi dengan lagu terbanyak
plt.figure(figsize=(12,8))
sns.countplot(x='artist_name', data = song_info, order = song_info.artist_name.value_counts().sort_values(ascending=False).iloc[:10].index)
plt.title("Top 10 Artist dengan Lagu Terbanyak")
plt.xticks(rotation = 45)
plt.show()

Output

# Top 10 playlist dengan lagu terbanyak
plt.figure(figsize=(12,8))
sns.countplot(x='playlist', data=song_info, order = song_info.playlist.value_counts().sort_values(ascending=False).iloc[:10].index)
plt.title("Top 10 Playlist dengan Lagu Terbanyak")
plt.xticks(rotation = 45)
plt.show()

Output

Data Preparation

Tahap berikutnya adalah data preparation, tahap dimana data akan diolah sehingga sudah siap untuk proses pemodelan. Dan berikut adalah tahapan dalam tahap data preparation:

  • Membuang data duplikasi yang memiliki kesamaan pada kolom song_name dan artist_name. Tujuannya supaya tidak muncul suatu data sebanyak 2 kali pada proses rekomendasi nanti. Proses penghilangan data duplikasi ini adalah dengan perintah drop_duplicates dari library pandas.
# Membuang data duplikat duplikat
song_info = song_info.drop_duplicates(['song_name', 'artist_name'])
song_info
  • Membuat fitur baru bernama info dengan cara menggabungkan kolom artist_namealbum_names, dan playlist. Hal tersebut dilakukan untuk memudahkan proses TF-IDF, karena fitur info telah mencakup ketiga fitur kolom.
# Menggabungkan kolom artist_name, album_names, dan playlist
new_song_info = song_info.copy()
new_song_info['info'] = new_song_info[['artist_name','album_names','playlist']].agg(' '.join, axis=1) 

# Melakukan drop pada kolom artist_name, album_names, dan playlist
new_song_info = new_song_info.drop(columns=['artist_name', 'album_names', 'playlist'], axis = 1)
new_song_info.head()

Pemodelan dan Hasil

Setelah data telah diolah, maka proses selanjutnya adalah pemodelan

TF-IDF

Secara sederhana TF merupakan frekuensi kemunculan kata dalam suatu dokumen. IDF merupakan sebuah perhitungan dari bagaimana kata didistribusikan secara luas pada koleksi dokumen yang bersangkutan. Pada projek ini TF-IDF digunakan pada sistem rekomendasi untuk menemukan representasi fitur penting dari setiap kategori masakan. Untuk melakukan proses TF-IDF ini digunakan fungsi TfidfVectorizer dari sklearn.

# Persiapan tfidfvectorizer
tf = TfidfVectorizer()

# Melakukan perhitungan idf pada kolom info
tf.fit(new_song_info['info'])

# Mapping array dari fitur index integer ke fitur nama
tf.get_feature_names()

# Melakukan fit lagu di translasikan ke bentuk matriks
tfidf_matrix = tf.fit_transform(new_song_info['info'])

# Melihat ukuran matriks
tfidf_matrix.shape

# Menjadi bentuk matriks
tfidf_matrix.todense()

Cosine similarity

Cosine similarity adalah metrik yang digunakan untuk mengukur tingkat kesamaan suatu dokumen terlepas dari ukurannya. Dan secara matematis, cosine similarity mengukur kosinus sudut antara dua vektor yang diproyeksikan dalam ruang multidimensi. Cosine similarity memiliki keuntungan apabila dua dokumen serupa terpisah oleh euclidean distance karena ukuran dokumen, kemungkinan mereka masih berorientasi ada. Dalam proses ini cosine similarity dipanggil dengan fungsi cosine_similarity dari sklearn. Input fungsi cosine_similarity adalah matrix hasil dari proses TF-IDF, yang kemudian menghasilkan output berupa array tingkat kesamaan.

# Menghitung cosine similarity
cos_sim = cosine_similarity(tfidf_matrix)

# Membuat dataframe dari variabel cos_sim dengan baris dan kolom berupa song_name
cos_sim_df = pd.DataFrame(cos_sim, index=new_song_info['song_name'], columns=new_song_info['song_name'])

Membuat Fungsi song_recommendation

Fungsi tersebut digunakan untuk memberikan rekomendasi berdasarkan sebuah nama lagu. Pada fungsi tersebut akan dilakukan pencarian kolom yang sama dengan nama lagu yang dimasukkan pada dataframe hasil cosine similarity. Setelah itu diurutkan berdasarkan nilai cosine similarity tertinggi, kemudian dilakukan drop nama lagu yang dijadikan acuan agar tidak muncul dalam daftar rekomendasi. Kemudian outputnya berupa 5 lagu yang memiliki cosine similarity tertinggi. Hasil dari fungsi ini dapat dilihat pada gambar berikut :

def song_recommendations(song_name, similarity_data=cos_sim_df, items=song_info, k=5): 
  print(f"Jika kamu menyukai lagu {song_name}, mungkin kamu juga menyukai 5 lagu berikut :")
  # Mengambil data dengan menggunakan argpartition untuk melakukan partisi secara tidak langsung sepanjang sumbu yang diberikan    
  index = similarity_data.loc[:,song_name].to_numpy().argpartition(range(-1, -k, -1))
    
  # Mengambil data dengan similarity terbaik
  closest = similarity_data.columns[index[-1:-(k+2):-1]]
    
  # Drop song_name
  closest = closest.drop(song_name, errors='ignore')
 
  return pd.DataFrame(closest).merge(items).head(k)

Pengujian

# Melihat informasi tentang lagu yang akan dijadikan acua
song_info[song_info.song_name.eq('Rap God')]   

Output

# Mendapatkan rekomendasi musik
song_recommendations(song_name="Rap God") 

Output

Evaluasi

Sistem rekomendasi yang telah dibuat kemudian dilakukan evaluasi. Untuk mengukur kinerja sistem rekomendasi digunakan matriks presisi. Presisi merupakan banyaknya item rekomendasi yang relevan dibagi dengan banyaknya item yang direkomendasikan. Rumus dari metriks presisi adalah sebagai berikut :

Dan dari perhitungan metriks presisi didapatkan nilai 80%, untuk lebih jelasnya bisa dilihat pada gambar berikut,


Referensi

  • [1] P. Jomsri, S. Sanguansintukul, and W. Choochaiwattana, “A framework for tag-based research paper recommender system: An ir approach,” in 2010 IEEE 24th International Conference on Advanced Information Networking and Applications Workshops, April 2010, pp. 103–108
  • [2] M. Hassan and M. Hamada, “Improving prediction accuracy of multicriteria recommender systems using adaptive genetic algorithms,” in 2017 Intelligent Systems Conference (IntelliSys), Sept 2017, pp. 326–330.

Link Projek Github
Music Recommendation Content based Filtering