初心者がSpotify APIを分析して気分でプレイリスト作成できるアプリ作ってみた

# はじめに
オンラインスクールの半年間で学んだ知識を実際に使ってみたいと思い、データセットを探すがなかなか見つからない中Spotify APIが面白そうだったので使ってみました☺︎
音楽プレイリストを作成するのに曲を選択することが億劫になることがあるのでデータセットをクラスタリングしてその時の気分でプレイリストを作成できるようにしたいと思います。

# Spotify APIとは
音楽ストリーミングサービスSpotifyが提供している、曲一曲毎のデータが詰まっているAPIでアカウントを作成すれば簡単にデータが取得できるようになっています！

https://developer.spotify.com/

### 


# 手順
今回は以下の順番で作業を行なっています

Spotify APIのスクレイピング&データセットの作成
　　　　　　　　　　↓
　　　　　　　　　　↓
まとめたデータセットの分析
　　　　　　　　　　↓
　　　　　　　　　　↓
分析結果をFlaskで簡単なプレイリスト作成アプリぽいものにする

# 使用している環境
PC → mac os
分析 → Anaconda, jupyternotebook
flask → Visual studio code


# Spotify APIのスクレイピング
こちらのコードを参考にさせてただきスクレイピングをしていきます

https://zenn.dev/yuriponx/articles/ccb87e276dc361

今回は年代別洋楽のトップ１００のプレイリストを、
2000年〜2022年までの22年分2200曲以上をスクレイピングしています（トップ１００の枠からはみ出して１００曲より多い年があります）

2000年〜2022年のプレイリストをCSVで保存します
ハードロックからポップスまでジャンルを全て詰め込まれたデータセットになってます
![スクリーンショット 2023-05-02 12.14.03.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3343238/ceadde2b-8f48-ac0b-3a91-939ac2a7ebed.png)

2022年までで保存した各プレイリストはconcatで2000年〜2022年までをひとまとめにして保存しました

今回取得したデータ概要は以下のようになっています
![スクリーンショット 2023-05-03 13.08.31.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3343238/a8129f3a-4a47-351e-eacd-e47a301c8516.png)

# 作成したデータセットの分析

データを見ていくと、かなり細分化されていてデータ同士の最大値と最小値が全く異なります
![スクリーンショット 2023-05-04 15.11.13.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3343238/21b0ac35-21e9-f527-42aa-1a1fadb43160.png)

こちらの記事を参考に、標準化してKmeans法でクラスター分析していきます

https://tech.datafluct.com/entry/20220714/1657796580#k-means%E6%B3%95-%E3%82%AF%E3%83%A9%E3%82%B9%E3%82%BF%E3%83%AA%E3%83%B3%E3%82%B0%E3%81%AE%E3%82%A2%E3%83%AB%E3%82%B4%E3%83%AA%E3%82%BA%E3%83%A0

標準化はsklearnのpreprocessingライブラリを使用していきます
```
from sklearn import preprocessing

ss = preprocessing.StandardScaler()
a_standardscaler = ss.fit_transform(a)
a_ss = pd.DataFrame(a_standardscaler)
a_ss = a_ss.set_axis(['acousticness', 'danceability', 'energy', 'instrumentalness', 'key', 'length', 'liveness', 'loudness', 'mode', 'speechiness', 'tempo', 'time_signature', 'valence'], axis=1)
a_ss.head()
```
![スクリーンショット 2023-05-04 15.27.20.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3343238/7d9a7178-857a-1d46-91a1-da539842fc60.png)

今回は気分でランダムにプレイリストを作成するアプリを作成したいので、クラスター分析で最適クラスターを見つけて検討していきます

エルボー法で最適クラスターを検討します
```
distortions = []

for i in range(1, 11):#クラスター数を１０にした時
    km = KMeans(n_clusters=i, init='k-means++', n_init=10, max_iter=300, random_state=0)
    km.fit(X)
    distortions.append(km.inertia_)

plt.plot(range(1, 11), distortions, marker='o')
plt.xlabel('Number of clusters')
plt.ylabel('Distortion')
```
![kmeans.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3343238/0a55f8d1-3759-c7d6-72d9-7bad7c0a8081.png)

クラスター分析のためにエルボー法で最適クラスターを決めたところ、
４あたりから緩やかに下がっているような感じなのでクラスター数を4にして実行してみました

クラスター数を4にしたところ、以下のようにまとまりました

![class.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3343238/5d19176c-1292-6a32-b3d8-808d8f8e6707.png)

class0は、
modeが低く、danceabilityとenergy、valenceが高いマイナーコードのクラスター

class1は、
modeが高く、energyとtempoも高いメジャーコードのクラスター

class2は、
acousticnessのみが高く、danceability、energy、valenceは低いクラスター

class3は、
speechinessが高く、ラップ曲が多いクラスター


いい感じにまとまったので、
クラスターを割り振ってアプリにしていきます

>[マイナーコードとメジャーコードについてはこちら](https://er-music.jp/theory/145/#:~:text=%E3%83%9E%E3%82%A4%E3%83%8A%E3%83%BC%E3%82%B3%E3%83%BC%E3%83%89%E3%81%A8%E3%83%A1%E3%82%B8%E3%83%A3%E3%83%BC%E3%82%B3%E3%83%BC%E3%83%89,%E3%81%AB%E3%81%AA%E3%82%8B%E3%80%8D%E3%81%A8%E8%A8%80%E3%81%88%E3%81%BE%E3%81%99%E3%80%82)

# アプリを作っていく

flaskでプレイリストアプリを作成しました
コードは[github](https://github.com/takowasabeer/flask.app)です

class0は、ダンスしたい時(dance)
class1は、ポジティブになりたい時(positive)
class2は、勉強する時(study)
class3は、ドライブする時(drive)

として、クラスターを~~こじつけて~~割り振ってリストから選ぶとランダムに２０曲作成できるようにします
無事にランダムに表示できるようになりました。ページを再読み込みする度にプレイリストが変わる楽しみもできました☺︎

![スクリーンショット 2023-05-08 16.39.40.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3343238/909a3a8a-a66d-70e3-8e5d-524cc44ef7b3.png)

![スクリーンショット 2023-05-08 17.32.53.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3343238/0cebf23e-45c5-3b4d-eb22-b51e6b98f4c4.png)

# まとめ
クラスター分析の前に相関関係をみて、相関がないところは省きましたが偏りがあったので、データはそのまま使うことにしました
アプリの機能面で履歴残したりspotifyに反映できたりしたら面白いかなと思いました

まだまだ勉強中の身ですので、
特に工夫もなくそれっぽい感じになってしまったので、より多くのことを吸収して試行錯誤を続けていきたいです