추천 시스템은 사용자에게 개인화된 경험을 제공하기 위해 데이터 분석과 머신러닝 기술을 활용하는 중요한 도구입니다. 이번 포스팅에서는 실제 데이터셋을 이용해 간단한 추천 시스템을 만드는 과정을 소개하겠습니다. 우리는 Python과 그 유명한 데이터 분석 라이브러리인 Pandas, 머신러닝 라이브러리인 Scikit-learn을 사용할 것입니다.

데이터셋 준비

우선, 추천 시스템을 만들기 위해 사용할 데이터셋을 준비해야 합니다. 여기서는 MovieLens 데이터셋을 사용할 것입니다. 이 데이터셋은 영화에 대한 사용자 평가 데이터를 포함하고 있으며, 추천 시스템 실습에 적합합니다. 데이터셋은 MovieLens 웹사이트에서 다운로드할 수 있습니다.

wget https://files.grouplens.org/datasets/movielens/ml-latest-small.zip
unzip ml-latest-small.zip

데이터셋 로드 및 탐색

Pandas를 이용해 데이터셋을 로드하고 탐색할 수 있습니다. 아래 코드는 데이터를 로드하고 간단히 탐색하는 예제입니다.

import pandas as pd

# 데이터 로드
movies = pd.read_csv('ml-latest-small/movies.csv')
ratings = pd.read_csv('ml-latest-small/ratings.csv')

# 데이터 탐색
print(movies.head())
print(ratings.head())
print(f"Total movies: {len(movies)}, Total ratings: {len(ratings)}")

데이터 전처리

추천 시스템을 구축하기 전에 데이터 전처리를 해야 합니다. 여기서는 사용자-영화 행렬을 생성할 것입니다. 이 행렬은 각 사용자가 각 영화에 대한 평점을 매긴 형태입니다.

# 사용자-영화 행렬 생성
user_movie_matrix = ratings.pivot_table(index='userId', columns='movieId', values='rating')
user_movie_matrix.fillna(0, inplace=True)

# 행렬 확인
print(user_movie_matrix.head())

유사도 계산

추천 시스템의 핵심은 유사도를 측정하는 것입니다. 여기서는 코사인 유사도를 사용하여 영화 간의 유사도를 계산하겠습니다.

from sklearn.metrics.pairwise import cosine_similarity

# 코사인 유사도 계산
movie_similarity = cosine_similarity(user_movie_matrix.T)

# 유사도 데이터프레임 생성
similarity_df = pd.DataFrame(movie_similarity, index=user_movie_matrix.columns, columns=user_movie_matrix.columns)

# 상위 5개 유사한 영화 확인
print(similarity_df.loc[1].sort_values(ascending=False).head(6))

추천 시스템 구축

이제 우리는 사용자가 평가한 영화를 바탕으로 추천 시스템을 구축할 수 있습니다. 특정 영화에 대해 유사한 영화를 추천하는 함수를 만들어 보겠습니다.

def get_movie_recommendations(movie_id, num_recommendations=5):
    similar_movies = similarity_df[movie_id].sort_values(ascending=False)
    return similar_movies.iloc[1:num_recommendations + 1].index.tolist()

# 예시: 영화 ID 1에 대한 추천
recommendations = get_movie_recommendations(1)
recommended_movies = movies[movies['movieId'].isin(recommendations)]
print(recommended_movies)

모델 평가

이제 추천 시스템이 작동하는 것을 확인했으니, 성능을 평가해보는 것도 중요합니다. 일반적으로 Precision@K와 Recall@K 같은 지표를 사용합니다. 그러나 이번 예제에서는 추천 결과를 단순히 확인하는 것으로 대체하겠습니다.

# 추천 결과를 확인하는 간단한 예시
for movie_id in recommendations:
    print(movies[movies['movieId'] == movie_id]['title'].values[0])

마무리

이번 포스팅에서는 MovieLens 데이터셋을 활용하여 간단한 추천 시스템을 구축하는 방법을 살펴보았습니다. 데이터셋을 로드하고 전처리한 후, 유사도를 계산하고 추천 시스템을 구현하는 과정을 진행했습니다. 실습을 통해 추천 시스템의 기본 원리를 이해할 수 있었기를 바랍니다. 앞으로 더욱 발전된 추천 시스템을 만들기 위해 다양한 알고리즘과 기술을 실험해보시기 바랍니다. 데이터 분석의 세계는 무궁무진하니, 끊임없이 학습하고 도전하는 자세를 잊지 마세요!