반응형
처음 데이터는 kaggle에서 찾았다.
www.kaggle.com/rounakbanik/the-movies-dataset
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()
여기까지 전처리를 하였다.
반응형
'Project' 카테고리의 다른 글
[movie recomendation] 알고리즘에 따른 영화 추천 시스템 구현 - 3(시각화) (0) | 2020.10.21 |
---|---|
[movie recomendation] 알고리즘에 따른 영화 추천 시스템 구현 - 2(알고리즘 구현 부분) (0) | 2020.10.19 |
[movie recomendation] 알고리즘에 따른 영화 추천 시스템 구현 (2) | 2020.09.10 |