1 Introduction

1.1 Spotify

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.

1.2 Library

Berikut ini adalah library yang akan digunakan untuk melakukan analisis clustering menggunakan k-means :

# wrangling and EDA
library(tidyverse)
library(tidyquant)
library(lubridate)

# Visualization
library(ggthemes)
library(scales)

#clustering
library(factoextra)
library(FactoMineR)
library(dbscan) # DBSCAN
library(cluster) #K-Medoid

1.3 Read Data

Sebelum memulai proses clustering, langkah pertama adalah membaca data menggunakan fungsi read.csv dan kemudian menampilkan enam data teratas dengan menggunakan head().

spotify  <-  read.csv("SpotifyFeatures.csv")
dim(spotify)
#> [1] 232725     18
head(spotify)

1.4 Metadata

glimpse(spotify)
#> 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:

  1. genre: Genre dari lagu dalam bentuk teks (chr).
  2. artist_name: Nama artis yang membuat lagu dalam bentuk teks (chr).
  3. track_name: Nama lagu dalam bentuk teks (chr).
  4. track_id: ID unik yang mengidentifikasi lagu dalam bentuk teks (chr).
  5. popularity: Tingkat popularitas lagu dalam bentuk angka (int).
  6. acousticness: Ukuran tingkat akustik dari lagu dalam bentuk angka (dbl).
  7. danceability: Ukuran tingkat kesesuaian untuk menari dari lagu dalam bentuk angka (dbl).
  8. duration_ms: Durasi lagu dalam milidetik dalam bentuk angka (int).
  9. energy: Ukuran tingkat energi lagu dalam bentuk angka (dbl).
  10. instrumentalness: Ukuran tingkat instrumental dari lagu dalam bentuk angka (dbl).
  11. key: Kunci musik lagu dalam bentuk teks (chr).
  12. liveness: Ukuran tingkat kesan pertunjukan langsung dari lagu dalam bentuk angka (dbl).
  13. loudness: Ukuran tingkat volume lagu dalam bentuk angka (dbl).
  14. mode: Kategori apakah lagu berada di mode mayor atau minor dalam bentuk teks (chr).
  15. speechiness: Ukuran tingkat ucapan dalam lagu dalam bentuk angka (dbl).
  16. tempo: Tempo atau kecepatan lagu dalam bentuk angka (dbl).
  17. time_signature: Tanda waktu lagu dalam bentuk teks (chr).
  18. 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.

1.5 Data Cleansing

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 factor
  • key tipe data chart menjadi factor
  • mode tipe data chart menjadi factor
  • valence tipe data chart menjadi factor

Selain 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.

2000/232725
#> [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

2 Exploratory Data Analysis & Scaling

Pada tahap ini, pertama kita akan melihat apakah terdapat missing value atau tidak.

colSums(is.na(spotify_sample))
#>            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.

summary(spotify_sample)
#>               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.

2.1 Correlation between Feature

library(GGally)
ggcorr(spotify_scale, low = "navy", high = "darkred", label = TRUE)

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.

3 Clustering

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.

3.1 Optimum K Selection

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.

3.2 K-means

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.

3.3 Goodnes of Fit

Kebaikan hasil clustering dapat dilihat dari 3 nilai:

  1. Within Sum of Squares ($withinss): jumlah jarak kuadrat dari tiap observasi ke centroid tiap cluster.
  2. Between Sum of Squares ($betweenss): jumlah jarak kuadrat terbobot dari tiap centroid ke rata-rata global. Dibobotkan berdasarkan banyaknya observasi pada cluster.
  3. Total Sum of Squares ($totss): jumlah jarak kuadrat dari tiap observasi ke rata-rata global.
# cek nilai wss
spotify_cluster$withinss
#> [1] 1874.5776  428.6005 2352.8999 2820.8990 1009.3006 1579.4212
spotify_cluster$tot.withinss
#> [1] 10065.7
spotify_cluster$betweenss
#> [1] 9924.301
spotify_cluster$totss
#> [1] 19990
spotify_cluster$betweenss/spotify_cluster$totss
#> [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.

3.4 Interpretation: Cluster Profiling

Membuat kolom baru yang berisikan informasi label dari cluster yang terbentuk menggunakan k optimum

spotify_num$cluster <- as.factor(spotify_cluster$cluster)
head(spotify_num)

Grouping data based on cluster label

Melakukan grouping berdasarkan cluster yang terbentuk, untuk mengetahui karakteristik dari masing-masing cluster

as.data.frame(spotify_cluster$centers)
# 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_centroid

Untuk 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.

4 PCA

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.

pca <- prcomp(spotify_scale)
summary(pca)
#> 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
plot(pca)

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.

# mengambil PC hasil dimensionality reduction
pc_keep <- as.data.frame(pca$x[,1:7])
pc_keep

5 Visualizing PCA

5.1 Biplot

  1. Observasi berdekatan: observasi yang saling berdekatan memiliki karakteristik yang mirip.

  2. Outlier detection: observasi yang jauh dari gerombolan data mengindikasikan outlier dari keseluruhan data.

  3. 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.

  1. 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.

  2. 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.

  3. 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.

5.1.1 Variable

  1. Variable Contribution dapat dilihat dari arah dan panjang panah

Loading score: panah merah yang menunjukkan kontribusi variabel tersebut terhadap PC, atau banyaknya informasi variabel tersebut yang dirangkum oleh PC.

#Cek Variable Factor Map pada biplot
biplot(x = pca_small,
       cex = 0.6,
       scale = FALSE)

# 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.

  1. Korelasi antar variabel dapat dilihat dari sudut antar panah
  • Panah saling berdekatan (sudut antar panah mendekati 0 derajat), maka korelasi tinggi positif
  • Panah saling tegak lurus (sudut antar panah = 90 derajat), maka tidak berkorelasi
  • Panah saling bertolak belakang (sudut antar panah mendekati 180 derajat), maka korelasi negatif

💡 Panah yang berhimpit pada biplot: (korelasi tinggi positif)

  • speechiness x danceability
  • energy x loudness

💡 Panah yang (hampir) tegak lurus: (hampir tidak punya korelasi)

  • energy x danceability
  • loudness x speechiness

💡 Panah yang bertolak belakang (korelasi negatif)

  • acousticness x energy
  • acousticness x loudness

6 Clustering with PCA

PCA dapat diintegrasikan dengan hasil K-means Clustering untuk membantu memvisualisasikan data dalam dimensi yang lebih rendah dari fitur aslinya

fviz_cluster(object = spotify_cluster, data = spotify_scale, labelsize = 0) + theme_minimal()

7 Kesimpulan

Kesimpulan dari hasil proyek di atas adalah sebagai berikut:

  1. 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”.

  2. 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.

  3. 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.

  4. 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.