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á
https://docs.google.com/spreadsheets/d/1-vZ6Wb14lZwSXDwqYOBUinpaS_TR7VJx/edit#gid=1357433636
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
write.csv(movielens, file="movielens.csv")
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
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.
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)
}
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%)
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á.
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