🐍 Python

파이썬으로 영화 추천 시스템 만들기: 상관계수 & 코사인 유사도 기반 추천(구글 코랩)

itstory(Booho) 2025. 2. 10. 14:11
728x90

영화 추천 시스템 강의

이 강의에서는 상관계수 기반 추천 시스템코사인 유사도 기반 추천 시스템을 단계별로 구현하는 방법을 학습한다. 실습을 통해 데이터를 로드하고 전처리한 후, 추천 알고리즘을 적용하는 과정을 수행할 것이다.


1. 환경 설정 및 데이터 로드

1.1 데이터 파일 업로드

구글 코랩을 사용하여 movie_title.csv와 movie_review.csv 파일을 업로드한다.

from google.colab import files
# 사용자가 파일을 업로드할 수 있도록 요청
uploaded = files.upload()

1.2 데이터 읽기

데이터를 pandas를 사용하여 읽어온다.

import pandas as pd

# CSV 파일을 데이터프레임으로 읽어오기
movies = pd.read_csv("movie_title.csv")
reviews = pd.read_csv("movie_review.csv")

1.3 데이터 확인

데이터가 올바르게 로드되었는지 확인한다.

# 첫 5개의 데이터를 출력하여 데이터 확인
print(movies.head())
print(reviews.head())

첫 5개의 데이터를 출력하여 데이터 확인

출력 예시:

   movie_id       title
0        1      Toy Story
1        2      Jumanji
   user_id  movie_id  rating  timestamp
0       196      242     3.0  978302109

2. 데이터 병합 및 전처리

2.1 영화 제목과 평점 데이터를 병합

reviews 데이터와 movies 데이터를 movie_id를 기준으로 병합한다.

# movie_id를 기준으로 데이터 병합
merged_df = pd.merge(reviews, movies, on="movie_id")
print(merged_df.head())

reviews 데이터와 movies 데이터를  movie_id 를 기준으로 병합

2.2 특정 사용자가 본 영화 찾기

예를 들어, user_id = 1인 사용자가 본 영화 목록과 별점을 조회한다.

user_id = 1
# 특정 사용자의 영화 목록과 별점 필터링
user_movies = merged_df[merged_df['user_id'] == user_id]
print(user_movies[['title', 'rating']])

2.3 별점 분포 시각화

사용자들이 부여한 영화 별점의 분포를 히스토그램으로 시각화한다.

import matplotlib.pyplot as plt
import seaborn as sns

# 히스토그램을 이용해 영화 별점의 분포를 시각화
plt.figure(figsize=(10, 5))
sns.histplot(merged_df['rating'], bins=10, kde=True)
plt.title("영화 별점 분포")
plt.xlabel("별점")
plt.ylabel("빈도")
plt.show()


3. 상관계수 기반 추천 시스템

3.1 유저-영화 평점 행렬 생성

각 사용자의 영화 별점을 행렬 형태로 변환한다.

# 유저 ID를 행(index), 영화 제목을 열(columns)로 하는 피벗 테이블 생성
ratings_matrix = merged_df.pivot_table(index='user_id', columns='title', values='rating')

3.2 상관계수 계산

피어슨 상관계수(Pearson Correlation Coefficient)를 사용하여 영화 간 유사도를 계산한다.

# 피어슨 상관계수를 이용해 영화 간 유사도 행렬 생성
corr_matrix = ratings_matrix.corr(method='pearson')

3.3 특정 영화와 유사한 영화 찾기

예를 들어, "Toy Story"와 가장 유사한 영화를 찾는다.

movie_name = "Toy Story"
# 특정 영화의 상관관계를 정렬하여 유사한 영화 찾기
similar_movies = corr_matrix[movie_name].dropna().sort_values(ascending=False)
print(similar_movies.head(10))

3.4 오류 발생 원인 및 해결

오류 예시:

KeyError: 'Toy Story'

해결 방법:

  • ratings_matrix의 컬럼 이름에 불필요한 공백이 포함될 수 있으므로, strip()을 사용하여 공백을 제거한다.
ratings_matrix.columns = ratings_matrix.columns.str.strip()

4. 코사인 유사도 기반 추천 시스템

4.1 코사인 유사도 계산

코사인 유사도를 사용하여 유저 간의 유사도를 측정한다.

df_similar_movie = pd.DataFrame()
for i in range(24) : 
  print(my_rating['title'][i],my_rating['rating'][i])
  movie_title=my_rating['title'][i]
  recom_movie = df_corr[movie_title].dropna().sort_values(ascending=False).to_frame()
  recom_movie.columns = ['correlation']
  recom_movie['weigth'] = recom_movie['correlation']*my_rating['rating'][i]
  df_similar_movie = pd.concat([df_similar_movie,recom_movie])

4.2 특정 유저와 유사한 유저 찾기

특정 사용자(예: user_id=1)와 가장 유사한 사용자를 찾는다.

# 특정 사용자의 유사도 점수를 정렬
my_rating=df.loc[df['user_id']==4,['user_id','title','rating']].reset_index(drop=True)

5. 추천 결과 분석 및 시각화

5.1 추천 영화 시각화

유사한 영화 추천 결과를 막대 그래프로 시각화한다.

# 추천된 영화 목록 가져오기
top_movies = similar_movies.head(10).index.tolist()
top_ratings = similar_movies.head(10).values

plt.figure(figsize=(12, 6))
sns.barplot(x=top_movies, y=top_ratings)
plt.xticks(rotation=45)
plt.xlabel("영화")
plt.ylabel("유사도")
plt.title("유사한 영화 추천")
plt.show()

6. 실습 문제 및 정답 코드

문제 1: 특정 사용자가 본 영화 목록을 조회하는 코드를 작성하세요.

문제 2: 특정 영화와 가장 유사한 5개의 영화를 찾는 코드를 작성하세요.

 

문제 3: 상관계수와 코사인 유사도를 비교하고 차이를 설명하세요.

정답 코드:

# 특정 사용자의 영화 목록 조회
user_id = 10
print(merged_df[merged_df['user_id'] == user_id][['title', 'rating']])

# 특정 영화와 유사한 5개의 영화 찾기
movie_name = "Jumanji"
print(corr_matrix[movie_name].dropna().sort_values(ascending=False).head(5))

상관계수 기반 추천은 영화의 평점 상관관계를 사용하고, 코사인 유사도는 벡터 유사도를 이용한다.
상관계수는 연관성이 높은 영화들을 추천하지만, 코사인 유사도는 사용자의 패턴을 보다 정밀하게 반영한다.

728x90