1 Bài tập về nhà tuần 6

Scraping dữ liệu trên R là quá trình tự động thu thập thông tin từ các trang web hoặc nguồn dữ liệu trực tuyến khác bằng cách sử dụng mã lập trình trong ngôn ngữ R. Điều này cho phép chúng ta thu thập dữ liệu từ nhiều nguồn khác nhau một cách tự động và nhanh chóng, giúp tiết kiệm thời gian và công sức so với việc thu thập dữ liệu bằng cách thủ công. Bài tập về nhà tuần này em sẽ thực hiện các bước Scapring dữ liệu trên trang investing.com.

Dầu mỏ (còn được gọi là dầu thô, tiếng anh (Crude oil) là một chất sánh, lỏng, đặc màu nâu hoặc ngả lục được tồn tại trong các lớp đất ở một số nơi trong lòng trái đất. Dầu mỏ là một hỗn hợp hóa chất hữu cơ tồn tại ở dạng lỏng đậm đặc, chủ yếu là những hợp chất hydrocarbon với thành phần vô cùng đa dạng.

Giá dầu là giá lấy liền của một thùng dầu thô. Giá của một thùng dầu thô Brent trung bình năm 2019 là 64 USD so với năm 2018 là 71 USD. Giá thùng dầu WTI trung bình năm 2019 là 57 USD so với năm 2018 là 64 USD. Sự khác biệt về giá dầu dựa trên các yếu tố như là trọng lực riêng, vị trí, hàm lượng lưu huỳnh,….

Giá dầu giảm đáng kể trong năm 2020 do đại dịch Covid – 19. Ngày 20 tháng 4 năm 2020 lần đầu tiên giá dầu WTI Crude giảm xuống mức 0 USD và Brent Crude giảm xuống dưới 20 USD mỗi thùng. Bài tập về nhà này em muốn scraping và crawl dữ liệu dầu từ năm 2018 đến năm 2023

Để bắt đầu, em cài đặt và tải các gói R hỗ trợ scraping như rvest, httr, và xml2 và readxl

library(readxl)
## Warning: package 'readxl' was built under R version 4.2.3
data <- read_excel("C:\\Users\\ACER\\Downloads\\data giá.xlsx")
print(table)
## function (..., exclude = if (useNA == "no") c(NA, NaN), useNA = c("no", 
##     "ifany", "always"), dnn = list.names(...), deparse.level = 1) 
## {
##     list.names <- function(...) {
##         l <- as.list(substitute(list(...)))[-1L]
##         if (length(l) == 1L && is.list(..1) && !is.null(nm <- names(..1))) 
##             return(nm)
##         nm <- names(l)
##         fixup <- if (is.null(nm)) 
##             seq_along(l)
##         else nm == ""
##         dep <- vapply(l[fixup], function(x) switch(deparse.level + 
##             1, "", if (is.symbol(x)) as.character(x) else "", 
##             deparse(x, nlines = 1)[1L]), "")
##         if (is.null(nm)) 
##             dep
##         else {
##             nm[fixup] <- dep
##             nm
##         }
##     }
##     miss.use <- missing(useNA)
##     miss.exc <- missing(exclude)
##     useNA <- if (miss.use && !miss.exc && !match(NA, exclude, 
##         nomatch = 0L)) 
##         "ifany"
##     else match.arg(useNA)
##     doNA <- useNA != "no"
##     if (!miss.use && !miss.exc && doNA && match(NA, exclude, 
##         nomatch = 0L)) 
##         warning("'exclude' containing NA and 'useNA' != \"no\"' are a bit contradicting")
##     args <- list(...)
##     if (length(args) == 1L && is.list(args[[1L]])) {
##         args <- args[[1L]]
##         if (length(dnn) != length(args)) 
##             dnn <- paste(dnn[1L], seq_along(args), sep = ".")
##     }
##     if (!length(args)) 
##         stop("nothing to tabulate")
##     bin <- 0L
##     lens <- NULL
##     dims <- integer()
##     pd <- 1L
##     dn <- NULL
##     for (a in args) {
##         if (is.null(lens)) 
##             lens <- length(a)
##         else if (length(a) != lens) 
##             stop("all arguments must have the same length")
##         fact.a <- is.factor(a)
##         if (doNA) 
##             aNA <- anyNA(a)
##         if (!fact.a) {
##             a0 <- a
##             op <- options(warn = 2)
##             a <- factor(a, exclude = exclude)
##             options(op)
##         }
##         add.na <- doNA
##         if (add.na) {
##             ifany <- (useNA == "ifany")
##             anNAc <- anyNA(a)
##             add.na <- if (!ifany || anNAc) {
##                 ll <- levels(a)
##                 if (add.ll <- !anyNA(ll)) {
##                   ll <- c(ll, NA)
##                   TRUE
##                 }
##                 else if (!ifany && !anNAc) 
##                   FALSE
##                 else TRUE
##             }
##             else FALSE
##         }
##         if (add.na) 
##             a <- factor(a, levels = ll, exclude = NULL)
##         else ll <- levels(a)
##         a <- as.integer(a)
##         if (fact.a && !miss.exc) {
##             ll <- ll[keep <- which(match(ll, exclude, nomatch = 0L) == 
##                 0L)]
##             a <- match(a, keep)
##         }
##         else if (!fact.a && add.na) {
##             if (ifany && !aNA && add.ll) {
##                 ll <- ll[!is.na(ll)]
##                 is.na(a) <- match(a0, c(exclude, NA), nomatch = 0L) > 
##                   0L
##             }
##             else {
##                 is.na(a) <- match(a0, exclude, nomatch = 0L) > 
##                   0L
##             }
##         }
##         nl <- length(ll)
##         dims <- c(dims, nl)
##         if (prod(dims) > .Machine$integer.max) 
##             stop("attempt to make a table with >= 2^31 elements")
##         dn <- c(dn, list(ll))
##         bin <- bin + pd * (a - 1L)
##         pd <- pd * nl
##     }
##     names(dn) <- dnn
##     bin <- bin[!is.na(bin)]
##     if (length(bin)) 
##         bin <- bin + 1L
##     y <- array(tabulate(bin, pd), dims, dimnames = dn)
##     class(y) <- "table"
##     y
## }
## <bytecode: 0x000001f091226c00>
## <environment: namespace:base>
library(tidyverse)
## Warning: package 'tidyverse' was built under R version 4.2.3
## Warning: package 'ggplot2' was built under R version 4.2.3
## Warning: package 'tibble' was built under R version 4.2.3
## Warning: package 'tidyr' was built under R version 4.2.3
## Warning: package 'readr' was built under R version 4.2.3
## Warning: package 'purrr' was built under R version 4.2.3
## Warning: package 'dplyr' was built under R version 4.2.3
## Warning: package 'stringr' was built under R version 4.2.3
## Warning: package 'forcats' was built under R version 4.2.3
## Warning: package 'lubridate' was built under R version 4.2.3
## ── 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
# Phân tích dữ liệu
summary(data$WTI)  # Tổng quan về dữ liệu
##    Min. 1st Qu.  Median    Mean 3rd Qu.    Max. 
##   1.090   3.415   4.400   4.579   5.640   9.840
mean(data$WTI)  # Giá trung bình
## [1] 4.579492
median(data$WTI)  # Trung vị
## [1] 4.4
sd(data$WTI)  # Độ lệch chuẩn
## [1] 1.723904

Nhận xét về dữ liệu giá dầu thô WTI từ bảng tổng quan (summary) trên:

  • Giá trị nhỏ nhất (Min.): 1.090 USD/bbl (USD per barrel) là giá thấp nhất trong tập dữ liệu, cho thấy giá dầu thô có thể xuống đến mức rất thấp trong một thời kỳ nhất định.

  • Phân vị 25% (1st Qu.): 3.415 USD/bbl là giá thấp nhất tại phân vị 25% của tập dữ liệu, chỉ 25% giá trị dữ liệu thấp hơn giá này.

  • Trung vị (Median): 4.400 USD/bbl là giá giữa của dữ liệu khi sắp xếp theo thứ tự tăng dần, chỉ 50% giá trị dữ liệu thấp hơn và 50% cao hơn giá này.

  • Trung bình (Mean): 4.579 USD/bbl là giá trung bình của tất cả các quan sát trong dữ liệu, cho thấy giá dầu thô trung bình trong khoảng này.

  • Phân vị 75% (3rd Qu.): 5.640 USD/bbl là giá cao nhất tại phân vị 75% của tập dữ liệu, chỉ 25% giá trị dữ liệu cao hơn giá này.

  • Giá trị lớn nhất (Max.): 9.840 USD/bbl là giá cao nhất trong tập dữ liệu, cho thấy giá dầu thô có thể tăng lên mức rất cao trong một thời kỳ nhất định.

Nhận xét tổng quan về dữ liệu giá dầu thô WTI từ bảng trên, chúng ta thấy rằng giá dầu thô có biến động lớn từ mức thấp nhất (1.090 USD/bbl) đến mức cao nhất (9.840 USD/bbl) trong khoảng thời gian đã phân tích.

1.1 Biểu đồ giá dầu

# Ví dụ khác: Biểu đồ giá theo thời gian
ggplot(data, aes(x = STT, y = WTI)) +
  geom_line() +
  labs(x = "Ngày", y = "Giá dầu") +
  ggtitle("Biểu đồ giá dầu thô")

Giá dầu được tính bằng đô la Mỹ, do đó đồng USD có thể ảnh hưởng đến giá dầu. Khi đồng USD mạnh, giá dầu sẽ giảm vì các nhà sản xuất dầu cần bán với giá rẻ để thu hút khách hàng sử dụng các đồng tiền khác và ngược lại, khi đồng USD yếu, giá dầu sẽ tăng do người tiêu dùng có thể mua dầu với các đồng tiền khác.

1.2 Biểu đồ giá dầu hộp

library(ggplot2)
ggplot(data, aes(y = WTI)) +
  geom_boxplot() +
  labs(y = "Giá dầu thô WTI") +
  ggtitle("Biểu đồ hộp và việc giá dầu thô WTI")

- Biểu đồ hộp và việc (boxplot) là một cách thể hiện phân phối của dữ liệu giá dầu thô WTI. Đây là một biểu đồ hữu ích để đánh giá các đặc tính chính của dữ liệu và thấy được sự biến động giá. Dưới đây là một số nhận xét và đánh giá về biểu đồ:

  1. Phạm vi giá dầu thô WTI: Dưới dạng biểu đồ hộp, chúng ta có thể nhận thấy phạm vi giá dầu thô WTI nằm trong khoảng từ khoảng 1.09 USD/bbl (giá thấp nhất) đến khoảng 9.84 USD/bbl (giá cao nhất). Điều này cho thấy rằng giá dầu có sự biến động lớn trong tập dữ liệu.

  2. Trung vị (Median): Đường kẻ ngang ở giữa hộp là trung vị của dữ liệu, nằm ở mức khoảng 4.4 USD/bbl. Trung vị thể hiện giá giữa của dữ liệu, tức là có 50% quan sát có giá cao hơn và 50% có giá thấp hơn giá trung vị này.

  3. Hộp (Interquartile Range - IQR): Hộp trên biểu đồ đại diện cho khoảng từ phân vị 25% đến phân vị 75% của dữ liệu, nằm trong khoảng từ khoảng 3.415 USD/bbl đến khoảng 5.640 USD/bbl. Khoảng này bao gồm phần lớn các quan sát và thể hiện khoảng biến động chủ yếu của dữ liệu.

  4. Điểm ngoài (Outliers): Những điểm ngoài (outliers) được thể hiện dưới dạng các điểm nằm ngoài biên của biểu đồ hộp. Điểm ngoài là các giá trị dữ liệu rất xa so với khoảng hộp (IQR). Trong trường hợp này, có một số điểm ngoài trị giá cao hơn 5.640 USD/bbl, cho thấy sự biến động lớn và có thể là các sự kiện đặc biệt trong thị trường.

  5. Đánh giá biểu đồ: Biểu đồ hộp và việc là một cách tuyệt vời để trực quan hóa phân phối giá dầu thô WTI. Nó giúp ta nhanh chóng nhìn thấy xu hướng chung của dữ liệu và định vị các giá trị quan trọng như trung vị và khoảng biến động chính.

  6. Đối với phân tích tiếp theo: Nếu bạn quan tâm đến xem liệu có sự khác biệt đáng kể giữa các nhóm dữ liệu hoặc mối tương quan giữa giá dầu thô WTI và các biến khác, bạn có thể tiếp tục thực hiện các phân tích thống kê bổ sung.

Trong tổng quan, biểu đồ hộp và việc rất hữu ích trong việc trực quan hóa và đánh giá dữ liệu giá dầu thô WTI, giúp chúng ta hiểu rõ hơn về tính chất và biến động giá cả.

1.3 Tạo chuỗi lệnh riêng để phân tích giá dầu

Tạo một chuỗi lệnh riêng cho việc phân tích giá dầu thô mang lại nhiều lợi ích quan trọng cho quá trình phân tích dữ liệu. Dưới đây là một số lợi ích mà em tạo ra chuỗi lệnh để phân tích giá dầu

  1. Tính linh hoạt: Bằng cách tạo một chuỗi lệnh riêng, bạn có thể tùy chỉnh và điều chỉnh từng bước trong quá trình phân tích dữ liệu theo nhu cầu cụ thể của mình. Điều này giúp bạn linh hoạt thích ứng với yêu cầu và định hướng của dự án.

  2. Tự động hóa quy trình: Khi bạn tạo một chuỗi lệnh, bạn có thể thực hiện nhiều phân tích và trực quan hóa một cách tự động và liên tục chỉ bằng cách chạy chuỗi lệnh. Điều này giúp tiết kiệm thời gian và công sức, đồng thời giảm nguy cơ mắc sai sót do thao tác thủ công.

  3. Dễ dàng tái sử dụng: Khi bạn tạo một chuỗi lệnh, bạn có thể lưu trữ lại và tái sử dụng lại sau này cho các dự án tương tự hoặc cập nhật dữ liệu mới. Điều này giúp bạn tiết kiệm thời gian và không cần viết lại từng đoạn mã mỗi lần thực hiện phân tích.

  4. Trình tự rõ ràng: Bằng cách sắp xếp các lệnh theo trình tự cụ thể, bạn giữ cho quá trình phân tích được tổ chức và rõ ràng. Điều này giúp bạn dễ dàng tìm hiểu và chỉnh sửa lại khi cần thiết.

  5. Tích hợp lệnh phức tạp: Nếu bạn cần thực hiện các phân tích phức tạp và liên quan đến nhiều bước và loại dữ liệu, việc tạo một chuỗi lệnh riêng giúp bạn dễ dàng tích hợp và quản lý toàn bộ quá trình.

  6. Dễ dàng chia sẻ và tái tái sử dụng: Nếu bạn làm việc trong nhóm hoặc cần chia sẻ kết quả phân tích với người khác, việc tạo một chuỗi lệnh riêng giúp dễ dàng chia sẻ và tái sử dụng lại quá trình phân tích.

Sau đây là chuỗi lệnh:

1.3.1 Cài đặt và tải các gói cần thiết

install.packages(“readxl”) install.packages(“tidyverse”) library(readxl) library(tidyverse)

1.3.2 Đặt URL của trang web bạn muốn scrape

url <- “https://www.investing.com/commodities/crude-oil-historical-data

1.3.3 Đọc nội dung của trang web

page <- read_html(url)

1.3.4 Lấy bảng dữ liệu từ trang web

table <- page %>% html_nodes(“#curr_table”) %>% html_table()

1.3.5 Xem thông tin dữ liệu (số dòng, số cột, …)

dim(data) head(data)

1.3.6 Tổng quan về dữ liệu

summary(data)

1.3.7 Biểu đồ giá theo thời gian

ggplot(data, aes(x = date, y = WTI)) + geom_line() + labs(x = “Ngày”, y = “Giá dầu thô WTI”) + ggtitle(“Biểu đồ giá dầu thô WTI theo thời gian”)

1.3.8 Biểu đồ phân phối giá

ggplot(data, aes(x = WTI)) + geom_histogram(binwidth = 0.5, fill = “blue”, color = “white”) + labs(x = “Giá dầu thô WTI”, y = “Số lần xuất hiện”) + ggtitle(“Biểu đồ phân phối giá dầu thô WTI”)

1.3.9 Biểu đồ hộp và việcss

ggplot(data, aes(y = WTI)) + geom_boxplot() + labs(y = “Giá dầu thô WTI”) + ggtitle(“Biểu đồ hộp và việc giá dầu thô WTI”)

1.3.10 Tính trung bình và độ lệch chuẩn của giá dầu thô WTI

mean_price <- mean(data\(WTI) sd_price <- sd(data\)WTI) print(paste(“Giá trung bình của dầu thô WTI:”, mean_price)) print(paste(“Độ lệch chuẩn của giá dầu thô WTI:”, sd_price))

1.3.11 Phân tích tương quan giữa giá và khối lượng giao dịch (nếu có)

correlation <- cor(data\(WTI, data\)volume) print(paste(“Tương quan giữa giá dầu thô WTI và khối lượng giao dịch:”, correlation))

2 Bài tập về nhà tuần 5

Ở tuần 5, em sử dụng gói data bdf trong package nlm, bdf -“Language scores” là bộ dữ liệu gồm 2287 hàng và 25 cột, chứa các điểm số về ngôn ngữ của học sinh lớp 8 tại các trường tiểu học ở Hà Lan. Bộ dữ liệu này có thể được sử dụng để nghiên cứu về hiệu suất học tập và đánh giá kỹ năng ngôn ngữ của học sinh.

Mỗi hàng trong bộ dữ liệu đại diện cho một học sinh, và mỗi cột chứa thông tin về các điểm số ngôn ngữ. Chi tiết về các cột không được cung cấp trong thông tin mô tả, nhưng chúng có thể bao gồm điểm số từ các bài kiểm tra, kỹ năng ngôn ngữ đọc, viết, nghe và nói, hoặc các chỉ số khác liên quan đến hiệu suất ngôn ngữ của học sinh.

Bộ dữ liệu này có thể hữu ích để phân tích mối quan hệ giữa điểm số ngôn ngữ và các yếu tố khác như tuổi, giới tính, trình độ học vấn, hoặc điều kiện học tập. Nó có thể cung cấp thông tin giá trị cho nghiên cứu giáo dục, đánh giá chất lượng giáo dục, và phát triển chương trình học tập.

2.1 Các loại biểu đồ

2.1.1 Biểu đồ tần số của biến Giới tính(Sex)

library(ggplot2)
library(nlme)
## 
## Attaching package: 'nlme'
## The following object is masked from 'package:dplyr':
## 
##     collapse
data(bdf)
ggplot(data = bdf, aes(x = sex)) +
  geom_bar(fill = "skyblue") +
  labs(x = "Giới tính", y = "Tần số", title = "Bảng tần số của giới tính") +
  geom_text(stat = "count", aes(label = ..count..), vjust = -0.5)
## Warning: The dot-dot notation (`..count..`) was deprecated in ggplot2 3.4.0.
## ℹ Please use `after_stat(count)` instead.
## This warning is displayed once every 8 hours.
## Call `lifecycle::last_lifecycle_warnings()` to see where this warning was
## generated.

Biểu đồ tần số của biến sex trong dữ liệu là một biểu đồ cột (bar chart) được sử dụng để biểu diễn số lượng và phân bố của các giá trị trong biến sex.

Trục x của biểu đồ đại diện cho các giá trị của biến sex, trong trường hợp này là “Nam” và “Nữ”.

Trục y biểu thị tần số, tức là số lượng quan sát có giá trị tương ứng trên trục x. Biểu đồ này cho phép chúng ta dễ dàng so sánh số lượng nam và nữ trong dữ liệu. Mỗi cột trên biểu đồ tương ứng với một giá trị trong biến sex và chiều cao của cột thể hiện tần số, tức là số lượng quan sát có giá trị tương ứng.

Nhờ biểu đồ tần số này, chúng ta có thể nhận thấy tỉ lệ giữa nam và nữ trong dữ liệu, liệu có sự chênh lệch đáng kể hay không. Ngoài ra, biểu đồ còn giúp chúng ta hiểu rõ hơn về phân phối của biến sex trong dữ liệu và phân tích đặc điểm của từng nhóm giới tính.

Dựa vào biểu đồ trên, chúng ta có thể rút ra một số nhận xét sau:

  • Sự chênh lệch giữa nam và nữ không lớn đáng kể. Biểu đồ cho thấy sự phân bố tương đối cân đối giữa hai giới tính.

  • Biểu đồ cung cấp thông tin định tính về phân bố giới tính trong dữ liệu mà không đưa ra các giá trị số liệu cụ thể.

  • Biểu đồ tần số giúp chúng ta nhanh chóng nhìn thấy tỉ lệ nam/nữ và có cái nhìn tổng quan về phân phối giới tính trong dữ liệu.

  • Biểu đồ tần số là một công cụ hữu ích để trực quan hóa và hiểu rõ hơn về phân bố của biến sex trong dữ liệu.

2.1.2 Biểu đồ phân phối của biến IQ.verb:

ggplot(data = bdf, aes(x = Minority)) +
  geom_bar(fill = "skyblue") +
  labs(x = "Dạng", y = "Tần số", title = "Tần số của các nhóm học sinh") +
  geom_text(stat = "count", aes(label = ..count..), vjust = -0.5)

“Minority” là một biến được sử dụng để chỉ định xem học sinh có thuộc nhóm thiểu số hay không. Biến này có giá trị là một factor (nhân tố) và có thể có hai mức giá trị: “N” và “Y”. Thông thường, “N” có thể đại diện cho không thuộc nhóm thiểu số, trong khi “Y” có thể đại diện cho thuộc nhóm thiểu số.

Biểu đồ trên là một biểu đồ tần số của biến “Minority” trong dữ liệu “bdf”. Nó sử dụng hình học “geom_bar” để hiển thị tần số của từng nhóm trong biến “Minority”. Mỗi cột trong biểu đồ đại diện cho một nhóm và chiều cao của cột thể hiện tần số của nhóm đó.

Nhận xét về biểu đồ:

  • Biểu đồ tần số cho thấy số lượng học sinh thuộc từng nhóm trong biến “Minority”.

  • Nhìn vào biểu đồ, có thể thấy rằng số lượng học sinh trong nhóm “Minority” ít hơn so với nhóm không thuộc “Minority”.

  • Biểu đồ này có thể giúp ta hiểu được sự phân bố của học sinh theo nhóm “Minority” trong dữ liệu.

2.1.3 Biểu đồ phân tán biến “IQ.verb” và “IQ.perf”:

ggplot(data = bdf, aes(x = IQ.verb, y = IQ.perf)) +
  geom_point()

Biểu đồ phân tán giữa “IQ.verb” và “IQ.perf” thể hiện mối quan hệ giữa điểm IQ trên phạm vi từ ngôn ngữ và điểm IQ trên phạm vi từ kỹ năng thực hiện. Mỗi điểm trên biểu đồ đại diện cho một học sinh và vị trí của điểm trên trục x tương ứng với điểm IQ.

Nhìn vào biểu đồ, chúng ta có thể thấy một phân bố tương đối đồng đều của các điểm trên biểu đồ, không có mẫu rõ ràng của các nhóm hoặc mô hình nổi bật. Điều này cho thấy rằng không có mối quan hệ mạnh mẽ giữa điểm IQ từ ngôn ngữ và điểm IQ từ kỹ năng thực hiện. Mặc dù có một số điểm tập trung ở phạm vi cao hoặc thấp của cả hai biến, nhưng không có xu hướng rõ ràng được quan sát.

Điều này có thể chỉ ra rằng điểm IQ từ ngôn ngữ và điểm IQ từ kỹ năng thực hiện không có mối tương quan cao nhất định trong nhóm học sinh này. Có thể có những yếu tố khác ngoài các yếu tố được đo lường bằng IQ ảnh hưởng đến kỹ năng và thành tích học tập của học sinh.

2.1.4 Biểu đồ phân tán giữa “IQ.verb” và “ses” theo giới tính:

ggplot(data = bdf, aes(x = IQ.verb, y = ses, color = sex)) +
  geom_point()

Sự phân bố và tương quan giữa “IQ.verb” và “ses” theo giới tính có thể được nhìn thấy thông qua biểu đồ. Các điểm dữ liệu được biểu thị bằng các điểm trên biểu đồ, và số liệu được hiển thị trên các điểm dữ liệu cho biết số lượng học sinh trong mỗi kết hợp.

Nhận xét số liệu đánh giá biểu đồ, chúng ta có thể thấy sự phân tán và tương quan giữa “IQ.verb”, “ses” và giới tính. Các khu vực có số liệu cao hơn thường có mật độ điểm dữ liệu cao hơn, trong khi các khu vực có số liệu thấp hơn thì có mật độ điểm dữ liệu thấp hơn. Điều này cho phép chúng ta nhìn thấy mức độ phân bố và tập trung của dữ liệu trong mỗi kết hợp.

2.1.5 Biểu đồ phân tán giữa “IQ.verb” và “classNR” theo giới tính:

ggplot(data = bdf, aes(x = IQ.verb, y = classNR, color = sex)) +
  geom_point()

Biểu đồ phân tán giữa “IQ.verb” và “classNR” theo giới tính là một biểu đồ phân tán hai chiều, trong đó trục x biểu thị giá trị của “IQ.verb”, trục y biểu thị giá trị của “classNR”, và các điểm dữ liệu được màu sắc theo giới tính.

Giải thích biểu đồ:

Biểu đồ cho thấy mối tương quan giữa “IQ.verb” và “classNR” dựa trên giới tính. Các điểm dữ liệu được phân bố trên mặt phẳng biểu đồ, với mỗi điểm đại diện cho một học sinh trong tập dữ liệu.

  • Trục x biểu thị giá trị của “IQ.verb”, thể hiện mức độ thông minh ngôn ngữ của học sinh.

  • Trục y biểu thị giá trị của “classNR”, thể hiện số lớp học mà học sinh đang tham gia. Nhận xét biểu đồ:

Có một phân bố dữ liệu rải rác trên biểu đồ, cho thấy sự đa dạng về mức độ thông minh ngôn ngữ (IQ.verb) và số lớp học (classNR) giữa các học sinh.

Có một số học sinh có mức độ thông minh ngôn ngữ (IQ.verb) cao và tham gia vào ít lớp học (classNR), trong khi có những học sinh có mức độ thông minh ngôn ngữ thấp và tham gia nhiều lớp học.

  • Có sự phân chia rõ rệt giữa các giới tính. Các điểm dữ liệu của nam và nữ được tách biệt và có xu hướng phân bố khá đồng đều trên biểu đồ. Đánh giá biểu đồ:

  • Biểu đồ phân tán giữa “IQ.verb” và “classNR” theo giới tính giúp thấy được mối tương quan giữa hai biến trong từng nhóm giới tính. Tuy nhiên, để hiểu rõ hơn về mối quan hệ này, cần xem xét các yếu tố khác như số lượng học sinh trong từng nhóm, phân bố dữ liệu trong từng nhóm, và các biến khác có thể ảnh hưởng đến kết quả. Biểu đồ cũng cho thấy sự phân chia rõ rệt giữa các giới tính, cho thấy một sự khác biệt trong mức độ thông minh ngôn ngữ và số lớp học giữa nam và nữ học sinh.

2.1.6 Biểu đồ phân phối của “IQ.verb” theo nhóm thiểu số và giới tính:

ggplot(data = bdf, aes(x = IQ.verb, fill = Minority)) +
  geom_density(alpha = 0.7) +
  facet_grid(Minority ~ sex)

Biểu đồ phân phối của “IQ.verb” theo nhóm thiểu số và giới tính là một biểu đồ histogram, trong đó trục x biểu thị giá trị của “IQ.verb”, trục y biểu thị tần số hoặc tỷ lệ tần số của các giá trị “IQ.verb” trong từng nhóm.

  • Biểu đồ cho thấy phân phối của các giá trị “IQ.verb” trong từng nhóm thiểu số và theo giới tính.

  • Trục x biểu thị giá trị của “IQ.verb”, thể hiện mức độ thông minh ngôn ngữ của học sinh.

  • Trục y biểu thị tần số hoặc tỷ lệ tần số, cho biết sự phân bố của các giá trị “IQ.verb” trong từng nhóm.

Nhận xét biểu đồ:

  • Có sự khác biệt trong phân phối “IQ.verb” giữa các nhóm thiểu số và theo giới tính.

  • Có thể thấy một phân phối khá đối xứng và tập trung của “IQ.verb” trong mỗi nhóm thiểu số và giới tính.

  • Có sự biến động trong phân phối “IQ.verb” giữa các nhóm, cho thấy sự đa dạng về mức độ thông minh ngôn ngữ.

  • Có thể quan sát được sự tương đồng hoặc khác biệt giữa các nhóm thiểu số và giới tính trong mức độ thông minh ngôn ngữ.

2.1.7 Biểu đồ tương quan giữa biến “IQ.verb” và “IQ.perf” với biểu đồ hộp theo biến “sex”:

ggplot(data = bdf, aes(x = sex, y = IQ.verb)) +
  geom_boxplot(fill = "lightgreen", color = "black") +
  geom_jitter(aes(y = IQ.perf), width = 0.2, color = "blue") +
  labs(x = "Giới tính", y = "Chỉ số IQ", title = "Biểu đồ chỉ số IQ theo Giới tính")

Biểu đồ tương quan giữa biến “IQ.verb” và “IQ.perf” với biểu đồ hộp theo biến “sex” là một cách trực quan để khám phá mối quan hệ giữa các biến IQ và giới tính trong bộ dữ liệu. Dưới đây là một giải thích và nhận xét về biểu đồ này:

  • Biểu đồ hộp cho biến “sex”: Trên trục x của biểu đồ, chúng ta có biến “sex” đại diện cho giới tính.Với giá trị “0” là giới tính nam ,“1” là giới tính nữ. Có hai hộp (box) trên trục y, một cho giới tính nam và một cho giới tính nữ. Hộp này biểu thị phân phối và phạm vi của dữ liệu IQ của từng giới tính. Hộp bao gồm một đường kẻ ngang, đại diện cho giá trị trung vị của dữ liệu, và các đường biên dưới và trên hộp, đại diện cho phạm vi trung 50% dữ liệu.

  • Các điểm dữ liệu: Các điểm dữ liệu trong biểu đồ được trình bày trên hình dạng của hộp. Các điểm biểu thị các giá trị IQ của từng cá nhân. Điểm này giúp chúng ta nhìn thấy phân phối và tương quan giữa các giá trị IQ verbal và IQ performance của từng giới tính.

  • Tương quan giữa biến “IQ.verb” và “IQ.perf”: Bằng cách xem biểu đồ hộp và các điểm dữ liệu, chúng ta có thể nhận thấy sự tương quan và sự phân tán của các giá trị IQ verbal và IQ performance. Nếu các điểm dữ liệu có xu hướng tập trung gần đường kẻ ngang trong từng hộp, chúng ta có thể kết luận rằng có một tương quan tích cực hoặc tương quan tương đối mạnh giữa các biến. Nếu các điểm dữ liệu phân tán rải rác, chúng ta có thể kết luận rằng không có tương quan mạnh giữa các biến.

2.1.8 Biểu đồ phân phối của biến “aritPRET” và “aritPOST” với đường thẳng kết nối các điểm theo biến “sex”

ggplot(data = bdf, aes(x = aritPRET, y = aritPOST)) +
  geom_point(aes(color = sex)) +
  geom_line(aes(group = sex, color = sex)) +
  labs(x = "Điểm toán học trước khi thực hiện biện pháp cải thiện", y = "Điểm toán học sau khi thực hiện biện pháp cải thiện", title = "Điểm cải thiện toán học theo giới tính")

  • Phân phối của biến “aritPRET” và “aritPOST”: Trên trục x của biểu đồ, chúng ta có biến “aritPRET” đại diện cho điểm số toán học trước khi thực hiện biện pháp nào đó để cải thiện kỹ năng. Trên trục y, chúng ta có biến “aritPOST” đại diện cho điểm số toán học sau khi thực hiện các biện pháp cải thiện. Các điểm dữ liệu được biểu thị bằng các điểm trong biểu đồ, mỗi điểm biểu thị một cặp giá trị “aritPRET” và “aritPOST” của từng cá nhân.

  • Đường thẳng kết nối các điểm theo biến “sex”: Trên biểu đồ, chúng ta thấy có một đường thẳng kết nối các điểm dữ liệu, và mỗi điểm trên đường thẳng biểu thị một cặp giá trị “aritPRET” và “aritPOST” tương ứng với từng giới tính. Đường thẳng này giúp chúng ta nhìn thấy xu hướng và mức độ tương quan giữa điểm số toán học trước và sau cải thiện dựa trên giới tính. Nếu đường thẳng gần với đường chéo, chúng ta có thể kết luận rằng không có sự thay đổi lớn trong điểm số toán học. Nếu đường thẳng có góc tăng hoặc giảm, chúng ta có thể nhìn thấy một mức độ tương quan giữa biến “aritPRET” và “aritPOST” tương ứng với giới tính.

  • Biểu đồ này giúp chúng ta trực quan hóa sự tương quan giữa điểm số toán học trước và sau khi thực hiện biện pháp cải thiện, dựa trên giới tính. Bằng cách nhìn vào đường thẳng và phân phối các điểm dữ liệu, chúng ta có thể nhận thấy xu hướng và sự biến đổi trong điểm số toán học dựa trên giới tính. Điều này có thể đưa ra những nhận xét sơ bộ về hiệu quả của biện pháp cải thiện và sự khác biệt giữa nam và nữ trong quá trình này.

2.1.9 Biểu đồ phân phối của biến giới tính theo biến “Minority” với các boxplot và density plot kết hợp

ggplot(data = bdf, aes(x = Minority, y = ses, fill = Minority)) +
  geom_boxplot() +
  geom_density(alpha = 0.5) +
  labs(x = "Dân tộc", y = "Giới tính", title = "SES Distribution by Minority Group")

  • Biểu đồ phân phối của biến giới tính theo biến “Minority” với các boxplot và density plot kết hợp là một cách trực quan để so sánh phân phối của biến giới tính trong từng nhóm dân tộc trong bộ dữ liệu “bdf”. Dưới đây là một giải thích và nhận xét về biểu đồ này:

  • Boxplot (biểu đồ hộp) cho biến giới tính theo biến “Minority”: Trên trục x của biểu đồ, chúng ta có biến “Minority” đại diện cho các nhóm dân tộc. Có một hoặc nhiều hộp trên trục y, mỗi hộp biểu thị phân phối và phạm vi của dữ liệu biến giới tính trong từng nhóm dân tộc. Hộp này bao gồm một đường kẻ ngang, đại diện cho giá trị trung vị của dữ liệu, và các đường biên dưới và trên hộp, đại diện cho phạm vi trung 50% dữ liệu. Sự khác biệt giữa các hộp cho biết về sự phân bố khác nhau của biến giới tính theo nhóm dân tộc.

  • Density plot (biểu đồ mật độ) cho biến giới tính theo biến “Minority”: Các đường cong mật độ được vẽ trên biểu đồ, mỗi đường cong biểu thị phân phối xác suất của biến giới tính trong từng nhóm dân tộc. Các đường cong mật độ này giúp chúng ta nhìn thấy mức độ phân phối của biến giới tính trong từng nhóm dân tộc. Sự chồng chéo của các đường cong mật độ cho biết về sự khác biệt và sự tương đồng trong phân phối của biến giới tính giữa các nhóm dân tộc.

  • Nhận xét và đánh giá: Biểu đồ này giúp chúng ta so sánh phân phối của biến giới tính theo từng nhóm dân tộc. Chúng ta có thể nhìn thấy sự khác biệt về phân phối và phạm vi của biến giới tính giữa các nhóm dân tộc thông qua hộp và đường kẻ ngang. Sự chồng chéo của các đường cong mật độ cho thấy mức độ tương đồng hoặc khác biệt giữa các nhóm dân tộc trong phân phối của biến giới tính. Điều này có thể cung cấp thông tin về sự đa dạng và sự chênh lệch trong phân phối của biến giới tính trong từng nhóm dân tộc.

3 Bài tập về nhà tuần 4

3.1 Giới thiệu Data

Ở tuần 4, em sử dụng data ở tuần 1 nằm trong package Car-Data Salaries. Data “Salaries” là một tập dữ liệu mẫu có sẵn trong gói “Car” của ngôn ngữ lập trình R. Nó chứa thông tin về mức lương của giáo sư trong các trường đại học. Dữ liệu này được sử dụng để minh họa các phương pháp và công cụ phân tích dữ liệu trong gói “Car”.

Tập dữ liệu “Salaries” bao gồm các cột sau:

  1. salary: Mức lương của giáo sư (đơn vị: USD)
  2. rank: Cấp bậc của giáo sư (Associate hoặc Full)
  3. discipline: Lĩnh vực giảng dạy và nghiên cứu (Agriculture hoặc Others)
  4. phd: Số năm kinh nghiệm sau khi có bằng tiến sĩ
  5. service: Số năm kinh nghiệm làm việc
  6. sex: Giới tính của giáo sư

Ở tuần này ngoài các thao tác thống kê như tuần 1, em vẽ biểu đồ dựa trên các biến của data Salaries để phân tích tác động của từng biến lên mức lương bằng biểu đồ trực quan. Các biểu đồ này sẽ biểu hiện mức độ của các biến lên lương của các Giáo Sư.

  • Lưu ý: Để vẽ được biểu đồ, chúng ta cần sự hỗ trợ của các package như “ggolot2”

3.2 Xử lý dữ liệu

## Warning: package 'car' was built under R version 4.2.3
## Loading required package: carData
## Warning: package 'carData' was built under R version 4.2.3
## 
## Attaching package: 'car'
## The following object is masked from 'package:dplyr':
## 
##     recode
## The following object is masked from 'package:purrr':
## 
##     some

3.3 Biểu đồ

3.3.1 Biểu đồ phân phối lương theo chức vụ

3.3.1.1 Phân tổ lương

salary_groups <- cut(Salaries$salary, breaks = c(0, 50000, 100000, 150000, Inf),
                     labels = c("Dưới 50K", "50K-100K", "100K-150K", "Trên 150K"))
salary_counts <- table(salary_groups)
salary_counts
## salary_groups
##  Dưới 50K  50K-100K 100K-150K Trên 150K 
##         0       141       202        54

Bảng phân tổ lương em tạo ra mô tả phân bố của các mức lương trong tập dữ liệu Salaries. Bằng cách phân chia các mức lương vào các nhóm, chúng ta có thể nhìn thấy sự phân phối và tập trung của lương trong các khoảng giá trị khác nhau.

Bảng phân tổ lương cung cấp thông tin về số lượng quan sát trong mỗi nhóm lương và tỷ lệ phần trăm của mỗi nhóm so với tổng số lượng quan sát. Điều này giúp chúng ta hiểu được biến đổi và phân bố của lương trong tập dữ liệu.

Ví dụ, nếu bảng phân tổ lương cho thấy rằng số lượng quan sát nhiều nhất nằm trong khoảng lương “50K-100K”, điều này cho thấy rằng mức lương chủ yếu tập trung trong khoảng giá trị này. Ngoài ra, bảng cũng có thể cho thấy sự phân bố không đều của lương trong các khoảng giá trị khác nhau, cho phép ta nhận ra sự biến đổi và đa dạng của mức lương trong tập dữ liệu.

Bảng phân tổ lương cung cấp một cái nhìn tổng quan về phân bố lương và là một công cụ hữu ích để khám phá và mô tả dữ liệu lương.

library(ggplot2)
data(Salaries)
ggplot(Salaries, aes(x = rank, fill = rank)) +
  geom_bar()

Biểu đồ thể hiện số lượng trợ giảng, phó giáo sư và giáo sư. Qua biểu đồ này cho ta thấy rằng số lượng giáo sư chiếm số lương cao nhất. Trợ giảng và phó giáo sư có số lượng gần bằng nhau.

3.3.2 Biểu đồ lương theo giới tính

ggplot(Salaries, aes(x = sex, y = salary, fill = sex)) +
  geom_boxplot() +
  labs(x = "Sex", y = "Salary", title = "Salaries by Sex")

Đường ngang giữa hộp đại diện cho giá trị trung vị (median) của dữ liệu.

Hộp (box) được kéo từ giá trị thứ nhất tứ quartile (Q1) đến giá trị thứ ba tứ quartile (Q3), tức là khoảng cách giữa 25% và 75% của dữ liệu.

  • Đường ngang chéo bên trong hộp đại diện cho giá trị trung bình (mean) của dữ liệu.
  • Đường thẳng dọc được kéo từ hộp đến giá trị thấp nhất và cao nhất trong khoảng (ngoại tầm outliers) được đánh dấu bởi các điểm nằm ngoài khoảng giữa Q1 và Q3.
  • Màu sắc khác nhau cho các hộp biểu thị các nhóm khác nhau, trong trường hợp này là giới tính.
  • Biểu đồ hộp giúp ta có cái nhìn tổng quan về phân phối và sự biến động của lương theo giới tính. Nó cho phép so sánh trung vị, phạm vi và sự phân tán của lương giữa nam và nữ. Nếu có sự chênh lệch lớn giữa các hộp hoặc các ngoại tầm, điều đó có thể chỉ ra sự khác biệt đáng kể trong mức lương giữa hai nhóm giới tính.

3.3.3 Biểu đồ cột đôi theo biến năm phục vụ và giới tính

barplot2 <- ggplot(Salaries, aes(x = yrs.service, fill = sex)) +
  geom_bar(position = "stack", stat = "count") +
  labs(x = "NĂM PHỤC VỤ", y = "TỔNG", title = "BIỂU ĐỒ NĂM PHỤC VỤ THEO GIỚI TÍNH") +
  theme_minimal()
print(barplot2)

Để biểu đồ dễ đọc chúng ta ghi chú thêm vào biểu đồ như sau

summary_data <- aggregate(Salaries$salary, by = list(yrs.service = Salaries$yrs.service, sex = Salaries$sex), FUN = length)
barplot3 <- ggplot(Salaries, aes(x = yrs.service, fill = sex)) +
  geom_bar(position = "stack", stat = "count") +
  geom_text(data = summary_data, aes(x = yrs.service, y = x, label = x), 
            position = position_stack(vjust = 0.5), color = "white", size = 2) +
  labs(x = "Years of Service", y = "Count", title = "Salary Distribution by Years of Service and Sex") +
  theme_minimal()
print(barplot3)

Biểu đồ cột lương theo biến “năm phục vụ” và “giới tính” từ dữ liệu “Salaries”. Biểu đồ này thể hiện phân bố số lượng nhân viên theo mức lương của họ, được phân theo năm phục vụ và giới tính tương ứng.

Trục x của biểu đồ là biến “năm phục vụ” (yrs.service), biểu thị số năm mà nhân viên đã phục vụ. Trục y là số lượng nhân viên trong từng nhóm.

Mỗi cột trong biểu đồ đại diện cho một nhóm năm phục vụ, được phân theo giới tính (nam và nữ). Các cột được xếp chồng lên nhau, cho thấy tỷ lệ phân bố của mỗi giới tính trong từng nhóm năm phục vụ.

3.3.4 Biểu đồ cột theo biến discipline(chuyên ngành)

library(dplyr)
salaries_summary <- Salaries %>%
  group_by(discipline) %>%
  summarise(mean_salary = mean(salary))

bar_plot <- ggplot(salaries_summary, aes(x = discipline, y = mean_salary)) +
  geom_bar(stat = "identity", fill = "steelblue") +
  geom_text(aes(label = round(mean_salary, 2)), vjust = -0.5, color = "white") +
  labs(x = "Bậc lương", y = "Ngành", title = "Lương theo cấp chuyên ngành") +
  theme_minimal()

print(bar_plot)

Biểu đồ cột theo biến “discipline” trong dữ liệu “Salaries” có ý nghĩa để trực quan hóa sự phân bố của dữ liệu lương theo hai nhóm chuyên ngành (“A” và “B”) trong dữ liệu.

Các thành phần chính của biểu đồ bao gồm:

  • Trục x: Biểu thị hai nhóm chuyên ngành (“A” và “B”).
  • Trục y: Biểu thị giá trị lương trung bình cho mỗi nhóm chuyên ngành.
  • Cột: Mỗi cột biểu thị giá trị lương trung bình tương ứng với nhóm chuyên ngành tương ứng. Biểu đồ giúp chúng ta so sánh mức lương trung bình giữa hai nhóm chuyên ngành và nhận ra sự khác biệt giữa chúng. Nếu có sự chênh lệch đáng kể giữa các cột, điều này có thể chỉ ra mức lương khác biệt đáng kể giữa hai nhóm chuyên ngành. Đồng thời, biểu đồ cũng giúp chúng ta nhìn thấy xu hướng hoặc mối quan hệ giữa các nhóm chuyên ngành.

Biểu đồ cho thấy ngành A có mức lương trung bình thấp hơn ngành B trong khoảng 10000$

Với biểu đồ cột chúng ta còn có thể làm được nhiều việc hơn những gì chúng ta đã làm bên trên. Ví dụ chúng ta sẽ vẽ đồ thị thể hiện số tiền lương trung bình theo giới tính như sau

mean_salary <- aggregate(salary ~ sex, data = Salaries, FUN = mean)

bar_plot6 <- ggplot(mean_salary, aes(x = sex, y = salary, fill = sex)) +
  geom_bar(stat = "identity", width = 0.5) +
  geom_text(aes(label = salary), vjust = -0.5, color = "black", size = 3) +  # Hiển thị số liệu trên đỉnh mỗi cột
  labs(x = "Giới tính", y = "Lương trung bình", title = "Lương trung bình theo giới tính") +
  theme_minimal()
print(bar_plot6)

Biểu đồ trên là biểu đồ cột mức lương trung bình theo giới tính, trong đó có số liệu được hiển thị trên đỉnh mỗi cột. Dưới đây là một giải thích và nhận xét về biểu đồ này:

Biểu đồ này cung cấp thông tin về mức lương trung bình của nam và nữ trong tập dữ liệu “Salaries”. Cột xác định giới tính (nam hoặc nữ), trong khi cột y đại diện cho mức lương trung bình. Các cột màu khác nhau tương ứng với từng giới tính.

Giải thích:

Biểu đồ cho thấy mức lương trung bình của nam và nữ trong tập dữ liệu. Nhìn vào biểu đồ, ta có thể thấy rằng mức lương trung bình của nam cao hơn so với nữ. Số liệu được hiển thị trên đỉnh mỗi cột cho phép chúng ta xem trực quan giá trị cụ thể của mức lương trung bình cho từng giới tính. Nhờ đó, ta có thể so sánh chính xác và dễ dàng nhận biết sự khác biệt giữa hai nhóm giới tính. Nhận xét:

Biểu đồ cho thấy sự chênh lệch rõ rệt về mức lương trung bình giữa nam và nữ. Nam có mức lương trung bình cao hơn so với nữ, cho thấy sự không cân bằng trong việc trả lương giữa hai giới. Điều này có thể đưa ra các cân nhắc về bất công và sự chênh lệch giới tính trong việc thanh toán tiền lương trong lĩnh vực mà tập dữ liệu đại diện. Biểu đồ này cung cấp thông tin quan trọng để thảo luận về sự bình đẳng giới tính và chính sách liên quan đến lương bổng và công bằng lương.

3.3.5 Biểu đồ độ lệch chuẩn lương theo giới tính

plot7 <- ggplot(Salaries, aes(x = sex, y = salary, fill = sex)) +
  geom_bar(stat = "summary", fun = sd, position = "dodge", color = "black") +
  labs(x = "GIỚI TÍNH", y = "ĐỘ LỆCH CHUẨN CỦA LƯƠNG", title = "ĐỘ LỆCH CHUẨN CỦA LƯƠNG THEO GIỚI TÍNH")

# Hiển thị số liệu trên đỉnh của biểu đồ
plot<- plot7 + geom_text(stat = "summary", fun = sd, position = position_dodge(width = 0.9),
                         aes(label = round(..y.., 2)), vjust = -0.5)

plot

Biểu đồ trên thể hiện độ lệch chuẩn của mức lương theo giới tính. Dưới đây là một giải thích và nhận xét chi tiết về biểu đồ:

  • Giải thích biểu đồ:

Trục x: Biểu diễn giới tính, với hai nhóm là “Male” (Nam) và “Female” (Nữ). Trục y: Biểu diễn độ lệch chuẩn của mức lương (Standard Deviation of Salary). Màu sắc: Sử dụng màu sắc khác nhau cho từng nhóm giới tính để tạo sự phân biệt. Nhận xét về biểu đồ:

Giới tính: Biểu đồ cho thấy sự khác biệt về độ lệch chuẩn của mức lương giữa nam và nữ. Độ lệch chuẩn: Độ lệch chuẩn được biểu diễn bằng độ dài của cột. Các cột dài hơn cho thấy sự biến động mạnh hơn trong mức lương, trong khi các cột ngắn hơn cho thấy sự ổn định hơn. Số liệu trên đỉnh cột: Số liệu trên đỉnh mỗi cột biểu thị giá trị độ lệch chuẩn tương ứng của từng nhóm. Số liệu này giúp hiểu rõ hơn về mức độ biến động của mức lương trong từng nhóm giới tính.

  • Phân tích:

Biểu đồ cho thấy rằng giới tính có ảnh hưởng đến độ biến động của mức lương. Các cột dài hơn cho thấy sự biến động lớn trong mức lương của từng nhóm giới tính, trong khi các cột ngắn hơn cho thấy sự ổn định hơn.

Ngoài ra, biểu đồ cũng cho thấy sự khác biệt về độ biến động giữa nam và nữ. Điều này có thể gợi ý đến sự chênh lệch về mức lương và cơ hội nghề nghiệp giữa hai giới.

Để hiển thị rõ hơn chúng ta có thể sử dụng biểu đồ đường:

ggplot(Salaries, aes(x = yrs.service, y = salary, color = sex)) +
  geom_line() +
  labs(x = "Years of Service", y = "Salary", color = "Gender") +
  theme_minimal()

Biểu đồ đường lương theo biến giới tính cho thấy xu hướng tăng trưởng lương theo năm phục vụ và có sự khác biệt giữa nam và nữ. Dựa vào biểu đồ, ta có thể rút ra một số nhận xét sau:

Lương tăng theo năm phục vụ: Đối với cả nam và nữ, có một xu hướng tăng lương khi số năm phục vụ tăng lên. Điều này cho thấy tính công bằng trong việc tăng lương dựa trên kinh nghiệm làm việc.

Sự khác biệt giữa nam và nữ: Có một khoảng cách rõ rệt giữa lương của nam và nữ. Trên mỗi điểm dữ liệu, lương của nam thường cao hơn so với nữ. Điều này có thể phản ánh sự chênh lệch giới tính trong việc định hình mức lương.

Độ biến động: Biểu đồ cho thấy độ biến động của lương tăng dần theo năm phục vụ. Điều này có thể là do các yếu tố khác nhau như thăng tiến trong sự nghiệp, đổi việc, hoặc sự tăng trưởng của ngành nghề.

Xu hướng chung: Dựa vào các đường đồng thời, ta có thể nhận thấy xu hướng chung của lương theo năm phục vụ cho cả nam và nữ. Tuy nhiên, có sự biến động đáng kể giữa các năm.

3.3.6 Biểu đồ lương theo năm phục vụ

3.3.6.1 Phân tổ năm phục vụ

Salaries$service_group <- cut(Salaries$yrs.service, breaks = c(0, 5, 10, 15, 20, 25, Inf),
                              labels = c("0-5", "6-10", "11-15", "16-20", "21-25", "26+"))
salary_totals <- aggregate(salary ~ service_group, data = Salaries, FUN = sum)
barplot <- ggplot(salary_totals, aes(x = service_group, y = salary)) +
  geom_col(fill = "steelblue") +
  geom_text(aes(label = salary), vjust = -0.5, color = "black") +
  labs(x = "Years of Service", y = "Total Salary", title = "Total Salary by Years of Service Group") +
  theme(axis.text.x = element_text(angle = 90, vjust = 0.5))
print(barplot)

Trục x của biểu đồ đại diện cho nhóm năm phục vụ (Years of Service Group), được phân loại thành các nhóm từ 0-5 năm, 6-10 năm, 11-15 năm, 16-20 năm, 21-25 năm và trên 26 năm. Trục y đại diện cho tổng lương (Total Salary).

Mỗi cột trong biểu đồ biểu thị tổng lương của mỗi nhóm năm phục vụ. Các cột được đánh màu xanh đậm (steelblue) để tạo sự tương phản và dễ nhìn.

Trên đỉnh mỗi cột, chúng ta có số liệu tổng lương được hiển thị dưới dạng số liệu. Số liệu này cho biết giá trị cụ thể của tổng lương cho mỗi nhóm năm phục vụ.

Biểu đồ giúp chúng ta so sánh tổng lương giữa các nhóm năm phục vụ khác nhau và nhận thấy sự phân bố và sự khác biệt về mức lương dựa trên kinh nghiệm làm việc của nhân viên.

Với biểu đồ trên chúng ta có thể quay ngang như sau:

barplot1 <- ggplot(salary_totals, aes(x = service_group, y = salary)) +
  geom_col(fill = "steelblue") +
  geom_text(aes(label = salary), hjust = -0.2, color = "black") +
  labs(x = "Total Salary", y = "Years of Service Group", title = "Total Salary by Years of Service Group") +
  coord_flip() +
  theme(axis.text.y = element_text(angle = 0, hjust = 1))
print(barplot1)

### Biểu đồ phân tán Năm phục vụ và cấp bậc Biểu đồ phân tán (scatter plot) vừa được vẽ hiển thị mối quan hệ giữa hai biến “Years of Service” (Số năm phục vụ) và “Rank” (Cấp bậc)

scatterplot <- ggplot(Salaries, aes(x = yrs.service, y = rank)) +
  geom_point(color = "steelblue", alpha = 0.6) +
  labs(x = "Years of Service", y = "Rank", title = "Years of Service vs. Rank") +
  theme_minimal()
print(scatterplot)

Trục x của biểu đồ đại diện cho biến “Years of Service” và trục y đại diện cho biến “Rank”. Mỗi điểm trên biểu đồ biểu thị một quan sát trong dữ liệu, và vị trí của điểm đó trên trục x và trục y cho biết giá trị tương ứng của hai biến đó.

Biểu đồ được vẽ bằng các điểm màu xanh lam với độ trong suốt. Điểm màu xanh lam thể hiện các quan sát trong dữ liệu, và độ trong suốt giúp chúng ta nhìn thấy được các điểm chồng lấn lên nhau.

Thông qua biểu đồ này, chúng ta có thể nhìn thấy xu hướng hoặc mối quan hệ giữa số năm phục vụ và cấp bậc trong dữ liệu Salaries. Số năm phục vụ càng cao số lương càng tăng

3.3.6.2 Biểu đồ tròn lương theo năm phục vụ

year_groups <- cut(Salaries$yrs.service, breaks = c(0, 5, 10, 15, 20, Inf),
                   labels = c("0-5", "6-10", "11-15", "16-20", "21+"))

# Tạo bảng tổng kết lương theo nhóm năm phục vụ
salary_summary <- aggregate(Salaries$salary, by = list(year_groups), FUN = sum)

# Đặt tên cột trong bảng tổng kết
names(salary_summary) <- c("Year Group", "Total Salary")

# Vẽ biểu đồ tròn
library(ggplot2)
ggplot(salary_summary, aes(x = "", y = `Total Salary`, fill = `Year Group`)) +
  geom_bar(width = 1, stat = "identity", color = "white") +
  coord_polar("y", start = 0) +
  labs(fill = "Năm phục vụ", x = NULL, y = NULL, title = "Lương trung bình theo năm phục vụ") +
  theme_minimal() +
  theme(legend.position = "right") +
  geom_text(aes(label = paste0(round(`Total Salary`/sum(`Total Salary`)*100, 1), "%")), 
            position = position_stack(vjust = 0.5), color = "white")

Biểu đồ trên thể hiện phân bố lương theo nhóm năm phục vụ. Dưới đây là một số nhận xét về biểu đồ:

  • Biểu đồ tròn giúp trực quan hóa phần trăm lương của từng nhóm năm phục vụ trong tổng lương.
  • Nhóm năm phục vụ từ 0-5 năm có tỷ trọng lương cao nhất, chiếm gần 40% tổng lương.
  • Nhóm năm phục vụ từ 6-10 năm và 11-15 năm chiếm khoảng 20% tổng lương mỗi nhóm.
  • Nhóm năm phục vụ từ 16-20 năm và trên 20 năm có tỷ trọng lương thấp nhất, chỉ chiếm khoảng 10% tổng lương mỗi nhóm.
  • Biểu đồ trực quan và dễ hiểu, giúp ta nhanh chóng nhận thấy sự phân bố lương theo nhóm năm phục vụ.

4 Bài tập về nhà tuần 3

4.1 3.1 Dữ liệu sử dụng

  • Để thực hiện bài tập tuần 3, em sử dụng Package CarData và gọi dữ liệu Davis trong gói Package.Dữ liệu này gồm có 200 hàng và 5 cột. Dữ liệu này được thu thập từ những người tập luyện thể dục thể thao thường xuyên. Các biến bao gồm
  • Sex: giới tính
  • Weight: Cân nặng
  • Height: chiều cao
  • Repwt: Trọng lượng lúc trước
  • Repht: Cân nặng lúc trước
library(carData)
data("Davis")
library(dplyr)
library(tidyr)

davis_wide <- Davis %>% 
  pivot_wider(names_from = sex,
              values_from = height,
              values_fn = list)

print(davis_wide)
## # A tibble: 192 × 5
##    weight repwt repht M         F        
##     <int> <int> <int> <list>    <list>   
##  1     77    77   180 <int [1]> <NULL>   
##  2     58    51   159 <NULL>    <int [1]>
##  3     53    54   158 <NULL>    <int [1]>
##  4     68    70   175 <int [1]> <NULL>   
##  5     59    59   155 <NULL>    <int [2]>
##  6     76    76   165 <int [1]> <NULL>   
##  7     76    77   165 <int [1]> <int [1]>
##  8     69    73   180 <int [1]> <NULL>   
##  9     71    71   175 <int [1]> <NULL>   
## 10     65    64   170 <int [1]> <NULL>   
## # ℹ 182 more rows
davis1 <- na.omit(davis_wide)

4.2 Xử lý dữ liệu

Trong ví dụ trên, em đã pivot các giá trị trong cột “weight” của data Davis từ dạng dài sang dạng rộng, với cột “sex” làm tên cột mới và giá trị của các cột được lấy từ cột “weight”.

Bằng cách sử dụng values_fn = list, các giá trị trong cột “height” sẽ được tổng hợp thành một list trong kết quả.

print(davis1)
## # A tibble: 174 × 5
##    weight repwt repht M         F        
##     <int> <int> <int> <list>    <list>   
##  1     77    77   180 <int [1]> <NULL>   
##  2     58    51   159 <NULL>    <int [1]>
##  3     53    54   158 <NULL>    <int [1]>
##  4     68    70   175 <int [1]> <NULL>   
##  5     59    59   155 <NULL>    <int [2]>
##  6     76    76   165 <int [1]> <NULL>   
##  7     76    77   165 <int [1]> <int [1]>
##  8     69    73   180 <int [1]> <NULL>   
##  9     71    71   175 <int [1]> <NULL>   
## 10     65    64   170 <int [1]> <NULL>   
## # ℹ 164 more rows
library(dplyr)
bmi <- mutate(Davis, bmi= weight/(height/100)^2)

4.2.1 Xử lý dữ liệu - phân tích BMI

Em sử dụng lệnh mutate để thêm một cột mới “bmi” (chỉ số khối cơ thể) bằng cách tính toán trên cột “weight” và “height” theo công thứ . Kết quả là bộ dữ liệu mới có thêm cột “bmi” chứa chỉ số khối cơ thể tính được từ cột “weight” và “height”.

library(dplyr)
newbmi <- na.omit(bmi)
ketqua <- mutate(newbmi,
                 ketqua = case_when(
                   bmi < 18.5 ~ "Gay",
                   bmi >= 18.5 & bmi < 24.9 ~ "Binhthuong",
                   bmi >= 25 & bmi <30 ~ "thuacan",
                   bmi > 30 ~ "beophi"
                 ))
ketqua
##     sex weight height repwt repht       bmi     ketqua
## 1     M     77    182    77   180  23.24598 Binhthuong
## 2     F     58    161    51   159  22.37568 Binhthuong
## 3     F     53    161    54   158  20.44674 Binhthuong
## 4     M     68    177    70   175  21.70513 Binhthuong
## 5     F     59    157    59   155  23.93606 Binhthuong
## 6     M     76    170    76   165  26.29758    thuacan
## 7     M     76    167    77   165  27.25089    thuacan
## 8     M     69    186    73   180  19.94450 Binhthuong
## 9     M     71    178    71   175  22.40879 Binhthuong
## 10    M     65    171    64   170  22.22906 Binhthuong
## 11    M     70    175    75   174  22.85714 Binhthuong
## 12    F    166     57    56   163 510.92644     beophi
## 13    F     51    161    52   158  19.67517 Binhthuong
## 14    F     64    168    64   165  22.67574 Binhthuong
## 15    F     52    163    57   160  19.57168 Binhthuong
## 16    F     65    166    66   165  23.58833 Binhthuong
## 17    M     92    187   101   185  26.30902    thuacan
## 18    F     62    168    62   165  21.96712 Binhthuong
## 19    M     76    197    75   200  19.58309 Binhthuong
## 20    F     61    175    61   171  19.91837 Binhthuong
## 21    M    119    180   124   178  36.72840     beophi
## 22    F     61    170    61   170  21.10727 Binhthuong
## 23    M     65    175    66   173  21.22449 Binhthuong
## 24    M     66    173    70   170  22.05219 Binhthuong
## 25    F     54    171    59   168  18.46722        Gay
## 26    F     50    166    50   165  18.14487        Gay
## 27    F     63    169    61   168  22.05805 Binhthuong
## 28    F     58    166    60   160  21.04805 Binhthuong
## 29    F     39    157    41   153  15.82214        Gay
## 30    M    101    183   100   180  30.15916     beophi
## 31    F     71    166    71   165  25.76571    thuacan
## 32    M     75    178    73   175  23.67125 Binhthuong
## 33    M     79    173    76   173  26.39580    thuacan
## 34    F     52    164    52   161  19.33373 Binhthuong
## 35    F     68    169    63   170  23.80869 Binhthuong
## 36    M     64    176    65   175  20.66116 Binhthuong
## 37    F     56    166    54   165  20.32225 Binhthuong
## 38    M     69    174    69   171  22.79033 Binhthuong
## 39    M     88    178    86   175  27.77427    thuacan
## 40    M     65    187    67   188  18.58789 Binhthuong
## 41    F     54    164    53   160  20.07733 Binhthuong
## 42    M     80    178    80   178  25.24934    thuacan
## 43    F     63    163    59   159  23.71184 Binhthuong
## 44    M     78    183    80   180  23.29123 Binhthuong
## 45    M     85    179    82   175  26.52851    thuacan
## 46    F     54    160    55   158  21.09375 Binhthuong
## 49    F     54    174    56   173  17.83591        Gay
## 50    F     75    162    75   158  28.57796    thuacan
## 51    M     82    182    85   183  24.75546 Binhthuong
## 52    F     56    165    57   163  20.56933 Binhthuong
## 53    M     74    169    73   170  25.90946    thuacan
## 54    M    102    185   107   185  29.80278    thuacan
## 56    M     65    176    64   172  20.98399 Binhthuong
## 58    M     73    183    74   180  21.79820 Binhthuong
## 59    M     75    172    70   169  25.35154    thuacan
## 60    M     57    173    58   170  19.04507 Binhthuong
## 61    M     68    165    69   165  24.97704       <NA>
## 62    M     71    177    71   170  22.66271 Binhthuong
## 63    M     71    180    76   175  21.91358 Binhthuong
## 64    F     78    173    75   169  26.06168    thuacan
## 65    M     97    189    98   185  27.15489    thuacan
## 66    F     60    162    59   160  22.86237 Binhthuong
## 67    F     64    165    63   163  23.50781 Binhthuong
## 68    F     64    164    62   161  23.79536 Binhthuong
## 69    F     52    158    51   155  20.83000 Binhthuong
## 70    M     80    178    76   175  25.24934    thuacan
## 71    F     62    175    61   171  20.24490 Binhthuong
## 72    M     66    173    66   175  22.05219 Binhthuong
## 73    F     55    165    54   163  20.20202 Binhthuong
## 74    F     56    163    57   159  21.07720 Binhthuong
## 75    F     50    166    50   161  18.14487        Gay
## 77    F     50    160    55   150  19.53125 Binhthuong
## 78    F     63    160    64   158  24.60937 Binhthuong
## 79    M     69    182    70   180  20.83082 Binhthuong
## 80    M     69    183    70   183  20.60378 Binhthuong
## 81    F     61    165    60   163  22.40588 Binhthuong
## 82    M     55    168    56   170  19.48696 Binhthuong
## 83    F     53    169    52   175  18.55677 Binhthuong
## 84    F     60    167    55   163  21.51386 Binhthuong
## 85    F     56    170    56   170  19.37716 Binhthuong
## 86    M     59    182    61   183  17.81186        Gay
## 87    M     62    178    66   175  19.56824 Binhthuong
## 88    F     53    165    53   165  19.46740 Binhthuong
## 89    F     57    163    59   160  21.45357 Binhthuong
## 90    F     57    162    56   160  21.71925 Binhthuong
## 91    M     70    173    68   170  23.38869 Binhthuong
## 92    F     56    161    56   161  21.60410 Binhthuong
## 93    M     84    184    86   183  24.81096 Binhthuong
## 94    M     69    180    71   180  21.29630 Binhthuong
## 95    M     88    189    87   185  24.63537 Binhthuong
## 96    F     56    165    57   160  20.56933 Binhthuong
## 97    M    103    185   101   182  30.09496     beophi
## 98    F     50    169    50   165  17.50639        Gay
## 99    F     52    159    52   153  20.56881 Binhthuong
## 101   F     55    164    55   163  20.44914 Binhthuong
## 102   M     63    178    63   175  19.88385 Binhthuong
## 103   F     47    163    47   160  17.68979        Gay
## 104   F     45    163    45   160  16.93703        Gay
## 105   F     62    175    63   173  20.24490 Binhthuong
## 106   F     53    164    51   160  19.70553 Binhthuong
## 107   F     52    152    51   150  22.50693 Binhthuong
## 108   F     57    167    55   164  20.43817 Binhthuong
## 109   F     64    166    64   165  23.22543 Binhthuong
## 110   F     59    166    55   163  21.41094 Binhthuong
## 111   M     84    183    90   183  25.08286    thuacan
## 112   M     79    179    79   171  24.65591 Binhthuong
## 113   F     55    174    57   171  18.16620        Gay
## 114   M     67    179    67   179  20.91071 Binhthuong
## 115   F     76    167    77   165  27.25089    thuacan
## 116   F     62    168    62   163  21.96712 Binhthuong
## 117   M     83    184    83   181  24.51560 Binhthuong
## 118   M     96    184    94   183  28.35539    thuacan
## 119   M     75    169    76   165  26.25958    thuacan
## 120   M     65    178    66   178  20.51509 Binhthuong
## 121   M     78    178    77   175  24.61810 Binhthuong
## 122   M     69    167    73   165  24.74094 Binhthuong
## 123   F     68    178    68   175  21.46194 Binhthuong
## 124   F     55    165    55   163  20.20202 Binhthuong
## 128   F     45    157    45   153  18.25632        Gay
## 129   F     68    171    68   169  23.25502 Binhthuong
## 130   F     44    157    44   155  17.85062        Gay
## 131   F     62    166    61   163  22.49964 Binhthuong
## 132   M     87    185    89   185  25.42001    thuacan
## 133   F     56    160    53   158  21.87500 Binhthuong
## 134   F     50    148    47   148  22.82688 Binhthuong
## 135   M     83    177    84   175  26.49303    thuacan
## 136   F     53    162    53   160  20.19509 Binhthuong
## 137   F     64    172    62   168  21.63332 Binhthuong
## 139   M     90    188    91   185  25.46401    thuacan
## 140   M     85    191    83   188  23.29980 Binhthuong
## 141   M     66    175    68   175  21.55102 Binhthuong
## 142   F     52    163    53   160  19.57168 Binhthuong
## 143   F     53    165    55   163  19.46740 Binhthuong
## 144   F     54    176    55   176  17.43285        Gay
## 145   F     64    171    66   171  21.88708 Binhthuong
## 146   F     55    160    55   155  21.48437 Binhthuong
## 147   F     55    165    55   165  20.20202 Binhthuong
## 148   F     59    157    55   158  23.93606 Binhthuong
## 149   F     70    173    67   170  23.38869 Binhthuong
## 150   M     88    184    86   183  25.99244    thuacan
## 151   F     57    168    58   165  20.19558 Binhthuong
## 152   F     47    162    47   160  17.90886        Gay
## 153   F     47    150    45   152  20.88889 Binhthuong
## 155   F     48    163    44   160  18.06617        Gay
## 156   M     54    169    58   165  18.90690 Binhthuong
## 157   M     69    172    68   174  23.32342 Binhthuong
## 160   F     57    167    56   165  20.43817 Binhthuong
## 161   F     51    163    50   160  19.19530 Binhthuong
## 162   F     54    161    54   160  20.83253 Binhthuong
## 163   F     53    162    52   158  20.19509 Binhthuong
## 164   F     59    172    58   171  19.94321 Binhthuong
## 165   M     56    163    58   161  21.07720 Binhthuong
## 166   F     59    159    59   155  23.33768 Binhthuong
## 167   F     63    170    62   168  21.79931 Binhthuong
## 168   F     66    166    66   165  23.95123 Binhthuong
## 169   M     96    191    95   188  26.31507    thuacan
## 170   F     53    158    50   155  21.23057 Binhthuong
## 171   M     76    169    75   165  26.60971    thuacan
## 173   M     61    170    61   170  21.10727 Binhthuong
## 175   M     62    168    64   168  21.96712 Binhthuong
## 176   M     71    178    68   178  22.40879 Binhthuong
## 178   M     66    170    67   165  22.83737 Binhthuong
## 179   M     81    178    82   175  25.56495    thuacan
## 180   M     68    174    68   173  22.46003 Binhthuong
## 181   M     80    176    78   175  25.82645    thuacan
## 184   F     63    165    59   160  23.14050 Binhthuong
## 185   M     70    173    70   173  23.38869 Binhthuong
## 186   F     56    162    56   160  21.33821 Binhthuong
## 187   F     60    172    55   168  20.28123 Binhthuong
## 188   F     58    169    54   166  20.30741 Binhthuong
## 189   M     76    183    75   180  22.69402 Binhthuong
## 190   F     50    158    49   155  20.02884 Binhthuong
## 191   M     88    185    93   188  25.71220    thuacan
## 192   M     89    173    86   173  29.73704    thuacan
## 193   F     59    164    59   165  21.93635 Binhthuong
## 194   F     51    156    51   158  20.95661 Binhthuong
## 195   F     62    164    61   161  23.05175 Binhthuong
## 196   M     74    175    71   175  24.16327 Binhthuong
## 197   M     83    180    80   180  25.61728    thuacan
## 199   M     90    181    91   178  27.47169    thuacan
## 200   M     79    177    81   178  25.21625    thuacan
  • Em khai báo thư viện dplyr để sử dụng lệnh Na.omit xóa các hàng có giá trị NA trong bộ dữ liệu và gắn bộ dữ liệu mới vào biến newbmi. Tiếp theo em sử dụng lệnh mutate kết hợp lệnh case_when để tạo thêm cột mới tên kết quả dựa vào giá trị của cột bmi. Các điều kiện được đánh giá tuần tự từ trên xuống dưới. Nếu có một điều kiện đúng, kết quả tương tự sẽ được gắn vào cột ketqua. Trong trường hợp này, kết quả sẽ trả về:
  • bmi < 18.5 Gầy
  • 18.5 <= bmi < 24.9 bình thường
  • 18.5 <= bmi < 30 thừa cân
  • bmi > 30 béo phì
library(ggplot2)
ggplot(data = newbmi, aes(x = bmi)) +
  geom_histogram(binwidth = 1, fill = "steelblue", color = "black") + labs(x = "BMI", y = "Frequency", title = "BMI Distribution")

### Vẽ biểu đồ Histogram phân tích dữ liệu Câu lệnh trên cho chúng ta tạo một bộ dữ liệu mẫu newbmi có một cột BMI. Sau đó, chúng ta sử dụng hàm ggplot() và geom_histogram() để tạo biểu đồ histogram. Tham số binwidth xác định độ rộng của các khoảng bin trong histogram. Bạn có thể điều chỉnh giá trị binwidth để thay đổi độ chi tiết của biểu đồ. Các tham số fill và color được sử dụng để tùy chỉnh màu sắc của histogram. Cuối cùng, chúng ta sử dụng hàm labs() để đặt tên cho trục x, trục y và tiêu đề của biểu đồ.

Khi chạy mã trên, bạn sẽ thấy một biểu đồ histogram hiển thị phân phối của chỉ số BMI, với trục x đại diện cho các giá trị BMI và trục y đại diện cho tần suất.

library(dplyr)
ttestbmi <- t.test(newbmi$bmi ~ newbmi$sex, data = newbmi)
print(ttestbmi)
## 
##  Welch Two Sample t-test
## 
## data:  newbmi$bmi by newbmi$sex
## t = 0.42105, df = 98.973, p-value = 0.6746
## alternative hypothesis: true difference in means between group F and group M is not equal to 0
## 95 percent confidence interval:
##  -7.761724 11.943027
## sample estimates:
## mean in group F mean in group M 
##        26.00885        23.91820

4.2.2 Kiểm định t-test Welch Two Sample

  • Dựa vào kết quả kiểm định t-test Welch Two Sample, chúng ta có thể rút ra các kết luận sau:

  • Giá trị p-value là 0.6746, lớn hơn ngưỡng ý nghĩa thông thường (0.05). Điều này cho thấy không có đủ bằng chứng để bác bỏ giả thiết không có sự khác biệt giữa hai nhóm (group F và group M) về chỉ số BMI.

  • Giá trị t-statistic là 0.42105. Giá trị này cho thấy sự khác biệt giữa hai nhóm không lớn.

  • Khoảng tin cậy 95% cho giá trị trung bình của hai nhóm là -7.761724 đến 11.943027. Khoảng tin cậy này cho phép ta ước lượng khoảng giá trị trung bình thực tế có thể nằm trong khoảng này với độ tin cậy 95%.

  • Ước lượng giá trị trung bình của nhóm F là 26.00885 và nhóm M là 23.91820.

  • Dựa trên kết quả trên, chúng ta không có đủ bằng chứng để kết luận rằng có sự khác biệt có ý nghĩa thống kê về chỉ số BMI giữa hai nhóm F và M.

kiemdinh <- cor.test(newbmi$weight, newbmi$height, method = "pearson")
print(kiemdinh)
## 
##  Pearson's product-moment correlation
## 
## data:  newbmi$weight and newbmi$height
## t = 2.0888, df = 179, p-value = 0.03814
## alternative hypothesis: true correlation is not equal to 0
## 95 percent confidence interval:
##  0.008593128 0.293511390
## sample estimates:
##       cor 
## 0.1542575

4.2.3 Kiểm định tương quan Pearson sự phù hợp của mô hình

  • Kết quả kiểm tra tương quan Pearson’s product-moment cho thấy:

  • Giá trị p-value là 0.03814, nhỏ hơn ngưỡng ý nghĩa thông thường (0.05). Điều này cho thấy có đủ bằng chứng để bác bỏ giả thiết không có mối quan hệ tương quan giữa biến “weight” và “height”. Có sự tương quan đáng kể giữa hai biến.

  • Giá trị t-statistic là 2.0888, cho thấy mức độ khác biệt tương quan giữa hai biến.

  • Khoảng tin cậy 95% cho hệ số tương quan nằm trong khoảng 0.008593128 đến 0.293511390. Khoảng tin cậy này cho phép ước lượng khoảng giá trị tương quan thực tế có thể nằm trong khoảng này với độ tin cậy 95%.

  • Ước lượng hệ số tương quan là 0.1542575. Giá trị này cho thấy mức độ tương quan dương nhẹ giữa biến “weight” và “height”.

  • Dựa trên kết quả trên, ta có thể kết luận rằng tồn tại một mối quan hệ tương quan dương nhẹ và có ý nghĩa thống kê giữa cân nặng (weight) và chiều cao (height). Tuy nhiên, mối quan hệ này không mạnh và chỉ có mức độ tương quan nhỏ.

sexbmi <- table(ketqua$ketqua,ketqua$sex)
print(sexbmi)
##             
##               F  M
##   beophi      1  3
##   Binhthuong 80 49
##   Gay        14  1
##   thuacan     4 28

4.2.4 Phân tích dựa trên bảng tần số BMI

  • Dựa vào bảng tần số BMI theo giới tính bạn đã cung cấp, chúng ta có các thông tin sau:

  • Giới tính “Female”:

Số lượng quan sát trong phạm vi “beophi”: 1 Số lượng quan sát trong phạm vi “Binhthuong”: 80 Số lượng quan sát trong phạm vi “Gay”: 14 Số lượng quan sát trong phạm vi “thuacan”: 4 Giới tính “Male”:

Số lượng quan sát trong phạm vi “beophi”: 3 Số lượng quan sát trong phạm vi “Binhthuong”: 49 Số lượng quan sát trong phạm vi “Gay”: 1 Số lượng quan sát trong phạm vi “thuacan”: 28 Bảng tần số này cho thấy phân phối của các phạm vi BMI theo giới tính. Ví dụ, có 1 quan sát nữ thuộc phạm vi “beophi”, 3 quan sát nam thuộc phạm vi “beophi”, có 80 quan sát nữ thuộc phạm vi “Binhthuong”, và cứ tiếp tục như vậy.

Bảng tần số này có thể cung cấp thông tin về mối quan hệ giữa BMI và giới tính, cho phép phân tích sự phân bố BMI giữa nam và nữ trong tập dữ liệu.

bmi_df <- as.data.frame.matrix(sexbmi)
ggplot(bmi_df, aes(x = rownames(bmi_df))) +
  geom_col(aes(y = F, fill = "Female"), position = "dodge") +
  geom_col(aes(y = M, fill = "Male"), position = "dodge") +
  labs(x = "BMI", y = "So luong", fill = "Gioi tinh") +
  scale_fill_manual(values = c("Female" = "pink", "Male" = "blue")) +
  theme_minimal()

### Biểu đồ cột BMI và các thông số của nó Khi chạy đoạn mã trên, chúng ta sẽ nhìn thấy biểu đồ cột hiển thị phân phối BMI theo giới tính, với các cột tương ứng với số lượng quan sát cho từng phạm vi BMI và màu sắc biểu thị giới tính tương ứng.

library(dplyr)
bmi_groups <- cut(Davis$weight / ((Davis$height/100)^2),
                  breaks = c(0, 18.5, 25, 30, Inf),
                  labels = c("Dưới chuẩn", "Bình thường", "Thừa cân", "Béo phì"))
table(bmi_groups)
## bmi_groups
##  Dưới chuẩn Bình thường    Thừa cân     Béo phì 
##          18         143          35           4

Trong đoạn mã trên, em sử dụng hàm cut() để phân tổ biến BMI thành các nhóm dựa trên các ngưỡng (breaks) đã cho. Trong ví dụ này, chúng ta phân tổ BMI thành 4 nhóm: Dưới chuẩn, Bình thường, Thừa cân và Béo phì. Kết quả trả về là một factor có chứa các nhãn tương ứng với từng nhóm BMI.

bmi_freq <- table(bmi_groups)
barplot(bmi_freq, xlab = "Nhóm BMI", ylab = "Tần số", main = "Biểu đồ tần số BMI")

  • Dựa vào biểu đồ tần số bmi cho thấy nhóm bmi bình thường gấp 7 lần nhóm bmi dưới chuẩn, gấp 14 lần nhóm bmi béo phì và gấp 3,5 lần nhóm bmi thừa cân
  • Nhóm có tần số thấp nhất là nhóm dưới chuẩn
  • nhóm có tần số cao nhất là nhóm bình thường
correlation <- cor(newbmi$weight, newbmi$bmi)
print(correlation)
## [1] 0.5476132

Kết quả 0.5476132 là một giá trị gần 1 cho thấy mối tương quan dương mạnh giữa biến weight và biến bmi

correlation1 <- cor(newbmi$height, newbmi$bmi)
print(correlation1)
## [1] -0.6621572

Kết quả -0.6621572 là một giá trị gần -1 cho thấy mối tương quan rất yếu giữa biến height và biến bmi

library(ggplot2)
ggplot(data = Davis, aes(x = weight, y = height, color = sex)) +
  geom_point() +
  labs(x = "Weight", y = "Height", color = "sex")

### Biểu đồ phân tán đa biến - Biểu đồ phân tán đa biến của tập dữ liệu newdata cho biết mối quan hệ giữa các biến trong tập dữ liệu, bao gồm “weight” (cân nặng), “height” (chiều cao), “sex” (giới tính)

  • Thông qua biểu đồ phân tán đa biến, ta có thể nhận thấy các mẫu và mối quan hệ sau:

Mối quan hệ giữa cân nặng và chiều cao: ta thấy rằng các điểm dữ liệu phân bố xung quanh một đường thẳng, có thể có một mối quan hệ tuyến tính giữa cân nặng và chiều cao.

  • Mối quan hệ giữa giới tính và cân nặng/chiều cao: Giới tính có mối quan hệ với cân nặng và chiều cao

  • Sự phân bố của cân nặng, chiều cao và giới tính: Biểu đồ phân tán đa biến cũng cho phép bạn nhìn thấy phân phối của các biến trên các trục x và y. Bạn có thể xem xét xem cân nặng, chiều cao và tuổi có phân phối đều hay không đều và có thể nhận ra các điểm dữ liệu bất thường hoặc ngoại lệ.

Tương tác giữa giới tính và các biến khác: Biểu đồ phân tán đa biến cung cấp cơ hội để xem xét sự tương tác giữa giới tính và các biến khác. Bạn có thể nhìn thấy xem có sự khác biệt về cân nặng, chiều cao và tuổi giữa nam và nữ trong tập dữ liệu Davis.

Tóm lại, biểu đồ phân tán đa biến của tập dữ liệu Davis giúp bạn phân tích mối quan hệ giữa các biến và hiểu rõ hơn về mẫu và sự tương tác trong dữ liệu.

Regenerate response

5 Bài tập về nhà tuần 2

library(car)
data("Salaries")
dat <- Salaries
dat <- na.omit(dat)
names(dat) <- c("hocvi","thuhang","namtotnghiepPhD","namphucvu","gioitinh","luong")
table(Salaries$rank)
## 
##  AsstProf AssocProf      Prof 
##        67        64       266
table(Salaries$yrs.service)
## 
##  0  1  2  3  4  5  6  7  8  9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 
## 11 13 15 22 13  8 11 18 18 15 11 14  5  1  8  9  8  6 15 19 10  6  8 16  2  8 
## 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 43 44 45 46 48 49 51 53 57 60 
##  7 11  9  1  9 10  1  4  2  5  6  4  8  4  5  1  4  3  4  1  1  3  1  1  1  1
table(Salaries$sex)
## 
## Female   Male 
##     39    358
  • Gán dữ liệu vào biến dat
  • Sử dụng lệnh na.omit để xóa các dữ liệu NA
  • Đặt tên cho các biến bằng lệnh names
table( dat$hocvi)
## 
##  AsstProf AssocProf      Prof 
##        67        64       266
  • Lệnh này cho chúng ta biết có 67 trợ lý Giáo sư, 64 vị Phó Giáo Sư và 266 vị Giáo Sư
summary(dat)
##        hocvi     thuhang namtotnghiepPhD   namphucvu       gioitinh  
##  AsstProf : 67   A:181   Min.   : 1.00   Min.   : 0.00   Female: 39  
##  AssocProf: 64   B:216   1st Qu.:12.00   1st Qu.: 7.00   Male  :358  
##  Prof     :266           Median :21.00   Median :16.00               
##                          Mean   :22.31   Mean   :17.61               
##                          3rd Qu.:32.00   3rd Qu.:27.00               
##                          Max.   :56.00   Max.   :60.00               
##      luong       
##  Min.   : 57800  
##  1st Qu.: 91000  
##  Median :107300  
##  Mean   :113706  
##  3rd Qu.:134185  
##  Max.   :231545
  • Lệnh này ngoài cho biết số lượng học vị còn cho biết thống kê các biến khác như:
  • Có 181 vị hạng A
  • 216 vị hạng B
  • Năm tốt nghiệp Thạc Sĩ sau khi ra trường nhỏ nhất là 1
  • Năm tốt nghiệp Thạc Sĩ sau khi ra trường lớn nhất là 56
  • Khảo sát có só năm phục vụ cao nhất là 60
  • Khảo sát có số lượng năm phục vụ thấp nhất là 0
  • Mức lương cao nhất là 231545$
  • Mức lương thấp nhất là 57800
mean(dat$luong)
## [1] 113706.5

Lệnh này cho biết mức lương trung bình gần 11400 đô la

sd(dat$luong)
## [1] 30289.04

Độ lệch chuẩn này cho biết mức độ phân tán của giá trị thống kê so với giá trị trung bình

quantile(dat$luong)
##     0%    25%    50%    75%   100% 
##  57800  91000 107300 134185 231545

Hàm Quantile chỉ ra rằng có khoảng: 25% người có thu nhập <= 91000\(, 50% người có thu nhập <=107300\), 75% người có thu nhập <=134185$ và gần 100% người có thu nhập <=231545$

hist(dat$luong)

Biểu đồ kiểm định Histogram cho thấy rằng dữ liệu không tuân theo quy luật phân phối chuẩn

plot(dat$hocvi,dat$luong, pch=16, xlab = " Năm Phục Vụ", ylab = "Tiền Lương")

Lệnh plot vẽ biểu đồ tương quan hai biến năm phục vụ và tiền lương. Qua biểu đồ cho thấy mối tương quan giữa năm phục vụ và tiền tương đối thấp

  • Mô hình hồi quy tuyến tính giữa lương và năm phục vụ có ý nghĩa:
  • Khi năm phục vụ bằng 0 thì mức lương là 99974.7$
  • Khi năm phục vụ tăng 1 đơn vị thì lương tăng 779$

6 Bài Tập Về Nhà Tuần 1

Dữ liệu được trích xuất từ lương tháng 09 năm 2008 Trợ lý Giáo sư, Phó Giáo sư và Giáo sư tại một trường cao đẳng ở Hoa Kỳ. Dữ liệu được thu thập như một phần trong nỗ lực không ngừng của ban quản lý trường đại học nhằm theo dõi sự khác biệt về lương giữa nam và nữ giảng viên.Dữ liệu trong gói package gồm các biến: rank (chức vụ), yrs.since.phd(tính từ năm đạt được bằng đến thời điểm hiện tại), yrs.service(năm phục vụ trong ngành), sex(giới tính), salary(lương)

library(car) # Gọi package Car
data("Salaries")
str(Salaries) # Cấu trúc của dữ liệu Salaries
## 'data.frame':    397 obs. of  6 variables:
##  $ rank         : Factor w/ 3 levels "AsstProf","AssocProf",..: 3 3 1 3 3 2 3 3 3 3 ...
##  $ discipline   : Factor w/ 2 levels "A","B": 2 2 2 2 2 2 2 2 2 2 ...
##  $ yrs.since.phd: int  19 20 4 45 40 6 30 45 21 18 ...
##  $ yrs.service  : int  18 16 3 39 41 6 23 45 20 18 ...
##  $ sex          : Factor w/ 2 levels "Female","Male": 2 2 2 2 2 2 2 2 2 1 ...
##  $ salary       : int  139750 173200 79750 115000 141500 97000 175000 147765 119250 129000 ...
a <- Salaries # Gán Salaries vào biến a
names(a) <- c("r","d","ysp","ys","s","sa") # đặt tên các biến có trong data
head(a) # Đọc 6 dòng đầu tiên của a
##           r d ysp ys    s     sa
## 1      Prof B  19 18 Male 139750
## 2      Prof B  20 16 Male 173200
## 3  AsstProf B   4  3 Male  79750
## 4      Prof B  45 39 Male 115000
## 5      Prof B  40 41 Male 141500
## 6 AssocProf B   6  6 Male  97000
Prof <- a[a$r=="Prof",] # Lọc các người có học vị Giáo sư
head(Prof)# Đọc 6 dòng đầu tiên người có học vị Giáo sư
##      r d ysp ys    s     sa
## 1 Prof B  19 18 Male 139750
## 2 Prof B  20 16 Male 173200
## 4 Prof B  45 39 Male 115000
## 5 Prof B  40 41 Male 141500
## 7 Prof B  30 23 Male 175000
## 8 Prof B  45 45 Male 147765
Prof20 <- a[a$r=="Prof"&a$ys>=20,]# câu lệnh này có ý nghia Lọc các vị có học vị Giáo sư và có thời gian phục vụ hơn 20 năm

Prof10 <- a[a$r=="Prof"&a$ys<=10,]
hocvi <- a$r#gắn biến Học vị vào hocvi
luong <- a$sa# gắn biến Lương vào luong
table(cut(luong,3))
## 
## (5.76e+04,1.16e+05] (1.16e+05,1.74e+05] (1.74e+05,2.32e+05] 
##                 237                 145                  15
namphucvu <- a$ys
table(cut(luong,6)) # Chia lương ra 6 khoảng và lập bảng tần số
## 
## (5.76e+04,8.68e+04] (8.68e+04,1.16e+05] (1.16e+05,1.45e+05] (1.45e+05,1.74e+05] 
##                  78                 159                  91                  54 
## (1.74e+05,2.03e+05] (2.03e+05,2.32e+05] 
##                  12                   3
Profexperience <- a[a$r=="Prof"&a$ys==30,] # Câu lệnh này lọc ra những vị có học vị giáo sư và có thời gian phục vụ 30 năm. Kết quả thu được 9 quan sát
head(Profexperience)# Sau đó em dùng lệnh này để đọc 6 quan sát đầu tiên
##        r d ysp ys    s     sa
## 23  Prof A  34 30 Male  93904
## 129 Prof A  32 30 Male 113278
## 186 Prof B  33 30 Male 134000
## 242 Prof A  31 30 Male 122875
## 260 Prof A  32 30 Male  92550
## 266 Prof A  36 30 Male 134800
sex <- a$s # Gắn biến giới tính s vào sex
sexProf <- a[a$r=="Prof"&a$s=="Female",]#Câu lệnh này lọc ra những vị giáo sư là nữ
str(sexProf)# Lệnh này cho biết có 18 quan sát những vị giáo sư là nữ
## 'data.frame':    18 obs. of  6 variables:
##  $ r  : Factor w/ 3 levels "AsstProf","AssocProf",..: 3 3 3 3 3 3 3 3 3 3 ...
##  $ d  : Factor w/ 2 levels "A","B": 2 1 2 2 2 2 2 1 2 1 ...
##  $ ysp: int  18 39 23 25 17 17 20 12 36 29 ...
##  $ ys : int  18 36 19 25 17 18 14 0 26 27 ...
##  $ s  : Factor w/ 2 levels "Female","Male": 1 1 1 1 1 1 1 1 1 1 ...
##  $ sa : int  129000 137000 151768 140096 111512 122960 127512 105000 144651 91000 ...
RichProfMan <- a[a$r=="Prof"&a$sa>100000&a$s=="Male",]# Lệnh này dùng để lọc những vị giáo sư nam có mức lương trên 10000$ 
str(RichProfMan)#Lệnh này cho biết có 213 vị giáo sư nam có mức lương trên 100000$
## 'data.frame':    213 obs. of  6 variables:
##  $ r  : Factor w/ 3 levels "AsstProf","AssocProf",..: 3 3 3 3 3 3 3 3 3 3 ...
##  $ d  : Factor w/ 2 levels "A","B": 2 2 2 2 2 2 2 2 2 2 ...
##  $ ysp: int  19 20 45 40 30 45 21 20 12 19 ...
##  $ ys : int  18 16 39 41 23 45 20 18 3 20 ...
##  $ s  : Factor w/ 2 levels "Female","Male": 2 2 2 2 2 2 2 2 2 2 ...
##  $ sa : int  139750 173200 115000 141500 175000 147765 119250 104800 117150 101000 ...
cor.test(luong,namphucvu,method = "pearson") # Thống kê Pearson's
## 
##  Pearson's product-moment correlation
## 
## data:  luong and namphucvu
## t = 7.0602, df = 395, p-value = 7.529e-12
## alternative hypothesis: true correlation is not equal to 0
## 95 percent confidence interval:
##  0.2443740 0.4193506
## sample estimates:
##       cor 
## 0.3347447

Trong đó P-value=7.529e-12 < 5% điều này cho thấy mối tương quan giữa lương và năm phục vụ có ý nghĩa thống kê Với độ tin cậy 95% chúng ta có khoảng tin cậy từ [0.244-0.419] Hệ số tương quan trong trường hợp này là 0.33>0 điều đó thể hiện rằng có mối tương quan thuận giữa lương và năm phục vụ