
ðãåŸåã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" ã®æ¥œæ²ããŒã¿ã§ããäžéšã«ã¯ãã³ãµããªãã£ãŒããšãã«ã®ãŒãªã©ã®å±æ§ããªã¹ãã¢ãããããŠããã®ãèŠããããšæããŸãããããã®ããŒã¿ã䜿ã£ãŠä»å¹Žã®äžçãã¬ã³ãæ²ãšã©ã®ãããæ²èª¿ã䌌ãŠããã®ããå¯èŠåããŠãããããšæããŸãã
ð¡ãã®åã«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ã®ææ°æ¥œæ²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ã§ãç·ã®ç¹ç·ãBe:First (Mainstream) ã®BPMã§ããBe:First ã®ãã³ãã®ã®ã»ããïŒïŒä»¥äžãé
ããªããšãããããŸãã
ãããŸãããããIMP.ã®ææ°æ²ã¯ïŒ
å æ¥ãTOBEæå±ã®ïŒäººçµããŒã€ãºã°ã«ãŒãã§ããIMP.ãææ°æ¥œæ²ããªãªãŒã¹ããŸããã圌ããåãïŒäººçµã§ã»ãŒåäžä»£ããããŠåããäžçãç®æããŠãããšããäºãªã®ã§ãããŸããšããŠIMP.ãåæããŠã¿ãŸããã
å±æ§æ¯èŒã®çµæããã¡ãã§ãã

äžã®ã¬ãŒããŒãã£ãŒããèŠããšãã³ã¹ã¢ããªãã£ã¯ããªãè¿ãã§ããããŽã¡ã¬ã³ã¹ããšãã«ã®ãŒãã¢ã³ãŒã¹ãã£ãã¯ãã¹ã«ã€ããŠã¯ããªãéããã¿ãããŸããå®éãèµ€ãšéã®ãšãªã¢ãããŸãäžèŽããŠããªãã®ãäžèŠããŠåããããšæããŸãã

BPMãæ¯èŒããŠã¿ãŸãããIMP.ã®BPMãçŽïŒïŒïŒããã¬ã³ãæ²ã®å¹³åãçŽïŒïŒïŒãªã®ã§ãIMP.ã®ã»ããBPMã®ãã¬ã³ãã«è¿ãå€ã ã£ãããšãããããŸããã
ãŸãšã
å±æ§ïŒAttributeïŒã¯ãã®æ¥œæ²ã®ç¹åŸŽãè¡šãéèŠãªæ°å€ã§ããBe:Firstã® Mainstreamãšããææ°æ¥œæ²ãåæããŠã¿ããšããããã³ãã¯ãã¬ã³ã楜æ²ã«æ¯ã¹ãŠãã£ãããã§ãããããã®ä»ã®å±æ§ã¯ä»å¹Žé »ç¹ã«ã¹ããªãŒãã³ã°ãããŠãã楜æ²ã®å¹³åæ°å€ã«ããªãè¿ãäºãåãããŸããã
ãšããäºã¯ãBe:First ã®æ²ã¯ããããããè¿ãå°æ¥äžçã©ã³ãã³ã°ã«é£ã蟌ããã ãã®çŽ 質ã¯ååãããšèããŠãè¯ãããã§ãã
ð ãããããçåã«æã£ãäºã¯ããŒã¿åããŠèªåãªãã®çããæ¢ããŠããããšæããŸãããããŠãã®çããã©ããã«ãã誰ãã®çºã«ãªãäºãé¡ã£ãŠããŸãã