Welcome!

Hi! Welcome to my R-Markdown. Disini saya akan membahas mengenai kanal-kanal Spotify milik para penyanyi beserta 10 lagu teratas mereka. Penasaran? Tanpa tunggu berlama-lama lagi, let’s get started!

1st Step, Load the Data!

Pertama, kita harus memasukkan datanya terlebih dahulu yang sudah kita download ke dalam RMD ini. Data yang saya pilih ini merupakan data artist-artist atau seniman dalam kanal Spotify, yang dimana kanal ini merupakan tempat untuk mengunggah karya dalam bentuk musik. Data ini juga menyertakan keterangan dari YouTube, tetapi tidak akan terlalu banyak saya gunakan dalam LBB ini.

data_bank <- as.data.frame(read.csv("data_input/Spotify_Youtube.csv"))
head(data_bank)
tail(data_bank)

2nd Step, Data Cleaning!

Sebelum kita melakukan data cleaning, saya akan menjelaskan terlebih dahulu mengenai variabel-variabel yang terdapat pada dataset yang kami gunakan.

  • ‘X’ = Penomoran data (berdasarkan baris)
  • ‘Artist’ = Nama kanal Spotify (biasanya berdasarkan nama Artist/Senimannya)
  • ‘Url_spotify’ = Tautan menuju kanal Spotify mereka
  • ‘Track’ = Judul lagu yang ditampilkan dalam Spotify
  • ‘Album’ = Nama album tempat lagu tersebut dimuat
  • ‘Album_type’ = Indikator apakah lagu tersebut dimuat dalam bentuk single atau sebagai album
  • ‘Uri’ = Tautan menuju lagu tersebut
  • ‘Danceability’ = Mendeskripsikan apakah lagu tersebut cocok digunakan sebagai iringan tari atau tidak dalam skala 0 (sangat tidak cocok) hingga 1 (sangat cocok).
  • ‘Energy’ = Mendeskripsikan apakah lagu memiliki energi yang tinggi atau tidak. Contohnya musik tipe death metal memiliki energi yang sangat tinggi, sementara musik-musik milik Bach tidak memiliki energi yang tinggi. Dideskripsikan dalam skala 0 hingga 1.
  • ‘Key’ = Kunci nada lagu yang dimaksud. Apabila tidak terdapat kunci nada yang terdeteksi, maka akan muncul ‘-1’.
  • ‘Loudness’ = Ukuran kencang atau tidaknya musik yang dimaksud (dalam skala desibel).
  • ‘Speechiness’ = Penilaian artikulasi dalam lagu.
  • ‘Acousticness’ = Skala penilaian apakah lagu yang dimaksud merupakan lagu akustik atau bukan (nilai 0 hingga 1. 0 menunjukkan bukan akustik dan 1 menunjukkan bahwa lagu tersebut adalah lagu akustik).
  • ‘Instrumentalness’ = Mengukur apakah di dalam lagu tersebut terdapat kata-kata, atau hanya berisi musik instrument saja.
  • ‘Liveness’ = Mendeteksi apakah lagu direkam saat ada penonton/audiens atau tidak.
  • ‘Valence’ = Mengukur apakah lagu terdengar positif atau negatif (skala 0 untuk lagu yang terdengar negatif dan skala 1 untuk lagu yang terdengar positif).
  • ‘Tempo’ = Tempo lagu dalam skala BPM (Beats Per Minute).
  • ‘Duration_ms’ = Durasi lagu dalam ukuran miliseconds.
  • ‘Url_youtube’ = Tautan video lagu tersebut dalam kanal YouTube (bila ada).
  • ‘Title’ = Judul video dalam YouTube.
  • ‘Channel’ = Nama kanal YouTube dimana video tersebut dimuat.
  • ‘Views’ = Jumlah pemutaran video.
  • ‘Likes’ = Jumlah likes yang ada pada video.
  • ‘Comments’ = Jumlah komentar pada video.
  • ‘Description’ = Deskripsi video pada YouTube.
  • ‘Licensed’ = Indikator apakah video berlisensi atau tidak.
  • ‘official_video’ = Mendeteksi apakah video yang dimaksud merupakan video resmi atau bukan.
  • ‘Stream’ = Jumlah stream video (bukan jumlah views)

Karena datanya masih banyak sekali dan tercampur dengan data dari YouTube juga, maka sebagai langkah awal, kita akan membuang data-data dari YouTube terlebih dahulu. Data set yang baru (berisi data dari Spotify) akan kita namai dengan ‘data_spotify’. Pada tahap ini, kita akan menggunakan ‘subset’.

data_spotify <- subset(data_bank, 
                       select=c(-Url_youtube, -Title, -Channel, -Views, -Likes, 
                                -Comments, -Description, -Licensed, -official_video, 
                                -Stream))
head(data_spotify)

Mulai dari proses ini hingga selanjutnya, kita akan terus menggunakan data set ‘data_spotify’.

Selanjutnya, kita dapat melihat struktur data yang dimiliki ‘data_spotify’ menggunakan fungsi str()

str(data_spotify)
## 'data.frame':    20718 obs. of  18 variables:
##  $ X               : int  0 1 2 3 4 5 6 7 8 9 ...
##  $ Artist          : chr  "Gorillaz" "Gorillaz" "Gorillaz" "Gorillaz" ...
##  $ Url_spotify     : chr  "https://open.spotify.com/artist/3AA28KZvwAUcZuOKwyblJQ" "https://open.spotify.com/artist/3AA28KZvwAUcZuOKwyblJQ" "https://open.spotify.com/artist/3AA28KZvwAUcZuOKwyblJQ" "https://open.spotify.com/artist/3AA28KZvwAUcZuOKwyblJQ" ...
##  $ Track           : chr  "Feel Good Inc." "Rhinestone Eyes" "New Gold (feat. Tame Impala and Bootie Brown)" "On Melancholy Hill" ...
##  $ Album           : chr  "Demon Days" "Plastic Beach" "New Gold (feat. Tame Impala and Bootie Brown)" "Plastic Beach" ...
##  $ Album_type      : chr  "album" "album" "single" "album" ...
##  $ Uri             : chr  "spotify:track:0d28khcov6AiegSCpG5TuT" "spotify:track:1foMv2HQwfQ2vntFf9HFeG" "spotify:track:64dLd6rVqDLtkXFYrEUHIU" "spotify:track:0q6LuUqGLUiCPP1cbdwFs3" ...
##  $ Danceability    : num  0.818 0.676 0.695 0.689 0.663 0.76 0.716 0.726 0.741 0.625 ...
##  $ Energy          : num  0.705 0.703 0.923 0.739 0.694 0.891 0.897 0.815 0.913 0.877 ...
##  $ Key             : num  6 8 1 2 10 11 4 11 2 10 ...
##  $ Loudness        : num  -6.68 -5.82 -3.93 -5.81 -8.63 ...
##  $ Speechiness     : num  0.177 0.0302 0.0522 0.026 0.171 0.0372 0.0629 0.0313 0.0465 0.162 ...
##  $ Acousticness    : num  8.36e-03 8.69e-02 4.25e-02 1.51e-05 2.53e-02 2.29e-02 1.20e-02 7.99e-03 3.43e-03 3.15e-02 ...
##  $ Instrumentalness: num  0.00233 0.000687 0.0469 0.509 0 0.0869 0.262 0.081 0.103 0.0811 ...
##  $ Liveness        : num  0.613 0.0463 0.116 0.064 0.0698 0.298 0.325 0.112 0.325 0.672 ...
##  $ Valence         : num  0.772 0.852 0.551 0.578 0.525 0.966 0.358 0.462 0.643 0.865 ...
##  $ Tempo           : num  138.6 92.8 108 120.4 168 ...
##  $ Duration_ms     : num  222640 200173 215150 233867 340920 ...
unique(data_spotify$Album_type)
## [1] "album"       "single"      "compilation"

Setelah ditelusuri, kolom ‘Album_type’ hanya memiliki 3 data yang berbeda. Maka dari itu, saya akan mengubah tipe data ‘Album_type’ menjadi factor.

data_spotify$Album_type <- as.factor(data_spotify$Album_type)

Kita check lagi untuk memastikan apakah tipe data sudah berubah:

str(data_spotify)
## 'data.frame':    20718 obs. of  18 variables:
##  $ X               : int  0 1 2 3 4 5 6 7 8 9 ...
##  $ Artist          : chr  "Gorillaz" "Gorillaz" "Gorillaz" "Gorillaz" ...
##  $ Url_spotify     : chr  "https://open.spotify.com/artist/3AA28KZvwAUcZuOKwyblJQ" "https://open.spotify.com/artist/3AA28KZvwAUcZuOKwyblJQ" "https://open.spotify.com/artist/3AA28KZvwAUcZuOKwyblJQ" "https://open.spotify.com/artist/3AA28KZvwAUcZuOKwyblJQ" ...
##  $ Track           : chr  "Feel Good Inc." "Rhinestone Eyes" "New Gold (feat. Tame Impala and Bootie Brown)" "On Melancholy Hill" ...
##  $ Album           : chr  "Demon Days" "Plastic Beach" "New Gold (feat. Tame Impala and Bootie Brown)" "Plastic Beach" ...
##  $ Album_type      : Factor w/ 3 levels "album","compilation",..: 1 1 3 1 1 1 3 1 3 1 ...
##  $ Uri             : chr  "spotify:track:0d28khcov6AiegSCpG5TuT" "spotify:track:1foMv2HQwfQ2vntFf9HFeG" "spotify:track:64dLd6rVqDLtkXFYrEUHIU" "spotify:track:0q6LuUqGLUiCPP1cbdwFs3" ...
##  $ Danceability    : num  0.818 0.676 0.695 0.689 0.663 0.76 0.716 0.726 0.741 0.625 ...
##  $ Energy          : num  0.705 0.703 0.923 0.739 0.694 0.891 0.897 0.815 0.913 0.877 ...
##  $ Key             : num  6 8 1 2 10 11 4 11 2 10 ...
##  $ Loudness        : num  -6.68 -5.82 -3.93 -5.81 -8.63 ...
##  $ Speechiness     : num  0.177 0.0302 0.0522 0.026 0.171 0.0372 0.0629 0.0313 0.0465 0.162 ...
##  $ Acousticness    : num  8.36e-03 8.69e-02 4.25e-02 1.51e-05 2.53e-02 2.29e-02 1.20e-02 7.99e-03 3.43e-03 3.15e-02 ...
##  $ Instrumentalness: num  0.00233 0.000687 0.0469 0.509 0 0.0869 0.262 0.081 0.103 0.0811 ...
##  $ Liveness        : num  0.613 0.0463 0.116 0.064 0.0698 0.298 0.325 0.112 0.325 0.672 ...
##  $ Valence         : num  0.772 0.852 0.551 0.578 0.525 0.966 0.358 0.462 0.643 0.865 ...
##  $ Tempo           : num  138.6 92.8 108 120.4 168 ...
##  $ Duration_ms     : num  222640 200173 215150 233867 340920 ...

3rd Step, Data Exploration!

Setelah yakin akan dataset yang akan digunakan, maka saatnya kita memulai proses data explorationnya.

Pertama - tama, kita dapat mencari tahu dimensi data yang akan kita gunakan menggunakan fungsi ‘dim()’

dim(data_spotify)
## [1] 20718    18

Dari output kita dapat menyimpulkan bahwa data yang sedang kita pakai memiliki 20.718 baris dan 18 kolom.

Selanjutnya, kita akan menggunakan ‘summary()’ untuk melihat rangkuman data.

summary(data_spotify)
##        X            Artist          Url_spotify           Track          
##  Min.   :    0   Length:20718       Length:20718       Length:20718      
##  1st Qu.: 5179   Class :character   Class :character   Class :character  
##  Median :10358   Mode  :character   Mode  :character   Mode  :character  
##  Mean   :10358                                                           
##  3rd Qu.:15538                                                           
##  Max.   :20717                                                           
##                                                                          
##     Album                 Album_type        Uri             Danceability   
##  Length:20718       album      :14926   Length:20718       Min.   :0.0000  
##  Class :character   compilation:  788   Class :character   1st Qu.:0.5180  
##  Mode  :character   single     : 5004   Mode  :character   Median :0.6370  
##                                                            Mean   :0.6198  
##                                                            3rd Qu.:0.7402  
##                                                            Max.   :0.9750  
##                                                            NA's   :2       
##      Energy               Key          Loudness        Speechiness     
##  Min.   :0.0000203   Min.   : 0.0   Min.   :-46.251   Min.   :0.00000  
##  1st Qu.:0.5070000   1st Qu.: 2.0   1st Qu.: -8.858   1st Qu.:0.03570  
##  Median :0.6660000   Median : 5.0   Median : -6.536   Median :0.05050  
##  Mean   :0.6352503   Mean   : 5.3   Mean   : -7.672   Mean   :0.09646  
##  3rd Qu.:0.7980000   3rd Qu.: 8.0   3rd Qu.: -4.931   3rd Qu.:0.10300  
##  Max.   :1.0000000   Max.   :11.0   Max.   :  0.920   Max.   :0.96400  
##  NA's   :2           NA's   :2      NA's   :2         NA's   :2        
##   Acousticness       Instrumentalness       Liveness         Valence      
##  Min.   :0.0000011   Min.   :0.0000000   Min.   :0.0145   Min.   :0.0000  
##  1st Qu.:0.0452000   1st Qu.:0.0000000   1st Qu.:0.0941   1st Qu.:0.3390  
##  Median :0.1930000   Median :0.0000024   Median :0.1250   Median :0.5370  
##  Mean   :0.2915353   Mean   :0.0559616   Mean   :0.1935   Mean   :0.5299  
##  3rd Qu.:0.4772500   3rd Qu.:0.0004630   3rd Qu.:0.2370   3rd Qu.:0.7262  
##  Max.   :0.9960000   Max.   :1.0000000   Max.   :1.0000   Max.   :0.9930  
##  NA's   :2           NA's   :2           NA's   :2        NA's   :2       
##      Tempo        Duration_ms     
##  Min.   :  0.0   Min.   :  30985  
##  1st Qu.: 97.0   1st Qu.: 180010  
##  Median :120.0   Median : 213284  
##  Mean   :120.6   Mean   : 224718  
##  3rd Qu.:139.9   3rd Qu.: 252443  
##  Max.   :243.4   Max.   :4676058  
##  NA's   :2       NA's   :2

Selanjutnya kita akan mencari tahu apakah terdapat data kosong atau tidak dalam dataset yang kita punya menggunakan function ‘anyNA()’

anyNA(data_spotify)
## [1] TRUE

Karena output menuliskan “TRUE”, berarti kita memiliki data yang kosong. Untuk menelisik lebih dalam, kita dapat menggunakan fungsi ‘is.na()’ dan ‘ColSums()’

colSums(is.na(data_spotify))
##                X           Artist      Url_spotify            Track 
##                0                0                0                0 
##            Album       Album_type              Uri     Danceability 
##                0                0                0                2 
##           Energy              Key         Loudness      Speechiness 
##                2                2                2                2 
##     Acousticness Instrumentalness         Liveness          Valence 
##                2                2                2                2 
##            Tempo      Duration_ms 
##                2                2

4th Step, Answering Business Question!

Setelah itu, untuk mempermudah data exploration (sesuai dengan tujuan pembuatan RMD ini), maka saya telah menyiapkan beberapa business question untuk dijawab.

First Question

1). Spotify ingin bekerja sama dengan salah satu Dance Company ternama untuk membuat acara event tarian. Berikan 10 pilihan lagu terbaik berdasarkan skor ‘Danceability’ kepada panitia agar dapat membuat keputusan! Tampilkan kolom “Artist”, “Url_spotify”, “Track”, dan “Danceability” saja!

data_spotify_event <- data_spotify[order(-data_spotify$Danceability), 
                                   c("Artist", "Url_spotify", "Track", 
                                     "Danceability")]
head(data_spotify_event, n = 10)

Second Question

  1. Apa saja lagu Taylor Swift yang dimuat dalam dataset tersebut?
data_TaylorSwift <- data_spotify[data_spotify$Artist == "Taylor Swift", ]
data_TaylorSwift

Third Question

  1. Spotify bekerja sama dengan Grammy Awards untuk menampilkan musisi-musisi secara akustik. Berikanlah 8 rekomendasi lagu yang sangat cocok untuk ditampilkan secara akustik! Tampilkan kolom “Artist”, Track”, “Uri”, dan “Acousticness” saja!
data_spotify_grammy <- data_spotify[order(-data_spotify$Acousticness), 
                                    c("Artist", "Track", "Uri", "Acousticness")]
head(data_spotify_grammy, n = 8)

Fourth Question

  1. Menggunakan dataset awal: data_bank, buatlah dataset yang berisi data-data dari YouTube saja. Berikan nama = data_youtube. Lalu temukan 6 video yang memiliki likes terbanyak (beri nama data_youtube_like)!
# buat dataset data_youtube terlebih dahulu
data_youtube <- subset(data_bank, 
                       select=c(Url_youtube, Title, Channel, Views, Likes, 
                                Comments, Description, Licensed, official_video,
                                Stream))
head(data_youtube)
# ubah tipe data kolom 'Licensed' dan 'official_video' menjadi Logicals.
data_youtube$Licensed <- as.logical(data_youtube$Licensed)
data_youtube$official_video <- as.logical(data_youtube$official_video)
data_youtube_like <- data_youtube[order(-data_youtube$Likes),]
head(data_youtube_like, n = 6)

Fifth Question

  1. Lakukanlah visualisasi dengan boxplot untuk mengetahui apakah ada outlier atau tidak dan statistika deskriptif (mean, median, mean, max, 1st and 3rd quartile) dari jumlah views yang di dapat oleh video-video pada data_youtube_like!
boxplot(data_youtube_like$Views)

Dari visualisasi tersebut, diketahui bahwa terdapat outlier atas yang nilainya mencapai 8 miliar.

summary(data_youtube_like$Views)
##      Min.   1st Qu.    Median      Mean   3rd Qu.      Max.      NA's 
## 0.000e+00 1.826e+06 1.450e+07 9.394e+07 7.040e+07 8.080e+09       470

Sixth Question

  1. Lakukanlah visualisasi dengan boxplot untuk mengetahui statistika deskriptif dari jumlah like yang di dapat oleh video-video pada data_youtube_like!
boxplot(data_youtube_like$Likes)

Bisa kita lihat kembali bahwa terdapat outlier atas pada data.

summary(data_youtube_like$Likes)
##     Min.  1st Qu.   Median     Mean  3rd Qu.     Max.     NA's 
##        0    21581   124481   663341   522148 50788652      541

Thank you!

Sekian hasil visualisasi dan pengolahan data yang dapat saya sampaikan. Hope you like it! :)

Salam, Brigitta Carmen