본문 바로가기
Python/python 기초

Pandas를 활용한 영화 평점 분석

by winston1214 2020. 8. 25.
반응형

Pandas의 활용 능력을 키우려면 많은 데이터를 다루는 것이 가장 중요하다. 비록 이 블로그에서는 기본 데이터를 다루지만 더 나아가 Kaggle의 기본 데이터셋 갖고 실습하는 것이 실력을 늘리기에 가장 좋다.

이번 글에는 영화 평점 분석을 할 것이다. 매우 거창한 것은 아니나 기본 개념 다지기에 알맞다.

먼저 데이터를 불러온다.

import pandas as pd
users=pd.read_csv('movie_users.csv') # 사용자 정보
users.head(3)

users.head()

Unnamed: 0 이라는 불순 컬럼이 생성되었으므로 Unnamed: 0을 삭제해준다.

users.drop('Unnamed: 0', axis=1, inplace=True)

axis=0은 행을 삭제하는 것이고, axis=1은 열을 삭제하는 것이다. 또한, inplace=True는 다른 변수로 덮어씌우지 않아도 이 변수 내에서 자동으로 덮어씌우는 것으로 편리하지만 원본 데이터가 손상된다는 점에서 유의하게 써야된다.

같은 방법으로 다른 데이터들도 불러온다.

ratings=pd.read_csv('movie_ratings.csv')
details=pd.read_csv('movie_details.csv')
ratings.drop('Unnamed :0',axis=1,inplace=True)
details.drop('Unnamed :0',axis=1,inplace=True)

그리고 데이터의 형태를 확인해보자.

# 사용자, 영화, 평점 데이터 수 확인
print('''사용자: {},
영화수: {}
평점수:{}'''.format(len(users),details.shape[0],len(ratings)))

# 사용자: 6040,
# 영화수: 3883
# 평점수:1000209

나름 큰 데이터임을 알 수 있다. 이 때 len과 shape[0]을 번갈아썼는데 이는 데이터 프레임에서 len = 행의 개수 이기 때문에 쓴 것이다. 자신이 편한 방법으로 쓰는 것을 추천한다.

users
ratings

- USER dataframe 과 RATINGS dataframe 결합하기

두 데이터 프레임을 결합하기 위해선 결합할 수 있는 기본키를 알아야한다. 이 데이터프레임은 열의 개수가 적어서 바로 결합할 수 있는 키가 '사용자 아이디' 임을 알 수 있다. 만약에 데이터 프레임의 열이 엄청 많다면 어떻게 확인할까?

바로 set 함수를 이용해서 공통의 컬럼을 찾을 수 있다.

set(users.columns) & set(ratings.columns)

# {'사용자아이디'}

서로의 교집합을 알 수 있다.

하지만 교집합을 몰라도 결합이 가능한 것이 pandas의 merge함수이다.

data1=pd.merge(users,ratings)

보통 on = 'key'로 확실하게 키를 설정해주지만 키를 따로 설정하지 않으면 기본적으로 컬럼의 이름이 같은 것 끼리 결합된다.

data1

- data1과 영화 정보 데이터프레임 결합하기

위와 같은 방법으로 진행한다.

set(data1.columns) & set(details.columns)
# {'영화아이디'}

df=pd.merge(data1,details)

이번에는 영화 아이디가 공통 컬럼으로 들어가 결합이 된다.

df

- 인기있는 영화 10편 찾기 ( 평균 평점이 4이상이고 평점 개수가 2000개 이상인 영화)

이를 알기 위해선 영화별로 평점의 평균, 개수가 필요하다. 따라서  로우는 제목 / 영화아이디, 값은 평점, 함수는 평균,개수를 사용하여 pivot_table을 만들면 된다.

tmp=df.pivot_table(index='제목',values='평점',aggfunc=['mean','count'])

tmp

하지만 뭔가 보기가 안좋다. 그래서 이쁘게 보기 위해 swaplevel 를 해준다.

tmp=df.pivot_table(index='제목',values='평점',aggfunc=['mean','count']).swaplevel(1,0,axis=1)

tmp.swaplevel

swaplevel(i,j,axis)에서 i j는 교환하고자 하는 인덱스 라벨(혹은 인덱스 번호)이고 axis는 0일 때 행 인덱스, 1일 때 열 인덱스를 뜻한다. 디폴트는 행 인덱스이다.

이 상태의 피벗테이블 상태에서 인덱싱을 해주면 된다.

# 평균평점 : 4이상
# &
# 평점개수 : 2000개 이상
tmp2 = tmp[(tmp[('평점','mean')] >= 4) & (tmp[('평점','count')]>=2000)]
tmp2.sort_values(('평점','mean'),ascending=False).head(10)

tmp2.sort_values

(평점,mean)을 하나의 열로 인식하게 하고 이것이 4보다 큰 것들만 골라내고 그 다음은 count로 정렬하여 정리한다.

그리고 우선순위를 평점으로 줘서 내림차순 정렬하고 상위 10개만 head로 뽑아낸다.

이러한 피벗테이블을 데이터 프레임 형식으로 바꿔보자

- pivot_table -> dataframe

s1=df.groupby('제목')['평점'].mean()

groupby()를 사용하여 제목으로 그룹을 묶은 다음 그 제목에 대한 평균평점을 반환한다.

그리고 이를 reset_index()로 인덱스가 0,1,2,3... 형태로 바꿔준다. groupby형태는 index가 영화 제목으로 설정 되어있다.

s2=s1.reset_index().copy()

s2

- 최종 데이터셋 생성

s2 데이터 테이블을 생성 후 기존에 결합했던 data1 데이터 프레임과 결합해보자.

이를 위해선 데이터의 컬럼을 변경할 필요가 있다. 왜냐하면 평점과 평균 평점의 구분이 없기 때문이다. 따라서 s2 데이터 프레임의 컬럼을 변경해준다.

s2.columns=['제목','평균평점']

그리고 최종적으로 merge하여 데이터셋을 생성한다.

pd.merge(df,s2)

tail(10)

 

자세한 코드는 https://github.com/winston1214/baseline_ML    -> Star와 팔로우 해주시면 감사하겠습니다.

 

winston1214/baseline_ML

ML을 위한 기초 공부. Contribute to winston1214/baseline_ML development by creating an account on GitHub.

github.com

movie data.zip
8.01MB

 

 

반응형

'Python > python 기초' 카테고리의 다른 글

파이썬 리뷰  (2) 2020.07.03
Pandas를 이용한 NC 다이노스 선수 분석  (0) 2020.03.05
Pandas - 3  (0) 2020.02.23
Pandas - 2  (0) 2020.02.02
Pandas - 1  (0) 2020.01.31

댓글