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

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

まだインストールされてない場合は 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()

結果

見にくいので拡大。

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

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

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

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

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

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

最後に

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

以上。

コメントを残す

以下に詳細を記入するか、アイコンをクリックしてログインしてください。

WordPress.com ロゴ

WordPress.com アカウントを使ってコメントしています。 ログアウト /  変更 )

Google フォト

Google アカウントを使ってコメントしています。 ログアウト /  変更 )

Twitter 画像

Twitter アカウントを使ってコメントしています。 ログアウト /  変更 )

Facebook の写真

Facebook アカウントを使ってコメントしています。 ログアウト /  変更 )

%s と連携中

%d人のブロガーが「いいね」をつけました。
search previous next tag category expand menu location phone mail time cart zoom edit close