데이터 탐구
이 절에서는 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")
다음 그림은 첫 번째 행과 열의 히트맵을 보여준다.
일부 사용자는 다른 사용자보다 더 많은 영화를 봤다. 그러나 이 도표는 단지 무작위 사용자 및 아이템을 표시한다. 대신, 가장 관련성이 높은 사용자 및 아이템을 선택하면 어떻게 될까? 즉, 많은 영화를 본 사용자와 많은 사용자가 본 영화를 시각화하기 위해 다음 단계를 따른다.
- 사용자당 최소 영화 수를 결정한다.
- 영화당 최소 사용자 수를 결정한다.
- 이 기준에 일치하는 사용자 및 영화를 선택한다.
예를 들면 사용자와 영화의 최고 백분위 수를 시각화할 수 있으며, 이를 위해 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")
다음 그림은 상위권의 사용자 및 영화의 히트맵을 보여준다.
누구보다 많은 영화를 시청한 사용자 중 대부분은 예상대로 상위에 선정된 모든 영화를 봤다. 다른 곳보다 더 어두운 일부의 열은 가장 높은 평점의 영화를 나타낸다. 또한 어두운 행은 더 높은 평점을 부여한 사용자를 나타낸다. 이와 같이 데이터를 정규화해볼 수 있다.
이 절에서는 데이터와 관련해 살펴봤으며, 다음 절에서는 추천 모델에 대한 입력을 변환하고 처리할 것이다.
'R > R로 만드는 추천 시스템' 카테고리의 다른 글
추천 시스템 - 04 (0) | 2020.03.19 |
---|---|
추천 시스템 - 03 (0) | 2020.03.19 |
추천 시스템 - 01 (0) | 2020.03.17 |
추천 시스템에서 사용되는 데이터 마이닝 기법-03 (0) | 2020.03.16 |
추천 시스템에서 사용되는 데이터 마이닝 기법-02 (0) | 2020.03.16 |