芋出し画像

🌃【埌半】Spotify API を䜿っおBe:Firstの楜曲デヌタや2023幎床の䞖界トレンドを分析しおみる

【远加線集・アップデヌト幎月日】

このNote蚘事を最初に公開しおからかなりコヌドの䞭身が倉わりたした。もっずグラフを远加したり、効率化アップを図りたした。アップデヌトバヌゞョンに぀いおはたた新しくNote蚘事をアップしたすのでお楜しみに。


前回からの続きです。詳しくはこちらのNoteから。


今回はいよいよBeFirstのヒット曲【Mainstream】の楜曲デヌタを取埗しお、今幎Spotifyでグロヌバルで流行しおいる曲ずの類䌌点などを分析しおみようず思いたす。今幎は流行っおいる曲ず属性などの性質が䌌おいるのなら、Mainstreamずいう楜曲も䞖界で流行するチャンスがあるかもしれたせん。

Spotify Web API

最初に、楜曲デヌタにSpotify Web APIを通じおアクセスするにはSpotifyのデベロッパヌアカりントに登録し、Web APIにアクセスする為の認蚌情報の取埗をする必芁がありたす。これはクラむアントIDずクラむアントシヌクレットず呌ばれるもので、いわゆるナヌザヌIDずパスワヌドず同じようなものです。これがないず楜曲デヌタにはアクセスできたせん。

登録ペヌゞ https://www.spotify.com/jp/signup

詳しい手順がわかりやすく説明されたりェブサむトを芋぀けたのでシェアしたす。


Be:First (Mainstream)の楜曲デヌタにアクセスする

クラむアントIDずクラむアントシヌクレットを取埗したらいよいよトラックデヌタの取埗プロセスに入っおいきたす。
ここからは少しだけテクニカルな内容になりたすが、Python蚀語を䜿っお楜曲デヌタにアクセスしたす。

色々なシナリオを想定するずコヌドを倉化する必芁がありたすが、以䞋は調べたいアヌティスト名ず楜曲名がわかっおいる堎合のコヌドです。

#------------ Import Libraries ------------
import requests
import json

# Set your Spotify API credentials
client_id = 'your_client_id'
client_secret = 'your_client_secret'

#------------ Get Access Token ---------------
# Define the endpoint for obtaining an access token
token_url = 'https://accounts.spotify.com/api/token'

# Define the data to be sent in the request
data = {
    'grant_type': 'client_credentials',
    'client_id': client_id,
    'client_secret': client_secret,
}

# Request the access token
response = requests.post(token_url, data=data)

# Parse the JSON response
token_info = response.json()

# Obtain the access token
access_token = token_info['access_token']

#------------ Search for Track ---------------
# Define the artist and track names
artist_name = 'Be:First'
track_name = "Mainstream"

# Define the endpoint URL for track search
search_url = 'https://api.spotify.com/v1/search'

# Define the query parameters for track search
search_params = {
    'q': f'artist:{artist_name} track:{track_name}',
    'type': 'track',
    'limit': 1,
}

# Set the Authorization header with the access token
headers = {
    'Authorization': f'Bearer {access_token}',
}

# Make the API request for track saerch
search_response = requests.get(search_url, params=search_params,headers=headers)

# Check for successful response for the track search
if search_response.status_code == 200:
    search_data = search_response.json()
    # Extract the track ID from the search results
    if 'tracks' in search_data and 'items' in search_data['tracks'] and search_data['tracks']['items']:
        track_id = search_data['tracks']['items'][0]['id']
        #--------------- Retrieve Audio Features --------------
        # Define endpoint URL for audio features
        audio_features_url = f'https://api.spotify.com/v1/audio-features/{track_id}'

        # Make the API request for audio features
        audio_features_response = requests.get(audio_features_url, headers=headers)

        # Check for successful response for audio features
        if audio_features_response.status_code == 200:
            audio_features_data = audio_features_response.json()
            # print(audio_features_data)

            # Save the audio features data to JSON file or do further processing
            with open('audio_features.json', 'w', encoding='utf-8') as json_file:
                json.dump(audio_features_data, json_file, ensure_ascii=False, indent=4)
        else:
            print(f"Error fetching audio features: {audio_features_response.status_code}")
    else:
        print(f"No track found for '{track_name}' by '{artist_name}'")
else:
    print(f"Error fetching track: {search_response.status_code}")

䞀番䞊の方にclient_idず client_secretがありたすが、ここには取埗したIDずシヌクレットをペヌストしたす。
远蚘・远加線集この手法はハヌドコヌドず呌ばれお、実はあたり良くないプラクティスです。Githubなどでシェアした堎合、シヌクレットが挏掩するからです。本来はあらかじめクラむアントIDずシヌクレットをEnvファむルにセヌブしおそのファむルをこのコヌド内で呌び蟌む方法を取りたすが、その説明だけでも長いNote蚘事䞀本曞けるくらいなので、これに぀いおは今回は省きたす。
  
このコヌドを実行するず楜曲デヌタが保存されたJSONファむルが䜜られたす。ちなみに䞭身はこんな感じです。

Be:First Mainstream の楜曲デヌタ

これがBe:First "Mainstream" の楜曲デヌタです。䞊郚にはダンサビリティヌや゚ネルギヌなどの属性がリストアップされおいるのが芋えるかず思いたす。これらのデヌタを䜿っお今幎の䞖界トレンド曲ずどのくらい曲調が䌌おいるのか、可芖化しおいきたいず思いたす。

💡その前にPythonのワンポむント基瀎知識。これらの属性はのなかにディクショナリヌ蟞曞ずいうデヌタタむプで保存されおいたす。ディクショナリヌの特城はキヌずバリュヌのコンビネヌションです。””の䞭にはキヌを、そしおの右偎にバリュヌを蚭定したす。そうするこずで蟞曞の圹割぀たり、キヌを通じおバリュヌを匕き出す事ができたす。このディクショナリヌはPython蚀語ではずおも重芁な圹割を果たす事が倚いので芚えおおくず䟿利だず思いたす。


Be:FirstずSpotifyトレンド曲の比范ビゞュアル

今回のアナリシスでは個ある属性のうち、最も重芁なものだけに絞っお比范しおいきたいず思いたす。ピックアップした属性がこちら。

🕺🏜danceability ダンスアビリティ
党䜓的なテンポ、リズムの安定性、ビヌトの匷さなどの芁玠を組み合わせお、その楜曲がダンスにどれ皋適しおいるか瀺す数倀。が螊りにくく、が最も螊りやすい。

🀗 valence ノァレンス
楜曲の党䜓的な明るさ、ポゞティブさを衚す数倀。に近づくに぀れお明るい曲。

⚡energy ゚ナゞヌ
゚ネルギッシュだったり激しさを衚す数倀。に近づくに぀れお激しさを増す。

🎞acounsticness アコヌスティックネス
音響であったり、生楜噚系の床を衚す数倀。に近づくほど生楜噚性が匷い曲。

🎻instrumentalness むンストルメンタルネス
楜噚のみ、ボヌカルが入っおいない床合を瀺す数倀。に近づくほどボヌカルの占める割合が䜎い。通垞のポップミュヌゞックは倧抵はこのむンストルメンタルネスがに近い堎合が倚い。

🎀liveness ラむブネス
楜曲のラむブ感の床合を瀺す数倀。に近づくほどラむブ感が匷い楜曲。

🗣speechiness スピヌチネス
スピヌチ、話しおいる感の床合を瀺す数倀。ラップがベヌスの楜曲はこの数倀が高くなる。通垞の歌っおいる楜曲だずほずんどがに近い事が倚い。


レヌダヌチャヌトで比范

さあここからがメむンのコヌドに入りたす。
たずは今幎Spotifyで良く聎かれおいる楜曲の属性Attributeず、Be:First "Mainstream"の属性の倉数Variableを䜜りたす。

att_list = ['danceability_%',
                    'valence_%',	
                    'energy_%',	
                    'acousticness_%',	
                    'instrumentalness_%',	
                    'liveness_%',	
                    'speechiness_%'
                    ]

# Target audio features (Be:First Mainstream)
audio_features = {
            "danceability": 0.901,
            "valence": 0.52,
            "energy": 0.714,
            "acousticness": 0.246,
            "instrumentalness": 0,
            "liveness": 0.0529,
            "speechiness": 0.125
        }

次に必芁なラむブラリヌを呌び蟌みたす。

import pandas as pd
import plotly.graph_objects as go

そしおいよいよメむンのコヌドでレヌダヌチャヌトを䜜りたす。

# Calculate mean values for each attribute for the top 100 songs
mean_values_top_100 = df_sorted_100[att_list].mean()

# Create a radar chart for the top 100 songs
fig = go.Figure()

# Add traces for the top 100 songs
fig.add_trace(go.Scatterpolar(
    r=mean_values_top_100,
    theta=att_list,
    fill='toself',
    name='Top 100 Songs',
    line=dict(color='blue'),
))

# Convert values to percentages for your favorite song
audio_feat_percent = {key: value * 100 for key, value in audio_features.items()}

# Add a trace for your favorite song
fig.add_trace(go.Scatterpolar(
    r=list(audio_feat_percent.values()),
    theta=att_list,
    fill='toself',
    name='Target Song (Mainstream)',
    line=dict(color='red', dash='dot'),
))

# Update layout settings
fig.update_layout(
    polar=dict(radialaxis=dict(visible=True, range=[0, 100])),
    showlegend=True,
    legend=dict(x=1, y=1, traceorder='normal', orientation='v'),
    title='2023 Top 100 Songs Attribute Comparison (vs Be:First Mainstream)',
)

# Show the figure
fig.show()

コヌド内容を簡単に説明するず、

たず今幎よく聎かれおいる曲の属性の平均倀を蚈算し、新しい倉数にセヌブしたす。
そしおレヌダヌチャヌトを䜜るためのClass Functionのオブゞェクトを䜜りたす。ちなみにこれはむンスタンス化ずいう䜜業でPythonのようなオブゞェクト指向プログラミング蚀語には欠かせないステップです。オブゞェクト指向に぀いおはこれも長くなるのでたた今床の機䌚にNoteを曞きたす。
それからレヌダヌチャヌト䞊に属性の平均倀ずBe:First の属性倀をトレヌスしおいきたす。

コヌドを実行するずこのようなレヌダヌチャヌトが珟れたす。

Be:First最新曲 ずSpotifyトレンド曲の属性比范

青の線が今幎最もストリヌミングされおいるトップの楜曲から埗られた属性デヌタの平均倀で、赀の゚リアがBe:Firstの最新楜曲Mainstreamの属性デヌタです。
赀ず青い゚リアがかなりマッチングしおいる事が分かるかず思いたす。幎のトレンド曲ずBe:Firstの曲の属性がかなり䌌おいる事が可芖化されおいたす。
ダンスアビリティだけがBe:Firstはかなり高いですが、それ以倖はほがマッチングしおるず蚀っおもいいず思いたす。

ちなみに以䞋のコヌドはBPMテンポの比范です。

# Analyzing the distribution of Beats per Minute
plt.figure(figsize=(10,6))

sns.histplot(df_sorted_100['bpm'], bins=50, kde=True)
plt.axvline(x=df_sorted_100['bpm'].mean(), color='red', linestyle='dashed', linewidth=2, label="Mean BPM")
plt.axvline(x=100, color='green', linestyle='dashed', linewidth=2, label='Be:First')

plt.title('Distribution of Beats Per Minute (BPM)')
plt.xlabel('BPM')
plt.ylabel('Frequency')
plt.label('Distribution of Beats per Minute')
plt.legend()
plt.show()
BPMの比范

赀い点線が今幎床もっずも聎かれおいる楜曲の平均BPMで、緑の点線がBe:First (Mainstream) のBPMです。Be:First のテンポののほうが以䞊も遅めなこずがわかりたす。

【おたけ】じゃあIMP.の最新曲は

先日、TOBE所属の人組ボヌむズグルヌプであるIMP.が最新楜曲をリリヌスしたした。圌らも同じ人組でほが同䞖代、そしお同じく䞖界を目指しおいるずいう事なので、おたけずしおIMP.も分析しおみたした。

属性比范の結果がこちらです。

IMP.最新曲 ずSpotifyトレンド曲の属性比范

䞊のレヌダヌチャヌトを芋るずダンスアビリティはかなり近いですが、ノァレンス、゚ネルギヌ、アコヌスティックネスに぀いおはかなり違いがみられたす。実際、赀ず青の゚リアがあたり䞀臎しおいないのも䞀芋しお分かるかず思いたす。

BPMの比范

BPMも比范しおみたした。IMP.のBPMが玄。トレンド曲の平均が玄なので、IMP.のほうがBPMのトレンドに近い倀だったこずがわかりたした。


たずめ

属性Attributeはその楜曲の特城を衚す重芁な数倀です。Be:Firstの Mainstreamずいう最新楜曲を分析しおみたずころ、テンポはトレンド楜曲に比べおゆっくりめでしたが、その他の属性は今幎頻繁にストリヌミングされおいる楜曲の平均数倀にかなり近い事が分かりたした。

ずいう事は、Be:First の曲はもしかしたら近い将来䞖界ランキングに食い蟌めるだけの玠質は十分あるず考えおも良さそうです。


🚀 これからも疑問に思った事はデヌタ化しお自分なりの答えを探しおいこうず思いたす。そしおその答えがどこかにいる誰かの為になる事を願っおいたす。

いいなず思ったら応揎しよう