セーターの備忘録

大学編入やIT関連の内容を記していく予定です

Spotify APIを使って好きなアーティストの曲を分析する

普段から利用しているSpotifyAPIがあり,また全ての曲に様々な情報が付与されていることを知り,せっかくなので好きなアーティスト (TrySail) の分析をしてみることにしました.

目次

概要

Spotifyは定額制の音楽ストリーミングサービスです.登録されている曲にはそれぞれ多くの情報が付与されており,Spotify APIを使うことで情報を取得することができます.
他の方が行っている分析を見ると,多くがSpotiyの人気曲を見ることができるSpotify ChartsからCSVをダウンロードして行っていましたが,せっかくなので自分の好きなアーティストの分析を行うことにしました.

今回はTrySailに関する分析を行いました.TrySail麻倉ももさん,雨宮天さん,夏川椎菜さんの3人で構成されている声優ユニットで,ユニットの活動の他にそれぞれソロ活動でも多くの曲を提供されています. TrySailと3人それぞれのソロの曲を分析することで,それぞれの特徴やユニットとソロでの違いについて調査してみました.

手順

API keyの取得

API keyはSpotify for Developersから発行します.ページ内で事前に登録してあるSpotifyアカウントを用いてログインした上でDASHBOARDに行くと,CREATE A CLIENT IDというボタンがあるので,ここで必要な情報を入力することでOAuth2認証に必要となるCliend IDとClient Secretを取得することができます.

Spotipyのインストール

PythonSpotify APIの操作をできるようにするため,Python用ライブラリのSpotipyをインストールします.

$ pip install spotipy

アーティストの曲情報を取得

まず,下のような形でClient IDとClient Secretを記述し,Spotifyから情報を受け取れるようにします.

import pandas as pd
import spotipy
from spotipy.oauth2 import SpotifyClientCredentials
import json
import matplotlib.pyplot as plt
import seaborn as sns
sns.set()

client_id = 'xxxxxxxxxx'
client_secret = 'xxxxxxxxxx'

client_credentials_manager = spotipy.oauth2.SpotifyClientCredentials(client_id, client_secret)
spotify = spotipy.Spotify(client_credentials_manager=client_credentials_manager)

次に,任意のアーティストから曲情報を取得します.
まず# search artist and song idで任意のアーティストを検索し,そのtrack情報を取得します.次に取得した情報の中にある各曲が持つidを基に# get song informationで曲情報を取得します.# drop unnecessary informationでは後で分析しやすいように必要のない情報を削除しています.

# search artist and song id
search = spotify.search("[Artist name]", limit=50, offset=0, type='track', market=None)
song = pd.DataFrame.from_dict(search["tracks"]["items"])
song_name = pd.DataFrame(song["name"])
song = pd.DataFrame(song["id"])

# get song information
song_info = pd.DataFrame()
for url in song["id"]:
    df = pd.DataFrame.from_dict(spotify.audio_features(url))
    song_info = song_info.append(df)

# drop unnecessary information 
song_info = song_info.reset_index(drop=True)
song_info_all = pd.concat([song_name, song_info], axis=1)
song_info = song_info.drop(columns=["analysis_url","id","track_href","type","uri"])

Analysis

取得できる情報

各曲には,以下のような情報が付与されています(上で削除したidやurlなどを除く).今回はこれらの情報について分析を行いました.

KEY VALUE DESCRIPTION
acousticness 音響的かどうかの信頼度を0.0~1.0で表す.
danceability 踊りやすさに対する適合度を0.0~1.0で表す.
duration_ms 曲の長さ.
energy 1.0に近いほどエネルギッシュな曲であり,速く・大きく・騒々しく感じる.
instrumentalness 1.0に近いほどボーカルコンテンツが含まれていない可能性が高い.
key 12個の調性 (C, Db, D, ..., B) を0~11に表したもの.
liveness 曲のライブっぽさ.1に近いほどライブ音源の可能性がある.
loudness デジベル (dB).基本的に-60~0dBの範囲.
mode 長調なら1,単調なら0で表す.
speechiness ボーカルの話している感を表す.0.66以上なら話している感が強く,0.33~0.66なららっミュージックを含む会話と音楽の間,0.33未満なら音楽感が強い.
tempo BPM
time_signature 推定拍子
valence 感情軸の一つ.1.0に近いほど幸せ・陽気・幸福感などポジティブに聞こえ,0に近いほど悲しい・落ち込んでいる・怒っているなどネガティブに聞こえる.

取得した曲

上記の手法で曲の取得を行いましたが,上手く全ての曲を取得することができませんでした.なんでだ…… 今回取得・分析した曲は以下の通りです.特に雨宮天さんに関しては曲の被りが入ってしまったほか,本人名義ではなく声優としてのキャラ名義の曲が多くなってしまいました.
また,TrySail麻倉もも夏川椎菜さんの曲は英語またはローマ字に変換されて管理されていた一方,雨宮さんの曲は日本語で管理されていました.
麻倉さんのエイムや雨宮さんの曲から予想すると,本人名義ではなく声優のキャラとして歌っている曲は日本語で管理されている,もしくは本人名義の曲は英語・ローマ字で管理されているような気がします.曲提供元のレーベルなんかも関係しているのでしょうか……?

Num. TrySail Shiina Natsukawa Momo Asakura Sora Amamiya
0 Adrenaline!!! gravity - Album Mix エイム 最高速 Fall in Love
1 High Free Spilits Labli-Lubla Koino Prelude 奏(かなで)
2 Azure Cheer Me Cheer You Fanfare!! Da-Da-Dash!
3 Senpai Daisy Days - Album Mix Travely Time 最高速 Fall in Love - ミーアver.
4 Original Parade Tokubetsu Ichiban!! 最高速Fall in Love
5 Kakawari Yellow Flag Hanani Akai Ito My Sweet Feelings
6 Truth. Sutetekureba Run for You キスミーだぁりん▽
7 BraveSail Kimitoglide Pumpkin Meat Pie My Sweet Feelings
8 Tail Wind Naimonobakari No Distance Da-Da-Dash!
9 Coding Shimaebaii Colorful 最高速 Fall in Love - I strumental
10 Wanted Girl Fuwari, Korori, Karan, Koron Ashitawa Kimito キスミーだぁりん▽
11 Try Again First Plot Zuttokimino kotogasukinandesu. キスミーだぁりん▽
12 Chip Log Grapefruit Moon - Album Mix Hoshizorao Omoeba キスミーだぁりん▽ - Instrumental
13 Disco Good Job! Da-Da-Dash! - Instrumental
14 Bang!Bang!Banzai!!! 奏(かなで) - TV size ver.
15 Make Me Happy? 奏(かなで) - Instrumental
16 Bokurano Symphony Skyreach (Originally Performed by 雨宮天アカメが斬る!...
17 Take a Step Forward
18 Sunset Kung Fu
19 Journey
20 Believe
21 Mirai Curation
22 Sampomichi
23 Matane.
24 High Free Spirits (Originally Performed by Try...)

相関分析

まず,ピアソンの相関係数を用いてそれぞれ相関分析を行いました.

f:id:resweater:20190712105341p:plain
Trysail
f:id:resweater:20190712105406p:plain
3人それぞれの分析
ソロの分析では,麻倉さんと雨宮さんはいずれもすべての曲の拍子が同じだったため,time_signatureは空白になっています. 結果を比較すると,強弱の差はありますがユニット・ソロ問わず似た傾向が見受けられました.例として,

正の相関

  • danceability × valence
  • acousticness × instrumentalness
  • energy × loudness

負の相関

  • danceability × tempo
  • danceability × speechiness
  • acousticness × energy

などが挙げられます.エネルギッシュさと力強さなど,言われればその通りだなというような関係が正しく示されていることが確認できました.
また,TrySailのユニットとしての分析結果を見ると,強い相関が表れている部分が左上に偏っていることが分かります.

ヒストグラム

次に,ヒストグラムでそれぞれの分布を見てみました.

f:id:resweater:20190712124545p:plain
Trysailヒストグラム
f:id:resweater:20190712134441p:plain
3人それぞれのヒストグラム

結果として,それぞれ個性の出る結果となりました.
まずTrySailの結果を見ると,先ほど負の相関が確認できたacousticnessが0に近いものが多く,energyが1に近いものが多いという結果が見られました.また,loudnessは0に近いものが多くなっています.このことから,TrySailとしての曲にはアコースティック感が弱く,にぎやかでエネルギッシュな曲が多いと言えます.また,valenceは幅広く分布しており,様々な感情的印象を与える曲があるということが言えます.

次にソロの結果を見ると,3人ともTrySailと同様acousticnessが0に近いものが多く,energyが1に近いものが多く,Loudnessは-5より大きいものが多いという傾向が見られました.
個別で見ると夏川さんは独自性が強く,実際にはInstrumentalの曲は存在しませんが,instrumentalnessでは幅広く分布しており,歌としてよりも音楽としての傾向が強い曲も多いのではないかと考えられます.また,dancebilitylivenessは高いものが多く,tempoもBPM125~200前後と比較的早いことから,ライブ向きのノリやすい曲が多いのではないかと推測できます. さらに,valenceは0.6前後に集中して分布しており,感情軸で見たとき中性的な曲が多いと推測できます.
麻倉さんや雨宮さんはspeechinessが非常に小さい範囲に分布しており,喋りっぽさが非常に小さい曲が多いことが分かります.また,valenceは広く分布しており,様々な感情的印象を与える曲があることがわかります.

各曲のvalenceの分析

それぞれの曲についても分析を行いました.ここでは,valenceの結果について記載します.

f:id:resweater:20190712141005p:plain
TrySailの曲のvalence
f:id:resweater:20190712141052p:plain
夏川椎菜さんの曲のvalence
f:id:resweater:20190712141123p:plain
麻倉ももさんの曲のvalence
f:id:resweater:20190712141145p:plain
雨宮天さんの曲のvalence

曲ごと見てみましたが,こういう曲がvalence値高いみたいな傾向を見つけることはできませんでした……ただ,やはり夏川さんはユニットの時や他の二人と比べて値が低いネガティブな曲が無いようです.どうやってvalence値を決めているのか気になる……

上記以外の分析結果

ここに載せた以外に大きく見られた特徴として,以下のようなことが分かりました.

  • TrySailの「またね。」はacousticnessが0.528と高い.
  • TrySailの「Truth.」はlivenessが0.8000と高い.
  • 夏川さんのステテクレバーはlivenessが0.87と高い.
  • 夏川さんのラブリリブラ・ナイモノバカリ・シマエバイイはinstrumentalnessが0.6以上で高い.

まとめ

分析の結果をまとめると,以下のことが言えます.

  • TrySailはユニット・ソロ問わずアコースティックが弱く,エネルギッシュな曲が多い.
  • 夏川椎菜さんの曲は他の二人やユニットの曲に対して比較的独自性が強く,ライブ向きの曲が多い.

ユニットとソロを比較した際,それぞれ傾向や特徴が出るのかと思っていましたが,予想に反して2人はユニット時と近い傾向という結果になりました.
ただ,これはあくまでSpotifyが用意したデータでの評価であり,実際聞いていると麻倉ももさんと雨宮天さんも大きく異なる曲を持っているように感じるので,評価指標や評価方法によって結果が変わることが予想されます.
さらに,今回取得できなかった曲が多くあったほか,雨宮天さんだけ声優としてのキャラ名義の曲が多くなってしまったなど,正確な比較検証ができたとは言いにくい結果であったため,そのあたりも改善できれば良かったかなと思います.

プログラム・分析詳細

今回のプログラム及び細かい分析データはGitHubに記載しています.

github.com

参考文献