はじめに
ご訪問いただきありがとうございます。本記事ではSpotifyのAPIを利用しPythonで音楽のデータを入手していく操作方法について解説していきます。Spotifyの音楽データにご興味のある方のご参考になればと思います。この操作を通じてPythonの基本的な使い方もいっしょに開設していきます。それではいってみましょう。世界中のユーザーは、どんな音楽に夢中になっているんでしょうね。
なお、Pythonを中高年が基礎から最速独学で学ぶ方法を別の記事でまとめていますので、よろしければご覧ください。>> 中高年の為の挫折しない最短のPython,AI・機械学習のおすすめ学習方法
>> 中高年がAI・機械学習を学ぶ為のプログラミングスクール 主要8校を徹底比較
手順
- Spotify charts からお好きな国のTOPチャート200をダウンロード
- Spotify for Developperからclient_idとclient_secretを入手
- PythonでSpotify APIを通して詳細データを入手
- 各国データを統合する
1.Spotify charts からお好きな国のTOPチャート200をダウンロードする方法
チャート画面では①のGLOBALのボタンからFilter機能で国、その右側のボタンでDAILY or WEEKLY、さらにその右側には日付のボタンがありますので(2017/1/1からあります)確認したい日付を選択します。TOP200は 、最もストリーミング再生された曲をランク付けしたもの。VIRAL50は、ストリーミング再生やリスナーのシェア数を分析してランク付けしたもので、純粋にファンが聴いて共感共有した音楽のデータになります。ここでは、TOP200のデータを入手していきます。
②の画面右上の「DOWNLOAD TO CSV」をクリックすると下図が現れダウンロードが開始されます
以下はダウンロードされたCSVファイルの中身です。には、Position(順位)、Track Name(曲名)、Artist(アーティスト名)、streams(ストリーミング回数)、URL(ここが重要!曲の情報が詰まっています)の情報が入っています。
2.Spotify for Developerからclient_idとclient_secretを入手する方法
さきほどダウンロードしたリストからURLをキーとして曲の情報を得るためには、client_idとclient_secretが必要になりますので、まずはSpotify Developerのページに入ります。
画面上ヘッダーにあるDASHBOARDをクリックします。
初めての方は、下図の矢印のSign up for a free Spotify account here. をクリックします。
すると下図のような画面になります。わたしはすでに「mahara」というAppを作成していますが、初めての方の場合には何もありませんので、矢印のCREATE AN APPをクリックし新しいAppをつくります。
CREATE AN APPの画面では①App nameに任意の名前を入力します。そして ②の App description に作成しようとしているAppが何であるか説明を入力します。ただ今回の場合はAppをつくることが目的ではないので”test”と入力します。そして③にチェックを入れ、④のCREATEボタンをクリックします。
すると、DASHBOARD画面では、矢印の通りClient_IDとClient Secret が現れます。このデータがこの後の情報を入手するために必要なものになります。
デフォルト画面ではClient Secretは隠れているので「SHOW CLIENT SECRET」をクリックすると現れますよ。
3.PythonでSpotify APIを通して詳細データを入手する方法
つづいていよいよ、URLをキーとして一番最初に入手した曲の詳細情報を入手していきます。準備として、Pythonのライブラリ「spotipy」をインストールしておきましょう。間違ってspotifyと入力しないようにね。私は間違えてしまいました。パイですよパイ。
pip install spotipy
初めに、あらかじめ入手しておいたclient_id,client_secretをコード中の****に入力してspotifyのデータにアクセスできるようにします。
import pandas as pd
import spotipy
from spotipy.oauth2 import SpotifyClientCredentials
import json
client_id = '************************************' # あらかじめ入手したclient_id
client_secret = '********************************' # あらかじめ入手したclient_secret
client_credentials_manager = spotipy.oauth2.SpotifyClientCredentials(client_id, client_secret)
spotify = spotipy.Spotify(client_credentials_manager=client_credentials_manager)
1.で入手したTOP200データを読み込みます
songs = pd.read_csv("regional-jp-daily-latest.csv",header=1)
songs.head()
上記で入手したデータ中にあるURLデータを元に曲の詳細情報を入手しsong_infoに格納します。
song_infoという空の箱を用意しておきます。そしてfor文で曲ごとのURLから特徴を取り出しsong_infoに格納していきます。
song_info = pd.DataFrame()
for url in songs["URL"] :
df = pd.DataFrame.from_dict(spotify.audio_features(url))
song_info = song_info.append(df)
song_info.head()
song_info=song_info.reset_index(drop=True)
song_info.head()
idやuriなど解析に不要なものは削除しておきます。
song_info = song_info.drop(["id","uri","track_href","analysis_url"],axis=1)
1.で入手した曲の基本データと2.で入手したsong_infoの詳細データを合体させて一つのファイルとします。
pd.concat([songs, song_info], axis=1).to_csv("songs_jp_top200.csv")
国別に解析を進めたいので、国名の列を追加しcsvファイルに落とし込みます。
songs_200 = pd.read_csv("songs_jp_top200.csv")
songs_200["C"] = "JP"
songs_200.to_csv("songs_jp_top200.csv")
4.各国データを統合する方法
glob関数を使ってファイルを簡単に結合していきます。一つ一つを結合するとなると相当大変な作業になりますが、glob関数を用いることで簡単に複数のファイルを結合することができます。まずは必要なライブラリをインポートします。globは引数に指定されたパターンに合うファイルパス名を取得することができます。
import pandas as pd
import glob
あらかじめ3で入手したデータを格納したフォルダを用意しておき、そのファイルを下記コードで合体させていきます。一つ一つ結合するのも手間ですので非常に便利ですよね。
# パスで指定したファイルの一覧をリスト形式で取得. (ここでは各国top200フォルダ内)
csv_files = glob.glob('各国top200/*.csv')
#読み込むファイルのリストを表示
for a in csv_files:
print(a)
#csvファイルの中身を追加していくリストを用意
data_list = []
#読み込むファイルのリストを走査
for file in csv_files:
data_list.append(pd.read_csv(file))
#リストを全て行方向に結合
#axis=0:行方向に結合, sort
df = pd.concat(data_list, axis=0, sort=True)
df.to_csv("各国top200/world_top200.csv",index=False)
ちなみに私は28か国のデータを入手して、world_top200.csvにまとめてみましたよ♪
コード中にあるsongs_○○_top200.csvの○○に各国の略号が入っています。
各国top200\songs_ar_top200.csv
各国top200\songs_at_top200.csv
各国top200\songs_au_top200.csv
各国top200\songs_be_top200.csv
各国top200\songs_br_top200.csv
各国top200\songs_cl_top200.csv
各国top200\songs_cr_top200.csv
各国top200\songs_de_top200.csv
各国top200\songs_eg_top200.csv
各国top200\songs_es_top200.csv
各国top200\songs_fr_top200.csv
各国top200\songs_hk_top200.csv
各国top200\songs_il_top200.csv
各国top200\songs_in_top200.csv
各国top200\songs_it_top200.csv
各国top200\songs_jp_top200.csv
各国top200\songs_kr_top200.csv
各国top200\songs_mx_top200.csv
各国top200\songs_nl_top200.csv
各国top200\songs_no_top200.csv
各国top200\songs_pt_top200.csv
各国top200\songs_ru_top200.csv
各国top200\songs_sa_top200.csv
各国top200\songs_se_top200.csv
各国top200\songs_tw_top200.csv
各国top200\songs_uk_top200.csv
各国top200\songs_usa_top200.csv
各国top200\songs_za_top200.csv
以下が入手したデータの一部になります。無事にsong_infoのデータが結合され28ヶ国のTOPチャート200曲の詳細情報を入手することが出来ました。
Artist | C | Position | Streams | Track Name | URL | Unnamed: 0 | Unnamed: 0.1 | acousticness | danceability | duration_ms | energy | instrumentalness | key | liveness | loudness | mode | speechiness | tempo | time_signature | type | valence |
Tiago PZK | AR | 1 | 577239 | Entre Nosotros | https://open.spotify.com/track/6w8yBI2vthyN9UnwO4UBWb | 0 | 0 | 0.494 | 0.729 | 192353 | 0.513 | 1.10E-06 | 5 | 0.137 | -6.345 | 0 | 0.0455 | 170.064 | 3 | audio_features | 0.789 |
Emilia | AR | 2 | 574043 | Como Si No Importara | https://open.spotify.com/track/1GYJpuLq41vEVKXiHGEY9j | 1 | 1 | 0.467 | 0.843 | 173053 | 0.534 | 0 | 1 | 0.0984 | -6.658 | 0 | 0.142 | 94.984 | 4 | audio_features | 0.528 |
BANDIDO | AR | 3 | 518619 | No Me Conocen (Remix) [con DUKI, Rei & Tiago PZK] | https://open.spotify.com/track/7COGuXyTr12KvdaYXMqheC | 2 | 2 | 0.281 | 0.769 | 280274 | 0.812 | 2.63E-05 | 1 | 0.0781 | -2.088 | 0 | 0.0825 | 180.003 | 4 | audio_features | 0.926 |
MYA | AR | 4 | 486328 | 2:50 Remix | https://open.spotify.com/track/74znaWw1hmQBusGPSOuTFy | 3 | 3 | 0.112 | 0.818 | 231708 | 0.812 | 0 | 9 | 0.234 | -4.425 | 1 | 0.0475 | 139.966 | 4 | audio_features | 0.844 |
J Balvin | AR | 5 | 458941 | Quテゥ Mテ。s Pues? | https://open.spotify.com/track/6hf0RpxTbOprT5nnwzkk8e | 4 | 4 | 0.0261 | 0.891 | 217773 | 0.819 | 0.000354 | 8 | 0.173 | -3.964 | 1 | 0.106 | 101.968 | 4 | audio_features | 0.768 |
Bizarrap | AR | 6 | 433608 | Nicky Jam: Bzrp Music Sessions, Vol. 41 | https://open.spotify.com/track/03LfOYi0icz4souspZVVhq | 5 | 5 | 0.0913 | 0.627 | 158087 | 0.849 | 0 | 1 | 0.145 | -3.167 | 0 | 0.153 | 89.907 | 4 | audio_features | 0.818 |
Rauw Alejandro | AR | 7 | 389363 | Todo De Ti | https://open.spotify.com/track/5RwV8BvLfX5injfqYodke9 | 6 | 6 | 0.302 | 0.78 | 199604 | 0.719 | 0.000196 | 3 | 0.0931 | -3.613 | 0 | 0.0506 | 127.962 | 4 | audio_features | 0.336 |
TINI | AR | 8 | 354217 | Miテゥnteme | https://open.spotify.com/track/0cOa970mzTWAxKtltpkpLc | 7 | 7 | 0.161 | 0.85 | 165275 | 0.541 | 5.01E-06 | 2 | 0.286 | -4.522 | 1 | 0.0674 | 92.003 | 4 | audio_features | 0.916 |
Bad Bunny | AR | 9 | 348454 | Yonaguni | https://open.spotify.com/track/2JPLbjOn0wPCngEot2STUS | 8 | 8 | 0.276 | 0.644 | 206710 | 0.648 | 0 | 1 | 0.135 | -4.601 | 1 | 0.118 | 179.951 | 4 | audio_features | 0.44 |
Nio Garcia | AR | 10 | 301738 | AM Remix | https://open.spotify.com/track/05bfbizlM5AX6Mf1RRyMho | 9 | 9 | 0.114 | 0.743 | 261335 | 0.655 | 0 | 6 | 0.0764 | -5.015 | 0 | 0.159 | 172.031 | 4 | audio_features | 0.785 |
Rusherking | AR | 11 | 275624 | Bailando Te Conocテュ | https://open.spotify.com/track/0vvuIsoJ101Hme1VIXBIEi | 10 | 10 | 0.0392 | 0.848 | 194400 | 0.622 | 0 | 7 | 0.0879 | -3.652 | 1 | 0.0625 | 99.972 | 4 | audio_features | 0.558 |
Maria Becerra | AR | 12 | 274918 | Cazame | https://open.spotify.com/track/2LtTHIXTaFwvY9oLOThElU | 11 | 11 | 0.143 | 0.583 | 199592 | 0.458 | 0.00599 | 0 | 0.107 | -6.891 | 1 | 0.166 | 98.013 | 4 | audio_features | 0.295 |
入手した詳細情報とはいったい何がはいっているのでしょうか、入手できる情報は次のとおりです。これらを分析することで独自の解析ができそうですね。
特徴 | 意味 | 説明 |
acousticness | アコースティック感 | 0.0~1.0までの指標で値が大きいほどアコースティック感が強いということになります |
danceability | ダンスしやすさ | リズムやテンポからダンスがしやすいかどうかを表しています 0.0~1.0までの指標で、値が大きいほどダンスがしやすい曲になります |
duration_ms | 演奏時間 | 曲の長さ |
energy | エネルギッシュ感 | 0.0~1.0までの指標で値が大きいほど、エネルギーがあると判断されています。 |
instrumentalness | インスト感 | 0.0~1.0までの指標で楽器中心の音楽、いわゆるボーカルが含まれていない楽曲は値が大きくなります。 |
key | 曲のキー | 0 = C、1 = C♯/D♭、2 = D …11=Bを0~11で表したもの |
liveness | ライブ感 | オーディエンスの存在を検出します。数値が高いほどライブで演奏された可能性が高いことを表します。0.8 より大きい値は、ライブである可能性が高くなります |
loudness | 音圧 | 値は曲全体で平均化され、相対的な音圧を比較するのに役立ちます。値の範囲は -60 ~ 0 db です。音圧が大きいほどマイナス側になります |
mode | メジャーかマイナーか | 1がメジャー、0がマイナーの曲になります |
speechiness | スピーチ感 | 例えば、トークショー、オーディオブック、詩などは、1.0に近くなります。 の値は、ラップ などは、0.33 ~ 0.66になります |
tempo | 曲のテンポ | BPM。高いほど曲のテンポが速くなります |
time_signature | 拍子 | 4/4拍子なら4になる |
valence | 曲の明るさ | 0.0~1.0までの指標で値が大きいほど幸せ、陽気、陶酔などのポジティブな印象で小さいほど悲しみ、落ち込み、怒りなどのネガティブな印象になります |
まとめ
最後まで読んでいただきありがとうございました。Pythonを使ったSpotifyからのデータの入手方法はご理解いただけたかと思います。みなさんもお好きなアーティストの情報をみたり、外国の音楽シーンをみたりするとおもしろいですよ。またPythonで複数のファイルを結合するglob関数も扱いましたが業務でも使えるテクニックですのでどしどし使っていきましょう。今回の記事が少しでも皆さんの業務のお役に立てられれば幸いです。
次はこのデータを使って各国の音楽性の違い、好みなどを探っていきたいと思います。
普段、まったく聞くことのないようなアフリカとか中東なんかの音楽シーンもどのような特徴があるのか気になるよね♪
コメント