Pandas의 활용 능력을 키우려면 많은 데이터를 다루는 것이 가장 중요하다. 비록 이 블로그에서는 기본 데이터를 다루지만 더 나아가 Kaggle의 기본 데이터셋 갖고 실습하는 것이 실력을 늘리기에 가장 좋다.
이번 글에는 영화 평점 분석을 할 것이다. 매우 거창한 것은 아니나 기본 개념 다지기에 알맞다.
먼저 데이터를 불러온다.
import pandas as pd
users=pd.read_csv('movie_users.csv') # 사용자 정보
users.head(3)
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 = 행의 개수 이기 때문에 쓴 것이다. 자신이 편한 방법으로 쓰는 것을 추천한다.
- USER dataframe 과 RATINGS dataframe 결합하기
두 데이터 프레임을 결합하기 위해선 결합할 수 있는 기본키를 알아야한다. 이 데이터프레임은 열의 개수가 적어서 바로 결합할 수 있는 키가 '사용자 아이디' 임을 알 수 있다. 만약에 데이터 프레임의 열이 엄청 많다면 어떻게 확인할까?
바로 set 함수를 이용해서 공통의 컬럼을 찾을 수 있다.
set(users.columns) & set(ratings.columns)
# {'사용자아이디'}
서로의 교집합을 알 수 있다.
하지만 교집합을 몰라도 결합이 가능한 것이 pandas의 merge함수이다.
data1=pd.merge(users,ratings)
보통 on = 'key'로 확실하게 키를 설정해주지만 키를 따로 설정하지 않으면 기본적으로 컬럼의 이름이 같은 것 끼리 결합된다.
- data1과 영화 정보 데이터프레임 결합하기
위와 같은 방법으로 진행한다.
set(data1.columns) & set(details.columns)
# {'영화아이디'}
df=pd.merge(data1,details)
이번에는 영화 아이디가 공통 컬럼으로 들어가 결합이 된다.
- 인기있는 영화 10편 찾기 ( 평균 평점이 4이상이고 평점 개수가 2000개 이상인 영화)
이를 알기 위해선 영화별로 평점의 평균, 개수가 필요하다. 따라서 로우는 제목 / 영화아이디, 값은 평점, 함수는 평균,개수를 사용하여 pivot_table을 만들면 된다.
tmp=df.pivot_table(index='제목',values='평점',aggfunc=['mean','count'])
하지만 뭔가 보기가 안좋다. 그래서 이쁘게 보기 위해 swaplevel 를 해준다.
tmp=df.pivot_table(index='제목',values='평점',aggfunc=['mean','count']).swaplevel(1,0,axis=1)
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)
(평점,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 데이터 테이블을 생성 후 기존에 결합했던 data1 데이터 프레임과 결합해보자.
이를 위해선 데이터의 컬럼을 변경할 필요가 있다. 왜냐하면 평점과 평균 평점의 구분이 없기 때문이다. 따라서 s2 데이터 프레임의 컬럼을 변경해준다.
s2.columns=['제목','평균평점']
그리고 최종적으로 merge하여 데이터셋을 생성한다.
pd.merge(df,s2)
자세한 코드는 https://github.com/winston1214/baseline_ML -> Star와 팔로우 해주시면 감사하겠습니다.
'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 |
댓글