21:38:47, 20 - 01 - 2024
File được sử dụng có tên là “Productivity.xls” trong Sample data
library(readxl) # Gọi package "xlsx" để sử dụng
d <- file.choose() # Gán đường dẫn file vào d
d # Tên đường dẫn file
## [1] "D:\\Rpubs\\Productivity.xls"
pro <- read_excel(d) # Lệnh đọc file excel 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 không có ý nghĩa.
Ý nghĩa tên các cột của bảng 3 và bảng 4:
Ta sẽ rút trích dữ liệu bằng 2 cách:
Ta tiến hành đổi tên để dễ thực hiện các thao tác
names(pro) <- c("TB","Năm","VCô","CT", "Nước", "Tiện","Tư","Q","ND","7")# Lệnh đổi tên biến
names(pro)
## [1] "TB" "Năm" "VCô" "CT" "Nước" "Tiện" "Tư" "Q" "ND" "7"
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”, “VCông”, “Q”
pro4 <- pro[,c(1,2,3,8)]
Ta sẽ tạo ra 3 bộ dữ liệu bao gồm:
cali <- pro4[ pro$TB== "CALIFORNIA",] # Lệnh rút ra quan sát từ CALIFORNIA
n1975 <- pro4[pro$Năm== 1975,] # Lệnh rút ra quan sát từ năm 1975
# Lệnh rút ra quan sát của của bang FLORIDA và ALABAMA từ năm 1975 tới 1985
floala <- pro4[pro4$TB== "FLORIDA" | pro4$TB=="ALABAMA" & pro4$Năm >= 1975 &pro4$Năm<=1985,]
Ta sẽ xem qua lượng quan sát và 3 dữ liệu đầu của 3 bộ dữ liệu trên
# Lệnh xem lượng quan sát của "cali"
dim(cali)
## [1] 17 4
# Lệnh xem 3 dữ liệu đầu của "cali"
head(cali,3)
## # A tibble: 3 × 4
## TB Năm VCô Q
## <chr> <dbl> <dbl> <dbl>
## 1 CALIFORNIA 1970 128545. 263933
## 2 CALIFORNIA 1971 132263. 265600
## 3 CALIFORNIA 1972 134452. 281159
# Lệnh xem lượng quan sát của "n1975"
dim(n1975)
## [1] 48 4
# Lệnh xem 3 dữ liệu đầu của "n1975"
head(n1975,3)
## # A tibble: 3 × 4
## TB Năm VCô Q
## <chr> <dbl> <dbl> <dbl>
## 1 ALABAMA 1975 17316. 33604
## 2 ARIZONA 1975 12929. 24915
## 3 ARKANSAS 1975 8651. 19024
# Lệnh xem lượng quan sát của "floala"
dim(floala)
## [1] 28 4
# Lệnh xem 3 dữ liệu đầu của "floala"
head(floala,3)
## # A tibble: 3 × 4
## TB Năm VCô Q
## <chr> <dbl> <dbl> <dbl>
## 1 ALABAMA 1975 17316. 33604
## 2 ALABAMA 1976 17733. 35764
## 3 ALABAMA 1977 18112. 37463
Ta sẽ tạo 1 biến là tốc độ để phản ánh sự tăng hoặc giảm của sản lượng giữa 2 năm liên tiếp với công thức \(Tốc độ = (SLn - SLn-1)/SLn-1\)
SLn: Là sản lượng ở năm cần tính SLn-1: Là sản lượng ở năm trước
sln <- pro[pro$Năm>= 1971 & pro$Năm<=1986,] # Lệnh tạo ra biến SLn
sln1 <- pro[pro$Năm>=1970 & pro$Năm <=1985,]# Lệnh tạo ra biến SLn-1
TĐ <- (sln$Q-sln1$Q)/sln1$Q # Lệnh tạo ra biến tốc độ
Package “Tidyverse” là một package chuyên sử dụng cho việc Data manipulation nên sẽ rất phù hợp trong việc rút trích dữ liệu trong mục này. Trong package có toán tử pipe %<% là 1 công cụ giúp việc thực hiện các câu lệnh dễ dàng hơn. Ý nghĩa của toán tử pipe là tiếp đến là. Sau đây là 1 câu lệnh để ví dụ cho toán tử pipe.
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
pro4.1 <- pro %>% select(TB, Năm,VCô,Q) # Lệnh chọn ra 4 biến
# Với câu lệnh trên R sẽ hiểu là chọn đối tượng pro tiếp đến là chọn biến TB, Năm, VCô, Q
names(pro4.1)
Ta sẽ tiến hành đổi tên biến cho pro để phân biệt với gói base
pro.1 <- pro %>% rename(VC = VCô, SL=Q, TN = 7 )# Lệnh đổi tên cho các cột được chỉ định
names(pro.1)
## [1] "TB" "Năm" "VC" "CT" "Nước" "Tiện" "TN" "SL" "ND" "7"
Và tiếp tục ta sẽ dùng lệnh filter để tạo ra 3 bộ dữ liệu:
cali.1 <- pro4.1 %>% filter(TB == "CALIFORNIA") # Lệnh rút ra các quan sát từ bang CALIFORNIA
n1975.1 <- pro4.1 %>% filter(Năm == 1975) # Lệnh rút ra các quan sát từ năm 1975
# Lệnh rút ra quan sát của bang FLORIDA và ALABAMA từ năm 1975 tới 1985
floala.1 <- pro4.1 %>% filter(TB == "FLORIDA" | TB=="ALABAMA"& Năm>=1975 & Năm<=1985)
Sau đây ta sẽ tạo ra biến tốc độ để phản ánh sự tăng hoặc giảm của sản lượng giữa 2 năm liên tiếp với công thức \(Tốc độ = (SLn - SLn-1)/SLn-1\) và ghép vào sln. Do ta chưa đổi tên của 2 bộ dữ liệu sln và sln1 nên ta sẽ đổi tên trong câu lệnh sau
sln <- sln %>% rename(SL = Q) # Đổi tên biến Q thành SL của sln
sln1 <- sln1 %>% rename(SL =Q) # Đổi tên biến Q thành SL của sln1
sln <- sln %>% mutate(TĐ.1 = (SL - sln1$SL)*100/sln$SL)# Tạo ra biến TĐ.1 và ghép vào sln1
head(sln,3)
## # A tibble: 3 × 11
## TB Năm VCô CT Nước Tiện Tư SL ND `7` TĐ.1
## <chr> <dbl> <dbl> <dbl> <dbl> <dbl> <dbl> <dbl> <dbl> <dbl> <dbl>
## 1 ALABAMA 1971 15502. 7526. 1721. 6255. 37300. 29375 1022. 5.2 3.26
## 2 ALABAMA 1972 15972. 7765. 1765. 6442. 38670. 31303 1072. 4.7 6.16
## 3 ALABAMA 1973 16406. 7908. 1742. 6756. 40084. 33430 1136. 3.9 6.36
Bộ dữ liệu điều tra các yếu tố khiến một người rời bỏ công việc hiện tại để nghiên cứu nhân sự.
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 đây là nguồn khá phổ biến cho ai muốn thực hành với những dữ liệu đã làm sạch.
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
d <- file.choose() # Lệnh gán đường dẫn của dữ liệu
nv <- read.csv(d)# Lệnh đọc dữ liệu
str(nv) # Lệnh mô tả cấu trúc dữ liệu
## 'data.frame': 2129 obs. of 13 variables:
## $ enrollee_id : int 32403 9858 31806 27385 27724 217 21465 27302 12994 16287 ...
## $ city : chr "city_41" "city_103" "city_21" "city_13" ...
## $ city_development_index: num 0.827 0.92 0.624 0.827 0.92 0.899 0.624 0.92 0.878 0.624 ...
## $ gender : chr "Male" "Female" "Male" "Male" ...
## $ relevent_experience : chr "Has relevent experience" "Has relevent experience" "No relevent experience" "Has relevent experience" ...
## $ enrolled_university : chr "Full time course" "no_enrollment" "no_enrollment" "no_enrollment" ...
## $ education_level : chr "Graduate" "Graduate" "High School" "Masters" ...
## $ major_discipline : chr "STEM" "STEM" "" "STEM" ...
## $ experience : chr "9" "5" "<1" "11" ...
## $ company_size : chr "<10" "" "" "10/49" ...
## $ company_type : chr "" "Pvt Ltd" "Pvt Ltd" "Pvt Ltd" ...
## $ last_new_job : chr "1" "1" "never" "1" ...
## $ training_hours : int 21 98 15 39 72 12 11 81 2 4 ...
Theo như kết quả cho ta biết được:
Cấu trúc của dữ liệu là data frame
Dữ liệu bao gồm 2129 quan sát và 13 biến
Có 10 biến là ký tự
Có 3 biến ở dạng số
Ý nghĩa tên biến:
Ta sẽ xem bộ dữ liệu này có giá trị thiếu hay không
sum(is.na(nv))
## [1] 0
Như kết quả trên cho thấy đc bộ dữ liệu không có giá trị thiếu nên không cần xử lý gì thêm ## Rút trích dữ liệu Ta sẽ chọn ra 7 biến đó chính là “enrollee_id”, “city”, “gender”, “education_level”, “major_discipline”, “experience”,“training_hours”. Và ta tạo ra những bộ dữ liệu nhỏ bao gồm:
library(tidyverse)# Gọi package tidyverse
# Lệnh chọn ra các biến cần thiết
nv1 <- nv %>% select(enrollee_id,city,gender,education_level,major_discipline,experience,training_hours)
# Lệnh rút ra các quan sát là nam
nam <- nv1 %>% filter(gender == "Male")
# Lệnh rút ra các quan sát chỉ là trình độ đại học
đh <- nv1 %>% filter(education_level == "Graduate")
# Lệnh rút ra các quan sát trên 10 năm kinh nghiệm
kn10 <- nv1 %>% filter(experience >=10 | experience == ">20")
# Lệnh rút ra các quan sát trên 100 giờ đào tạo
h100 <- nv1 %>% filter(training_hours >= 100)
# Lệnh rút ra các quan sát có trình độ cấp 3 và có trên 5 năm kinh nghiệm
e3e5 <- nv1 %>%
filter( education_level == "High School") %>%
filter(experience >=5 | experience == ">20")
Sau đây ta sẽ xem thử lượng quan sát của các bộ dữ liệu và xem qua các dữ liệu
# Lượng quan sát của "nam"
dim(nam)
## [1] 1460 7
# Xem 3 dữ liệu đầu của "nam"
head(nam,3)
## enrollee_id city gender education_level major_discipline experience
## 1 32403 city_41 Male Graduate STEM 9
## 2 31806 city_21 Male High School <1
## 3 27385 city_13 Male Masters STEM 11
## training_hours
## 1 21
## 2 15
## 3 39
# Lượng quan sát của "đh"
dim(đh)
## [1] 1269 7
# Xem 3 dữ liệu đầu của "đh"
head(đh,3)
## enrollee_id city gender education_level major_discipline experience
## 1 32403 city_41 Male Graduate STEM 9
## 2 9858 city_103 Female Graduate STEM 5
## 3 27724 city_103 Male Graduate STEM >20
## training_hours
## 1 21
## 2 98
## 3 72
# Lượng quan sát của "kn10"
dim(kn10)
## [1] 1994 7
# Xem 3 dữ liệu đầu của "kn10"
head(kn10,3)
## enrollee_id city gender education_level major_discipline experience
## 1 32403 city_41 Male Graduate STEM 9
## 2 9858 city_103 Female Graduate STEM 5
## 3 27385 city_13 Male Masters STEM 11
## training_hours
## 1 21
## 2 98
## 3 39
# Lượng quan sát của "h100"
dim(h100)
## [1] 434 7
# Xem 3 dữ liệu đầu của "h100"
head(h100, 3)
## enrollee_id city gender education_level major_discipline experience
## 1 10856 city_103 Male Masters Other >20
## 2 24372 city_98 Masters STEM 4
## 3 24914 city_21 Graduate STEM 13
## training_hours
## 1 196
## 2 134
## 3 125
# Lượng dữ liệu của "e3e5"
dim(e3e5)
## [1] 88 7
# Xem 3 dữ liệu của "e3e5"
Ta sẽ tạo ra 1 biến mới là tiền thưởng cuối năm của các nhân viên với công thức như sau \(thưởng = (20*số giờ đào tạo)*(1+ chỉ số phát triển)\)
# Lệnh tạo ra biến mới và ghép vào nv
nv <- nv %>% mutate(Thưởng = (20*training_hours)*(1+ city_development_index))
# Xem 3 dữ liệu đầu của "Thưởng"
head(nv$Thưởng)
## [1] 767.34 3763.20 487.20 1425.06 2764.80 455.76