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
- Apa saja lagu Taylor Swift yang dimuat dalam dataset tersebut?
data_TaylorSwift <- data_spotify[data_spotify$Artist == "Taylor Swift", ]
data_TaylorSwiftThird Question
- 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
- 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
- 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
- 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