K-Pop '그룹'(인물)의 인기도가 아닌 '음악' 자체의 오디오 특성이 해당 그룹의 성공에 미친 영향이 있는지를 파악하기 위해 K-Pop 오디오 특성을 분석하는 프로젝트를 진행하였다.
- 인기에 영향을 미치는 오디오 특성이 있는가?
- 국가별로 선호하는 오디오 특성이 있는가?
- 아티스트별 핵심 오디오 특성이 있는가?
'스포티파이 차트에 진입한 적이 있는 K팝 아이돌 그룹'의 곡들
을 분석 대상으로 선정하였다.
스포티파이 차트를 인기도를 판단할 기준이 되는 차트로 선정한 이유는 (1) Spotify API를 사용할 수 있다는 점 그리고 (2) 스포티파이 글로벌 차트 관련 기록이 K팝의 '해외' 인기를 판단하기에 적합하다는 점 2가지가 있었다.
남자 그룹 | 여자 그룹 |
---|---|
BTS, ENHYPEN, Stray Kids, SEVENTEEN, BIGBANG, TREASURE, EXO, NCT DREAM, TOMORROW X TOGETHER | BLACKPINK, TWICE, Red Velvet, (G)I-DLE, aespa, NMIXX, LE SSERAFIM, IVE, ITZY, Kep1er, NewJeans |
각 분석 대상에 대한 아티스트 URL을 저장했다.
# 스포티파이 글로벌 일간 차트인 (걸그룹)
blackpink = 'https://open.spotify.com/artist/41MozSoPIsD1dJM0CLPjZF'
twice = 'https://open.spotify.com/artist/7n2Ycct7Beij7Dj7meI4X0'
redvelvet = 'https://open.spotify.com/artist/1z4g3DjTBBZKhvAroFlhOM'
newjeans = 'https://open.spotify.com/artist/6HvZYsbFfjnjFrWF950C9d'
ive = 'https://open.spotify.com/artist/6RHTUrRF63xao58xh9FXYJ'
lesserafim = 'https://open.spotify.com/artist/4SpbR6yFEvexJuaBpgAU5p'
itzy = 'https://open.spotify.com/artist/2KC9Qb60EaY0kW4eH68vr3'
aespa ='https://open.spotify.com/artist/6YVMFz59CuY7ngCxTxjpxE'
gidle = 'https://open.spotify.com/artist/2AfmfGFbe0A0WsTYm0SDTx'
kep1er = 'https://open.spotify.com/artist/5R7AMwDeroq6Ls0COQYpS4'
nmixx = 'https://open.spotify.com/artist/28ot3wh4oNmoFOdVajibBl'
# 스포티파이 글로벌 일간 차트인 (보이그룹)
bts = 'https://open.spotify.com/artist/3Nrfpe0tUJi4K4DXYWgMUX'
straykids = 'https://open.spotify.com/artist/2dIgFjalVxs4ThymZ67YCE'
seventeen = 'https://open.spotify.com/artist/7nqOGRxlXj7N2JYbgNEjYH'
txt = 'https://open.spotify.com/artist/0ghlgldX5Dd6720Q3qFyQB'
enhypen = 'https://open.spotify.com/artist/5t5FqBwTcgKTaWmfEbwQY9'
nctdream = 'https://open.spotify.com/artist/1gBUSTR3TyDdTVFIaQnc02'
exo = 'https://open.spotify.com/artist/3cjEqqelV9zb4BYE3qDQ4O'
treasure = 'https://open.spotify.com/artist/3KonOYiLsU53m4yT7gNotP'
bigbang = 'https://open.spotify.com/artist/4Kxlr1PRlDKEB0ekOCyHgX'
분석 대상에 대한 데이터셋을 추출하기 위해서 Spotify API를 활용했다.
API 활용 방법과 추출하는 코드, 추출한 세부 항목별 의미는 아래 참고 자료에 있는 Spotify for Developers 공식 문서, Spotipy 공식 문서, 를 포함한 여러 가지 자료들을 참고하였다.
간단히 요약하자면 Spotify API를 활용하기 위해서는 Spotify for Developers에서 앱 등록을 해야 하고, 'Spotipy'라는 파이썬 라이브러리를 통해 Spotify Web API를 이용할 수 있다.
수집한 데이터는 다음과 같다.
각 아티스트 -> 아티스트별 앨범 -> 앨범별 트랙 -> 트랙별 특성을 추출하는 방식으로 for문을 돌렸다.
artist_list = [blackpink, twice, redvelvet, newjeans, ive, lesserafim, itzy, aespa, gidle, kep1er, nmixx,
bts, straykids, seventeen, txt, enhypen, nctdream, exo, treasure, bigbang]
feature_list = []
# 아티스트
for artist in artist_list:
artistprofile = sp.artist(artist_id = artist)
artistalbums = sp.artist_albums(artist_id = artist, limit = 50)
artist_popularity = artistprofile['popularity']
# 아티스트별 앨범
for i in range(len(artistalbums['items'])):
album_uri = artistalbums['items'][i]['uri']
album_tracks = sp.album_tracks(album_uri)
# 앨범별 트랙
for j in range(len(album_tracks['items'])):
track_number = album_tracks['items'][j]['track_number'] # track_number
track_uri = album_tracks['items'][j]['uri'] # track uri
track_id = album_tracks['items'][j]['id'] # track id
track_popularity = sp.track(track_id)['popularity'] # track popularity (따로 저장)
audiofeatures = sp.audio_features(track_uri)
# 트랙별 audio features
for feature in audiofeatures:
try:
feature_list.append([artistalbums['items'][0]['artists'][0]['name'], #artist_name
artistalbums['items'][0]['artists'][0]['id'], #artist_id
artistalbums['items'][0]['artists'][0]['uri'], #artist_uri
artist_popularity, #artist_popularity
artistalbums['items'][i]['name'], #album_name
artistalbums['items'][i]['id'], #album_id
album_uri, #album_uri
artistalbums['items'][i]['release_date'], #release_date
track_number, #track_number
title, #track_name
track_name_changed, #track_name_formatted
track_id, #track_id
track_uri, #track_uri
track_popularity, #track_popularity
feature['danceability'], #danceability
feature['energy'], #energy
feature['key'], #key
feature['speechiness'], #speechiness
feature['acousticness'], #acousticness
feature['instrumentalness'], #instrumentalness
feature['liveness'], #liveness
feature['valence'], #valence
feature['tempo'], #tempo
feature['duration_ms'], #duration_ms
feature['time_signature'], #time_signature
feature['loudness'], #loudness
feature['mode'], #mode
feature['type'] #type (총 28개)
])
except Exception as e:
print(e, track_uri, "skipped")
continue
print(artist, "done")
URI | URL |
---|---|
spotify:track:054sQZ2qmw0Ya7N0XSxl3j | https://open.spotify.com/track/054sQZ2qmw0Ya7N0XSxl3j |
추출한 audio feature의 의미는 다음과 같다.
특성 | 의미 |
---|---|
acousticness | 어쿠스틱 장르인 정도 (0~1 사이 값) |
danceability | 춤 추기에 어울리는 정도 (0~1 사이 값). 속도, 리듬, 안정성, beat, 강도 등의 특성을 이용해 지표화. |
energy | 빠르거나 시끄러운 음악인 정도 (0~1 사이 값) |
instrumentalness | 보컬이 없는 곡인 정도 (0~1 사이 값) |
liveness | 라이브 음원인 정도 (0~1 사이 값) |
speechiness | 대화하는 (노래가 아닌) 오디오인 정도 (0~1 사이 값) |
valence | 곡이 긍정적인 감정인지의 정도 (0~1 사이 값) |
tempo | 곡의 빠르기. BPM |
key | 음정. C = 0, 반음 올릴 때마다 + 1, -1인 경우는 결측치 |
mode | major: 1, minor: 0 |
time signature | 박자. 한 마디에 4분 음표가 몇 개 들어가는 지에 대한 지표. 정수로 3 ~ 7의 값을 갖는다. 정황상 6/8 은 3으로 표기되는 등 변환되어 표기되는 듯 하다. |
여러 가지 경우에 따른 중복 곡이 존재했다.
아티스트가 곡을 싱글로 발매한 후 앨범으로 다시 발매하거나 리믹스, 외국어 버전을 발매한 경우, 한 가지 곡에 대한 여러 가지 버전이 존재했다. (원곡 제목 + '~ Ver.' 형식으로)
저작권으로 인해 동일한 곡(같은 시점에 같은 이름으로 발매된 곡)에 대한 ID가 여러 개 존재하였다.
API를 가져온 방식으로 인해 드라마/영화 OST의 경우 해당 K팝 그룹이 참여한 트랙 외 다른 트랙 또한 전부 수집되었다.
참고 자료
2. 데이터 수집
스포티파이 차트
4세대 여자 아이돌 기록실 4편 - 해외 음원 (스포티파이)
Spotify API
The Data Science of K-Pop: Understanding BTS through data and A.I.
https://github.com/haebichan/kpopclassifier
Web API Reference | Spotify for Developers
Spotipy 2.22.1 Documentation
Spotify API 사용법 - Spotipy(파이썬 라이브러리) 사용
https://www.charlezz.com/?p=44767