본문 바로가기

R/R로 만드는 추천 시스템

추천 시스템 - 02

반응형

데이터 탐구

이 절에서는 MovieLense 데이터 세트를 살펴본다. 이를 위해 추천 시스템을 만들기 위한 recommenderlab을 사용하고, 그 결과를 시각화하기 위한 ggplot2를 사용한다. 이제 패키지와 데이터를 로드한다.

library(recommenderlab)
library(ggplot2)
data("MovieLense")
class(MovieLense)
[1] "realRatingMatrix"
attr(,"package")
[1] "recommenderlab"

MovieLense는 영화 평점에 관한 데이터 세트가 포함된 realRatingMatrix 객체다. 각 행은 사용자를, 각 열은 영화와 그에 대한 평점을 나타낸다.

 

데이터 특징 탐구

MovieLense를 간단히 살펴본다. 이전 절에서 설명했듯이 realRatingMatrix 객체에 적용할 수 있는 몇 가지 일반적인 방법들이 있다. dim을 사용해 크기를 추출해본다.

dim(MovieLense)
[1]  943 1664

943명의 사용자와 1,664개의 영화가 있다. realRatingMatrix는 S4 클래스이므로 객체의 구성 요소는 MovieLense 슬롯에 포함된다. 객체 내에 저장된 모든 데이터를 표시하는 slotNames를 사용해 모든 슬롯을 볼 수 있다.

slotNames(MovieLense)
[1] "data"      "normalize"

MovieLense는 데이터 슬롯을 포함한다. 그것에 대해 살펴보자.

class(MovieLense@data)
[1] "dgCMatrix"
attr(,"package")
[1] "Matrix"

dim(MovieLense)
[1]  943 1664

MovieLense@data는 Matrix에서 상속받은 dgCMatrix 클래스에 속한다. 맞춤 데이터 탐색을 수행하려면 이 슬롯에 접근해야할 수 있다.

 

평점 값 탐구

슬롯 데이터부터 시작해 우리는 매트릭스를 살펴볼 수 있다. 평점에 대해 살펴보자. 매트릭스를 벡터로 변환하고 값을 살펴볼 수 있다.

vector_ratings <- as.vector(MovieLense@data)
unique(vector_ratings)
[1] 5 4 0 3 1 2

평점은 0에서 5 사이의 정수다. 각 평점이 발생된 개수를 세어보자.

table_ratings <- table(vector_ratings)

table_ratings

vector_ratings
      0       1       2       3       4       5 
1469760    6059   11307   27002   33947   21077 

 

평점 0은 누락된 값을 나타내므로 vector_ratings에서 값을 제거할 수 있다.

vector_ratings <- vector_ratings[vector_ratings != 0]

 

이제 평점에 대한 빈도 그래프를 그릴 수 있다. 빈도를 나타내는 막대 그림을 시각화하기 위해 ggplot2를 사용한다. factor를 사용해 카테고리로 변환하고 간략한 도표를 작성해본다.

vector_ratings <- factor(vector_ratings)

 

qplot을 사용해 분포를 시각화할 수 있다.

qplot(vector_ratings) + ggtitle("Distribution of the ratings")

대부분의 평점은 2 이상이며 가장 일반적인 평점은 4다.

 

조화된 영화 탐색

MovieLense를 시작으로 다음과 같은 방법을 사용해 간략한 경과를 쉽게 추출할 수 있다.

  • colCounts : 각 열에 존재하는 값의 수
  • colMeans : 각 열에 대한 평균값

예를 들어, 가장 많이 본 영화를 알고 싶을 때 colCount를 사용할 수 있다. 먼저, 각 영화의 조회 수를 계산해본다.

views_per_movie <- colCounts(MovieLense)

 

그리고 조회 수로 영화를 정렬할 수 있다.

table_views <- data.frame(movie = names(views_per_movie),
                         views = views_per_movie)
table_views <- table_views[order(table_views$views, decreasing = TRUE), ]

 

이제 처음 여섯 개의 행을 시각화하고 히스토그램을 만들 수 있다.

ggplot(table_views[1:6, ], aes(x = movie, y = views)) +
  geom_bar(stat="identity") +
  theme(axis.text.x = element_text(angle = 45, hjust = 1)) +
  ggtitle("Number of views of the top movies")

다음 그림은 상위 랭킹 영화의 조회 수를 보여준다.

위의 도표에서 <스타워즈>(1977)가 가장 많이 본 영화며 다른 것에 비해 약 100회의 조회 수를 초과한 것을 알 수 있다.

 

평균 평점 탐색

각 영화의 평균 평점을 계산해 최고 평점 영화를 선별할 수 있다. 이를 위해 colMeans를 사용하며 0은 빠진 값을 나타내므로 자동으로 무시된다. 이제 평균 영화 평점의 분포를 살펴본다.

average_ratings <- colMeans(MovieLense)

 

qplot을 사용해 도표를 작성해본다.

qplot(average_ratings) + stat_bin(binwidth = 0.1) +
  ggtitle("Distribution of the average movie rating")

다음 그림은 평균 영화 평점 분포를 보여준다.

가장 큰 값은 대략 3이며, 평점이 1 또는 5인 영화도 조금 있다. 대체로 이러한 영화는 소수의 사람으로부터만 평점을 받았기 때문에 고려하지 않아도 된다. 따라서 정의된 기준치(예:100 미만) 이하의 조회 수를 가지는 영화는 무시한다.

average_ratings_relevant <- average_ratings[views_per_movie > 100]

도표를 작성해본다.

qplot(average_ratings_relevant) +
  stat_bin(binwidth = 0.1) +
  ggtitle(paste("Distribution of the relevant average ratings"))

다음 그림은 관련 평균 평점 분포를 보여준다.

모든 순위는 2.3에서 4.5 사이에 존재한다. 예상대로, 양 극단의 평점을 제거했기 때문에 가장 큰 값은 4 정도로 바뀌었다.

 

매트릭스 시각화

색상으로 평점을 나타내는 히트맵을 작성해 매트릭스를 시각화할 수 있다. 매트릭스의 각 행은 사용자, 각 열은 영화, 각 셀은 평점에 해당하며 image를 사용해 일반적으로 이를 구현할 수 있다. recommenderlab 패키지는 realRatingMatrix 객체를 위해 image 함수를 재정의했다.

 

image를 사용해 히트맵을 작성한다.

image(MovieLense, main = "Heatmap of the rating matrix")

 

다음 그림은 평점 매트릭스의 히트맵을 보여준다.

행과 열이 정렬됐기 때문에 평점이 없거나 낮은 사용자와 영화가 몰려 있는 오른쪽 위에 흰색 영역이 있음을 알 수 있다.

 

이 도표는 너무 많은 사용자와 아이템이 있으므로 읽기가 어렵다. 앞쪽 행과 열 일부분만 반영된 다른 도표를 작성해본다.

 

image를 사용해 히트맵을 작성해본다.

image(MovieLense[1:10, 1:15], main = "Heatmap of the first rows and columns")

다음 그림은 첫 번째 행과 열의 히트맵을 보여준다.

일부 사용자는 다른 사용자보다 더 많은 영화를 봤다. 그러나 이 도표는 단지 무작위 사용자 및 아이템을 표시한다. 대신, 가장 관련성이 높은 사용자 및 아이템을 선택하면 어떻게 될까? 즉, 많은 영화를 본 사용자와 많은 사용자가 본 영화를 시각화하기 위해 다음 단계를 따른다.

  1. 사용자당 최소 영화 수를 결정한다.
  2. 영화당 최소 사용자 수를 결정한다.
  3. 이 기준에 일치하는 사용자 및 영화를 선택한다.

예를 들면 사용자와 영화의 최고 백분위 수를 시각화할 수 있으며, 이를 위해 quantile 함수를 사용한다.

min_n_movies <- quantile(rowCounts(MovieLense), 0.99)
min_n_users <- quantile(colCounts(MovieLense), 0.99)
min_n_movies
   99% 
440.96 

min_n_users
   99% 
371.07 

이제 기준과 일치하는 행과 열을 시각화할 수 있다.

 

image를 사용해 히트맵을 작성한다.

image(MovieLense[rowCounts(MovieLense) > min_n_movies,
                 colCounts(MovieLense) > min_n_users],
      main = "Heatmap of the top users and movies")

다음 그림은 상위권의 사용자 및 영화의 히트맵을 보여준다.

누구보다 많은 영화를 시청한 사용자 중 대부분은 예상대로 상위에 선정된 모든 영화를 봤다. 다른 곳보다 더 어두운 일부의 열은 가장 높은 평점의 영화를 나타낸다. 또한 어두운 행은 더 높은 평점을 부여한 사용자를 나타낸다. 이와 같이 데이터를 정규화해볼 수 있다.

이 절에서는 데이터와 관련해 살펴봤으며, 다음 절에서는 추천 모델에 대한 입력을 변환하고 처리할 것이다.

반응형