본문 바로가기메뉴 바로가기


멜론 플레이리스트 데이터 탐색 – 카카오 아레나 3회 대회(Part.2)

이 글은 멜론 플레이리스트 데이터 탐색 – 카카오 아레나 3회 대회(Part.2)라는 이름으로 카카오 정책산업연구 브런치에 동시 개제되었습니다.


카카오 아레나 3회 대회가 개최되었습니다. 이번 대회는 멜론에서 제공 중인 DJ플레이리스트와 관련된 주제로, 플레이리스트에 수록된 곡과 태그 정보를 기반으로 추천 곡들과 태그를 예측하는 것을 목표로 합니다. 지난 Part.1 글을 통해서 대회 참가자 분들의 이해를 돕기 위해 ‘멜론의 음악 추천 방법‘에 대해 설명드렸고, 이번 Part.2에서는 ‘아레나 대회 데이터 탐색‘을 통해 데이터의 특징을 살펴보는 내용을 준비하였습니다.

※ 아레나 대회에 활용되는 데이터는 원활한 대회 진행을 위해 가공되었으며 해당 내용은 실제 멜론 유저의 소비 패턴을 반영하고 있지 않음을 전달드립니다.


음악 플레이리스트를 맞춰 보자!

이번 3회 대회는 국내 음원 서비스인 멜론에서 제공 중인 DJ플레이리스트와 관련된 주제 입니다. 멜론DJ는 멜론 내 인기 있는 여러 서비스 중 하나로 DJ로 선정된 유저들이 직접 TPO(Time, Place, Occasion) 등 다양한 테마를 고려하여 양질의 곡들을 선정한 후 이를 플레이리스트로 제공해주고 있습니다. 또한 파워DJ들이 매 요일마다 고퀄리티의 플레이리스트를 업데이트하고 전문가 선곡 등 원하는 장르별로 심혈을 기울여 선곡한 플레이리스트가 매일 업데이트 되고 있으며, 이러한 DJ플레이리스트는 해마다 지속적으로 증가하고 있는 추이를 보입니다.
[그림 1] 누적 DJ플레이리스트 추이[그림 2] (좌) 월간 일 평균 DJ플레이리스트 스트리밍 점유율 추이, (우) 월간 일 평균 DJ플레이리스트 곡 점유율 추이

그에 따라 현재는 2017년 초 대비 DJ플레이리스트에서 곡을 소비하는 비율은 약 두 배 정도 상승하였고, DJ플레이리스트에 포함된 곡 수가 약 5% 상승하는 등 다양한 곡 소비의 창구로 활용되고 있습니다.[그림 3] 월간 일 평균 DJ플레이리스트 스트리밍 유저 비율 추이[그림 4] 일주일 간 스트리밍 일수 별 유저 비율

스트리밍 점유율뿐만 아니라 DJ플레이리스트를 찾는 유저들도 점점 증가하는 추이를 보이고 있고([그림 3]), 일주일 동안 스트리밍 하는 유저들 중 약 절반은 2일 이상 DJ플레이리스트를 소비하는 경향을 보입니다([그림 4]).

아래 [표 1]을 보시면 DJ플레이리스트는 시즌별 트렌드를 잘 표현하기도 합니다.[표 1] 매년 1월 1일 일간 인기 DJ플레이리스트 Top 3 (2019 vs. 2020)[표 2] 매년 12월 31일 일간 인기 DJ플레이리스트 Top 3 (2018 vs. 2019)[표 3] 2019년 서울에 비가 오던 날 일간 인기 DJ플레이리스트 Top 3 (2019년 7월 vs. 9월)

이번 3회 대회는 이런 플레이리스트의 제목과 플레이리스트에 붙어 있는 태그, 그리고 곡 목록이 일부 주어졌을 때 나머지 곡 또는 태그를 예측하는 문제입니다. 즉, 플레이리스트의 일부 정보를 가지고 이와 유사한 플레이리스트를 자동으로 생성하는 것을 목표로 합니다. 이 글에서는 이번 대회에 참여하시는 분들에게 조금이나마 도움을 드리고자 대회 데이터를 탐색한 내용 일부를 공유드리고자 합니다.

대회 데이터 EDA

탐색 결과를 소개하기에 앞서 대회에서 제공하는 해당 데이터는 대회 진행을 목적으로 적합한 샘플링 작업을 거친 데이터라는 점을 알려드립니다. 소개할 내용들이 멜론 DJ플레이리스트 서비스를 일반화할 수 없음을 참고하여 주시기 바랍니다.

 곡 장르 코드 데이터: genre_gn_all.json 

장르 코드는 총 30개의 대분류 장르 코드와 224개의 상세 장르 코드가 있습니다.

  • 대분류 장르 코드는 뒷 자리 숫자 네 자리 중 끝자리가 ‘00’인 코드로 분류할 수 있습니다..
  • 상세 장르 코드는 대분류 장르 코드와 반대로 장르 코드 뒷 자리 중 끝자리가 ‘00’이 아닌 코드로 분류할 수 있습니다.

대분류 장르 코드

아래는 30개의 대분류 장르 코드입니다. 같은 대분류 장르명을 갖더라도 코드가 다른 케이스가 존재합니다. 이는 국내/해외 장르로 구분할 수 있으며 숫자 값이 더 큰 장르가 해외음악 장르입니다.
[표 4] 장르 코드 대분류

장르 코드 트리(Tree)

대분류 장르 코드와 상세 장르 코드는 앞 자리 네 자리를 가지고 조합하여 장르 코드 트리를 구성해 볼 수 있습니다. 아래는 어린이/태교(GN2200) 장르의 장르 코드 트리 예시입니다.
[표 5] 어린이/태교(GN2200) 장르 코드 트리 예시

 곡 별 메타 데이터: song_meta.json 

곡 메타 데이터에는 총 707,989곡의 발매일자, 대분류 장르, 상세 장르, 아티스트명, 앨벙명 등의 메타 정보가 담겨 있습니다.

곡 별 매핑되는 장르 수는?

[그림 5] 대분류 장르 개수 별 곡 비율 분포

대부분의 곡들은 한 개의 대분류 장르와 매핑되어 있습니다. 전체 곡의 약 13%는 2개 이상의 장르를 가지며 아래는 2개 이상의 대분류 장르를 갖는 곡 예시입니다.
[표 6] 2개 이상의 대분류 장르를 가지는 곡 예시

가장 많이 매핑되는 장르는?

[그림 6] 대분류 장르 코드 별 곡 비율 분포(매핑되는 곡 한정)

대회 데이터 기준으로 POP장르(GN0900) 곡의 비율이 가장 높았고 국악, 뮤지컬, 종교음악 장르의 비중은 1% 미만의 비율을 보입니다. 아이돌 아티스트 관련 장르인 아이돌 장르와 댄스 장르 비중도 비교적 낮게 나타납니다.

발매 연도별 곡 비중은?

[그림 7] 발매 연도별 곡 수 및 비율(1990년~)

각 곡의 발매 연도별 곡의 비중을 1990년 이후부터 확인해본 결과 2014~2019년도에 발매한 곡의 비중이 절반에 가까운 비율(약 49%)을 보이고 있습니다.

 학습용 데이터: train.json 

데이터는 총 115,071개 플레이리스트의 태그 및 수록곡, 좋아요 횟수, 업데이트 일시 정보가 담겨져 있습니다. 해당 학습용 데이터 안에서 식별되는 곡 수는 총 615,142개(전체 메타 곡 수 대비 86.9%)이며, 플레이리스트에 매핑된 유니크 태그 수는 총 29,160개 입니다.

플레이리스트 별 곡/태그 수 분포

플레이리스트 별 수록된 곡 수의 분포를 확인해본 결과 평균 약 46개(중앙값 30개)의 곡이 수록되어 있으며 최대 200곡의 수록곡을 포함한 플레이리스트가 존재합니다.
[표 7] 플레이리스트 별 수록된 곡 수의 분포

플레이리스트 당 태그는 평균 약 4개(중앙값 3개)가 포함되어 있습니다.
[표 8] 플레이리스트 별 매핑된 태그 수 분포

곡/태그/플레이리스트명 중복 비율은?

[그림 8] 플레이리스트 중복 수록 여부에 따른 곡 비율

[그림 8]에서 보시는 것처럼 수록 곡의 약 51%는 두 개 이상의 플레이리스트에 중복 수록된 곡 입니다. 아래 [표 9]는 중복 수록된 곡들 중 많이 수록된 곡 상위 5개 리스트이며 발라드 풍의 노래가 상위권을 보입니다.[표 9] 중복 수록된 곡의 상위 5개 음악

[표 10]은 단일 수록된 곡들 중 많은 곡이 수록된 장르 상위 다섯 개입니다.[표 10] 수록된 곡이 많은 상위 5개 장르

전체 대비 약 40.2%(11,729개)는 두 개 이상의 플레이리스트에 매핑된 태그입니다([그림 9]).[그림 9] 중복 매핑 여부 별 태그 비율

플레이리스트 고유 아이디 값은 다르지만 같은 이름을 갖는 플레이리스트도 전체 대비 약 2% 정도로 소수 존재합니다([그림 10]). 이러한 플레이리스트들은 대부분 곡 수와 태그 수도 비슷한 편이 많았습니다. [그림 10] 동일한 플레이리스트 이름을 가지는 플레이리스트 비율

많은 빈도를 보이는 태그는?

[그림 11] 플레이리스트 매핑 태그 분포

플레이리스트 매핑 기준 1,000회 이상 매핑된 태그를 살펴본 결과 기분전환 태그명이 가장 많은 빈도를 보이고 있으며 여름/가을/겨울 등 계절이나 장르, 그리고 드라이브, 카페, 매장음악 등 특정 상황과 어울리는 태그 등이 상위권에 분포되어 있습니다.
[그림 12] 매핑 태그 리스트 상위 30

단일 태그가 아닌 한 개 이상의 태그 리스트를 기준으로 매핑 기준 상위 30개를 확인해본 결과 다른 태그와 조합 없는 장르 태그가 상위권을 차지하고 있습니다([그림 12]). 또한 빈도가 가장 높았던 기분전환 태그명은 휴식, 힐링뿐만 아니라 스트레스, 드라이브, 사랑, 설렘 등 다양한 태그와 같이 조합을 이루는 케이스가 많았습니다.

태그별 어떤 곡들이 수록되었을까?

위에서 언급한 태그 리스트 일부를 샘플로 하여 해당 태그들을 포함하는 플레이리스트들은 어떤 장르의 곡을 담고 있는 지 확인해본 결과 입니다.
[그림 13] 각 태그 리스트 별 상위 장르 Top 7 비교

드라이브, 스트레스, 기분전환 태그가 매핑된 플레이리스트와 카페, 매장음악 태그가 매핑된 플레이리스트에서는 POP(GN0900) 장르와 일렉트로니카(GN1100) 장르의 비율이 높았습니다([그림 13]). 이 밖에 대부분 태그에서 발라드(GN0100) 곡 비중이 가장 높았으며, 추억, 회상 등의 태그가 매핑된 플레이리스트에서는 20%가 넘는 비중을 보이기도 합니다. 추억, 회상 태그가 매핑된 플레이리스트에서는 발라드 다음으로 OST 비중이 높습니다. 이와 같이 태그별 플레이리스트 수록 곡 특징을 탐색하여 플레이리스트의 곡 장르 성격을 추정해볼 수 있습니다.[그림 14] 각 태그 리스트/발매 연도별 곡 비중

플레이리스트 수록 곡들의 발매년도 기준으로 살펴본 결과 태그 명처럼 추억, 회상이 매핑된 플레이리스트들은 다른 태그의 플레이리스트에 비해 비교적 과거 발매 곡 비중이 조금 더 높은 편을 확인할 수 있습니다.

역으로 곡별 태그를 매핑해본다면?

각 플레이리스트에는 한 개 이상의 태그들이 매핑되어 있고, 한 곡 이상의 곡들이 수록되어 있습니다. 이 부분을 고려하여 곡별 수록된 플레이리스트의 태그 값을 매핑해본다면 곡의 메타 정보를 하나 더 파생시켜서 볼 수 있습니다.[표 11] 곡별 매핑 태그 수 분포

곡별 매핑되는 태그 값은 평균 18개(중앙값 7개)이고 최대 1,928개의 태그가 매핑된 곡도 존재하며([표 11]), 최대 1,928개의 태그가 매핑된 곡은 ‘아이유 – 밤편지’ 곡입니다.[표 12] 태그 기준 유사 느낌의 곡 찾기(예시: 아이유 – 밤편지)

[표 12]는 ‘아이유 – 밤편지’ 곡이 수록된 플레이리스트에 매핑된 태그 빈도 기준 상위 5개입니다. 감성 태그를 갖는 690개의 플레이리스트에 가장 많이 수록되어 있습니다. 빈도가 가장 높았던 감성이라는 태그에 매핑되는 곡 중 ‘아이유 – 밤편지’를 제외하면 그다음으로 빈도가 높은 곡은 ‘폴킴 – 비’ 입니다([표 13]).[표 13] 감성 태그 매핑 곡의 빈도 비교

‘폴킴 – 비’ 곡은 ‘아이유 – 밤편지’와 비슷하게 감성 태그를 갖는 총 735개의 플레이리스트에 수록되어 있습니다. 두 곡은 같이 수록될 가능성이 비교적 높아 보입니다.[표 14] 감성 태그가 매핑된 곡의 아티스트 상위 5위

[표 14]는 감성 태그가 매핑 되는 곡의 아티스트 상위 5개를 보여주며, 폴킴은 두 번째로 가장 많이 등장합니다.

마치며

지금까지 학습 데이터를 포함한 대회 데이터를 가지고 간단한 데이터 탐색 작업을 통하여 데이터의 특징을 살펴보았습니다. 앞에서 분석한 내용을 정리하면 아래와 같이 요약할 수 있을 것 같습니다.

1. 장르는 대분류 장르와 상세 장르로 구분되어지며 약 13%의 곡은 2개 이상의 대분류 장르를 가지고 있다.

2. 두 개 이상의 플레이리스트에 중복으로 수록된 곡의 비중은 약 51%이며 ‘아이유 – 밤편지’ 곡이 가장 많이 수록되어 있다.

3. 두 개 이상의 플레이리스트에 중복으로 매핑된 태그는 약 40.2%이며, 플레이리스트 이름이 동일한 플레이리스트도 일부 존재 한다.

4. 기분전환 태그가 가장 많은 빈도를 보이고 있으며, 장르와 관련된 태그도 많은 빈도를 보이고 있다.

5. 태그 별 수록곡을 살펴보았을 때 대부분 팝과 발라드 장르가 수록된 케이스가 많았으며, 카페/매장음악/기분전환 등의 태그가 매핑된 플레이리스트에서는 일렉트로니카 장르 비중이 높았다.

6. 주어진 데이터를 잘 활용하여 곡 별 태그를 매핑해보고 유사 특징을 찾아볼 수 있다.

이 밖에 글에 소개된 데이터가 궁금하신 분들은 카카오 아레나 공식 페이지에서 확인하실 수 있습니다. 아직 살펴보지 못한 부분들도 많으니 적절한 EDA를 진행하여 모델에 활용할 수 있는 다른 특징들도 찾아보시길 바라며, 대회의 마지막 날까지 많은 관심과 참여 부탁드립니다.


데이터는 원활한 대회 진행을 목적으로 가공되었으며, 해당 내용은 실제 멜론 유저의 소비 패턴을 반영하고 있지 않음을 다시 한번 말씀드립니다.

글 | 카카오 추천팀, 장정택   jade.jjj@kakaocorp.com

kakao tech
kakao tech Developer Relations at kakao corp.
Top Tag
adaptive-hash-index
adt
agile
agilecoach
ai
Algorithm/ML
Algorithm/Ranking
almighty-data-transmitter
android
angular
anycast
applicative
Architecture
arena
async
aurora
Backend
bgp
ble
blind-recruitment
block
blockchain
bluetooth
brian
cahtbot
cd
ceph
certificate
certification
cgroup
ci
cite
clojure
close-wait
cloud
cloudera-manager
clustered-block
cmux
cnn
code-festival
code-review
coding
competition
component
conference
consul
container
contest
couchbase
COVID-19
cpp
Data
DB
deep-learning
developer
developers
devops
digitalization
digitaltransformation
dns
docker
employeecard
eslint
Featured
friendstime
front-end
functional-programming
funfunday
fzf
garbage-collection
gawibawibo
GC
github
go
graphdb
graphql
growth
ha
hadoop
hbase
hbase-manager
hbase-region-inspector
hbase-snashot
hbase-table-stat
hbase-tools
hri
id
ifkakao
infrastructure
innodb
internship
ios
item
Java
javascript
json
kafka
kakao
kakao-commerce
kakao-games
kakaoarena
kakaocon
kakaok
kakaokey
kakaokrew
kakaomap
kakaotalk
KCDC
khaiii
kubernetes
l3dsr
l4
links
load-balancing
machine-learning
marathon
meetup
melon
mesos
Messaging
microservice
mobil
monad
mtre
mysql
mysql-realtime-traffic-emulator
nand-flash
network
new
new-krew
nfc
nomad
ocp
open
opensource
openstack
OpenWork
page
parallel
PBA
programming-contest
pycon
python
quagga
reactive-programming
reactor
recommendation
recruitment
redis
redis-keys
redis-scan
rest
rubics
ruby
rxjs
s2graph
scala
scalaz
server
service
sharding
shopping
socket
spark
spark-streaming
SpringBoot
ssd
Statistics/Analysis
Stomp
storage
storm
style-guide
support
System
talk
talkchannel
tcp
tech
test
Thread-Debugging
time-wait
tmux
update
vim
vim-github-dashboard
vim-plugin
vue
web-cache
webapp
WebSocket
weekly
All Tag
adaptive-hash-index
adt
agile
agilecoach
ai
Algorithm/ML
Algorithm/Ranking
almighty-data-transmitter
android
angular
anycast
applicative
Architecture
arena
async
aurora
Backend
bgp
ble
blind-recruitment
block
blockchain
bluetooth
brian
cahtbot
cd
ceph
certificate
certification
cgroup
ci
cite
clojure
close-wait
cloud
cloudera-manager
clustered-block
cmux
cnn
code-festival
code-review
coding
competition
component
conference
consul
container
contest
couchbase
COVID-19
cpp
Data
DB
deep-learning
developer
developers
devops
digitalization
digitaltransformation
dns
docker
employeecard
eslint
Featured
friendstime
front-end
functional-programming
funfunday
fzf
garbage-collection
gawibawibo
GC
github
go
graphdb
graphql
growth
ha
hadoop
hbase
hbase-manager
hbase-region-inspector
hbase-snashot
hbase-table-stat
hbase-tools
hri
id
ifkakao
infrastructure
innodb
internship
ios
item
Java
javascript
json
kafka
kakao
kakao-commerce
kakao-games
kakaoarena
kakaocon
kakaok
kakaokey
kakaokrew
kakaomap
kakaotalk
KCDC
khaiii
kubernetes
l3dsr
l4
links
load-balancing
machine-learning
marathon
meetup
melon
mesos
Messaging
microservice
mobil
monad
mtre
mysql
mysql-realtime-traffic-emulator
nand-flash
network
new
new-krew
nfc
nomad
ocp
open
opensource
openstack
OpenWork
page
parallel
PBA
programming-contest
pycon
python
quagga
reactive-programming
reactor
recommendation
recruitment
redis
redis-keys
redis-scan
rest
rubics
ruby
rxjs
s2graph
scala
scalaz
server
service
sharding
shopping
socket
spark
spark-streaming
SpringBoot
ssd
Statistics/Analysis
Stomp
storage
storm
style-guide
support
System
talk
talkchannel
tcp
tech
test
Thread-Debugging
time-wait
tmux
update
vim
vim-github-dashboard
vim-plugin
vue
web-cache
webapp
WebSocket
weekly

위로