芋出し画像

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


しばらく流行曲なんお興味がなく、しかも日本の流行りにも疎かった私が、なんずなく口ずさめる曲に出䌚った。しかもそのバンドは海倖で掻躍するこずを倢芋おる若手アヌティストだずか。

そこで調べたくなったのが、圌らの今幎の代衚曲は、党䞖界のSpotifyで今幎幎流行っおいる曲ずどれくらい䌌おいるのか。぀たり、Spotifyで良く聞かれおいる曲ず属性などの曲調が䌌通っおいれば、もしかしお圌らの楜曲も党䞖界に届くんじゃないかそう思い勝手に分析しおいきたした。

今回フィヌチャヌするアヌティストは、
Be: First (Mainstream)
です。


【前半】であるこの蚘事ではSpotifyデヌタ党䜓の分析から始めおいきたいず思いたす。【埌半】では実際にSpotify APIを䜿っお調べたい楜曲のデヌタを取埗し、今幎の流行の楜曲ず照らし合わせお分析しおいきたす。


デヌタ゜ヌス

たずは幎珟時点たでの楜曲デヌタをファむルでダりンロヌドしおプロゞェクト甚のダむレクトリヌに保存したす。

幎床の楜曲デヌタを色々な角床から芋おいきたす。

df.info()
のパラメタヌを確認

df.info()でデヌタの党䜓像を芋たす。
たず䞀番巊偎のコラムはむンデックスです。ちなみにPython蚀語はからカりント、R蚀語は統蚈蚀語なのでから数えたす。
その次のコラムは楜曲の属性などを瀺すパラメタヌ。その隣にはNon-Null Countずありたす。これはNull䜕も蚭定されおいない倀がどれだけ含たれおいるか知るこずができたす。"in_shazam_charts"ずいうパラメタヌにNullが含たれおいるようなので察凊しなければなりたせん。そしお䞀番右がデヌタのタむプです。パラメタヌのデヌタタむプはオブゞェクトかint (æ•Žæ•°åž‹)なこずがわかりたす。
この党䜓像から次のステップである「デヌタ・クリヌニング」ず呌ばれる䜜業をどのように行っおいくのか考えおいくこずになるのですが、デヌタクリヌニングはかなりのステップやテクニックが必芁ずなるので、これに぀いおはたた次の機䌚に觊れるこずずしたす。

簡単なビゞュアラむれヌション可芖化ずアナリシス

ここではPythonずいうプログラミング蚀語を䜿甚しおデヌタの可芖化をしおいき、どんな音楜が今幎は流行っおいるのかを芋おいきたいず思いたす。

plt.figure(figsize=(10,8))

sns.countplot(data=df, x='released_year')
plt.title('Distribution of Tracks Produced Over Time')
plt.xticks(rotation=90)
plt.show()

䟋えば䞊の簡単なコヌドでこのようなバヌグラフが珟れたす。

幎珟時点で最もストリヌミングされおいる人気曲のリリヌス幎のバヌグラフ

前幎床幎の倚くの楜曲が今幎になっおも聎かれおいる事がわかりたす。

months = ["January", "February", "March", "April", "May", "June", "July", "August", "September", "October", "November", "December"]
sns.boxplot(data=df, x="streams", y='released_month', order=months)

plt.title('Boxplot of Stream Volume by Released Month in 2023')
plt.ylabel('Release Month')
plt.show()
幎珟時点で最もストリヌミングされおいる人気曲のリリヌス月のボックスプロット

そしお幎珟時点で最もストリヌミングされおいる人気曲のリリヌス月のボックスプロットです。
月ず月にリリヌスされた楜曲が他の月に比べお倚いこずがわかりたす。

artist_counts = df['artist(s)_name'].value_counts()
df_artist_counts = pd.DataFrame({'Artist': artist_counts.index, 'Count': artist_counts.values})
df_sorted_artists = df_artist_counts.sort_values(by ='Count', ascending=False)
df_top_10 = df_sorted_artists.head(10)
sns.barplot(data=df_top_10,x='Count', y='Artist')
plt.title("Top 10 Artists With Total Streams in 2023")
plt.show()
幎珟時点で最もストリヌミングされおいるアヌティストTop 10

そしお幎珟時点で最もストリヌミングされおいるアヌティスト、トップです。䜍はやはりテむラヌ・スりィフト、圧巻です。

楜曲の属性Attributes

そしおここからは楜曲の属性に぀いお調べおいきたす。ここで蚀う属性ずは、「ダンサビリティ」「゚ネルギヌ」「アコヌスティックネス」などがあり、その楜曲がどういう性質の曲なのかを数倀化しおいたす。

そしお属性のデヌタを甚いお盞関分析Correlation Analysisをヒヌトマップで可芖化しおいきたす。

track_attributes = ['danceability_%',
                    'valence_%',	
                    'energy_%',	
                    'acousticness_%',	
                    'instrumentalness_%',	
                    'liveness_%',	
                    'speechiness_%',
                    'bpm']
plt.figure(figsize=(10,8))
sns.heatmap(df[track_attributes].corr(),
            vmin=-1,
            vmax=1,
            annot=True,
            cmap=('RdBu_r'))
plt.xticks(rotation=45)
plt.show()
楜曲の属性ヌ盞関分析ヒヌトマップ

䞊にあるヒヌトマップをみるず青いボックス、アコヌスティックネスず゚ネルギヌが少し匷めの盞関関係にあるこずがわかりたす。もう少し調べおみたしょう。

plt.figure(figsize=(10,6))

sns.regplot(x='acousticness_%', y='energy_%', data=df_sorted_100)
plt.show()
アコヌスティックネスず゚ネルギヌの盞関性

機械孊習を甚いた予枬モデルを構築する際には、説明倉数の䞭に盞関係数が高い組み合わせがないかどうか確かめる必芁性がありたす。盞関係数が高い組み合わせが含たれおいる堎合は倚重共線性ず呌ばれ、幟぀かの説明倉数を取り陀いたりする必芁があるためです。この説明は長くなるので、これもたた別の機䌚に、機械孊習に぀いおのNoteに曞きたいず思いたす。

plt.figure(figsize=(10,6))

sns.countplot(x='key', 
              data=df, 
              palette='viridis',
              order=df['key'].value_counts().index)

plt.title('Distribution of Songs by Key')
plt.xlabel('Key')
plt.ylabel('Count')
plt.show()
Key属性のバヌグラフ

どのキヌをベヌスにしおそれぞれの楜曲が䜜られたのか、そしお傟向を衚すバヌグラフです。Cが䞀぀頭抜けお倚いこずがわかりたす。どんな有名曲がCベヌスなんでしょうか

df_sorted_100[df_sorted_100['key'] == 'C#'].sort_values(by='streams',ascending=False)
C調の代衚曲

リリヌス幎を芋るずかなり昔の曲も今幎良く聞かれおる事がわかりたす。代衚曲がザ・りィヌク゚ンドのBlinding Lights、そしお゚ド・シヌランのShape of Youなどがありたす。

# 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.title('Distribution of Beats Per Minute (BPM)')
plt.xlabel('BPM')
plt.ylabel('Frequency')

plt.legend()
plt.show()
Beats per Minute

次はBPMを芋おいきたす。BPMずはBeats Per Minuteの略で音楜のテンポを衚す単䜍です。数倀が高くなるほどテンポが速い曲、䜎いほどスロヌな曲ずいう意味です。
ちなみに最もストリヌミングされた曲トップの平均BPMはでした。グラフにある赀い点線が平均線です

plt.figure(figsize=(8,6))

sns.countplot(x='mode', 
              data=df, 
              palette='viridis',
              order=df['mode'].value_counts().index)

plt.title('Distribution of Songs by Mode')
plt.xlabel('Mode')
plt.ylabel('Count')
plt.show()
長調 vs 短調のバヌグラフ

最埌にモヌドずいう属性を芋おいきたしょう。モヌドは長調(Major)ず短調(Minor)があり、簡単に衚珟するず長調は明るい響きの音、短調は暗い響きの音を衚しおいたす。䞊のバヌグラフから芋るず長調(Major)の楜曲のほうが短調(Minor)よりも倚い事がわかりたす。


【埌半】では実際にSpotify APIを䜿っお調べたい楜曲のデヌタを取埗し、今幎の流行の楜曲ず照らし合わせお分析しおいきたいず思いたす。


この蚘事が気に入ったらサポヌトをしおみたせんか