1 Intro

1.1 Background

Apa itu spotify? Spotify adalah layanan streaming musik, podcast, dan video digital yang memberi Anda akses ke jutaan lagu dan konten lainnya dari artis di seluruh dunia. Baru-baru ini spotify adalah salah satu layanan musik dan podcast digital terbesar di dunia.

Spotify jelas merupakan salah satu perusahaan teknologi yang memiliki teknologi yang sangat maju. Salah satu contohnya adalah, setiap track lagu yang diunggah ke platform akan diidentifikasi. Kita bisa mendapatkan informasi fitur audio untuk setiap lagu, dan aksesnya sangat mudah kita bisa menggunakan ini Api link. Dalam hal ini kami akan menggunakan dataset spotify dari API dari kaggle ini kaggle.

Kami akan mencoba menganalisis popularitas untuk setiap lagu yang kami dapatkan, berdasarkan data kami akan mencoba untuk menemukan ada hubungan dari popularitas dengan fitur atau variabel lain. Kami juga akan mencoba melakukan analisis clustering menggunakan metode K-means dan yang pasti kami akan menemukan percobaan pengurangan dimensi menggunakan Principle Component Analysis (PCA)

1.2 Dataset

Kami akan menggunakan dataset yang kami dapatkan dari kaggle, dapat mengunduh dari alamat ini source)

1.3 Intial Setup and Library

library(tidyverse)
library(glue)
library(lubridate)
library(factoextra)
library(FactoMineR)
library(ggplot2)
library(viridis)
library(GGally)
library(scales)

2 Import Data

Dataset yang kami unduh dari kaggle, kami akan mengimpor dataset. Dataset ini berisi fitur audio dari sebuah track.

tracks <- read_csv("data/SpotifyFeatures.csv")

Amati struktur dan lihat dataset yang digunkanan

glimpse(tracks)
## 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       <dbl> 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      <dbl> 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.00e+00, 0.00e+00, 0.00e+00, 0.00e+00, 1.23e-01, 0.0~
## $ 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~

Variable Explanation:
1. genre : Track genre
2. artist_name : Artist name
3. track_name : Title of track
4. track_id : The Spotify ID for the track.
5. popularity : Popularity rate (1-100)
6. acousticness : A confidence measure from 0.0 to 1.0 of whether the track is acoustic. 1.0 represents high confidence the track is acoustic.
7. danceability : Danceability describes how suitable a track is for dancing based on a combination of musical elements including tempo, rhythm stability, beat strength, and overall regularity. A value of 0.0 is least danceable and 1.0.
8. duration_ms : The duration of the track in milliseconds.
9. energy : Energy is a measure from 0.0 to 1.0 and represents a perceptual measure of intensity and activity. Typically, energetic tracks feel fast, loud, and noisy. For example, death metal has high energy, while a Bach prelude scores low on the scale.
10. instrumentalness : Predicts whether a track contains no vocals. “Ooh” and “aah” sounds are treated as instrumental in this context. Rap or spoken word tracks are clearly “vocal”. The closer the instrumentalness value is to 1.0, the greater likelihood the track contains no vocal content. Values above 0.5 are intended to represent instrumental tracks, but confidence is higher as the value approaches 1.0.
11. key : The estimated overall key of the track. Integers map to pitches using standard Pitch Class notation . E.g. 0 = C, 1 = C♯/D♭, 2 = D, and so on. If no key was detected, the value is -1.
12. liveness : Detects the presence of an audience in the recording. Higher liveness values represent an increased probability that the track was performed live. A value above 0.8 provides strong likelihood that the track is live.
13. loudness : The overall loudness of a track in decibels (dB). Loudness values are averaged across the entire track and are useful for comparing relative loudness of tracks.
14. mode : Mode indicates the modality (major or minor) of a track, the type of scale from which its melodic content is derived. Major is represented by 1 and minor is 0.
15. speechiness : Speechiness detects the presence of spoken words in a track. The more exclusively speech-like the recording (e.g. talk show, audio book, poetry), the closer to 1.0 the attribute value. Values above 0.66 describe tracks that are probably made entirely of spoken words. Values between 0.33 and 0.66 describe tracks that may contain both music and speech, either in sections or layered, including such cases as rap music. Values below 0.33 most likely represent music and other non-speech-like tracks.
16, tempo : The overall estimated tempo of a track in beats per minute (BPM). In musical terminology, tempo is the speed or pace of a given piece and derives directly from the average beat duration.
17. time_signature : An estimated overall time signature of a track. The time signature (meter) is a notational convention to specify how many beats are in each bar (or measure).
18. valence : A measure from 0.0 to 1.0 describing the musical positiveness conveyed by a track. Tracks with high valence sound more positive (e.g. happy, cheerful, euphoric), while tracks with low valence sound more negative (e.g. sad, depressed, angry).

3 Data Wrangling

Pertama-tama, kami akan memeriksa NA atau nilai Kosong dari setiap variabel, Tidak ditemukan NA di dalam data.

colSums(is.na(tracks))
##            genre      artist_name       track_name         track_id 
##                0                0                0                0 
##       popularity     acousticness     danceability      duration_ms 
##                0                0                0                0 
##           energy instrumentalness              key         liveness 
##                0                0                0                0 
##         loudness             mode      speechiness            tempo 
##                0                0                0                0 
##   time_signature          valence 
##                0                0

Beberapa variabel memiliki tipe data yang salah, kita perlu mengubah tipe datanya:

  • genre : to factor
  • key : to factor
  • genre : to factor
  • mode: to factor
tracks <- tracks  %>% 
                  mutate(genre = as.factor(genre),
                  key = as.factor(key),
                  genre = as.factor(str_replace_all(genre, "[[:punct:]]", "")),
                  mode = as.factor(mode))

Drop variable yang tidak sesuai dengan kasus. Dalam hal ini memprioritaskan variabel dengan tipe data numerik. Berdasarkan ringkasan kami akan menghapus track id, time_signature, track_name.

summary(tracks)
##              genre        artist_name         track_name       
##  Childrens Music: 14756   Length:232725      Length:232725     
##  Comedy         :  9681   Class :character   Class :character  
##  Soundtrack     :  9646   Mode  :character   Mode  :character  
##  Indie          :  9543                                        
##  Jazz           :  9441                                        
##  Pop            :  9386                                        
##  (Other)        :170272                                        
##    track_id           popularity      acousticness     danceability   
##  Length:232725      Min.   :  0.00   Min.   :0.0000   Min.   :0.0569  
##  Class :character   1st Qu.: 29.00   1st Qu.:0.0376   1st Qu.:0.4350  
##  Mode  :character   Median : 43.00   Median :0.2320   Median :0.5710  
##                     Mean   : 41.13   Mean   :0.3686   Mean   :0.5544  
##                     3rd Qu.: 55.00   3rd Qu.:0.7220   3rd Qu.:0.6920  
##                     Max.   :100.00   Max.   :0.9960   Max.   :0.9890  
##                                                                       
##   duration_ms          energy         instrumentalness         key       
##  Min.   :  15387   Min.   :2.03e-05   Min.   :0.0000000   C      :27583  
##  1st Qu.: 182857   1st Qu.:3.85e-01   1st Qu.:0.0000000   G      :26390  
##  Median : 220427   Median :6.05e-01   Median :0.0000443   D      :24077  
##  Mean   : 235122   Mean   :5.71e-01   Mean   :0.1483012   C#     :23201  
##  3rd Qu.: 265768   3rd Qu.:7.87e-01   3rd Qu.:0.0358000   A      :22671  
##  Max.   :5552917   Max.   :9.99e-01   Max.   :0.9990000   F      :20279  
##                                                           (Other):88524  
##     liveness          loudness          mode         speechiness    
##  Min.   :0.00967   Min.   :-52.457   Major:151744   Min.   :0.0222  
##  1st Qu.:0.09740   1st Qu.:-11.771   Minor: 80981   1st Qu.:0.0367  
##  Median :0.12800   Median : -7.762                  Median :0.0501  
##  Mean   :0.21501   Mean   : -9.570                  Mean   :0.1208  
##  3rd Qu.:0.26400   3rd Qu.: -5.501                  3rd Qu.:0.1050  
##  Max.   :1.00000   Max.   :  3.744                  Max.   :0.9670  
##                                                                     
##      tempo        time_signature        valence      
##  Min.   : 30.38   Length:232725      Min.   :0.0000  
##  1st Qu.: 92.96   Class :character   1st Qu.:0.2370  
##  Median :115.78   Mode  :character   Median :0.4440  
##  Mean   :117.67                      Mean   :0.4549  
##  3rd Qu.:139.05                      3rd Qu.:0.6600  
##  Max.   :242.90                      Max.   :1.0000  
## 
tracks <- tracks %>% select(-c(track_id,time_signature,track_name))

4 Exploratory Data Analysis

From dataset we get, we found we have genre whish it we can group our data base on it. To make us focus on popularity variable, we would select 5 highest average genre. It can inteprate the genre have big distribution from low to highest popularity. We will visualize data:

Dari dataset yang kami dapatkan, kami menemukan bahwa genre dapat kami kelompokkan berdasarkan basis data yang dimiliki. Untuk membuat fokus pada variabel popularitas, kami akan memilih 5 genre rata-rata tertinggi. Itu dapat menembus genre yang memiliki distribusi besar dari popularitas rendah hingga tertinggi. Visualization data nya sebagai berikut :

genre_popularity <- tracks %>% select(popularity, genre) %>% group_by(genre) %>% summarise("average_popularity" = round(mean(popularity)))

ggplot(data=genre_popularity, mapping = aes(x = reorder(genre,average_popularity), y = average_popularity, fill = genre)) +
  geom_col() +
  coord_flip() +
  theme_minimal() +
  theme(
    legend.position = "none",
    
  ) +
  labs(
    y = "Average popularity",
    x = "Genre"
  )

Top 5 Genre dengan rata-rata popularitas tertinggi adalah Pop, Rap, Rock, HipHop dan Dance. Kami memfilter dataset dan hanya memilih 5 genre ini.

# Filter
tracks <- tracks %>% filter(genre == "Pop" | genre == "Rap" | genre == "Rock" | genre == "HipHop" | genre == "Dance")

# Total row
NROW(tracks)
## [1] 45886

Kami telah menyaring data, kami dapat memeriksa distribusi popularitas data baru. Kami menemukan distribusi popularitas mengalami lonjakan di tengah popularitas sekitar 50.

hist(tracks$popularity)

4.1 Clustering Opportunity

Sebelum kita menggunakan k-mean sebagai metode untuk clustering, kita bisa menggunakan cara sederhana untuk melakukan clustering beberapa variabel faktor dengan variabel popularitas. Di sini kami mencoba untuk memvisualisasikan boxplot popularity dengan key dan genre.

tracks %>% 
  ggplot(aes(x = key, y = popularity, fill = key)) +
  geom_boxplot() +
  scale_fill_viridis(discrete = TRUE, alpha=0.6) +
  theme_minimal()

tracks %>% 
  ggplot(aes(x = genre, y = popularity, fill = genre)) +
  geom_boxplot() +
  scale_fill_viridis(discrete = TRUE, alpha=0.6) +
  theme_minimal()

Dari kedua bilah tersebut, kita dapat melihat secara umum genre dan key tidak memiliki hubungan yang signifikan dengan popularitas. Meski begitu, terdapat perbedaan plot popluaritu dan genre ketika track secara keseluruhan menggunakan Key A# popularitasnya sedikit lebih tinggi dan lebih stabil popularitasnya dibanding yang lain.

Hal lain, kami menemukan bahwa genre Pop memiliki popluaritas yang lebih stabil daripada 4 genre lainnya. Jadi kami dapat mempertimbangkan pendapat, jika produser ingin mendapatkan popularitas lebih di platform spotify, kami dapat membuat trek lagu dengan genre Pop dan kunci keseluruhan trek menggunakan kunci A#.

Kami hanya memvisualisasikan genre dan key sebelumnya, dan kami menemukan setiap korelasi dengan popularitas meskipun, tidak dapat secara signifikan variabel mana yang dapat meningkatkan popularitas secara signifikan. Jadi kami akan mencoba memvisualisasikan variabel numerik lainnya untuk melihat korelasi di antara mereka.

ggcorr(tracks, low = "blue", high = "red")
## Warning in ggcorr(tracks, low = "blue", high = "red"): data in column(s)
## 'genre', 'artist_name', 'key', 'mode' are not numeric and were ignored

Ini menunjukkan popularitas tidak memiliki korelasi yang kuat dengan variabel numerik lainnya. Namun kami menemukan beberapa variabel memiliki kekuatan satu sama lain, hal ini menunjukkan bahwa dataset ini memiliki multikolinearitas dan mungkin tidak cocok untuk berbagai algoritma klasifikasi.

Untuk menemukan pola yang lebih menarik dan belum ditemukan dalam data, kita akan menggunakan metode clustering menggunakan K-means. Kami akan menggunakan Principal Component Analysis (PCA) yang dapat dilakukan untuk data ini untuk menghasilkan data non-multikolinearitas, sekaligus mengurangi dimensi data dan menyimpan informasi sebanyak mungkin. Hasil analisis ini dapat dimanfaatkan lebih lanjut untuk tujuan klasifikasi dengan komputasi yang lebih rendah.

5 Data Pre-processing

Karena kita akan mengimplementasikan metode K-means dan menggunakan PCA, maka perlu dilakukan pre-processing data. Kami tidak mengambil semua data, kami akan melakukan sampling dari data. Jadi saya mengambil sekitar 5% dari data.

set.seed(100)
tracks_sample <- sample_n(tracks, (nrow(tracks) * 0.05))
NROW(tracks_sample)
## [1] 2294

Setelah melakukan sampling kami memeriksa distribusi popularitas. Kami mendapatkan distribusi frekuensi popularitas kami masih memiliki pola yang sama sebelum kami mengambil sampel.

hist(tracks_sample$popularity)

Langkah selanjutnya, kita akan melakukan penskalaan fitur. Penskalaan fitur adalah metode yang digunakan untuk membakukan rentang variabel independen atau fitur data. Dalam pemrosesan data, ini juga dikenal sebagai normalisasi data dan umumnya dilakukan selama langkah pra-pemrosesan data. Normalisasi digunakan ketika kita ingin mengikat nilai kita antara dua angka, biasanya, antara [0,1] atau [-1,1]. Jadi kita hanya membutuhkan variabel numerik untuk melakukan penskalaan fitur.

tracks_num <- tracks_sample %>% select(-c(genre,artist_name,key,mode))
str(tracks_num)
## tibble[,11] [2,294 x 11] (S3: tbl_df/tbl/data.frame)
##  $ popularity      : num [1:2294] 48 55 50 65 67 82 67 62 52 66 ...
##  $ acousticness    : num [1:2294] 0.263 0.0409 0.109 0.000491 0.039 0.0776 0.00118 0.154 0.00487 0.73 ...
##  $ danceability    : num [1:2294] 0.629 0.621 0.438 0.522 0.673 0.643 0.528 0.699 0.542 0.425 ...
##  $ duration_ms     : num [1:2294] 227373 199113 197852 232067 229507 ...
##  $ energy          : num [1:2294] 0.787 0.827 0.792 0.751 0.758 0.904 0.858 0.668 0.714 0.406 ...
##  $ instrumentalness: num [1:2294] 0.00 0.00 0.00 2.22e-06 0.00 0.00 1.56e-06 3.20e-06 2.98e-01 3.59e-06 ...
##  $ liveness        : num [1:2294] 0.357 0.0815 0.241 0.158 0.341 0.189 0.282 0.362 0.334 0.107 ...
##  $ loudness        : num [1:2294] -5.62 -7.31 -6.88 -5.46 -3.63 ...
##  $ speechiness     : num [1:2294] 0.376 0.0454 0.346 0.0435 0.158 0.0739 0.0493 0.0336 0.028 0.176 ...
##  $ tempo           : num [1:2294] 85.7 100 175.9 139.5 136 ...
##  $ valence         : num [1:2294] 0.713 0.65 0.463 0.605 0.542 0.481 0.219 0.314 0.76 0.124 ...
tracks_scale <- scale(tracks_num)
head(tracks_scale)
##      popularity acousticness danceability duration_ms    energy
## [1,] -1.3144482    0.3159738 -0.103066412   0.0855727 0.7311049
## [2,] -0.5755485   -0.6849108 -0.156994529  -0.4137869 0.9617990
## [3,] -1.1033340   -0.3780209 -1.390600214  -0.4360690 0.7599417
## [4,]  0.4800225   -0.8670123 -0.824354981   0.1685166 0.5234803
## [5,]  0.6911367   -0.6934731  0.193538234   0.1232809 0.5638518
## [6,]  2.2744932   -0.5195237 -0.008692206  -0.4790606 1.4058849
##      instrumentalness     liveness    loudness speechiness      tempo
## [1,]       -0.2252330  1.162875416  0.39131252   2.0399495 -1.2071715
## [2,]       -0.2252330 -0.731538175 -0.22022169  -0.6602825 -0.7196655
## [3,]       -0.2252330  0.365227588 -0.06606864   1.7949194  1.8713091
## [4,]       -0.2252151 -0.205503185  0.45043474  -0.6758011  0.6297919
## [5,]       -0.2252330  1.052855026  1.11347420   0.2593973  0.5084701
## [6,]       -0.2252330  0.007661321  1.09098599  -0.4275039 -0.6155827
##          valence
## [1,]  1.00184410
## [2,]  0.72282618
## [3,] -0.10536990
## [4,]  0.52352766
## [5,]  0.24450973
## [6,] -0.02565049

6 Clustering

6.1 Find optimal number of Clusters

Kami akan mencoba mencari jumlah cluster yang optimal, dalam hal ini kami akan mencoba menggunakan 3 metode: Metode Elbow, Metode Sillhoute, dan statistik gap. Pada akhirnya setelah kita mendapatkan hasil dari 3 metode ini, kita akan memilih cluster yang optimal berdasarkan suara terbanyak.

6.1.1 Elbow Method

Metode Elbow terbaik didasarkan pada grafik, kami akan memilih “bend of an elbow”

fviz_nbclust(tracks_num, kmeans, method = "wss", k.max = 10) +
  scale_y_continuous(labels = number_format(scale = 10^(-9), big.mark = ",", suffix = " bil.")) +
  labs(subtitle = "Elbow method")

Kami menemukan 2 cluster cukup baik karena tidak ada penurunan yang signifikan dalam jumlah total kuadrat dalam cluster pada jumlah cluster yang lebih tinggi.

6.1.2 Sillhouette Method

Metode silhouette mengukur koefisien siluet, dengan menghitung rata-rata jarak intra-cluster dan rata-rata jarak cluster-terdekat untuk setiap pengamatan. Kami mendapatkan jumlah cluster yang optimal dengan memilih jumlah cluster dengan nilai silhouette tertinggi (puncak).

fviz_nbclust(tracks_num, kmeans, method = "silhouette", k.max = 10) 

Berdasarkan metode sillhouette, jumlah cluster dengan skor maksimum dan dianggap sebagai k-cluster optimum adalah 2

6.1.3 Gap Statistic

Statistik kesenjangan membandingkan total dalam variasi intra-cluster untuk nilai k yang berbeda dengan nilai yang diharapkan di bawah distribusi referensi nol dari data. Estimasi cluster yang optimal akan menjadi nilai yang memaksimalkan statistik gap.

fviz_nbclust(tracks_num, kmeans, "gap_stat", k.max = 10) + labs(subtitle = "Gap Statistic method")

Berdasarkan metode statistik gap, k optimal adalah 1

6.1.4 Majority Voting for Optimium K

Hasil dari 3 metode kami adalah metode Elbow k = 2, metode Sillhouette k = 2, dan Gap Statistic k = 1. Dua dari hasil metode kami adalah 2 kami pertimbangkan untuk menggunakan hasil ini, karena jika kami memilih k = 1, kami tidak dapat menganalisis perbedaan antar kelompok atau segmen.

6.2 K-Means Clustering

Di sini kami menerapkan K optimal dari proses kami sebelumnya, kami memutuskan menggunakan K = 2

set.seed(100)
km_tracks <-kmeans(tracks_scale, centers = 2)
km_tracks
## K-means clustering with 2 clusters of sizes 736, 1558
## 
## Cluster means:
##     popularity acousticness danceability duration_ms     energy
## 1  0.013047091    0.7995148  -0.13930852  0.12854175 -1.0607826
## 2 -0.006163453   -0.3776912   0.06580942 -0.06072319  0.5011143
##   instrumentalness   liveness   loudness speechiness      tempo    valence
## 1       0.19655118 -0.2476437 -0.9122186 -0.07286271 -0.2282781 -0.5674398
## 2      -0.09285088  0.1169870  0.4309325  0.03442038  0.1078387  0.2680588
## 
## Clustering vector:
##    [1] 2 2 2 2 2 2 2 2 2 1 1 2 1 1 2 2 2 2 2 2 2 1 2 1 1 1 2 2 1 1 1 2 2 2 1 2 1
##   [38] 1 1 2 2 1 1 2 2 2 2 1 1 1 1 1 1 2 2 2 2 2 2 1 1 1 2 2 2 2 2 1 2 1 2 2 2 2
##   [75] 2 1 2 2 2 2 1 1 2 2 2 2 2 1 1 2 2 1 2 2 2 1 2 1 2 1 1 1 2 1 1 2 1 2 1 1 1
##  [112] 2 1 2 2 2 1 1 2 1 2 2 2 2 2 2 2 2 2 2 1 2 2 1 2 2 1 1 1 2 1 2 2 1 1 2 1 2
##  [149] 1 2 2 2 1 1 2 1 1 2 2 1 2 1 2 1 2 2 2 1 1 1 2 2 2 1 2 2 2 2 1 2 1 2 2 2 2
##  [186] 2 2 2 2 2 2 2 1 1 2 2 2 1 2 2 2 2 1 2 1 2 2 2 2 2 1 2 1 2 1 2 2 2 2 2 1 2
##  [223] 1 2 1 1 2 2 2 2 2 2 2 2 2 1 2 2 1 2 2 1 1 2 1 1 2 2 2 2 1 2 1 1 1 2 1 2 1
##  [260] 2 1 2 2 2 1 2 1 2 2 2 2 1 2 2 1 1 1 2 1 2 2 2 2 2 1 1 1 2 1 1 1 1 2 2 2 2
##  [297] 1 1 2 2 1 1 2 2 2 2 1 1 2 2 1 1 2 2 2 2 2 2 2 1 2 2 2 2 1 2 1 2 1 2 2 2 2
##  [334] 1 2 2 2 2 1 2 2 2 2 2 2 2 1 2 1 2 2 2 2 2 2 2 2 2 1 2 2 2 2 2 2 2 1 2 2 1
##  [371] 1 1 2 2 2 2 1 1 2 1 2 2 1 2 2 2 2 2 1 1 1 2 2 2 1 2 2 1 2 2 2 2 2 2 1 1 1
##  [408] 2 2 1 1 2 2 1 2 2 2 2 1 2 2 1 2 1 2 1 2 1 2 1 2 1 2 2 2 2 2 2 2 2 2 2 1 1
##  [445] 1 2 1 2 2 1 2 1 2 1 2 2 2 2 1 1 2 2 2 1 2 1 1 1 2 2 2 1 2 1 1 1 1 2 1 2 2
##  [482] 2 1 1 2 2 2 2 1 1 2 1 2 2 2 1 2 2 2 2 2 1 1 2 2 2 2 2 1 2 2 2 1 1 1 2 2 1
##  [519] 2 2 1 2 1 2 2 2 2 2 2 1 2 1 1 1 2 1 1 2 1 2 2 2 2 1 2 2 2 1 2 1 2 1 1 2 1
##  [556] 2 1 2 1 2 2 1 2 1 2 1 2 1 2 2 1 2 1 2 1 1 2 2 2 2 2 1 1 2 1 2 2 2 1 2 1 1
##  [593] 1 2 1 2 2 2 1 1 2 2 2 1 2 1 2 2 2 2 1 1 2 2 2 2 2 2 2 2 2 1 2 1 2 1 2 1 1
##  [630] 2 1 2 2 2 1 2 1 2 2 2 2 1 1 1 2 2 1 2 2 2 2 1 2 2 2 2 2 2 2 1 2 2 1 2 2 2
##  [667] 2 2 2 2 1 2 1 2 1 2 1 1 1 2 2 1 2 2 2 2 1 2 2 2 1 2 2 2 2 2 2 2 1 2 2 2 1
##  [704] 2 2 2 2 2 2 1 2 2 2 2 2 1 2 2 2 2 2 2 1 1 1 1 2 1 2 2 1 2 1 2 2 2 2 2 2 2
##  [741] 2 1 2 1 2 1 2 2 2 2 1 2 1 2 2 2 1 2 1 2 1 2 2 2 1 2 2 1 2 1 1 2 2 2 2 2 2
##  [778] 1 2 1 1 1 1 2 2 2 2 2 2 1 2 2 2 2 2 1 2 2 2 2 2 2 1 2 2 2 2 1 2 1 2 2 2 1
##  [815] 1 2 1 1 2 1 2 2 2 1 2 2 1 1 1 2 2 1 2 2 1 2 2 2 2 1 2 2 2 1 2 2 1 2 1 2 2
##  [852] 2 2 1 2 2 1 1 1 2 1 2 2 2 2 2 2 2 2 2 1 2 2 1 1 2 2 2 2 2 2 2 2 1 2 2 1 1
##  [889] 2 1 2 2 2 2 1 2 2 2 2 2 1 2 2 1 2 1 1 1 1 2 2 2 1 2 2 2 2 2 2 2 2 1 1 2 1
##  [926] 1 1 2 1 2 1 2 2 1 2 2 2 2 1 2 2 1 2 1 2 2 2 2 1 2 2 2 2 2 2 1 2 2 1 2 2 1
##  [963] 2 2 2 1 2 2 2 2 1 1 2 2 2 1 2 1 2 2 2 1 2 2 2 2 2 2 2 2 2 2 2 2 2 1 1 2 2
## [1000] 2 2 2 2 2 2 1 2 1 2 2 2 2 1 2 2 2 2 2 1 1 1 2 2 2 2 2 2 1 1 2 2 2 2 1 1 2
## [1037] 2 1 2 1 1 1 1 2 2 1 2 1 2 1 2 2 2 2 2 2 1 1 1 2 2 1 2 2 2 1 2 1 2 2 1 1 1
## [1074] 1 2 1 2 1 1 1 2 2 1 2 2 1 2 2 2 2 2 2 2 2 2 2 2 2 2 2 1 2 2 1 2 2 2 2 1 1
## [1111] 2 2 1 2 1 1 2 2 2 2 1 2 1 2 2 1 1 1 1 2 2 2 1 1 1 1 1 2 1 2 1 1 2 2 2 2 2
## [1148] 2 1 1 1 1 2 2 1 2 2 2 2 1 1 2 2 2 2 2 2 1 2 2 2 1 1 1 1 2 1 2 2 2 1 1 2 2
## [1185] 1 2 1 1 2 2 2 2 1 2 2 2 1 2 1 2 2 2 2 1 2 1 2 2 2 2 2 2 1 2 2 1 2 2 2 2 2
## [1222] 1 2 1 1 1 2 2 1 1 1 2 1 2 2 2 1 2 1 2 2 2 2 2 2 2 2 1 2 1 2 2 1 1 1 2 2 1
## [1259] 1 2 1 2 2 2 2 2 1 1 2 2 2 2 1 2 2 1 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 1 1 2
## [1296] 2 2 1 2 2 1 2 2 2 2 2 2 2 1 2 1 2 2 2 1 2 2 2 2 1 2 2 2 2 2 2 1 2 1 1 2 2
## [1333] 2 1 2 2 2 1 1 1 2 2 2 1 2 2 2 2 2 2 2 2 2 2 1 2 2 1 2 2 1 2 2 2 2 2 2 2 1
## [1370] 2 2 2 2 2 2 1 2 2 2 1 1 2 2 1 2 1 1 2 2 2 2 1 2 1 2 2 2 1 2 1 2 1 2 2 2 2
## [1407] 2 2 2 2 2 2 2 2 1 1 2 2 2 1 1 1 2 2 2 2 2 1 1 1 2 2 2 1 2 2 2 2 2 1 2 1 2
## [1444] 2 2 2 1 2 2 2 2 2 1 2 1 2 1 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2
## [1481] 1 2 2 2 2 2 2 2 1 2 2 1 2 2 1 1 2 1 2 2 2 2 1 2 2 2 1 2 2 2 2 2 2 1 2 2 1
## [1518] 1 1 2 2 1 2 2 1 2 1 1 1 2 1 2 2 2 2 2 2 1 2 1 2 2 2 2 2 2 2 2 2 2 2 1 2 1
## [1555] 2 1 2 2 1 1 1 2 2 2 1 2 2 2 2 1 2 2 1 2 2 2 2 2 2 1 1 1 1 2 2 1 2 1 2 2 2
## [1592] 2 2 2 2 2 2 2 2 2 2 2 2 2 1 2 2 1 1 2 2 2 2 2 2 1 1 2 1 2 2 2 1 1 2 2 2 1
## [1629] 2 1 1 2 2 2 2 1 1 2 2 1 1 1 2 1 2 2 2 1 1 2 1 2 2 2 1 2 1 2 1 2 2 2 2 2 2
## [1666] 1 2 1 1 2 2 2 1 2 1 1 2 1 2 2 1 2 2 1 1 2 1 1 1 2 1 2 2 2 2 2 2 2 1 2 1 2
## [1703] 2 2 2 2 2 2 2 2 2 2 1 1 1 2 1 2 2 2 1 2 1 2 2 2 2 2 2 2 1 2 2 1 1 2 2 2 1
## [1740] 1 2 1 2 2 1 2 2 1 1 2 1 2 1 1 2 1 2 1 2 1 1 1 2 2 2 2 2 1 2 2 2 2 2 2 2 2
## [1777] 2 2 2 1 2 1 1 1 2 2 1 2 1 2 2 1 2 1 2 2 2 2 2 2 2 1 2 1 2 1 2 1 1 1 2 2 1
## [1814] 2 2 2 2 2 2 2 1 2 2 1 1 2 1 1 1 2 2 2 2 2 1 1 1 2 1 2 2 2 2 2 2 1 2 2 2 2
## [1851] 1 2 1 1 2 1 1 1 1 1 1 1 2 1 1 1 2 2 2 1 2 2 2 2 2 2 2 2 1 2 2 1 2 2 2 1 1
## [1888] 2 1 2 2 2 2 1 2 2 2 1 1 2 2 1 1 2 2 2 2 2 2 2 1 2 2 1 2 2 2 2 2 2 2 2 2 2
## [1925] 2 2 2 1 2 2 2 1 2 1 2 2 2 2 2 2 1 1 2 1 2 2 2 2 2 2 2 2 2 2 2 1 1 2 2 2 2
## [1962] 2 1 1 2 2 2 2 2 2 2 2 1 2 2 2 2 2 2 2 2 1 2 2 2 2 2 2 2 2 1 2 2 2 2 1 2 2
## [1999] 2 2 1 1 2 2 2 2 2 2 2 2 2 2 1 2 1 2 2 2 2 2 2 2 2 2 1 2 2 1 2 1 1 2 2 2 2
## [2036] 1 2 1 2 2 2 2 2 2 1 1 1 2 2 2 2 2 2 1 2 1 2 1 1 2 2 2 2 1 2 1 2 2 2 1 2 2
## [2073] 1 1 2 2 2 1 2 2 2 1 2 2 2 2 2 1 1 2 1 2 1 2 1 1 2 1 2 2 2 2 1 2 1 1 1 2 2
## [2110] 1 2 1 1 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 1 2 1 2 2 2 2 2 2 1 2 1 1 2 2 1 1
## [2147] 2 2 2 1 2 2 2 2 1 2 2 2 2 2 2 1 2 2 1 1 2 2 1 2 1 1 2 2 2 1 2 2 2 1 2 2 1
## [2184] 2 2 1 1 1 1 2 2 2 2 2 1 2 2 2 2 2 2 2 1 1 1 2 2 2 2 2 2 1 2 2 2 2 1 2 2 2
## [2221] 2 2 2 2 2 2 1 1 2 2 2 2 2 2 2 2 2 2 2 2 2 1 2 2 1 2 2 2 2 2 2 2 1 2 2 1 1
## [2258] 2 2 2 2 2 2 1 2 2 1 2 2 2 1 2 2 1 2 1 1 1 1 2 2 2 2 2 2 2 1 2 2 2 1 2 2 1
## 
## Within cluster sum of squares by cluster:
## [1]  8839.964 13010.500
##  (between_SS / total_SS =  13.4 %)
## 
## Available components:
## 
## [1] "cluster"      "centers"      "totss"        "withinss"     "tot.withinss"
## [6] "betweenss"    "size"         "iter"         "ifault"

berdasarkan ringkasan, kami menemukan 1558 observasi menuju cluster 1 dan 736 lainnya menuju cluster 2. Jadi sekarang kami memiliki informasi cluster dari setiap observasi, kami dapat menggabungkan vektor cluster ke dataset sampel kami

tracks_sample$cluster <- as.factor(km_tracks$cluster)

head(tracks_sample)
## # A tibble: 6 x 16
##   genre  artist_name  popularity acousticness danceability duration_ms energy
##   <fct>  <chr>             <dbl>        <dbl>        <dbl>       <dbl>  <dbl>
## 1 HipHop Talib Kweli          48     0.263           0.629      227373  0.787
## 2 Dance  Andy Grammer         55     0.0409          0.621      199113  0.827
## 3 Rap    Mac Miller           50     0.109           0.438      197852  0.792
## 4 Pop    Simple Plan          65     0.000491        0.522      232067  0.751
## 5 HipHop Pitbull              67     0.039           0.673      229507  0.758
## 6 Rap    Jason Derulo         82     0.0776          0.643      195419  0.904
## # ... with 9 more variables: instrumentalness <dbl>, key <fct>, liveness <dbl>,
## #   loudness <dbl>, mode <fct>, speechiness <dbl>, tempo <dbl>, valence <dbl>,
## #   cluster <fct>

6.3 Cluster Analysis

Kami akan melakukan analisis dan eksplorasi berdasarkan cluster yang telah kami lakukan menggunakan k-mean. fokus kita adalah popularitas, coba lihat apakah ada korelasi antara cluster dengan tingkat popularitas kita.

tracks_sample %>% 
  select(cluster, popularity) %>% 
  group_by(cluster) %>% 
  summarise_all("mean")
## # A tibble: 2 x 2
##   cluster popularity
##   <fct>        <dbl>
## 1 1             60.6
## 2 2             60.4

Antara cluster 1 dan 2 rata-rata tidak memiliki perbedaan Popularitas. itu hanya menunjukkan sedikit perbedaan bahwa cluster 2 memiliki popularitas 0,2 lebih tinggi dari cluster 1. Mari kita lihat dengan boxplot

tracks_sample %>% ggplot(aes(x = cluster, y = popularity, fill = cluster)) +
  geom_boxplot() +
  theme_minimal()

Sama seperti yang kami analisis sebelumnya, tidak ada perbedaan popularitas yang spesifik antara kedua cluster. Jadi kita bisa berasumsi bahwa cluster kita tidak fokus pada fitur atau variabel popularitas. mari kita lihat berdasarkan genre

tracks_sample %>% 
  select(cluster, genre) %>% 
  group_by(genre, cluster) %>% 
  summarize(n = n()) %>% 
  ungroup() %>%
  spread(genre, n, fill=0)
## `summarise()` has grouped output by 'genre'. You can override using the `.groups` argument.
## # A tibble: 2 x 6
##   cluster Dance HipHop   Pop   Rap  Rock
##   <fct>   <dbl>  <dbl> <dbl> <dbl> <dbl>
## 1 1         108    146   176   137   169
## 2 2         299    322   303   336   298

Cluster kami juga tidak memisahkan genre. jadi mari kita lihat visualisasi lainnya acousticness

tracks_sample %>% ggplot(aes(x = cluster, y = acousticness, fill = cluster)) +
  geom_boxplot() +
  theme_minimal()

acousticness adalah salah satu variabel yang cluster membacanya. jadi kita bisa mencari variabel keseluruhan untuk melihat variabel lain yang spesifik cluster kita berbeda

tracks_sample %>%
  select_if(is.numeric) %>% 
  mutate(cluster = as.factor(km_tracks$cluster)) %>% 
  group_by(cluster) %>% 
  summarise_all("mean")
## # A tibble: 2 x 12
##   cluster popularity acousticness danceability duration_ms energy
##   <fct>        <dbl>        <dbl>        <dbl>       <dbl>  <dbl>
## 1 1             60.6        0.370        0.624     229805.  0.476
## 2 2             60.4        0.109        0.654     219094.  0.747
## # ... with 6 more variables: instrumentalness <dbl>, liveness <dbl>,
## #   loudness <dbl>, speechiness <dbl>, tempo <dbl>, valence <dbl>

Kita dapat melihat antara Cluster 1 dan Cluster 2 memiliki beberapa perbedaan yang signifikan dalam fitur acousticness, energy, instrumentalness, liveness, loudness, energy, instrumentalness, loudness . Tidak masalah Antara cluster 1 dan 2 tidak memiliki perbedaan popularitas yang signifikan, kita dapat berasumsi jika Track memiliki lebih banyak pola seperti Cluster 2, ia memiliki lebih banyak peluang untuk mendapatkan popularitas yang lebih baik

7 PCA

Principal component analysis (PCA) adalah prosedur statistik yang menggunakan transformasi ortogonal untuk mengubah serangkaian pengamatan dari variabel yang mungkin berkorelasi (entitas yang masing-masing mengambil berbagai nilai numerik) menjadi satu set nilai variabel yang tidak berkorelasi linier yang disebut komponen utama. . PCA sensitif terhadap penskalaan relatif dari variabel asli.

7.1 Dimensionality Reduction

Kami akan mencoba membuat PCA dari dataset sampel kami. Kita dapat melihat nilai eigen dan persentase varians untuk setiap dimensi. Perilaku Eivenvalues akan lebih besar pada PC pertama dan akan turun secara berurutan ke akhir PC.

non_numeric <- which(sapply(tracks_sample, negate(is.numeric)))

tracks_pca <- PCA(tracks_sample,
                  scale.unit = T,
                  quali.sup = non_numeric,
                  graph = F,
                  ncp = 11)

summary(tracks_pca)
## 
## Call:
## PCA(X = tracks_sample, scale.unit = T, ncp = 11, quali.sup = non_numeric,  
##      graph = F) 
## 
## 
## Eigenvalues
##                        Dim.1   Dim.2   Dim.3   Dim.4   Dim.5   Dim.6   Dim.7
## Variance               2.309   1.505   1.142   1.027   0.985   0.948   0.847
## % of var.             20.987  13.682  10.379   9.332   8.955   8.619   7.696
## Cumulative % of var.  20.987  34.668  45.047  54.379  63.334  71.954  79.650
##                        Dim.8   Dim.9  Dim.10  Dim.11
## Variance               0.833   0.645   0.543   0.217
## % of var.              7.575   5.867   4.937   1.971
## Cumulative % of var.  87.225  93.092  98.029 100.000
## 
## Individuals (the 10 first)
##                      Dist    Dim.1    ctr   cos2    Dim.2    ctr   cos2  
## 1                |  3.250 |  1.012  0.019  0.097 |  0.942  0.026  0.084 |
## 2                |  2.008 |  0.805  0.012  0.161 | -0.047  0.000  0.001 |
## 3                |  3.315 |  0.852  0.014  0.066 | -0.663  0.013  0.040 |
## 4                |  1.841 |  1.040  0.020  0.319 | -0.978  0.028  0.282 |
## 5                |  2.029 |  1.579  0.047  0.606 | -0.136  0.001  0.004 |
## 6                |  3.075 |  1.616  0.049  0.276 | -0.091  0.000  0.001 |
## 7                |  2.559 |  1.031  0.020  0.162 | -1.282  0.048  0.251 |
## 8                |  2.441 |  0.762  0.011  0.097 | -0.048  0.000  0.000 |
## 9                |  3.198 |  0.304  0.002  0.009 | -1.388  0.056  0.188 |
## 10               |  4.496 | -2.847  0.153  0.401 | -1.205  0.042  0.072 |
##                   Dim.3    ctr   cos2  
## 1                 2.302  0.202  0.502 |
## 2                -0.555  0.012  0.076 |
## 3                 1.927  0.142  0.338 |
## 4                -0.786  0.024  0.182 |
## 5                 0.188  0.001  0.009 |
## 6                -1.807  0.125  0.345 |
## 7                -0.480  0.009  0.035 |
## 8                -0.049  0.000  0.000 |
## 9                 0.976  0.036  0.093 |
## 10                0.025  0.000  0.000 |
## 
## Variables (the 10 first)
##                     Dim.1    ctr   cos2    Dim.2    ctr   cos2    Dim.3    ctr
## popularity       |  0.002  0.000  0.000 |  0.095  0.596  0.009 | -0.617 33.386
## acousticness     | -0.647 18.115  0.418 |  0.158  1.653  0.025 | -0.003  0.001
## danceability     |  0.125  0.673  0.016 |  0.769 39.243  0.591 | -0.018  0.030
## duration_ms      | -0.149  0.966  0.022 | -0.471 14.759  0.222 |  0.122  1.306
## energy           |  0.872 32.917  0.760 | -0.267  4.720  0.071 |  0.015  0.021
## instrumentalness | -0.310  4.171  0.096 | -0.405 10.926  0.164 |  0.156  2.131
## liveness         |  0.237  2.434  0.056 | -0.099  0.654  0.010 |  0.595 31.035
## loudness         |  0.818 28.979  0.669 | -0.112  0.831  0.013 | -0.149  1.951
## speechiness      |  0.083  0.298  0.007 |  0.482 15.415  0.232 |  0.578 29.288
## tempo            |  0.159  1.093  0.025 | -0.254  4.297  0.065 |  0.084  0.612
##                    cos2  
## popularity        0.381 |
## acousticness      0.000 |
## danceability      0.000 |
## duration_ms       0.015 |
## energy            0.000 |
## instrumentalness  0.024 |
## liveness          0.354 |
## loudness          0.022 |
## speechiness       0.334 |
## tempo             0.007 |
## 
## Supplementary categories (the 10 first)
##                       Dist     Dim.1    cos2  v.test     Dim.2    cos2  v.test
## Dance            |   0.678 |   0.273   0.162   3.998 |  -0.339   0.249  -6.138
## HipHop           |   0.843 |   0.024   0.001   0.382 |   0.592   0.492  11.692
## Pop              |   0.735 |  -0.082   0.013  -1.334 |   0.025   0.001   0.491
## Rap              |   0.678 |   0.104   0.024   1.675 |   0.457   0.456   9.100
## Rock             |   1.084 |  -0.283   0.068  -4.512 |  -0.786   0.526 -15.517
## $uicideBoy$      |   2.143 |  -0.348   0.026  -0.648 |   0.681   0.101   1.572
## *NSYNC           |   3.488 |   2.905   0.694   1.912 |   0.196   0.003   0.159
## 03 Greedo        |   2.493 |   1.291   0.268   0.850 |   0.623   0.062   0.508
## 070 Shake        |   2.524 |  -1.786   0.501  -1.176 |   0.331   0.017   0.269
## 10cc             |   5.564 |  -3.790   0.464  -2.494 |  -1.795   0.104  -1.463
##                      Dim.3    cos2  v.test  
## Dance            |   0.015   0.000   0.313 |
## HipHop           |   0.500   0.351  11.333 |
## Pop              |  -0.534   0.528 -12.296 |
## Rap              |   0.259   0.146   5.912 |
## Rock             |  -0.228   0.044  -5.167 |
## $uicideBoy$      |   0.337   0.025   0.892 |
## *NSYNC           |   0.245   0.005   0.229 |
## 03 Greedo        |  -0.436   0.031  -0.408 |
## 070 Shake        |   0.424   0.028   0.397 |
## 10cc             |   0.606   0.012   0.567 |

Setelah selesai membuat PCA agar lebih mudah dipahami, kita dapat memvisualisasikan setiap varians yang ditangkap oleh setiap dimensi.

fviz_eig(tracks_pca, ncp = 11, addlabels = T, main = "Variance Explained by Dimensions")

Kita dapat melihat sekitar 50% varians data sampel hanya dapat dijelaskan dengan 4 dimensi pertama.

Target kami adalah pengurangan fitur untuk membuat perhitungan lebih ringan, sehingga kami dapat menargetkan lebih dari 80% informasi dengan dimensi minimum. Kita dapat mengambil 8 dimensi dari 11 dimensi yang kita miliki, karena dapat kita simpulkan, dengan hanya 8 dimensi kita dapat mencapai lebih dari 80% total varians yang dapat merepresentasikan dataset kita.

tracks_pca_min <- data.frame(tracks_pca$ind$coord[ ,1:8]) %>% 
  bind_cols(cluster = as.factor(tracks_sample$cluster))

head(tracks_pca_min)
##       Dim.1       Dim.2      Dim.3      Dim.4      Dim.5       Dim.6
## 1 1.0122734  0.94229908  2.3020987 -1.1828077  0.1633709  0.04650929
## 2 0.8052256 -0.04725789 -0.5549460 -0.6090916 -1.2256628 -0.01547659
## 3 0.8515912 -0.66258819  1.9270233  2.0635383  0.1928861 -0.46747834
## 4 1.0398390 -0.97782829 -0.7863463  0.3407197  0.1184999  0.05866493
## 5 1.5792762 -0.13596040  0.1878639  0.1504676  0.9698811  0.19449559
## 6 1.6158722 -0.09069233 -1.8066716 -0.3757709  1.1769794  0.31947824
##         Dim.7      Dim.8 cluster
## 1 -0.05281645 -0.4811671       2
## 2 -0.29699955 -0.4206434       2
## 3 -0.04919005 -0.6600425       2
## 4  0.18860331 -0.2629920       2
## 5  0.11174311  0.4921659       2
## 6 -0.40082276  1.1204166       2
pca_dimdesc<-dimdesc(tracks_pca)
pca_dimdesc$Dim.1$quanti
##                  correlation       p.value
## energy            0.87172091  0.000000e+00
## loudness          0.81792061  0.000000e+00
## valence           0.48891303 3.760595e-138
## liveness          0.23705070  1.148005e-30
## tempo             0.15882568  1.985875e-14
## danceability      0.12460398  2.123139e-09
## speechiness       0.08291389  7.011264e-05
## duration_ms      -0.14935922  6.472797e-13
## instrumentalness -0.31029361  2.197482e-52
## acousticness     -0.64667005 7.190923e-272

Variabel energi dan kenyaringan 2 yang memberikan kontribusi lebih pada PC 1. jadi dari PC 1 kita bisa mendapatkan informasi lebih lanjut dari kedua variabel ini

7.2 Individual and Variable Factor Map

Dari bagian sebelumnya, kita telah membahas bahwa PCA dapat dikombinasikan dengan clustering untuk mendapatkan visualisasi yang lebih baik dari hasil clustering kita, atau sekadar untuk memahami pola dalam dataset kita.

fviz_cluster(object = km_tracks, data = tracks_scale) + 
  theme_minimal()

Plot di atas adalah contoh peta faktor individu. Titik-titik dalam plot menyerupai pengamatan dan diwarnai dengan Cluster (Kernel by clustering result). Dim1 dan Dim2 masing-masing adalah PC1 dan PC2, dengan bagian mereka sendiri (persentase) informasi dari total informasi kumpulan data. Dengan hanya visualisasi ini, kita tidak dapat benar-benar memahami wawasan macam apa dari pola ini. Kita dapat menambahkan visualisasikan Variable Factor Map lainnya

fviz_pca_var(tracks_pca) +
  theme_minimal()

Plot di atas menunjukkan kepada kita bahwa variabel terletak di dalam lingkaran, artinya kita membutuhkan lebih dari dua komponen untuk mewakili data kita dengan sempurna. Jarak antara variabel dan asal mengukur kualitas variabel pada peta faktor. Variabel yang berkorelasi dengan PC1 dan PC2 adalah yang paling penting dalam menjelaskan variabilitas dalam kumpulan data. Variabel yang tidak berkorelasi dengan PC manapun atau berkorelasi dengan dimensi terakhir adalah variabel dengan kontribusi rendah dan mungkin dihilangkan untuk menyederhanakan analisis keseluruhan.

Some insight we can get from Individual Factor Map and Variable Factor Map

Cluster 1: tracks that have more danceability,speechiness, valence,loudness,energy,tempo and lieveness and it little more better popularity than Cluster 1 Cluster 2: tracks have more accousticness instrumentalness and more durations

7.3 PCA Clustering

PCA juga dapat diintegrasikan dengan hasil K-means Clustering untuk membantu memvisualisasikan data kami dalam dimensi yang lebih sedikit daripada fitur aslinya.

fviz_pca_ind(tracks_pca, habillage = 1)

Beberapa insight yang bisa kita dapatkan dari visualisasi ini adalah: 1. semua genre memiliki 2 cluster yang berbeda 2. Dilihat dari Variable Factor Map, Genre rock berpeluang mendapatkan popularitas yang lebih kecil dibandingkan 4 genre lainnya 3. Genre Pop dan Hiphop dengan lebih banyak danceability,speechiness, valensi memiliki peluang lebih besar untuk mendapatkan Popularitas yang lebih baik

8 Conclusion

Dari analisis unsupervised learning di atas, kita dapat meringkas:

  1. Popularitas hanya memiliki hubungan kecil dengan fitur/variabel lain. tetapi memiliki lebih banyak danceability,speechiness, valensi dapat membantu mendapatkan Popularitas yang lebih baik
  2. Berdasarkan clustering, track yang menjadi Cluster 1 lebih berpeluang mendapatkan Popularity lebih baik daripada Cluster 2
  3. Genre rock yang biasanya lebih loudness, energy, tempo, lieveness, instrumentalness dan durations terlihat lebih kecil popularitasnya dibandingkan genre lainnya
  4. Reduksi dimensi dapat dilakukan dengan menggunakan dataset ini. Untuk melakukan pengurangan dimensi, kita dapat memilih PC dari total 11 PC sesuai dengan informasi total. kami dapat menargetkan lebih dari 80% informasi dengan dimensi minimum. Kita dapat mengambil 8 dimensi dari 11 dimensi yang kita miliki, karena kita dapat menjumlahkannya, dengan hanya 8 dimensi kita dapat mencapai lebih dari 80% total varians yang dapat mewakili dataset kita.
  5. Kumpulan data yang ditingkatkan yang diperoleh dari pembelajaran tanpa pengawasan (mis. PCA) dapat digunakan lebih lanjut untuk pembelajaran yang diawasi (klasifikasi) atau untuk visualisasi data yang lebih baik (data berdimensi tinggi) dengan berbagai wawasan.