1.1. Thong tin co ban ve du lieu
# Số dòng và số cột
dim(Data)
## [1] 100000 20
# Tên các biến
names(Data)
## [1] "Employee_ID" "Department"
## [3] "Gender" "Age"
## [5] "Job_Title" "Hire_Date"
## [7] "Years_At_Company" "Education_Level"
## [9] "Performance_Score" "Monthly_Salary"
## [11] "Work_Hours_Per_Week" "Projects_Handled"
## [13] "Overtime_Hours" "Sick_Days"
## [15] "Remote_Work_Frequency" "Team_Size"
## [17] "Training_Hours" "Promotions"
## [19] "Employee_Satisfaction_Score" "Resigned"
# Cấu trúc dữ liệu
str(Data)
## tibble [100,000 × 20] (S3: tbl_df/tbl/data.frame)
## $ Employee_ID : num [1:100000] 1 2 3 4 5 6 7 8 9 10 ...
## $ Department : chr [1:100000] "IT" "Finance" "Finance" "Customer Support" ...
## $ Gender : chr [1:100000] "Male" "Male" "Male" "Female" ...
## $ Age : num [1:100000] 55 29 55 48 36 43 37 55 55 45 ...
## $ Job_Title : chr [1:100000] "Specialist" "Developer" "Specialist" "Analyst" ...
## $ Hire_Date : Date[1:100000], format: "2022-01-19" "2024-04-18" ...
## $ Years_At_Company : num [1:100000] 2 0 8 7 3 8 1 9 1 7 ...
## $ Education_Level : chr [1:100000] "High School" "High School" "High School" "Bachelor" ...
## $ Performance_Score : num [1:100000] 5 5 3 2 2 3 5 2 2 1 ...
## $ Monthly_Salary : num [1:100000] 6750 7500 5850 4800 4800 7800 5250 7200 4200 6050 ...
## $ Work_Hours_Per_Week : num [1:100000] 33 34 37 52 38 46 55 42 51 41 ...
## $ Projects_Handled : num [1:100000] 32 34 27 10 11 31 20 46 23 33 ...
## $ Overtime_Hours : num [1:100000] 22 13 6 28 29 8 29 7 21 2 ...
## $ Sick_Days : num [1:100000] 2 14 3 12 13 0 2 8 14 6 ...
## $ Remote_Work_Frequency : num [1:100000] 0 100 50 100 100 100 0 100 0 75 ...
## $ Team_Size : num [1:100000] 14 12 10 10 15 15 16 7 1 4 ...
## $ Training_Hours : num [1:100000] 66 61 1 0 9 95 27 64 0 53 ...
## $ Promotions : num [1:100000] 0 2 0 1 1 0 0 0 1 2 ...
## $ Employee_Satisfaction_Score: num [1:100000] 2.63 1.72 3.17 1.86 1.25 2.77 4.46 2.09 1.44 2.93 ...
## $ Resigned : logi [1:100000] FALSE FALSE FALSE FALSE FALSE FALSE ...
# Tổng quan thống kê nhanh
summary(Data)
## Employee_ID Department Gender Age
## Min. : 1 Length:100000 Length:100000 Min. :22.00
## 1st Qu.: 25001 Class :character Class :character 1st Qu.:31.00
## Median : 50001 Mode :character Mode :character Median :41.00
## Mean : 50001 Mean :41.03
## 3rd Qu.: 75000 3rd Qu.:51.00
## Max. :100000 Max. :60.00
## Job_Title Hire_Date Years_At_Company Education_Level
## Length:100000 Min. :2014-09-07 Min. : 0.000 Length:100000
## Class :character 1st Qu.:2017-03-20 1st Qu.: 2.000 Class :character
## Mode :character Median :2019-09-21 Median : 4.000 Mode :character
## Mean :2019-09-14 Mean : 4.476
## 3rd Qu.:2022-03-14 3rd Qu.: 7.000
## Max. :2024-09-03 Max. :10.000
## Performance_Score Monthly_Salary Work_Hours_Per_Week Projects_Handled
## Min. :1.000 Min. :3850 Min. :30.00 Min. : 0.00
## 1st Qu.:2.000 1st Qu.:5250 1st Qu.:37.00 1st Qu.:12.00
## Median :3.000 Median :6500 Median :45.00 Median :24.00
## Mean :2.995 Mean :6403 Mean :44.96 Mean :24.43
## 3rd Qu.:4.000 3rd Qu.:7500 3rd Qu.:53.00 3rd Qu.:37.00
## Max. :5.000 Max. :9000 Max. :60.00 Max. :49.00
## Overtime_Hours Sick_Days Remote_Work_Frequency Team_Size
## Min. : 0.00 Min. : 0.000 Min. : 0.00 Min. : 1.00
## 1st Qu.: 7.00 1st Qu.: 3.000 1st Qu.: 25.00 1st Qu.: 5.00
## Median :15.00 Median : 7.000 Median : 50.00 Median :10.00
## Mean :14.51 Mean : 7.009 Mean : 50.09 Mean :10.01
## 3rd Qu.:22.00 3rd Qu.:11.000 3rd Qu.: 75.00 3rd Qu.:15.00
## Max. :29.00 Max. :14.000 Max. :100.00 Max. :19.00
## Training_Hours Promotions Employee_Satisfaction_Score Resigned
## Min. : 0.00 Min. :0.0000 Min. :1.000 Mode :logical
## 1st Qu.:25.00 1st Qu.:0.0000 1st Qu.:2.010 FALSE:89990
## Median :49.00 Median :1.0000 Median :3.000 TRUE :10010
## Mean :49.51 Mean :0.9997 Mean :2.999
## 3rd Qu.:75.00 3rd Qu.:2.0000 3rd Qu.:3.990
## Max. :99.00 Max. :2.0000 Max. :5.000
1.2. Phan loai bien theo kieu du lieu
# Đếm số biến định lượng
num_vars <- sapply(Data, is.numeric)
sum(num_vars)
## [1] 14
# Đếm số biến định tính
cat_vars <- sapply(Data, function(x) is.character(x) | is.factor(x))
sum(cat_vars)
## [1] 4
# Đếm số biến thời gian
date_vars <- sapply(Data, function(x) inherits(x, "Date") | inherits(x, "POSIXct"))
sum(date_vars)
## [1] 1
# Liệt kê tên biến theo loại
names(Data)[num_vars] # Định lượng
## [1] "Employee_ID" "Age"
## [3] "Years_At_Company" "Performance_Score"
## [5] "Monthly_Salary" "Work_Hours_Per_Week"
## [7] "Projects_Handled" "Overtime_Hours"
## [9] "Sick_Days" "Remote_Work_Frequency"
## [11] "Team_Size" "Training_Hours"
## [13] "Promotions" "Employee_Satisfaction_Score"
names(Data)[cat_vars] # Định tính
## [1] "Department" "Gender" "Job_Title" "Education_Level"
names(Data)[date_vars] # Kiểu thời gian
## [1] "Hire_Date"
Nhận xét: Bộ dữ liệu Data gồm 100.000 quan sát và 20 biến(Department, Gender, Job_Title, Education_Level, Age, Years_At_Company, Performance_Score, Monthly_Salary, Work_Hours_Per_Week, Projects_Handled, Overtime_Hours, Sick_Days, Remote_Work_Frequency, Team_Size, Training_Hours, Promotions, Resigned), chứa thông tin về nhân viên của một công ty.Trong đó gồm: 14 biến định lượng, 4 biến định tính và 1 biến thời gian.
1.3. Nhung thong tin lien quan den bo du lieu gom: so bien, so quan sat, so quan sat trung lap, so quan sat bi thieu.
# Tắt hiển thị dạng số khoa học
options(scipen = 999)
# Tính các thông tin cơ bản
so_bien <- ncol(Data)
so_quan_sat <- nrow(Data)
so_trung_lap <- sum(duplicated(Data))
so_thieu <- sum(is.na(Data))
ty_le_thieu <- round(so_thieu / (so_bien * so_quan_sat) * 100, 2)
# Tổng hợp kết quả thành bảng
thong_tin_co_ban <- data.frame(
Chi_tieu = c(
"Số biến (cột)",
"Số quan sát (dòng)",
"Số quan sát trùng lặp",
"Số quan sát bị thiếu",
"Tỷ lệ quan sát bị thiếu (%)"
),
Gia_tri = c(so_bien, so_quan_sat, so_trung_lap, so_thieu, ty_le_thieu)
)
print(thong_tin_co_ban)
## Chi_tieu Gia_tri
## 1 Số biến (cột) 20
## 2 Số quan sát (dòng) 100000
## 3 Số quan sát trùng lặp 0
## 4 Số quan sát bị thiếu 0
## 5 Tỷ lệ quan sát bị thiếu (%) 0
Nhận xét: Kết quả cho thấy không có quan sát trùng lặp và không có giá trị bị thiếu, tỷ lệ thiếu bằng 0%. Điều này chứng tỏ dữ liệu đã được làm sạch tốt, đảm bảo tính toàn vẹn và độ tin cậy cao, thuận lợi cho việc phân tích mô tả, khám phá và mô hình hóa ở các bước tiếp theo.
1.4. Y nghia cua cac bien
# Tóm tắt ý nghĩa cơ bản (cấu trúc dữ liệu)
library(dplyr)
thong_tin_bien <- Data %>%
summarise(across(everything(), list(
Kieu_du_lieu = ~class(.x)[1],
So_thieu = ~sum(is.na(.x)),
So_gia_tri_phan_biet = ~n_distinct(.x)
), .names = "{.col}_{.fn}"))
# Chuyển từ dạng wide sang long để dễ đọc
thong_tin_bien_long <- data.frame(
Bien = names(Data),
Kieu_du_lieu = as.character(thong_tin_bien[1, seq(1, ncol(thong_tin_bien), 3)]),
So_thieu = as.numeric(thong_tin_bien[1, seq(2, ncol(thong_tin_bien), 3)]),
So_gia_tri_phan_biet = as.numeric(thong_tin_bien[1, seq(3, ncol(thong_tin_bien), 3)])
)
print(thong_tin_bien_long)
## Bien Kieu_du_lieu So_thieu So_gia_tri_phan_biet
## 1 Employee_ID numeric 0 100000
## 2 Department character 0 9
## 3 Gender character 0 3
## 4 Age numeric 0 39
## 5 Job_Title character 0 7
## 6 Hire_Date Date 0 3650
## 7 Years_At_Company numeric 0 11
## 8 Education_Level character 0 4
## 9 Performance_Score numeric 0 5
## 10 Monthly_Salary numeric 0 28
## 11 Work_Hours_Per_Week numeric 0 31
## 12 Projects_Handled numeric 0 50
## 13 Overtime_Hours numeric 0 30
## 14 Sick_Days numeric 0 15
## 15 Remote_Work_Frequency numeric 0 5
## 16 Team_Size numeric 0 19
## 17 Training_Hours numeric 0 100
## 18 Promotions numeric 0 3
## 19 Employee_Satisfaction_Score numeric 0 401
## 20 Resigned logical 0 2
# Giải thích ý nghĩa các biến trong bộ dữ liệu Data
variable_meaning <- data.frame(
Variable = c(
"Employee_ID",
"Department",
"Gender",
"Age",
"Job_Title",
"Hire_Date",
"Years_At_Company",
"Education_Level",
"Performance_Score",
"Monthly_Salary",
"Work_Hours_Per_Week",
"Projects_Handled",
"Overtime_Hours",
"Sick_Days",
"Remote_Work_Frequency",
"Team_Size",
"Training_Hours",
"Promotions",
"Employee_Satisfaction_Score",
"Resigned"
),
Meaning = c(
"Mã định danh duy nhất của mỗi nhân viên",
"Phòng ban mà nhân viên đang làm việc (như IT, HR, Sales,...)",
"Giới tính của nhân viên (Nam/Nữ)",
"Tuổi của nhân viên (tính bằng năm)",
"Chức danh công việc hiện tại của nhân viên",
"Ngày bắt đầu làm việc tại công ty",
"Số năm nhân viên đã làm việc tại công ty",
"Trình độ học vấn cao nhất của nhân viên (Cao đẳng, Đại học, Sau đại học,...)",
"Điểm đánh giá hiệu suất làm việc (từ 1 đến 5)",
"Mức lương hàng tháng của nhân viên",
"Số giờ làm việc trung bình mỗi tuần của nhân viên",
"Số dự án mà nhân viên đã hoặc đang phụ trách",
"Số giờ làm thêm (overtime) trung bình mỗi tháng",
"Số ngày nghỉ ốm của nhân viên trong năm",
"Tần suất làm việc từ xa",
"Quy mô nhóm hoặc đội mà nhân viên tham gia",
"Tổng số giờ tham gia các khóa đào tạo",
"Số lần được thăng chức của nhân viên",
"Mức độ hài lòng của nhân viên (từ 0 đến 5)",
"Trạng thái nghỉ việc của nhân viên (TRUE = đã nghỉ, FALSE = còn làm)"
),
stringsAsFactors = FALSE
)
# Hiển thị bảng đẹp
library(knitr)
kable(variable_meaning, booktabs = TRUE, caption = "Giải thích ý nghĩa các biến trong bộ dữ liệu nhân sự")
| Variable | Meaning |
|---|---|
| Employee_ID | Mã định danh duy nhất của mỗi nhân viên |
| Department | Phòng ban mà nhân viên đang làm việc (như IT, HR, Sales,…) |
| Gender | Giới tính của nhân viên (Nam/Nữ) |
| Age | Tuổi của nhân viên (tính bằng năm) |
| Job_Title | Chức danh công việc hiện tại của nhân viên |
| Hire_Date | Ngày bắt đầu làm việc tại công ty |
| Years_At_Company | Số năm nhân viên đã làm việc tại công ty |
| Education_Level | Trình độ học vấn cao nhất của nhân viên (Cao đẳng, Đại học, Sau đại học,…) |
| Performance_Score | Điểm đánh giá hiệu suất làm việc (từ 1 đến 5) |
| Monthly_Salary | Mức lương hàng tháng của nhân viên |
| Work_Hours_Per_Week | Số giờ làm việc trung bình mỗi tuần của nhân viên |
| Projects_Handled | Số dự án mà nhân viên đã hoặc đang phụ trách |
| Overtime_Hours | Số giờ làm thêm (overtime) trung bình mỗi tháng |
| Sick_Days | Số ngày nghỉ ốm của nhân viên trong năm |
| Remote_Work_Frequency | Tần suất làm việc từ xa |
| Team_Size | Quy mô nhóm hoặc đội mà nhân viên tham gia |
| Training_Hours | Tổng số giờ tham gia các khóa đào tạo |
| Promotions | Số lần được thăng chức của nhân viên |
| Employee_Satisfaction_Score | Mức độ hài lòng của nhân viên (từ 0 đến 5) |
| Resigned | Trạng thái nghỉ việc của nhân viên (TRUE = đã nghỉ, FALSE = còn làm) |
2.1. Phan to theo gioi tinh va nhom tuoi
# Tạo biến nhóm tuổi (phân tổ theo khoảng)
Data <- Data %>%
mutate(Nhom_tuoi = cut(Age,
breaks = c(20, 30, 40, 50, 60),
labels = c("20-29", "30-39", "40-49", "50-59"),
right = FALSE)) # khoảng trái đóng, phải mở
# Phân tổ theo giới tính và nhóm tuổi
bang_phan_to <- Data %>%
group_by(Gender, Nhom_tuoi) %>%
summarise(
So_luong = n(),
Luong_TB = mean(as.numeric(Monthly_Salary), na.rm = TRUE),
Diem_HL_TB = mean(as.numeric(Employee_Satisfaction_Score), na.rm = TRUE)
) %>%
arrange(Gender, Nhom_tuoi)
## `summarise()` has grouped output by 'Gender'. You can override using the
## `.groups` argument.
# In kết quả ra màn hình
print(bang_phan_to)
## # A tibble: 15 × 5
## # Groups: Gender [3]
## Gender Nhom_tuoi So_luong Luong_TB Diem_HL_TB
## <chr> <fct> <int> <dbl> <dbl>
## 1 Female 20-29 9722 6403. 3.00
## 2 Female 30-39 12403 6400. 3.01
## 3 Female 40-49 12333 6414. 3.00
## 4 Female 50-59 12331 6400. 3.00
## 5 Female <NA> 1212 6434. 3.06
## 6 Male 20-29 9946 6398. 2.99
## 7 Male 30-39 12056 6399. 3.00
## 8 Male 40-49 12357 6394. 2.99
## 9 Male 50-59 12462 6404. 2.99
## 10 Male <NA> 1210 6469. 3.03
## 11 Other 20-29 824 6392. 2.94
## 12 Other 30-39 1006 6414. 3.00
## 13 Other 40-49 1020 6427. 3.00
## 14 Other 50-59 1005 6423. 3.00
## 15 Other <NA> 113 6405. 3.10
2.2. Phan to nam, 30-40 tuoi, bo phan IT, tang ca tren 10 tieng
# Lọc nhân viên nam trong bộ phận IT, độ tuổi 30–40 và tăng ca >10 tiếng
df_filtered <- Data %>%
filter(
between(Age, 30, 40),
Gender == "Male",
Department == "IT",
Overtime_Hours > 10
)
print(df_filtered)
## # A tibble: 972 × 21
## Employee_ID Department Gender Age Job_Title Hire_Date Years_At_Company
## <dbl> <chr> <chr> <dbl> <chr> <date> <dbl>
## 1 7 IT Male 37 Technician 2023-08-28 1
## 2 103 IT Male 33 Consultant 2020-01-07 4
## 3 118 IT Male 38 Consultant 2016-06-10 8
## 4 252 IT Male 35 Consultant 2017-10-29 6
## 5 455 IT Male 33 Developer 2019-08-10 5
## 6 465 IT Male 40 Specialist 2018-05-30 6
## 7 538 IT Male 35 Manager 2022-04-07 2
## 8 578 IT Male 40 Specialist 2021-11-12 2
## 9 643 IT Male 37 Manager 2015-07-09 9
## 10 688 IT Male 32 Consultant 2016-05-29 8
## # ℹ 962 more rows
## # ℹ 14 more variables: Education_Level <chr>, Performance_Score <dbl>,
## # Monthly_Salary <dbl>, Work_Hours_Per_Week <dbl>, Projects_Handled <dbl>,
## # Overtime_Hours <dbl>, Sick_Days <dbl>, Remote_Work_Frequency <dbl>,
## # Team_Size <dbl>, Training_Hours <dbl>, Promotions <dbl>,
## # Employee_Satisfaction_Score <dbl>, Resigned <lgl>, Nhom_tuoi <fct>
2.3. Phan to chuc danh nha phat trien, trinh do thac si, diem hieu suat duoi 2, so ngay om tren 5
# Lọc dữ liệu theo tiêu chí học vấn, hiệu suất và số ngày ốm
df_filtered2 <- Data %>%
filter(
Job_Title == "Developer",
Education_Level == "Master",
Performance_Score < 2,
Sick_Days > 5
)
print(df_filtered2)
## # A tibble: 252 × 21
## Employee_ID Department Gender Age Job_Title Hire_Date Years_At_Company
## <dbl> <chr> <chr> <dbl> <chr> <date> <dbl>
## 1 338 Operations Female 55 Developer 2017-02-07 7
## 2 670 Legal Male 47 Developer 2019-04-29 5
## 3 811 Sales Female 24 Developer 2018-06-20 6
## 4 986 IT Female 56 Developer 2020-07-31 4
## 5 1774 Finance Male 45 Developer 2022-03-27 2
## 6 2191 Legal Female 39 Developer 2016-05-06 8
## 7 2437 IT Female 36 Developer 2014-12-23 9
## 8 2783 Finance Female 43 Developer 2016-03-28 8
## 9 2847 Legal Other 53 Developer 2017-09-13 6
## 10 3119 HR Female 58 Developer 2015-09-17 8
## # ℹ 242 more rows
## # ℹ 14 more variables: Education_Level <chr>, Performance_Score <dbl>,
## # Monthly_Salary <dbl>, Work_Hours_Per_Week <dbl>, Projects_Handled <dbl>,
## # Overtime_Hours <dbl>, Sick_Days <dbl>, Remote_Work_Frequency <dbl>,
## # Team_Size <dbl>, Training_Hours <dbl>, Promotions <dbl>,
## # Employee_Satisfaction_Score <dbl>, Resigned <lgl>, Nhom_tuoi <fct>
3.1. Phan tich bien trinh do hoc van
df_summary <- Data %>%
group_by(Education_Level) %>%
summarise(
Min_Training = min(Training_Hours, na.rm = TRUE),
Max_Training = max(Training_Hours, na.rm = TRUE),
Mean_Training = mean(Training_Hours, na.rm = TRUE),
SD_Training = sd(Training_Hours, na.rm = TRUE),
.groups = "drop"
)
print(df_summary)
## # A tibble: 4 × 5
## Education_Level Min_Training Max_Training Mean_Training SD_Training
## <chr> <dbl> <dbl> <dbl> <dbl>
## 1 Bachelor 0 99 49.6 28.9
## 2 High School 0 99 49.5 28.9
## 3 Master 0 99 49.3 28.8
## 4 PhD 0 99 49.5 28.7
Nhận xét: Mức Training_Hours (giờ đào tạo) dao động từ 0 đến 99 giờ ở tất cả các nhóm trình độ học vấn. Trung bình số giờ đào tạo gần như tương đương nhau giữa các nhóm — dao động quanh 49 giờ. Độ lệch chuẩn (SD) khoảng 28.7–28.9, cho thấy mức độ phân tán khá lớn, tức là một số nhân viên được đào tạo nhiều trong khi một số khác rất ít.
**3.2. Phan tich bien muc do hai long cua nhan vien
# Phân tích mô tả cho biến Employee_Satisfaction_Score
# Thống kê cơ bản
summary(Data$Employee_Satisfaction_Score)
## Min. 1st Qu. Median Mean 3rd Qu. Max.
## 1.000 2.010 3.000 2.999 3.990 5.000
# Tính thêm các chỉ số mô tả chi tiết hơn
library(dplyr)
mo_ta_satisfaction <- Data %>%
summarise(
So_quan_sat = n(),
Gia_tri_thap_nhat = min(Employee_Satisfaction_Score, na.rm = TRUE),
Q1 = quantile(Employee_Satisfaction_Score, 0.25, na.rm = TRUE),
Trung_vi = median(Employee_Satisfaction_Score, na.rm = TRUE),
Trung_binh = mean(Employee_Satisfaction_Score, na.rm = TRUE),
Q3 = quantile(Employee_Satisfaction_Score, 0.75, na.rm = TRUE),
Gia_tri_cao_nhat = max(Employee_Satisfaction_Score, na.rm = TRUE),
Do_lech_chuan = sd(Employee_Satisfaction_Score, na.rm = TRUE)
)
print(mo_ta_satisfaction)
## # A tibble: 1 × 8
## So_quan_sat Gia_tri_thap_nhat Q1 Trung_vi Trung_binh Q3 Gia_tri_cao_nhat
## <int> <dbl> <dbl> <dbl> <dbl> <dbl> <dbl>
## 1 100000 1 2.01 3 3.00 3.99 5
## # ℹ 1 more variable: Do_lech_chuan <dbl>
# Trực quan hóa bằng biểu đồ
hist(
Data$Employee_Satisfaction_Score,
main = "Phân bố điểm hài lòng nhân viên",
xlab = "Employee Satisfaction Score",
col = "skyblue", border = "white"
)
boxplot(
Data$Employee_Satisfaction_Score,
main = "Biểu đồ Boxplot - Employee Satisfaction Score",
col = "lightgreen",
horizontal = TRUE
)
Nhận xét: Điểm hài lòng dao động từ 1 đến 5, cho thấy thang đo Likert 5 mức (từ rất không hài lòng → rất hài lòng). Trung bình ≈ 3, trung vị ≈ 3, nên phân phối dữ liệu khá cân đối quanh mức trung bình. Độ lệch chuẩn ≈ 1.15, thể hiện mức độ chênh lệch vừa phải — có sự khác biệt nhất định trong cảm nhận hài lòng giữa các nhân viên. Biểu đồ histogram cho thấy đa số nhân viên có điểm hài lòng trung bình – khá, trong khi tỷ lệ nhân viên cực kỳ hài lòng hoặc rất không hài lòng là ít hơn. Không có dấu hiệu ngoại lai đáng kể (theo boxplot).