<아랑고DB> 프로젝트. 그래프를 통한 영화 추천시스템 만들어보기 1
16 Jan 2022 | 아랑고DB 그래프DB 추천시스템1. Kaggle이란
Kaggle 캐글은 데이터를 통해 현실의 문제를 해결하기 위한 플랫폼이다.
데이터셋을 제공하고, 상금을 걸어 세계 각지에 있는 소중규모 팀들이 챌린지를 하는데,** 원하는 결과값에 가장 가까운 팀이 상금을 차지하는 방식이다.
이러한 챌린지뿐만 아니라 수많은 데이터셋을 제공하고, 이러한 데이터셋을 다른 사람들은 어떻게 접근했고 분석했는지도 살펴볼 수 있다.
나는 그 중에서 Netflix Prize Data라는 데이터셋을 가져와 변형하였다.
내 글을 참고하여 자신만의 데이터셋을 찾아 맵핑해도 좋으나, 이러한 과정이 처음이라면 내 글을 그대로 따라하는 것을 추천한다.
나는 1 ~ 4번의 전체 데이터 파일에서, 1번 파일만 사용하였고, 그 중에서도 1000명의 유저에 대한 데이터만 샘플링하였다.
최종적으로는 아래 두 개의 파일로 정리했으니, 받아서 사용하면 된다.
혹시 다운로드가 안 된다면 여기에 들어가서 직접 다운로드 해주자.
두 파일을 로컬에 저장해도 좋고, 그냥 url을 코드에 넣어서 그때그때 다운로드해도 무방하다.
2. 데이터 살펴보고 변형하기
일단 데이터를 불러와서, 최종 형태만 살펴보자.
데이터는 csv 형태이므로 pandas
패키지의 read_csv
를 사용한다.
import pandas as pd
movies = pd.read_csv('https://raw.githubusercontent.com/ud803/ud803.github.io/main/public/movie_titles.csv', encoding='ISO-8859-1', header=None, names=['id', 'year', 'name'])
ratings = pd.read_csv('https://raw.githubusercontent.com/ud803/ud803.github.io/main/public/netflix.csv', encoding='ISO-8859-1', header=None, names=['user', 'movie', 'rating', 'date'])
print(movies.shape, ratings.shape)
#(17770, 3), (84942, 4)
shape
함수를 통해 데이터프레임의 사이즈를 보면, 각각 17770, 84942개의 행을 가진 것을 알 수 있다.
데이터를 더 자세히 살펴보자
# 타입 확인하기
movies.dtypes
ratings.dtypes
# NA값 확인하기
movies[movies.isna().any(axis=1)]
ratings[ratings.isna().any(axis=1)]
확인해보니 movies
의 출시 연도가 float 형태로 되어있다.
정수형으로 바꾸고 NA 값도 날려주자.
# dropNA
movies = movies.dropna()
# 제작 연도를 정수형으로 바꿔준다
movies = movies.astype({'year' : 'int32'})
3. 아랑고에 넣을 데이터 설계하기
이제 가장 재미있는 일만 남았다. 이 데이터들을 어떻게 아랑고DB에 맵핑할 것인가?
모든 데이터베이스가 마찬가지이지만, 일단 내가 데이터를 어떤 형태로 저장할 것이고, 어떻게 참조(쿼리)할 것인가를 구상해야 한다.
내 계획은 이렇다. 영화 추천 시스템이니까 당연히 영화(M)라는 버텍스가 있어야 하고, 사람(U)을 나타내는 버텍스가 또 있어야 한다.
그리고 사람(U)이 영화(M)를 평가(R)하는 엣지가 중간에 존재해야 한다. TMI이지만 Neo4j Cypher에서는 이를 (User) -[rated]-> (Movie) 와 같은 직관적인 방식으로 표현한다.
거기에 더해서, 나는 영화의 출시 연도도 추천 시스템에 넣고 싶다. 결과적으로, 아래의 같은 5개의 컬렉션들이 생성되어야 한다.
- 버텍스 컬렉션 : 영화(Movie), 사람(User), 출시연도(Year)
- 엣지 컬렉션 : (사람)-[rated]->(영화), (영화)-[created_at]->(출시연도)
4. 아랑고에 데이터 맵핑하기
자 이제 데이터를 어떻게 넣으면 될까? 이제껏 배운 방식을 총동원하여 각각에 맞는 데이터를 넣어줘도 되지만, 우리는 이미 만들어진 패키지를 가져다 쓰면 된다.
바로 python-arango-mapper라는 패키지이며, 내가 만들었다.. 😊
맵핑할 데이터에 대한 스키마를 지정해주면, 자동으로 데이터를 넣어준다.
우선 pip을 통해 패키지를 설치해주자.
# Python 3.7 이상에서 동작한다!!
pip install python-arango-mapper
schemas = {
# Type 1
'Movie': {
'type': ('vertex', 'unique_vertex'),
'collection': 'Movie',
'unique_key': ('id',),
'fields': {
'name': 'name',
'year': 'year'
},
'index': [
{'field' : ('name',), 'unique' : False, 'ttl' : False}
]
},
# Type 1
'Year': {
'type': ('vertex', 'unique_vertex'),
'collection': 'Year',
'unique_key': ('year',),
'fields': {
'year': 'year'
},
'index': [
{'field' : ('year',), 'unique' : True, 'ttl' : False}
]
},
# Type 1
'User': {
'type': ('vertex', 'unique_vertex'),
'collection': 'User',
'unique_key': ('user',),
'fields': {
'user': 'user'
},
'index': [
{'field' : ('user',), 'unique' : True, 'ttl' : False}
]
},
# User - rated -> Movie
# Type 3
'rated': {
'type': ('edge', 'unique_edge_on_event'),
'collection': 'rated',
'unique_key': (‘date’,),
'_from_collection': 'User',
'_from': ('user',),
'_to_collection': 'Movie',
'_to': ('movie',),
'fields': {
'rating': 'rating',
'date': 'date'
},
'index': []
},
# Movie - created_at -> Year
# Type 2
‘created_at’: {
'type': ('edge', 'unique_edge_btw_vertices'),
'collection': 'created_at',
'_from_collection': 'Movie',
'_from': ('id',),
'_to_collection': 'Year',
'_to': ('year',),
'fields': {
},
'index': []
}
}
스키마가 복잡해보이지만, 한 번 세팅해두면 계속해서 손쉽게 사용할 수 있다.
from pam import client, database, converter
# ArangoDB에 연결
arango_conn = client.get_arango_conn(hosts="http://localhost:8529")
database_obj = database.create_and_get_database(arango_conn, 'movie_ratings', 'root', 'passwd')
# 데이터프레임을 딕셔너리의 리스트 형태로 바꿔준다
data_1 = movies.to_dict('records')
# 전체 스키마를 사용하는 것이 아니기 때문에 사용할 리스트를 지정해준다
data_1_map = ['Movie', 'created_at', 'Year']
converter.arango_converter(data_1, database_obj, schemas, data_1_map)
# Data 2 Upload
data_2 = ratings.to_dict('records')
data_2_map = ['User', 'rated']
converter.arango_converter(data_2, database_obj, schemas, data_2_map)
위 코드만 실행시켜주면 데이터는 성공적으로 들어간다!
5. 다음 단계는
이제 데이터를 모두 넣었다. pam
패키지를 통해 어떠한 데이터 종류든 손쉽게 그래프 형태로 맵핑이 가능하다!
다음 글에서는 실제 들어온 데이터를 가지고 이제껏 배워온 AQL을 뽐내는 시간을 가져보자.
그래프 탐색도 하고, 통계도 뽑아보고, 최종적으로는 추천 시스템을 만들어 볼 예정이다.
아마 다음 글이 아랑고DB 시리즈의 마지막 글이 될 것 같다 😢
애정을 가지고 작성해온 만큼, 유종의 미를 거둬야겠다!! 지금까지 글을 읽으며 따라와주신 분들께 감사하다는 말씀을 드리고 싶다 :)
6. 어디까지왔나
- 아랑고DB란? 왜 쓰는가?
- 아랑고DB 세팅하기 on Ubuntu
- 아랑고DB 쉘로 붙어서 명령어 체험해보기, 실체 파악해보기
- AQL(Arango Query Lang) 배워보기 1
- AQL(Arango Query Lang) 배워보기 2 - RETURN / UPDATE
- AQL(Arango Query Lang) 배워보기 3 - REPLACE / UPSERT / REMOVE
- 그래프 개념잡기
- 그래프 횡단하기 Graph Traversal
- 데이터 모으기 COLLECT / AGGREGATE / MIN_BY, MAX_BY
- (지금 보고있는 글)프로젝트. 그래프를 통한 영화 추천시스템 만들어보기 1
- 프로젝트. 그래프를 통한 영화 추천시스템 만들어보기 2 (최종편)