티스토리 뷰

 

이틀간 《파이썬 라이브러리를 활용한 데이터 분석》 14장의 두 번째 예제를 필사해보았다.

MovieLens 사용자로부터 수집한 영화 평점 데이터를 활용해 머신러닝 알고리즘에 활용할 데이터를 가공할 수 있다. 

import pandas as pd
pd.options.display.max_rows = 10 

최대로 출력되는 열의 개수를 10개로 설정한다. 

unames = ['user_id', 'gender', 'age', 'occupation', 'zip']
users = pd.read_table('path', sep = '::', header = None, names = unames)

(path에는 movielens 데이터 중 users.dat가 들어간다) 원본 코드는 이것인데, 이번에도 에러가 발생했다. 

::를 구분자로 인식하는 것이 지원되지 않는다는 이야기인가보다. 두 번째 줄의 닫는 괄호 전 맨 마지막에 engine='python'을 덧붙이는 것으로 해결. 

같은 방식으로 ratings.dat와 movies.dat도 불러와준다. 

 

rnames = ['user_id', 'movie_id', 'rating', 'timestamp']
ratings = pd.read_table('path', sep='::', header=None, name = rnames, engine='python')

mnames = ['movie_id', 'title', 'rating', 'genres']
movies = pd.read_table('path', sep='::', header=None, name = mnames, engine='python')

users[:5]
ratings[:5]
movies[:5]

unames, rnames, mnames로 세 개의 .dat 파일을 모두 불러온 다음 앞부분 5개의 row를 확인해본다. 

각각 사용자 데이터, 유저가 각 영화에 매긴 평점, 영화 id에 대응하는 타이틀과 장르를 확인할 수 있다. 

 

세 개의 테이블을 병합하기 위해서는 두 개를 먼저 병합한 다음 나머지 하나를 병합해야 한다. 

pandas를 활용하면 병합하려는 테이블들에 중복되는 컬럼이 있을 경우, 그 컬럼의 이름은 키로 사용할 수 있다. 

data = pd.merge(pd.merge(ratings, users), movies)
data

위에서 출력할 줄의 최댓값을 10으로 설정했기 때문에 data를 병합한 다음 확인해봐도 다음처럼 10줄만 출력된다. 

 

 

data.iloc[0] #data의 0번째 row를 출력

데이터를 확인하는 습관을 들이자 

 

mean_ratings = data.pivot_table('rating', index = 'title', columns = 'gender', aggfunc='mean')

pivot_table method를 통해 gender에 따른 영화의 평균 평점을 구할 수 있다. 

앞의 다섯 줄만 잘라 보면 이렇게 나온다. 

 

 

 

~28일에 한 부분은 내일 계속