Data Preprocessing & Data Modeling

Dahee Lee
6 min readApr 23, 2020

--

앞에서 스크랩 한 2가지 데이터를 이제 전처리하고 모델링하여 분석에 적합한 구조로 만들어야 한다.

1. Spotify TOP 200

2. Audio Features by Track

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에서 ArtistDrake인 것만 필터해서 보면 아래와 같다.

각 곡의 특징으로 클러스터링을 해야하는데 지금 데이터를 보면 각 일자별로 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를 활용하여 클러스터링한 것을 작성할 것이다.

#갑자기 #열정 #대방출

--

--