Spotify merupakan sebuah platform streaming musik yang memungkinkan pengguna untuk mendengarkan dan menikmati berbagai jenis lagu dari berbagai genre dan artis. Dengan koleksi musik yang sangat luas, pengguna dapat menyimpan dan memutar lagu-lagu favorit mereka dengan mudah. Proyek kali ini bertujuan untuk melakukan analisis clustering pada data Spotify dengan menggunakan metode k-means. Melalui analisis ini, kita dapat mengelompokkan lagu-lagu berdasarkan karakteristik dan fitur audio tertentu yang dimiliki oleh masing-masing lagu. Selain itu, proyek ini juga bertujuan untuk menganalisis pengaruh fitur audio tertentu terhadap popularitas sebuah lagu. Dengan demikian, hasil dari analisis ini dapat memberikan wawasan yang berharga bagi para musisi dan industri musik dalam menciptakan lagu-lagu yang lebih menarik dan populer di platform Spotify.
Dalam proyek ini, selain melakukan analisis clustering dengan metode
k-means untuk mengelompokkan lagu-lagu berdasarkan karakteristik dan
fitur audio tertentu, Anda juga menggunakan metode Principal Component
Analysis (PCA). Dengan menerapkan PCA, Anda mereduksi dimensi dari data
Spotify yang semula memiliki banyak fitur audio menjadi beberapa
principal components yang paling mewakili variabilitas dalam data.
Integrasi antara PCA dan k-means Clustering membantu Anda
memvisualisasikan data dalam dimensi yang lebih rendah dan memperoleh
informasi tentang karakteristik utama yang membentuk kelompok lagu-lagu.
Berikut ini adalah library yang akan digunakan untuk melakukan analisis clustering menggunakan k-means :
Sebelum memulai proses clustering, langkah pertama adalah membaca
data menggunakan fungsi read.csv dan kemudian menampilkan
enam data teratas dengan menggunakan head().
#> [1] 232725 18
#> Rows: 232,725
#> Columns: 18
#> $ genre <chr> "Movie", "Movie", "Movie", "Movie", "Movie", "Movie",…
#> $ artist_name <chr> "Henri Salvador", "Martin & les fées", "Joseph Willia…
#> $ track_name <chr> "C'est beau de faire un Show", "Perdu d'avance (par G…
#> $ track_id <chr> "0BRjO6ga9RKCKjfDqeFgWV", "0BjC1NfoEOOusryehmNudP", "…
#> $ popularity <int> 0, 1, 3, 0, 4, 0, 2, 15, 0, 10, 0, 2, 4, 3, 0, 0, 0, …
#> $ acousticness <dbl> 0.61100, 0.24600, 0.95200, 0.70300, 0.95000, 0.74900,…
#> $ danceability <dbl> 0.389, 0.590, 0.663, 0.240, 0.331, 0.578, 0.703, 0.41…
#> $ duration_ms <int> 99373, 137373, 170267, 152427, 82625, 160627, 212293,…
#> $ energy <dbl> 0.9100, 0.7370, 0.1310, 0.3260, 0.2250, 0.0948, 0.270…
#> $ instrumentalness <dbl> 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.123…
#> $ key <chr> "C#", "F#", "C", "C#", "F", "C#", "C#", "F#", "C", "G…
#> $ liveness <dbl> 0.3460, 0.1510, 0.1030, 0.0985, 0.2020, 0.1070, 0.105…
#> $ loudness <dbl> -1.828, -5.559, -13.879, -12.178, -21.150, -14.970, -…
#> $ mode <chr> "Major", "Minor", "Minor", "Major", "Major", "Major",…
#> $ speechiness <dbl> 0.0525, 0.0868, 0.0362, 0.0395, 0.0456, 0.1430, 0.953…
#> $ tempo <dbl> 166.969, 174.003, 99.488, 171.758, 140.576, 87.479, 8…
#> $ time_signature <chr> "4/4", "4/4", "5/4", "4/4", "4/4", "4/4", "4/4", "4/4…
#> $ valence <dbl> 0.8140, 0.8160, 0.3680, 0.2270, 0.3900, 0.3580, 0.533…
Data Spotify terdiri dari 232725 baris dan 18 kolom dengan deskripsi masing-masing kolom sebagai berikut:
genre: Genre dari lagu dalam bentuk teks (chr).artist_name: Nama artis yang membuat lagu dalam bentuk
teks (chr).track_name: Nama lagu dalam bentuk teks (chr).track_id: ID unik yang mengidentifikasi lagu dalam
bentuk teks (chr).popularity: Tingkat popularitas lagu dalam bentuk angka
(int).acousticness: Ukuran tingkat akustik dari lagu dalam
bentuk angka (dbl).danceability: Ukuran tingkat kesesuaian untuk menari
dari lagu dalam bentuk angka (dbl).duration_ms: Durasi lagu dalam milidetik dalam bentuk
angka (int).energy: Ukuran tingkat energi lagu dalam bentuk angka
(dbl).instrumentalness: Ukuran tingkat instrumental dari lagu
dalam bentuk angka (dbl).key: Kunci musik lagu dalam bentuk teks (chr).liveness: Ukuran tingkat kesan pertunjukan langsung
dari lagu dalam bentuk angka (dbl).loudness: Ukuran tingkat volume lagu dalam bentuk angka
(dbl).mode: Kategori apakah lagu berada di mode mayor atau
minor dalam bentuk teks (chr).speechiness: Ukuran tingkat ucapan dalam lagu dalam
bentuk angka (dbl).tempo: Tempo atau kecepatan lagu dalam bentuk angka
(dbl).time_signature: Tanda waktu lagu dalam bentuk teks
(chr).valence: Ukuran tingkat kesenangan atau positivitas
lagu dalam bentuk angka (dbl).Data ini memberikan informasi yang penting untuk melakukan analisis clustering dan menganalisis fitur audio yang mempengaruhi popularitas sebuah lagu di platform Spotify.
Pada tahap ini, kita memeriksa tipe data dari setiap kolom, apakah sudah sesuai dengan format yang diharapkan atau tidak. Hal ini perlu dilakukan untuk memastikan bahwa semua data telah diatur dengan benar dan sesuai dengan analisis yang akan dilakukan selanjutnya.
Ada beberapa kolom yang belum sesuai tipe datanya dan harus diubah ketipe data yang sesuai:
genre tipe data chart diubah menjadi
factorkey tipe data chart menjadi
factormode tipe data chart menjadi
factorvalence tipe data chart menjadi
factorSelain itu kita juga akan membuang kolom yang tidak diperlukan.
spotify_clean <- spotify %>%
mutate(genre = as.factor(genre),
key = as.factor(key),
mode = as.factor(mode),
valence = as.factor(valence)) %>%
select(-track_id, -time_signature, -artist_name, -track_name)Untuk mengurangi beban komputasi dan memfasilitasi analisis eksplorasi pada pembentukan cluster, diputuskan untuk menggunakan hanya 2000 data secara acak dari keseluruhan data yang tersedia. Dengan melakukan sampel sebanyak itu, kita tetap dapat memperoleh wawasan yang relevan dari dataset yang sangat besar ini tanpa mengorbankan kualitas analisis. Sampel acak ini akan mencerminkan variasi data asli dan memungkinkan kita untuk menjalankan algoritma clustering dengan lebih efisien dan cepat.
#> [1] 0.008593834
# pemilihan data untuk dilakukan clustering
set.seed(50)
intrain <- sample(nrow(spotify_clean), nrow(spotify_clean)*0.008593834)
spotify_sample <- spotify_clean[intrain,]
dim(spotify_sample)#> [1] 2000 14
Pada tahap ini, pertama kita akan melihat apakah terdapat missing value atau tidak.
#> genre popularity acousticness danceability
#> 0 0 0 0
#> duration_ms energy instrumentalness key
#> 0 0 0 0
#> liveness loudness mode speechiness
#> 0 0 0 0
#> tempo valence
#> 0 0
Dari hasil sebelumnya, dapat disimpulkan bahwa dataset “spotify” telah berhasil diolah sehingga tidak terdapat nilai yang hilang (missing value). Langkah selanjutnya yang akan diambil adalah memeriksa skala antar variabel dalam dataset ini. Tujuan dari langkah ini adalah untuk memastikan bahwa nilai-nilai dari berbagai variabel memiliki rentang yang serupa atau setidaknya dapat dibandingkan secara langsung. Dengan memeriksa skala antar variabel, kita dapat mengidentifikasi apakah ada perbedaan besar dalam ukuran nilai antar fitur audio seperti tempo, energy, atau loudness. Dengan demikian, analisis clustering nantinya dapat dilakukan dengan lebih akurat dan hasilnya menjadi lebih bermakna.
#> genre popularity acousticness danceability
#> Pop : 98 Min. : 0.00 Min. :0.0000048 Min. :0.0603
#> Hip-Hop : 95 1st Qu.:30.00 1st Qu.:0.0363000 1st Qu.:0.4340
#> Rock : 89 Median :44.00 Median :0.2200000 Median :0.5720
#> Blues : 88 Mean :41.62 Mean :0.3623156 Mean :0.5595
#> Children’s Music: 87 3rd Qu.:55.00 3rd Qu.:0.7122500 3rd Qu.:0.7010
#> Reggaeton : 85 Max. :89.00 Max. :0.9960000 Max. :0.9640
#> (Other) :1458
#> duration_ms energy instrumentalness key
#> Min. : 29707 Min. :0.00151 Min. :0.000000 C :254
#> 1st Qu.: 185549 1st Qu.:0.39975 1st Qu.:0.000000 G :236
#> Median : 223419 Median :0.61100 Median :0.000043 A :231
#> Mean : 237219 Mean :0.57455 Mean :0.141778 D :210
#> 3rd Qu.: 267870 3rd Qu.:0.78700 3rd Qu.:0.029200 C# :193
#> Max. :2640040 Max. :0.99900 Max. :0.983000 F :168
#> (Other):708
#> liveness loudness mode speechiness
#> Min. :0.00967 Min. :-41.136 Major:1322 Min. :0.02280
#> 1st Qu.:0.09617 1st Qu.:-11.469 Minor: 678 1st Qu.:0.03680
#> Median :0.12800 Median : -7.706 Median :0.05155
#> Mean :0.21665 Mean : -9.422 Mean :0.12106
#> 3rd Qu.:0.27300 3rd Qu.: -5.498 3rd Qu.:0.10800
#> Max. :0.99100 Max. : 0.000 Max. :0.96000
#>
#> tempo valence
#> Min. : 44.56 0.387 : 10
#> 1st Qu.: 93.01 0.306 : 8
#> Median :115.82 0.399 : 8
#> Mean :117.85 0.443 : 7
#> 3rd Qu.:139.37 0.49 : 7
#> Max. :212.14 0.634 : 7
#> (Other):1953
Data Spotify perlu dilakukan proses scaling karena nilai dalam setiap
kolomnya memiliki skala yang berbeda. Oleh karena itu, untuk
mengaplikasikan metode k-means, kita hanya akan menggunakan data yang
memiliki tipe numerik. Untuk itu, kita menyimpan kolom-kolom dengan tipe
data numerik dari dataset Spotify ke dalam variabel
spotify_num.
# Memilih hanya kolom-kolom numerik dari data spotify_clean
spotify_num <- spotify_sample %>% select_if(is.numeric)
# Normalisasi data numerik menggunakan scale()
spotify_scale <- spotify_num %>% scale()
summary(spotify_scale)#> popularity acousticness danceability duration_ms
#> Min. :-2.3053 Min. :-1.0283 Min. :-2.65950 Min. :-1.7389
#> 1st Qu.:-0.6435 1st Qu.:-0.9253 1st Qu.:-0.66878 1st Qu.:-0.4330
#> Median : 0.1320 Median :-0.4039 Median : 0.06636 Median :-0.1156
#> Mean : 0.0000 Mean : 0.0000 Mean : 0.00000 Mean : 0.0000
#> 3rd Qu.: 0.7413 3rd Qu.: 0.9932 3rd Qu.: 0.75355 3rd Qu.: 0.2568
#> Max. : 2.6247 Max. : 1.7985 Max. : 2.15456 Max. :20.1348
#> energy instrumentalness liveness loudness
#> Min. :-2.2162 Min. :-0.4783 Min. :-1.0338 Min. :-5.5027
#> 1st Qu.:-0.6760 1st Qu.:-0.4783 1st Qu.:-0.6017 1st Qu.:-0.3552
#> Median : 0.1410 Median :-0.4782 Median :-0.4428 Median : 0.2977
#> Mean : 0.0000 Mean : 0.0000 Mean : 0.0000 Mean : 0.0000
#> 3rd Qu.: 0.8216 3rd Qu.:-0.3798 3rd Qu.: 0.2814 3rd Qu.: 0.6808
#> Max. : 1.6415 Max. : 2.8381 Max. : 3.8674 Max. : 1.6347
#> speechiness tempo
#> Min. :-0.53894 Min. :-2.37428
#> 1st Qu.:-0.46215 1st Qu.:-0.80471
#> Median :-0.38125 Median :-0.06603
#> Mean : 0.00000 Mean : 0.00000
#> 3rd Qu.:-0.07164 3rd Qu.: 0.69697
#> Max. : 4.60138 Max. : 3.05436
Dengan cara ini, kita dapat memastikan bahwa data yang akan digunakan dalam analisis clustering memiliki karakteristik yang seragam dalam skala sehingga hasil clustering menjadi lebih relevan dan akurat.
Ada terdapat beberapa fitur yang memiliki korelasi tinggi yaitu
acousticness dengan energy dan
loudness, energy dengan loudness
dan lainnya. Dari hasil tersebut, kita akan mencoba mengurangi dimensi
menggunakan PCA.
Clustering adalah proses pengelompokan data berdasarkan karakteristik atau atributnya yang mirip. Tujuan utama dari clustering adalah untuk membentuk kelompok atau cluster yang terdiri dari observasi atau data yang memiliki kesamaan atau kedekatan dalam karakteristik tertentu. Dalam proses clustering, observasi yang termasuk dalam satu cluster diharapkan memiliki kemiripan yang tinggi antara satu sama lain, sedangkan observasi yang termasuk dalam cluster yang berbeda seharusnya memiliki perbedaan karakteristik yang signifikan. Sebelum masuk menggunakan k-means, terlebih dahulu kita akan memilih k-optimum.
Dalam menentukan k-optimum kita akan menggunakan elbow method. Elbow Plot merupakan plot antara banyak klaster dengan total dari simpangan/variasi per kluster (total WSS).
fviz_nbclust(
x = spotify_scale, #data untuk clustering
FUNcluster = kmeans, #algoritma kmeans
method = "wss" #berdasarkan wss
)
Pada tahap pemilihan nilai k untuk analisis clustering, kita ingin
mencari nilai k yang tepat di mana penurunan total within sum of squares
tidak lagi menurun secara drastis dan cenderung melandai. Nilai k ini
dapat dianggap sebagai nilai k optimum yang paling cocok untuk data
whisky.
Setelah melakukan analisis, nilai k optimum yang dipilih untuk data whisky adalah 6. Ini berarti bahwa lagu-lagu dalam dataset Spotify telah dikelompokkan menjadi 6 kluster berdasarkan fitur-fitur audio yang relevan.
K-means adalah salah satu algoritma centroid-based dalam proses clustering, yang bertujuan untuk membentuk kelompok data dengan masing-masing kelompok memiliki satu titik pusat yang disebut centroid yang merepresentasikan kelompok tersebut. Proses K-means terdiri dari beberapa langkah berulang yang dimulai dengan random initialization, yaitu penempatan awal \(k\) centroid secara acak. Setelah itu, langkah berikutnya adalah cluster assignment, di mana setiap observasi atau data diatribusikan ke cluster terdekat berdasarkan perhitungan jarak terhadap centroid. Kemudian, dilakukan centroid update dengan menggeser posisi centroid ke rata-rata (means) dari kelompok yang terbentuk. Proses cluster assignment dan centroid update diulangi secara berulang sampai tidak ada lagi perubahan kluster untuk observasi tertentu, yang menunjukkan konvergensi algoritma. K-means merupakan algoritma yang efisien dan sering digunakan dalam berbagai aplikasi, namun, keberhasilan algoritma ini sangat tergantung pada inisialisasi yang baik dan dapat menghasilkan hasil yang berbeda-beda tergantung pada kondisi awalnya. Oleh karena itu, ada juga variasi K-means yang mencoba mengatasi masalah inisialisasi ini.
RNGkind(sample.kind = "Rounding")
set.seed(50)
# k-means dengan k optimum
spotify_cluster <- kmeans(spotify_scale,centers =6)Lalu kita menerapkan algoritma K-means pada data spotify_scale dengan menggunakan 5 centroid sebagai jumlah kluster yang diinginkan. Hasil dari proses K-means akan disimpan dalam variabel spotify_cluster, yang akan berisi informasi tentang kluster yang terbentuk serta posisi centroid dari masing-masing kluster.
Kebaikan hasil clustering dapat dilihat dari 3 nilai:
$withinss): jumlah jarak kuadrat
dari tiap observasi ke centroid tiap cluster.$betweenss): jumlah jarak
kuadrat terbobot dari tiap centroid ke rata-rata global. Dibobotkan
berdasarkan banyaknya observasi pada cluster.$totss): jumlah jarak kuadrat
dari tiap observasi ke rata-rata global.#> [1] 1874.5776 428.6005 2352.8999 2820.8990 1009.3006 1579.4212
#> [1] 10065.7
#> [1] 9924.301
#> [1] 19990
#> [1] 0.4964633
Dari hasil diatas, nilai proporsi sebesar 0.48 (atau 48%) menunjukkan bahwa model K-means telah berhasil menjelaskan sekitar 48% variasi dalam data berdasarkan kluster yang dibentuk. Hal ini menandakan bahwa pengelompokan yang dilakukan oleh algoritma K-means cukup baik dalam menggambarkan pola-pola atau kelompok-kelompok yang ada dalam data Spotify.
Membuat kolom baru yang berisikan informasi label dari cluster yang terbentuk menggunakan k optimum
Grouping data based on cluster label
Melakukan grouping berdasarkan cluster yang terbentuk, untuk mengetahui karakteristik dari masing-masing cluster
# melakukan profiling cluster dari data asli (supaya nantinya jika ketemu dengan perlu data yg perlu discaling sebelum kmeans nya , interpretasinya tidak salah)
spotify_centroid <- spotify_num %>%
group_by(cluster) %>%
summarise_all(mean)
spotify_centroidUntuk mempermudah profiling: tabel yang menampilkan cluster dengan nilai terendah dan tertinggi untuk masing-masing karakteristik fitur audio spotify.
library(tidyr)
spotify_centroid %>%
pivot_longer(-cluster) %>%
group_by(name) %>%
summarize(
kelompok_min = which.min(value),
kelompok_max = which.max(value))💡 Profiling tiap cluster :
Berikut adalah label untuk setiap cluster berdasarkan hasil analisis K-means pada data Spotify:
Cluster 1 : - Paling tinggi di fitur audio : popularity - Paling rendah di fitur audio : acousticness, danceability, energy, instrumentalness, liveness, loudness, speechiness, tempo, duration_ms - Label : “Highly Popular Tracks”
Cluster 2 : - Paling tinggi di fitur audio : speechiness, liveness - Paling rendah di fitur audio : duration_ms, instrumentalness, tempo, acousticness - Label : “Live or Spoken Word Tracks”
Cluster 3 : - Paling tinggi di fitur audio : instrumentalness - Paling rendah di fitur audio : danceability, energy, liveness, loudness, speechiness, acousticness - Label : “Instrumental Tracks”
Cluster 4 : - Paling tinggi di fitur audio : acousticness - Paling rendah di fitur audio : popularity, energy, danceability, instrumentalness, liveness, loudness, speechiness, tempo, duration_ms - Label : “Acoustic and Mellow Tracks”
Cluster 5 : - Paling tinggi di fitur audio : duration_ms, energy, loudness, tempo - Paling rendah di fitur audio : acousticness, popularity, danceability, instrumentalness, liveness, speechiness - Label : “Energetic and Upbeat Tracks”
Cluster 6 : - Paling tinggi di fitur audio : danceability - Paling rendah di fitur audio : acousticness, energy, instrumentalness, liveness, loudness, speechiness, tempo, duration_ms, popularity - Label : “Danceable Tracks”
Untuk mempermudah profiling: radar plot
Plot radat (radar plot) adalah jenis grafik yang digunakan untuk memvisualisasikan variasi nilai dari beberapa variabel atau atribut pada data dalam bentuk poligon dengan sumbu radial. Setiap sumbu mewakili satu atribut, dan jarak dari pusat poligon ke titik di setiap sumbu mencerminkan nilai atribut tersebut.
# install.packages("ggiraphExtra")
library(ggiraphExtra)
ggRadar(data=spotify_num,
aes(colour=cluster),
interactive=TRUE)Interpretasi hasil sebelumnya (hasil K-means) berdasarkan plot radat ini dapat memberikan wawasan tentang karakteristik audio dari masing-masing kluster. Pada plot radat ini, kita dapat melihat seberapa tinggi atau rendah nilai atribut pada masing-masing kluster.
Misalnya, jika pada plot radat, kluster 1 menunjukkan poligon yang tinggi pada atribut “popularity”, tetapi rendah pada atribut “acousticness” dan “danceability”, ini menunjukkan bahwa kluster tersebut memiliki lagu-lagu yang sangat populer, namun cenderung tidak akustik dan kurang cocok untuk menari.
Principal Component Analysis (PCA) adalah suatu metode dalam analisis multivariat yang bertujuan untuk mengurangi dimensi dari suatu dataset dengan tetap mempertahankan sebanyak mungkin informasi yang terkandung dalam variabel-variabel awal. Ide dasar dari PCA adalah mencari sumbu baru yang disebut Principal Component (PC) yang dapat menjelaskan sebanyak mungkin varians dari data asli. Dengan menggunakan beberapa PC yang memiliki varians yang tinggi, kita dapat merangkum informasi yang signifikan dari data awal tanpa harus menggunakan seluruh variabelnya.
#> Importance of components:
#> PC1 PC2 PC3 PC4 PC5 PC6 PC7
#> Standard deviation 1.8018 1.2996 1.0588 1.0043 0.86521 0.83481 0.79260
#> Proportion of Variance 0.3247 0.1689 0.1121 0.1009 0.07486 0.06969 0.06282
#> Cumulative Proportion 0.3247 0.4935 0.6057 0.7065 0.78138 0.85107 0.91389
#> PC8 PC9 PC10
#> Standard deviation 0.66419 0.52891 0.37442
#> Proportion of Variance 0.04412 0.02797 0.01402
#> Cumulative Proportion 0.95801 0.98598 1.00000
Setelah menerapkan PCA dan mereduksi dimensi dari dataset yang awalnya memiliki 10 dimensi, kita memutuskan untuk mempertahankan 92% informasi dari data tersebut. Untuk mencapai tujuan ini, kami memilih untuk menggunakan PC1 hingga PC7, yang dapat dilihat dari hasil Cumulative Proportion pada analisis PCA. Dengan menggunakan 7 principal component ini, kami yakin bahwa kami masih dapat mempertahankan sebagian besar informasi yang relevan dalam data asli, sambil mengurangi jumlah dimensi sehingga memudahkan dalam analisis dan interpretasi data. Pemilihan 7 principal component ini akan membantu kami dalam mengidentifikasi pola dan hubungan penting dalam dataset, serta mengurangi kompleksitas data tanpa mengorbankan informasi yang signifikan.
Observasi berdekatan: observasi yang saling berdekatan memiliki karakteristik yang mirip.
Outlier detection: observasi yang jauh dari gerombolan data mengindikasikan outlier dari keseluruhan data.
Observasi searah panah mengindikasikan observasi tersebut nilainya tinggi pada variabel tersebut. Bila bertolak belakang, maka nilainya rendah pada variable tersebut
# subset 100 data pertama agar tidak terlalu menumpuk
prop_small <- spotify_scale %>% head(100)
# melakukan PCA
pca_small <- prcomp(prop_small, scale = T)
# membuat biplot
biplot(x = pca_small,
cex = 0.6,
scale = FALSE)
Dalam analisis biplot, beberapa hal dapat diamati untuk memberikan
wawasan lebih lanjut tentang data yang direduksi menggunakan PCA.
Observasi berdekatan: Berdasarkan biplot, kita dapat melihat bahwa beberapa observasi berdekatan dalam grafik, menunjukkan bahwa observasi-observasi tersebut memiliki karakteristik yang mirip. Sebagai contoh, observasi dengan indeks 224995, 10404, 176826, dan 84837 terlihat berdekatan dalam grafik, menunjukkan bahwa lagu-lagu ini memiliki atribut dan fitur audio yang serupa.
Outlier detection: Biplot juga membantu dalam mendeteksi adanya outliers atau data yang jauh dari gerombolan data utama. Dalam grafik, terdapat beberapa observasi seperti 126471, 122302, 125155, dan 168639 yang berada jauh dari kluster data lainnya. Hal ini mengindikasikan bahwa lagu-lagu dengan indeks tersebut memiliki atribut audio yang sangat berbeda dari mayoritas lagu dalam dataset.
Observasi searah panah: Pada biplot, arah panah menunjukkan bagaimana observasi berkontribusi terhadap variabel-variabel yang ada. Jika suatu observasi menunjuk ke arah variabel tertentu, itu berarti nilai observasi tersebut tinggi pada variabel tersebut. Sebaliknya, jika observasi menunjuk ke arah yang berlawanan dengan variabel, itu menandakan nilai observasi rendah pada variabel tersebut. Sebagai contoh, observasi dengan indeks 14309 dan 101854 menunjuk ke arah variabel danceability, yang berarti lagu-lagu tersebut memiliki nilai tinggi pada atribut danceability.
Dengan menganalisis biplot, kita dapat lebih memahami hubungan antara variabel-variabel dan observasi dalam dataset yang telah direduksi dimensinya menggunakan PCA. Informasi ini sangat berharga dalam memahami pola data, mengidentifikasi outlier, dan menggambarkan karakteristik khusus dari lagu-lagu yang ada dalam data Spotify.
Loading score: panah merah yang menunjukkan kontribusi variabel tersebut terhadap PC, atau banyaknya informasi variabel tersebut yang dirangkum oleh PC.
# install.packages("factoextra")
library(factoextra)
fviz_contrib(
X = pca_small, #objek pca
choice = "var",
axes = 2 #PC1 atau PC2
)Dari hasil analisis di atas, kita dapat mengetahui bahwa variabel-variabel yang paling berkontribusi terhadap pembentukan Principal Component 1 (PC1) adalah loudness, energy, acousticness, dan instrumentalness. Variabel-variabel ini memiliki panah merah yang panjang dan menunjuk ke arah yang dominan pada PC1. Hal ini menandakan bahwa atribut-atribut tersebut memiliki pengaruh besar dalam menentukan variasi dan pola data pada sumbu PC1.
Sementara itu, untuk Principal Component 2 (PC2), variabel-variabel yang paling berkontribusi adalah speechiness, duration_ms, dan danceability. Variabel-variabel ini juga memiliki panah merah yang panjang dan menunjuk ke arah yang dominan pada PC2, menandakan bahwa atribut-atribut tersebut memiliki pengaruh besar dalam membentuk variasi dan pola data pada sumbu PC2.
💡 Panah yang berhimpit pada biplot: (korelasi tinggi positif)
💡 Panah yang (hampir) tegak lurus: (hampir tidak punya korelasi)
💡 Panah yang bertolak belakang (korelasi negatif)
PCA dapat diintegrasikan dengan hasil K-means Clustering untuk membantu memvisualisasikan data dalam dimensi yang lebih rendah dari fitur aslinya
Kesimpulan dari hasil proyek di atas adalah sebagai berikut:
Melalui analisis clustering menggunakan metode k-means, lagu-lagu dalam dataset Spotify berhasil dikelompokkan menjadi enam kluster berdasarkan karakteristik dan fitur audio tertentu. Setiap kluster memiliki ciri khasnya sendiri, seperti “Highly Popular Tracks”, “Live or Spoken Word Tracks”, “Instrumental Tracks”, “Acoustic and Mellow Tracks”, “Energetic and Upbeat Tracks”, dan “Danceable Tracks”.
Integrasi metode Principal Component Analysis (PCA) dengan k-means Clustering membantu mereduksi dimensi data Spotify dan memvisualisasikan data dalam bentuk biplot. Dengan menggunakan 7 principal components, kita dapat mempertahankan 92% informasi dari data asli. Analisis biplot membantu memahami hubungan antara variabel-variabel dan observasi dalam data yang telah direduksi.
Dari analisis biplot, dapat diamati bahwa variabel loudness, energy, acousticness, dan instrumentalness berkontribusi besar terhadap pembentukan Principal Component 1 (PC1), sedangkan variabel speechiness, duration_ms, dan danceability berkontribusi besar pada Principal Component 2 (PC2). Selain itu, dapat diidentifikasi korelasi antar variabel berdasarkan sudut antar panah pada biplot.
Hasil analisis ini memberikan wawasan berharga bagi para musisi dan industri musik dalam menciptakan lagu-lagu yang lebih menarik dan populer di platform Spotify. Dengan pemahaman karakteristik utama dari setiap kluster dan pengaruh fitur audio terhadap popularitas, musisi dapat mengarahkan strategi penciptaan musik yang lebih tepat sasaran untuk menarik minat pendengar.
Dengan demikian, proyek ini memberikan kontribusi penting dalam analisis data musik di platform Spotify, serta membuka potensi untuk penggunaan analisis clustering dan PCA dalam memahami lebih dalam pola-pola musik dan preferensi pendengar di dunia industri musik.