Project

[movie recomendation] 알고리즘에 따른 영화 추천 시스템 구현 - 1 (전처리)

반응형

처음 데이터는 kaggle에서 찾았다.

www.kaggle.com/rounakbanik/the-movies-dataset

 

The Movies Dataset

Metadata on over 45,000 movies. 26 million ratings from over 270,000 users.

www.kaggle.com

kaggle에 가면 다양한 데이터가 있어 사용하기 편리하다. 

여기서 데이터를 얻었고 이것을 가공하여 사용하기로 했다.

 

 

코랩으로 하였고 목차는 위에 처럼 진행하였다.

 

from google.colab import drive  # 구글 코랩에서 drive(내 구글 드라이브)를 사용하기 위한 함수
import io
drive.mount('/content/drive')  # 이렇게 하면 내 drive가 잡힌다.

 

# 이 라이브러리는 추천시스템에 많이 사용 되는 라이브러리다. 이걸 인스톨 해준다.
!pip install surprise
# 여기서는 안쓰는 것도 있지만 일단 넣어줬다.
import pandas as pd # pandas 불러오기
import numpy as np # numpy 불러오기
import math # 불러오기 수학과 관련된 함수들
import re #정규표현식 함수 .맞는지 틀린지
from scipy.sparse import csr_matrix   # 매트릭스 해주는거.
import matplotlib.pyplot as plt # 시각화 함수
import seaborn as sns # 시각화 함수
from surprise import Reader, Dataset, SVD, NormalPredictor, KNNBasic # 알고리즘이 들어간다.
from surprise import KNNWithMeans, KNNWithZScore, KNNBaseline
from surprise import BaselineOnly, SVDpp,NMF, SlopeOne, CoClustering #분석툴
from surprise.accuracy import rmse
from surprise import accuracy
from surprise.model_selection import cross_validate, KFold, train_test_split # 교차검증(다중 평가지표)을 위해 사용 된다.
import json
import mpmath
from scipy.special import logsumexp

from google.colab import drive

 

#전처리 과정

# kaggle을 통해 받은 데이터를 가져온다.
ratings = pd.read_csv('../content/drive/My Drive/data/the-movies-dataset/ratings_small.csv',low_memory=False)
ratings = ratings[['userId', 'movieId', 'rating']]
ratings.head()
ratings.movieId = pd.to_numeric(ratings.movieId, errors='coerce')
ratings.userId = pd.to_numeric(ratings.userId, errors='coerce')
ratings.rating = pd.to_numeric(ratings.rating, errors='coerce')
len(ratings)
df = ratings
print(df)

원본 데이터는 데이터의 양이 너무 많아 small 데이터를 사용하였다. 

print(df)를 하였을 경우에 위와 같이 10만 개의 데이터가 들어있는 걸 볼 수 있다.

# 여기서 결측치를 처리하고 movie id 를 count 했을때 개수에 대해 70 퍼센트의 것들만 가져온다.
# 적은 수의 평가가 있는 영화는 제외했다.
df = df[pd.notnull(df['rating'])]
f = ['count','mean']
df_movie_summary = df.groupby('movieId')['rating'].agg(f)
df_movie_summary.index = df_movie_summary.index.map(int) # map 함수 쓰면 한번에 형변환 처리 가능 , 스트나 튜플을 지정함수로 처리해주는 역할
movie_benchmark = round(df_movie_summary['count'].quantile(0.7),0)  #quantile 사분위수
drop_movie_list = df_movie_summary[df_movie_summary['count'] < movie_benchmark].index
print('Movie minimum times of review: {}'.format(movie_benchmark))

 

# 여기서도 영화 리뷰가 너무 적은 것들은 제외해줬다.
df_cust_summary = df.groupby('userId')['rating'].agg(f)
df_cust_summary.index = df_cust_summary.index.map(int)
cust_benchmark = round(df_cust_summary['count'].quantile(0.7),0)
drop_cust_list = df_cust_summary[df_cust_summary['count'] < cust_benchmark].index
print('Customer minimum times of review: {}'.format(cust_benchmark))

 

# 여기서 위에서 제외할 리스트들을 넣어주어 drop 해주었다.
df = df[~df['movieId'].isin(drop_movie_list)] # df의 'Movie_Id'에서 drop_movie_list의 값이 있으면 True
df = df[~df['userId'].isin(drop_cust_list)]

 

df_p = pd.pivot_table(df,values='rating',index='userId',columns='movieId')
# print(df_p)

여기서 df 에 대한 pivot 테이블을 하나 만들었다. 이건 나중에 사용한다.

 

다음은 영화 데이터를 가져왔다.

# 영화데이터를 가져왔다.
meta = pd.read_csv('../content/drive/My Drive/data/the-movies-dataset/movies_metadata.csv',low_memory=False)

# 필요한 컬럼만 가져온다.
meta = meta[['id', 'original_title', 'genres','release_date','popularity','original_language']]

#간단하게 id 값을 movieId로 바꿔주고
meta = meta.rename(columns={'id':'movieId'})

# 문자열 칼럼을 숫자형 칼럼으로 바꿔주는 작업을 해주었다.
meta.movieId = pd.to_numeric(meta.movieId, errors='coerce')
meta.popularity = pd.to_numeric(meta.popularity, errors='coerce')   # popularity를 문자열에서 숫자형으로 변환!

# meta.head()

여기까지 전처리를 하였다.

 

반응형