0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 1 year has passed since last update.

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

Last updated at Posted at 2023-05-10

はじめに

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

Spotify APIとは

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

手順

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

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

使用している環境

PC → mac os
分析 → Anaconda, jupyternotebook
flask → Visual studio code

Spotify APIのスクレイピング

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

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

2000年〜2022年のプレイリストをCSVで保存します
ハードロックからポップスまでジャンルを全て詰め込まれたデータセットになってます
スクリーンショット 2023-05-02 12.14.03.png

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

今回取得したデータ概要は以下のようになっています
スクリーンショット 2023-05-03 13.08.31.png

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

データを見ていくと、かなり細分化されていてデータ同士の最大値と最小値が全く異なります
スクリーンショット 2023-05-04 15.11.13.png

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

標準化は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

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

エルボー法で最適クラスターを検討します

distortions = []

for i in range(1, 11):#クラスター数を10にした時
    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

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

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

class.png

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

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

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

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

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

マイナーコードとメジャーコードについてはこちら

アプリを作っていく

flaskでプレイリストアプリを作成しました
コードはgithubです

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

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

スクリーンショット 2023-05-08 16.39.40.png

スクリーンショット 2023-05-08 17.32.53.png

まとめ

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

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

0
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?