22:32:56, 20 - 01 - 2024
File được sử dụng có tên là “Productivity.xls”
library(readxl) # Gọi package "readxl" để sử dụng
Pro <- read_xls("D:\\Rpubs\\Productivity.xls") # Lệnh đọc file xls và gán vào Pro
is.data.frame(Pro) # Kiểm tra dữ liệu có phải là data frame không
## [1] TRUE
Với kết quả trên thì dữ liệu là data frame
length(Pro) # Xem dữ liệu có bao nhiêu biến
## [1] 10
names(Pro) # Xem tên biến
## [1] "STATE" "YR" "P_CAP" "HWY" "WATER" "UTIL" "PC" "GSP" "EMP"
## [10] "UNEMP"
Chú thích:
Sau đây ta sử dụng lệnh skim từ package “skimr” để biết thêm vài thông tin chi tiết về dữ liệu
library(skimr) # Gọi ra package "skimr"
skim(Pro) # Lệnh mô tả dữ liệu
Name | Pro |
Number of rows | 816 |
Number of columns | 10 |
_______________________ | |
Column type frequency: | |
character | 1 |
numeric | 9 |
________________________ | |
Group variables | None |
Variable type: character
skim_variable | n_missing | complete_rate | min | max | empty | n_unique | whitespace |
---|---|---|---|---|---|---|---|
STATE | 0 | 1 | 4 | 14 | 0 | 48 | 0 |
Variable type: numeric
skim_variable | n_missing | complete_rate | mean | sd | p0 | p25 | p50 | p75 | p100 | hist |
---|---|---|---|---|---|---|---|---|---|---|
YR | 0 | 1 | 1978.00 | 4.90 | 1970.00 | 1974.00 | 1978.00 | 1982.00 | 1986.00 | ▇▆▆▆▇ |
P_CAP | 0 | 1 | 25036.66 | 27780.40 | 2627.12 | 7096.66 | 17572.46 | 27691.57 | 140217.32 | ▇▁▁▁▁ |
HWY | 0 | 1 | 10218.42 | 9253.60 | 1827.14 | 3857.86 | 7556.35 | 11266.55 | 47699.42 | ▇▂▁▁▁ |
WATER | 0 | 1 | 3618.78 | 4311.74 | 228.46 | 764.51 | 2266.49 | 4318.70 | 24592.33 | ▇▁▁▁▁ |
UTIL | 0 | 1 | 11199.45 | 14768.87 | 538.49 | 2488.33 | 7008.81 | 11598.47 | 80728.14 | ▇▂▁▁▁ |
PC | 0 | 1 | 58188.29 | 59770.78 | 4052.71 | 21651.39 | 40671.21 | 64796.27 | 375341.60 | ▇▁▁▁▁ |
GSP | 0 | 1 | 61014.32 | 69973.90 | 4354.00 | 16502.50 | 39987.00 | 68126.00 | 464550.00 | ▇▁▁▁▁ |
EMP | 0 | 1 | 1747.10 | 1855.99 | 108.30 | 475.02 | 1164.80 | 2114.10 | 11258.00 | ▇▂▁▁▁ |
UNEMP | 0 | 1 | 6.60 | 2.23 | 2.80 | 5.00 | 6.20 | 7.90 | 18.00 | ▇▇▂▁▁ |
Ta thấy được kết quả ở bảng 1 là tên của data là Pro gồm 816 quan sát và 10 biến. Ở bảng 2 thì ta biết được có 9 biến dạng số(numeric) và 1 biến dạng ký tự(character). Ở bảng 3 cho ta biết được tên của các biến ký tự là “STATE”. Ở bảng 4 cho ta biết được tên các biến dạng số lần lượt là: “YR”, “P_CAP”, “HWY”, “WATER”, “UTIL”, “PC”, “GSP”, “EMP”, “UNEMP”. Trong đó biến “YR” là biến về thời gian nên không thể phép toán.
Ý nghĩa tên các cột của bảng 3 và bảng 4:
Ta tiến hành đổi tên để dễ thực hiện các thao tác
names(Pro) <- c("TB","Năm","Công","CT", "Nước", "Tiện","Tư","SL","HN","TN")# Lệnh đổi tên biến
names(Pro)
## [1] "TB" "Năm" "Công" "CT" "Nước" "Tiện" "Tư" "SL" "HN" "TN"
Bộ dữ liệu bao gồm 48 nước và được quan sát từ năm 1970 đến năm 1986
a <- table(Pro$TB) # Lệnh xem các tiểu bang được quan sát
dim(a) # Lượng tiểu bang được quan sát
## [1] 48
head(a,4) # Tên 4 tiểu bang đầu được quan sát
##
## ALABAMA ARIZONA ARKANSAS CALIFORNIA
## 17 17 17 17
b <- table(Pro$Năm) # Lệnh xem thời điểm quan sát
dim(b) # Thời gian quan sát
## [1] 17
Ta chỉ cần 4 biến là “TB”, “Năm”, “Công”, “SL”
Pro4 <- Pro[,c(1,2,3,8)]
Ta sẽ tạo ra 3 bộ dữ liệu bao gồm:
ida <- Pro4[ Pro4$TB== "IDAHO",] # Lệnh rút ra quan sát từ bang IDAHO
n1985 <- Pro4[Pro4$Năm==1985,] # Lệnh rút ra quan sát trong năm 1985
n7080 <- Pro4[Pro4$Năm>= 1970 & Pro4$Năm <=1980 & Pro4$SL >= 32000,] # Lệnh rút ra quan sát từ năm 1970 tới năm 1980
Ta sẽ tạo ra 1 biến mới là năng suất. Ta sẽ tính sản lượng tạo ra được của mỗi nhân dụng với công thức \(Năng suất = Sản lượng/Nhân dụng\)
NS <- Pro$SL/Pro$HN # Lệnh tạo ra biến mới là năng suất
# Ta ghép biến năng suất vào dữ liệu ban đầu
Pro <- cbind(Pro,NS) # Lệnh ghép các cột lại với nhau
Bây giờ ta sẽ dùng package “tidyverse” để đổi tên và rút trích dữ liệu. Trong package “tidyverse” có toán tử pipe %>% . Chức năng của toán tử pipe là chuyền dữ liệu bên trái làm dữ liệu đầu vào cho bên phải để thực hiện thao tác.
library(tidyverse)
## ── Attaching core tidyverse packages ──────────────────────── tidyverse 2.0.0 ──
## ✔ dplyr 1.1.4 ✔ readr 2.1.4
## ✔ forcats 1.0.0 ✔ stringr 1.5.1
## ✔ ggplot2 3.4.4 ✔ tibble 3.2.1
## ✔ lubridate 1.9.3 ✔ tidyr 1.3.0
## ✔ purrr 1.0.2
## ── 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
Pro1 <- Pro %>% rename(NMN=Nước, ĐTC=Công) # Lệnh đổi tên
names(Pro1)
## [1] "TB" "Năm" "ĐTC" "CT" "NMN" "Tiện" "Tư" "SL" "HN" "TN"
## [11] "NS"
Pro2 <- Pro1 %>% select(TB,Năm,ĐTC,NMN,SL) # Lệnh chọn ra biến cần thiết
names(Pro2)
## [1] "TB" "Năm" "ĐTC" "NMN" "SL"
Ta sẽ dùng lệnh filter để lọc ra những quan sát cần thiết
Các quan sát từ bang IDAHO
ida1 <- Pro2 %>% filter(TB == "IDAHO") # Lệnh chọn ra các quan sát từ IDAHO
Các quan sát trong năm 1985
n19851 <- Pro2 %>% filter(Năm == 1985)# Lệnh chọn ra các quan sát trong năm 1985
Các quan sát từ năm 1970 tới năm 1980 và Sản lượng lớn hơn 32000
n70801 <- Pro2 %>% filter(Năm >= 1970 & Năm <=1980 & SL >= 32000)
Ta sẽ tạo ra 1 năng suất. Ta sẽ tính sản lượng tạo ra được của mỗi nhân dụng với công thức \(Năng suất = Sản lượng/Nhân dụng\) và ghép vào Pro
Pro <- Pro %>% mutate(NS = SL/HN)
head(Pro, 3)
## TB Năm Công CT Nước Tiện Tư SL HN TN
## 1 ALABAMA 1970 15032.67 7325.80 1655.68 6051.20 35793.80 28418 1010.5 4.7
## 2 ALABAMA 1971 15501.94 7525.94 1721.02 6254.98 37299.91 29375 1021.9 5.2
## 3 ALABAMA 1972 15972.41 7765.42 1764.75 6442.23 38670.30 31303 1072.3 4.7
## NS
## 1 28.12271
## 2 28.74547
## 3 29.19239
Bộ dữ liệu điều tra các yếu tố ảnh hưởng đến mức lương của Nhà khoa học dữ liệu.
Bộ dữ liệu HR Analytics: Job Change Of Data Scientists là một bộ dữ liệu bảng được lấy từ website:Kaggle. Ta sử dụng bộ dữ liệu này để thực hiện Data manipulation trong nhiệm vụ này.
Sử dụng tidyverse để thực hiện Data manipulation
Mô tả về bộ dữ liệu.
Rút trích các dữ liệu theo yêu cầu
Tạo dữ liệu mới
nv2 <- read.csv("C:\\Users\\a\\Documents\\Zalo Received Files\\vd2.csv")
Ta sẽ dùng lệnh str để mô tả cấu trúc dữ liệu
str(nv2)
## 'data.frame': 3755 obs. of 11 variables:
## $ work_year : int 2023 2023 2023 2023 2023 2023 2023 2023 2023 2023 ...
## $ experience_level : chr "SE" "MI" "MI" "SE" ...
## $ employment_type : chr "FT" "CT" "CT" "FT" ...
## $ job_title : chr "Principal Data Scientist" "ML Engineer" "ML Engineer" "Data Scientist" ...
## $ salary : int 80000 30000 25500 175000 120000 222200 136000 219000 141000 147100 ...
## $ salary_currency : chr "EUR" "USD" "USD" "USD" ...
## $ salary_in_usd : int 85847 30000 25500 175000 120000 222200 136000 219000 141000 147100 ...
## $ employee_residence: chr "ES" "US" "US" "CA" ...
## $ remote_ratio : int 100 100 100 100 100 0 0 0 0 0 ...
## $ company_location : chr "ES" "US" "US" "CA" ...
## $ company_size : chr "L" "S" "S" "M" ...
Bảng kết quả cho ta biết được
Ta sẽ xem bộ dữ liệu này có giá trị thiếu hay không
sum(is.na(nv2))
## [1] 0
Vậy dữ liệu không có giá trị thiếu ## Rút trích dữ liệu Ta sẽ chọn ra 7 biến đó là: “work_year”, “experience_level” ,“employment_type”, “job_title”, “Salary_in_usd”, “Employee_residence”, “Remote_ratio”. Và sẽ tạo ra những bộ dữ liệu nhỏ khác để phân tích. Bao gồm:
library(tidyverse) # Gọi package tidyverse
# Thực hiện chọn các biến
nv27 <- nv2 %>% select(work_year,experience_level,employment_type,job_title,salary_in_usd,employee_residence,remote_ratio)
# Rút các quan sát là nhân viên trung cấp và cao cấp
ms <- nv27 %>% filter(experience_level=="MI"|experience_level=="SE")
# Rút các quan sát là kỹ sư máy học hoặc nhà khoa học dữ liệu là nhân viên cấp cao
meds <- nv27 %>% filter(job_title=="ML Engineer"|job_title=="Data Scientist"|job_title=="Machine Learning Engineer") %>%
filter(experience_level=="SE")
# Rút các quan sát có mức lương trên 150000 USD mỗi năm
up1500 <- nv27 %>% filter(salary_in_usd>= 150000)
# Rút các quan sát là kỹ sư máy học ở Canada
caml <- nv27 %>%
filter(job_title=="ML Engineer"| job_title=="Machine Learning Engineer") %>%
filter(employee_residence == "CA")
Ta sẽ xem qua các bộ dữ liệu
# Lệnh xem lượng quan sát của "ms"
dim(ms)
## [1] 3321 7
# Lệnh xem 3 dữ liệu đầu của "ms"
head(ms,3)
## work_year experience_level employment_type job_title
## 1 2023 SE FT Principal Data Scientist
## 2 2023 MI CT ML Engineer
## 3 2023 MI CT ML Engineer
## salary_in_usd employee_residence remote_ratio
## 1 85847 ES 100
## 2 30000 US 100
## 3 25500 US 100
#Lệnh xem lượng quan sát của "meds"
dim(meds)
## [1] 838 7
# Lệnh xem 3 dữ liệu đầu của "meds"
head(meds,3)
## work_year experience_level employment_type job_title salary_in_usd
## 1 2023 SE FT Data Scientist 175000
## 2 2023 SE FT Data Scientist 120000
## 3 2023 SE FT Data Scientist 219000
## employee_residence remote_ratio
## 1 CA 100
## 2 CA 100
## 3 CA 0
# Lệnh xem lượng quan sát của "up1500"
dim(up1500)
## [1] 1501 7
# Lệnh xem 3 dữ liệu đầu của "up1500"
head(up1500,3)
## work_year experience_level employment_type job_title salary_in_usd
## 1 2023 SE FT Data Scientist 175000
## 2 2023 SE FT Applied Scientist 222200
## 3 2023 SE FT Data Scientist 219000
## employee_residence remote_ratio
## 1 CA 100
## 2 US 0
## 3 CA 0
# Lệnh xem lượng quan sát của "caml"
dim(caml)
## [1] 10 7
# Lệnh xem 3 dữ liệu đầu của " caml"
head(caml,3)
## work_year experience_level employment_type job_title
## 1 2023 SE FT Machine Learning Engineer
## 2 2023 SE FT Machine Learning Engineer
## 3 2023 SE FT ML Engineer
## salary_in_usd employee_residence remote_ratio
## 1 115000 CA 100
## 2 95000 CA 100
## 3 260000 CA 100
Ta sẽ tạo ra 1 biến mới là thưởng cho những nhân viên làm việc từ xa. Với công thức tính \(thưởng = (Khối lượng việc/50)*(tiền lương*0.3)/12\)
# Lệnh tạo ra biến mới và ghép vào dữ liệu
nv2 <- nv2 %>% mutate(thưởng = (remote_ratio/50)*(salary_in_usd*0.3)/12)
# Xem 3 dữ liệu đầu của thưởng
head(nv2$thưởng)
## [1] 4292.35 1500.00 1275.00 8750.00 6000.00 0.00