Yine Yeni Yeniden 90’lar mı? R ile Spotify API kullanımı

R Turkce

Örnekli açıklama.

Mine Dogucu https://minedogucu.com
2020-10-22

Bir yıl öncesine kadar hiç Türkçe podcast dinlememiştim. Bir arkadaşımın tavsiyesi üzerine Yine Yeni Yeniden 90’lar podcast’ini geçen seneden beri düzenli olarak dinliyorum. Çok yakın zamanda birinci yılını kutlayan bu podcast ekibine sanal hediye amaçlı ve de R kullanıcılarına ek bir örnek olması açısından bu yazıyı yazıyorum. Kuir ve feminist akadamisyenlerin gözünden 90’ları müzik üzerinden ele alan bu podcastten çok şey öğreniyorum. Hafızamın kara delik gibi yuttuğu birçok şeyi hatırlamamı ve birçok şeyi 90’lardaki algımdan farklı yorumlamamı sağlıyor bu podcast. Burada amacım aslında R’da Spotify API’nın kullanımı ve birkaç veri temizleme fonksiyonuna örnek vermek. Müptelası olduğum bu podcasti de örneklerime alet ediyorum. Yanıtlamaya çalışacağımız soru şu: bu podcastte hep 90’lardan mı bahsediliyor?Az Sonra!!! (Bunun 90’lar temalı Word Art ile yazıldığını hayal edebilirsiniz.) Öncelikle merak edenler için cevabı vereceğim daha sonra R’da nasıl bu soruyu yanıtladığımı adım adım anlatacağım.

Sonuç

İlker ve Sezgin podcastte bahsettikleri şarkıları Spotify’da şarkı listesi olarak sunuyorlar. Tabii aslında bahsettikleri bazı şarkılar bu listede yok ama amacımız R öğrenmek olduğu için bu eksik verileri şimdilik göz ardı edeceğiz. Şarkı listesinde bulunan şarkılara piyasaya sürüm yıllarına göre baktığımızda ortaya şöyle bir grafik çıkıyor.

Anlayacağınız üzere İlker ve Sezgin 90’lardan bahsederken aslında bir o kadar da 2000’lerden de bahsediyor. Mesela 90’larda çıkan bir şarkının 2000 yılında yapılan coverını ele almaları gibi. Özellikle bir şarkının iki versiyonunu da analize dahil ettim.

R’da Spotify API’nı kullanma

Spotify API (Uygulama Programlama Arayüzü) ile iletişim kurmayı kolaylaştırmak adına geliştirilen spotifyr paketinden yararlanacağız. Bu paket Spotify API ile çalışmak için birçok fonksiyon sunuyor. Paketin fonksiyonlarına websitesinden göz atabilirsiniz.

Paketin geliştirme sürümünü devtools paketi ile GitHub’dan indirebiliriz.

devtools::install_github('charlie86/spotifyr')

Daha sonra Spotify API’na bağlanmak için Spotify for Developers sitesinde hesap oluşturmanız gerekecek. Koşulları kabul ediyorsanız üye olup client id ve client secret alabilirsiniz. Aldığınız client id ve secret’ı sırasıyla aşağıdaki kodların argümanlarında xxxxx yerine yerleştirerek kodu yazın. Böylelikle kimlik doğrulamış olacaksınız.

Sys.setenv(SPOTIFY_CLIENT_ID = 'xxxxxxxxxxxxxxxxxxxxx')
Sys.setenv(SPOTIFY_CLIENT_SECRET = 'xxxxxxxxxxxxxxxxxxxxx')

spotifyr paketine el olarak tidyverse paketini de verileri düzenlemek için kullanacağız.

Ele aldığımız şarkı listesinin linki https://open.spotify.com/playlist/4qQSAfrLxpznWegevABsdY bu linkteki 4qQSAfrLxpznWegevABsdY kısmı şarkı listesinin etiket numarası. Bu etiket numarasını get_playlist_tracks() fonksiyonu ile kullandığımızda bu listedeki şarkılara ulaşabiliyoruz. API tek bir sorgulama en fazla 100 şarkı erişimi limiti var. Şarkı listesinde şu an 258 tane şarkı olduğu için üç seferde şarkı listesini oluşturacağız. Dikkat edilmesi gerekilen en önemli nokta, offset argumanı kaçıncı şarkıdan başlanması gerektiğini belirtiyor. Normalde R, 1 indexli bir dil fakat API 0 index’li. İlk şarkıdan başlamak için offset argümanına 0’a ayarlamak gerekiyor.

sarki_listesi_1 <- spotifyr::get_playlist_tracks("4qQSAfrLxpznWegevABsdY",
                                               limit = 100,
                                               offset = 0)

sarki_listesi_2 <- spotifyr::get_playlist_tracks("4qQSAfrLxpznWegevABsdY",
                                               limit = 100,
                                               offset = 100)

sarki_listesi_3 <- spotifyr::get_playlist_tracks("4qQSAfrLxpznWegevABsdY",
                                               limit = 58,
                                               offset = 200)

Önce 100er şarkıdan oluşan sarki_listesi_1 ile sarki_listesi_2 birleştirip daha sonra da sarki_listesi_3’ü birleştiriyoruz.

sarki_listesi <- full_join(sarki_listesi_1, sarki_listesi_2) %>% 
  full_join(sarki_listesi_3)

Elimizde 258 şarkıdan ve 40 değişkenden oluşan veriseti var artık.

glimpse(sarki_listesi)
Rows: 258
Columns: 40
$ added_at                           <chr> "2020-09-08T13:27:54Z", …
$ is_local                           <lgl> FALSE, FALSE, FALSE, FAL…
$ primary_color                      <lgl> NA, NA, NA, NA, NA, NA, …
$ added_by.href                      <chr> "https://api.spotify.com…
$ added_by.id                        <chr> "1171279189", "117127918…
$ added_by.type                      <chr> "user", "user", "user", …
$ added_by.uri                       <chr> "spotify:user:1171279189…
$ added_by.external_urls.spotify     <chr> "https://open.spotify.co…
$ track.artists                      <list> [<data.frame[1 x 6]>, <…
$ track.available_markets            <list> [<"AD", "AE", "AL", "AR…
$ track.disc_number                  <int> 1, 1, 1, 1, 1, 1, 1, 1, …
$ track.duration_ms                  <int> 256924, 188693, 264693, …
$ track.episode                      <lgl> FALSE, FALSE, FALSE, FAL…
$ track.explicit                     <lgl> FALSE, FALSE, FALSE, FAL…
$ track.href                         <chr> "https://api.spotify.com…
$ track.id                           <chr> "26DfhJckznayKmojjhhhaZ"…
$ track.is_local                     <lgl> FALSE, FALSE, FALSE, FAL…
$ track.name                         <chr> "Yaşlanıyoruz", "Aldatıl…
$ track.popularity                   <int> 11, 31, 34, 36, 27, 7, 7…
$ track.preview_url                  <chr> "https://p.scdn.co/mp3-p…
$ track.track                        <lgl> TRUE, TRUE, TRUE, TRUE, …
$ track.track_number                 <int> 1, 1, 2, 1, 1, 1, 5, 5, …
$ track.type                         <chr> "track", "track", "track…
$ track.uri                          <chr> "spotify:track:26DfhJckz…
$ track.album.album_type             <chr> "single", "album", "albu…
$ track.album.artists                <list> [<data.frame[1 x 6]>, <…
$ track.album.available_markets      <list> [<"AD", "AE", "AL", "AR…
$ track.album.href                   <chr> "https://api.spotify.com…
$ track.album.id                     <chr> "2RGBM88vaA3YCOounHaGVW"…
$ track.album.images                 <list> [<data.frame[3 x 3]>, <…
$ track.album.name                   <chr> "Yaşlanıyoruz", "Rengin"…
$ track.album.release_date           <chr> "2020-03-13", "1991-04-2…
$ track.album.release_date_precision <chr> "day", "day", "day", "da…
$ track.album.total_tracks           <int> 1, 11, 12, 10, 4, 4, 11,…
$ track.album.type                   <chr> "album", "album", "album…
$ track.album.uri                    <chr> "spotify:album:2RGBM88va…
$ track.album.external_urls.spotify  <chr> "https://open.spotify.co…
$ track.external_ids.isrc            <chr> "DELJ82099903", "TR16706…
$ track.external_urls.spotify        <chr> "https://open.spotify.co…
$ video_thumbnail.url                <lgl> NA, NA, NA, NA, NA, NA, …

İlk önce select() fonksiyonunu kullanarak kullanacığımız değişkenleri seçeceğiz. Daha sonra rename() fonksiyonu ile değişkenleri Türkçe olarak isimlendireceğiz.

sarki_listesi <- sarki_listesi %>% 
  select(track.name, 
         track.album.name,
         track.album.release_date) %>% 
  rename(sarki = track.name,
         album = track.album.name,
         surum_tarihi = track.album.release_date)

Şimdi elimizde daha küçük bir veri seti var.

glimpse(sarki_listesi)
Rows: 258
Columns: 3
$ sarki        <chr> "Yaşlanıyoruz", "Aldatıldık", "Vurula Vurula",…
$ album        <chr> "Yaşlanıyoruz", "Rengin", "Günaha Davet", "Din…
$ surum_tarihi <chr> "2020-03-13", "1991-04-26", "1998-08-11", "199…

Şarkıların piyasaya sürüm tarihine baktığımızda bunların bazen yıl olarak bazen de yıl-ay-gün olarak kaydedildiğini göreceğiz. Yıl bazında analiz yapacağımız için stringr::str_sub() kullanıp bu değişkendeki ilk 4 karakteri, yani yılı seçeceğiz. Bu değişken karakter fakat bunu numeric olarak değiştireceğiz.

sarki_listesi$surum_tarihi <-
  sarki_listesi$surum_tarihi %>% 
  stringr::str_sub(1,4) %>% 
  as.numeric()

Veri setimiz hazır olduğuna göre verileri görselleştirebiliriz.

ggplot(sarki_listesi, aes(x = surum_tarihi)) +
  geom_bar(fill = "skyblue2") + 
  coord_flip() + # çubuk grafiğini yataylaştırma
  theme_bw() + # ggplotun temasını değiştirme
  labs(y = "Bahsedilen şarkı sayısı",
       x = "Bahsedilen şarkının piyasaya sürüm yılı",
       title = "Yine Yeni Yeniden 90'lar Podcastinin Şarkı Listesinin Analizi") + # eksen etiketlerini belirleme
  theme(text = element_text(size = 14))