Spotify分析

この記事は約9分で読めます。
sponsored link

方法1 – 最新トレンド200曲

Spotify Charts Top 200のページへ
② 右上の”download to csv”をクリック
サイトへ飛んでボタンをクリックするだけという極めてシンプルな方法です。
最も楽な方法なのではじめに紹介しましたが、今回の可視化では使いません。
※今回は「Japan Top 200 – Daily – 2020/12/10」としましたが、フィルターは自由に設定してください。

方法2 – 自分の好きな曲

Organize Your Musicにサインイン
② 表示されたデータをコピーし、エクセルに貼り付けて保存
Organize Your Musicにサインイン

まず、Spotifyのどんなデータを閲覧したいかを選択します。(保存した曲、プレイリストなど)

そしてアカウント認証後「ORGANIEZE YOUR MUSIC」をクリックします。

表示されたデータをエクセルにコピペ

下の画像のようなデータが表示されるので、手動選択でエクセルにコピペします。

というやり方もあるのですが、これでは芸が無いので今回は「HTMLのコピー」で行うことにします。

MacだとHTMLのコピーはこんな感じです。

コピーしたHTMLはそのままエクセルに貼り付ければ表構造として読み取ってくれます。不要な列や行を削除するとこんな感じです。

APIで取得したデータを加工

① Pythonの環境を用意
② Client ID・Client Secretを取得
③ Japan Top 200のデータを加工
④ 自分のSpotifyのデータを加工

Pythonの環境を用意

今回はみんな大好きGoogle Colaboratoryを使います。

Pythonが実行できれば何でも良いので、Jupyter Notebookなどでも大丈夫です。お好みでどうぞ。

Spotify for Developerにログイン

Spotify for Developer > Dashboard (こちら)に自分のSpotifyアカウントでログインし「CREATE AN APP

すると以下のような画面が現れるので、App name・App descriptionを適当に入力して「CREATE

次の画面で「Client ID」「Client Secret」が出るので、それを忘れずにメモしましょう。

方法1 – Japan Top 200のデータを加工

Spotify API Documentはこちら

!pip install spotipy # Spotify APIを叩くためのライブラリ

import pandas as pd # データの処理に必要。Google Colab標準装備
import spotipy 
from spotipy.oauth2 import SpotifyClientCredentials # oauth2で安全に対話
import json # jsonファイルを扱う際に必要

client_id = 'input your client id' # 先ほど入手したClient ID
client_secret = 'input your client secret' # 先ほど入手したClient Secret
client_credentials_manager = spotipy.oauth2.SpotifyClientCredentials(client_id, client_secret)
spotify = spotipy.Spotify(client_credentials_manager=client_credentials_manager)
実行するとこんな感じの画面になるはずです。
左のサイドバーからファイルマークを選択し、上でDLしたファイルをローカルからアップします。
※ただしGoogle Colaboratoryは、ノートブックのセッションが切れて90分経過 or 新しいインスタンスを起動して12時間経過したらインスタンスがリセットされるので注意してください。
# pandasでexcelファイルを読み込み
# 曲名にカンマが含まれておりcsvの構造が崩れてしまったので今回はexcelファイルとします
jp_daily = pd.read_excel("regional-jp-daily-latest.xlsx")
※今回は手間省略のためexcelに切り替えましたが、Google Colabratoryで完結させたい方はcsvを直接加工しても良いかもしれません。
track_traits = pd.DataFrame() # 空のdfを作成

for url in jp_daily["URL"]: # jp_dailyのURL列を1つずつなめる
   a = pd.DataFrame.from_dict(spotify.audio_features(url)) # URLに該当する曲の特徴を抽出
   track_traits = track_traits.append(a) # 読み込んだ特徴を行へ追加

track_traits = track_traits.reset_index(drop=True) # 後のconcatのためにindex削除。
Spotify ライブラリから、曲の特徴量を抜いてきました。
次は上の2つの df を横方向に結合させて excel 形式で出力します。
m = pd.concat([jp_daily, track_traits], axis=1) # 横方向にキー無しで結合
m.to_excel('jp_daily_fixed.xlsx', index=False) # indexは不要なので削除
コードが実行できると左に「jp_daily_fixed」というファイルが生成されるので、それを右クリックでダウンロードすれば完了です。

方法2 – 自分のSpotifyデータを加工

「spotify_saved_20201212.xlsx」でも十分楽しめますが、曲のURLが入っていないのが気になります。
ここから先は URL やその他ID情報などを追加したいと思います。
流れ
  1. 「アーティスト名」「曲名」の文字列を結合し、新規カラムを作成
  2. 結合した文字列をSpotifyの検索窓に入力(API経由)
  3. ヒットした曲のデータの先頭の情報を読み込む
  4. その配列の中からURL情報を取得
  5. そのURLを元のエクセルファイルに結合
下の赤枠が今回取得したいURLで、これを「spotify_saved_20201212.xlsx」に追加するのがゴールです。
説明は割愛しますが、以下のコードを実行すれば良いです。
各行の説明はコメントアウトしたので参考にどうぞ。
s = pd.read_excel('spotify_saved_20201212.xlsx')
s['track'] = s['title'] + ' ' + s['artist'] #曲名とアーティストを結合させて「track」という新しい列を作成

s_info = pd.DataFrame()
for track in s['track']:
  t = spotify.search(track, limit=1, offset=0, type='track',market=None) # spotify内で"track"の文字列で検索
  t = t['tracks']['items'] # リストにネストされた辞書が返ってくる
  t = pd.io.json.json_normalize(t, sep='_') # リスト内にネストされた辞書を個別のカラムに分離
  s_info = s_info.append(t) # 求めたいURLをゲット

s_info = s_info.reset_index(drop=True) 
s_info = s_info[['name','explicit','href','id','album_id','album_name','external_urls_spotify']] # 必要なカラムのみを抽出
s_fixed = pd.merge(s, s_info, left_on='title', right_on='name', how='left') # キーを指定してleft join
s_fixedm.to_excel('jp_daily_fixed.xlsx', index=False) # xlsx形式で出力
実行が成功していればファイルが生成されるので、右クリックでダウンロードします。
以上でAPIを使ったデータの準備は終了です。お疲れ様でした。
※本来はこのクエリをスケジュール更新したいところなのですが、Google Colabには該当機能がないので今回は諦めます。

方法3 – Web Data Connector (Tableau限定)

① Tableau Desktopのデータソース接続欄から”Web Data Connector”を選択
(接続方法がわからない方はこちら
② “https://spotify-wdc.herokuapp.com:443/”を入力
③ 自分のアカウントでログインし、データ範囲(直近1ヶ月/直近6ヶ月/全部)を選択

以下のようにTableauでデータのプレビューが表示されていれば成功です。

完成版

こちらのダッシュボードではSpotifyのアカウントをお持ちでない方でも曲(30秒)を試し聴きすることができます。