1. tinytex::tlmgr_update()
2. tinytex::tlmgr_install(c("xetex", "xunicode", "xltxtra", "fontspec"))

Chương 1: Trình bày về bộ dữ liệu về hiệu suất và năng suất của nhân viên

Bộ dữ liệu “Human Resources Dataset” được thu thập từ nền tảng Kaggle, là một tập dữ liệu công khai được xây dựng nhằm phục vụ cho mục đích nghiên cứu và thực hành phân tích dữ liệu trong lĩnh vực quản trị nhân sự. Dữ liệu mô tả đặc điểm chi tiết của đội ngũ nhân viên trong một tổ chức giả định, bao gồm các thông tin như độ tuổi, giới tính, phòng ban, mức lương, số năm làm việc, số giờ đào tạo, số dự án đảm nhiệm, giờ làm thêm và điểm hài lòng trong công việc.
Mỗi dòng dữ liệu đại diện cho một nhân viên, được ghi nhận thông qua các biến định lượng và định tính.

I. GIỚI THIỆU VỀ BỘ DỮ LIỆU

1.1. Đọc dữ liệu

1. Data <- read_excel("D:/NNLT/Data.xlsx")

Nhận xét: Đọc dữ liệu từ file Excel có tên Data.xlsx trong thư mục D:/NNLT vào R và lưu dữ liệu vào biến Data.

1.2. Xem qua dữ liệu

1. head(Data)

Nhận xét: hàm head() dùng để xem trước 6 dòng đầu tiên của bộ dữ liệu.
### 1.3. Xem qua các dòng cuối của dữ liệu

1. tail(Data)

Nhận xét: hàm tail(Data) dùng để xem trước 6 dòng cuối cùng của bộ dữ liệu.

1.4. Kiểm tra kích thước dữ liệu

1. dim(Data)
## [1] 100000     20

Nhận xét: Dữ liệu thô có 100000 quan sát và 20 biến.

1.5. Kiểm tra tên biến

1. 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"

Nhận xét: Lệnh names(Data) giúp liệt kê toàn bộ 20 biến trong bộ dữ liệu.

1.6. Giải thích ý nghĩa các biến trong bộ dữ liệu

1. variable_meaning <- data.frame(
2.   Variable = c(
3.     "Employee_ID", "Department", "Gender", "Age", "Job_Title", "Hire_Date",
4.     "Years_At_Company", "Education_Level", "Performance_Score", "Monthly_Salary",
5.     "Work_Hours_Per_Week", "Projects_Handled", "Overtime_Hours", "Sick_Days",
6.     "Remote_Work_Frequency", "Team_Size", "Training_Hours", "Promotions",
7.     "Employee_Satisfaction_Score", "Resigned"
8.   ),
9.   Meaning = c(
10.     "Mã định danh của nhân viên", "Phòng ban làm việc", "Giới tính", "Tuổi",
11.     "Chức danh công việc", "Ngày bắt đầu làm việc", "Số năm làm việc tại công ty",
12.     "Trình độ học vấn", "Điểm hiệu suất làm việc", "Lương hàng tháng",
13.     "Số giờ làm việc mỗi tuần", "Số dự án đã tham gia", "Giờ làm thêm trung bình",
14.     "Số ngày nghỉ ốm", "Tần suất làm việc từ xa", "Quy mô nhóm", "Giờ đào tạo",
15.     "Số lần thăng chức", "Mức độ hài lòng (0–5)", "Trạng thái nghỉ việc (TRUE/FALSE)"
16.   ),
17.   stringsAsFactors = FALSE
18. )
19. variable_meaning %>%
20.   kable(caption = "Giải thích ý nghĩa các biến trong bộ dữ liệu nhân sự") %>%
21.   kable_styling(full_width = FALSE, bootstrap_options = c("striped", "hover", "bordered"))
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 của nhân viên
Department Phòng ban làm việc
Gender Giới tính
Age Tuổi
Job_Title Chức danh công việc
Hire_Date Ngày bắt đầu làm việc
Years_At_Company Số năm làm việc tại công ty
Education_Level Trình độ học vấn
Performance_Score Điểm hiệu suất làm việc
Monthly_Salary Lương hàng tháng
Work_Hours_Per_Week Số giờ làm việc mỗi tuần
Projects_Handled Số dự án đã tham gia
Overtime_Hours Giờ làm thêm trung bình
Sick_Days Số ngày nghỉ ốm
Remote_Work_Frequency Tần suất làm việc từ xa
Team_Size Quy mô nhóm
Training_Hours Giờ đào tạo
Promotions Số lần thăng chức
Employee_Satisfaction_Score Mức độ hài lòng (0–5)
Resigned Trạng thái nghỉ việc (TRUE/FALSE)

Nhận xét: Hàm data.frame() được dùng để ghép tên biến và nội dung giải thích thành hai cột song song, sau đó kable() kết hợp với kableExtra giúp hiển thị bảng rõ ràng. Ví dụ biến Employee_ID chính là Mã định danh của nhân viên.

1.7. Xem kiểu dữ liệu của từng cột

1. 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                  : chr [1:100000] "2022-01-19 08:03:05.556036" "2024-04-18 08:03:05.556036" "2015-10-26 08:03:05.556036" "2016-10-22 08:03:05.556036" ...
##  $ 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             : chr [1:100000] "6750.0" "7500.0" "5850.0" "4800.0" ...
##  $ 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: chr [1:100000] "2.63" "1.72" "3.17" "1.86" ...
##  $ Resigned                   : logi [1:100000] FALSE FALSE FALSE FALSE FALSE FALSE ...

Nhận xét: Lệnh str(Data) dùng để kiểm tra cấu trúc tổng thể của bảng dữ liệu. Kết quả cho thấy Data là một tibble gồm 100.000 dòng và 20 cột, mỗi cột đại diện cho một biến như mã nhân viên, phòng ban, tuổi, lương, mức độ hài lòng,… Các biến có kiểu dữ liệu phù hợp gồm numeric, character và logical.

1.8. Kiểm tra dữ liệu bị thiếu

1. colSums(is.na(Data))
##                 Employee_ID                  Department 
##                           0                           0 
##                      Gender                         Age 
##                           0                           0 
##                   Job_Title                   Hire_Date 
##                           0                           0 
##            Years_At_Company             Education_Level 
##                           0                           0 
##           Performance_Score              Monthly_Salary 
##                           0                           0 
##         Work_Hours_Per_Week            Projects_Handled 
##                           0                           0 
##              Overtime_Hours                   Sick_Days 
##                           0                           0 
##       Remote_Work_Frequency                   Team_Size 
##                           0                           0 
##              Training_Hours                  Promotions 
##                           0                           0 
## Employee_Satisfaction_Score                    Resigned 
##                           0                           0

Nhận xét: Lệnh colSums(is.na(Data)) được sử dụng để kiểm tra số lượng giá trị bị thiếu (NA) trong từng cột của bộ dữ liệu. Kết quả chạy ra cho thấy không có giá trị bị thiếu trong bộ dữ liệu.

1.9. Kiểm tra dữ liệu trùng lặp

1. sum(duplicated(Data))
## [1] 0

Nhận xét: Lệnh sum(duplicated(Data)) được sử dụng để kiểm tra số lượng bản ghi trùng lặp trong toàn bộ bộ dữ liệu. Kết quả trả về là 0, cho thấy không có bất kỳ giá trị nào bị trùng lặp trong bộ dữ liệu.

1.10.Thống kê tổng quan nhanh

1. 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      Length:100000      Min.   : 0.000   Length:100000     
##  Class :character   Class :character   1st Qu.: 2.000   Class :character  
##  Mode  :character   Mode  :character   Median : 4.000   Mode  :character  
##                                        Mean   : 4.476                     
##                                        3rd Qu.: 7.000                     
##                                        Max.   :10.000                     
##  Performance_Score Monthly_Salary     Work_Hours_Per_Week Projects_Handled
##  Min.   :1.000     Length:100000      Min.   :30.00       Min.   : 0.00   
##  1st Qu.:2.000     Class :character   1st Qu.:37.00       1st Qu.:12.00   
##  Median :3.000     Mode  :character   Median :45.00       Median :24.00   
##  Mean   :2.995                        Mean   :44.96       Mean   :24.43   
##  3rd Qu.:4.000                        3rd Qu.:53.00       3rd Qu.:37.00   
##  Max.   :5.000                        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   Length:100000               Mode :logical  
##  1st Qu.:25.00   1st Qu.:0.0000   Class :character            FALSE:89990    
##  Median :49.00   Median :1.0000   Mode  :character            TRUE :10010    
##  Mean   :49.51   Mean   :0.9997                                              
##  3rd Qu.:75.00   3rd Qu.:2.0000                                              
##  Max.   :99.00   Max.   :2.0000

Nhận xét: Lệnh summary(Data) dùng để tóm tắt thống kê mô tả cho toàn bộ dữ liệu. Kết quả cho thấy:
Với các biến số như Age, Years_At_Company, Performance_Score, R hiển thị các giá trị nhỏ nhất, lớn nhất, trung vị, trung bình và tứ phân vị, giúp hiểu phân bố dữ liệu.
Các biến chuỗi như Department, Job_Title, Education_Level chỉ hiển thị độ dài và kiểu dữ liệu, cho biết đây là biến định tính.
Biến logic cho thấy số lượng nhân viên còn làm (FALSE = 89.990) và đã nghỉ việc (TRUE = 10.010).

1.11. Phân loại biến theo kiểu dữ liệu

1. Data$Monthly_Salary <- as.numeric(Data$Monthly_Salary)
2. Data$Employee_Satisfaction_Score <- as.numeric(Data$Employee_Satisfaction_Score)
3. str(Data$Monthly_Salary)
##  num [1:100000] 6750 7500 5850 4800 4800 7800 5250 7200 4200 6050 ...
1. str(Data$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 ...
1. Data$Hire_Date <- as.Date(Data$Hire_Date)
2. num_vars <- sapply(Data, is.numeric)
3. sum(num_vars)
## [1] 14
1. cat_vars <- sapply(Data, function(x) is.character(x) | is.factor(x))
2. sum(cat_vars)
## [1] 4
1. date_vars <- sapply(Data, function(x) inherits(x, "Date") | inherits(x, "POSIXct"))
2. sum(date_vars)
## [1] 1
1. names(Data)[num_vars]    
##  [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"
1. names(Data)[cat_vars]  
## [1] "Department"      "Gender"          "Job_Title"       "Education_Level"
1. names(Data)[date_vars]  
## [1] "Hire_Date"

Nhận xét: Đầu tiên, hai biến Monthly_Salary và Employee_Satisfaction_Score được chuyển từ kiểu ký tự sang kiểu số bằng hàm as.numeric(). Tiếp theo, Hire_Date được đổi sang kiểu ngày tháng (Date) bằng hàm as.Date() để có thể xử lý các phép toán về thời gian.
Sau đó, dữ liệu được phân loại theo kiểu biến:
num_vars: chứa 14 biến định lượng.
cat_vars: chứa 4 biến định tính.
date_vars: chứa 1 biến thời gian.

II. XỬ LÝ DỮ LIỆU THÔ VÀ MÃ HÓA DỮ LIỆU

2.1. Chuyển kiểu dữ liệu

1. Data$Department <- as.factor(Data$Department)
2. Data$Gender <- as.factor(Data$Gender)

Nhận xét: chuyển đổi kiểu dữ liệu các biến Department và Gender từ kiểu character sang kiểu factor giúp R nhận diện đây là các biến định tính.

2.2. Chuẩn hóa chữ viết trong các biến text

1. Data$Job_Title <- stringr::str_to_title(Data$Job_Title)
2. Data$Department <- stringr::str_replace_all(Data$Department, "Dept\\.|Department", "")

Nhận xét: Chuyển giá trị trong cột Job_Title thành chữ hoa đầu mỗi từ, giúp định dạng đồng nhất và dễ đọc. Loại bỏ các từ thừa như “Dept.” hoặc “Department” trong cột Department, giúp làm sạch dữ liệu, tránh trùng lặp.

2.3. Mã hóa biến định tính

1. Data$Gender_Code <- ifelse(Data$Gender == "Male", 1, ifelse(Data$Gender == "Female", 0, 2))

Nhận xét: Tạo ra một biến mới tên là Gender_Code để mã hóa giới tính dưới dạng số thuận tiện cho phân tích thống kê:
Gán giá trị 1 cho Male
Gán giá trị 0 cho Female
Gán giá trị 2 cho Other

2.4. Tạo biến mới

1. Data$Income_per_Hour <- Data$Monthly_Salary / (4 * Data$Work_Hours_Per_Week)
2. Data$Tenure_Years <- as.numeric(difftime(Sys.Date(), Data$Hire_Date, units = "days")) / 365

Nhận xét: Data\(Income_per_Hour <- Data\)Monthly_Salary / (4 * Data\(Work_Hours_Per_Week): dùng để tính thu nhập trung bình theo giờ làm việc bằng cách chia lương tháng cho tổng số giờ làm trong 4 tuần giúp đánh giá hiệu quả lao động giữa các nhân viên. Data\)Tenure_Years <- as.numeric(difftime(Sys.Date(), Data$Hire_Date, units = “days”)) / 365 giúp tính thâm niên làm việc bằng cách lấy hiệu giữa ngày hiện tại và ngày bắt đầu làm việc, sau đó chuyển từ ngày sang năm.

2.5. Chuẩn hóa thang đo

1. Data$Monthly_Salary_Scaled <- scale(Data$Monthly_Salary)

Nhận xét: chuẩn hóa thang đo cho biến Monthly_Salary bằng hàm scale() giúp đưa các giá trị về cùng một thang đo chuẩn với trung bình bằng 0 và độ lệch chuẩn bằng 1.

2.6. Gộp nhóm độ tuổi

1. Data$Age_Group <- cut(Data$Age, breaks=c(20,30,40,50,60), labels=c("20-30","31-40","41-50","51-60"))

Nhận xét: Tham số breaks xác định ranh giới các nhóm tuổi (từ 20 đến 60).
Tham số labels đặt tên cho từng nhóm tương ứng.
Biến mới Age_Group thuộc kiểu factor, chia nhân viên thành 4 nhóm tuổi: 20–30, 31–40, 41–50 và 51–60.

2.7. Kiểm tra giá trị bất hợp lí ở biến Age

1. summary(Data$Age)
##    Min. 1st Qu.  Median    Mean 3rd Qu.    Max. 
##   22.00   31.00   41.00   41.03   51.00   60.00
1. Data %>% filter(Age < 18 | Age > 65)

Nhận xét: summary(Data$Age) để hiển thị thống kê mô tả cho biến Age, cho thấy tuổi nhân viên dao động từ 22 đến 60, trung bình khoảng 41 tuổi.
Data %>% filter(Age < 18 | Age > 65) dùng để kiểm tra giá trị outliers trong biến tuổi, cụ thể là nhân viên dưới 18 hoặc trên 65 tuổi. Kết quả trả về 0 dòng, nghĩa là không có dữ liệu bất thường.

2.8. Mã hóa thứ bậc cho trình độ học vấn

1. Data$Education_Level <- factor(Data$Education_Level,
2.                                levels = c("High School", "Bachelor", "Master", "PhD"),
3.                                ordered = TRUE)
4. Data$Education_Code <- as.numeric(Data$Education_Level)

Nhận xét: Chuyển biến Education_Level thành factor có thứ tự trình độ học vấn tăng dần về mức độ ( High School < Bachelor < Master < PhD).

2.9. Chuẩn hóa phân phối dữ liệu lệch (log transformation)

1. Data$Salary_log <- log(Data$Monthly_Salary)

Nhận xét: Tạo biến mới Salary_log là logarit tự nhiên của Monthly_Salary giúp giảm skewness và ổn định phương sai

2.10. Gán nhãn mới cho biến Resigned

1. Data$Resigned_Label <- ifelse(Data$Resigned == TRUE, "Đã nghỉ việc", "Còn làm việc")

Nhận xét: Tạo biến mới Resigned_Label mô tả trạng thái làm việc của nhân viên dưới dạng văn bản dễ hiểu hơn.
Nếu Resigned == TRUE: gán giá trị “Đã nghỉ việc”.
Nếu Resigned == FALSE: gán giá trị “Còn làm việc”.

2.11. Phân loại hiệu suất làm việc

1. Data$Performance_Level <- cut(Data$Performance_Score,
2.                               breaks = c(0,2,3.5,5),
3.                               labels = c("Thấp", "Trung bình", "Cao"))

Nhận xét: Phân loại mức hiệu suất làm việc của nhân viên dựa trên Performance_Score. Điểm từ 0–2 được gán là “Thấp”,
Điểm từ >2–3.5 là “Trung bình”,
Điểm từ >3.5–5 là “Cao”.

2.12. Chuẩn hóa định dạng số thập phân

1. Data$Monthly_Salary <- round(Data$Monthly_Salary, 0)

Nhận xét: làm tròn giá trị số trong hai biến: Monthly_Salary được làm tròn đến số nguyên giúp biểu diễn lương dữ liệu hiển thị rõ ràng, thống nhất.

III. THỐNG KÊ CƠ BẢN

3.1. Thống kê các biến định lượng

1. describe(Data)

Nhận xét: hàm describe() được sử dụng để tổng hợp toàn bộ các đặc trưng thống kê mô tả của tập dữ liệu Data, kết quả thống kê mô tả cho thấy bộ dữ liệu có chất lượng tốt, không xuất hiện giá trị ngoại lai hay bất thường rõ rệt và các biến đã được chuẩn hóa đồng nhất.

3.2. Tính trung bình, min, max cho các biến định lượng

1. Data %>%
2.   summarise(across(where(is.numeric),
3.                    list(mean = mean, min = min, max = max), na.rm = TRUE))

Nhận xét: summarise(): tạo bảng tóm tắt thống kê.
across(where(is.numeric), …): áp dụng hàm cho tất cả các cột kiểu số.
list(mean = mean, min = min, max = max): với mỗi biến số, tính trung bình, giá trị nhỏ nhất, lớn nhất.
na.rm = TRUE: bỏ qua các giá trị bị thiếu (NA).
Kết quả cho thấy độ tuổi trung bình của nhân viên là khoảng 41 tuổi dao động từ 22–60.

3.4. Đếm số nhân viên theo phòng ban

1. Data %>%
2.   count(Department, name = "SoLuong") %>%
3.   arrange(desc(SoLuong))

Nhận xét: hàm count() trong gói dplyr được sử dụng để thống kê số lượng nhân viên thuộc từng phòng ban trong tập dữ liệu, sau đó được sắp xếp giảm dần theo số lượng thông qua hàm arrange(desc(SoLuong)). Kết quả cho thấy dữ liệu gồm 9 phòng ban chính với quy mô nhân sự tương đối đồng đều, không có sự chênh lệch quá lớn giữa các đơn vị.
Bảng thống kê cho thấy:
Marketing là phòng ban có số lượng nhân viên nhiều nhất với 11.216 người, chiếm tỷ trọng cao nhất trong công ty.
Tiếp theo là Finance, Operations, IT và Sales thể hiện sự phân bổ nhân sự khá cân đối giữa các bộ phận chủ chốt.
Kết quả này phản ánh rằng doanh nghiệp có cơ cấu nhân sự phân bổ đồng đều giữa các phòng ban, không xuất hiện tình trạng mất cân bằng lớn.

3.5. Tính tỷ lệ phần trăm giới tính

1. Data %>%
2.   count(Gender) %>%
3.   mutate(Percent = round(n / sum(n) * 100, 2))

Nhận xét: sử dụng hàm count(Gender) để đếm số lượng nhân viên theo từng giới tính, sau đó dùng mutate() để tính tỷ lệ phần trăm (%) của từng nhóm trong tổng số nhân viên. Tổng số nhân viên: 100,000 người.
Nam và nữ chiếm tỷ lệ gần như tương đương nhau khoảng 48%, cho thấy doanh nghiệp có cân bằng giới tính khá tốt trong đội ngũ nhân sự.
Giới tính khác (Other) chiếm 3.97%, thể hiện sự đa dạng và bao dung trong chính sách tuyển dụng, phản ánh một môi trường làm việc hiện đại, tôn trọng sự khác biệt giới.

3.6. Lương trung bình theo nhóm tuổi và giới tính

1. Data <- Data %>%
2.   mutate(
3.     Nhom_Tuoi = case_when(
4.       Age < 30 ~ "Dưới 30",
5.       Age >= 30 & Age < 40 ~ "30-39",
6.       Age >= 40 & Age < 50 ~ "40-49",
7.       Age >= 50 ~ "Từ 50 trở lên"
8.     )
9.   )
10. Data %>%
11.   group_by(Nhom_Tuoi, Gender) %>%
12.   summarise(LuongTB = mean(Monthly_Salary, na.rm = TRUE)) %>%
13.   arrange(Nhom_Tuoi)

Nhận xét: mutate(): thêm một biến mới vào bộ dữ liệu hiện có.
case_when(): chia cột Age thành 4 nhóm tuổi.
group_by(Nhom_Tuoi, Gender): chia dữ liệu thành các nhóm kết hợp giữa nhóm tuổi và giới tính.
summarise(LuongTB = mean(Monthly_Salary, na.rm = TRUE)): tính mức lương trung bình cho từng nhóm.
arrange(Nhom_Tuoi): sắp xếp kết quả theo thứ tự tăng dần của nhóm tuổi.
Lương trung bình gần như đồng đều giữa các nhóm tuổi và giới tính, dao động quanh mức 6.400 VND/tháng, cho thấy:
Chính sách trả lương của doanh nghiệp ổn định và ít phân biệt theo tuổi hoặc giới.
Không có chênh lệch lớn giữa các nhóm — mức dao động tối đa chỉ khoảng 30–40 VND, tức < 1%.
Nữ và nam có mức lương gần như ngang nhau, chênh lệch chỉ vài đồng, chứng tỏ doanh nghiệp đảm bảo công bằng giới trong chính sách trả lương.
Nhóm “Other” có xu hướng lương cao hơn nhẹ, có thể do họ tập trung ở các vị trí có tính chuyên môn cao hoặc doanh nghiệp áp dụng chính sách khuyến khích đa dạng giới.

3.7. Phân nhóm nhân viên theo độ tuổi

1. Data <- Data %>%
2.   mutate(Nhom_Tuoi = case_when(
3.     Age < 25 ~ "Dưới 25",
4.     Age >= 25 & Age < 35 ~ "25–34",
5.     Age >= 35 & Age < 45 ~ "35–44",
6.     Age >= 45 ~ "Trên 45"
7.   ))
8. table(Data$Nhom_Tuoi)
## 
##   25–34   35–44 Dưới 25 Trên 45 
##   25607   25597    7608   41188

Nhận xét: table(): tạo bảng tần suất, đếm số lượng nhân viên thuộc từng nhóm tuổi trong cột Nhom_Tuoi.
Kết quả cho thấy nhóm “Trên 45 tuổi” chiếm số lượng cao nhất với thể hiện lực lượng lao động có kinh nghiệm lâu năm. Hai nhóm tuổi trung niên “25–34” và “35–44” chiếm tỷ lệ tương đương nhau, là lực lượng lao động chủ lực, năng động và đang trong giai đoạn phát triển nghề nghiệp mạnh. Trong khi đó, nhóm “Dưới 25 tuổi” có số lượng nhỏ, phản ánh số lượng nhân viên trẻ còn hạn chế, có thể do doanh nghiệp ít tuyển dụng người mới ra trường hoặc nhóm này có xu hướng nghỉ việc sớm. Kết quả này gợi ý doanh nghiệp cần chú trọng các chính sách phát triển đội ngũ kế cận, đồng thời tăng cường chương trình đào tạo và thu hút nhân sự trẻ để đảm bảo sự cân bằng về độ tuổi trong tổ chức.

3.8. Xếp hạng phòng ban theo lương trung bình

1. Data %>%
2.    group_by(Department) %>%
3.   summarise(LuongTB = mean(Monthly_Salary, na.rm = TRUE)) %>%
4.   mutate(XepHang = rank(-LuongTB))

Nhận xét: group_by(Department): nhóm dữ liệu theo từng phòng ban.
summarise(LuongTB = mean(Monthly_Salary, na.rm = TRUE)): tính mức lương trung bình (LuongTB) của mỗi phòng ban, bỏ qua giá trị bị thiếu (NA).
mutate(XepHang = rank(-LuongTB)): tạo thêm cột mới XepHang, xếp hạng các phòng ban theo thứ tự giảm dần của lương trung bình(phòng có lương cao nhất là hạng 1).
Kết quả thống kê cho thấy mức lương trung bình giữa các phòng ban trong doanh nghiệp có sự chênh lệch nhẹ, phản ánh đặc thù công việc và yêu cầu chuyên môn khác nhau. Cụ thể, phòng Engineering có mức lương trung bình cao nhất khoảng 6.417 USD/tháng đứng đầu tiên trong bảng xếp hạng, cho thấy đây là bộ phận đòi hỏi kỹ năng chuyên môn cao và có giá trị đóng góp lớn trong tổ chức. Tiếp theo là phòng IT khoảng 6.415 USD/tháng hạng thứ 2 và phòng Sales 6.413 USD/tháng hạng thứ 3, đều là các bộ phận có vai trò trọng yếu trong vận hành và phát triển doanh thu. Trong khi đó, Marketing có mức lương trung bình thấp nhất 6.378 USD/tháng hạng 9, có thể do cơ cấu nhân sự trẻ hơn hoặc mức thưởng biến động tùy theo kết quả kinh doanh. Nhìn chung, chênh lệch lương giữa các phòng ban không quá lớn, cho thấy doanh nghiệp đang duy trì chính sách đãi ngộ tương đối đồng đều, tuy nhiên vẫn có sự ưu tiên nhất định cho các vị trí kỹ thuật và công nghệ.

3.9. Phân phối lương theo nhóm trình độ

1. Data %>%
2.   group_by(Education_Level) %>%
3.   summarise(
4.     Min = min(Monthly_Salary, na.rm = TRUE),
5.     Q1 = quantile(Monthly_Salary, 0.25, na.rm = TRUE),
6.     Median = median(Monthly_Salary, na.rm = TRUE),
7.     Q3 = quantile(Monthly_Salary, 0.75, na.rm = TRUE),
8.     Max = max(Monthly_Salary, na.rm = TRUE)
9.   )

Nhận xét: group_by(Education_Level): chia dữ liệu theo trình độ học vấn.
summarise(): Tính các thống kê mô tả về lương cho từng nhóm học vấn:
Min: mức lương thấp nhất trong nhóm.
Q1: phân vị thứ 25% tức là 25% nhân viên trong nhóm có lương thấp hơn giá trị này.
Median: trung vị mức lương.
Q3: phân vị thứ 75% tức là 75% nhân viên có lương thấp hơn giá trị này.
Max: mức lương cao nhất trong nhóm.
Kết quả thống kê mô tả mức lương theo trình độ học vấn cho thấy sự khác biệt giữa các nhóm không quá rõ rệt, mặc dù có xu hướng tăng nhẹ ở các bậc học cao hơn. Cụ thể, mức lương tối thiểu ở tất cả các nhóm đều bằng 3.850 USD/tháng và mức tối đa đạt 9.000 USD/tháng, cho thấy chính sách lương trong doanh nghiệp được phân bổ tương đối đồng đều. Tuy nhiên, nhóm nhân viên có trình độ Tiến sĩ (PhD) có Q1 cao hơn một chút (5.400 USD) so với các nhóm còn lại (5.250 USD), phản ánh phần nào giá trị của học vị cao đối với thu nhập. Các giá trị trung vị và Q3 đều duy trì ở mức 6.500 USD và 7.500 USD, cho thấy phần lớn nhân viên, bất kể trình độ học vấn, đều nhận mức lương nằm trong khoảng tương đối ổn định. Nhìn chung, kết quả này gợi ý rằng yếu tố học vấn có ảnh hưởng nhất định đến thu nhập nhưng không phải là yếu tố quyết định duy nhất, có thể do doanh nghiệp đánh giá lương dựa nhiều hơn vào năng lực thực tế và kinh nghiệm làm việc.

3.10. Ma trận tương quan giữa các biến định lượng

1. num_vars <- Data %>% select(where(is.numeric))
2. cor_matrix <- cor(num_vars, use = "complete.obs")
3. cor_matrix
##                               Employee_ID           Age Years_At_Company
## Employee_ID                  1.0000000000  4.010169e-03    -7.175044e-03
## Age                          0.0040101693  1.000000e+00     7.807067e-05
## Years_At_Company            -0.0071750437  7.807067e-05     1.000000e+00
## Performance_Score           -0.0020774164  1.597668e-03     1.597730e-03
## Monthly_Salary              -0.0020502697  2.756751e-03    -6.446329e-04
## Work_Hours_Per_Week         -0.0009682099 -3.049750e-03     2.577616e-03
## Projects_Handled            -0.0007055068 -1.726106e-03     2.962663e-03
## Overtime_Hours              -0.0052544207  1.875477e-03     1.964914e-03
## Sick_Days                    0.0007453207  6.981262e-03    -4.371378e-03
## Remote_Work_Frequency       -0.0003470926 -4.671609e-03    -2.443322e-03
## Team_Size                    0.0020271653 -3.411191e-03     3.249903e-03
## Training_Hours              -0.0029659719  2.044696e-03     2.696411e-03
## Promotions                  -0.0007783032 -2.887805e-03    -2.736752e-03
## Employee_Satisfaction_Score -0.0015949690 -1.242389e-04    -3.180180e-03
## Gender_Code                  0.0009785420 -7.307428e-04    -3.676997e-03
## Income_per_Hour             -0.0006911393  3.882076e-03    -1.511366e-03
## Tenure_Years                -0.0069117415  3.607415e-04     9.949547e-01
## Monthly_Salary_Scaled       -0.0020502697  2.756751e-03    -6.446329e-04
## Education_Code              -0.0018789701  3.824126e-03    -9.113552e-04
## Salary_log                  -0.0017915120  2.933448e-03    -9.981241e-04
##                             Performance_Score Monthly_Salary
## Employee_ID                     -0.0020774164  -0.0020502697
## Age                              0.0015976678   0.0027567514
## Years_At_Company                 0.0015977303  -0.0006446329
## Performance_Score                1.0000000000   0.5100348076
## Monthly_Salary                   0.5100348076   1.0000000000
## Work_Hours_Per_Week             -0.0056272519  -0.0023471937
## Projects_Handled                 0.0006404622  -0.0019249034
## Overtime_Hours                  -0.0013116293  -0.0030286716
## Sick_Days                        0.0029943235   0.0036103835
## Remote_Work_Frequency            0.0017328664  -0.0004640546
## Team_Size                       -0.0051744134   0.0029715225
## Training_Hours                   0.0023579401  -0.0010876011
## Promotions                      -0.0035012983  -0.0019402037
## Employee_Satisfaction_Score      0.0016962790   0.0010827334
## Gender_Code                      0.0033283897  -0.0005024205
## Income_per_Hour                  0.3652205329   0.7095713299
## Tenure_Years                     0.0013313701  -0.0011698334
## Monthly_Salary_Scaled            0.5100348076   1.0000000000
## Education_Code                   0.0018269621   0.0055555788
## Salary_log                       0.4984682532   0.9931557833
##                             Work_Hours_Per_Week Projects_Handled Overtime_Hours
## Employee_ID                       -0.0009682099    -0.0007055068   -0.005254421
## Age                               -0.0030497497    -0.0017261058    0.001875477
## Years_At_Company                   0.0025776162     0.0029626628    0.001964914
## Performance_Score                 -0.0056272519     0.0006404622   -0.001311629
## Monthly_Salary                    -0.0023471937    -0.0019249034   -0.003028672
## Work_Hours_Per_Week                1.0000000000    -0.0041829031    0.005787021
## Projects_Handled                  -0.0041829031     1.0000000000    0.004106915
## Overtime_Hours                     0.0057870213     0.0041069149    1.000000000
## Sick_Days                         -0.0008383590    -0.0049951817    0.004254812
## Remote_Work_Frequency             -0.0046182275     0.0004843081   -0.004349288
## Team_Size                          0.0007902768     0.0038130125    0.002174617
## Training_Hours                     0.0012871484     0.0022111028    0.002939398
## Promotions                         0.0002382231    -0.0023438196   -0.002537371
## Employee_Satisfaction_Score        0.0005299660     0.0061258039    0.001052243
## Gender_Code                        0.0030297598     0.0020483138   -0.003142553
## Income_per_Hour                   -0.6788761210     0.0011201122   -0.005860099
## Tenure_Years                       0.0033883197     0.0024509233    0.001749499
## Monthly_Salary_Scaled             -0.0023471937    -0.0019249034   -0.003028672
## Education_Code                    -0.0018123271    -0.0015197491    0.007493310
## Salary_log                        -0.0019864042    -0.0022188744   -0.002688654
##                                 Sick_Days Remote_Work_Frequency     Team_Size
## Employee_ID                  0.0007453207         -0.0003470926  0.0020271653
## Age                          0.0069812624         -0.0046716085 -0.0034111911
## Years_At_Company            -0.0043713776         -0.0024433223  0.0032499029
## Performance_Score            0.0029943235          0.0017328664 -0.0051744134
## Monthly_Salary               0.0036103835         -0.0004640546  0.0029715225
## Work_Hours_Per_Week         -0.0008383590         -0.0046182275  0.0007902768
## Projects_Handled            -0.0049951817          0.0004843081  0.0038130125
## Overtime_Hours               0.0042548124         -0.0043492880  0.0021746169
## Sick_Days                    1.0000000000          0.0004782113  0.0001493077
## Remote_Work_Frequency        0.0004782113          1.0000000000 -0.0006677778
## Team_Size                    0.0001493077         -0.0006677778  1.0000000000
## Training_Hours               0.0003468368          0.0052273677  0.0027358291
## Promotions                  -0.0030440420         -0.0005365374  0.0006476629
## Employee_Satisfaction_Score -0.0008929077         -0.0014080411  0.0009435061
## Gender_Code                  0.0019069739          0.0014421629 -0.0035767307
## Income_per_Hour              0.0030818680          0.0029304538  0.0015846071
## Tenure_Years                -0.0044099108         -0.0026209039  0.0034104045
## Monthly_Salary_Scaled        0.0036103835         -0.0004640546  0.0029715225
## Education_Code              -0.0026007225          0.0023716776  0.0011924871
## Salary_log                   0.0033390196         -0.0004589593  0.0031194449
##                             Training_Hours    Promotions
## Employee_ID                  -0.0029659719 -0.0007783032
## Age                           0.0020446964 -0.0028878052
## Years_At_Company              0.0026964107 -0.0027367522
## Performance_Score             0.0023579401 -0.0035012983
## Monthly_Salary               -0.0010876011 -0.0019402037
## Work_Hours_Per_Week           0.0012871484  0.0002382231
## Projects_Handled              0.0022111028 -0.0023438196
## Overtime_Hours                0.0029393975 -0.0025373710
## Sick_Days                     0.0003468368 -0.0030440420
## Remote_Work_Frequency         0.0052273677 -0.0005365374
## Team_Size                     0.0027358291  0.0006476629
## Training_Hours                1.0000000000  0.0009325892
## Promotions                    0.0009325892  1.0000000000
## Employee_Satisfaction_Score  -0.0014892218  0.0002268193
## Gender_Code                  -0.0045291464  0.0016893454
## Income_per_Hour              -0.0023492786 -0.0015630480
## Tenure_Years                  0.0028224575 -0.0027728045
## Monthly_Salary_Scaled        -0.0010876011 -0.0019402037
## Education_Code               -0.0008259264  0.0007700870
## Salary_log                   -0.0013740890 -0.0017717160
##                             Employee_Satisfaction_Score   Gender_Code
## Employee_ID                               -1.594969e-03  0.0009785420
## Age                                       -1.242389e-04 -0.0007307428
## Years_At_Company                          -3.180180e-03 -0.0036769971
## Performance_Score                          1.696279e-03  0.0033283897
## Monthly_Salary                             1.082733e-03 -0.0005024205
## Work_Hours_Per_Week                        5.299660e-04  0.0030297598
## Projects_Handled                           6.125804e-03  0.0020483138
## Overtime_Hours                             1.052243e-03 -0.0031425532
## Sick_Days                                 -8.929077e-04  0.0019069739
## Remote_Work_Frequency                     -1.408041e-03  0.0014421629
## Team_Size                                  9.435061e-04 -0.0035767307
## Training_Hours                            -1.489222e-03 -0.0045291464
## Promotions                                 2.268193e-04  0.0016893454
## Employee_Satisfaction_Score                1.000000e+00 -0.0047025556
## Gender_Code                               -4.702556e-03  1.0000000000
## Income_per_Hour                            9.901409e-06 -0.0021507012
## Tenure_Years                              -3.000590e-03 -0.0034907672
## Monthly_Salary_Scaled                      1.082733e-03 -0.0005024205
## Education_Code                            -3.167152e-03 -0.0025618943
## Salary_log                                 1.237863e-03 -0.0008487764
##                             Income_per_Hour  Tenure_Years Monthly_Salary_Scaled
## Employee_ID                   -6.911393e-04 -0.0069117415         -0.0020502697
## Age                            3.882076e-03  0.0003607415          0.0027567514
## Years_At_Company              -1.511366e-03  0.9949547064         -0.0006446329
## Performance_Score              3.652205e-01  0.0013313701          0.5100348076
## Monthly_Salary                 7.095713e-01 -0.0011698334          1.0000000000
## Work_Hours_Per_Week           -6.788761e-01  0.0033883197         -0.0023471937
## Projects_Handled               1.120112e-03  0.0024509233         -0.0019249034
## Overtime_Hours                -5.860099e-03  0.0017494988         -0.0030286716
## Sick_Days                      3.081868e-03 -0.0044099108          0.0036103835
## Remote_Work_Frequency          2.930454e-03 -0.0026209039         -0.0004640546
## Team_Size                      1.584607e-03  0.0034104045          0.0029715225
## Training_Hours                -2.349279e-03  0.0028224575         -0.0010876011
## Promotions                    -1.563048e-03 -0.0027728045         -0.0019402037
## Employee_Satisfaction_Score    9.901409e-06 -0.0030005904          0.0010827334
## Gender_Code                   -2.150701e-03 -0.0034907672         -0.0005024205
## Income_per_Hour                1.000000e+00 -0.0025908506          0.7095713299
## Tenure_Years                  -2.590851e-03  1.0000000000         -0.0011698334
## Monthly_Salary_Scaled          7.095713e-01 -0.0011698334          1.0000000000
## Education_Code                 4.468437e-03 -0.0007234356          0.0055555788
## Salary_log                     7.044228e-01 -0.0015312002          0.9931557833
##                             Education_Code    Salary_log
## Employee_ID                  -0.0018789701 -0.0017915120
## Age                           0.0038241263  0.0029334479
## Years_At_Company             -0.0009113552 -0.0009981241
## Performance_Score             0.0018269621  0.4984682532
## Monthly_Salary                0.0055555788  0.9931557833
## Work_Hours_Per_Week          -0.0018123271 -0.0019864042
## Projects_Handled             -0.0015197491 -0.0022188744
## Overtime_Hours                0.0074933096 -0.0026886542
## Sick_Days                    -0.0026007225  0.0033390196
## Remote_Work_Frequency         0.0023716776 -0.0004589593
## Team_Size                     0.0011924871  0.0031194449
## Training_Hours               -0.0008259264 -0.0013740890
## Promotions                    0.0007700870 -0.0017717160
## Employee_Satisfaction_Score  -0.0031671522  0.0012378629
## Gender_Code                  -0.0025618943 -0.0008487764
## Income_per_Hour               0.0044684368  0.7044228497
## Tenure_Years                 -0.0007234356 -0.0015312002
## Monthly_Salary_Scaled         0.0055555788  0.9931557833
## Education_Code                1.0000000000  0.0058748496
## Salary_log                    0.0058748496  1.0000000000

Nhận xét: num_vars <- Data %>% select(where(is.numeric)) chọn ra chỉ những biến dạng số trong dữ liệu Data.
Hàm where(is.numeric) lọc tất cả các cột mà kiểu dữ liệu là số, loại bỏ các biến dạng chuỗi hoặc phân loại. Hàm cor() dùng để tính ma trận tương quan giữa các biến số.
use = “complete.obs”: chỉ sử dụng những dòng không có giá trị thiếu (NA) để tránh lỗi trong phép tính.
Phân tích ma trận tương quan giữa các biến định lượng trong bộ dữ liệu cho thấy mối liên hệ giữa các chỉ số liên quan đến nhân viên. Kết quả nhìn chung cho thấy phần lớn các biến có hệ số tương quan rất nhỏ nghĩa là không có mối quan hệ tuyến tính rõ ràng giữa chúng.
Các biến như Age, Work_Hours_Per_Week, Projects_Handled hay Training_Hours hầu như không có tương quan đáng kể với lương hoặc điểm hiệu suất, phản ánh rằng trong doanh nghiệp này, các yếu tố đó không ảnh hưởng mạnh đến thu nhập.
Biến outlier_flag có giá trị NA trong ma trận tương quan, do đây là biến nhị phân xác định outlier nên không có ý nghĩa khi tính hệ số tương quan với biến liên tục.

3.11. Tỷ lệ nghỉ việc tổng thể

1. Data %>%
2.    summarise(TyLeNghiViec = mean(Resigned) * 100)

Nhận xét: summarise(): Dùng để tóm tắt dữ liệu bằng cách tính toán một giá trị thống kê tổng hợp. Resigned là một biến logic (TRUE hoặc FALSE), trong đó:
TRUE = Nhân viên đã nghỉ việc
FALSE = Nhân viên còn đang làm
mean(Resigned) trong R sẽ hiểu TRUE = 1, FALSE = 0 sau đó, trung bình cộng của cột Resigned chính là tỷ lệ nhân viên nghỉ việc.
Kết quả cho thấy tỷ lệ nhân viên nghỉ việc chiếm khoảng 10% tổng số lao động trong doanh nghiệp. Mức tỷ lệ nghỉ việc này được xem là tương đối ổn định, không quá cao so với mặt bằng chung của nhiều tổ chức, đặc biệt nếu doanh nghiệp hoạt động trong môi trường có tính cạnh tranh nhân sự vừa phải. Tuy nhiên, nếu mục tiêu của công ty là duy trì đội ngũ ổn định lâu dài thì 10% vẫn là mức cần theo dõi, vì tỷ lệ nghỉ việc có thể ảnh hưởng đến chi phí tuyển dụng, đào tạo nhân viên mới và hiệu suất hoạt động tổng thể.

3.12. Tính hệ số biến thiên (Coefficient of Variation) cho lương

1. Data %>%
2.   summarise(CV_Luong = sd(Monthly_Salary, na.rm = TRUE) / mean(Monthly_Salary, na.rm = TRUE) * 100)

Nhận xét: sd(Monthly_Salary): Tính độ lệch chuẩn của lương.
mean(Monthly_Salary): Tính mức lương trung bình của toàn bộ nhân viên.
Chia sd cho mean và nhân 100 để tính được hệ số biến thiên (%). Hệ số biến thiên (Coefficient of Variation – CV) bằng 21.43% cho thấy mức độ phân tán của lương nhân viên ở mức trung bình nghĩa là mức lương giữa các nhân viên có sự khác biệt vừa phải, không quá đồng đều nhưng cũng không quá chênh lệch.

3.13. So sánh trung bình điểm hài lòng giữa nhóm nghỉ và ở lại

1. Data %>%
2.   group_by(Resigned) %>%
3.   summarise(DiemHaiLongTB = mean(Employee_Satisfaction_Score, na.rm = TRUE))

Nhận xét: group_by(Resigned): Chia dữ liệu thành hai nhóm Nhóm Resigned = TRUE: nhân viên đã nghỉ việc.
Nhóm Resigned = FALSE: nhân viên còn làm việc.
summarise(): Tạo bảng tóm tắt với giá trị trung bình.
mean(Employee_Satisfaction_Score, na.rm = TRUE): Tính điểm hài lòng trung bình của mỗi nhóm, bỏ qua giá trị bị thiếu (NA).
Nhân viên còn làm việc có điểm hài lòng trung bình là 3.00, trong khi nhân viên đã nghỉ việc có điểm 2.99.
Điều đó cho thấy mức độ hài lòng không phải là yếu tố chính ảnh hưởng đến quyết định nghỉ việc trong bộ dữ liệu này. Có thể các yếu tố khác như cơ hội thăng tiến, khối lượng công việc, lương thưởng hoặc môi trường làm việc mới đóng vai trò quan trọng hơn.

3.14. Trung bình lương và tuổi theo học vấn

1. Data %>%
2.   group_by(Education_Level) %>%
3.   summarise(
4.     LuongTB = mean(Monthly_Salary, na.rm = TRUE),
5.     TuoiTB = mean(Age, na.rm = TRUE)
6.   )

Nhận xét: group_by(Education_Level): chia dữ liệu thành từng nhóm theo trình độ học vấn.
summarise(…): tính toán các chỉ số thống kê tóm tắt cho từng nhóm.
mean(Monthly_Salary,…): trung bình lương hàng tháng
mean(Age,…): tuổi trung bình
na.rm = TRUE: bỏ qua giá trị thiếu (NA) khi tính trung bình. Kết quả phân tích cho thấy lương trung bình có xu hướng tăng nhẹ theo trình độ học vấn, từ 6.399 ở nhóm “High School” lên 6.432 ở nhóm “PhD”. Tuy nhiên, mức tăng không đáng kể, gợi ý rằng trong tổ chức này, trình độ học vấn không phải là yếu tố chính ảnh hưởng đến mức lương. Tuổi trung bình của các nhóm học vấn dao động quanh 41 tuổi, thể hiện sự tương đồng về độ tuổi giữa các cấp độ học vấn.

3.15. Phân tích chéo giữa giới tính và học vấn

1. table(Data$Gender, Data$Education_Level)
##         
##          High School Bachelor Master   PhD
##   Female       14299    24138   7127  2437
##   Male         14516    23902   7195  2418
##   Other         1189     2001    582   196

Nhận xét: Hàm table() dùng để tạo bảng tần số chéo giữa hai biến định tính. Bảng tần số chéo giữa giới tính và trình độ học vấn cho thấy sự phân bố giới tính khá cân bằng trong doanh nghiệp, với tỷ lệ nam và nữ gần tương đương ở mọi cấp độ học vấn. Nhóm nhân viên có trình độ đại học chiếm tỷ lệ cao nhất, trong khi nhóm có học vị sau đại học (Master, PhD) ít hơn. Điều này cho thấy lực lượng lao động chủ yếu có trình độ từ đại học trở xuống, phù hợp với đặc thù công việc của tổ chức.

3.16. Hệ số tương quan giữa lương và điểm hài lòng

1. cor(Data$Monthly_Salary, Data$Employee_Satisfaction_Score)
## [1] 0.001082733

Nhận xét: Hàm cor() (correlation) tính hệ số tương quan Pearson giữa hai biến số dạng số.
cor(x, y) cho ra giá trị trong khoảng [-1, 1]:
> 0 → Tương quan thuận (khi lương tăng → hài lòng tăng).
< 0 → Tương quan nghịch (khi lương tăng → hài lòng giảm).
≈ 0 → Không có mối liên hệ tuyến tính rõ ràng giữa hai biến. Giá trị tương quan r≈0.001 rất gần 0, cho thấy hầu như không có mối quan hệ tuyến tính giữa mức lương và mức độ hài lòng của nhân viên trong tập dữ liệu này.

3.17. Trung bình số dự án theo chức vụ

1. Data %>%
2.   group_by(Job_Title) %>%
3.   summarise(DuAnTB = mean(Projects_Handled, na.rm = TRUE))

Nhận xét: group_by(Job_Title): gom nhóm dữ liệu theo từng chức danh công việc . summarise(): tính toán tóm tắt cho mỗi nhóm. mean(Projects_Handled, na.rm = TRUE): tính số dự án trung bình mà nhân viên trong mỗi chức vụ đã đảm nhận, bỏ qua giá trị thiếu (NA). Kết quả cho thấy số dự án trung bình mà mỗi chức vụ đảm nhận dao động quanh mức 24–25 dự án, thể hiện sự phân bổ công việc tương đối đồng đều giữa các vị trí trong tổ chức. Điều này cho thấy công ty có chính sách giao việc hợp lý, không có sự chênh lệch lớn về khối lượng công việc giữa các nhóm nhân viên.

3.18. Phân tổ các biến theo giới tính và nhóm tuổi

1. Data <- Data %>%
2.   mutate(Nhom_tuoi = cut(Age,
3.                          breaks = c(20, 30, 40, 50, 60),
4.                          labels = c("20-29", "30-39", "40-49", "50-59"),
5.                          right = FALSE))
6. bang_phan_to <- Data %>%
7.   group_by(Gender, Nhom_tuoi) %>%
8.   summarise(
9.     So_luong = n(),
10.     Luong_TB = mean(as.numeric(Monthly_Salary), na.rm = TRUE),
11.     Diem_HL_TB = mean(as.numeric(Employee_Satisfaction_Score), na.rm = TRUE)
12.   ) %>%
13.   arrange(Gender, Nhom_tuoi)
14. print(bang_phan_to)
## # A tibble: 15 × 5
## # Groups:   Gender [3]
##    Gender Nhom_tuoi So_luong Luong_TB Diem_HL_TB
##    <fct>  <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

Nhận xét: 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)) Dòng này tạo biến phân loại tuổi (Nhom_tuoi) bằng hàm cut().
Dữ liệu được chia thành 4 nhóm tuổi: 20–29, 30–39, 40–49, 50–59.
Tham số right = FALSE nghĩa là khoảng bên trái đóng, bên phải mở.
group_by(Gender, Nhom_tuoi): gom nhóm dữ liệu theo giới tính và nhóm tuổi.
summarise(): tính toán thống kê tóm tắt cho mỗi nhóm:
So_luong: số nhân viên trong nhóm.
Luong_TB: lương trung bình hàng tháng.
Diem_HL_TB: điểm hài lòng trung bình của nhân viên.
arrange(): sắp xếp kết quả theo thứ tự giới tính và nhóm tuổi.
Dữ liệu được phân tổ theo giới tính và nhóm tuổi cho thấy mức lương trung bình của nhân viên tương đối đồng đều giữa các giới và các độ tuổi, dao động quanh 6.400 USD/tháng. Điểm hài lòng trung bình đạt khoảng 3.0, phản ánh mức độ hài lòng ổn định và không có sự chênh lệch lớn giữa các nhóm. Điều này cho thấy chính sách đãi ngộ của công ty được duy trì công bằng và hợp lý giữa các đối tượng lao động.

3.19. So sánh lương trung bình và độ lệch chuẩn giữa các phòng ban

1. Data %>%
2.   group_by(Department) %>%
3.   summarise(
4.     LuongTB = mean(Monthly_Salary, na.rm = TRUE),
5.     DoLechChuan = sd(Monthly_Salary, na.rm = TRUE)
6.   ) %>%
7.   arrange(desc(LuongTB))

Nhận xét: group_by(Department): Gom nhóm dữ liệu theo từng phòng ban.
summarise(): Tính các chỉ tiêu thống kê cho mỗi phòng ban:
LuongTB: lương trung bình hàng tháng của nhân viên trong phòng ban.
DoLechChuan: độ lệch chuẩn của lương – đo mức phân tán hoặc biến động quanh trung bình (độ chênh lệch giữa người lương cao và thấp).
arrange(desc(LuongTB)): Sắp xếp các phòng ban theo thứ tự giảm dần của lương trung bình, để dễ thấy bộ phận nào có thu nhập cao nhất.
Kết quả cho thấy mức lương trung bình của nhân viên dao động quanh 6.400 USD/tháng, với độ lệch chuẩn khoảng 1.370 USD. Sự chênh lệch giữa các phòng ban là không đáng kể, phản ánh chính sách trả lương khá cân bằng trong toàn công ty. Nhìn chung, các bộ phận kỹ thuật như Engineering và IT có thu nhập trung bình cao hơn một chút so với các phòng ban hành chính hoặc hỗ trợ.

3.20. Phân tổ chức danh, trình độ, điểm hiệu suất và số ngày ốm

1. df_filtered2 <- Data %>%
2.   filter(
3.     Job_Title == "Developer",
4.     Education_Level == "Master",
5.     Performance_Score < 2,
6.     Sick_Days > 5
7.   )
8. print(df_filtered2)
## # A tibble: 252 × 31
##    Employee_ID Department Gender   Age Job_Title Hire_Date  Years_At_Company
##          <dbl> <chr>      <fct>  <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
## # ℹ 24 more variables: Education_Level <ord>, 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>, Gender_Code <dbl>,
## #   Income_per_Hour <dbl>, Tenure_Years <dbl>, …

Nhận xét: filter(): Dùng để lọc các quan sát trong bảng.
Job_Title == “Developer”: Chỉ chọn nhân viên làm vị trí Developer.
Education_Level == “Master”: Chỉ lấy những người có trình độ Master.
Performance_Score < 2 Hiệu suất làm việc dưới 2 điểm: nhóm hiệu suất thấp.
Sick_Days > 5: Số ngày nghỉ ốm nhiều hơn 5 ngày trong năm.
table(df_filtered2\(Department): Để xem Developer hiệu suất thấp tập trung ở bộ phận nào nhiều nhất. mean(df_filtered2\)Monthly_Salary, na.rm = TRUE): Tính lương trung bình của nhóm này.
mean(df_filtered2$Employee_Satisfaction_Score, na.rm = TRUE): So sánh điểm hài lòng nhân viên của nhóm này với trung bình toàn công ty. lọc dữ liệu có điều kiện để chọn ra nhóm nhân viên đáp ứng đồng thời bốn tiêu chí: làm việc ở vị trí Developer, có trình độ Thạc sĩ, hiệu suất làm việc thấp (Performance_Score < 2) và số ngày nghỉ ốm nhiều hơn 5. Kết quả thu được là 252 nhân viên thỏa mãn các điều kiện này. Việc lọc dữ liệu giúp xác định nhóm nhân viên có nguy cơ hiệu suất thấp dù trình độ cao, từ đó phục vụ cho việc phân tích nguyên nhân và đề xuất các biện pháp cải thiện trong báo cáo nhân sự.

IV. TRỰC QUAN HÓA DỮ LIỆU

4.1. Biểu đồ số lượng nhân viên theo chức danh trong mỗi phòng ban

1. Data %>%
2.   count(Department, Job_Title, name = "Employee_Count") %>%
3.   arrange(Department, desc(Employee_Count)) %>%
4.   ggplot(aes(Job_Title, Employee_Count, fill = Job_Title)) +
5.   geom_col(width = 0.7, color = "black", alpha = 0.9) +
6.   geom_text(aes(label = comma(Employee_Count)), 
7.             vjust = 1.3, color = "black", size = 3.2, fontface = "bold") +
8.   facet_wrap(~ Department, scales = "free_y") +
9.   scale_fill_brewer(palette = "Pastel1") +
10.   labs(
11.     title = "Số lượng nhân viên theo chức danh trong từng phòng ban",
12.     x = "Chức danh công việc", y = "Số lượng nhân viên", fill = "Chức danh"
13.   ) +
14.   theme_minimal(base_size = 13) +
15.   theme(
16.     panel.grid.major.x = element_blank(),
17.     axis.text.x = element_text(angle = 30, hjust = 1, size = 9),
18.     legend.position = "bottom",
19.     strip.text = element_text(face = "bold", size = 12)
20.   )

Nhận xét: Dòng 1–3: Tính số lượng nhân viên theo từng chức danh và phòng ban, sau đó sắp xếp kết quả theo phòng ban và giảm dần theo số lượng nhân viên.
Dòng 4–5: Vẽ biểu đồ cột thể hiện số nhân viên cho từng chức danh, tô màu theo chức danh để dễ phân biệt.
Dòng 6–7: Thêm nhãn hiển thị số lượng nhân viên trên mỗi cột.
Dòng 8–20: Tách biểu đồ theo từng phòng ban, chọn bảng màu, đặt tiêu đề, nhãn trục và tinh chỉnh bố cục, phông chữ, vị trí chú thích.
Biểu đồ cho thấy số lượng nhân viên giữa các chức danh trong từng phòng ban khá cân đối, không có chênh lệch lớn. Tuy nhiên, Marketing có Technician cao nhất với 1.682 người, trong khi Engineering có Technician thấp nhất chỉ 1.508 người. Điều này phản ánh tổ chức chú trọng nhân sự cho mảng truyền thông và hỗ trợ hơn là kỹ thuật chuyên sâu.

4.2. Biểu đồ phân bố số năm làm việc theo giới tính

1. ggplot(Data, aes(x = Years_At_Company, fill = Gender)) +
2.   geom_histogram(binwidth = 1, position = "dodge", color = "gray30", width = 0.9) +
3.   scale_fill_brewer(palette = "Pastel1") +
4.   labs(title = "Phân bố số năm làm việc theo giới tính",
5.        x = "Số năm làm việc tại công ty",
6.        y = "Số lượng nhân viên",
7.        fill = "Giới tính") +
8.   theme_minimal(base_size = 13) +
9.   theme(
10.     plot.title = element_text(size = 16, face = "bold", hjust = 0.5),
11.     axis.text.x = element_text(size = 12, face = "bold"),
12.     axis.text.y = element_text(size = 12),
13.     legend.title = element_text(size = 13, face = "bold"),
14.     legend.text = element_text(size = 12)
15.   )

Nhận xét: Dòng 1–2: Vẽ biểu đồ histogram thể hiện phân bố số năm làm việc tại công ty, chia nhóm theo giới tính và đặt các cột cạnh nhau.
Dòng 3: Chọn bảng màu nhẹ để phân biệt giới tính.
Dòng 4–7: Đặt tiêu đề và nhãn cho các trục, đồng thời chú thích màu cho giới tính.
Dòng 8–15: Tinh chỉnh bố cục và phông chữ để biểu đồ rõ ràng, cân đối hơn.
Biểu đồ cho thấy số năm làm việc giữa các giới tính khá đồng đều, trong đó nam thường nhỉnh hơn nữ nhẹ ở hầu hết các mốc, còn giới tính khác chiếm tỷ lệ rất nhỏ. Đáng chú ý, ở mốc 10 năm, số lượng nhân viên của cả ba giới đều giảm mạnh, phản ánh tỷ lệ gắn bó dài hạn thấp. Điều này có thể do nhân viên chuyển việc sau thời gian dài hoặc chính sách giữ chân chưa đủ hấp dẫn giữa các nhóm giới.

4.3. Biểu đồ mật độ log lương theo phòng ban

1. data_density <- Data %>%
2.     filter(Monthly_Salary > 0) %>%
3.     mutate(LogSalary = log10(Monthly_Salary))
4. ggplot(data_density, aes(x = LogSalary, fill = Department)) +
5.     geom_density(alpha = 0.6, color = "black", linewidth = 0.6) +
6.     facet_wrap(~ Department, scales = "free_y") +
7.     scale_fill_brewer(palette = "Pastel1") +
8.     labs(
9.         title = "Phân phối log10 lương tháng theo từng phòng ban",
10.         x = "Log10 Lương tháng (USD)",
11.         y = "Mật độ",
12.         fill = "Phòng ban"
13.     ) +
14.     theme_minimal(base_size = 14) +
15.     theme(
16.         plot.title = element_text(size = 18, face = "bold", hjust = 0.5),
17.         strip.text = element_text(size = 13, face = "bold"),
18.         legend.position = "right",
19.         panel.grid.minor = element_blank(),
20.         panel.grid.major = element_line(color = "gray90")
21.     )

Nhận xét: Dòng 1–3: Lọc bỏ các giá trị lương không hợp lệ và tạo biến LogSalary bằng log cơ số 10 của lương tháng để chuẩn hóa dữ liệu.
Dòng 4–5: Vẽ biểu đồ mật độ của LogSalary, tô màu theo phòng ban với viền đen mảnh để dễ phân biệt.
Dòng 6: Tách riêng từng phòng ban thành các ô nhỏ trong cùng biểu đồ để so sánh trực quan.
Dòng 7: Dùng bảng màu nhẹ giúp dễ nhận diện phòng ban.
Dòng 8–13: Thêm tiêu đề, tên trục và chú thích màu cho phòng ban.
Dòng 14–21: Cải thiện giao diện tổng thể, phóng to tiêu đề, làm đậm nhãn phòng ban và chỉnh lại lưới cho biểu đồ sáng sủa, dễ nhìn hơn.
Biểu đồ cho thấy phân phối log10 lương tháng của các phòng ban đều tập trung quanh mức 3.8, thể hiện thu nhập trung bình tương đối đồng đều giữa các bộ phận. Engineering và IT có mật độ tập trung cao nhất quanh giá trị này, cho thấy nhóm ngành kỹ thuật được trả lương cạnh tranh hơn. Trong khi đó, các phòng như Customer Support và HR có phân phối trải rộng hơn, phản ánh sự chênh lệch thu nhập giữa các vị trí trong cùng bộ phận.

4.4. Biểu đồ mối quan hệ giữa tuổi và lương

1. ggplot(Data, aes(x = Age, y = Monthly_Salary, color = Gender)) +
2.   geom_point(alpha = 0.6) +
3.   geom_smooth(method = "lm", se = FALSE, color = "black") +
4.   labs(title = "Mối quan hệ giữa tuổi và lương",
5.        x = "Tuổi", y = "Lương trung bình") +
6.   theme_minimal()

Nhận xét: Dòng 1–2: Vẽ biểu đồ phân tán thể hiện mối quan hệ giữa tuổi và lương tháng, phân biệt theo giới tính bằng màu sắc.
Dòng 3: Thêm đường hồi quy tuyến tính.
Dòng 4–6: Đặt tiêu đề, nhãn trục và áp dụng giao diện tối giản.
Biểu đồ thể hiện điểm rải rác ở nhiều mức lương cố định và đường xu hướng gần như phẳng cho thấy không có mối tương quan tuyến tính đáng kể giữa tuổi và lương. Nói cách khác, tuổi không phải là nhân tố quyết định chính cho thu nhập trong bộ dữ liệu này; nhiều khả năng lương phụ thuộc vào vị trí, hiệu suất hoặc phòng ban hơn là tuổi.

4.5. Biểu đồ phân bố điểm hài lòng theo trạng thái nghỉ việc

1. ggplot(Data, aes(x = Employee_Satisfaction_Score, fill = Resigned)) +
2.   geom_density(alpha = 0.5) +
3.   facet_wrap(~ Resigned) +
4.   labs(title = "Phân bố điểm hài lòng theo trạng thái nghỉ việc",
5.        x = "Điểm hài lòng", y = "Mật độ") +
6.   theme_light()

Nhận xét: Dòng 1: Tạo khung ggplot với trục hoành là Employee_Satisfaction_Score, tô màu theo biến Resigned.
Dòng 2: Vẽ biểu đồ mật độ cho điểm hài lòng, độ trong suốt 0.5.
Dòng 3: Tách biểu đồ theo từng trạng thái nghỉ việc.
Biểu đồ cho thấy nhóm FALSE có độ nhấp nhô lớn hơn, phản ánh mức hài lòng đa dạng hơn giữa các nhân viên ở lại. Ngược lại, nhóm TRUE có đường cong phẳng hơn, cho thấy mức hài lòng của người nghỉ việc khá đồng đều, thường quanh mức trung bình. Điều này gợi ý nhân viên rời đi thường có cảm nhận tương tự nhau về công việc.

4.6. Biểu đồ phân bố tuổi nhân viên

1. ggplot(Data, aes(x = Age)) +
2.   geom_histogram(fill = "skyblue", color = "black", bins = 20) +
3.   geom_vline(aes(xintercept = mean(Age, na.rm = TRUE)),
4.              color = "red", linetype = "dashed", size = 1) +
5.   labs(title = "Phân bố độ tuổi nhân viên",
6.        x = "Tuổi", y = "Số lượng") +
7.   theme_minimal()

Nhận xét: Dòng 1: Khởi tạo ggplot với biến Age trên trục hoành.
Dòng 2: Vẽ biểu đồ histogram với 20 cột, màu cột xanh nhạt và viền đen.
Dòng 3–4: Thêm đường dọc biểu thị giá trị trung bình của tuổi, dạng gạch đứt, màu đỏ.
Biểu đồ cho thấy độ tuổi nhân viên trải rộng từ khoảng 20 đến 60 tuổi, trong đó phần lớn tập trung quanh độ tuổi trung bình khoảng 40 và thấp nhất ở 60 tuổi .Phân bố có dạng tương đối đồng đều, thể hiện rằng công ty có cơ cấu nhân sự đa dạng về độ tuổi.

4.7. Biểu đồ trình độ học vấn của nhân viên

1. data_pie <- Data %>%
2.   group_by(Education_Level) %>%
3.   summarise(n = n(), .groups = "drop")
4. ggplot(data_pie, aes(x = "", y = n, fill = Education_Level)) +
5.   geom_col(width = 1, color = "white") +
6.   coord_polar(theta = "y") +
7.   geom_text(
8.     aes(label = paste0(round(n / sum(n) * 100, 1), "%")),
9.     position = position_stack(vjust = 0.5),
10.     color = "black", size = 4.5, fontface = "bold"
11.   ) +
12.   scale_fill_brewer(palette = "Pastel1") +
13.   labs(
14.     title = "Tỷ lệ trình độ học vấn của nhân viên",
15.     fill = "Trình độ học vấn"
16.   ) +
17.   theme_void(base_size = 14) +
18.   theme(
19.     plot.title = element_text(size = 18, face = "bold", hjust = 0.5),
20.     legend.position = "right",
21.     legend.title = element_text(size = 13),
22.     legend.text = element_text(size = 12)
23.   )

Nhận xét: Dòng 1–3: Tạo bảng tổng hợp số lượng nhân viên theo Education_Level.
Dòng 4: Khởi tạo ggplot với biến phân loại Education_Level, trục x rỗng để phục vụ cho biểu đồ tròn.
Dòng 5: Vẽ các cột biểu diễn tỷ lệ, mỗi cột có màu riêng theo trình độ học vấn. Dòng 6: Chuyển biểu đồ cột sang dạng tròn bằng coord_polar(theta = “y”).
Dòng 7–10: Thêm nhãn phần trăm trên từng lát của biểu đồ.
Dòng 13–16: Thêm tiêu đề và chú thích.
Dòng 17–23: Dùng theme_void() để loại bỏ trục, tùy chỉnh tiêu đề và chú thích.
Biểu đồ cho thấy lực lượng lao động chủ yếu ở mức học vấn phổ thông và đại học. Tỷ lệ Thạc sĩ (14.9%) và Tiến sĩ (5.1%) chiếm phần nhỏ, phản ánh đặc trưng của doanh nghiệp thiên về thực hành hơn nghiên cứu.

4.8. Biểu đồ lương trung bình theo thâm niên

1. data_line <- Data %>%
2.   group_by(Years_At_Company) %>%
3.   summarise(LuongTB = mean(Monthly_Salary, na.rm = TRUE))
4. ggplot(data_line, aes(x = Years_At_Company, y = LuongTB)) +
5.   geom_line(color = "blue", linewidth = 1.2) +
6.   geom_point(size = 2, color = "red") +
7.   labs(title = "Lương trung bình theo thâm niên làm việc",
8.        x = "Số năm làm việc", y = "Lương trung bình") +
9.   theme_minimal()

Nhận xét: Dòng 1–3: Tạo bảng dữ liệu mới, tính lương trung bình (LuongTB) cho từng giá trị của Years_At_Company.
Dòng 4: Khởi tạo biểu đồ với trục x là số năm làm việc, trục y là lương trung bình.
Dòng 5: Vẽ đường thể hiện xu hướng lương trung bình theo thâm niên.
Dòng 6: Thêm các điểm dữ liệu màu đỏ tại mỗi năm.
Biểu đồ cho thấy mức lương trung bình dao động quanh 6.400 và không tăng rõ rệt theo thâm niên. Mặc dù có một vài biến động nhỏ, lương cao nhất ở khoảng 2–3 năm kinh nghiệm ~ 6420 và giảm nhẹ sau 10 năm. Điều này cho thấy có thể do chính sách lương của doanh nghiệp chủ yếu dựa trên vị trí công việc và hiệu suất cá nhân hơn là số năm làm việc.

4.9. Biểu đồ tỉ lệ giới tính trong từng phòng ban

1. data_pie <- Data %>%
2.     group_by(Department, Gender) %>%
3.     summarise(n = n(), .groups = "drop") %>%
4.     group_by(Department) %>%
5.     mutate(percent = n / sum(n) * 100)
6. ggplot(data_pie, aes(x = "", y = percent, fill = Gender)) +
7.     geom_bar(stat = "identity", width = 1, color = "white") +
8.     coord_polar(theta = "y") +
9.     facet_wrap(~ Department) +
10.     scale_fill_brewer(palette = "Pastel1") +
11.     geom_text(aes(label = paste0(round(percent, 1), "%")),
12.               position = position_stack(vjust = 0.5), size = 4) +
13.     labs(
14.         title = "Tỉ lệ giới tính trong từng phòng ban",
15.         fill = "Giới tính"
16.     ) +
17.     theme_void(base_size = 14) +
18.     theme(
19.         plot.title = element_text(size = 18, face = "bold", hjust = 0.5),
20.         strip.text = element_text(size = 12, face = "bold"),
21.         legend.position = "right"
22.     )

Nhận xét: Dòng 1–5: Tạo bảng dữ liệu tóm tắt, đếm số lượng nhân viên theo phòng ban và giới tính, sau đó tính tỷ lệ phần trăm giới tính trong từng phòng ban.
Dòng 6: Khởi tạo biểu đồ với biến percent làm trục y và Gender là màu tô.
Dòng 7: Vẽ các cột thể hiện tỷ lệ giới tính.
Dòng 8: Chuyển biểu đồ cột thành biểu đồ tròn bằng coord_polar().
Dòng 9: Tạo các biểu đồ riêng biệt cho từng phòng ban.
Dòng 11–12: Thêm nhãn phần trăm hiển thị trong từng phần của biểu đồ.
Biểu đồ cho thấy tỷ lệ nam và nữ gần như cân bằng ở tất cả các phòng, dao động quanh mức 47–49%, trong khi giới tính Other chỉ chiếm khoảng 4%. Phòng Legal có tỷ lệ nữ nhỉnh hơn nhẹ còn Engineering có nam chiếm ưu thế hơn. Tổ chức duy trì được sự cân bằng giới tính chủ yếu giữa nam và nữ, còn nhóm giới tính khác vẫn chiếm tỉ lệ rất thấp.

4.10. Biểu đồ trung bình điểm hài lòng theo phòng ban và giới tính

1. data_heat <- Data %>%
2.   group_by(Department, Gender) %>%
3.   summarise(SatMean = mean(Employee_Satisfaction_Score, na.rm = TRUE))
4. ggplot(data_heat, aes(x = Department, y = Gender, fill = SatMean)) +
5.   geom_tile() +
6.   geom_text(aes(label = round(SatMean, 2)), color = "white") +
7.   labs(title = "Điểm hài lòng trung bình theo phòng ban & giới tính",
8.        x = "Phòng ban", y = "Giới tính") +
9.   theme_minimal()

Nhận xét: Dòng 1–3: Tạo bảng dữ liệu trung bình điểm hài lòng nhân viên theo từng phòng ban và giới tính.
Dòng 4: Khởi tạo biểu đồ với phòng ban trên trục x, giới tính trên trục y và màu sắc thể hiện giá trị trung bình.
Dòng 5: Vẽ các ô của biểu đồ nhiệt.
Dòng 6: Hiển thị giá trị trung bình lên từng ô.
Biểu đồ cho thấy mức độ hài lòng giữa các nhóm khá đồng đều, dao động quanh mức 3.0. Nhìn chung, sự khác biệt giữa các giới tính và giữa các phòng ban là không đáng kể, chứng tỏ chính sách và môi trường làm việc của công ty khá công bằng giữa các giới và giữa các phòng ban.

4.11. Biểu đồ mức lương theo phòng ban và trình độ học vấn

1. data_group <- Data %>%
2.     group_by(Department, Education_Level) %>%
3.     summarise(Avg_Salary = mean(Monthly_Salary, na.rm = TRUE),
4.               .groups = "drop")
5. ggplot(data_group, aes(x = Department, y = Avg_Salary, fill = Education_Level)) +
6.     geom_col(position = position_dodge(width = 0.9), color = "gray30", width = 0.7) +
7.     geom_text(aes(label = comma(round(Avg_Salary, 0))),
8.               position = position_dodge(width = 0.9),
9.               angle = 90,       
10.               vjust = 0.5,        
11.               hjust = 1,       
12.               size = 3.8, color = "black") +
13.     scale_fill_brewer(palette = "Pastel1") +
14.     labs(title = "Mức lương trung bình theo phòng ban và trình độ học vấn",
15.          x = "Phòng ban",
16.          y = "Lương trung bình (USD)",
17.          fill = "Trình độ học vấn") +
18.     theme_minimal(base_size = 14) +
19.     theme(
20.         plot.title = element_text(size = 17, face = "bold", hjust = 0.5),
21.         axis.text.x = element_text(angle = 20, hjust = 1, size = 10, face = "bold"),
22.         axis.text.y = element_text(size = 12),
23.         legend.title = element_text(size = 13, face = "bold"),
24.         legend.text = element_text(size = 12),
25.         panel.grid.minor = element_blank()
26.     )

Nhận xét: Dòng 1–4: Tạo bảng dữ liệu trung bình lương tháng theo từng phòng ban và trình độ học vấn.
Dòng 5: Khởi tạo biểu đồ với phòng ban trên trục x, lương trung bình trên trục y và màu sắc biểu diễn trình độ học vấn.
Dòng 6: Vẽ các cột biểu diễn giá trị lương trung bình, đặt chúng cạnh nhau.
Dòng 7–12: Thêm nhãn giá trị lương lên đầu mỗi cột và điều chỉnh vị trí hiển thị.
Dòng 13–26: Thiết lập bảng màu, tiêu đề, nhãn trục, chú thích và định dạng giao diện.
Biểu đồ cho thấy mức lương giữa các phòng ban và trình độ khá đồng đều quanh 6.400 USD, cho thấy tổ chức áp dụng chính sách trả lương tương đối nhất quán. Nhóm PhD trong phòng Sales có mức lương cao nhất (6.552 USD), phản ánh sự ưu tiên cho trình độ cao ở bộ phận kinh doanh. Sự chênh lệch nhỏ giữa các nhóm cho thấy yếu tố học vấn không phải là biến ảnh hưởng mạnh đến lương trong bộ dữ liệu này.

4.12. Biểu đồ số lượng nhân viên theo trình độ và chức danh

1. data_group <- Data %>%
2.   group_by(Education_Level, Job_Title) %>%
3.   summarise(n = n(), .groups = "drop")
4. ggplot(data_group, aes(x = Education_Level, y = n, fill = Job_Title)) +
5.   geom_col(position = position_dodge(width = 0.8), width = 0.7, color = "black", alpha = 0.9) +
6.   geom_text(aes(label = n),
7.             position = position_dodge(width = 0.8),
8.             vjust = -0.4, 
9.             size = 3.2,
10.             fontface = "bold",
11.             color = "black") +
12.   scale_fill_brewer(palette = "Pastel1") +  
13.   labs(title = "Số lượng nhân viên theo trình độ và chức danh",
14.        x = "Trình độ học vấn", 
15.        y = "Số lượng nhân viên",
16.        fill = "Chức danh") +
17.   theme_minimal(base_size = 13) +
18.   theme(
19.     panel.grid.major.x = element_blank(),
20.     panel.grid.minor = element_blank(),
21.     axis.text.x = element_text(angle = 20, hjust = 1, size = 11, face = "bold"),
22.     axis.text.y = element_text(size = 10),
23.     axis.title = element_text(face = "bold"),
24.     plot.title = element_text(face = "bold", hjust = 0.5, size = 15),
25.     legend.position = "top",
26.     legend.title = element_text(face = "bold")
27.   )

Nhận xét: Dòng 1–3: Tính số lượng nhân viên theo từng trình độ học vấn và chức danh công việc.
Dòng 4: Tạo biểu đồ cột với trình độ học vấn trên trục x, số lượng nhân viên trên trục y, và màu sắc biểu diễn chức danh.
Dòng 5: Vẽ các cột đặt cạnh nhau để so sánh giữa các chức danh.
Dòng 6–11: Thêm nhãn số lượng nhân viên lên đầu mỗi cột và chỉnh vị trí, kích thước chữ.
Dòng 12–27: Chọn bảng màu, đặt tiêu đề, tên trục, chú thích và điều chỉnh định dạng hiển thị.
Biểu đồ thể hiện nhóm có bằng Cử nhân chiếm số lượng lớn nhất ở mọi chức danh, dao động quanh 7.000 người/phòng ban, trong khi nhóm PhD ít nhất, chỉ khoảng 700 người/phòng ban. Sự phân bố này phản ánh thực tế rằng nhân sự trình độ cao hơn thường chiếm tỷ lệ nhỏ do yêu cầu chuyên môn đặc thù hoặc vai trò nghiên cứu.

4.13. Biểu đồ tỉ lệ nhân viên làm việc từ xa theo phòng ban

1. ggplot(Data, aes(x = Department, fill = as.factor(Remote_Work_Frequency))) +
2.     geom_bar(position = "fill") +
3.     scale_y_continuous(labels = scales::percent) +
4.     scale_fill_brewer(palette = "Blues") +
5.     theme_classic() +
6.     labs(
7.         title = "Tỉ lệ tần suất làm việc từ xa theo phòng ban",
8.         x = "Phòng ban",
9.         y = "Tỷ lệ (%)",
10.         fill = "Tần suất làm việc từ xa"
11.     ) +
12.     theme(
13.         axis.text.x = element_text(size = 7,face = "bold"),  
14.         axis.text.y = element_text(size = 12),
15.         plot.title = element_text(size = 15, face = "bold", hjust = 0.5),
16.         legend.title = element_text(size = 12, face = "bold"),
17.         legend.text = element_text(size = 11)
18.     )

Nhận xét: Dòng 1: Tạo biểu đồ với phòng ban trên trục x và phần tô màu thể hiện tần suất làm việc từ xa.
Dòng 2: Vẽ biểu đồ cột chồng, chuẩn hóa chiều cao mỗi cột để thể hiện tỷ lệ phần trăm.
Dòng 3–4: Hiển thị trục y dưới dạng phần trăm và chọn bảng màu tông xanh.
Dòng 5–18: Thiết lập giao diện, tiêu đề, tên trục, chú thích và điều chỉnh kích thước, kiểu chữ cho biểu đồ.
Biểu đồ thể hiện tỉ lệ nhân viên làm việc từ xa đồng đều giữa các phòng ban, không có sự khác biệt lớn.

4.14. Phân bố số giờ làm việc mỗi tuần

1. ggplot(Data, aes(x = Work_Hours_Per_Week)) +
2.   geom_histogram(aes(y = ..density..), bins = 20, fill = "lightblue", color = "black") +
3.   geom_density(color = "red", linewidth = 1) +
4.   labs(title = "Phân bố số giờ làm việc mỗi tuần",
5.        x = "Số giờ làm việc", y = "Mật độ") +
6.   theme_light()

Nhận xét: Dòng 1: Khởi tạo biểu đồ với trục x là số giờ làm việc mỗi tuần.
Dòng 2: Vẽ biểu đồ histogram biểu diễn mật độ tần suất của số giờ làm việc.
Dòng 3: Thêm đường mật độ để thể hiện xu hướng phân bố.
Dòng 4–6: Gắn tiêu đề, nhãn trục và áp dụng giao diện sáng.
Biểu đồ cho thấy phần lớn nhân viên làm việc trong khoảng 30–60 giờ/tuần, với mật độ khá đồng đều giữa các nhóm giờ. Đường mật độ màu đỏ tương đối phẳng, chứng tỏ không có sự chênh lệch lớn về thời gian làm việc giữa các nhân viên. Điều này cho thấy công ty có chính sách phân bổ giờ làm việc khá cân bằng, ít xảy ra tình trạng làm việc quá tải hay quá ít giờ.

4.15. Tỷ lệ nhân viên gắn bó theo trình độ học vấn

1. Data %>%
2.   group_by(Education_Level, Stay = ifelse(Resigned == 0, "Còn làm", "Nghỉ việc")) %>%
3.   summarise(SL = n()) %>%
4.   ggplot(aes(x = Education_Level, y = SL, fill = Stay)) +
5.   geom_col(position = "stack", width = 0.7, color = "black", alpha = 0.9) +
6.   geom_text(aes(label = SL),
7.             position = position_stack(vjust = 0.5),
8.             color = "black", size = 3.2, fontface = "bold") +
9.   scale_fill_brewer(palette = "Pastel1") +
10.   labs(
11.     title = "Số lượng nhân viên còn làm & nghỉ việc theo trình độ học vấn",
12.     x = "Trình độ học vấn", y = "Số lượng nhân viên", fill = "Trạng thái"
13.   ) +
14.   theme_minimal(base_size = 13) +
15.   theme(
16.     plot.title = element_text(size = 15, face = "bold", hjust = 0.5),
17.     axis.text.x = element_text(size = 11, face = "bold")
18.   )

Nhận xét: Dòng 1–3: Nhóm dữ liệu theo trình độ học vấn và trạng thái làm việc, tính số lượng nhân viên trong mỗi nhóm.
Dòng 4: Khởi tạo biểu đồ với trục x là trình độ học vấn, trục y là số lượng nhân viên, và tô màu theo trạng thái làm việc.
Dòng 5: Vẽ cột chồng thể hiện tổng số nhân viên còn làm và đã nghỉ việc trong từng trình độ.
Dòng 6–8: Hiển thị nhãn số lượng nhân viên bên trong các cột.
Dòng 9–18: Gán bảng màu, tiêu đề, nhãn trục và tùy chỉnh giao diện.
Biểu đồ thể hiện nhóm Cử nhân chiếm đông nhất với khoảng 50000 người. Nhân viên có bằng PhD ít nhất, chỉ hơn 5000 người, cho thấy trình độ cao đi kèm với số lượng tuyển dụng thấp hơn. Tỷ lệ nghỉ việc ở mọi nhóm khá nhỏ, phản ánh mức độ ổn định nhân sự tương đối trong tổ chức.

4.16. Phân bố số ngày nghỉ ốm theo điểm hiệu suất

1. ggplot(Data, aes(x = Sick_Days, y = as.factor(Performance_Score), fill = as.factor(Performance_Score))) +
2.   geom_density_ridges(alpha = 0.7, scale = 1) +
3.   labs(title = "Phân bố số ngày nghỉ ốm theo điểm hiệu suất",
4.        x = "Số ngày nghỉ ốm trong năm",
5.        y = "Điểm hiệu suất (1-5)",
6.        fill = "Điểm hiệu suất") +
7.   theme_minimal(base_size = 13) +
8.   scale_fill_brewer(palette = "Pastel1")

Nhận xét: Dòng 1: Khởi tạo biểu đồ với trục x là số ngày nghỉ ốm, trục y là điểm hiệu suất, và tô màu theo mức điểm hiệu suất.
Dòng 2: Vẽ biểu đồ density ridge thể hiện phân bố mật độ số ngày nghỉ ốm của từng mức điểm hiệu suất.
Dòng 3–8: Thêm tiêu đề, nhãn trục, chú thích và chỉnh sửa giao diện hiển thị.
Biểu đồ cho thấy số ngày nghỉ ốm không khác biệt rõ giữa nhân viên có hiệu suất cao hay thấp. Phần lớn nhân viên ở mọi mức hiệu suất đều nghỉ ốm trong khoảng 5–10 ngày mỗi năm.

4.17. Lương trung bình theo giới tính và trình độ

1. Data %>%
2.   group_by(Gender, Education_Level) %>%
3.   summarise(LuongTB = mean(Monthly_Salary, na.rm = TRUE)) %>%
4.   ggplot(aes(x = Education_Level, y = Gender, fill = LuongTB)) +
5.   geom_tile() +
6.   geom_text(aes(label = round(LuongTB, 1)), color = "white") +
7.   scale_fill_gradient(low = "skyblue", high = "darkblue") +
8.   labs(title = "Lương trung bình theo giới tính và trình độ học vấn",
9.        x = "Trình độ học vấn", y = "Giới tính") +
10.   theme_minimal()

Nhận xét: Dòng 1–3: Nhóm dữ liệu theo giới tính và trình độ học vấn, tính lương trung bình cho từng nhóm.
Dòng 4: Tạo biểu đồ với trục x là trình độ học vấn, trục y là giới tính, và tô màu theo mức lương trung bình.
Dòng 5: Vẽ ô màu biểu diễn giá trị lương trung bình.
Dòng 6: Hiển thị giá trị lương trung bình làm tròn 1 chữ số thập phân trên từng ô.
Dòng 7–10: Thiết lập dải màu từ nhạt đến đậm, thêm tiêu đề, nhãn trục và giao diện hiển thị.
Mức lương trung bình tăng theo trình độ học vấn phản ánh mối quan hệ tích cực giữa học vấn và thu nhập. Chênh lệch giữa nam và nữ rất nhỏ, nhóm “Other” có lương cao nhất ở bậc Master và PhD, có thể do đảm nhận vị trí chuyên môn hoặc quản lý cao.

4.18. Điểm hài lòng trung bình theo năm thâm niên

1. Data %>%
2.   group_by(Years_At_Company) %>%
3.   summarise(SatMean = mean(Employee_Satisfaction_Score, na.rm = TRUE)) %>%
4.   ggplot(aes(x = Years_At_Company, y = SatMean)) +
5.   geom_line(color = "darkgreen", linewidth = 1.2) +
6.   geom_point(size = 3, color = "red") +
7.   geom_text(aes(label = round(SatMean, 2)), vjust = -0.6) +
8.   labs(title = "Mức độ hài lòng trung bình theo thâm niên",
9.        x = "Số năm làm việc", y = "Điểm hài lòng TB") +
10.   theme_minimal()

Nhận xét: Dòng 1–3: Nhóm dữ liệu theo số năm làm việc, tính điểm hài lòng trung bình cho từng nhóm.
Dòng 4: Tạo biểu đồ với trục x là số năm làm việc, trục y là điểm hài lòng trung bình.
Dòng 5: Vẽ đường nối biểu diễn xu hướng thay đổi của điểm hài lòng theo thâm niên.
Dòng 6: Thêm các điểm dữ liệu màu đỏ trên đường.
Dòng 7: Ghi nhãn giá trị trung bình trên từng điểm.
Dòng 8–10: Đặt tiêu đề, nhãn trục và dùng giao diện tối giản.
Mức độ hài lòng trung bình của nhân viên duy trì khá ổn định quanh mức 3 điểm trong suốt 9 năm đầu làm việc. Tuy nhiên, đến năm thứ 10 điểm hài lòng giảm rõ rệt xuống còn 2.8, có thể phản ánh tình trạng mệt mỏi, thiếu động lực hoặc mong muốn thay đổi công việc sau thời gian dài gắn bó. Điều này gợi ý rằng doanh nghiệp nên chú trọng các chính sách giữ chân và tạo động lực cho nhóm nhân viên kỳ cựu như cơ hội thăng tiến, đào tạo nâng cao hay chế độ đãi ngộ tốt hơn.

4.19. Biểu đồ tỷ lệ nhân viên của từng phòng ban theo số lần thăng chức

1. promotions_by_dept <- Data %>%
2.   group_by(Department, Promotions) %>%
3.   summarise(count = n(), .groups = "drop") %>%
4.   group_by(Department) %>%
5.   mutate(percent = count / sum(count))
6. ggplot(promotions_by_dept, aes(x = "", y = percent, fill = as.factor(Promotions))) +
7.   geom_col(width = 1, color = "white") +
8.   coord_polar(theta = "y") +
9.   facet_wrap(~Department) +
10.   scale_fill_brewer(palette = "Pastel2", name = "Số lần thăng chức") +
11.   geom_text(aes(label = paste0(round(percent*100,1), "%")), 
12.             position = position_stack(vjust = 0.5), size = 3) +
13.   labs(title = "Tỷ lệ nhân viên theo số lần thăng chức",
14.        x = NULL, y = NULL) +
15.   theme_void(base_size = 13) +
16.   theme(strip.text = element_text(size = 11))

Nhận xét: Dòng 1–5: Nhóm dữ liệu theo phòng ban và số lần thăng chức, đếm số lượng nhân viên trong mỗi nhóm rồi tính tỷ lệ phần trăm trong từng phòng ban.
Dòng 6: Khởi tạo biểu đồ, trục y biểu diễn tỷ lệ phần trăm, chia theo số lần thăng chức.
Dòng 7: Vẽ các cột tròn làm nền cho biểu đồ tròn.
Dòng 8: Dùng hệ tọa độ cực để tạo biểu đồ hình tròn.
Dòng 9: Tách biểu đồ thành nhiều ô nhỏ theo từng phòng ban.
Dòng 10: Chọn bảng màu “Pastel2” và đặt tiêu đề chú giải.
Dòng 11–12: Thêm nhãn phần trăm hiển thị giữa các lát cắt.
Dòng 13–16: Thêm tiêu đề, ẩn trục, áp dụng theme tối giản và chỉnh kích thước chữ cho tiêu đề từng ô.
Biểu đồ cho thấy tỷ lệ nhân viên theo số lần thăng chức ở các phòng ban gần như tương đương nhau, không có phòng ban nào nổi bật vượt trội về số lần thăng chức của nhân viên.

4.20. Mức độ hài lòng theo tần suất làm việc từ xa

1. Data %>%
2.   group_by(Remote_Work_Frequency) %>%
3.   summarise(Sat = mean(Employee_Satisfaction_Score, na.rm = TRUE)) %>%
4.   ggplot(aes(x = factor(Remote_Work_Frequency), y = Sat, fill = factor(Remote_Work_Frequency))) +
5.   geom_col(width = 0.7) +
6.   geom_text(aes(label = round(Sat, 2)), vjust = -0.3, size = 3) +
7.   scale_fill_brewer(palette = "Pastel1") +   
8.   labs(title = "Mức độ hài lòng trung bình theo tần suất làm việc từ xa",
9.        x = "Tần suất làm việc từ xa", y = "Điểm hài lòng trung bình") +
10.   theme_minimal(base_size = 13) +
11.   theme(legend.position = "none")

Nhận xét: Dòng 1–3: Nhóm dữ liệu theo tần suất làm việc từ xa và tính điểm hài lòng trung bình cho từng nhóm.
Dòng 4: Khởi tạo biểu đồ cột, trục x là tần suất làm việc từ xa, trục y là điểm hài lòng trung bình, tô màu theo từng nhóm tần suất.
Dòng 5: Vẽ các cột với chiều rộng 0.7.
Dòng 6: Thêm nhãn giá trị trung bình trên đỉnh mỗi cột.
Biểu đồ cho thấy mức độ hài lòng trung bình của nhân viên gần như không thay đổi theo tần suất làm việc từ xa. Dù làm tại văn phòng hoàn toàn hay làm việc từ xa 100%, điểm hài lòng đều quanh mức 3. Các yếu tố khác có thể đóng vai trò quan trọng hơn trong trải nghiệm của nhân viên.

1. options(repos = c(CRAN = "https://cloud.r-project.org"))
2. packages <- c("ggplot2", "ggridges", "skimr", "dplyr", "janitor", "readxl")
3. to_install <- packages[!(packages %in% installed.packages()[,"Package"])]
4. if(length(to_install)) install.packages(to_install)
5. lapply(packages, library, character.only = TRUE)
## [[1]]
##  [1] "janitor"    "scales"     "corrplot"   "stringr"    "ggplot2"   
##  [6] "skimr"      "moments"    "psych"      "ggridges"   "dplyr"     
## [11] "knitr"      "kableExtra" "readxl"     "stats"      "graphics"  
## [16] "grDevices"  "utils"      "datasets"   "methods"    "base"      
## 
## [[2]]
##  [1] "janitor"    "scales"     "corrplot"   "stringr"    "ggplot2"   
##  [6] "skimr"      "moments"    "psych"      "ggridges"   "dplyr"     
## [11] "knitr"      "kableExtra" "readxl"     "stats"      "graphics"  
## [16] "grDevices"  "utils"      "datasets"   "methods"    "base"      
## 
## [[3]]
##  [1] "janitor"    "scales"     "corrplot"   "stringr"    "ggplot2"   
##  [6] "skimr"      "moments"    "psych"      "ggridges"   "dplyr"     
## [11] "knitr"      "kableExtra" "readxl"     "stats"      "graphics"  
## [16] "grDevices"  "utils"      "datasets"   "methods"    "base"      
## 
## [[4]]
##  [1] "janitor"    "scales"     "corrplot"   "stringr"    "ggplot2"   
##  [6] "skimr"      "moments"    "psych"      "ggridges"   "dplyr"     
## [11] "knitr"      "kableExtra" "readxl"     "stats"      "graphics"  
## [16] "grDevices"  "utils"      "datasets"   "methods"    "base"      
## 
## [[5]]
##  [1] "janitor"    "scales"     "corrplot"   "stringr"    "ggplot2"   
##  [6] "skimr"      "moments"    "psych"      "ggridges"   "dplyr"     
## [11] "knitr"      "kableExtra" "readxl"     "stats"      "graphics"  
## [16] "grDevices"  "utils"      "datasets"   "methods"    "base"      
## 
## [[6]]
##  [1] "janitor"    "scales"     "corrplot"   "stringr"    "ggplot2"   
##  [6] "skimr"      "moments"    "psych"      "ggridges"   "dplyr"     
## [11] "knitr"      "kableExtra" "readxl"     "stats"      "graphics"  
## [16] "grDevices"  "utils"      "datasets"   "methods"    "base"
1. dataDBC <- dataDBC %>%
2.      rename(Date = date)

CHƯƠNG 2: PHÂN TÍCH DỮ LIỆU MÃ CHỨNG KHOÁN DBC

Bộ dữ liệu Báo cáo tài chính của Công ty Cổ phần Tập đoàn Dabaco Việt Nam (DBC) được thu thập từ trang web “dabaco.com.vn” và các báo cáo tài chính hợp nhất hằng năm của doanh nghiệp, bao gồm các biến tài chính quan trọng được ghi nhận trong giai đoạn 10 năm, từ năm 2015 đến 2024.
Các biến được chia thành nhiều nhóm chính: Quy mô như Tổng cộng nguồn vốn, Tổng nợ phải trả, Cơ cấu vốn như Vốn chủ sở hữu, Vốn góp của chủ sở hữu, Thặng dư vốn cổ phần, Hiệu quả hoạt động như Lợi nhuận sau thuế chưa phân phối, Quỹ đầu tư phát triển và Nghĩa vụ tài chính ngắn hạn – dài hạn như Nợ ngắn hạn, Nợ dài hạn, Thuế và các khoản phải nộp Nhà nước, Phải trả người lao động, Chi phí phải trả ngắn hạn, Quỹ khen thưởng phúc lợi.
Đây là bộ dữ liệu toàn diện, phản ánh đầy đủ tình hình tài chính và biến động hoạt động của Dabaco trong hơn một thập kỷ. Thông qua đó, có thể phân tích xu hướng tăng trưởng, đánh giá khả năng sinh lời và an toàn tài chính, cũng như nhận diện chiến lược đầu tư – mở rộng quy mô của doanh nghiệp trong bối cảnh ngành nông nghiệp – thực phẩm – bất động sản tại Việt Nam có nhiều thay đổi.

I. GIỚI THIỆU VỀ BỘ DỮ LIỆU

1.1. Đọc dữ liệu

1. data <- read_excel("D:/NNLT/dataDBC.xlsx")

Nhận xét: hàm read_excel() cho phép đọc dữ liệu từ tệp Excel có tên “dataDBC.xlsx” và lưu vào đối tượng data trong R.

1.2. Số dòng và số cột

1. dim(dataDBC)
## [1] 10 18

Nhận xét: Lệnh dim(dataDBC) xác định bộ dữ liệu có 10 quan sát và 18 biến.

1.3. Tên các biến

1. names(dataDBC)
##  [1] "Date"                                "no_phai_tra"                        
##  [3] "no_ngan_han"                         "phai_tra_nguoi_ban_ngan_han"        
##  [5] "nguoi_mua_tra_tien_truoc_ngan_han"   "thue_va_cac_khoan_phai_nop_nha_nuoc"
##  [7] "phai_tra_nguoi_lao_dong"             "chi_phi_phai_tra_ngan_han"          
##  [9] "phai_tra_ngan_han_khac"              "vay_va_no_thue_tai_chinh_ngan_han"  
## [11] "quy_khen_thuong_phuc_loi"            "no_dai_han"                         
## [13] "von_chu_so_huu"                      "von_gop_cua_chu_so_huu"             
## [15] "thang_du_von_co_phan"                "quy_dau_tu_phat_trien"              
## [17] "loi_nhuan_sau_thue_chua_phan_phoi"   "tong_cong_nguon_von"

Nhận xét: Lệnh names(dataDBC) giúp liệt kê toàn bộ tên các biến trong bộ dữ liệu. Kết quả cho thấy dữ liệu của Công ty Cổ phần Tập đoàn Dabaco Việt Nam gồm 18 biến phản ánh các chỉ tiêu tài chính quan trọng như nợ phải trả, vốn chủ sở hữu, quỹ đầu tư phát triển và lợi nhuận sau thuế. Các biến này bao quát cả cơ cấu nguồn vốn và kết quả kinh doanh, giúp phân tích được tình hình tài chính và hiệu quả hoạt động của doanh nghiệp qua các năm.

1.4. Kiểm tra kiểu dữ liệu từng biến

1. str(data)
## tibble [10 × 18] (S3: tbl_df/tbl/data.frame)
##  $ Date                               : num [1:10] 2024 2023 2022 2021 2020 ...
##  $ NỢ PHẢI TRẢ                        : num [1:10] 7.36e+12 8.35e+12 8.33e+12 6.18e+12 5.89e+12 ...
##  $ Nợ ngắn hạn                        : num [1:10] 6.42e+12 7.14e+12 7.21e+12 5.17e+12 4.25e+12 ...
##  $ Phải trả người bán ngắn hạn        : num [1:10] 7.63e+11 7.96e+11 2.13e+12 1.39e+12 1.01e+12 ...
##  $ Người mua trả tiền trước ngắn hạn  : num [1:10] 2.07e+11 2.21e+11 8.87e+11 5.88e+11 5.52e+11 ...
##  $ Thuế và các khoản phải nộp Nhà nước: num [1:10] 1.00e+11 3.25e+10 4.54e+10 7.96e+10 1.39e+11 ...
##  $ Phải trả người lao động            : num [1:10] 8.63e+10 7.63e+10 6.49e+10 1.09e+11 1.07e+11 ...
##  $ Chi phí phải trả ngắn hạn          : num [1:10] 5.31e+10 1.04e+11 6.45e+10 7.65e+10 6.35e+10 ...
##  $ Phải trả ngắn hạn khác             : num [1:10] 2.69e+11 1.04e+12 2.21e+11 2.38e+11 2.00e+11 ...
##  $ Vay và nợ thuê tài chính ngắn hạn  : num [1:10] 4.93e+12 4.84e+12 3.70e+12 2.60e+12 2.16e+12 ...
##  $ Quỹ khen thưởng, phúc lợi          : num [1:10] 1.35e+10 3.34e+10 9.55e+10 8.97e+10 2.21e+10 ...
##  $ Nợ dài hạn                         : num [1:10] 9.35e+11 1.20e+12 1.12e+12 1.00e+12 1.64e+12 ...
##  $ VỐN CHỦ SỞ HỮU                     : num [1:10] 6.77e+12 4.67e+12 4.64e+12 4.69e+12 4.21e+12 ...
##  $ Vốn góp của chủ sở hữu             : num [1:10] 3.35e+12 2.42e+12 2.42e+12 1.15e+12 1.05e+12 ...
##  $ Thặng dư vốn cổ phần               : num [1:10] 8.22e+11 4.18e+11 4.18e+11 4.18e+11 4.18e+11 ...
##  $ Quỹ đầu tư phát triển              : num [1:10] 1.82e+12 1.80e+12 1.79e+12 2.52e+12 1.50e+12 ...
##  $ Lợi nhuận sau thuế chưa phân phối  : num [1:10] 7.72e+11 2.79e+10 8.10e+09 5.95e+11 1.24e+12 ...
##  $ TỔNG CỘNG NGUỒN VỐN                : num [1:10] 1.41e+13 1.30e+13 1.30e+13 1.09e+13 1.01e+13 ...

Nhận xét: Lệnh str(data) giúp xem cấu trúc tổng thể của bộ dữ liệu, bao gồm số lượng quan sát, số biến và kiểu dữ liệu của từng biến. Kết quả cho thấy dữ liệu của Dabaco gồm 10 quan sát và 18 biến, chủ yếu ở dạng số. Điều này cho thấy dữ liệu đã được chuẩn hóa tốt, thuận tiện cho việc xử lý và phân tích thống kê. Các biến thể hiện rõ các chỉ tiêu tài chính trọng yếu như Nợ phải trả, Nợ ngắn hạn, Vốn chủ sở hữu, Lợi nhuận sau thuế, Tổng nguồn vốn,… phản ánh đầy đủ tình hình tài chính, khả năng thanh toán và mức độ tăng trưởng vốn của Dabaco qua từng năm.

1.5. Xem trước dữ liệu

1. head(data)

Nhận xét: Lệnh head(data) giúp hiển thị 6 dòng đầu tiên của bộ dữ liệu, nhằm quan sát sơ bộ cấu trúc và giá trị các biến. Kết quả cho thấy dữ liệu bắt đầu từ năm 2019 đến 2024, gồm nhiều chỉ tiêu tài chính quan trọng như Nợ phải trả, Nợ ngắn hạn, Phải trả người bán ngắn hạn,… Các con số lớn được thể hiện ở đơn vị đồng Việt Nam, phản ánh quy mô tài chính rất lớn của Dabaco. Từ đó có thể thấy trong những năm gần đây, nợ phải trả và nợ ngắn hạn chiếm tỷ trọng đáng kể, cho thấy doanh nghiệp có mức vay nợ cao — điều này vừa thể hiện khả năng huy động vốn linh hoạt, vừa tiềm ẩn rủi ro tài chính nếu dòng tiền không ổn định.

1.6. Tóm tắt thống kê cơ bản

1. summary(data)
##       Date       NỢ PHẢI TRẢ         Nợ ngắn hạn       
##  Min.   :2015   Min.   :2.669e+12   Min.   :2.411e+12  
##  1st Qu.:2017   1st Qu.:4.766e+12   1st Qu.:3.616e+12  
##  Median :2020   Median :6.035e+12   Median :4.537e+12  
##  Mean   :2020   Mean   :5.862e+12   Mean   :4.760e+12  
##  3rd Qu.:2022   3rd Qu.:7.158e+12   3rd Qu.:6.108e+12  
##  Max.   :2024   Max.   :8.345e+12   Max.   :7.213e+12  
##  Phải trả người bán ngắn hạn Người mua trả tiền trước ngắn hạn
##  Min.   :3.185e+11           Min.   :9.449e+10                
##  1st Qu.:6.138e+11           1st Qu.:1.618e+11                
##  Median :8.535e+11           Median :2.144e+11                
##  Mean   :9.343e+11           Mean   :3.446e+11                
##  3rd Qu.:9.899e+11           3rd Qu.:5.162e+11                
##  Max.   :2.129e+12           Max.   :8.875e+11                
##  Thuế và các khoản phải nộp Nhà nước Phải trả người lao động
##  Min.   :1.695e+10                   Min.   :3.633e+10      
##  1st Qu.:3.081e+10                   1st Qu.:6.000e+10      
##  Median :4.427e+10                   Median :6.643e+10      
##  Mean   :5.811e+10                   Mean   :7.203e+10      
##  3rd Qu.:7.593e+10                   3rd Qu.:8.378e+10      
##  Max.   :1.395e+11                   Max.   :1.085e+11      
##  Chi phí phải trả ngắn hạn Phải trả ngắn hạn khác
##  Min.   :2.873e+10         Min.   :3.190e+10     
##  1st Qu.:5.088e+10         1st Qu.:1.690e+11     
##  Median :6.401e+10         Median :2.280e+11     
##  Mean   :6.800e+10         Mean   :2.693e+11     
##  3rd Qu.:8.902e+10         3rd Qu.:2.421e+11     
##  Max.   :1.044e+11         Max.   :1.037e+12     
##  Vay và nợ thuê tài chính ngắn hạn Quỹ khen thưởng, phúc lợi
##  Min.   :1.510e+12                 Min.   :1.352e+10        
##  1st Qu.:2.192e+12                 1st Qu.:1.803e+10        
##  Median :2.655e+12                 Median :2.775e+10        
##  Mean   :2.974e+12                 Mean   :3.949e+10        
##  3rd Qu.:3.588e+12                 3rd Qu.:4.549e+10        
##  Max.   :4.928e+12                 Max.   :9.553e+10        
##    Nợ dài hạn        VỐN CHỦ SỞ HỮU      Vốn góp của chủ sở hữu
##  Min.   :2.578e+11   Min.   :1.946e+12   Min.   :6.274e+11     
##  1st Qu.:9.523e+11   1st Qu.:2.564e+12   1st Qu.:8.282e+11     
##  Median :1.072e+12   Median :3.616e+12   Median :9.793e+11     
##  Mean   :1.102e+12   Mean   :3.753e+12   Mean   :1.433e+12     
##  3rd Qu.:1.447e+12   3rd Qu.:4.660e+12   3rd Qu.:2.103e+12     
##  Max.   :1.746e+12   Max.   :6.766e+12   Max.   :3.347e+12     
##  Thặng dư vốn cổ phần Quỹ đầu tư phát triển Lợi nhuận sau thuế chưa phân phối
##  Min.   :4.184e+11    Min.   :6.791e+11     Min.   :8.098e+09                
##  1st Qu.:4.184e+11    1st Qu.:1.078e+12     1st Qu.:2.042e+11                
##  Median :4.184e+11    Median :1.423e+12     Median :3.542e+11                
##  Mean   :4.587e+11    Mean   :1.441e+12     Mean   :4.190e+11                
##  3rd Qu.:4.184e+11    3rd Qu.:1.799e+12     3rd Qu.:5.503e+11                
##  Max.   :8.215e+11    Max.   :2.520e+12     Max.   :1.243e+12                
##  TỔNG CỘNG NGUỒN VỐN
##  Min.   :4.615e+12  
##  1st Qu.:7.329e+12  
##  Median :9.847e+12  
##  Mean   :9.615e+12  
##  3rd Qu.:1.245e+13  
##  Max.   :1.412e+13

Nhận xét: Lệnh summary(data) giúp mô tả thống kê cơ bản của toàn bộ bộ dữ liệu, bao gồm giá trị nhỏ nhất, lớn nhất, trung vị, trung bình và các tứ phân vị. Kết quả cho thấy dữ liệu tài chính của Dabaco trải dài từ năm 2015 đến 2024, các biến như “NỢ PHẢI TRẢ” và “Nợ ngắn hạn” có giá trị trung bình lần lượt khoảng 5,86 nghìn tỷ đồng và 4,76 nghìn tỷ đồng, cho thấy mức độ vay nợ khá cao của doanh nghiệp. Trong khi đó, “VỐN CHỦ SỞ HỮU” trung bình đạt khoảng 3,75 nghìn tỷ đồng, thể hiện quy mô vốn tự có tương đối ổn định. Qua thống kê, có thể thấy tổng nguồn vốn của Dabaco tăng dần qua các năm, đạt mức tối đa hơn 14 nghìn tỷ đồng vào năm gần đây, phản ánh sự mở rộng về quy mô và đầu tư. Tuy nhiên, mức nợ ngắn hạn cao cũng cho thấy áp lực tài chính ngắn hạn, đòi hỏi công ty phải quản lý dòng tiền và cơ cấu vốn hợp lý để duy trì khả năng thanh toán và hiệu quả sử dụng vốn.

1.7. Kiểm tra giá trị thiếu

1. colSums(is.na(data))
##                                Date                         NỢ PHẢI TRẢ 
##                                   0                                   0 
##                         Nợ ngắn hạn         Phải trả người bán ngắn hạn 
##                                   0                                   0 
##   Người mua trả tiền trước ngắn hạn Thuế và các khoản phải nộp Nhà nước 
##                                   0                                   0 
##             Phải trả người lao động           Chi phí phải trả ngắn hạn 
##                                   0                                   0 
##              Phải trả ngắn hạn khác   Vay và nợ thuê tài chính ngắn hạn 
##                                   0                                   0 
##           Quỹ khen thưởng, phúc lợi                          Nợ dài hạn 
##                                   0                                   0 
##                      VỐN CHỦ SỞ HỮU              Vốn góp của chủ sở hữu 
##                                   0                                   0 
##                Thặng dư vốn cổ phần               Quỹ đầu tư phát triển 
##                                   0                                   0 
##   Lợi nhuận sau thuế chưa phân phối                 TỔNG CỘNG NGUỒN VỐN 
##                                   0                                   0

Nhận xét: Kết quả của lệnh colSums(is.na(data)) cho thấy không có giá trị bị thiếu trong bất kỳ biến nào của bộ dữ liệu tài chính Dabaco.

1.8. Kiểm tra giá trị trùng lặp

1. sum(duplicated(data))
## [1] 0

Nhận xét: Kết quả của lệnh sum(duplicated(data)) trả về 0, cho thấy không có dòng dữ liệu nào bị trùng lặp trong bộ dữ liệu tài chính của Dabaco.
### 1.9. Xác định phạm vi thời gian

1. nam_bat_dau <- min(dataDBC$Date, na.rm = TRUE)
2. nam_ket_thuc <- max(dataDBC$Date, na.rm = TRUE)
3. cat("Phạm vi thời gian của bộ dữ liệu từ năm", nam_bat_dau, "đến năm", nam_ket_thuc, "\n")
## Phạm vi thời gian của bộ dữ liệu từ năm 2015 đến năm 2024

1.10. Phân loại biến theo nhóm

1. phan_loai_bien <- data.frame(
2. Nhom = c(
3. rep("NỢ PHẢI TRẢ - NỢ NGẮN HẠN", 8),
4. rep("NỢ PHẢI TRẢ - NỢ DÀI HẠN", 1),
5. rep("VỐN CHỦ SỞ HỮU", 5),
6. "TỔNG CỘNG NGUỒN VỐN"
7. ),
8. Bien = c(
9. "no_phai_tra",
10. "no_ngan_han",
11. "phai_tra_nguoi_ban_ngan_han",
12. "nguoi_mua_tra_tien_truoc_ngan_han",
13. "thue_va_cac_khoan_phai_nop_nha_nuoc",
14. "phai_tra_nguoi_lao_dong",
15. "chi_phi_phai_tra_ngan_han",
16. "phai_tra_ngan_han_khac",
17. "no_dai_han",
18. "von_chu_so_huu",
19. "von_gop_cua_chu_so_huu",
20. "thang_du_von_co_phan",
21. "quy_dau_tu_phat_trien",
22. "loi_nhuan_sau_thue_chua_phan_phoi",
23. "tong_cong_nguon_von"
24. )
25. )
26. print(phan_loai_bien)
##                         Nhom                                Bien
## 1  NỢ PHẢI TRẢ - NỢ NGẮN HẠN                         no_phai_tra
## 2  NỢ PHẢI TRẢ - NỢ NGẮN HẠN                         no_ngan_han
## 3  NỢ PHẢI TRẢ - NỢ NGẮN HẠN         phai_tra_nguoi_ban_ngan_han
## 4  NỢ PHẢI TRẢ - NỢ NGẮN HẠN   nguoi_mua_tra_tien_truoc_ngan_han
## 5  NỢ PHẢI TRẢ - NỢ NGẮN HẠN thue_va_cac_khoan_phai_nop_nha_nuoc
## 6  NỢ PHẢI TRẢ - NỢ NGẮN HẠN             phai_tra_nguoi_lao_dong
## 7  NỢ PHẢI TRẢ - NỢ NGẮN HẠN           chi_phi_phai_tra_ngan_han
## 8  NỢ PHẢI TRẢ - NỢ NGẮN HẠN              phai_tra_ngan_han_khac
## 9   NỢ PHẢI TRẢ - NỢ DÀI HẠN                          no_dai_han
## 10            VỐN CHỦ SỞ HỮU                      von_chu_so_huu
## 11            VỐN CHỦ SỞ HỮU              von_gop_cua_chu_so_huu
## 12            VỐN CHỦ SỞ HỮU                thang_du_von_co_phan
## 13            VỐN CHỦ SỞ HỮU               quy_dau_tu_phat_trien
## 14            VỐN CHỦ SỞ HỮU   loi_nhuan_sau_thue_chua_phan_phoi
## 15       TỔNG CỘNG NGUỒN VỐN                 tong_cong_nguon_von

Nhận xét: Phân loại các biến tài chính của Công ty Cổ phần Tập đoàn Dabaco Việt Nam thành từng nhóm theo đặc điểm kinh tế của chúng. Cụ thể, các chỉ tiêu được chia thành ba nhóm chính gồm: “Nợ phải trả – Nợ ngắn hạn và Nợ dài hạn”, “Vốn chủ sở hữu” và “Tổng cộng nguồn vốn”.

II. XỬ LÝ DỮ LIỆU

2.1 Chuẩn hóa tên cột

1. dataDBC <- clean_names(dataDBC)

Nhận xét: Lệnh dataDBC <- clean_names(dataDBC) sẽ tự động chuyển tên các cột về dạng chữ thường, không dấu, thay khoảng trắng và ký tự đặc biệt bằng dấu gạch dưới.

2.2. Đổi dữ liệu sang numeric

1. dataDBC$`loi_nhuan_sau_thue_chua_phan_phoi` <- 
2.   as.numeric(dataDBC$`loi_nhuan_sau_thue_chua_phan_phoi`)

2.3. Kiểm tra và xử lý giá trị ngoại lai

1. for (b in c("no_phai_tra", "von_chu_so_huu", "tong_cong_nguon_von")) {
2.   boxplot(dataDBC[[b]], main = paste("Kiểm tra ngoại lai -", b))
3.   print(summary(dataDBC[[b]]))
4. }

##      Min.   1st Qu.    Median      Mean   3rd Qu.      Max. 
## 2.669e+12 4.766e+12 6.035e+12 5.862e+12 7.158e+12 8.345e+12

##      Min.   1st Qu.    Median      Mean   3rd Qu.      Max. 
## 1.946e+12 2.564e+12 3.616e+12 3.753e+12 4.660e+12 6.766e+12

##      Min.   1st Qu.    Median      Mean   3rd Qu.      Max. 
## 4.615e+12 7.329e+12 9.847e+12 9.615e+12 1.245e+13 1.412e+13

Nhận xét: kiểm tra giá trị ngoại lai và xem phân bố dữ liệu của ba biến: nợ phải trả, vốn chủ sở hữu và tổng nguồn vốn thông qua biểu đồ hộp và bảng tóm tắt thống kê.
Kết quả cho thấy các giá trị của ba biến đều ở mức hàng nghìn tỷ đồng, phản ánh quy mô tài sản và vốn lớn của Dabaco. Sự chênh lệch giữa giá trị trung vị và giá trị cực đại gợi ý rằng có thể tồn tại biến động tài chính hoặc tăng trưởng đột biến trong một số giai đoạn, cho thấy Dabaco có thể đã mở rộng hoạt động hoặc huy động vốn đáng kể trong thời gian phân tích.

2.4. Chuẩn hóa đơn vị

1. dataDBC <- dataDBC %>%
2. mutate(across(
3. .cols = -date,
4. .fns = ~ round(.x / 1e9, 3)
5. ))
6. head(dataDBC)

Nhận xét: chuẩn hóa dữ liệu của Dabaco bằng cách chuyển các giá trị tài chính từ đơn vị đồng sang tỷ đồng và làm tròn ba chữ số thập phân.

2.5. Chuẩn hóa thời gian

1. dataDBC$date <- as.numeric(dataDBC$date)

2.6. Sắp xếp theo thời gian

1. dataDBC <- dataDBC[order(dataDBC$date), ]

Nhận xét: Dữ liệu được sắp xếp tăng dần từ năm 2015 đến năm 2024.

2.7. Chuẩn hóa tên ngắn gọn

1. dataDBC <- data %>%
2.   rename(
3.     date = Date,
4.     no_phai_tra = `NỢ PHẢI TRẢ`,
5.     no_ngan_han = `Nợ ngắn hạn`,
6.     phai_tra_nb_nh = `Phải trả người bán ngắn hạn`,
7.     nguoi_mua_tra_truoc = `Người mua trả tiền trước ngắn hạn`,
8.     thue_phai_nop = `Thuế và các khoản phải nộp Nhà nước`,
9.     phai_tra_nld = `Phải trả người lao động`,
10.     chi_phi_phai_tra_nh = `Chi phí phải trả ngắn hạn`,
11.     phai_tra_khac = `Phải trả ngắn hạn khác`,
12.     vay_nh = `Vay và nợ thuê tài chính ngắn hạn`,
13.     quy_khen_thuong = `Quỹ khen thưởng, phúc lợi`,
14.     no_dai_han = `Nợ dài hạn`,
15.     von_csh = `VỐN CHỦ SỞ HỮU`,
16.     von_gop = `Vốn góp của chủ sở hữu`,
17.     thang_du_vcp = `Thặng dư vốn cổ phần`,
18.     quy_dtpt = `Quỹ đầu tư phát triển`,
19.     ln_sau_thue = `Lợi nhuận sau thuế chưa phân phối`,
20.     tong_nguon_von = `TỔNG CỘNG NGUỒN VỐN`
21.   )

2.8. Tạo biến mới: tốc độ tăng trưởng lợi nhuận

1. dataDBC <- dataDBC %>%
2.     arrange(date) %>%
3.     mutate(
4.         tang_truong_ln = (ln_sau_thue - lag(ln_sau_thue)) / lag(ln_sau_thue) * 100
5.     )

Nhận xét: sắp xếp dữ liệu theo thứ tự thời gian và tính tốc độ tăng trưởng lợi nhuận sau thuế (%) qua từng kỳ bằng cách so sánh lợi nhuận hiện tại với kỳ liền trước. Chỉ tiêu này giúp đánh giá hiệu quả kinh doanh và xu hướng lợi nhuận của Dabaco theo thời gian.

2.9. Tạo giai đoạn

1. dataDBC <- clean_names(dataDBC)
2. dataDBC <- dataDBC %>%
3.   mutate(
4.     date = as.numeric(date)
5.   )
6. dataDBC <- dataDBC %>%
7.   mutate(
8.     giai_doan = ifelse(date < 2020, "2015–2019", "2020–2024")
9.   )

Nhận xét: chuẩn hóa lại tên các biến trong bảng dữ liệu, chuyển cột date sang dạng số và tạo thêm biến mới giai_doan để chia dữ liệu thành hai khoảng thời gian: 2015–2019 và 2020–2024. Việc tách giai đoạn như vậy đặc biệt hữu ích để đánh giá tác động của các yếu tố kinh tế như dịch COVID-19 hay biến động thị trường đến hoạt động kinh doanh của doanh nghiệp.

2.10. Thêm cột tỷ lệ nợ/Vốn chủ sở hữu

1. dataDBC <- dataDBC %>%
2.   mutate(ty_le_no_von = no_phai_tra / von_csh)

Nhận xét: tạo thêm biến ty_le_no_von, được tính bằng cách lấy nợ phải trả chia cho vốn chủ sở hữu, nhằm phản ánh mức độ đòn bẩy tài chính của Dabaco.

III. THỐNG KÊ CƠ BẢN

3.1. Thống kê mô tả cơ bản

1. describe(select(dataDBC, -date))

Nhận xét: tóm tắt thống kê mô tả cho tất cả các biến trong bộ dữ liệu. Kết quả trả về bao gồm các chỉ số như giá trị trung bình, độ lệch chuẩn, giá trị nhỏ nhất, lớn nhất …

3.2. Tỷ lệ tăng trưởng trung bình hàng năm

1. mean(dataDBC$tang_truong_ln, na.rm = TRUE)
## [1] 347.788

Nhận xét: Kết quả cho thấy tốc độ tăng trưởng lợi nhuận sau thuế trung bình của Dabaco đạt khoảng 359,13%, tức là lợi nhuận bình quân mỗi kỳ tăng hơn ba lần so với kỳ trước. Đây là mức tăng trưởng rất cao, phản ánh giai đoạn công ty có sự bứt phá mạnh về hiệu quả kinh doanh, có thể nhờ mở rộng quy mô, cải thiện biên lợi nhuận hoặc hưởng lợi từ biến động thị trường thuận lợi. Tuy nhiên, mức tăng đột biến như vậy cũng cho thấy biến động lợi nhuận lớn, cần xem xét thêm sự ổn định và tính bền vững của kết quả này trong các năm tiếp theo.

3.3. Tương quan giữa lợi nhuận và vốn chủ sở hữu

1. cor_ln_von <- cor(dataDBC$ln_sau_thue, dataDBC$von_csh, use = "complete.obs")
2. cor_ln_von
## [1] 0.3243588

Nhận xét: Kết quả cho thấy hệ số tương quan giữa lợi nhuận sau thuế và vốn chủ sở hữu của Dabaco là khoảng 0,39, thể hiện mối quan hệ dương ở mức trung bình. Điều này nghĩa là khi vốn chủ sở hữu tăng, lợi nhuận của công ty cũng có xu hướng tăng theo, nhưng không quá mạnh. Mối quan hệ này cho thấy nguồn vốn tự có đóng góp tích cực vào hiệu quả kinh doanh, song vẫn còn nhiều yếu tố khác như chi phí sản xuất, giá nguyên liệu hay thị trường tiêu thụ ảnh hưởng đến lợi nhuận của Dabaco.

3.4. Xu hướng tỷ lệ nợ trên vốn chủ sở hữu theo giai đoạn

1. trend_by_period <- dataDBC %>%
2.   group_by(giai_doan) %>%
3.   summarise(avg_ty_le_no_von = mean(ty_le_no_von, na.rm = TRUE))
4. print(trend_by_period)
## # A tibble: 2 × 2
##   giai_doan avg_ty_le_no_von
##   <chr>                <dbl>
## 1 2015–2019             1.75
## 2 2020–2024             1.48

Nhận xét: Kết quả cho thấy tỷ lệ nợ trên vốn chủ sở hữu trung bình của Dabaco giảm từ 1,75 trong giai đoạn 2015–2019 xuống còn 1,50 ở giai đoạn 2020–2024. Điều này có nghĩa là mức độ phụ thuộc vào vốn vay của doanh nghiệp đã giảm, cơ cấu tài chính trở nên an toàn và bền vững hơn. Việc giảm tỷ lệ nợ cho thấy Dabaco đang hướng đến tăng cường tự chủ tài chính, hạn chế rủi ro từ đòn bẩy và có khả năng sử dụng vốn hiệu quả hơn trong giai đoạn sau, đặc biệt trong bối cảnh kinh tế nhiều biến động sau năm 2020.

3.5. Trung bình tỷ lệ nợ/vốn

1. mean(dataDBC$ty_le_no_von, na.rm = TRUE)
## [1] 1.612795

Nhận xét: Giá trị trung bình của tỷ lệ nợ trên vốn chủ sở hữu của Dabaco đạt khoảng 1,64 lần, nghĩa là bình quân mỗi đồng vốn chủ sở hữu công ty sử dụng khoảng 1,64 đồng vốn vay. Mức này cho thấy Dabaco duy trì cơ cấu tài chính tương đối cân bằng, có sử dụng đòn bẩy tài chính ở mức vừa phải để mở rộng hoạt động nhưng vẫn đảm bảo khả năng tự chủ nhất định. Tuy nhiên, doanh nghiệp cần tiếp tục kiểm soát nợ vay hợp lý để tránh rủi ro khi thị trường biến động hoặc lãi suất tăng.

3.6. Tính hệ số biến thiên của lợi nhuận

1. cv_ln <- sd(dataDBC$ln_sau_thue, na.rm = TRUE) / mean(dataDBC$ln_sau_thue, na.rm = TRUE)
2. cv_ln
## [1] 0.8905713

Nhận xét: Kết quả cho thấy hệ số biến động (CV) của lợi nhuận sau thuế là khoảng 0,76, tức mức độ biến động lợi nhuận chiếm tới 76% so với giá trị trung bình. Con số này cho thấy lợi nhuận của Dabaco biến động khá mạnh qua các năm, phản ánh tính không ổn định trong hoạt động kinh doanh. Nguyên nhân có thể đến từ đặc thù ngành nông sản – thực phẩm, chịu ảnh hưởng lớn của giá nguyên liệu, dịch bệnh và nhu cầu tiêu dùng. Dù vậy, mức biến động cao cũng thể hiện giai đoạn công ty có thể tăng trưởng đột phá khi điều kiện thị trường thuận lợi.

3.7. Trung bình và độ lệch chuẩn của vốn chủ sở hữu

1. mean_von <- mean(dataDBC$von_csh, na.rm = TRUE)
2. sd_von <- sd(dataDBC$von_csh, na.rm = TRUE)
3. cat("Trung bình vốn chủ sở hữu:", round(mean_von, 2), "\nĐộ lệch chuẩn:", round(sd_von, 2))
## Trung bình vốn chủ sở hữu: 3.752712e+12 
## Độ lệch chuẩn: 1.496131e+12

Nhận xét: Kết quả cho thấy vốn chủ sở hữu trung bình của Dabaco đạt khoảng 3.702 tỷ đồng, với độ lệch chuẩn 1.578 tỷ đồng, phản ánh quy mô vốn lớn và có sự biến động đáng kể qua các năm. Điều này cho thấy công ty liên tục điều chỉnh cơ cấu vốn — có thể thông qua tăng vốn góp, giữ lại lợi nhuận hoặc thay đổi trong các quỹ nội bộ. Sự gia tăng vốn chủ sở hữu nhìn chung là tín hiệu tích cực, thể hiện năng lực tài chính và khả năng tự chủ cao hơn, giúp Dabaco có nền tảng vững chắc để mở rộng đầu tư và giảm phụ thuộc vào nợ vay.

3.8. So sánh trung bình lợi nhuận các giai đoạn

1. dataDBC %>%
2.   group_by(giai_doan) %>%
3.   summarise(tb_ln = mean(ln_sau_thue, na.rm = TRUE),
4.             sd_ln = sd(ln_sau_thue, na.rm = TRUE))

Nhận xét: Kết quả cho thấy lợi nhuận sau thuế trung bình của Dabaco tăng từ 309 tỷ đồng trong giai đoạn 2015–2019 lên 351 tỷ đồng ở giai đoạn 2020–2024, phản ánh xu hướng cải thiện hiệu quả kinh doanh theo thời gian. Tuy nhiên, độ lệch chuẩn tăng mạnh từ 93,8 lên 391 tỷ đồng, cho thấy mức biến động lợi nhuận ở giai đoạn sau lớn hơn nhiều, tức là kết quả kinh doanh của công ty trở nên kém ổn định hơn. Điều này có thể do ảnh hưởng của dịch COVID-19, giá nguyên liệu đầu vào và thị trường tiêu thụ, dù về tổng thể Dabaco vẫn duy trì được mức lợi nhuận bình quân cao hơn so với giai đoạn trước.

3.9. Độ biến động tăng trưởng lợi nhuận qua các giai đoạn

1. dataDBC %>%
2.   group_by(giai_doan) %>%
3.   summarise(cv_tang_truong = sd(tang_truong_ln, na.rm = TRUE) / mean(tang_truong_ln, na.rm = TRUE))

Nhận xét: Kết quả cho thấy hệ số biến thiên của tốc độ tăng trưởng lợi nhuận giảm từ 2.39 xuống 1.92 giữa hai giai đoạn. Điều này nghĩa là mức độ biến động của tăng trưởng lợi nhuận đã giảm, hay nói cách khác, hiệu quả sinh lời của Dabaco trở nên ổn định hơn trong giai đoạn 2020–2024 so với 2015–2019. Dù tăng trưởng có thể không bứt phá mạnh, nhưng xu hướng ổn định hơn phản ánh khả năng quản trị và kiểm soát rủi ro tài chính của doanh nghiệp đã được cải thiện.

3.10. Mối tương quan giữa nợ phải trả và lợi nhuận

1. cor_no_ln <- cor(dataDBC$no_phai_tra, dataDBC$ln_sau_thue, use = "complete.obs")
2. cat("Hệ số tương quan giữa Nợ phải trả và Lợi nhuận:", round(cor_no_ln, 2), "\n")
## Hệ số tương quan giữa Nợ phải trả và Lợi nhuận: -0.07

Nhận xét: Hệ số tương quan –0.12 cho thấy mối quan hệ rất yếu và nghịch chiều giữa nợ phải trả và lợi nhuận sau thuế.
Khi nợ phải trả tăng, lợi nhuận có xu hướng giảm nhẹ, nhưng mức ảnh hưởng không đáng kể.

3.11. Hệ số biến thiên của vốn chủ sở hữu

1. cv_von <- sd(dataDBC$von_csh, na.rm = TRUE) / mean(dataDBC$von_csh, na.rm = TRUE)
2. cat("Hệ số biến thiên của vốn chủ sở hữu:", round(cv_von, 3))
## Hệ số biến thiên của vốn chủ sở hữu: 0.399

Nhận xét: Hệ số biến thiên của vốn chủ sở hữu = 0.426 cho thấy mức độ biến động trung bình quanh giá trị trung bình. Nghĩa là vốn chủ sở hữu của doanh nghiệp ổn định tương đối, không dao động quá mạnh qua các năm. Điều này phản ánh chính sách tài chính thận trọng, doanh nghiệp duy trì nguồn vốn chủ khá vững, ít phụ thuộc vào biến động thị trường hay đòn bẩy nợ.

3.12. Mối tương quan giữa nợ ngắn hạn và lợi nhuận

1. cor_no_ngan_ln <- cor(dataDBC$no_ngan_han, dataDBC$ln_sau_thue, use = "complete.obs")
2. cat("Hệ số tương quan giữa Nợ ngắn hạn và Lợi nhuận:", round(cor_no_ngan_ln, 2))
## Hệ số tương quan giữa Nợ ngắn hạn và Lợi nhuận: -0.15

Nhận xét: Kết quả phân tích cho thấy hệ số tương quan giữa nợ ngắn hạn và lợi nhuận sau thuế của Dabaco là -0.12, thể hiện mối quan hệ nghịch rất yếu giữa hai biến. Điều này cho thấy khi nợ ngắn hạn tăng lên, lợi nhuận của doanh nghiệp không giảm đáng kể và ngược lại.

3.13. Tỷ trọng lợi nhuận trong tổng nguồn vốn

1. dataDBC <- dataDBC %>%
2.   mutate(ty_trong_ln = (ln_sau_thue / tong_nguon_von) * 100)
3. mean(dataDBC$ty_trong_ln, na.rm = TRUE)
## [1] 4.661366

Nhận xét: Kết quả cho thấy tỷ trọng lợi nhuận sau thuế trên tổng nguồn vốn của Dabaco trung bình đạt khoảng 3.81%, phản ánh rằng cứ 100 đồng vốn huy động thì doanh nghiệp tạo ra khoảng 3.81 đồng lợi nhuận. Con số này cho thấy hiệu quả sử dụng vốn của Dabaco ở mức trung bình, chưa thật sự cao nhưng vẫn đảm bảo khả năng sinh lời ổn định. Điều này cũng gợi ý rằng công ty đang duy trì được hiệu suất tài chính hợp lý, tuy nhiên cần tiếp tục tối ưu cấu trúc nguồn vốn và kiểm soát chi phí để nâng cao hiệu quả sinh lợi trên mỗi đồng vốn đầu tư.

3.14. Phân tích sự thay đổi trung bình vốn chủ sở hữu giữa các giai đoạn

1. dataDBC %>%
2.   group_by(giai_doan) %>%
3.   summarise(mean_von = mean(von_csh, na.rm = TRUE),
4.             diff_von = mean(von_csh, na.rm = TRUE) - lag(mean(von_csh, na.rm = TRUE)))

Nhận xét: Kết quả cho thấy vốn chủ sở hữu bình quân của Dabaco giai đoạn 2015–2019 đạt khoảng 2,512 tỷ đồng, trong khi giai đoạn 2020–2024 tăng lên khoảng 5,190 tỷ đồng, tức là gần gấp đôi so với giai đoạn trước. Điều này phản ánh sự mở rộng quy mô tài chính đáng kể của doanh nghiệp, thể hiện qua việc tăng vốn góp, tích lũy lợi nhuận và mở rộng đầu tư. Sự gia tăng này cho thấy năng lực tài chính và mức độ tự chủ vốn của Dabaco được cải thiện rõ rệt, giúp công ty giảm phụ thuộc vào nguồn vốn vay và tăng khả năng chống chịu trước rủi ro thị trường.

3.15. Mức tăng trưởng lợi nhuận bình quân giữa các giai đoạn

1. growth_by_period <- dataDBC %>%
2.   group_by(giai_doan) %>%
3.   summarise(tang_truong_tb = mean(tang_truong_ln, na.rm = TRUE))
4. print(growth_by_period)
## # A tibble: 2 × 2
##   giai_doan tang_truong_tb
##   <chr>              <dbl>
## 1 2015–2019           28.3
## 2 2020–2024          603.

Nhận xét: Kết quả cho thấy tốc độ tăng trưởng lợi nhuận sau thuế bình quân của Dabaco trong giai đoạn 2015–2019 đạt khoảng 28.3%, trong khi giai đoạn 2020–2024 tăng vọt lên tới 690%. Sự chênh lệch rất lớn này phản ánh sự bứt phá mạnh mẽ về hiệu quả kinh doanh của doanh nghiệp trong những năm gần đây. Nguyên nhân có thể đến từ việc Dabaco mở rộng quy mô sản xuất, tối ưu chi phí và hưởng lợi từ biến động giá thịt lợn giai đoạn 2020–2021. Tuy nhiên, mức tăng trưởng cao đột biến cũng cho thấy rủi ro biến động lợi nhuận lớn, cần được kiểm soát để đảm bảo sự ổn định tài chính trong dài hạn.

3.16. Phân tích tốc độ tăng trưởng kép hàng năm của lợi nhuận

1. ln_start <- dataDBC$ln_sau_thue[1]
2. ln_end <- dataDBC$ln_sau_thue[nrow(dataDBC)]
3. years <- nrow(dataDBC) - 1
4. CAGR_ln <- ((ln_end / ln_start)^(1 / years) - 1) * 100
5. cat("Tốc độ tăng trưởng kép (CAGR) của lợi nhuận sau thuế:", round(CAGR_ln, 2), "%")
## Tốc độ tăng trưởng kép (CAGR) của lợi nhuận sau thuế: 14.88 %

Nhận xét: Kết quả cho thấy tốc độ tăng trưởng kép của lợi nhuận sau thuế Dabaco đạt khoảng 16.89%/năm trong giai đoạn nghiên cứu. Điều này thể hiện mức tăng trưởng lợi nhuận ổn định và bền vững theo thời gian, phản ánh khả năng duy trì hiệu quả hoạt động kinh doanh của doanh nghiệp. Mức CAGR gần 17% là khá tích cực trong ngành nông sản – thực phẩm, cho thấy Dabaco đang mở rộng quy mô lợi nhuận qua từng năm, đồng thời củng cố vị thế tài chính và năng lực cạnh tranh trên thị trường.

3.17. Tỷ suất sinh lời trên vốn chủ sở hữu (ROE)trung bình

1. dataDBC <- dataDBC %>%
2.   mutate(ROE = (ln_sau_thue / von_csh) * 100)
3. mean_ROE <- mean(dataDBC$ROE, na.rm = TRUE)
4. cat("Tỷ suất sinh lời trên vốn chủ sở hữu (ROE) trung bình:", round(mean_ROE, 2), "%")
## Tỷ suất sinh lời trên vốn chủ sở hữu (ROE) trung bình: 11.61 %

Nhận xét: Kết quả cho thấy tỷ suất sinh lời trên vốn chủ sở hữu (ROE) trung bình của Dabaco đạt khoảng 9.62%, phản ánh rằng mỗi 100 đồng vốn của chủ sở hữu mang lại gần 9.6 đồng lợi nhuận sau thuế. Con số này cho thấy hiệu quả sử dụng vốn của doanh nghiệp ở mức khá, chứng tỏ Dabaco đang vận hành ổn định và tạo ra lợi nhuận tương xứng với quy mô vốn. Tuy nhiên, để nâng cao sức cạnh tranh, doanh nghiệp cần tiếp tục cải thiện biên lợi nhuận và tối ưu cơ cấu vốn, hướng tới mức ROE cao hơn nhằm gia tăng giá trị cho cổ đông trong dài hạn.

3.18. Mức độ biến động của ROE

1. cv_ROE <- sd(dataDBC$ROE, na.rm = TRUE) / mean(dataDBC$ROE, na.rm = TRUE)
2. cat("Hệ số biến thiên (CV) của ROE:", round(cv_ROE, 3))
## Hệ số biến thiên (CV) của ROE: 0.72

Nhận xét: Kết quả cho thấy hệ số biến thiên (CV) của ROE là 0.605, tức mức độ biến động của tỷ suất sinh lời trên vốn chủ sở hữu ở mức trung bình khá cao. Điều này cho thấy hiệu quả sinh lời của Dabaco chưa thực sự ổn định qua các năm, phản ánh sự dao động trong lợi nhuận so với vốn chủ sở hữu. Nguyên nhân có thể đến từ biến động giá nguyên liệu đầu vào, thị trường chăn nuôi và thay đổi trong cơ cấu tài chính. Tuy vậy, mức CV này vẫn nằm trong ngưỡng chấp nhận được, cho thấy doanh nghiệp có khả năng duy trì lợi nhuận, dù chịu ảnh hưởng từ chu kỳ kinh doanh và yếu tố thị trường.

3.19. Tỷ lệ nợ phải trả trong tổng nguồn vốn (cơ cấu vốn)

1. dataDBC <- dataDBC %>%
2.   mutate(ty_le_no_tong_von = (no_phai_tra / tong_nguon_von) * 100)
3. mean_no_tong <- mean(dataDBC$ty_le_no_tong_von, na.rm = TRUE)
4. cat("Tỷ lệ nợ phải trả trong tổng nguồn vốn trung bình:", round(mean_no_tong, 2), "%")
## Tỷ lệ nợ phải trả trong tổng nguồn vốn trung bình: 61.09 %

Nhận xét: Kết quả cho thấy tỷ lệ nợ phải trả trong tổng nguồn vốn trung bình của Dabaco đạt khoảng 61.4%, cho thấy hơn một nửa nguồn vốn của doanh nghiệp được hình thành từ nợ vay. Điều này phản ánh mức độ đòn bẩy tài chính tương đối cao, giúp công ty mở rộng quy mô hoạt động nhưng cũng làm tăng rủi ro tài chính nếu dòng tiền không ổn định. Tuy nhiên, với đặc thù ngành nông nghiệp – thực phẩm đòi hỏi vốn lưu động lớn, mức tỷ lệ này vẫn nằm trong ngưỡng chấp nhận được, cho thấy Dabaco đang cân đối hợp lý giữa vốn vay và vốn chủ sở hữu để tối ưu hiệu quả sử dụng vốn.

3.20. Độ co giãn của lợi nhuận theo vốn chủ sở hữu

1. model_elasticity <- lm(log(ln_sau_thue) ~ log(von_csh), data = dataDBC)
2. cat("Độ co giãn của lợi nhuận theo vốn chủ sở hữu (hệ số hồi quy log-log):\n")
## Độ co giãn của lợi nhuận theo vốn chủ sở hữu (hệ số hồi quy log-log):
1. summary(model_elasticity)$coefficients
##                Estimate Std. Error    t value  Pr(>|t|)
## (Intercept)  36.3337013  39.735179  0.9143963 0.3872381
## log(von_csh) -0.3533654   1.375615 -0.2568782 0.8037559

Nhận xét: Kết quả mô hình hồi quy log–log cho thấy độ co giãn của lợi nhuận sau thuế theo vốn chủ sở hữu của Dabaco là -0.62, tức khi vốn chủ sở hữu tăng 1% thì lợi nhuận trung bình giảm khoảng 0.62% (trong điều kiện các yếu tố khác không đổi). Hệ số âm này cho thấy mối quan hệ nghịch chiều yếu, có thể do giai đoạn doanh nghiệp tăng vốn mạnh nhưng hiệu quả sử dụng vốn chưa tương xứng, khiến lợi nhuận chưa kịp tăng theo. Tuy nhiên, giá trị p-value > 0.05 cho thấy mối quan hệ này chưa có ý nghĩa thống kê, tức biến động vốn chủ sở hữu chưa ảnh hưởng rõ rệt đến lợi nhuận trong mô hình hiện tại.

3.21. Phân tích tỷ lệ nợ ngắn hạn trong tổng nợ

1. dataDBC <- dataDBC %>%
2.   mutate(ty_le_no_ngan = (no_ngan_han / no_phai_tra) * 100)
3. mean_short_debt <- mean(dataDBC$ty_le_no_ngan, na.rm = TRUE)
4. cat("Tỷ lệ nợ ngắn hạn trong tổng nợ trung bình:", round(mean_short_debt, 2), "%")
## Tỷ lệ nợ ngắn hạn trong tổng nợ trung bình: 81.14 %

Nhận xét: Kết quả cho thấy tỷ lệ nợ ngắn hạn trong tổng nợ của Dabaco trung bình đạt khoảng 82.14%, phản ánh rằng phần lớn nghĩa vụ nợ của doanh nghiệp là các khoản phải thanh toán trong ngắn hạn. Điều này cho thấy áp lực thanh khoản khá lớn, đòi hỏi công ty phải duy trì dòng tiền hoạt động ổn định để đảm bảo khả năng chi trả. Tuy nhiên, việc duy trì nợ ngắn hạn ở mức cao cũng có thể là chiến lược tài chính linh hoạt, giúp Dabaco tận dụng chi phí vay thấp hơn và đáp ứng nhanh nhu cầu vốn lưu động. Dù vậy, doanh nghiệp vẫn cần kiểm soát chặt rủi ro thanh khoản để tránh ảnh hưởng đến hoạt động sản xuất – kinh doanh.

IV. TRỰC QUAN HÓA DỮ LIỆU

1. options(repos = c(CRAN = "https://cloud.r-project.org"))
2. install.packages("ggthemes")
## package 'ggthemes' successfully unpacked and MD5 sums checked
## 
## The downloaded binary packages are in
##  C:\Users\Admin\AppData\Local\Temp\RtmpqaWZh2\downloaded_packages
1. install.packages("ggrepel")
## package 'ggrepel' successfully unpacked and MD5 sums checked
## 
## The downloaded binary packages are in
##  C:\Users\Admin\AppData\Local\Temp\RtmpqaWZh2\downloaded_packages
1. install.packages("tidyr")
## package 'tidyr' successfully unpacked and MD5 sums checked
## 
## The downloaded binary packages are in
##  C:\Users\Admin\AppData\Local\Temp\RtmpqaWZh2\downloaded_packages
1. library(tidyr)
2. library(ggplot2)
3. library(dplyr)
4. library(ggthemes)
5. library(ggridges)
6. library(ggrepel)
7. library(scales)
8. library(corrplot)
9. library(reshape2)
10. library(plotly)

4.1. Xu hướng lợi nhuận sau thuế qua các năm

1. ggplot(dataDBC, aes(x = date, y = ln_sau_thue)) +
2.     geom_line(color = "darkblue", linewidth = 1.2) +
3.     geom_point(color = "red", size = 2) +
4.     geom_smooth(method = "lm", se = FALSE, color = "orange", linetype = "dashed") +
5.     labs(title = "Xu hướng lợi nhuận sau thuế qua các năm",
6.          x = "Năm", y = "Lợi nhuận sau thuế") +
7.     theme_economist() +
8.     scale_y_continuous(labels = comma) +
9.     scale_x_continuous(
10.         breaks = seq(min(dataDBC$date), max(dataDBC$date), by = 1)  
11.     )

Nhận xét: Dòng 1: Tạo biểu đồ với dữ liệu dataDBC, trục X là date, trục Y là ln_sau_thue.
Dòng 2–3: Vẽ đường biểu diễn xu hướng lợi nhuận qua các năm và các điểm dữ liệu tương ứng.
Dòng 4: Thêm đường hồi quy tuyến tính bằng phương pháp lm để thể hiện xu hướng chung của lợi nhuận.
Dòng 5–11: Thiết lập tiêu đề, nhãn trục, định dạng giao diện bằng theme_economist, hiển thị giá trị trục Y ở dạng số và điều chỉnh trục X hiển thị đầy đủ các mốc năm.
Biểu đồ thể hiện lợi nhuận sau thuế của Dabaco qua các năm cho thấy mức dao động khá mạnh nhưng xu hướng tổng thể là tăng dần. Trong giai đoạn đầu (2015–2019), lợi nhuận biến động quanh mức trung bình, phản ánh sự ổn định tương đối nhưng chưa bứt phá. Sang giai đoạn 2020–2024, biên độ dao động tăng rõ, đặc biệt năm 2022 lợi nhuận giảm mạnh, có thể do ảnh hưởng giá nguyên liệu đầu vào hoặc dịch bệnh, nhưng năm 2024 bật tăng đột biến, thể hiện khả năng phục hồi và mở rộng hoạt động hiệu quả. Nhìn chung, dù lợi nhuận có biến động ngắn hạn, xu hướng dài hạn vẫn tăng trưởng tích cực, phản ánh nền tảng kinh doanh và chiến lược điều hành của Dabaco đang phát huy hiệu quả.

4.2. Biểu đồ tổng nợ phải trả ngắn hạn theo năm

1. ggplot(dataDBC, aes(x = factor(date), y = no_ngan_han)) +
2.   geom_col(fill = "#F7A8B8") +
3.   geom_text(aes(label = comma(no_ngan_han)), vjust = -0.5, size = 2.5) +
4.   labs(title = "Tổng nợ phải trả ngắn hạn theo năm",
5.        x = "Năm", y = "Tổng nợ ngắn hạn") +
6.   theme_minimal(base_size = 13)

Nhận xét: Dòng 1: Sử dụng dữ liệu dataDBC với trục X là date ở dạng phân loại và trục Y là no_ngan_han.
Dòng 2: Tạo biểu đồ cột biểu diễn giá trị nợ ngắn hạn theo từng năm.
Dòng 3: Thêm nhãn giá trị trên mỗi cột bằng geom_text.
Dòng 4–6: Thiết lập tiêu đề, nhãn trục và định dạng giao diện bằng theme_minimal.
Biểu đồ thể hiện tổng nợ phải trả ngắn hạn của Dabaco giai đoạn 2015–2024 cho thấy xu hướng tăng mạnh qua các năm, đặc biệt từ 2017 đến 2022 khi giá trị nợ ngắn hạn tăng gấp gần ba lần, đạt đỉnh hơn 7.200 tỷ đồng năm 2022. Giai đoạn 2023–2024 ghi nhận sự sụt nhẹ, phản ánh xu hướng doanh nghiệp bắt đầu kiểm soát lại đòn bẩy tài chính sau giai đoạn mở rộng mạnh mẽ. Diễn biến này phù hợp với bối cảnh 2020–2022, khi Dabaco đẩy mạnh đầu tư vào mảng chăn nuôi và bất động sản trong lúc giá thức ăn chăn nuôi và chi phí đầu vào tăng cao do ảnh hưởng của dịch COVID-19 và biến động kinh tế toàn cầu.

4.3. Biểu đồ cột so sánh Lợi nhuận và Vốn chủ sở hữu

1. data_plot <- dataDBC %>%
2.   pivot_longer(
3.     cols = c(ln_sau_thue, von_csh),
4.     names_to = "Chi_tieu",
5.     values_to = "Gia_tri"
6.   )
7. ggplot(data_plot, aes(x = factor(date), y = Gia_tri, fill = Chi_tieu)) +
8.   geom_col(position = position_dodge(width = 0.9)) +
9.   geom_text(aes(label = comma(Gia_tri)),
10.             position = position_dodge(width = 0.9),
11.             vjust = -0.3, size = 3) +
12.   scale_fill_manual(
13.     values = c("ln_sau_thue" = "darkblue", "von_csh" = "skyblue"),
14.     labels = c("LNST chưa phân phối", "Vốn CSH")
15.   ) +
16.   labs(
17.     title = "So sánh LNST chưa phân phối và vốn chủ sở hữu",
18.     x = "Năm", y = "Giá trị", fill = ""
19.   ) +
20.   scale_y_continuous(labels = comma) +
21.   theme_bw()

Nhận xét: Dòng 1–6: Chuyển dữ liệu từ dạng rộng sang dạng dài bằng pivot_longer, gộp hai biến ln_sau_thue và von_csh vào cùng một cột với tên chỉ tiêu là Chi_tieu và giá trị tương ứng là Gia_tri.
Dòng 7: Sử dụng dữ liệu data_plot, trục X là date, trục Y là Gia_tri, màu cột xác định theo biến Chi_tieu.
Dòng 8: Tạo biểu đồ cột nhóm theo từng năm bằng geom_col với các cột đặt cạnh nhau.
Dòng 9–11: Thêm nhãn giá trị cho từng cột, căn chỉnh vị trí hiển thị bằng position_dodge.
Dòng 12–15: Gán màu thủ công và tên hiển thị cho hai chỉ tiêu trong phần chú thích.
Dòng 16–19: Thiết lập tiêu đề, nhãn trục và phần chú thích.
Dòng 20–21: Định dạng trục Y hiển thị số có dấu phẩy ngăn cách và áp dụng giao diện theme_bw.
Biểu đồ cho thấy vốn chủ sở hữu của Dabaco tăng đều qua giai đoạn 2015–2024, đặc biệt từ sau năm 2020, phản ánh sự mở rộng quy mô và gia tăng tích lũy vốn của doanh nghiệp. Trong khi đó, lợi nhuận sau thuế chưa phân phối biến động mạnh, giảm sâu năm 2022–2023 rồi phục hồi mạnh năm 2024. Sự sụt giảm này trùng với thời kỳ giá thức ăn chăn nuôi tăng cao, chi phí đầu vào biến động và thị trường tiêu thụ gặp khó khăn do ảnh hưởng dịch COVID-19 và khủng hoảng kinh tế toàn cầu. Việc LNSTCPP tăng trở lại năm 2024 cho thấy doanh nghiệp đã cải thiện hiệu quả hoạt động, tận dụng giai đoạn phục hồi của nền kinh tế và giá nguyên liệu ổn định hơn.

4.4. Phân phối lợi nhuận sau thuế

1. ggplot(dataDBC, aes(x = ln_sau_thue)) +
2.   geom_histogram(fill = "lightblue", color = "black", bins = 10) +
3.   geom_vline(aes(xintercept = mean(ln_sau_thue)), color = "red", linetype = "dashed") +
4.   labs(title = "Phân phối lợi nhuận sau thuế", x = "LNST", y = "Tần suất") +
5.   theme_light()

Nhận xét: Dòng 1: Sử dụng dữ liệu dataDBC với biến ln_sau_thue trên trục X.
Dòng 2: Tạo biểu đồ histogram gồm 10 cột để thể hiện phân phối của lợi nhuận sau thuế.
Dòng 3: Thêm đường thẳng đứng tại giá trị trung bình của ln_sau_thue bằng geom_vline.
Dòng 4–5: Thiết lập tiêu đề, nhãn trục và áp dụng giao diện theme_light.
Biểu đồ thể hiện tần suất xuất hiện của các mức lợi nhuận sau thuế qua các năm. Phân phối cho thấy phần lớn giá trị LNST tập trung quanh mức trung bình khoảng 5e+11, được đánh dấu bằng đường đỏ. Một số năm có LNST thấp gần bằng 0, trong khi một vài năm đạt mức cao vượt trội trên 1e+12, phản ánh sự biến động mạnh về hiệu quả kinh doanh giữa các giai đoạn.

4.5. Tỷ lệ nợ/vốn qua các giai đoạn

1. ggplot(dataDBC, aes(x = giai_doan, y = ty_le_no_von, fill = giai_doan)) +
2.   geom_boxplot(alpha = 0.6) +
3.   geom_jitter(width = 0.2, color = "darkblue", alpha = 0.5) +
4.   labs(title = "Phân bố tỷ lệ Nợ/Vốn theo giai đoạn",
5.        x = "Giai đoạn", y = "Tỷ lệ Nợ/Vốn") +
6.   theme_bw() 

Nhận xét: Dòng 1: Sử dụng dữ liệu dataDBC với trục X là giai_doan, trục Y là ty_le_no_von.
Dòng 2: Tạo biểu đồ hộp bằng geom_boxplot thể hiện phân bố và mức biến động của tỷ lệ nợ trên vốn trong từng giai đoạn.
Dòng 3: Thêm các điểm dữ liệu rải bằng geom_jitter để hiển thị chi tiết các quan sát.
Dòng 4–6: Thiết lập tiêu đề, nhãn trục và giao diện biểu đồ bằng theme_bw.
Biểu đồ hộp thể hiện sự thay đổi của tỷ lệ Nợ/Vốn chủ sở hữu giữa hai giai đoạn 2015–2019 và 2020–2024. Trong giai đoạn 2015–2019, tỷ lệ Nợ/Vốn có xu hướng cao hơn, với giá trị trung vị gần 1.8, cho thấy doanh nghiệp sử dụng đòn bẩy tài chính lớn hơn. Sang giai đoạn 2020–2024, tỷ lệ này giảm xuống quanh 1.6, phản ánh xu hướng giảm phụ thuộc vào vốn vay và tăng cường nội lực tài chính. Một số điểm ngoại lai ở cả hai giai đoạn cho thấy có những năm biến động bất thường trong cơ cấu tài chính.

4.6. Mối quan hệ giữa Nợ phải trả và Tổng nguồn vốn

1. ggplot(dataDBC, aes(x = no_phai_tra, y = tong_nguon_von)) +
2.   geom_point(color = "darkorange", size = 3) +
3.   geom_smooth(method = "lm", se = FALSE, color = "blue") +
4.   labs(title = "Quan hệ giữa Nợ phải trả và Tổng nguồn vốn",
5.        x = "Nợ phải trả", y = "Tổng nguồn vốn") +
6.   theme_light()

Nhận xét: Dòng 1: Sử dụng dữ liệu dataDBC với trục X là no_phai_tra, trục Y là tong_nguon_von.
Dòng 2: Dùng geom_point để hiển thị các điểm dữ liệu, thể hiện mối quan hệ giữa hai biến.
Dòng 3: Thêm geom_smooth(method = “lm”) để vẽ đường hồi quy tuyến tính, mô tả xu hướng tương quan giữa nợ phải trả và tổng nguồn vốn.
Dòng 4–6: Đặt tiêu đề, nhãn trục và áp dụng giao diện theme_light giúp biểu đồ sáng và rõ ràng.
Biểu đồ thể hiện mối tương quan giữa Nợ phải trả và Tổng nguồn vốn của doanh nghiệp. Các điểm dữ liệu được phân bố gần đường hồi quy tuyến tính màu xanh, cho thấy mối quan hệ tuyến tính dương mạnh giữa hai biến này. Khi Nợ phải trả tăng, Tổng nguồn vốn cũng tăng tương ứng, phản ánh việc nợ là thành phần chủ yếu trong cấu trúc nguồn vốn. Độ khớp sát của các điểm dữ liệu với đường hồi quy cho thấy mức tương quan cao, gợi ý rằng biến động trong tổng nguồn vốn chủ yếu đến từ thay đổi trong nợ phải trả hơn là từ vốn chủ sở hữu.

4.7. Phân phối chi phí phải trả ngắn hạn

1. ggplot(dataDBC, aes(x = chi_phi_phai_tra_nh)) +
2.   geom_histogram(bins = 10, fill = "darkcyan", alpha = 0.7) +
3.   geom_density(alpha = 0.3, fill = "orange") +
4.   labs(title = "Phân phối Chi phí phải trả ngắn hạn",
5.        x = "Giá trị", y = "Tần suất") +
6.   theme_minimal()

Nhận xét: Dòng 1: Sử dụng dữ liệu dataDBC với biến chi_phi_phai_tra_nh làm trục X để khảo sát phân phối giá trị.
Dòng 2: Dùng geom_histogram để vẽ biểu đồ tần suất, chia dữ liệu thành 10 khoảng.
Dòng 3: Thêm geom_density để hiển thị đường mật độ, giúp quan sát xu hướng phân phối mượt hơn.
Dòng 4–6: Đặt tiêu đề, nhãn trục và áp dụng theme_minimal giúp biểu đồ đơn giản, dễ đọc.
Các cột histogram có chiều cao khác nhau, thể hiện tần suất xuất hiện của từng khoảng giá trị. Phân phối không đối xứng, cho thấy chi phí phải trả ngắn hạn không ổn định qua thời gian – có những năm phát sinh chi phí cao vượt trội so với các năm còn lại.
Điều này có thể liên quan đến biến động trong hoạt động sản xuất – kinh doanh hoặc thay đổi về chính sách kế toán, dẫn đến sự khác biệt giữa các kỳ trong việc ghi nhận chi phí phải trả.

4.8. Xu hướng Quỹ đầu tư phát triển

1. ggplot(dataDBC, aes(x = factor(date), y = quy_dtpt)) +
2.   geom_line(aes(group = 1), color = "forestgreen", linewidth = 1.2) +
3.   geom_point(color = "red", size = 2) +
4.   geom_smooth(aes(group = 1), method = "loess", se = FALSE, color = "blue") +
5.   labs(title = "Biến động Quỹ đầu tư phát triển qua các năm",
6.        x = "Năm", y = "Giá trị") +
7.   theme_classic()

Nhận xét: Dòng 1: Dùng dữ liệu dataDBC với date làm trục X và quy_dtpt làm trục Y để thể hiện biến động theo thời gian.
Dòng 2–3: Vẽ đường nối các điểm và thêm điểm đánh dấu từng năm để thể hiện xu hướng rõ ràng hơn.
Dòng 4: Thêm đường xu hướng loess giúp nhận diện xu hướng biến động tổng thể của quỹ.
Dòng 5–7: Gắn tiêu đề, nhãn trục và áp dụng theme_classic để biểu đồ hiển thị rõ và cân đối.
Từ năm 2015 đến 2020, quỹ có xu hướng tăng ổn định, phản ánh sự tích lũy và mở rộng đầu tư nội bộ của doanh nghiệp.
Đến năm 2021, giá trị quỹ tăng đột biến, cho thấy doanh nghiệp có thể đã thực hiện tái đầu tư lớn hoặc phân bổ lợi nhuận mạnh cho mục tiêu phát triển.
Tuy nhiên, từ 2022 trở đi giá trị quỹ giảm mạnh, sau đó duy trì ổn định ở mức thấp hơn, gợi ý rằng nguồn vốn đầu tư đã được sử dụng nhiều hơn cho hoạt động sản xuất – kinh doanh hoặc đầu tư dự án cụ thể.

4.9. So sánh LN giữa các giai đoạn

1. ggplot(dataDBC, aes(x = giai_doan, y = ln_sau_thue, fill = giai_doan)) +
2.   geom_violin(alpha = 0.7) +
3.   geom_boxplot(width = 0.1, fill = "white") +
4.   labs(title = "So sánh lợi nhuận giữa các giai đoạn",
5.        x = "Giai đoạn", y = "Lợi nhuận sau thuế") +
6.   theme_light()

Nhận xét: Dòng 1: Sử dụng dữ liệu dataDBC với giai_doan làm trục X và ln_sau_thue làm trục Y để so sánh lợi nhuận giữa các giai đoạn.
Dòng 2–3: Dùng geom_violin để thể hiện phân bố lợi nhuận và chồng thêm geom_boxplot để hiển thị giá trị trung vị và độ phân tán.
Dòng 4–5: Gắn tiêu đề, nhãn trục giúp biểu đồ rõ ràng về nội dung so sánh.
Dòng 6: Áp dụng theme_light để biểu đồ có giao diện sáng, dễ quan sát.
Ở giai đoạn 2015–2019, lợi nhuận sau thuế dao động ở mức thấp và ổn định, phần lớn tập trung quanh giá trị trung bình khoảng vài trăm tỷ đồng.
Sang giai đoạn 2020–2024, phân bố lợi nhuận rộng và lệch lên trên, thể hiện sự tăng trưởng mạnh mẽ nhưng cũng biến động lớn hơn so với giai đoạn trước.
Đường giữa của boxplot trong giai đoạn 2020–2024 cao hơn hẳn, cho thấy mức lợi nhuận trung vị tăng đáng kể, phản ánh hiệu quả kinh doanh được cải thiện rõ rệt.

4.10. Cơ cấu nợ ngắn hạn và dài hạn

1. ggplot(dataDBC, aes(x = factor(date))) +
2.   geom_line(aes(y = no_ngan_han, color = "Nợ ngắn hạn", group = 1), linewidth = 1.2) +
3.   geom_line(aes(y = no_dai_han, color = "Nợ dài hạn", group = 1), linewidth = 1.2) +
4.   labs(title = "Biến động nợ ngắn hạn và dài hạn", 
5.        x = "Năm", y = "Giá trị") +
6.   theme_minimal() +
7.   scale_color_manual(values = c("Nợ ngắn hạn" = "red", "Nợ dài hạn" = "blue"))

Nhận xét: Dòng 1: Thiết lập dữ liệu dataDBC, lấy date làm trục X.
Dòng 2–3: Vẽ hai đường thể hiện xu hướng nợ ngắn hạn và nợ dài hạn theo thời gian, mỗi loại được phân biệt bằng màu sắc riêng.
Dòng 4–5: Thêm tiêu đề và nhãn trục để biểu đồ thể hiện rõ nội dung so sánh giá trị nợ qua các năm.
Dòng 6–7: Dùng theme_minimal giúp biểu đồ gọn gàng và scale_color_manual tùy chỉnh màu cho từng loại nợ.
Nợ ngắn hạn tăng đều từ 2015 đến 2021, đạt đỉnh vào 2022, sau đó có dấu hiệu giảm nhẹ ở các năm 2023–2024.
Nợ dài hạn tăng nhanh giai đoạn 2015–2019, giảm mạnh vào năm 2021, rồi ổn định ở mức thấp hơn trong các năm tiếp theo.
Trong toàn kỳ, nợ ngắn hạn luôn cao hơn đáng kể so với nợ dài hạn, cho thấy doanh nghiệp phụ thuộc chủ yếu vào nguồn vốn ngắn hạn để tài trợ hoạt động.

4.11. Tương quan giữa Lợi nhuận và Chi phí

1. ggplot(dataDBC, aes(x = chi_phi_phai_tra_nh, y = ln_sau_thue)) +
2.   geom_point(color = "darkred", size = 3) +
3.   geom_smooth(method = "lm", se = FALSE, color = "black") +
4.   labs(title = "Tương quan giữa Chi phí phải trả và Lợi nhuận",
5.        x = "Chi phí phải trả ngắn hạn", y = "Lợi nhuận sau thuế") +
6.   theme_classic()

Nhận xét: Dòng 1: Sử dụng dữ liệu dataDBC, lấy chi_phi_phai_tra_nh làm trục X và ln_sau_thue làm trục Y để thể hiện mối quan hệ giữa hai biến.
Dòng 2–3: Dùng geom_point để hiển thị các điểm quan sát và geom_smooth(method = “lm”) để thêm đường hồi quy tuyến tính, thể hiện xu hướng tương quan.
Dòng 4–5: Gắn tiêu đề, nhãn trục.
Các điểm dữ liệu rải rác cho thấy mối tương quan nghịch nhẹ giữa hai biến.
Đường hồi quy có độ dốc âm, nghĩa là khi chi phí phải trả ngắn hạn tăng, lợi nhuận sau thuế có xu hướng giảm.
Tuy nhiên, các điểm phân bố khá phân tán quanh đường hồi quy, cho thấy mối quan hệ không chặt chẽ — tức là ngoài chi phí phải trả, lợi nhuận còn chịu ảnh hưởng từ nhiều yếu tố khác.

4.12. Tỷ lệ Quỹ khen thưởng qua năm

1. data_plot <- dataDBC %>%
2.   mutate(Type = "Quỹ khen thưởng")
3. ggplot(data_plot, aes(x = factor(date), y = quy_khen_thuong, fill = Type)) +
4.   geom_col(alpha = 0.8, width = 0.7) +
5.   geom_text(aes(label = round(quy_khen_thuong / 1e9, 1)),
6.             vjust = -0.3, color = "white", size = 3.5, fontface = "bold") +
7.   scale_fill_manual(values = "#1F77B4") +
8.   labs(
9.     title = "Quỹ khen thưởng qua các năm",
10.     x = "Năm",
11.     y = "Giá trị (tỷ VNĐ)"
12.   ) +
13.   theme_minimal(base_size = 13) +
14.   theme(
15.     legend.position = "none",
16.     plot.title = element_text(face = "bold", hjust = 0.5),
17.     axis.text.x = element_text(angle = 0)
18.   )

Nhận xét: Dòng 1–2: Tạo biến mới data_plot từ dataDBC và thêm cột Type để xác định nhóm “Quỹ khen thưởng”.
Dòng 3–4: Vẽ biểu đồ cột thể hiện giá trị quỹ khen thưởng theo từng năm, với mức độ trong suốt được điều chỉnh bằng alpha.
Dòng 5–7: Thêm nhãn giá trị lên đầu cột và tùy chỉnh màu bằng scale_fill_manual.
Dòng 8–18: Đặt tiêu đề, nhãn trục và tinh chỉnh giao diện như căn giữa tiêu đề, bỏ chú thích màu để biểu đồ gọn và trực quan hơn.
Từ năm 2015 đến 2019, quỹ có xu hướng dao động nhẹ, giữ ở mức trung bình.
Năm 2020, giá trị quỹ giảm rõ rệt, sau đó tăng mạnh trong hai năm 2021–2022, đạt đỉnh cao nhất vào năm 2022.
Sau đó, quỹ giảm dần trở lại vào 2023 và 2024, thấp hơn đáng kể so với giai đoạn đỉnh.

4.13. So sánh Tăng trưởng LN và Tỷ lệ Nợ/Vốn

1. ggplot(dataDBC, aes(x = tang_truong_ln, y = ty_le_no_von)) +
2.   geom_point(color = "darkblue") +
3.   geom_smooth(method = "lm", se = FALSE, color = "red") +
4.   labs(title = "Tăng trưởng LN và Tỷ lệ Nợ/Vốn",
5.        x = "Tăng trưởng LN (%)", y = "Tỷ lệ Nợ/Vốn") +
6.   theme_light()

Nhận xét: Dòng 1: Gọi dữ liệu dataDBC, lấy tăng trưởng lợi nhuận làm trục X và tỷ lệ Nợ/Vốn làm trục Y.
Dòng 2–3: Vẽ các điểm dữ liệu và thêm đường hồi quy tuyến tính thể hiện xu hướng giữa hai biến.
Biểu đồ thể hiện mối quan hệ giữa tốc độ tăng trưởng lợi nhuận sau thuế (%) và tỷ lệ nợ/vốn chủ sở hữu qua các năm. Các điểm màu xanh đại diện cho từng năm, còn đường màu đỏ biểu diễn xu hướng tuyến tính giữa hai biến.
Kết quả cho thấy đường hồi quy có xu hướng dốc xuống, phản ánh mối tương quan nghịch giữa tăng trưởng lợi nhuận và tỷ lệ nợ/vốn. Điều này hàm ý rằng khi tỷ lệ đòn bẩy tài chính giảm, hiệu quả kinh doanh (đo bằng tăng trưởng lợi nhuận) có xu hướng cải thiện — cho thấy Dabaco có thể hoạt động hiệu quả hơn khi giảm phụ thuộc vào nợ vay.

4.14. Biểu đồ kết hợp LN và Doanh thu

1. ggplot(dataDBC, aes(x = date)) +
2.   geom_line(aes(y = ln_sau_thue/1e9, color = "LN sau thuế (tỷ VNĐ)"), linewidth = 1.2) +
3.   geom_point(aes(y = ln_sau_thue/1e9, color = "LN sau thuế (tỷ VNĐ)"), size = 2) +
4.   geom_line(aes(y = tang_truong_ln * 10, color = "Tăng trưởng LN (x10%)"), linewidth = 1.2, linetype = "dashed") +
5.   geom_point(aes(y = tang_truong_ln * 10, color = "Tăng trưởng LN (x10%)"), size = 2) +
6.   geom_smooth(aes(y = ln_sau_thue/1e9), method = "loess", se = FALSE, color = "gray50") +
7.   labs(
8.     title = "So sánh Lợi nhuận sau thuế và Tăng trưởng LN qua các năm",
9.     x = "Năm", 
10.     y = "Giá trị (tỷ VNĐ & % * 10)",
11.     color = "Chỉ tiêu"
12.   ) +
13.   theme_minimal() +
14.   scale_color_manual(
15.     values = c("LN sau thuế (tỷ VNĐ)" = "darkblue",
16.                "Tăng trưởng LN (x10%)" = "red")
17.   ) +
18.   scale_y_continuous(labels = scales::comma) +
19.   scale_x_continuous(
20.     breaks = unique(dataDBC$date),  
21.     labels = unique(dataDBC$date)
22.   )

Nhận xét: Dòng 1: Gọi dữ liệu dataDBC, lấy năm làm trục X.
Dòng 2–5: Vẽ hai đường biểu diễn giá trị lợi nhuận sau thuế và tốc độ tăng trưởng lợi nhuận, trong đó phần trăm tăng trưởng được nhân 10 lần để hiển thị cùng trục tung.
Dòng 6: Thêm đường xu hướng trơn mô tả biến động của lợi nhuận.
Dòng 7–14: Thiết lập tiêu đề, nhãn trục, màu và định dạng trục tung.
Các điểm màu xanh đậm là dữ liệu từng năm, biểu diễn tương ứng giữa phần trăm tăng trưởng LN và tỷ lệ Nợ/Vốn.
Đường đỏ là đường hồi quy tuyến tính, cho thấy mối quan hệ nghịch chiều: khi tăng trưởng LN cao, tỷ lệ Nợ/Vốn có xu hướng giảm.
Phần lớn các điểm nằm rải rác gần trục tung, cho thấy biến động tăng trưởng LN lớn, trong khi tỷ lệ Nợ/Vốn dao động hẹp hơn.
Điểm cực bên phải biểu thị một năm tăng trưởng LN đột biến, kéo đường xu hướng đi xuống rõ rệt.

4.15. Biểu đồ cột nhóm Vốn góp và Vốn chủ sở hữu

1. data_plot <- dataDBC %>%
2.   select(date, von_gop, von_csh) %>%
3.   pivot_longer(cols = c(von_gop, von_csh),
4.                names_to = "Type",
5.                values_to = "Value")
6. ggplot(data_plot, aes(x = factor(date), y = Value, fill = Type)) +
7.   geom_col(position = position_dodge(width = 0.8)) +
8.   geom_text(aes(label = scales::comma(round(Value, 0))),
9.             position = position_dodge(width = 0.8),
10.             vjust = -0.3, size = 3) +
11.   scale_fill_manual(values = c("von_gop" = "orange", "von_csh" = "skyblue"),
12.                     labels = c("Vốn góp", "Vốn CSH")) +
13.   scale_y_continuous(labels = scales::comma) +
14.   labs(title = "So sánh Vốn góp và Vốn chủ sở hữu qua năm",
15.        x = "Năm", y = "Giá trị (VNĐ)", fill = "") +
16.   theme_bw() +
17.   theme(axis.text.x = element_text(angle = 45, hjust = 1))

Nhận xét: Dòng 1–5: Tạo bảng data_plot từ dataDBC, chọn các biến date, von_gop và von_csh, sau đó chuyển dữ liệu sang dạng dài để thuận tiện khi vẽ.
Dòng 6–7: Vẽ biểu đồ cột thể hiện giá trị của vốn góp và vốn chủ sở hữu qua các năm, đặt hai cột cạnh nhau để so sánh.
Dòng 8–10: Thêm nhãn giá trị trên đầu cột, hiển thị dưới dạng số có dấu phẩy phân cách.
Dòng 11–17: Gán màu cho từng loại vốn, thiết lập tiêu đề, định dạng trục và xoay nhãn năm trên trục X.
Đường hồi quy có độ dốc âm, nghĩa là khi tăng trưởng lợi nhuận tăng, tỷ lệ nợ/vốn có xu hướng giảm.
Mối quan hệ này cho thấy: khi doanh nghiệp đạt được tăng trưởng lợi nhuận cao hơn, họ có xu hướng giảm phụ thuộc vào nợ, hoặc cơ cấu vốn trở nên lành mạnh hơn.
Tuy nhiên, các điểm dữ liệu rải rác cho thấy vẫn có dao động giữa các năm, chứng tỏ tác động giữa lợi nhuận và tỷ lệ nợ/vốn chưa hoàn toàn ổn định.

4.16. Biến động Phải trả người lao động

1. ggplot(dataDBC, aes(x = date, y = phai_tra_nld)) +
2.   geom_line(color = "orange", linewidth = 1.2) +
3.   geom_point(color = "red", size = 2) +
4.   geom_smooth(method = "lm", se = FALSE, color = "blue") +
5.   labs(
6.     title = "Phải trả người lao động qua thời gian",
7.     x = "Năm",
8.     y = "Giá trị (VNĐ)"
9.   ) +
10.   theme_minimal() +
11.   scale_x_continuous(
12.     breaks = unique(dataDBC$date),  
13.     labels = unique(dataDBC$date)
14.   ) +
15.   scale_y_continuous(labels = scales::comma)

Nhận xét: Dòng 1: Gọi dữ liệu dataDBC, lấy năm làm trục X và giá trị phải trả người lao động làm trục Y.
Dòng 2–3: Vẽ đường nối và các điểm biểu diễn biến động giá trị qua từng năm.
Dòng 4: Thêm đường hồi quy tuyến tính thể hiện xu hướng thay đổi theo thời gian.
Dòng 5–6: Thiết lập tiêu đề, nhãn trục và định dạng giao diện tối giản.
Khoản phải trả người lao động có sự dao động mạnh qua các năm.
Giai đoạn 2015–2018, giá trị tăng nhẹ nhưng không ổn định, có năm giảm xuống thấp.
Từ 2019 đến 2021, khoản phải trả tăng vọt, đạt mức cao nhất vào năm 2021–2022.
Sau đó giảm mạnh vào năm 2022, rồi phục hồi trở lại trong hai năm 2023–2024.
Đường hồi quy cho thấy xu hướng tăng tổng thể: về dài hạn, nghĩa vụ phải trả cho người lao động của doanh nghiệp có xu hướng ngày càng lớn hơn, phản ánh quy mô hoạt động mở rộng hoặc chi phí nhân sự tăng dần theo thời gian.

4.17. Phân bố Tỷ lệ Nợ/Vốn

1. ggplot(dataDBC, aes(x = ty_le_no_von)) +
2.   geom_density(fill = "green", alpha = 0.5) +
3.   geom_vline(aes(xintercept = mean(ty_le_no_von, na.rm = TRUE)),
4.              color = "red", linetype = "dashed", linewidth = 1) +
5.   labs(title = "Phân phối tỷ lệ Nợ/Vốn", x = "Tỷ lệ", y = "Mật độ") +
6.   theme_light()

Nhận xét: Dòng 1: Gọi dữ liệu dataDBC, lấy tỷ lệ Nợ/Vốn làm biến trên trục X.
Dòng 2: Vẽ biểu đồ mật độ thể hiện phân bố của tỷ lệ Nợ/Vốn.
Dòng 3–4: Thêm đường dọc biểu thị giá trị trung bình của tỷ lệ Nợ/Vốn trong toàn bộ giai đoạn.
Dòng 5–6: Đặt tiêu đề, nhãn trục và định dạng giao diện sáng.
Tỷ lệ Nợ/Vốn phân bố trong khoảng từ khoảng 1,2 đến 2,1, tức là nợ chiếm 120%–210% vốn chủ sở hữu.
Biểu đồ có hai đỉnh nhỏ, cho thấy tỷ lệ này không tập trung quanh một giá trị duy nhất mà dao động ở hai mức phổ biến — phản ánh sự biến động trong cấu trúc nguồn vốn giữa các năm.
Đường trung bình (đỏ) nằm gần 1,6, nghĩa là trung bình mỗi 1 đồng vốn chủ sở hữu, doanh nghiệp sử dụng khoảng 1,6 đồng nợ.

4.18. Biểu đồ tổng hợp LN, vốn và Nợ

1. ggplot(dataDBC, aes(x = date)) +
2.   geom_line(aes(y = ln_sau_thue/1e9, color = "LN sau thuế"), linewidth = 1.1) +
3.   geom_line(aes(y = von_csh/1e9, color = "Vốn CSH"), linewidth = 1.1) +
4.   geom_line(aes(y = no_phai_tra/1e9, color = "Nợ phải trả"), linewidth = 1.1) +
5.   labs(
6.     title = "So sánh tổng hợp 3 chỉ tiêu tài chính",
7.     x = "Năm",
8.     y = "Giá trị (tỷ VNĐ)",
9.     color = "Chỉ tiêu"
10.   ) +
11.   theme_classic() +
12.   scale_color_manual(
13.     values = c(
14.       "LN sau thuế" = "red",
15.       "Vốn CSH" = "blue",
16.       "Nợ phải trả" = "green"
17.     )
18.   ) +
19.   scale_y_continuous(labels = scales::comma) +
20.   scale_x_continuous(
21.     breaks = unique(dataDBC$date),  
22.     labels = unique(dataDBC$date)
23.   )

Nhận xét: Dòng 1: Gọi dữ liệu dataDBC, lấy năm làm trục X.
Dòng 2–4: Vẽ ba đường biểu diễn giá trị của lợi nhuận sau thuế, vốn chủ sở hữu và nợ phải trả theo từng năm, quy đổi về đơn vị tỷ đồng.
Dòng 5–7: Thiết lập tiêu đề, nhãn trục và gán màu riêng cho từng chỉ tiêu tài chính.
Nợ phải trả (xanh lá) luôn cao nhất trong ba chỉ tiêu, cho thấy doanh nghiệp phụ thuộc nhiều vào nguồn vốn vay. Từ 2015 đến 2020, nợ tăng liên tục và đạt đỉnh quanh 2022–2023, sau đó giảm nhẹ năm 2024.
Vốn chủ sở hữu (xanh dương) có xu hướng tăng đều đặn, đặc biệt tăng mạnh giai đoạn 2020–2024, phản ánh doanh nghiệp củng cố nội lực tài chính trong những năm gần đây.
Lợi nhuận sau thuế (đỏ) biến động mạnh — tăng cao vào năm 2020 nhưng giảm sâu 2021–2023 trước khi phục hồi năm 2024. Điều này cho thấy hiệu quả hoạt động chưa ổn định, dù quy mô vốn và nợ đều tăng.

4.19. Biểu đồ vùng (Area Chart): Biến động LN sau thuế qua các năm

1. ggplot(dataDBC, aes(x = date, y = ln_sau_thue/1e9, fill = giai_doan)) +
2.   geom_area(alpha = 0.6) +
3.   geom_line(color = "darkblue", linewidth = 1.2) +
4.   geom_point(color = "white", size = 2) +
5.   labs(
6.     title = "Biến động lợi nhuận sau thuế theo giai đoạn",
7.     x = "Năm",
8.     y = "Lợi nhuận (tỷ VNĐ)",
9.     fill = "Giai đoạn"
10.   ) +
11.   scale_y_continuous(labels = scales::comma) +
12.   scale_x_continuous(
13.     breaks = unique(dataDBC$date),  
14.     labels = unique(dataDBC$date)
15.   ) +
16.   theme_minimal()

Nhận xét: Dòng 1: Gọi dữ liệu dataDBC, lấy năm làm trục X, lợi nhuận sau thuế làm trục Y và phân nhóm theo giai đoạn.
Dòng 2–4: Vẽ biểu đồ vùng thể hiện biến động lợi nhuận qua các năm, kết hợp đường và điểm để nhấn mạnh xu hướng.
Dòng 5–8: Thiết lập tiêu đề, nhãn trục, định dạng đơn vị hiển thị và giao diện tối giản.
Giai đoạn 2015–2019:
Lợi nhuận ở mức ổn định trung bình, dao động quanh 200–400 tỷ đồng.
Năm 2016 có mức cao nhất, sau đó giảm nhẹ rồi giữ ổn định đến 2019. → Đây là thời kỳ duy trì tăng trưởng ổn định, ít biến động.
Giai đoạn 2020–2024:
Lợi nhuận tăng mạnh năm 2020, vượt mốc 1.200 tỷ đồng — cao hơn hẳn giai đoạn trước.
Tuy nhiên, sau đó giảm mạnh 2021–2022, gần như chạm đáy.
Phục hồi rõ rệt vào năm 2024. → Giai đoạn này thể hiện biến động mạnh về hiệu quả kinh doanh, có thể do ảnh hưởng yếu tố kinh tế vĩ mô hoặc chi phí tài chính tăng cao.

4.20. Biểu đồ mật độ: Phân phối LN sau thuế

1. ggplot(dataDBC, aes(x = ln_sau_thue/1e9, fill = giai_doan)) +
2.   geom_density(alpha = 0.6) +
3.   geom_vline(aes(xintercept = mean(ln_sau_thue/1e9, na.rm = TRUE)),
4.              color = "red", linetype = "dashed", linewidth = 1) +
5.   annotate("text", x = mean(dataDBC$ln_sau_thue/1e9, na.rm = TRUE),
6.            y = 0.005, label = "Trung bình", color = "red", hjust = -0.2) +
7.   labs(title = "Phân phối mật độ lợi nhuận sau thuế",
8.        x = "LN sau thuế (tỷ VNĐ)", y = "Mật độ") +
9.   theme_minimal()

Nhận xét: Dòng 1: Gọi dữ liệu dataDBC, lấy lợi nhuận sau thuế làm trục X và phân loại theo giai đoạn.
Dòng 2: Vẽ biểu đồ mật độ thể hiện phân bố lợi nhuận sau thuế của các giai đoạn.
Dòng 3–6: Thêm đường dọc biểu thị giá trị trung bình và ghi chú “Trung bình” tại vị trí tương ứng.
Dòng 7–9: Đặt tiêu đề, nhãn trục và định dạng giao diện tối giản.
Giai đoạn 2015–2019 (đỏ):
Phân phối tập trung hẹp, lệch phải nhẹ.
Phần lớn giá trị LNST nằm trong khoảng 200–400 tỷ VND, tức khá ổn định quanh mức trung bình.
Ít biến động và gần như không có giá trị cực đoan.
Giai đoạn 2020–2024 (xanh):
Phân phối trải rộng hơn, kéo dài đến trên 1.200 tỷ VND.
Điều này thể hiện độ biến động cao hơn rõ rệt: có năm lợi nhuận rất cao, nhưng cũng có năm gần mức thấp.
Trung bình giai đoạn này cao hơn giai đoạn trước, nhưng phân tán hơn → rủi ro lợi nhuận lớn hơn.