앞에서 스크랩 한 2가지 데이터를 이제 전처리하고 모델링하여 분석에 적합한 구조로 만들어야 한다.
1. 데이터 불러오기
먼저 US만 필터한 Spotify TOP 200의 데이터를 불러오고 a 이름으로 데이터 프레임을 저장 한 뒤 읽어본다.
(데이터 프레임 이름 붙이는거… 고민하기 싫어서 a,a1,a2,a3…. b,b1,b2,b3 이런식으로 했는데 나중에 고쳐야겠다)
(2017–2019년 US Daily Top 200 리스트로 총 8개 컬럼 218200행이다. )
a = pd.read_csv('/Users/dahee/Desktop/Project_dahee/spotify/Data/us/spotify_us.csv')a.head()
이번엔 각 곡의 오디오 정보를 담고 있는 Audio Features by Track의 데이터를 불러오고 b 이름으로 데이터 프레임을 저장 한 뒤 읽어본다.
(총 19개 컬럼 62596행이다.)
b = pd.read_csv('/Users/dahee/Desktop/Project_dahee/spotify/Data/audio_features.csv')b.head()
2. 데이터 가공
데이터를 가공하기 전에 한번 확인을 해보자.
a에서 Artist가 Drake인 것만 필터해서 보면 아래와 같다.
각 곡의 특징으로 클러스터링을 해야하는데 지금 데이터를 보면 각 일자별로 God’s Plan이 여러행 있다. 이러면 안된다. 왜냐? 각 곡당 레코드가 1줄씩 있어야하기 때문이다. 그렇다고 레코드 1개만 나누고 걍 랜덤으로 지운다? 그러면 또 안된다. Streams를 무시할 수 없기 때문이다. (나중에 스트리밍 수로도 추가 분석 또는 화면에 나타내면 분석의 깊이를 더할 수 있으니까>.<)
암튼 그래서 해야되는것은 group by 이다.
a[a['Artist'] == 'Drake']
먼저 무엇을 기준으로 group by 해야하는지 알아야한다.
그것은 바로 URL에 있다.
이전에 데이터 스크랩하면서 살펴보았듯이, URL 마지막 슬래시 다음에 있는 것이 각 곡의 유니크한 ID이다.
즉, ID를 기준으로 group by 하면 된다.
그럼 URL 필드에서 ID를 꺼내보자.
URL의 데이터 타입은 object이니 이를 먼저 str으로 바꾸고 슬래시를 기준으로 split 한 뒤 4번째 요소를 빼오면 그것이 바로 ID.
a.URL.str.split('/').str[4]
이렇게 뺀 ID를 새로운 컬럼으로 추가한다.
info를 보면, 총 9개 컬럼으로 맨 마지막에 id 항목이 추가되었다.
a['id'] = a.URL.str.split('/').str[4]
a.info()
이제 진짜 group by!
Artist, Track, id를 기준으로 group by 하는데 이 때 Streams, Rank 와 같은 측정값은 sum, mean으로 집계한다. 그리고 a2 이름으로 저장한다.
(이제부터 시작되는 a + number…)
한번 봐보면 아래 이미지와 같다. 근데 좀 Artist, Track, id 필드명 위치와 Streams, Rank 위치가 약간 다르다.
a2 = a.groupby(['Artist', 'Track', 'id']).agg({'Streams': 'sum', 'Rank': 'mean'})
a2.head(10)
a2.info
group by를 하면 그 기준이 index가 된다. 이 index를 reset 해줘야 한다.
index level을 설정한 뒤 이를 a3에 저장하고 한번 확인해본다.
a3 = a2.reset_index(level=['Artist', 'Track', 'id'])
a3[a3['Artist'] == 'Drake']
info 로도 봐보면, 총 5개 컬럼으로 잘 되어 있다.
a3.info()
3. 데이터 모델링
이제 2개의 데이터를 조인해서 1개의 데이터 원본으로 만들어 분석에 적합한 데이터 구조로 만들어야 한다. ( a3 + b)
a3를 기준으로 Left Join 할 것이고 이 때 Key는 ‘id’ 필드이다.
(python에서 join 코드는 너무나도 간단하고 빨라서 놀람 tmi)
결과는 a4라는 이름으로 저장한다.
a4 = a3.merge(b, on='id', how='left')
a4.head()
a4[a4['Artist']=='Drake']
불필요한 필드들이 몇 개 있는 것 같아 drop 하고 a5에 저장한다.
a5 = a4.drop(columns=["Unnamed: 0", "type", "uri", "track_href", "analysis_url"])
a5.info()
분석에 오류를 막기 위해, null이 있는 행을 삭제하고 a6에 저장한다.
a6 = a5.dropna()
a6로 분석에 적합한 데이터 모델이 완성되었다.
각 곡에 총 3개년 스트리밍수, 평균 순위, 오디오 특징을 확인할 수 있는 데이터가 되었다.
데이터 스크랩, 데이터 전처리, 데이터 모델링까지 되었으니
이제 드디어, 정말루, 분석할 수 있다!!!!!!
다음 글에서는,
위 데이터 모델을 이용해서 Python에서 먼저 클러스터링한 것과
Tableau에서도 Tabpy를 활용하여 클러스터링한 것을 작성할 것이다.
#갑자기 #열정 #대방출