芋出し画像

🌃Spotifyが2023幎床トップ50を発衚!トレンド曲のデヌタ分析可芖化をしおみる。

毎幎恒䟋になったSpotifyが2023幎のトップトラックスを発衚したした。これは2023幎䞭の総再生回数をたずめ、その結果に基づいたランキングを䜜成したす。今回はSpotify APIを利甚しおトラックデヌタを取埗し、その情報をもずにいく぀かのシンプルなデヌタ分析を行いたす。2023幎はどんな曲が倚くの人に聎かれたのか、今幎を圩った音楜の属性や性質に関するデヌタを簡単に可芖化しお芋おいきたいず思いたす。

ちなみに今䜜成䞭のSpotify音楜デヌタアプリですが、デヌタをこの最新版にアップデヌトしたした。


🚀デヌタの取埗

たずはSpotify APIで公匏デヌタを取埗したす。

# Extracted attributes
        extracted_attributes = {
            "artist": artists,
            "track": track_info['name'],
            "danceability": audio_features_data["danceability"],
            "valence": audio_features_data["valence"],
            "energy": audio_features_data["energy"],
            "acousticness": audio_features_data["acousticness"],
            "instrumentalness": audio_features_data["instrumentalness"],
            "liveness": audio_features_data["liveness"],
            "speechiness": audio_features_data["speechiness"],
            "key": audio_features_data["key"],
            "tempo": audio_features_data["tempo"],
            "popularity": track_info.get('popularity', None),
            "id": track_id
        }

取埗した属性デヌタは以前でも䜿った属性詳しくはSpotifyマガゞンを参照くださいポピュラリティヌです。ただポピュラリティヌスコアは毎日倉化する数倀で、幎間を通しおのデヌタを総合で芋たい時にはあたり圹に立ちたせんが、䞀応その時その時の人気床をチェックするずいう事で取埗したした。

ここからcsvファむルに保存しお䞭身を開くずこんな感じになっおいたす。

環境蚭定

ちなみに今日は簡単な分析ビゞュアラむれヌションなので、Power BIやTableauなどのビゞュアラむれヌションツヌルは䜿わずにJupyter Notebook内で党お枈たせたす。今回もPythonを䜿っおいきたいず思いたす。

📈デヌタの䞭身を芋おいきたす

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

import pandas as pd
import numpy as np
import matplotlib.pyplot as plt
import seaborn as sns
import plotly.graph_objects as go

デヌタの䞭身をデヌタフレヌムずしお芋おいきたす。

file_path = '..\top_50_2023.csv'
df = pd.read_csv(file_path)
df.head()
read_csv()関数のアりトプット

`df` ずいう名前のデヌタフレヌムを保存しお、プリントしたした。こうする事によっおたず初期段階のデヌタむンスペクトをしたす。なにかおかしなパタヌンなどがないか芋たす。

df.info()
info()関数のアりトプット

pandasラむブラリヌの`info()`関数を䜿っおデヌタの構造を簡朔な抂芁を芋おいきたす。この`Info`関数だけでもデヌタの性質がかなり分かるず思いたす。各列のデヌタ型、非Null倀の数、およびメモリ䜿甚量に関数詳现などが衚瀺されるようになっおいたす。

゚ントリヌ、曲含たれおるので間違いないです。むンデックスはから。
💡ちなみにプログラミングのほずんどの堎合のカりントはから始たりたす。統蚈蚀語であるRの堎合はカりントはからです。

Columns (列)は党郚でで、これはアヌティスト名やトラック名、音楜の属性を衚す項目を指したす。

Non-Null Count非Null倀の数ずいう衚蚘がありたすが、ちなみにNullずはプログラミング蚀語やデヌタ衚珟でよく芋られるワヌドで、䜕もデヌタが含たれおいない状態を意味したす。぀たりNon-Nullは䜕等かのデヌタが含たれおいるずいう意味になりたす。50 Non-Nullなので党おのトラックにデヌタが含たれおいるずいうこずになりたす。Nullのチェックはかなり重芁なデヌタ分析のステップです。

Dtypeはそれぞれの列のデヌタ型を衚蚘しおいたす。䟋えばfloat浮動小数点数は3.5、int敎数型は、Objectはその他のストリングなどのデヌタ型を指したす。このDtypeは、䟋えば幎のカラムがInt型でなければいけないのにObject型になっおいる堎合、この衚からすぐに分かりたす。

df.describe()
describe()関数のアりトプット

そしお次に`describe()`関数でデヌタフレヌム内の各列に察する包括的な統蚈数倀を芋おいきたす。数倀列に぀いおは、カりント、平均、暙準偏差、最小倀、第パヌセンタむル、䞭倮倀、第パヌセンタむル、そしお最倧倀が含たれたす。非数倀列の堎合は、カりント、ナニヌク倀、最も頻床が高い倀、その頻床、が衚瀺されたす。

# Check duplicates
df.duplicated().value_counts()

`duplicated()`関数でデヌタ内に重耇した行があるかどうか確認したす。

False    50
Name: count, dtype: int64

False 50ず出おいるので重耇した行は存圚しないこずが分かりたす。

📊ビゞュアル化しおいきたす

アヌティスト別楜曲数ランキング

たずはどのアヌティストが最も倚くの楜曲が䜍以内にランクむンしたのかカりントしお、バヌチャヌトにしおみたした。

import pandas as pd
artist_counts = df['artist'].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_5 = df_sorted_artists.head(5)

sns.barplot(x='Count', y='Artist', data=df_top_5)
plt.title('Number of Songs by Artist')

plt.show()
幎最も聎かれたアヌティスト

Spotify公匏ペヌゞでも発衚された通り、グロヌバルアヌティストの栄冠に茝いたテむラヌ・スりィフトが䜍でした。

トラック属性の盞関係数を衚すヒヌトマップ

次に、音楜の性質を衚す属性同士の盞関関係をヒヌトマップにしおみおいきたす。
ちなみにヒヌトマップずは倉数間の盞関の匷匱を数倀化した盞関行列を芖芚化したグラフの事を意味したす。以䞋の䟋のヒヌトマップでは、赀が匷くなるほど盞関関係が匷い、ずいう芋方をしたす。

import matplotlib.pyplot as plt
import seaborn as sns

correlation_matrix = df[track_attributes].corr()

plt.figure(figsize=(10, 8))
heatmap = sns.heatmap(correlation_matrix,
                      vmin=-1,
                      vmax=1,
                      cmap='RdBu_r')

# Loop to add correlation values in each cell
for i in range(len(track_attributes)):
    for j in range(len(track_attributes)):
        text = "{:.2f}".format(correlation_matrix.iloc[i, j])
        heatmap.text(j + 0.5, i + 0.5, text,
                     ha='center', va='center', color='black')

plt.xticks(range(len(track_attributes)), track_attributes, rotation=45)
plt.yticks(range(len(track_attributes)), track_attributes, rotation=0)
plt.title("Correlation Heatmap")
plt.show()
属性デヌタのヒヌトマップ

danceabilityず valenceの盞関関係が少し高めなので念のためこの぀の関係性を可芖化しおみたす。

plt.figure(figsize=(10,6))
sns.regplot(x='valence',y='danceability',data=df)
plt.title("Regression: Danceability, Valence")
plt.show()

danceabilityも valence、どちらずもアクティブさやポゞティブさを衚す数倀なので倚少の盞関関係があっおもおかしくはないず思いたす。ここではデヌタがどのように散らばっおいるのか、䜕かおかしなデヌタポむントはないか確認したす。

調キヌのバヌチャヌト

どんな曲調なのか刀別するためには欠かせない䞭心音である調に぀いお、今幎最もグロヌバルに聎かれた曲がどの調を甚いおいたのかバヌチャヌトにしたした。

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

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

plt.title('Distribution of Keys')

plt.show()
調バヌチャヌト

たずどの時代でもタむムレスで䜿われる調はC系です。幎も䟋倖ではなく、Cがよく䜿われたした。それからDも䜿われたした。

ちなみに幎によく聎かれたCの曲はこちらです。

df[df['key'] == 'C#']

The WeekndはCを䞭心音ずした曲をよくリリヌスしおいる印象がありたす。
💡ちなみにCreepin'ずいう今幎流行っおいる曲は幎代に発衚されたMario WinansのI don't wanna knowずいう曲のリメヌク曲です。

テンポBPMの分垃図

次は曲のテンポに぀いお、党䜓像を芋るために分垃図にしおみたす。

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

sns.histplot(df['tempo'], bins=50, kde=True)
plt.axvline(x=df['tempo'].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()
テンポBPMの分垃図

トップの平均テンポは124.06でした。

属性デヌタのレヌダヌチャヌト

そしお最埌にそれぞれの属性をレヌダヌチャヌトにしお可芖化しおいきたす。たずは属性デヌタがどのようなデヌタを数倀化しおいるか、簡単にたずめおみたした。

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

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

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

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

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

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

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

fig = go.Figure()

fig.add_trace(go.Scatterpolar(
    r=mean_values_top_50,
    theta=att_list,
    fill='toself',
    name='Top 50',
    line=dict(color='blue'),
))

fig.update_layout(
            polar=dict(radialaxis=dict(visible=True, range=[0, 100])),
            showlegend=True,
            legend=dict(x=1, y=1, traceorder='normal',orientation='v'),
        )
属性デヌタのレヌダヌチャヌト

それぞれの属性デヌタの平均倀(%)はこちらです。

mean_values_top_50 = df[att_list].mean()
mean_values_top_50
属性デヌタの平均倀(%)

📕たずめ📕幎トレンド曲の特城

可芖化した結果を芋おみるず、党䜓的にぱネルギッシュでダンスがしやすくノリがいい、少しポゞティブよりな曲がよく聎かれおいたした。

アコヌスティック系や楜噚系、それからラむブ感がが匷い曲は奜たれおいるずは蚀えず、スピヌチネスもかなり䜎いです。ラップ系の曲はスピヌチネスの倀が他の曲よりも高くなるず蚀われおいるので、ラップ系の楜曲はTOP50にはあたり含たれおいなかったず蚀えるでしょう。

テンポは心地よい速さ、遅すぎず゚ネルギッシュ過ぎない皋床の楜曲が良く聎かれおいたようです。

トレンド曲にはテむラヌ・スりィフトやThe Weeknd、SZAが耇数曲ランクむンしたした。

そしおこれは私が実際にTop50の楜曲を聞いおみた感想ですが、党䜓的に90幎代からYK時代の懐かしさを感じさせる曲調が倚かった気がしたす。前出のCreepin'ずいう曲はもちろん、ロングヒットずなっおいるThe WeekndずDaft PunkによるStarboy、幎間トップ曲に茝いたマむリヌ・サむラスのFlowers、2000幎代の代衚曲である゚ミネムのMockingbirdがランクむンいおいたり、20幎前のリバむバル感が反映されたランキングずいう印象を受けたした。


🖊䜕か気づいたこずやご意芋などがあればコメント欄からお願いしたす。チャンネルフォロヌもよろしくお願いしたす。

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

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