데이터사이언스/추천시스템

추천시스템 - (8) 연관성 분석 추천 예제

_금융덕후_ 2020. 7. 12. 14:10
728x90
반응형

추천시스템

다음은 분석에 사용될 파일입니다.

association_files.zip
0.00MB

연관성 분석 예제

다음 예제는 연관성 분석을 통해 20명의 사용자들에게 20개의 영화를 추천하는 예제입니다.

패키지 임포트

패키지는 pandas 패키지를 사용하였습니다.
pandas의 버전은 다음과 같습니다.

In [1]:
import pandas as pd
pd.__version__
Out[1]:
'0.25.1'
 

영화 데이터

다음은 분석에 사용할 영화 데이터 입니다.

In [2]:
movies_df = pd.read_csv('./np-ratings.csv')
print(movies_df.shape)
movies_df.head()
 
(20, 20)
Out[2]:
  260: Star Wars: Episode IV - A New Hope (1977) 1210: Star Wars: Episode VI - Return of the Jedi (1983) 356: Forrest Gump (1994) 318: Shawshank Redemption, The (1994) 593: Silence of the Lambs, The (1991) 3578: Gladiator (2000) 1: Toy Story (1995) 2028: Saving Private Ryan (1998) 296: Pulp Fiction (1994) 1259: Stand by Me (1986) 2396: Shakespeare in Love (1998) 2916: Total Recall (1990) 780: Independence Day (ID4) (1996) 541: Blade Runner (1982) 1265: Groundhog Day (1993) 2571: Matrix, The (1999) 527: Schindler's List (1993) 2762: Sixth Sense, The (1999) 1198: Raiders of the Lost Ark (1981) 34: Babe (1995)
0 1.0 5.0 2.0 NaN 4.0 4.0 2.0 2.0 NaN 3.0 2.0 NaN 5.0 2.0 NaN 4.0 2.0 5.0 NaN NaN
1 5.0 3.0 NaN 2.0 4.0 2.0 1.0 NaN NaN 4.0 3.0 2.0 2.0 NaN 2.0 NaN 5.0 1.0 3.0 NaN
2 NaN NaN NaN 5.0 2.0 NaN 4.0 NaN NaN 1.0 NaN 1.0 4.0 4.0 1.0 1.0 2.0 3.0 1.0 3.0
3 NaN 3.0 NaN NaN NaN 1.0 2.0 3.0 4.0 NaN NaN 4.0 1.0 3.0 5.0 NaN 5.0 1.0 1.0 2.0
4 4.0 3.0 4.0 1.0 4.0 1.0 NaN 4.0 NaN 1.0 5.0 1.0 NaN 4.0 NaN 3.0 5.0 5.0 NaN NaN
 

영화 데이터 정보

평균 평점

먼저 영화들 중 가장 많은 평균 평점을 받은 3개의 영화들입니다.
가장 많은 평균 평균평점을 받은 영화들은 다음과 같습니다:

  1. 쇼생크 탈출 (Shawshank Redemption, The)
  2. 스타워즈 4 (Star Wars: Episode IV - A New Hope)
  3. 블레이드러너 (Blade Runner)
In [3]:
movies_df.mean().sort_values(ascending=False)[:3]
Out[3]:
318: Shawshank Redemption, The (1994)             3.600000
260: Star Wars: Episode IV - A New Hope (1977)    3.266667
541: Blade Runner (1982)                          3.222222
dtype: float64
 

평점 카운트

다음은 가장 많은 평점을 받은 3개의 영화들입니다.
가장 많은 평점을 받았다는 것은 다른말로 하면 많은 사람들이 본 영화를 의미합니다.
가장 많은 평점수(리뷰)가 매겨진 영화들은 다음과 같습니다:

  1. 토이스토리 (Toy Story)
  2. 양들의침묵 (Silence of the Lambs, The)
  3. 스타워즈 4 (Star Wars: Episode IV - A New Hope)
In [4]:
movies_df.count().sort_values(ascending=False)[:3]
Out[4]:
1: Toy Story (1995)                               17
593: Silence of the Lambs, The (1991)             16
260: Star Wars: Episode IV - A New Hope (1977)    15
dtype: int64
 

4+평점

다음은 평점 4를 받은 가장 많이 받은 영화들입니다.

  1. 스타워즈 4 (Star Wars: Episode IV - A New Hope)
  2. 쇼생크탈출 (Shawshank Redemption, The)
  3. 양들의침묵 (Silence of the Lambs, Th)
In [5]:
four_plus_df = movies_df[movies_df >= 4.0]
four_plus_df.count().sort_values(ascending=False)[:3]
Out[5]:
260: Star Wars: Episode IV - A New Hope (1977)    8
318: Shawshank Redemption, The (1994)             7
593: Silence of the Lambs, The (1991)             7
dtype: int64
 

상관관계 분석

연관성분석 (Association Rule)

지난 포스팅에서 설명한 연관성 분석 수식입니다:
$$association(x,y) = \frac{x+y}{x}$$

다음은 위 수식을 사용해 연관성 분석을 진행해, 토이스토리와 가장 관련있는 영화들 3개를 뽑아본 결과입니다.

In [2]:
rating_counts = movies_df.count()
toy_story = rating_counts['1: Toy Story (1995)']
result_df = (toy_story + rating_counts) / toy_story
result_df.sort_values(ascending=False).drop('1: Toy Story (1995)').head(3)
Out[2]:
593: Silence of the Lambs, The (1991)                      1.941176
260: Star Wars: Episode IV - A New Hope (1977)             1.882353
1210: Star Wars: Episode VI - Return of the Jedi (1983)    1.823529
dtype: float64
 

피어슨 유사도

연과성분석 외에도 다른 유사도를 사용할 수 있습니다.
다음은 가장 많이 사용되는 유사도 중 하나인 피어슨 유사도를 사용한 상관관계 입니다.
$$pearson(x,y) = \frac{\sum_{i \in I_{xi}}(r_{xy} - \mu_x) \cdot (r_{yi} - \mu_y)}{\sqrt{\sum_{i \in I_{xy}} (r_{xi} - \mu_x)^2} \cdot \sqrt{\sum_{i \in I_{xy}} (r_{yi} - \mu_y)^2}}$$

피어슨 유사도를 사용해 가장 관련있는 영화 3개를 뽑아본 결과입니다.

In [6]:
movies_df.corr('pearson')['1: Toy Story (1995)'].drop('1: Toy Story (1995)').sort_values(ascending=False).head(3)
Out[6]:
318: Shawshank Redemption, The (1994)    0.888523
34: Babe (1995)                          0.811107
296: Pulp Fiction (1994)                 0.709842
Name: 1: Toy Story (1995), dtype: float64
 

인구통계 분석

사용자 데이터

다음은 사용자 데이터를 로딩해보겠습니다.
편의성을 위해 성별 정보 컬럼명을 변경하였습니다.

In [7]:
users_df = pd.read_csv('./np-users.csv').rename({'Gender (1 =F, 0=M)': 'Gender'}, axis=1)
users_df.head()
Out[7]:
  User Gender
0 755 0
1 5277 0
2 1577 1
3 4388 0
4 1202 1
 

성별별 평균 평점

다음은 영화별로 각 성별의 평균 평점을 계산한 결과입니다.

In [5]:
movies_df['Gender'] = users_df.Gender
mean_df = movies_df.groupby('Gender').mean()
mean_df
Out[5]:
  260: Star Wars: Episode IV - A New Hope (1977) 1210: Star Wars: Episode VI - Return of the Jedi (1983) 356: Forrest Gump (1994) 318: Shawshank Redemption, The (1994) 593: Silence of the Lambs, The (1991) 3578: Gladiator (2000) 1: Toy Story (1995) 2028: Saving Private Ryan (1998) 296: Pulp Fiction (1994) 1259: Stand by Me (1986) 2396: Shakespeare in Love (1998) 2916: Total Recall (1990) 780: Independence Day (ID4) (1996) 541: Blade Runner (1982) 1265: Groundhog Day (1993) 2571: Matrix, The (1999) 527: Schindler's List (1993) 2762: Sixth Sense, The (1999) 1198: Raiders of the Lost Ark (1981) 34: Babe (1995)
Gender                                        
0 3.125000 3.0 2.25 3.4 3.333333 2.833333 2.300000 3.142857 2.625 3.000000 2.142857 2.200000 2.857143 3.0 3.500000 3.142857 3.5 2.666667 3.666667 2.000000
1 3.428571 3.0 3.00 3.8 2.714286 3.000000 3.571429 2.750000 4.000 2.428571 4.250000 1.714286 2.666667 3.5 2.833333 2.400000 2.5 3.000000 2.000000 3.428571
 

성별간 상위 3개 평점

각 성별별로 가장 평점이 높았던 영화들은 다음과 같습니다:

  1. 레이더스 (Raiders of the Lost Ark)
  2. 쉰들러리스트 (Schindler's List)
  3. 그라운드호그데이 (Groundhog Day)
In [6]:
print("Male")
display(mean_df.iloc[0].sort_values(ascending=False).head(3))
print("Female")
display(mean_df.iloc[1].sort_values(ascending=False).head(3))
 
Male
 
1198: Raiders of the Lost Ark (1981)    3.666667
527: Schindler's List (1993)            3.500000
1265: Groundhog Day (1993)              3.500000
Name: 0, dtype: float64
 
Female
 
2396: Shakespeare in Love (1998)         4.25
296: Pulp Fiction (1994)                 4.00
318: Shawshank Redemption, The (1994)    3.80
Name: 1, dtype: float64
 

성별간 차이가 가장 큰 평점

각 성별별로 평점의 차이가 가장 큰 영화들은 다음과 같습니다:

  1. 레이더스 (Raiders of the Lost Ark), 평점차: 1.66667
  2. 셰익스피어인러브 (Shakespeare in Love), 평점차: 2.107143
In [7]:
print("Male - Female")
display((mean_df.iloc[0] - mean_df.iloc[1]).sort_values(ascending=False).head(1))
print("Female - Male")
display((mean_df.iloc[1] - mean_df.iloc[0]).sort_values(ascending=False).head(1))
 
Male - Female
 
1198: Raiders of the Lost Ark (1981)    1.666667
dtype: float64
 
Female - Male
 
2396: Shakespeare in Love (1998)    2.107143
dtype: float64

본 포스팅은 Minnesota대학교의 Intro to Recommender Systems코세라 강좌를 정리한 내용입니다.

https://www.coursera.org/learn/recommender-systems-introduction?specialization=recommender-systems

728x90
반응형