기간 : 9/29 ~ 10/2
프로젝트 아이디어 찾느라 정신 없었는데 휴일 때문에 기간도 짧아서 정말 후딱 지나간 한 주
📕7주차 리뷰
EDA & ML 미니 프로젝트가 끝나자마자 바로 2차 프로젝트 팀빌딩이 되었고, 그냥 한 주 내내 프로젝트만 남은 것 같다.
실 데이터 다루기가 너무 어렵다. ML이 메인일 줄 알았는데 EDA에 시간을 2~3배 이상 쓴 것 같다.
어떤 특성과 어떤 특성이 조합되어야 유의미한 지표가 나올지 관점을 뽑아내는 것도 은근히 센스를 요한다.
강사님이 강조하시던 도메인 지식이란 게 얼마나 큰 것인지 깨닫는 중이다...
🔨미니 프로젝트
1. 주제 선정
미니 프로젝트 2팀 초기 주제
<시대별 음악 트렌드 분석 및 전망 예측>
최종 주제
<Spotify 컨텐츠 기반 음악 추천 시스템>
세계 최대 음원 플랫폼인 만큼 Spotify 관련 데이터셋 자체는 인터넷에 많았지만, 우리가 필요한 '곡 특성'과 '연도', '인기도'가 모두 모여있는 데이터는 의외로 많지 않았고, 또 최신 곡을 담은 데이터셋도 별로 없어 최신화의 문제가 꽤나 발목을 잡았다.
그래서 데이터를 더 찾기보단 이미 가진 것도 충분히 많으니(약 90만 개) 연도를 2023년까지로 한정하여 프로젝트를 시작했다.
→ 추후 2025년 6월까지의 곡을 담은 완전 최신 데이터셋을 발견해, 기존의 데이터와 형태를 맞춰 정제 후 병합했다.
중간에 강사님이 "이 데이터로 정확히 무엇을 하고 싶은지"를 물으셔서 주제에 대해 많은 고민을 했다. 단순 트렌드 분석은 빗나갈 가능성도 크고 무엇보다 재미가 없다. 반면 추천 시스템은 딱 흥미로워서 가능하기만 하면 해보고 싶었다.
팀 회의 끝에 EDA는 곡 특성과 트렌드를 분석하는 것으로 하고, 여기서 나온 인사이트를 기반으로 곡 추천 시스템을 만들어보기로 했다.
2. EDA
🚨 문제 1. 너무 많고 생소한 feature들
컬럼이 너무 많았고, 음악이라는 감성적인 영역을 수치화한 데이터다보니 생소한 용어나 이상치 구분 등의 문제가 있었다. 게다가 팀원 중 스포티파이 이용자가 없어서, 스포티파이를 열심히 사용하시는 강사님에게서 사용자 경험 조언을 많이 받았다.
✅ 장르별로 스펙트럼이 넓을 수밖에 없다보니 이상치 처리 없이 모든 값을 안고 가기로 함
🚨 문제 2. 인기도라는 지표의 모호함
popularity는 곡의 인기도를 0~100으로 점수화한 컬럼이다. 어떤 근거로 산정되는지는 내부 정보라 알아낼 수 없었다. 공식 개발자 문서를 통해 재생 빈도, 공유 수, 최신성 등을 참고해 계산된다는 정도만 캐치할 수 있었다.
✅ 기업에서 제공하는 공식 지표인 만큼 이 숫자를 못믿을 이유는 없다 판단
🚨 문제 3. 결측치가 너무 많은 아티스트 정보
곡을 분석하는데 가수 데이터가 필요할까?에 대한 고민이 있었다. 분석 과정엔 필요없을 지언정 추후 예측이나 분류 시 필요할지도 몰랐기 때문.
✅ Spotify API를 이용, 고유한 곡 ID로 해당 track 정보에 접근하여 artist 정보를 받아오기로 함
🚨 문제 4. 지나치게 세분화된 장르
한 곡이 여러 장르를 가진 경우도 있고, 팝송이 모두 'pop'으로 분류된게 아니라 'latin pop', 'american pop' 등 독립된 세부장르로 분류돼 있었다. 앞에 수식어가 붙은 팝들은 '팝'에 포함되지 않게 되는 문제가 발생했다.
✅ 띄어쓰기 기준으로 문자열 분리. 예를 들어 latin pop은 latin과 pop으로 분리해서 pop이라는 단어로 다룰 수 있게 됨
3. ML
모델에 데이터를 넣기 전 최종적인 전처리를 추가 진행했다.
preprocessor = ColumnTransformer(
transformers=[
('normal', StandardScaler(), normal_features),
('robust', RobustScaler(), robust_features),
('cat', OneHotEncoder(handle_unknown='ignore'), categorical_features),
('tfidf', TfidfVectorizer(stop_words='english', max_features=300), 'track_genre')
],
remainder='drop'
)
- 분포가 비교적 고른 특성은 standard, 분포가 비대칭적인(skewness) 특성은 robust 스케일러를 적용
- 장르의 경우 TF-IDF 벡터화를 이용
모델은 추천류 시스템에 적합하다고 여겨지는 KNN 모델을 채용했다.
n_neighbors = min(20, features_transformed.shape[0] - 1)
knn_model = NearestNeighbors(
metric='cosine',
algorithm='brute',
n_neighbors=n_neighbors
)
knn_model.fit(features_transformed)
- 벡터의 크기보다 방향의 유사성(내적)을 검사하는 코사인 유사도를 파라미터로 넣어, 가까운 특성의 곡을 클러스터링
- 모든 곡을 탐색하는 brute 방식이기에 학습이 느려질 것을 방지해 neighbor의 수를 최대 20으로 한정
4. 결과물
MelodiMatch
https://github.com/SKNetworks-AI19-250818/SKN19-mini-2Team/
GitHub - SKNetworks-AI19-250818/SKN19-mini-2Team
Contribute to SKNetworks-AI19-250818/SKN19-mini-2Team development by creating an account on GitHub.
github.com
사용자가 좋아하는 곡명을 입력하고 추천받을 개수를 고르면, 그 곡과 유사한 곡을 N개 보여주는 시스템

dynamite를 찾으려다 글자를 빼먹은 상황의 처리
오타가 나거나 데이터에 없는 곡이면 유사한 제목의 곡을 제시해준다.

추천 화면에서는 추천 곡을 리스트로 제시해주고
재생 버튼 클릭 시 임베딩된 Spotify 플레이어로 바로 들을 수 있다.
학습 과정에 artist 정보가 없는데도 같은 가수의 곡을 잘 불러오는 걸 보면 나름 나쁘지 않은듯하다.
사용자 평가
SKN 19기 동기 분들에게 실제로 신청곡을 받고 추천 만족도를 수집했다.
- 참여자: 14명
- 종합 평가: 평균 3.7점 / 5.0점
- 점수 분포: 5점 만점(2명), 4점(6명), 3점(5명), 2점(1명)
긍정적인 점수를 준 분들은 대체로 본인의 취향에 맞고 좋아하는 가수를 추천해줬다 했고,
부정적인 점수를 준 분들은 조금 생뚱맞거나 너무 옛날 노래가 나왔다는 평이다.
'SKN 19기' 카테고리의 다른 글
| [플레이데이터 SK네트웍스 Family AI 캠프 19기] 9주차 회고 (0) | 2025.10.26 |
|---|---|
| [플레이데이터 SK네트웍스 Family AI 캠프 19기] 8주차 회고 (0) | 2025.10.18 |
| [플레이데이터 SK네트웍스 Family AI 캠프 19기] 6주차 회고 (0) | 2025.09.28 |
| [플레이데이터 SK네트웍스 Family AI 캠프 19기] 5주차 회고 (0) | 2025.09.24 |
| [플레이데이터 SK네트웍스 Family AI 캠프 19기] 4주차 회고 (0) | 2025.09.14 |