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.
# 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.
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 đồ:
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.
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.
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.
Đ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.
Đá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.
Đố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ả.
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
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.
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.
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.
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.
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.
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:
install.packages(“readxl”) install.packages(“tidyverse”) library(readxl) library(tidyverse)
url <- “https://www.investing.com/commodities/crude-oil-historical-data”
page <- read_html(url)
table <- page %>% html_nodes(“#curr_table”) %>% html_table()
dim(data) head(data)
summary(data)
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”)
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”)
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”)
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))
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))
Ở 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.
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.
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.
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.
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.
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.
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ữ.
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.
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.
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.
Ở 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:
Ở 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ư.
## 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
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.
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.
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ụ.
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:
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.
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 đồ:
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.
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.
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
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 đồ:
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)
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)
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
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
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
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
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")
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)
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
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
table( dat$hocvi)
##
## AsstProf AssocProf Prof
## 67 64 266
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
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
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ụ