상관계수를 이용한 영화 추천 시스템
추천 시스템을 구축하는 방법에는 여러 가지가 있지만,
그 중 상관계수를 이용한 방법은 아이템 간의 유사도를 측정하여 추천하는 방식으로 많이 사용됩니다.
이번 글에서는 상관계수를 이용한 영화 추천 시스템을 구현하는 방법을 설명하겠습니다. 🍿
🔍 협업 필터링과 아이템 기반 추천
협업 필터링(Collaborative Filtering)은 사용자(User)나 아이템(Item) 간의 유사성을 바탕으로 추천하는 방법입니다.
협업 필터링에는 크게 두 가지 접근 방식이 있습니다.
- 👥 사용자 기반(User-Based) 추천: 유사한 취향을 가진 사용자들이 선호하는 영화를 추천
- ❌ 단점: 유저의 수가 많아질수록 계산량이 기하급수적으로 증가 (복잡도 증가)
- 🎥 아이템 기반(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]
즉, 사용자가 높은 평점을 준 영화일수록 가중치가 높아지므로 추천 영화가 더욱 정교해집니다. 🏆
🔚 결론
이번 글에서는 상관계수를 이용한 영화 추천 시스템을 구현하는 방법을 살펴보았습니다. 추천 시스템을 구축하는 과정에서
- 🎥 아이템 기반 협업 필터링이 실무에서 많이 사용됨
- 📊 피봇 테이블을 활용하여 데이터 변환
- 📌 상관계수를 사용하여 영화 유사도 측정
- 🛠️ 리뷰 개수 필터링을 통한 신뢰도 확보
- ⚖️ 가중치를 적용한 정교한 추천
이러한 방법을 활용하면 개인 맞춤형 영화 추천이 가능해지며, 사용자의 선호도를 반영하여 더욱 정교한 추천을 제공할 수 있습니다. 🎯