Published on

[Python]SpotifyAPIを使ってアーティストの関連性を可視化分析する

Authors

Spotify をよく利用するが、おすすめアーティストのレコメンドが素晴らしい。

自分の好きなアーティストと繋がりのある人を可視化出来れば意外と面白いんじゃないかと思ってやる事にした。😃

環境

  • Python 3.5
  • Jupyter Notebook

1. 必要なパッケージのインポート

import spotipy
import json
import pandas as pd
import matplotlib.pyplot as plt
import networkx as nx
from community import community_louvain
from spotipy.oauth2 import SpotifyClientCredentials
</html>

まだインストールされてない場合は pip install ~~ でインストール。


2. Spotify API の準備

Spotify のアカウントを登録して、client_id と client_secret を取得する。

https://developer.spotify.com/dashboard/login

client_id = 'YOUR ID'
client_secret = 'YOUR SECRET'
client_credentials_manager = spotipy.oauth2.SpotifyClientCredentials(client_id, client_secret)
spotify = spotipy.Spotify(client_credentials_manager=client_credentials_manager)

取得した client_id と client_secret を入れる。

アーティストの情報を pandas データフレームにいれるためのデータフレームを用意。

artist_df = pd.DataFrame(columns=['artist_name','artist_ID','genre','popularity','related_artist_names'])

3.最初のアーティストを検索

最初に軸となるアーティストを決める。今回は乃木坂 46。(何人かのアーティストを試した結果、一番面白い結果になった。) 名前は全てアルファベットで記入する。

# 最初のアーティストを取得
name = 'Nogizaka46'
spotapi_out = spotify.search(q='artist:' + name, type='artist')
artist_items = spotapi_out['artists']['items'][0]
artist_id = artist_items['id']
artid_list = [artist_id]
artname_related_list = []
spotapi_out_related = spotify.artist_related_artists(artist_id)
for artname_related in spotapi_out_related['artists']:
    artname_related_list.append(artname_related['name'])
s = pd.Series([artist_items['name'], artist_items['id'], artist_items['genres'],artist_items['popularity'],artname_related_list],index=artist_df.columns)
artist_df = artist_df.append(s,ignore_index=True)


4.関連アーティストの関連アーティストを探す

artid_list_tail = 0
relation_size=2
Threshold=50

for i in range(relation_size):
    artid_list_head = artid_list_tail
    artid_list_tail = len(artid_list)
    for artid in artid_list[artid_list_head:artid_list_tail]:
        spotapi_out = spotify.artist_related_artists(artid)
        for artid_related in spotapi_out['artists']:
            artist_df_bool = artist_df['artist_ID']==artid_related['id']
            if artist_df_bool.sum()==0 and artid_related['popularity']>=Threshold:
                # 類似のアーティストリストを作成
                spotapi_out_related = spotify.artist_related_artists(artid_related['id'])
                artname_related2_list = []
                for artname_related2 in spotapi_out_related['artists']:
                    artname_related2_list.append(artname_related2['name'])
                artid_list.append(artid_related['id'])
                s = pd.Series([artid_related['name'], artid_related['id'], artid_related['genres'],
                               artid_related['popularity'], artname_related2_list], index=artist_df.columns)
                artist_df = artist_df.append(s,ignore_index=True)

関連の関連の…と続けると数は指数的に増大するので、繰り返し数である relation_size は今回は 2 でやる。


5.アーティストの関連情報を辞書に格納

どのアーティストが誰と関連しているかを表す辞書を作る。

artdic = {}
for i in range(len(artid_list)):
    artdic[artist_df.iloc[i,0]] = []
for i in range(len(artid_list)):
    for artname_related in artist_df.iloc[i,4]:
        artdic[artist_df.iloc[i,0]].append(artname_related)


6. アーティスト間のネットワークを可視化

#グルーピングしてグラフ表示
G = nx.Graph(artdic)
plt.figure(figsize = [50, 50])
pos = nx.spring_layout(G, k = 0.2)
partition = community_louvain.best_partition(G)
betcent = nx.communicability_betweenness_centrality(G)
node_size = [1000 * size for size in list(betcent.values())]
nx.draw_networkx_labels(G, pos, font_color='k')
nx.draw_networkx_nodes(G, pos ,node_color=[partition[node] for node in G.nodes()], node_size=node_size, cmap=plt.cm.RdYlBu, alpha=0.7, node_shape="o",
                    linewidths = 1)
nx.draw_networkx_edges(G, pos, alpha=0.3)
plt.axis('off')
plt.show()


結果

null

見にくいので拡大。

それぞれのアーティストの距離が近いほど、関連性が強いことを表している。

null

乃木坂 46 は、赤い丸が集まっている場所の下の方。 周辺を見てみると、SEKAI NO OWARI や miwa, juju がある事が分かる。 これはかなり意外。 てっきり AKB や欅坂が近くにあるのかと思ってた。

ちなみに AKB は中央の黄色い点。乃木坂との関連性にかなりの距離がある事が分かる。

また、右端にアイドルグループが固まっているが、乃木坂 46 はそのクラスターから離れている事から、乃木坂 46 のファン層はアイドルファン層のみ、という状況を脱しつつあることがわかる。(これは興味深い)

また、左上をみると、「EXILE」や「EXILE TRIBE」、「GENERATIONS」、「E-girls」などの LDH グループのクラスターができていることが分かる。

null

これは、EXILE 系グループを支持する層というのが明確に存在するということを表していると言える。

最後に

ジャニーズグループも調べたかったけれど、Spotify に音楽提供してないからできなかった。(泣)

以上。