【SpotifyAPI】プレイリストで2020を振り返る - Part.1 プレイリストデータの取得

## はじめに

Spotifyで2020年に「最も聴いた楽曲」などをストーリ形式で評してくれる機能 "#2020WRAPPED" が公開されました。

SpotifyAPIでは、楽曲ごとの解析した音楽的なパラメータを返却してくれます。
それらのデータを含む楽曲リストを取得し、2020年に聴いた曲の傾向を分析してみましょう。

![スクリーンショット 2020-12-28 23.42.22.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/348593/34bd1fe7-e432-55f8-df32-56cdede3eab5.png)

![スクリーンショット 2020-12-28 23.56.59.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/348593/052f85d1-bd5e-28ec-314e-9eb1fe0e0e22.png)

## 動作環境
- Google Colaboratory
- Python 3.6


## 事前に準備するもの
- Spotify開発アカウント (Client ID,Client Secret)
 - 無料でつくれます [参考サイト](https://dev.classmethod.jp/articles/about-using-of-spotify-api/)


## やること
今回の記事でおこなうのは以下です。分析以降は次記事でかきたいと思います。

1. PythonでSpotify APIを叩く
2. オーディオの解析情報を取得する
3. APIで取得したデータをPandasのデータフレームにいれる
4. PandasのデータフレームをCSV変換してダウンロード


### 下準備1
必要なライブラリをインストールします。

```python:
#SpotifyAPIを扱うためのライブラリをインストール
!pip install spotipy

#matplot　で日本語フォントを使用するため
!apt-get -y install fonts-ipafont-gothic
!pip install japanize-matplotlib
```

### 下準備2
必要なライブラリをインポートします。
後から可視化に使用するものもあわせてインポートしておきます。

```python:
#使用ライブラリのインポート
from dateutil.parser import parse as parse_date
from matplotlib import pyplot as plt
import japanize_matplotlib
import numpy as np
import pandas as pd
import seaborn as sns
import spotipy
import spotipy.util as util
from spotipy.oauth2 import SpotifyClientCredentials
import sklearn 
from sklearn.decomposition import PCA
```

### 下準備3
事前に取得した認証情報をセットします

```python:
#Spotify認証情報のセット
client_id     = 'XXXXXXXXXXXXXXXXXX'
client_secret = 'YYYYYYYYYYYYYYYYYY'
user_id       = 'ZZZZZZZZZZZZZZZZZZ'
playlist_id   = '!!!!!!!!!!!!!!!!!!'

#認証処理
client_credentials_manager = spotipy.oauth2.SpotifyClientCredentials(client_id, client_secret)
sp = spotipy.Spotify(client_credentials_manager=client_credentials_manager)

#プレイリスト内のソング情報を取得
###プレイリスト情報の取得
playlist = sp.user_playlist(user_id, playlist_id)
```

### プレイリスト内のソング情報を取得

事前に取得した認証情報をセットします。

```python:
###プレイリスト情報の取得
playlist = sp.user_playlist(user_id, playlist_id)

###取得したでータをpandasのデータフレーム(=tracks_df)にセット（必要項目に絞る）
tracks_df = pd.DataFrame([(track['track']['id'],
                           track['track']['artists'][0]['name'],
                           track['track']['album']['name'],
                           track['track']['disc_number'],
                           track['track']['track_number'],
                           track['track']['name'],
                           parse_date(track['track']['album']['release_date']) if track['track']['album']['release_date'] else None,
                           parse_date(track['added_at']))
                          for track in playlist['tracks']['items']],
                         columns=['id', 'artist', 'album','disc','track_number','name', 'release_date', 'added_at'] )

tracks_df['target'] = 'A'
tracks_df.head(100)
```

取得したデータを見てみましょう。

```python:
tracks_df \
    .groupby('artist') \
    .count()['id'] \
    .reset_index() \
    .sort_values('id', ascending=False) \
    .rename(columns={'id': 'amount'}) \
    .head(100) \
    .style.background_gradient()
```
![スクリーンショット 2020-12-28 23.23.55.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/348593/6fda6000-c49f-2f4d-36e8-3e6e91556cd8.png)

無事データがとれていそうです。国内のHIPHOPが多いですね。

### ソングリストに、オーディオ情報を付加して取得する

trackidごとに、さらに`audio_features`のAPIを叩き、オーディオ情報を取得します。
先に取得したソング情報のデータフレームとマージします。

```python:
#空の配列を生成　
features = []

#APIで楽曲の各種数値情報を取得。トラック情報とマージする
for n, chunk_series in tracks_df.groupby(np.arange(len(tracks_df)) // 50).id:
    features += sp.audio_features([*map(str, chunk_series)])
features_df = pd.DataFrame.from_dict(filter(None, features))
tracks_with_features_df = tracks_df.merge(features_df, on=['id'], how='inner')

#CSVへ保存
csvfile =playlist_id+ 'playlist_songlist.csv'
tracks_with_features_df.to_csv(csvfile)

tracks_with_features_df['target'] = 'A'
tracks_with_features_df.head(100) 
```

取得したデータフレームを、CSVとしてダウンロードして確認することができます。
![スクリーンショット 2020-12-29 0.00.56.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/348593/f9666365-182e-c1dc-c2e9-b45b2687f76b.png)


各カラムの属性の対応と説明は、[コチラの記事](https://qiita.com/kazuya-n/items/fbee07ef778e166cb6dd)がわかりやすいです。

```csvs:
,id,artist,album,disc,track_number,name,release_date,added_at,target,danceability,energy,key,loudness,mode,speechiness,acousticness,instrumentalness,liveness,valence,tempo,type,uri,track_href,analysis_url,duration_ms,time_signature
0,31Wp85Oqdtx5sYSYoXddhW,Rhythmy,mossmoss,1,2,透明,2013-12-25,2020-12-06 05:43:54+00:00,A,0.538,0.577,2,-9.263,1,0.0308,0.902,0.0363,0.113,0.0631,100.976,audio_features,spotify:track:31Wp85Oqdtx5sYSYoXddhW,https://api.spotify.com/v1/tracks/31Wp85Oqdtx5sYSYoXddhW,https://api.spotify.com/v1/audio-analysis/31Wp85Oqdtx5sYSYoXddhW,366000,4
1,5Vtb2MhdgCEo2ohVqtU6rh,satohyoh,"feel like, feel right",1,4,astraea,2020-03-11,2020-12-06 05:43:54+00:00,A,0.764,0.738,2,-5.665,1,0.0366,0.966,0.217,0.132,0.592,119.984,audio_features,spotify:track:5Vtb2MhdgCEo2ohVqtU6rh,https://api.spotify.com/v1/tracks/5Vtb2MhdgCEo2ohVqtU6rh,https://api.spotify.com/v1/audio-analysis/5Vtb2MhdgCEo2ohVqtU6rh,231625,3
2,7zZnRcQwc64Ty7a0KcRFDu,AYNIW TEPO,FLOWERS,1,2,Island,2016-01-06,2020-12-06 05:43:54+00:00,A,0.568,0.82,1,-7.256,1,0.0302,0.133,0.692,0.53,0.717,98.976,audio_features,spotify:track:7zZnRcQwc64Ty7a0KcRFDu,https://api.spotify.com/v1/tracks/7zZnRcQwc64Ty7a0KcRFDu,https://api.spotify.com/v1/audio-analysis/7zZnRcQwc64Ty7a0KcRFDu,257005,4
3,4aBFt5YgjiyXx5C5wCEIQ5,AYNIW TEPO,Beautiful Vibrations Live,1,9,"Beautiful Vibrations (Live at Pangea, Osaka, 2019)",2019-09-16,2020-12-06 05:43:54+00:00,A,0.245,0.56,4,-10.057,1,0.0401,0.538,0.407,0.853,0.177,113.608,audio_features,spotify:track:4aBFt5YgjiyXx5C5wCEIQ5,https://api.spotify.com/v1/tracks/4aBFt5YgjiyXx5C5wCEIQ5,https://api.spotify.com/v1/audio-analysis/4aBFt5YgjiyXx5C5wCEIQ5,297564,4
4,7dBmLvVCErz7azdEqTr2XW,ROTH BART BARON,極彩色の祝祭,1,2,極彩 | I G L (S),2020-10-14,2020-12-06 05:43:54+00:00,A,0.555,0.777,7,-6.054,1,0.0415,0.0403,0.1,0.601,0.414,108.981,audio_features,spotify:track:7dBmLvVCErz7azdEqTr2XW,https://api.spotify.com/v1/tracks/7dBmLvVCErz7azdEqTr2XW,https://api.spotify.com/v1/audio-analysis/7dBmLvVCErz7azdEqTr2XW,257000,4
5,3pZchFz2qKIq7mOIvk5sra,Supercar,RE:SUPERCAR 2 -redesigned by nakamura koji-,1,14,LAST SCENE,2011-06-15,2020-12-06 05:43:54+00:00,A,0.491,0.226,11,-15.287,1,0.0306,0.901,0.375,0.111,0.043,92.992,audio_features,spotify:track:3pZchFz2qKIq7mOIvk5sra,https://api.spotify.com/v1/tracks/3pZchFz2qKIq7mOIvk5sra,https://api.spotify.com/v1/audio-analysis/3pZchFz2qKIq7mOIvk5sra,295733,4
6,16XdREbnr11xS9dj75ud2g,KID FRESINO,No Sun,1,1,No Sun,2020-10-07,2020-12-06 05:43:54+00:00,A,0.627,0.906,1,-6.149,0,0.185,0.28,1.58e-06,0.129,0.786,115.989,audio_features,spotify:track:16XdREbnr11xS9dj75ud2g,https://api.spotify.com/v1/tracks/16XdREbnr11xS9dj75ud2g,https://api.spotify.com/v1/audio-analysis/16XdREbnr11xS9dj75ud2g,248560,4
7,0VkBkUHz4PvKDbNxOvyjZi,太郎忍者,Pussy (Remix),1,1,Pussy - Remix,2019-03-27,2020-12-06 05:43:54+00:00,A,0.796,0.75,1,-6.508,1,0.0621,0.15,0.0,0.121,0.262,130.085,audio_features,spotify:track:0VkBkUHz4PvKDbNxOvyjZi,https://api.spotify.com/v1/tracks/0VkBkUHz4PvKDbNxOvyjZi,https://api.spotify.com/v1/audio-analysis/0VkBkUHz4PvKDbNxOvyjZi,252000,4
8,4Bir2My0Lim4IFgraNjTnZ,ANARCHY,The KING,1,12,Lucky 13,2019-03-13,2020-12-06 05:43:54+00:00,A,0.765,0.498,0,-7.625,0,0.22,0.459,0.0,0.123,0.501,139.938,audio_features,spotify:track:4Bir2My0Lim4IFgraNjTnZ,https://api.spotify.com/v1/tracks/4Bir2My0Lim4IFgraNjTnZ,https://api.spotify.com/v1/audio-analysis/4Bir2My0Lim4IFgraNjTnZ,240400,4
9,6X0qb3CiIHKzrmhXSfst9e,APOGEE,Higher Deeper,1,7,KESHIKI,2018-03-21,2020-12-06 05:43:54+00:00,A,0.606,0.726,4,-6.094,0,0.0285,0.0127,0.148,0.323,0.397,88.0,audio_features,spotify:track:6X0qb3CiIHKzrmhXSfst9e,https://api.spotify.com/v1/tracks/6X0qb3CiIHKzrmhXSfst9e,https://api.spotify.com/v1/audio-analysis/6X0qb3CiIHKzrmhXSfst9e,376000,4
10,6lAAEBqCLwllbEG1Pd393V,PUNPEE,MODERN TIMES,1,9,P.U.N.P. (Communication),2017-10-11,2020-12-06 05:43:54+00:00,A,0.783,0.852,11,-6.256,0,0.289,0.22,0.0,0.238,0.772,97.047,audio_features,spotify:track:6lAAEBqCLwllbEG1Pd393V,https://api.spotify.com/v1/tracks/6lAAEBqCLwllbEG1Pd393V,https://api.spotify.com/v1/audio-analysis/6lAAEBqCLwllbEG1Pd393V,227679,4
```

## まとめ
SpotifyAPIを使用して、楽曲のオーディオデータを取得しました。
次回は、オーディオデータから、楽曲の類似度を可視化していきます。それでは。