1. tinytex::tlmgr_update()
2. tinytex::tlmgr_install(c("xetex", "xunicode", "xltxtra", "fontspec"))
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.
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. 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. dim(Data)
## [1] 100000 20
Nhận xét: Dữ liệu thô có 100000 quan sát và 20 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. 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"))
| 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. 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. 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. 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. 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. 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.
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.
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.
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
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.
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.
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.
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.
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).
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
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”.
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”.
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.
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.
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.
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.
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.
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.
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.
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ệ.
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.
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.
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ể.
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.
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.
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.
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.
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.
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.
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.
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ợ.
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ự.
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.
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.
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.
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.
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.
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.
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.
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.
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.
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.
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.
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.
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.
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ờ.
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.
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.
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.
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.
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.
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)
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.
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. 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. 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. 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. 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. 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. 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. 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. 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”.
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.
1. dataDBC$`loi_nhuan_sau_thue_chua_phan_phoi` <-
2. as.numeric(dataDBC$`loi_nhuan_sau_thue_chua_phan_phoi`)
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.
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.
1. dataDBC$date <- as.numeric(dataDBC$date)
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.
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. )
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.
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.
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.
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 …
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.
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.
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.
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.
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.
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.
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.
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.
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ể.
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ợ.
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.
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ư.
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.
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.
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.
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.
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.
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.
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.
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.
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)
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ả.
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.
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.
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.
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.
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.
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ả.
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ể.
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.
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.
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.
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.
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.
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.
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.
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.
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ợ.
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.
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.
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.