1 Dataset Spotify

Pada artikel ini, kita akan melakukan analisis eksploratif pada dataset Spotify. Spotify Merupakan dataset yang berisikan daftar lagu dan fitur audio dari band/penyanyi ternama dunia, antara lain: Queens, Maroon 5, dan Jason Mraz.

Kolom-kolom pada dataset tersebut, antara lain:

  • id : nomor seri lagu
  • name : judul lagu
  • popularity : tingkat popularitas lagu
  • album.id : nomor seri album
  • album.name : nama album
  • album.total_tracks : total lagu dalam album
  • track_number : nomor lagu dalam album
  • duration_ms : durasi lagu dalam satuan ms
  • danceability : elemen musik termasuk tempo, stabilitas ritme, kekuatan beat, dan keteraturan keseluruhan. Nilai 0,0 paling tidak bisa digunakan untuk menari dan 1,0 paling bisa digunakan untuk menari.
  • energy : Energi adalah ukuran dari 0,0 hingga 1,0 dan mewakili ukuran persepsi intensitas dan aktivitas. Biasanya, trek yang energik terasa cepat, keras, dan berisik. Sebagai contoh, death metal memiliki energi tinggi, sedangkan prelude Bach mendapat skor rendah pada skala. Fitur perseptual yang berkontribusi pada atribut ini meliputi rentang dinamis, persepsi kenyaringan, warna nada, onset rate, dan entropi umum.
  • key : Kunci dari trek adalah. Integer memetakan ke pitch menggunakan notasi Pitch Class standar. Misalnya. 0 = C, 1 = C♯ / D ♭, 2 = D, dan seterusnya.
  • loudness : Keseluruhan kenyaringan trek dalam desibel (dB). Nilai kenyaringan rata-rata di seluruh trek dan berguna untuk membandingkan kenyaringan relatif trek. Kenyaringan adalah kualitas suara yang merupakan korelasi psikologis utama dari kekuatan fisik (amplitudo). Nilai kisaran khas antara -60 dan 0 db.
  • mode : Mode menunjukkan modalitas (besar atau kecil) dari suatu trek, jenis skala dari mana konten melodinya diturunkan. Mayor diwakili oleh 1 dan minor adalah 0.
  • speechiness : Speechiness mendeteksi keberadaan kata-kata yang diucapkan di trek. Semakin eksklusif pidato-seperti rekaman (mis. Acara bincang-bincang, buku audio, puisi), semakin dekat dengan 1.0 nilai atribut. Nilai di atas 0,66 menggambarkan trek yang mungkin seluruhnya terbuat dari kata-kata yang diucapkan. Nilai antara 0,33 dan 0,66 menggambarkan trek yang mungkin berisi musik dan ucapan, baik dalam bagian atau lapisan, termasuk kasus-kasus seperti musik rap. Nilai di bawah 0,33 kemungkinan besar mewakili musik dan trek non-ucapan lainnya.
  • acousticness : Ukuran kepercayaan dari 0,0 hingga 1,0 dari apakah trek akustik. 1.0 mewakili kepercayaan tinggi trek adalah akustik.
  • instrumentalness : Memprediksi apakah suatu lagu tidak mengandung vokal. Suara “Ooh” dan “aah” diperlakukan sebagai instrumen dalam konteks ini. Rap atau trek kata yang diucapkan jelas “vokal”. Semakin dekat nilai instrumentalness ke 1.0, semakin besar kemungkinan trek tidak mengandung konten vokal. Nilai di atas 0,5 dimaksudkan untuk mewakili trek instrumental, tetapi kepercayaan diri lebih tinggi ketika nilai mendekati 1.0.
  • liveness : Mendeteksi keberadaan audiens dalam rekaman. Nilai liveness yang lebih tinggi mewakili probabilitas yang meningkat bahwa trek dilakukan secara langsung. Nilai di atas 0,8 memberikan kemungkinan kuat bahwa trek live.
  • valence : Ukuran 0,0 hingga 1,0 yang menggambarkan kepositifan musik yang disampaikan oleh sebuah trek. Lagu dengan valensi tinggi terdengar lebih positif (mis. Bahagia, ceria, gembira), sedangkan trek dengan valensi rendah terdengar lebih negatif (mis. Sedih, tertekan, marah).
  • tempo : Perkiraan tempo trek secara keseluruhan dalam beat per menit (BPM). Dalam terminologi musik, tempo adalah kecepatan atau kecepatan dari bagian yang diberikan dan diturunkan langsung dari durasi beat rata-rata.
  • 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).

2 Persiapan

2.1 Library

if(!require(tidyverse)) install.packages("tidyverse")
if(!require(skimr)) install.packages("skimr")
if(!require(DataExplorer)) install.packages("DataExplorer")

library(tidyverse)
library(skimr)
library(DataExplorer)

Terdapat tiga buah library yang diperlukan dalam tutorial ini, antara lain:

  1. tidyverse : koleksi paket R yang dirancang untuk ilmu data. Semua paket berbagi filosofi desain, tata bahasa, dan struktur data yang mendasarinya.
  2. skimr : menyediakan fungsi untuk membuat ringkasan data yang dapat dibaca secara cepat.
  3. DataExplorer : menyediakan fungsi yang dapat membantu proses otomasi analisis data eksploratif

2.2 Import Dataset

Data yang kita miliki memiliki format .csv. Untuk megimport data tersebut, kita dapat menggunakan fungsi read_csv dari library readr.

  spotify <- read_csv("data/spotify.csv")

Untuk mengecek 10 observasi awal dataset tersebut, jalankan sintaks berikut:

spotify

2.3 Data Cleaning

Terdapat sejumlah variabel yang perlu disesuaikan terlebih dahulu jenis datanya. Variabel tersebut, antara lain: time_signature, key, dan mode.

key_labs = c('c', 'c#', 'd', 'd#', 'e', 'f', 
             'f#', 'g', 'g#', 'a', 'a#', 'b')
mode_labs = c('minor', 'major')

spotify <- spotify %>%
  mutate(time_signature = factor(time_signature),
         key = factor(key, labels = key_labs),
         mode = factor(mode, labels = mode_labs))

3 Ringkasan Data

glimpse(spotify)
## Rows: 1,225
## Columns: 21
## $ id                 <chr> "3I1JTx525DKElzlTYOBfZN", "0GxQ1A5L9xnMOytbP6eKBG"…
## $ name               <chr> "Best 4 U", "What Lovers Do (feat. SZA)", "Wait", …
## $ popularity         <dbl> 54, 74, 64, 58, 54, 55, 53, 54, 68, 53, 53, 55, 51…
## $ album.id           <chr> "1Li4rADxSxjT2g4xqUcMYh", "1Li4rADxSxjT2g4xqUcMYh"…
## $ album.name         <chr> "Red Pill Blues (Deluxe)", "Red Pill Blues (Deluxe…
## $ album.total_tracks <dbl> 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22…
## $ track_number       <dbl> 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15,…
## $ duration_ms        <dbl> 239751, 199849, 190642, 216930, 196120, 193603, 18…
## $ danceability       <dbl> 0.526, 0.799, 0.655, 0.652, 0.759, 0.934, 0.812, 0…
## $ energy             <dbl> 0.608, 0.597, 0.603, 0.555, 0.604, 0.564, 0.670, 0…
## $ key                <fct> a#, f, g#, a, g#, b, f, a#, c, c, c#, c, b, g, a, …
## $ loudness           <dbl> -5.776, -5.131, -5.014, -6.608, -6.663, -4.806, -4…
## $ mode               <fct> minor, minor, major, major, minor, major, major, m…
## $ speechiness        <dbl> 0.1690, 0.0611, 0.0555, 0.0320, 0.0510, 0.0638, 0.…
## $ acousticness       <dbl> 0.12700, 0.07880, 0.09590, 0.13700, 0.14100, 0.461…
## $ instrumentalness   <dbl> 0.00e+00, 5.66e-06, 0.00e+00, 2.18e-05, 0.00e+00, …
## $ liveness           <dbl> 0.1130, 0.1000, 0.1070, 0.0900, 0.1490, 0.1010, 0.…
## $ valence            <dbl> 0.3720, 0.4190, 0.4520, 0.1070, 0.4180, 0.5430, 0.…
## $ tempo              <dbl> 93.311, 110.001, 126.088, 103.043, 121.096, 115.09…
## $ time_signature     <fct> 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4,…
## $ artist             <chr> "Maroon 5", "Maroon 5", "Maroon 5", "Maroon 5", "M…
summary(spotify)
##       id                name             popularity      album.id        
##  Length:1225        Length:1225        Min.   : 0.00   Length:1225       
##  Class :character   Class :character   1st Qu.:21.00   Class :character  
##  Mode  :character   Mode  :character   Median :27.00   Mode  :character  
##                                        Mean   :29.95                     
##                                        3rd Qu.:36.00                     
##                                        Max.   :82.00                     
##                                                                          
##   album.name        album.total_tracks  track_number     duration_ms     
##  Length:1225        Min.   : 6.00      Min.   : 1.000   Min.   :   4000  
##  Class :character   1st Qu.:14.00      1st Qu.: 4.000   1st Qu.: 186786  
##  Mode  :character   Median :16.00      Median : 7.000   Median : 223733  
##                     Mean   :18.29      Mean   : 7.638   Mean   : 233450  
##                     3rd Qu.:22.00      3rd Qu.:11.000   3rd Qu.: 271600  
##                     Max.   :41.00      Max.   :30.000   Max.   :2054800  
##                                                                          
##   danceability        energy             key         loudness          mode    
##  Min.   :0.0000   Min.   :0.00174   d      :203   Min.   :-33.592   minor:384  
##  1st Qu.:0.3410   1st Qu.:0.48500   g      :162   1st Qu.:-10.853   major:841  
##  Median :0.5000   Median :0.69500   a      :161   Median : -7.701              
##  Mean   :0.4983   Mean   :0.64788   e      :146   Mean   : -8.606              
##  3rd Qu.:0.6560   3rd Qu.:0.84100   c      :128   3rd Qu.: -5.595              
##  Max.   :0.9460   Max.   :0.99600   f      : 87   Max.   : -1.872              
##                                     (Other):338                                
##   speechiness       acousticness    instrumentalness       liveness     
##  Min.   :0.00000   Min.   :0.0000   Min.   :0.0000000   Min.   :0.0000  
##  1st Qu.:0.03580   1st Qu.:0.0330   1st Qu.:0.0000000   1st Qu.:0.1070  
##  Median :0.05080   Median :0.1450   Median :0.0000084   Median :0.2030  
##  Mean   :0.09702   Mean   :0.2664   Mean   :0.0485253   Mean   :0.3338  
##  3rd Qu.:0.08970   3rd Qu.:0.4340   3rd Qu.:0.0008080   3rd Qu.:0.4540  
##  Max.   :0.96400   Max.   :0.9840   Max.   :1.0000000   Max.   :1.0000  
##                                                                         
##     valence           tempo       time_signature    artist         
##  Min.   :0.0000   Min.   :  0.0   0:   4         Length:1225       
##  1st Qu.:0.2670   1st Qu.: 95.3   1:   4         Class :character  
##  Median :0.4190   Median :116.8   3: 120         Mode  :character  
##  Mean   :0.4454   Mean   :117.8   4:1080                           
##  3rd Qu.:0.6160   3rd Qu.:140.0   5:  17                           
##  Max.   :0.9730   Max.   :207.5                                    
## 
skim(spotify)
Data summary
Name spotify
Number of rows 1225
Number of columns 21
_______________________
Column type frequency:
character 5
factor 3
numeric 13
________________________
Group variables None

Variable type: character

skim_variable n_missing complete_rate min max empty n_unique whitespace
id 0 1 22 22 0 1225 0
name 0 1 3 88 0 961 0
album.id 0 1 22 22 0 76 0
album.name 0 1 4 67 0 68 0
artist 0 1 5 10 0 3 0

Variable type: factor

skim_variable n_missing complete_rate ordered n_unique top_counts
key 0 1 FALSE 12 d: 203, g: 162, a: 161, e: 146
mode 0 1 FALSE 2 maj: 841, min: 384
time_signature 0 1 FALSE 5 4: 1080, 3: 120, 5: 17, 0: 4

Variable type: numeric

skim_variable n_missing complete_rate mean sd p0 p25 p50 p75 p100 hist
popularity 0 1 29.95 13.89 0.00 21.00 27.00 36.00 82.00 ▁▇▃▁▁
album.total_tracks 0 1 18.29 6.87 6.00 14.00 16.00 22.00 41.00 ▅▇▃▂▁
track_number 0 1 7.64 5.03 1.00 4.00 7.00 11.00 30.00 ▇▆▂▁▁
duration_ms 0 1 233450.19 113887.88 4000.00 186786.00 223733.00 271600.00 2054800.00 ▇▁▁▁▁
danceability 0 1 0.50 0.19 0.00 0.34 0.50 0.66 0.95 ▁▇▇▇▂
energy 0 1 0.65 0.23 0.00 0.48 0.70 0.84 1.00 ▁▃▅▇▇
loudness 0 1 -8.61 4.16 -33.59 -10.85 -7.70 -5.60 -1.87 ▁▁▁▆▇
speechiness 0 1 0.10 0.16 0.00 0.04 0.05 0.09 0.96 ▇▁▁▁▁
acousticness 0 1 0.27 0.28 0.00 0.03 0.14 0.43 0.98 ▇▂▁▂▁
instrumentalness 0 1 0.05 0.18 0.00 0.00 0.00 0.00 1.00 ▇▁▁▁▁
liveness 0 1 0.33 0.30 0.00 0.11 0.20 0.45 1.00 ▇▃▁▁▂
valence 0 1 0.45 0.24 0.00 0.27 0.42 0.62 0.97 ▅▇▇▆▃
tempo 0 1 117.85 30.07 0.00 95.30 116.77 139.95 207.55 ▁▂▇▅▁
  plot_intro(spotify)

plot_missing(spotify)

4 Variasi

4.1 Data Kontinu

plot_histogram(spotify)

4.2 Data Kategorikal

plot_bar(spotify)
## 4 columns ignored with more than 50 categories.
## id: 1225 categories
## name: 961 categories
## album.id: 76 categories
## album.name: 68 categories

5 Kovarian

5.1 Koefisien Korelasi

plot_correlation(spotify)
## 4 features with more than 20 categories ignored!
## id: 1225 categories
## name: 961 categories
## album.id: 76 categories
## album.name: 68 categories

5.2 Kategorikal vs Kontinu

plot_boxplot(spotify, by = "artist")

5.3 Kontinu vs Kontinu

plot_scatterplot(spotify, by = "liveness")

6 Lagu Terpopuler Masing-Masing Artis

max <- spotify %>%
  filter(popularity > 0) %>%
  group_by(artist) %>%
  summarise(popularity = min(popularity))
## `summarise()` ungrouping output (override with `.groups` argument)
spotify %>%
  right_join(max, by = c("artist", "popularity")) %>%
  select(artist, popularity, name)

7 Lagu yang Paling Cocok untuk Berdansa pada Masing-Masing Artis

dance <- spotify %>%
  group_by(artist) %>%
  summarise(danceability = max(danceability))
## `summarise()` ungrouping output (override with `.groups` argument)
spotify %>%
  right_join(dance, by = c("artist", "danceability")) %>%
  select(artist, danceability, name)

8 Lagu Paling Sedih pada Masing-Masing Artis

val <- spotify %>%
  group_by(artist) %>%
  summarise(valence = min(valence))
## `summarise()` ungrouping output (override with `.groups` argument)
spotify %>%
  right_join(val, by = c("artist", "valence")) %>%
  select(artist, valence, name)

9 Lagu dengan Durasi Terlama pada Masing-Masing Artis

dur <- spotify %>%
  group_by(artist) %>%
  summarise(duration_ms = max(duration_ms))
## `summarise()` ungrouping output (override with `.groups` argument)
spotify %>%
  right_join(dur, by = c("artist", "duration_ms")) %>%
  select(artist, duration_ms, name)

10 Apakah Seluruh Track pada Data Spotify Direkam Secara Live

spotify %>%
  filter(liveness >= liveness) %>%
  count(artist)

11 Lagu apa yang Paling Keras Terdengar?

spotify %>%
  select(name, artist, loudness) %>%
  arrange(loudness)

12 Lagu apa yang Paling Lambat Temponya?

spotify %>%
  select(name, artist, tempo) %>%
  arrange(tempo)