Spotify APIで遊ぶ 応用編
spotipy(spotify APIのpythonライブラリ)の音響特徴量抽出を使った試みを紹介します。私以外の人にとっておもしろいかどうかはわからないのですが、あくまでその方法をメモとして残しておきます。
前回の記事はこちら
楽曲の音響特徴量によって同一系列のアイドルグループを定量的に比較
どんなアイドルグループにも個性というものがあります。しかしファンとして熟達しなければその個性には気づけません。定量的なデータから個性を可視化することができれば、それが自分の「推し」を決める手がかりになるかもしれません。spotipyはそのためのデータを提供してくれます。
今回は『ラブライブ!』シリーズに属する5つのグループがリリースしている楽曲から音響特徴量を抽出し、それをグループ間で比較してみます。材料選定の理由は簡単で、私がラブライブ好きだからです。
データの概要
『ラブライブ!』シリーズは複数の作品から構成されており、それぞれに主役となるグループが1つあります。今回分析対象としたグループは、活動を開始した順に以下の5つです(『』内は作品名)。①μ's『無印』、②Aqours『サンシャイン!!』、③虹ヶ咲学園スクールアイドル同好会『同名』、④Liella!『スーパースター!!』、⑤蓮ノ空女学院スクールアイドルクラブ『同名』。
分析に利用する楽曲の条件は、spotifyにおいて上に挙げた5グループのうちいずれかの名義で登録されていることです(つまり個人曲やサブユニット曲は除外しています)。なおデータは2023年8月時点のものです。
前回の記事で紹介した方法によりゴリ押しで楽曲データを抽出していきます。抽出したデータをcsvファイルに保存しておきます。
分析
前処理
あれだけ説明しておきながら私はpythonが得意ではないので、ここからの分析にはRを使用します(別にRにも自信があるわけではありませんが)。分析とはいってもデータを可視化する程度でそんなに難しいことはやりません。
まずはさっきのファイルを読み込んで要約してみます。このデータセットは公開していないので実践する際はご自身のデータを使ってください。
あとライブラリtidyverseを使えるようにしておきます。
ll <- read.csv("lovelive.csv", encoding = "utf-8")
library(tidyverse)
dim(ll)
table(ll$artist)
colnames(ll)
## 179 24
## Aqours Liella! μ's 虹ヶ咲 蓮ノ空
57 46 48 25 3
## "artist" "artist_code" "track_name" "meaningful"
"url" "danceability" "energy" "key"
"loudness" "mode" "speechiness" "acousticness"
"instrumentalness""liveness" "valence" "tempo"
"type" "id" "uri" "track_href"
"analysis_url" "duration_ms" "time_signature" "popularity"
データセットが179行24列からなることがわかります。179曲が抽出され、それぞれに24の変数が与えられているということです。これはspotipyからの出力そのままではなく、分析のために私が勝手に加えた変数もいくつか含まれています。例えば「各楽曲が私自身にとってどれほど意味深いか」を評定した値(meaningful)が加えられています。
グループごとの楽曲の数も出力されました。虹ヶ咲はグループではなくメンバーのソロ活動に重きが置かれているため、蓮ノ空は(当時は)まだ活動を開始してから数か月しか経っていなかったために、他のグループよりも楽曲数が少ないと思われます。
後で可視化がしやすいようにアーティスト名をファクター型に変換しておきます。これで前処理は終了です。
ll <- ll %>%
transform(artist = factor(artist, levels = c("μ's", "Aqours","虹ヶ咲","Liella!","蓮ノ空")))
比較
まずは「danceability」のグループごとの平均値を比較してみます。
a <- ll %>% dplyr::filter(artist == "μ's")
b <- ll %>% dplyr::filter(artist == "Aqours")
c <- ll %>% dplyr::filter(artist == "虹ヶ咲")
d <- ll %>% dplyr::filter(artist == "Liella!")
e <- ll %>% dplyr::filter(artist == "蓮ノ空")
mean(a$danceability)
mean(b$danceability)
mean(c$danceability)
mean(d$danceability)
mean(e$danceability)
## 0.506375
## 0.5184211
## 0.53608
## 0.576
## 0.5416667
グループ間に差が出てくれることを期待していたのですが、そういう意味ではあまり面白い結果ではないですね。
それはともかく、この数値を可視化してみましょう。
fig.danceability = ggplot(ll, aes(x=artist, y=danceability))+
geom_violin(aes(color=artist), trim=FALSE)+
geom_boxplot(width=0.1,fill="white", outlier.color=NA) +
geom_jitter(size=0.3, width=0.1, alpha=0.3, aes(color=artist)) +
stat_summary(fun=mean, geom="point", shape = 16, size=2, aes(color=artist))+
stat_summary(fun=mean, geom="point", shape=16, size=2, aes(color=artist))+
theme(plot.background = "white")+
ylim(0,1)+
theme_classic()
fig.danceability
やはり平均値や中央値に大きな差はなさそうです。一方、ばらつきの大きさはグループごとに違っています。Liella!の楽曲は他のグループに比べてdanceabilityのバラエティが豊かであるといえそうです。
では他の指標も可視化してみましょう。
平均値・中央値は驚くほど均一です。強いていうならliella!はdurationが少し短めでしょうか。
meaningfulは、各楽曲が私にとってどれほど意味深いかの評定値です。この項目に関しては虹ヶ咲と蓮ノ空が高くなっています。その理由は簡単で、私が虹ヶ咲推しだからです。あと蓮ノ空はまだリリースされた曲が少なく、私がほぼ全曲を把握できているために現時点では高い意味深さを保っていると考えられます。
ばらつき具合をみると、danceability、energy、loudness、acousticnessにおいてliella!が飛びぬけています。とにかくliella!の楽曲は他のグループと少し異なる傾向を示すようです。これについてはいくらでも解釈の余地があるのですが、それゆえに紙面が足りないので割愛します。
まとめ
今回はspotipyから抽出された音響特徴量を同一系列のグループ間で比較する方法を紹介しました。次のステップとして、楽曲の「意味深さ」を各特徴量から予測するモデルを検討してみてもおもしろそうです。
せっかく大規模なデータが利用可能なので、趣味にとどまらず心理学研究にも活用できそうです。具体的にはこんな事例↓があります。
ただ本格的に活用するとなると利用規約が絡んでくるので、その辺はきちんと考える必要があります。
アイドルグループの個性を定量化するというと少し味気なく聞こえるかもしれません。実際には音響以外にも歌詞やメンバーなど様々な要因の相互作用によって個性というものは成り立っています。しかし、数多のアイドルグループが割拠するこの国において、自分の推しを見出すアプローチとしてのspotipyにも一考の余地はあると思います。
この記事が気に入ったらサポートをしてみませんか?