AI, Machine Learning

상관계수를 이용한 영화 추천 시스템

ssury94 2025. 2. 10. 21:57
 
 
 

 

추천 시스템을 구축하는 방법에는 여러 가지가 있지만,

그 중 상관계수를 이용한 방법은 아이템 간의 유사도를 측정하여 추천하는 방식으로 많이 사용됩니다.

이번 글에서는 상관계수를 이용한 영화 추천 시스템을 구현하는 방법을 설명하겠습니다. 🍿

 

🔍 협업 필터링과 아이템 기반 추천

협업 필터링(Collaborative Filtering)은 사용자(User)나 아이템(Item) 간의 유사성을 바탕으로 추천하는 방법입니다.

협업 필터링에는 크게 두 가지 접근 방식이 있습니다.

  1. 👥 사용자 기반(User-Based) 추천: 유사한 취향을 가진 사용자들이 선호하는 영화를 추천
    • ❌ 단점: 유저의 수가 많아질수록 계산량이 기하급수적으로 증가 (복잡도 증가)
  2. 🎥 아이템 기반(Item-Based) 추천: 사용자가 좋아하는 아이템과 유사한 아이템을 추천
    • ❌ 단점: 사용자의 기호가 변할 수 있어 정적인 추천이 될 가능성이 있음
    • ✅ 장점: 아이템 간 유사도를 미리 계산하여 추천 속도가 빠름

실제 서비스에서는 아이템 기반 추천이 더 많이 사용됩니다.

 

📊 상관계수를 이용한 영화 유사도 측정

두 개의 영화 간의 유사도를 계산하기 위해 피어슨 상관계수(Pearson Correlation Coefficient)를 사용합니다.

이는 -1에서 1 사이의 값을 가지며, 1에 가까울수록 두 영화의 평점 패턴이 유사하다는 의미입니다. 🎯

📌 피봇 테이블을 활용한 데이터 변환

영화 간의 상관관계를 분석하기 위한 corr()함수 사용을 위해서는, 컬럼 상태를 변경할 필요가 있습니다.

피봇 테이블을 활용하여 데이터를 변환합니다.

  • user_id를 행(index) 으로 설정
  • title을 열(columns) 로 설정
  • rating을 값(value) 으로 설정하여 평균 별점을 저장
df_matrix = df.pivot_table(index='user_id', columns='title', values='rating', aggfunc='mean')

 

 

df_matrix.corr()

🛠️ 리뷰 개수 필터링

모든 영화에 대해 상관계수를 계산하면 신뢰도가 낮은 데이터도 포함될 수 있습니다. 따라서 리뷰 개수가 50개 이상인 영화만 상관계수를 구하는 필터링 과정이 필요합니다.

df_corr = df_matrix.corr(min_periods=50)

이제 영화 간의 유사도를 측정할 준비가 되었습니다. ✅

🎭 특정 사용자에게 영화 추천하기

예를 들어, user_id가 4번인 사용자가 볼만한 영화를 추천하려면 다음과 같은 절차를 따릅니다.

1️⃣ 사용자가 본 영화 확인

df.loc[df['user_id'] == 4]

2️⃣ 유저가 평가한 영화 목록 가져오기

my_rating = df.loc[df['user_id'] == 4, ['user_id', 'title', 'rating']].reset_index(drop=True)

3️⃣ 유사 영화 찾기

각 영화에 대한 상관계수를 기반으로 추천 영화를 찾습니다. 🎯

df_similar_movie = pd.DataFrame()
for i in range(my_rating.shape[0]):
    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['weight'] = recom_movie['correlation'] * my_rating['rating'][i]
    df_similar_movie = pd.concat([df_similar_movie, recom_movie])

여기서 correlation 값은 영화 간 유사도를 나타내며, weight는 유저가 준 평점을 반영한 가중치입니다. ⚖️

4️⃣ 중복 제거 및 본 영화 제거

추천 영화 목록을 정리하기 위해 중복을 제거하고, 본 영화는 제거해야 합니다. 🗑️

✅ 중복 제거 (가중치가 높은 값 유지)

df_similar_movie = df_similar_movie.groupby('title')['weight'].max().sort_values(ascending=False)

❌ 본 영화 제거

for i in range(my_rating.shape[0]):
    movie_title = my_rating['title'][i]
    if movie_title in df_similar_movie.index:
        df_similar_movie.drop(movie_title, axis=0, inplace=True)

5️⃣ 최종 추천 영화 출력 (상위 10개) 🎉

df_similar_movie.head(10)

⚖️ 가중치란 무엇인가?

가중치는 단순한 상관계수 값에 사용자가 부여한 평점(rating) 을 곱하여 사용자의 선호도를 반영하는 역할을 합니다. 🎯

recom_movie['weight'] = recom_movie['correlation'] * my_rating['rating'][0]

즉, 사용자가 높은 평점을 준 영화일수록 가중치가 높아지므로 추천 영화가 더욱 정교해집니다. 🏆

🔚 결론

이번 글에서는 상관계수를 이용한 영화 추천 시스템을 구현하는 방법을 살펴보았습니다. 추천 시스템을 구축하는 과정에서

  • 🎥 아이템 기반 협업 필터링이 실무에서 많이 사용됨
  • 📊 피봇 테이블을 활용하여 데이터 변환
  • 📌 상관계수를 사용하여 영화 유사도 측정
  • 🛠️ 리뷰 개수 필터링을 통한 신뢰도 확보
  • ⚖️ 가중치를 적용한 정교한 추천

 

이러한 방법을 활용하면 개인 맞춤형 영화 추천이 가능해지며, 사용자의 선호도를 반영하여 더욱 정교한 추천을 제공할 수 있습니다. 🎯