1 Giới thiệu dữ liệu

Tập dữ liệu này đề cập đến việc đánh giá các bộ phim trong package dslabs.

Tập dữ liệu gồm 7 biến với 100004 quan sát.

  • movieId: mã số các bộ phim

  • title: tên phim

  • year: năm bộ phim được ra mắt

  • genres: thể loại phim

  • userId: mã số của người dùng (người thực hiện đánh giá phim)

  • rating: xếp hạng các bộ phim (đánh giá theo mức độ từ 1 đến 5)

  • timestamp: ngày và giờ thục hiện đánh giá

3 Lấy dữ liệu

library(dslabs)  # Gọi package
data("movielens")
str(movielens) # Xem cấu trúc dữ liệu
## 'data.frame':    100004 obs. of  7 variables:
##  $ movieId  : int  31 1029 1061 1129 1172 1263 1287 1293 1339 1343 ...
##  $ title    : chr  "Dangerous Minds" "Dumbo" "Sleepers" "Escape from New York" ...
##  $ year     : int  1995 1941 1996 1981 1989 1978 1959 1982 1992 1991 ...
##  $ genres   : Factor w/ 901 levels "(no genres listed)",..: 762 510 899 120 762 836 81 762 844 899 ...
##  $ userId   : int  1 1 1 1 1 1 1 1 1 1 ...
##  $ rating   : num  2.5 3 3 2 4 2 2 2 3.5 2 ...
##  $ timestamp: int  1260759144 1260759179 1260759182 1260759185 1260759205 1260759151 1260759187 1260759148 1260759125 1260759131 ...
movielens <- na.omit(movielens) #Lọc dữ liệu bị mising

Tạo file exel từ dataset trong R

  • Đầu tiên, em xuất file csv bằng hàm write.csv
write.csv(movielens, file="movielens.csv")
  • Sau đó, em đổi định dạng file csv thành xlsx và đọc file exel đó vào R
library("readxl") # Package dùng để đọc file exel
movielens <- read_excel('/Users/Thanh Lan/Documents/R/movielens.xlsx' ) #Đọc file exel bằng hàm read_exel và gán vào biến movielens
str(movielens) #Xem cấu trúc dữ liệu mới vừa đọc vào
## tibble [99,997 × 8] (S3: tbl_df/tbl/data.frame)
##  $ no       : num [1:99997] 1 2 3 4 5 6 7 8 9 10 ...
##  $ movieId  : num [1:99997] 31 1029 1061 1129 1172 ...
##  $ title    : chr [1:99997] "Dangerous Minds" "Dumbo" "Sleepers" "Escape from New York" ...
##  $ year     : num [1:99997] 1995 1941 1996 1981 1989 ...
##  $ genres   : chr [1:99997] "Drama" "Animation|Children|Drama|Musical" "Thriller" "Action|Adventure|Sci-Fi|Thriller" ...
##  $ userId   : num [1:99997] 1 1 1 1 1 1 1 1 1 1 ...
##  $ rating   : chr [1:99997] "2.5" "3" "3" "2" ...
##  $ timestamp: num [1:99997] 1.26e+09 1.26e+09 1.26e+09 1.26e+09 1.26e+09 ...
m <- movielens # Gán dữ liệu vào biến m

4 Chuyển đổi dữ liệu

Vì dữ liệu ở cột rating đang là chr, tức là biến định tính nên em sẽ chuyển đổi thành biến định lượng bằng hàm as.numeric() trong package tidyverse

library(tidyverse)
## ── Attaching core tidyverse packages ──────────────────────── tidyverse 2.0.0 ──
## ✔ dplyr     1.1.2     ✔ readr     2.1.4
## ✔ forcats   1.0.0     ✔ stringr   1.5.0
## ✔ ggplot2   3.4.2     ✔ tibble    3.2.1
## ✔ lubridate 1.9.2     ✔ tidyr     1.3.0
## ✔ purrr     1.0.1     
## ── Conflicts ────────────────────────────────────────── tidyverse_conflicts() ──
## ✖ dplyr::filter() masks stats::filter()
## ✖ dplyr::lag()    masks stats::lag()
## ℹ Use the conflicted package (<http://conflicted.r-lib.org/>) to force all conflicts to become errors
m$rating <-  as.numeric(m$rating)
str(m)
## tibble [99,997 × 8] (S3: tbl_df/tbl/data.frame)
##  $ no       : num [1:99997] 1 2 3 4 5 6 7 8 9 10 ...
##  $ movieId  : num [1:99997] 31 1029 1061 1129 1172 ...
##  $ title    : chr [1:99997] "Dangerous Minds" "Dumbo" "Sleepers" "Escape from New York" ...
##  $ year     : num [1:99997] 1995 1941 1996 1981 1989 ...
##  $ genres   : chr [1:99997] "Drama" "Animation|Children|Drama|Musical" "Thriller" "Action|Adventure|Sci-Fi|Thriller" ...
##  $ userId   : num [1:99997] 1 1 1 1 1 1 1 1 1 1 ...
##  $ rating   : num [1:99997] 2.5 3 3 2 4 2 2 2 3.5 2 ...
##  $ timestamp: num [1:99997] 1.26e+09 1.26e+09 1.26e+09 1.26e+09 1.26e+09 ...

Sau khi thực hiện chuyển đổi, thì biến rating đã là biến định lượng.

5 Tạo function để tính toán các đại lượng thống kê mô tả

descriptivestat <- function(df, var){
  x <- df[[var]]
  descriptives <- list(
    min = min(x, na.rm = TRUE),   # Giá trị nhỏ nhất của biến
    max = max(x, na.rm =TRUE),    # Giá trị lớn nhất của biến
    mean = mean(x, na.rm = TRUE), # Tính giá trị trung bình
    median = median(x,na.rm = TRUE),   # Tính trung vị
    sd = sd(x,na.rm = TRUE),           # Tính độ lệch chuẩn
    var = var(x,na.rm = TRUE),         # Tính phương sai
    quartiles = quantile(x, probs = c(0.25, 0.75), na.rm =TRUE))  # Tính tứ phân vị thứ nhất và thứ ba
  return(descriptives)
}

6 Phân tích biến rating

Bằng function mới vừa tạo, em tính các đại lượng thống kê của biến rating

descriptivestat(m,'rating')
## $min
## [1] 0.5
## 
## $max
## [1] 5
## 
## $mean
## [1] 3.543591
## 
## $median
## [1] 4
## 
## $sd
## [1] 1.058055
## 
## $var
## [1] 1.11948
## 
## $quartiles
## 25% 75% 
##   3   4

Từ kết quả, ta biết được:

  • Xếp hạng nhỏ nhất là 0.5, xếp hạng lớn nhất là 5

  • Trung bình tất cả bộ phim được xếp hạng ở mức 3.5

  • Có nhiều bộ phim được xếp hạng ở mức 4 nhất

  • Độ lệch chuẩn là 1.058, phương sai là 1.12

  • Tứ phân vị thứ nhất là 3, tứ phân vị thứ ba là 4.

Lập bảng tần số, tần suất và vẽ đồ thị phân phối cho biến rating

table(m$rating)
## 
##   0.5     1   1.5     2   2.5     3   3.5     4   4.5     5 
##  1101  3326  1687  7270  4448 20063 10538 28750  7721 15093
prop.table(table(m$rating))
## 
##        0.5          1        1.5          2        2.5          3        3.5 
## 0.01101033 0.03326100 0.01687051 0.07270218 0.04448133 0.20063602 0.10538316 
##          4        4.5          5 
## 0.28750863 0.07721232 0.15093453
hist(m$rating, xlab='Xếp hạng',ylab= ' Tần số', main = 'Đồ thị phân phối của các mức xếp hạng' )

Từ 2 kết quả trên, ta thấy mức đánh giá 4 xuất hiện nhiều nhất với 28750 lần (chiếm 28.75% ). Xuất hiện ít nhất là mức đánh gia 0,5 với 1101 lần (chiếm 0.011%)

6.1 Phân tích biến rating theo biến year

Nhìn tổng quan biến year (năm ra mắt các bộ phim) bằng function descriptivestat()

descriptivestat(m,'year')
## $min
## [1] 1902
## 
## $max
## [1] 2016
## 
## $mean
## [1] 1991.827
## 
## $median
## [1] 1995
## 
## $sd
## [1] 15.0887
## 
## $var
## [1] 227.669
## 
## $quartiles
##  25%  75% 
## 1987 2001

Từ kết quả tính toán:

  • Bộ phim ra mắt sớm nhất vào năm 1902, trễ nhất là 2016

  • Trung bình các bộ phim trong tập dữ liệu ra mắt vào năm 1992

  • Năm có nhiều phim ra mắt là 1995

Chia biến year thành 3 khoảng bằng hàm cut() và gán vào biến years trong bảng m1.

  • Khoảng từ 1900 đến 1950 được xem là dautk20 (đầu thế kỉ 20).

  • Khoảng từ 1950 đến 2000 được xem là cuoitk20 (cuối thế kỉ 20).

  • Khoảng từ 2000 đến 2017 được xem là dautk21 (đầu thế kỉ 21).

m1 <- m
m1$years <- cut(m$year,breaks = c(1900,1950,2000,2017), labels = c('dautk20','cuoitk20','dautk21'))

Lập bảng tần số của biến rating theo year

table(m1$rating , m1$years)
##      
##       dautk20 cuoitk20 dautk21
##   0.5      15      596     490
##   1        34     2548     744
##   1.5      19      901     767
##   2       102     5563    1605
##   2.5      79     2474    1895
##   3       441    15954    3668
##   3.5     308     5942    4288
##   4       981    21463    6306
##   4.5     232     4367    3122
##   5       786    11711    2596

Đưa kết quả trên vào ggplot

ggplot(m1, aes(x= rating,))+
  geom_bar(fill = 'lightgreen')+
  geom_text(aes(label= after_stat(count)),stat= 'count', color = 'darkgreen',vjust = -0.3, size= 3)+
  facet_grid(.~years)+
  labs(x='Xếp hạng', y = 'Số lượng', title = 'Đồ thị biểu diễn mức đánh giá theo thời gian')

Ta thấy các cột trong khoảng cuối thế kỉ 20 cao nhất cho thấy các bộ phim trong khoảng thời gian này được nhiều người đánh giá nhất. Nhiều nhất là mức 4 trong khoảng cuối thế kỉ 20 với 21463 lượt đánh giá, ít nhất là mức 0.5 vào đầu thế kỉ 20 với 15 lượt đánh giá.

6.2 Phân nhóm dữ liệu theo title

Em phân nhóm tập dữ liệu theo tựa đề phim bằng hàm group_by(). Vì mỗi phim sẽ được nhiều người đánh giá nên em sẽ tính trung bình mỗi phim được đánh giá như thế nào bằng hàm summarise()

titlerate <- m1 %>% group_by(title) %>% summarise(n = mean(rating))
head(titlerate,10)
## # A tibble: 10 × 2
##    title                                  n
##    <chr>                              <dbl>
##  1 "\"Great Performances\" Cats"       1.75
##  2 "$9.99"                             3.83
##  3 "'Hellboy': The Seeds of Creation"  2   
##  4 "'Neath the Arizona Skies"          0.5 
##  5 "'Round Midnight"                   2.25
##  6 "'Salem's Lot"                      3.5 
##  7 "'Til There Was You"                2.62
##  8 "'burbs, The"                       3.05
##  9 "'night Mother"                     5   
## 10 "(500) Days of Summer"              3.76