기간 : 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명)

긍정적인 점수를 준 분들은 대체로 본인의 취향에 맞고 좋아하는 가수를 추천해줬다 했고,

부정적인 점수를 준 분들은 조금 생뚱맞거나 너무 옛날 노래가 나왔다는 평이다.

+ Recent posts