CHƯƠNG 1: BỘ DỮ LIỆU CUSTOMER CHURN DATASET FOR LIFE INSURANCE INDUSTRY
# Chuẩn bị cho máy tính khả năng mở và xem dữ liệu từ file Excel
library(readxl)
#Đọc dữ liệu file excel và lưu vào df
df <- read_excel("Customer.xlsx")Đoạn mã R được sử dụng để nhập bộ dữ liệu Customen từ tệp Excel vào môi trường làm việc của R để chuẩn bị cho quá trình phân tích
Bộ dữ liệu được sử dụng trong tiểu luận này được thu thập từ nền tảng Kaggle, một kho lưu trữ dữ liệu trực tuyến phổ biến, được sử dụng rộng rãi trong các nghiên cứu học thuật và dự án phân tích dữ liệu. Bộ dữ liệu phản ánh thông tin của khách hàng trong lĩnh vực bảo hiểm nhân thọ, bao gồm nhiều đặc điểm nhân khẩu học, hành vi tiêu dùng và tình trạng rời bỏ dịch vụ (churn).
Việc sử dụng bộ dữ liệu này trong nghiên cứu nhằm phân tích và xác định các yếu tố có ảnh hưởng đáng kể đến khả năng rời bỏ của khách hàng, từ đó xây dựng mô hình dự báo churn có độ chính xác cao. Kết quả phân tích không chỉ giúp doanh nghiệp nhận diện nhóm khách hàng có nguy cơ rời bỏ, mà còn là cơ sở để đề xuất các chính sách chăm sóc, duy trì và phát triển khách hàng hiệu quả hơn. Ngoài ra, nghiên cứu cũng mang ý nghĩa thực tiễn khi thể hiện ứng dụng của phân tích dữ liệu trong ngành bảo hiểm nhân thọ, góp phần nâng cao hiệu quả hoạt động và năng lực cạnh tranh của doanh nghiệp trên thị trường.
Đoạn mã R được sử dụng để nhập bộ dữ liệu Customen từ tệp Excel vào môi trường làm việc của R để chuẩn bị cho quá trình phân tích
## [1] 200000 12
Bộ dữ liệu có 12 biến và 200000 quan sát.
# Gói giúp chèn kết quả trực tiếp vào báo cáo
library(knitr)
# Liệt kê các thuật ngữ Tiếng Anh trong dữ liệu
variable_meaning <- data.frame(
Variable = c(
"Index",
"Customer Name",
"Customer Address",
"Company Name",
"Claim Reason",
"Data confidentiality",
"Claim Amount",
"Category Premium",
"Premium/Amount Ratio",
"Claim Request output",
"BMI",
"Churn"
),
# Giải thích ý nghĩa của thuật ngữ đó bằng tiếng Việt
Meaning = c(
"Số thứ tự của khách hàng trong bộ dữ liệu",
"Tên khách hàng",
"Địa chỉ khách hàng",
"Tên công ty bảo hiểm quản lý hợp đồng",
"Lý do khách hàng yêu cầu bồi thường",
"Mức độ bảo mật dữ liệu của khách hàng",
"Số tiền khách hàng yêu cầu bồi thường",
"Mức phí bảo hiểm của khách hàng",
"Tỷ lệ giữa phí bảo hiểm và số tiền yêu cầu bồi thường",
"Kết quả xử lý yêu cầu bồi thường ",
"Chỉ số khối cơ thể",
"Khách hàng có rời công ty bảo hiểm hay không"
),
# Không tự động biến những cột chữ thành mã số nhóm
stringsAsFactors = FALSE
)
# Trình bày kết quả ra màn hình
kable(variable_meaning, col.names = c("Variable", "Meaning"))| Variable | Meaning |
|---|---|
| Index | Số thứ tự của khách hàng trong bộ dữ liệu |
| Customer Name | Tên khách hàng |
| Customer Address | Địa chỉ khách hàng |
| Company Name | Tên công ty bảo hiểm quản lý hợp đồng |
| Claim Reason | Lý do khách hàng yêu cầu bồi thường |
| Data confidentiality | Mức độ bảo mật dữ liệu của khách hàng |
| Claim Amount | Số tiền khách hàng yêu cầu bồi thường |
| Category Premium | Mức phí bảo hiểm của khách hàng |
| Premium/Amount Ratio | Tỷ lệ giữa phí bảo hiểm và số tiền yêu cầu bồi thường |
| Claim Request output | Kết quả xử lý yêu cầu bồi thường |
| BMI | Chỉ số khối cơ thể |
| Churn | Khách hàng có rời công ty bảo hiểm hay không |
Cung cấp định nghĩa rõ ràng cho 12 biến, đặc biệt là biến mục tiêu Churn (Khách hàng có rời công ty bảo hiểm hay không) và các biến số quan trọng khác như Claim Amount, Category Premium, và BMI.
# Tạo đối tượng tibble chứa thông tin tóm tắt
library(tibble)
data_types_summary <- tibble(
Ten_Cot = c("Index", "Customer Name", "Customer Address", "Company Name",
"Claim Reason", "Data confidentiality", "Claim Amount",
"Category Premium", "Premium/Amount Ratio", "Claim Request output",
"BMI", "Churn"),
Loai_Du_lieu_trong_R = c("num", "chr", "chr", "chr", "chr",
"chr", "num", "num", "num", "chr",
"num", "chr")
)
# Tải gói knitr và hiển thị bảng
library(knitr)
kable(data_types_summary,
caption = "Bảng Tóm Tắt Loại Dữ liệu",
col.names = c("Tên Cột", "Loại Dữ liệu trong R (R Type)")
)| Tên Cột | Loại Dữ liệu trong R (R Type) |
|---|---|
| Index | num |
| Customer Name | chr |
| Customer Address | chr |
| Company Name | chr |
| Claim Reason | chr |
| Data confidentiality | chr |
| Claim Amount | num |
| Category Premium | num |
| Premium/Amount Ratio | num |
| Claim Request output | chr |
| BMI | num |
| Churn | chr |
Có 5 biến định lương (num) và 7 biến định tính (chr).
## Min. 1st Qu. Median Mean 3rd Qu. Max.
## 0 50000 100000 100000 149999 199999
Đây là biến số thứ tự, nó không mang ý nghĩa thống kê
## Min. 1st Qu. Median Mean 3rd Qu. Max.
## 1 245 1390 1120 1844 2299
Giá trị Trung vị (Median = 1390) cao hơn đáng kể so với Giá trị Trung bình (Mean = 1120). Sự chênh lệch này (\(\text{Median} > \text{Mean}\)) chỉ ra rằng phân bố dữ liệu bị lệch trái.
Kết luận: Phần lớn các yêu cầu bồi thường đều có giá trị ở mức cao (gần \(1390\) đến \(2299\)). Giá trị Trung bình bị kéo xuống thấp hơn do sự tồn tại của một lượng nhỏ các yêu cầu có giá trị rất thấp (gần \(1\)). Điều này cho thấy công ty bảo hiểm phải xử lý một lượng lớn các yêu cầu bồi thường có giá trị lớn.
## Min. 1st Qu. Median Mean 3rd Qu. Max.
## 399 1875 14390 8964 14390 14390
Phân tích thống kê mô tả cho biến Category Premium cho thấy một sự phân bố cực kỳ bất thường và lệch trái nghiêm trọng. Sự trùng khớp giữa Giá trị Trung vị (\(\text{Median} = 14390\)), Tứ phân vị thứ ba (\(\mathbf{3^{rd} Qu.} = 14390\)) và Giá trị Cao nhất (\(\mathbf{Max.} = 14390\)) chỉ ra rằng phần lớn (ít nhất \(\mathbf{75\%}\) ) các khách hàng đều đóng mức phí bảo hiểm cao nhất là \(14390\).
Giá trị Trung bình (\(\mathbf{Mean} = 8964\)) thấp hơn Trung vị rất nhiều, bị kéo xuống bởi một lượng nhỏ các khách hàng đóng phí thấp (chỉ từ \(\mathbf{399}\) đến \(1875\)). Điều này gợi ý rằng mô hình phí bảo hiểm đang có tính tập trung cao vào mức phí tối đa, hoặc hầu hết khách hàng thuộc nhóm phí cao nhất.
# Chuyển đổi biến từ kiểu character sang kiểu numeric
df$'Premium/Amount Ratio' <- as.numeric(df$'Premium/Amount Ratio')
# Tóm tắt biến Premium/Amount Ratio
summary(df$`Premium/Amount Ratio`)## Min. 1st Qu. Median Mean 3rd Qu. Max.
## 0.002506 0.106741 0.125122 0.125024 0.143155 0.248120
Giá trị Trung vị (Median = 0.125122) và Giá trị Trung bình (Mean = 0.125024) gần như bằng nhau (\(\text{Median} \approx \text{Mean}\)). Điều này chỉ ra rằng sự phân bố tỷ lệ là rất đối xứng (không bị lệch đáng kể).
Khoảng phân tán (Range): Tỷ lệ nằm trong khoảng hẹp, từ tối thiểu \(\mathbf{0.0025}\) đến tối đa \(\mathbf{0.248}\).
Kết luận: Phần lớn các quan sát có tỷ lệ phí bảo hiểm trên số tiền yêu cầu bồi thường tập trung rất sát mức \(\mathbf{12.5\%}\) (\(0.125\)). Điều này cho thấy có một sự ổn định hoặc tính đồng nhất cao trong cách công ty bảo hiểm định giá phí so với rủi ro tiềm ẩn (số tiền bồi thường).
## Min. 1st Qu. Median Mean 3rd Qu. Max.
## 18.00 20.00 23.00 23.01 26.00 28.00
Biến BMI có phân bố rất đối xứng, được xác định bởi sự trùng khớp giữa Giá trị Trung bình (\(\text{Mean} = 23.01\)) và Giá trị Trung vị (\(\text{Median} = 23.00\)).BMI của khách hàng dao động trong khoảng từ \(\mathbf{18.00}\) (thấp nhất) đến \(\mathbf{28.00}\) (cao nhất). Phần lớn chỉ số BMI tập trung chặt chẽ xung quanh mức \(23.00\), với \(50\%\) số khách hàng có BMI nằm trong khoảng \(\mathbf{20.00}\) đến \(\mathbf{26.00}\) (khoảng tứ phân vị).
Kết quả này cho thấy, về tổng thể, khách hàng trong bộ dữ liệu có chỉ số khối cơ thể tương đối đồng nhất và nằm chủ yếu trong phạm vi cân nặng khỏe mạnh đến thừa cân nhẹ, không có trường hợp BMI quá cực đoan.
Các biến Customer Name, Customer Address và Company Name không mang ý nghĩa thống kê
##
## Medical Other Phone Travel
## 109863 30187 30016 29934
Medical (109863): Có 109863 trường hợp yêu cầu bồi thường liên quan đến lý do Y tế/Sức khỏe.
Other (30187): Có 30187 trường hợp yêu cầu bồi thường thuộc các lý do Khác (không được phân loại cụ thể).
Phone (30016): Có 30016 trường hợp yêu cầu bồi thường liên quan đến Điện thoại (có thể là hư hỏng, mất mát thiết bị, hoặc các vấn đề liên quan đến dịch vụ).
Travel (29934): Có 29934 trường hợp yêu cầu bồi thường liên quan đến Du lịch (có thể là hủy chuyến, mất hành lý, trễ giờ, v.v.).
Lý do phổ biến nhất là Medical, chiếm số lượng áp đảo so với các lý do khác. Điều này cho thấy các yêu cầu bồi thường y tế là vấn đề lớn nhất trong dữ liệu này.
Ba loại còn lại (Other, Phone, Travel) có số lượng khá tương đương nhau, dao động quanh mức 30000 trường hợp.
##
## High Low Medium Very low
## 109863 29934 30016 30187
Dữ liệu cho thấy có một sự phân cực rõ rệt: phần lớn các bản ghi được coi là có mức độ bảo mật Cao, trong khi ba mức độ còn lại (Low, Medium, Very low) có số lượng bản ghi tương đương nhau và thấp hơn đáng kể so với mức High.
##
## No Yes
## 192994 7006
Kết quả cho thấy một sự mất cân bằng rất lớn trong dữ liệu.
Số lượng yêu cầu bị từ chối (No) (199994) lớn hơn rất nhiều so với số lượng yêu cầu được chấp thuận (Yes) (7006).
##
## No Yes
## 72728 127272
Kết quả cho thấy số lượng khách hàng rời bỏ (Yes) (127272) lớn hơn đáng kể so với số lượng khách hàng duy trì (72728).
Điều này chỉ ra rằng công ty đang đối mặt với một tỷ lệ khách hàng rời bỏ rất cao.
## Index Customer Name Customer_Address
## 0 0 0
## Company Name Claim Reason Data confidentiality
## 0 0 0
## Claim Amount Category Premium Premium/Amount Ratio
## 0 0 0
## Claim Request output BMI Churn
## 0 0 0
Bộ dữ liệu không có giá trị bị thiếu
##
## Attaching package: 'dplyr'
## The following objects are masked from 'package:stats':
##
## filter, lag
## The following objects are masked from 'package:base':
##
## intersect, setdiff, setequal, union
library(stringr)
library(readr)
library(tibble)
# Tạo bản sao dữ liệu gốc để bắt đầu chuỗi xử lý
data_start <- df
data_start # Tách mã bang/tiểu bang (hai chữ cái in hoa) nằm sau dấu phẩy và khoảng trắng, trước mã ZIP 5 chữ số
data_step_1 <- data_start %>%
mutate(State = str_extract(Customer_Address, pattern = "(?<=,\\s)[A-Z]{2}(?=\\s\\d{5})|(?<=,\\s)[A-Z]{2}(?=\\d{5})")) %>%
mutate(State = ifelse(is.na(State), "Unknown", State))
data_step_1Tạo ra cột State mới chứa mã bang/tiểu bang của khách hàng.
# Làm sạch Cột (Xóa cột Address và Index)
data_step_2 <- data_step_1 %>%
select(-Index, -Customer_Address)
data_step_2Giảm số lượng biến, làm sạch dữ liệu
# Sử dụng str_to_title() để chuẩn hóa văn bản
data_step_3 <- data_step_2 %>%
mutate('Company Name' = str_to_title(`Company Name`))
data_step_3Đảm bảo tính nhất quán trong dữ liệu định tính.
# Đổi tên cột (Chuẩn hóa)
data_step_4 <- data_step_3 %>%
rename(Customer_Name = 'Customer Name',
Company_Name='Company Name',
Claim_Request_Output = 'Claim Request output',
Data_Confidentiality = 'Data confidentiality',
Claim_Reason = 'Claim Reason',
Claim_Amount = 'Claim Amount',
Category_Premium = 'Category Premium')
data_step_4Tăng tính dễ đọc và thuận tiện khi làm việc với R, đặc biệt khi sử dụng các thư viện như dplyr.
# Hàm as.integer() chuyển đổi cột Claim_Amount từ kiểu số thực (numeric) sang kiểu số nguyên (integer)
data_step_5 <- data_step_4 %>%
mutate(Claim_Amount = as.integer(Claim_Amount))
data_step_5Đảm bảo kiểu dữ liệu phù hợp với bản chất của biến (số tiền bồi thường thường được xử lý dưới dạng số nguyên).
# Hàm ifelse() tạo cột mới Churn_Encoded:Nếu Churn là "Yes" (Rời bỏ), gán giá trị 1.Nếu Churn là "No" (Duy trì), gán giá trị 0.
data_step_6 <- data_step_5 %>%
mutate(Churn_Encoded = ifelse(Churn == "Yes", 1, 0))
data_step_6Chuyển biến mục tiêu Churn từ định tính sang mã hóa nhị phân để có thể sử dụng trong các mô hình học máy (như Hồi quy Logistic).
# Sử dụng factor() với các đối số:levels: Thiết lập thứ tự rõ ràng cho các mức độ (từ "Very low" đến "Very high").labels = 1:5: Gán nhãn số (1 đến 5) tương ứng với thứ tự đó. ordered = TRUE: Khai báo biến này là có thứ bậc.
confidentiality_levels <- c("Very low", "Low", "Medium", "High", "Very high")
data_step_7 <- data_step_6 %>%
mutate(Data_Conf_Encoded = factor(Data_Confidentiality,
levels = confidentiality_levels,
labels = 1:5,
ordered = TRUE))
data_step_7Mã hóa biến định tính có thứ bậc Data_Confidentiality thành số để thể hiện rõ ràng mức độ quan trọng tăng dần, phù hợp cho phân tích hoặc mô hình hóa có tính đến thứ bậc.
# Sử dụng hàm cut() để phân loại biến số định lượng BMI thành các nhóm định tính (BMI_Status). breaks: Xác định các ngưỡng cắt theo tiêu chuẩn y tế (< 18.5: Dưới cân; 18.5 - 24.9: Bình thường; 25.0 - 29.9: Thừa cân; >= 30: Béo phì). Labels: Gán tên cho 4 nhóm.
data_step_9 <- data_step_8 %>%
mutate(BMI_Status = cut(BMI,
breaks = c(0, 18.5, 25, 30, Inf), # Các điểm cắt
labels = c("Underweight", "Normal", "Overweight", "Obese"), # Tên của 4 nhóm
include.lowest = TRUE,
right = FALSE))
data_step_9## # A tibble: 3 × 2
## BMI_Status n
## <fct> <int>
## 1 Underweight 18293
## 2 Normal 108979
## 3 Overweight 72728
Chuyển đổi một biến số liên tục thành biến phân loại, giúp phân tích các nhóm khách hàng theo tình trạng sức khỏe dễ dàng hơn.
# model.matrix(~ Claim_Reason - 1, ...): Mã hóa One-Hot cho biến định tính Claim_Reason, tạo các biến giả (0/1) cho từng lý do; -1 loại bỏ cột chặn. bind_cols(): Ghép các cột biến giả vào dữ liệu gốc. rename_with(): Đổi tên cột biến giả cho ngắn gọn, dễ hiểu.
reason_dummies <- model.matrix(~ Claim_Reason - 1, data = data_step_9) %>% as_tibble()
data_step_10 <- bind_cols(data_step_9, reason_dummies)
data_step_10 <- data_step_10 %>% rename_with(~ gsub("Claim_Reason", "Reason_", .x), starts_with("Claim_Reason"))
data_step_10Thao tác data_step_10 (One-Hot Encoding): Mã hóa biến Claim_Reason từ dạng chữ sang dạng số bằng cách tạo các cột nhị phân (ví dụ: Reason_Medical, Reason_Travel), giúp mô hình học máy xử lý dữ liệu định tính mà không giả định thứ bậc giữa các nhóm.
## corrplot 0.95 loaded
##
## Attaching package: 'scales'
## The following object is masked from 'package:readr':
##
## col_factor
# Tính tổng số khách hàng, số khách hàng rời bỏ (tổng của Churn_Encoded = 1), và sau đó tính Tỷ lệ Churn (Trung bình của Churn_Encoded nhân 100).
churn_rate <- dff %>%
summarise(
Total_Customers = n(),
Churned_Customers = sum(Churn_Encoded),
Churn_Rate = mean(Churn_Encoded) * 100
)
churn_rateCung cấp tỷ lệ khách hàng rời bỏ bảo hiểm tổng thể( \(63.636\%\)), khẳng định công ty đang đối mặt với vấn đề khách hàng rời bỏ nghiêm trọng.
# Sử dụng geom_bar() để vẽ biểu đồ tần suất của biến Churn. geom_text thêm nhãn số lượng lên trên mỗi cột.
ggplot(dff, aes(x = Churn, fill = Churn)) +
geom_bar() + # Layer 1: Đồ thị thanh
labs(title = "Phân Bố Khách Hàng Rời Bỏ (Churn)",
x = "Trạng thái Rời bỏ",
y = "Số lượng Khách hàng") + # Layer 2: Tiêu đề và nhãn
scale_fill_manual(values = c("Yes" = "#E41A1C", "No" = "#377EB8")) + # Layer 3: Đổi màu
geom_text(stat = 'count', aes(label = after_stat(count)), vjust = -0.5, size = 4) + # Layer 4: Gắn nhãn số lượng
theme_minimal() + # Layer 5: Chủ đề tối giản
expand_limits(y = 130000) # tạo thêm khoảng trống phía trênBiểu đồ cho thấy sự chênh lệch rõ rệt giữa hai nhóm khách hàng “Rời bỏ” và “Không rời bỏ”. Cụ thể, có 127.272 khách hàng đã rời bỏ so với 72.728 khách hàng còn ở lại, chiếm tỷ lệ rời bỏ khoảng 63,6% tổng số khách hàng. Điều này cho thấy mức độ rời bỏ khách hàng khá cao, phản ánh khả năng giữ chân khách hàng của doanh nghiệp chưa hiệu quả.
# cut() chia BMI thành các khoảng 1 đơn vị. group_by() và summarise(n()) đếm số lượng khách hàng trong từng khoảng.
bmi_freq <- dff %>%
mutate(BMI_group = cut(BMI, breaks = seq(floor(min(BMI)), ceiling(max(BMI)), by = 1))) %>%
group_by(BMI_group) %>%
summarise(TanSuat = n()) %>%
arrange(BMI_group)
# Hiển thị bảng tần suất
bmi_freqBảng tần số BMI cho thấy đa số khách hàng có chỉ số cơ thể nằm trong mức trung bình hợp lý, phản ánh phân bố tương đối cân đối và không có sự chênh lệch cực đoan trong mẫu dữ liệu.
# Biểu đồ Histogram cho BMI
ggplot(dff, aes(x = BMI)) +
geom_histogram(binwidth = 1, fill = "#4DAF4A", color = "white") + # Layer 1: Histogram, binwidth = 1
labs(title = "Phân Bố Chỉ Số Khối Cơ Thể (BMI)",
x = "Chỉ số BMI",
y = "Tần suất") + # Layer 2: Tiêu đề và nhãn
geom_vline(aes(xintercept = mean(BMI)), color = "red", linetype = "dashed", linewidth = 1) + # Layer 3: Đường trung bình
annotate("text", x = mean(dff$BMI) + 2, y = 30000, label = paste("Mean =", round(mean(dff$BMI), 2)), color = "red") + # Layer 4: Ghi chú trung bình
theme_classic() # Layer 5: Chủ đề cổ điểnPhân bố Chỉ số Khối Cơ Thể (BMI) của tập dữ liệu cho thấy BMI trung bình là \(23.01\). Giá trị này nằm trong ngưỡng BMI bình thường theo tiêu chuẩn chung, cho thấy phần lớn đối tượng nghiên cứu có tình trạng cân nặng khỏe mạnh. Biểu đồ tần suất thể hiện sự phân bố tương đối đồng đều của các giá trị BMI trong phạm vi quan sát (khoảng \(17.5\) đến \(27.5\)), với không có sự chênh lệch lớn về tần suất giữa các nhóm BMI.
# Biểu đồ Hộp (Box Plot) Claim Amount theo Churn
ggplot(dff, aes(x = Churn, y = Claim_Amount, fill = Churn)) +
geom_boxplot() + # Layer 1: Biểu đồ hộp
labs(title = "Phân Bố Số Tiền Yêu Cầu Bồi Thường theo Trạng thái Churn",
x = "Khách hàng Rời bỏ",
y = "Số tiền Bồi thường (Claim Amount)") + # Layer 2: Tiêu đề và nhãn
coord_flip() + # Layer 3: Xoay trục
scale_fill_manual(values = c("Yes" = "#E41A1C", "No" = "#377EB8")) + # Layer 4: Đổi màu
theme_bw() # Layer 5: Chủ đề đen trắngBiểu đồ so sánh lượng bồi thường (Claim Amount) theo trạng thái rời bỏ (Churn) cho thấy một mối liên hệ rõ ràng: Khách hàng đã rời bỏ (Yes) có xu hướng yêu cầu số tiền bồi thường trung vị cao hơn so với khách hàng không rời bỏ (No). Mặc dù phạm vi phân bố (phương sai) tương tự nhau, toàn bộ hộp của nhóm Rời bỏ được dịch chuyển lên phía giá trị bồi thường cao hơn, gợi ý rằng lượng bồi thường cao có thể là một yếu tố thúc đẩy khách hàng quyết định rời bỏ công ty.
# Thư viện cần thiết
library(dplyr)
library(knitr)
# tạo bảng tỷ lệ Churn theo Data_Confidentiality
churn_by_conf_table <- dff %>%
# Nhóm dữ liệu theo Mức độ Bảo mật
group_by(Data_Confidentiality) %>%
# Tính Tỷ lệ Churn (Churn Rate) cho mỗi nhóm
summarise(
Total_Customers = n(), # Tổng số khách hàng
Churned_Customers = sum(Churn_Encoded), # Số khách hàng đã rời bỏ (Churned)
Churn_Rate = mean(Churn_Encoded) * 100 # Tỷ lệ Churn (%)
) %>%
# Chuyển đổi Data_Confidentiality thành factor và sắp xếp theo thứ tự mong muốn
mutate(Data_Confidentiality = factor(Data_Confidentiality,
levels = c("Very low", "Low", "Medium", "High"))) %>%
# Sắp xếp lại bảng theo thứ tự của factor và làm tròn tỷ lệ Churn
arrange(Data_Confidentiality) %>%
mutate(Churn_Rate = round(Churn_Rate, 2))
# In ra bảng kết quả
kable(churn_by_conf_table, caption = "Bảng Tỷ lệ Churn theo Mức độ Bảo mật Dữ liệu")| Data_Confidentiality | Total_Customers | Churned_Customers | Churn_Rate |
|---|---|---|---|
| Very low | 30187 | 19203 | 63.61 |
| Low | 29934 | 19180 | 64.07 |
| Medium | 30016 | 18988 | 63.26 |
| High | 109863 | 69901 | 63.63 |
Mặc dù mức độ bảo mật dữ liệu có sự phân bố không đồng đều về số lượng khách hàng (tập trung ở mức “High”), nhưng dữ liệu này chỉ ra rằng mức độ bảo mật dữ liệu không phải là động lực chính gây ra sự khác biệt đáng kể về Tỷ lệ Churn. Khách hàng rời bỏ dịch vụ với tỷ lệ cao, bất kể mức độ bảo mật dữ liệu của họ là “Very low” hay “High”.
# Biến churn_by_conf_table đã được tạo ở bước trên
ggplot(churn_by_conf_table, aes(x = Data_Confidentiality, y = Churn_Rate)) +
# Layer 1: Đồ thị cột, tô màu cam
geom_col(fill = "#FF7F00") +
# Layer 2: Gắn nhãn tỷ lệ (%) lên trên mỗi cột
geom_text(aes(label = paste0(round(Churn_Rate, 2), "%")),
vjust = -0.5, # Điều chỉnh vị trí nhãn (lên trên cột)
size = 4) +
# Layer 3: Tiêu đề và nhãn trục
labs(
title = "Tỷ lệ khách hàng rời bỏ theo Mức độ Bảo mật Dữ liệu",
x = "Mức độ Bảo mật",
y = "Tỷ lệ rời bỏ (%)"
) +
# Layer 4: Điều chỉnh trục Y để có không gian cho nhãn
scale_y_continuous(limits = c(0, max(churn_by_conf_table$Churn_Rate) * 1.1)) +
# Layer 5: Áp dụng chủ đề tối giản
theme_minimal()Mặc dù số lượng khách hàng tập trung nhiều ở mức bảo mật “High” (109,863 người), nhưng kết quả trực quan và thống kê cho thấy Mức độ Bảo mật Dữ liệu dường như không phải là yếu tố phân biệt hoặc là động lực chính gây ra sự khác biệt đáng kể về Tỷ lệ Churn giữa các nhóm. Vấn đề Churn nghiêm trọng (\(> 63\%\)) là một vấn đề mang tính hệ thống ảnh hưởng đến toàn bộ khách hàng, bất kể mức độ bảo mật được cung cấp.
# Tỷ lệ Churn theo Claim Request Output
# Sử dụng dff, nhóm theo Claim_Request_Output và tính toán Tỷ lệ Churn
churn_by_claim_output <- dff %>%
group_by(Claim_Request_Output) %>%
summarise(Churn_Rate = mean(Churn_Encoded) * 100)
print(churn_by_claim_output)## # A tibble: 2 × 2
## Claim_Request_Output Churn_Rate
## <chr> <dbl>
## 1 No 63.6
## 2 Yes 63.5
Việc chấp thuận yêu cầu bồi thường (Claim Request Output = Yes) có rất ít hoặc hầu như không có tác động tích cực đến việc giảm tỷ lệ khách hàng rời bỏ. Khách hàng vẫn rời đi với tỷ lệ gần như nhau (khoảng 63.5%) bất kể kết quả yêu cầu bồi thường của họ như thế nào.
# Biểu đồ Cột Tỷ lệ Churn
ggplot(churn_by_claim_output, aes(x = Claim_Request_Output, y = Churn_Rate, fill = Claim_Request_Output)) +
geom_col() + # Layer 1: Đồ thị cột
labs(title = "Tỷ lệ khách hàng rời bỏ khi yêu cầu bồi thường được/không chấp nhận",
x = "Kết quả Yêu cầu Bồi thường",
y = "Tỷ lệ Churn (%)") + # Layer 2: Tiêu đề và nhãn
scale_fill_manual(values = c("No" = "#E41A1C", "Yes" = "#4DAF4A")) + # Layer 3: Đổi màu
# Layer 4: Gắn nhãn tỷ lệ - Đã tối ưu để hiển thị rõ số liệu
geom_text(aes(label = paste0(round(Churn_Rate, 2), "%")), vjust = -1.5, size = 6) +
# Mở rộng giới hạn trục Y để nhãn số không bị cắt
coord_cartesian(ylim = c(0, 75)) +
theme_bw() # Layer 5: Chủ đề đen trắngViệc giải quyết yêu cầu bồi thường thành công hầu như không có tác động tích cực đáng kể nào đến việc giữ chân khách hàng. Khách hàng vẫn rời bỏ với tỷ lệ gần như nhau, cho thấy yếu tố quyết định Churn nằm ở nơi khác.
# Số tiền Yêu cầu Bồi thường Trung bình theo Lý do Bồi thường (Sử dụng cột đã mã hóa)
# Tính toán bồi thường trung bình cho từng lý do
mean_claim_by_reason_fixed <- dff %>%
summarise(
Medical = mean(Claim_Amount[Reason_Medical == 1]),
Other = mean(Claim_Amount[Reason_Other == 1]),
Phone = mean(Claim_Amount[Reason_Phone == 1]),
Travel = mean(Claim_Amount[Reason_Travel == 1])
) %>%
# Chuyển đổi từ dạng rộng sang dạng dài để vẽ biểu đồ
tidyr::pivot_longer(cols = everything(),
names_to = "Claim_Reason_Fixed",
values_to = "Mean_Claim_Amount")
mean_claim_by_reason_fixedCác yêu cầu bồi thường liên quan đến Y Tế (Medical) là những yêu cầu tốn kém nhất đối với công ty bảo hiểm trên cơ sở trung bình mỗi lần bồi thường. Các yêu cầu bồi thường Du lịch cũng là một yếu tố chi phí quan trọng.
# Trực quan hóa
ggplot(mean_claim_by_reason_fixed, aes(x = Claim_Reason_Fixed, y = Mean_Claim_Amount, fill = Claim_Reason_Fixed)) +
geom_bar(stat = "identity") + # Layer 1: Đồ thị cột
labs(title = "Số tiền Bồi thường trung bình theo Lý do yêu cầu bồi thường ",
x = "Lý do Yêu cầu Bồi thường",
y = "Số tiền Bồi thường Trung bình") + # Layer 2: Tiêu đề và nhãn
scale_fill_brewer(palette = "Set1") + # Layer 3: Bảng màu
geom_text(aes(label = round(Mean_Claim_Amount, 0)), vjust = -0.5, size = 4) + # Layer 4: Gắn nhãn giá trị
theme_classic() + # Layer 5: Chủ đề cổ điển
theme(axis.text.x = element_text(angle = 45, hjust = 1)) # Xoay nhãn xCác yêu cầu bồi thường liên quan đến Y Tế (Medical) là nguồn chi phí bồi thường trung bình lớn nhất của công ty, gần gấp ba lần chi phí trung bình của loại cao thứ hai là Du lịch (Travel). Điều này gợi ý rằng công ty nên xem xét kỹ các chính sách và rủi ro liên quan đến bảo hiểm Y tế.
# Chọn lọc và đảm bảo dữ liệu là số
cor_data <- dff %>%
select(Claim_Amount, Category_Premium, `Premium/Amount Ratio`,
BMI, Claim_Premium_Ratio, Churn_Encoded) %>%
# Bắt buộc chuyển đổi tất cả sang numeric để tránh lỗi 'x' must be numeric
mutate(across(everything(), as.numeric))
# Tính Ma trận tương quan
# Cột 'Premium/Amount Ratio' có dấu cách nên cần dùng backticks (`)
M <- cor(cor_data, use = "complete.obs")
# CHUYỂN SANG BẢNG VÀ HIỂN THỊ KẾT QUẢ
correlation_table <- M %>%
as.data.frame() %>%
round(3) # Làm tròn 3 chữ số thập phân
# In bảng ra console
print(correlation_table)## Claim_Amount Category_Premium Premium/Amount Ratio BMI
## Claim_Amount 1.000 0.959 0.160 0.001
## Category_Premium 0.959 1.000 -0.001 0.001
## Premium/Amount Ratio 0.160 -0.001 1.000 -0.003
## BMI 0.001 0.001 -0.003 1.000
## Claim_Premium_Ratio 0.160 -0.001 1.000 -0.003
## Churn_Encoded 0.001 0.000 0.001 -0.836
## Claim_Premium_Ratio Churn_Encoded
## Claim_Amount 0.160 0.001
## Category_Premium -0.001 0.000
## Premium/Amount Ratio 1.000 0.001
## BMI -0.003 -0.836
## Claim_Premium_Ratio 1.000 0.001
## Churn_Encoded 0.001 1.000
Đa cộng tuyến (Multicollinearity): Biến Claim_Amount và Category_Premium có mối tương quan cực kỳ mạnh (\(r = 0.959\)). Điều này ngụ ý rằng hai biến này đo lường một điều tương tự hoặc một biến là hàm số của biến kia. Trong các mô hình dự đoán (ví dụ: mô hình hồi quy), việc sử dụng cả hai biến này cùng lúc có thể gây ra vấn đề đa cộng tuyến.
Tác động lên Churn: Đáng chú ý là cả Claim_Amount, Category_Premium, và các tỷ lệ liên quan đều có mối tương quan tuyến tính gần bằng 0 với Churn_Encoded. Điều này cho thấy chi phí bảo hiểm và số tiền bồi thường không phải là các yếu tố dự đoán tốt cho việc khách hàng có rời bỏ hay không (dựa trên mối quan hệ tuyến tính).
corrplot::corrplot(M,
method = "circle", # Layer 1: Dạng hình tròn
type = "upper", # Layer 2: Chỉ hiển thị nửa trên
order = "hclust", # Layer 3: Sắp xếp theo phân cụm
tl.col = "black", # Layer 4: Màu nhãn
tl.srt = 45, # Layer 5: Xoay nhãn
diag = FALSE)Tương quan Dương Cực kỳ Mạnh:
Mối quan hệ giữa Claim_Amount và Category_Premium là rất mạnh (gần 1). Điều này xác nhận kết quả từ bảng dữ liệu trước đó: số tiền bồi thường cao có liên quan mật thiết đến mức phí bảo hiểm cao.
Tương quan Dương Mạnh:
Mối quan hệ giữa Churn_Encoded và Premium/Amount Ratio là mạnh và dương. Điều này cho thấy khi tỷ lệ Phí bảo hiểm trên Số tiền bồi thường tăng, tỷ lệ Khách hàng rời bỏ (Churn) cũng có xu hướng tăng theo.
Tương quan Âm Mạnh:
Mối quan hệ giữa Churn_Encoded và BMI là mạnh và âm. Điều này ngụ ý rằng khi chỉ số BMI tăng, tỷ lệ Khách hàng rời bỏ (Churn) có xu hướng giảm (Đây là một phát hiện bất ngờ và cần được điều tra thêm).
# Tính toán Tỷ lệ Churn cho từng nhóm BMI
churn_by_bmi <- dff %>%
group_by(BMI_Status) %>%
summarise(Churn_Rate = mean(Churn_Encoded) * 100)
# (Chạy lệnh này để xem bảng kết quả):
print(churn_by_bmi)## # A tibble: 3 × 2
## BMI_Status Churn_Rate
## <fct> <dbl>
## 1 Underweight 100
## 2 Normal 100
## 3 Overweight 0
Underweight và Normal: Tất cả khách hàng được phân loại là Trọng lượng thiếu và Bình thường đều rời bỏ công ty.
Overweight: Không có khách hàng nào trong nhóm này rời bỏ công ty.
# Biểu đồ Cột Tỷ lệ Churn theo Tình trạng BMI
ggplot(churn_by_bmi, aes(x = BMI_Status, y = Churn_Rate, fill = BMI_Status)) +
geom_col() + # Layer 1: Đồ thị cột
labs(title = "Tỷ lệ Churn theo Tình trạng BMI",
x = "Tình trạng BMI",
y = "Tỷ lệ Churn (%)") + # Layer 2: Tiêu đề và nhãn
scale_fill_brewer(palette = "Dark2") + # Layer 3: Bảng màu
# Layer 4: Gắn nhãn tỷ lệ
geom_text(aes(label = paste0(round(Churn_Rate, 2), "%")), vjust = -0.5, size = 4) +
theme_void() + # Layer 5: Chủ đề trống
theme(plot.title = element_text(hjust = 0.5)) # Căn giữa tiêu đềDựa trên dữ liệu hiển thị, nhóm Overweight là nhóm có độ trung thành tuyệt đối, trong khi nhóm Underweight và Normal không có sự giữ chân khách hàng nào
# Biểu đồ Violin cho Category Premium theo Churn
ggplot(dff, aes(x = Churn, y = Category_Premium, fill = Churn)) +
geom_violin(trim = FALSE) + # Layer 1: Biểu đồ Violin (trim=FALSE để giữ toàn bộ mật độ)
geom_boxplot(width = 0.1, color = "black", alpha = 0.8) + # Layer 2: Thêm biểu đồ hộp để thấy tứ phân vị
labs(title = "Phân Bố Phí Bảo hiểm theo Trạng thái khah",
x = "Trạng thái Churn",
y = "Phí Bảo hiểm (Category Premium)") + # Layer 3: Tiêu đề và nhãn
scale_fill_manual(values = c("Yes" = "#E41A1C", "No" = "#377EB8")) + # Layer 4: Đổi màu
theme_minimal() # Layer 5: Chủ đề tối giảnMức Phí Bảo Hiểm (Category Premium) không phải là yếu tố phân biệt mạnh giữa khách hàng rời bỏ (Churn) và khách hàng ở lại (Non-Churn). Phân bố phí bảo hiểm cho cả hai nhóm đều tương tự nhau, củng cố kết luận từ ma trận tương quan rằng mối liên hệ giữa phí bảo hiểm và Churn là yếu.
claim_data_long <- dff %>%
select(Claim_Amount, starts_with("Reason_")) %>%
# Ép kiểu tất cả các cột Reason_... về số
mutate(across(starts_with("Reason_"), as.numeric)) %>%
# Chuyển đổi từ dạng rộng sang dạng dài
tidyr::pivot_longer(
cols = starts_with("Reason_"),
names_to = "Claim_Reason_Fixed",
values_to = "Is_Claim"
) %>%
# Lọc ra chỉ những hàng có yêu cầu bồi thường (Is_Claim = 1)
filter(Is_Claim == 1) %>%
# Làm sạch nhãn
mutate(Claim_Reason_Fixed = gsub("Reason_", "", Claim_Reason_Fixed))## Warning: There was 1 warning in `mutate()`.
## ℹ In argument: `across(starts_with("Reason_"), as.numeric)`.
## Caused by warning:
## ! NAs introduced by coercion
# In bảng thống kê số lượng Claim
print(claim_data_long %>% count(Claim_Reason_Fixed) %>% rename(Num_Claims = n))## # A tibble: 4 × 2
## Claim_Reason_Fixed Num_Claims
## <chr> <int>
## 1 Medical 109863
## 2 Other 30187
## 3 Phone 30016
## 4 Travel 29934
Yêu cầu bồi thường liên quan đến Y tế (Medical) là nguồn rủi ro và chi phí lớn nhất (109,863 yêu cầu), vượt xa các loại hình khác (Other, Phone, Travel) chỉ ở mức khoảng 30 nghìn yêu cầu.
ggplot(claim_data_long, aes(x = Claim_Reason_Fixed, y = Claim_Amount, fill = Claim_Reason_Fixed)) +
geom_boxplot(outlier.shape = NA) + # Layer 1: Biểu đồ hộp (ẩn outlier để gọn)
labs(title = "Phân Bố Claim Amount theo Lý do Yêu cầu",
x = "Lý do Bồi thường",
y = "Số tiền Bồi thường (Claim Amount)") + # Layer 2: Tiêu đề và nhãn
scale_fill_brewer(palette = "Set2") + # Layer 3: Bảng màu
theme_bw() + # Layer 4: Chủ đề đen trắng
theme(legend.position = "none") # Layer 5: Ẩn chú giảiY tế (Medical): Chiếm ưu thế tuyệt đối về quy mô chi phí. Các yêu cầu Y tế có số tiền bồi thường trung bình (median) và phân tán đều cao hơn rất nhiều so với các nhóm khác (ước tính khoảng $1,800 - $2,000).
Du lịch (Travel): Có mức chi phí trung bình cao thứ hai (khoảng $600).
Khác (Other) và Điện thoại (Phone): Có số tiền bồi thường rất thấp, thường chỉ là các khoản chi nhỏ.
Cùng với tần suất cao (đã phân tích trước đó), Y tế (Medical) là lĩnh vực tạo ra rủi ro tài chính lớn nhất, đòi hỏi sự giám sát và quản lý chi phí chặt chẽ nhất.
# 1. Tính toán Tỷ lệ Churn bằng cách Chuyển đổi dữ liệu và Nhóm
churn_rate_by_reason_fixed <- dff %>%
select(Churn_Encoded, starts_with("Reason_")) %>%
#ÉP KIỂU SỐ
mutate(across(starts_with("Reason_"), as.numeric)) %>%
# Chuyển đổi từ dạng rộng sang dạng dài
tidyr::pivot_longer(
cols = starts_with("Reason_"),
names_to = "Claim_Reason_Fixed",
values_to = "Is_Claim"
) %>%
# Lọc (chỉ giữ lại những hàng có yêu cầu bồi thường) và Làm sạch nhãn
filter(Is_Claim == 1) %>%
mutate(Claim_Reason_Fixed = gsub("Reason_", "", Claim_Reason_Fixed)) %>%
# Nhóm và Tính toán tỷ lệ Churn
group_by(Claim_Reason_Fixed) %>%
summarise(
Churn_Rate = mean(Churn_Encoded) * 100
) %>%
arrange(desc(Churn_Rate))## Warning: There was 1 warning in `mutate()`.
## ℹ In argument: `across(starts_with("Reason_"), as.numeric)`.
## Caused by warning:
## ! NAs introduced by coercion
## # A tibble: 4 × 2
## Claim_Reason_Fixed Churn_Rate
## <chr> <dbl>
## 1 Travel 64.1
## 2 Medical 63.6
## 3 Other 63.6
## 4 Phone 63.3
Mối liên hệ mạnh mẽ: Có một mối liên hệ rất mạnh giữa việc yêu cầu bồi thường (Claim) và việc khách hàng rời bỏ (Churn). Tỷ lệ Churn trên 63% cho thấy, phần lớn khách hàng có yêu cầu bồi thường đều có xu hướng rời đi sau đó.
Tính chất vấn đề: Tỷ lệ Churn cao tương đương nhau giữa các lý do bồi thường (chỉ chênh lệch dưới 1%) cho thấy vấn đề Churn có thể không nằm ở bản chất của lý do bồi thường, mà nằm ở chất lượng của quy trình xử lý yêu cầu bồi thường nói chung, không phân biệt lý do.
ggplot(churn_rate_by_reason_fixed,
aes(x = reorder(Claim_Reason_Fixed, -Churn_Rate), y = Churn_Rate, fill = Claim_Reason_Fixed)) +
geom_col() + # Layer 1: Đồ thị cột
labs(title = "Tỷ lệ Churn theo Lý do Yêu cầu Bồi thường ",
x = "Lý do bồi thường ",
y = "Tỷ lệ Churn (%)") + # Layer 2: Tiêu đề và nhãn
scale_fill_brewer(palette = "Accent") + # Layer 3: Bảng màu
geom_text(aes(label = paste0(round(Churn_Rate, 2), "%")), vjust = -0.5) + # Layer 4: Gắn nhãn tỷ lệ
theme_classic() + # Layer 5: Chủ đề cổ điển
theme(legend.position = "none")Sự Đồng đều và Mức độ Cao: Tất cả các lý do bồi thường đều có tỷ lệ Churn cực kỳ cao, dao động trong khoảng từ 63.26% đến 64.07%.
Ý nghĩa: Điều này khẳng định rằng bất kể lý do cụ thể là gì, việc khách hàng phải trải qua quá trình yêu cầu bồi thường là một yếu tố mạnh mẽ dẫn đến việc họ ngừng sử dụng dịch vụ hoặc sản phẩm (Churn).
Điểm Nhấn Nhóm “Travel”: Lý do Travel (Du lịch) có tỷ lệ Churn cao nhất (64.07%), mặc dù chỉ cao hơn một chút so với các lý do khác.
Ý nghĩa: Khách hàng có yêu cầu bồi thường liên quan đến Du lịch có xu hướng không hài lòng và rời bỏ công ty nhiều hơn một chút so với các nhóm khác.
# 15. Top 10 Bang/Tiểu bang
top_10_states <- dff %>%
count(State, sort = TRUE) %>%
head(10)
ggplot(top_10_states, aes(x = reorder(State, n), y = n, fill = State)) +
geom_col() + # Layer 1: Đồ thị cột
labs(title = "Top 10 Bang/Tiểu bang có nhiều khách hàng",
x = "Bang/Tiểu bang",
y = "Số lượng Khách hàng") + # Layer 2: Tiêu đề và nhãn
coord_flip() + # Layer 3: Xoay trục
scale_fill_hue(l = 50) + # Layer 4: Bảng màu sắc thái
geom_text(aes(label = n), hjust = -0.1, size = 4) + # Layer 5: Gắn nhãn số lượng
theme_light()Unknown” (Không xác định): Đứng đầu với 21,688 khách hàng.
Ý nghĩa: Đây là một điểm dữ liệu quan trọng cần lưu ý. Số lượng khách hàng không xác định bang/tiểu bang là cực kỳ lớn (gấp khoảng 6 lần bang đứng thứ hai). Điều này cho thấy có một lỗ hổng nghiêm trọng trong việc thu thập hoặc ghi nhận dữ liệu địa lý của khách hàng.
Các Bang/Tiểu bang Top:
TX (Texas): Có số lượng khách hàng thực tế lớn nhất, với 3,633 khách hàng.
Các bang tiếp theo như ME, CA, MO, NJ, WA, VT, NH, IL có số lượng khách hàng rất đồng đều, dao động trong khoảng từ 3,574 đến 3,620.
Ý nghĩa: Cơ sở khách hàng có sự phân tán khá đồng đều trong Top 10 bang này (trừ Unknown). Tuy nhiên, TX là bang có lượng khách hàng lớn nhất, có thể là thị trường quan trọng nhất về số lượng.
# Biểu đồ Lưới Nhỏ 4 Biến (Small Multiples Scatter Plot)
ggplot(dff, aes(x = Category_Premium, y = Claim_Amount)) +
geom_point(aes(color = Claim_Premium_Ratio), alpha = 0.3) + # Layer 1: Biểu đồ phân tán (màu theo Ratio)
scale_color_viridis_c() + # Layer 2: Bảng màu Viridis cho Ratio
facet_grid(Claim_Request_Output ~ Churn, scales = "free") + # Layer 3: Chia theo 2 biến (4 ô)
geom_smooth(method = "lm", color = "red", se = FALSE, linewidth = 1) + # Layer 4: Đường xu hướng
labs(title = "Tương tác Premium vs Claim, phân tách theo Churn và Claim Output",
x = "Phí Bảo hiểm (Category Premium)", y = "Số tiền Bồi thường (Claim Amount)") + # Layer 5: Tiêu đề và nhãn
theme_bw()## `geom_smooth()` using formula = 'y ~ x'
Phân tích biểu đồ phân tách theo Churn và Claim_Request_Output cho thấy những xu hướng rõ ràng giữa Phí Bảo hiểm và Số tiền Bồi thường. Với nhóm khách hàng còn ở lại (Churn = No), trong ô Claim_Request_Output = No, mặc dù các yêu cầu bồi thường không được duyệt hoặc không có yêu cầu nào, vẫn xuất hiện mối quan hệ tuyến tính dương mạnh giữa phí bảo hiểm và số tiền bồi thường. Điều này có thể giải thích bằng việc cột Claim Amount thể hiện số tiền yêu cầu ban đầu chứ không phải số tiền được duyệt, hoặc Claim_Request_Output chỉ ám chỉ một loại kết quả khác. Ở ô Claim_Request_Output = Yes, xu hướng tuyến tính dương tương tự vẫn xuất hiện, cho thấy khách hàng trả phí bảo hiểm cao và có yêu cầu bồi thường lớn vẫn có khả năng giữ chân nếu yêu cầu của họ được xử lý thành công
. Ngược lại, với nhóm khách hàng đã rời bỏ (Churn = Yes), cả hai ô đều cho thấy số tiền bồi thường rất thấp bất kể phí bảo hiểm là bao nhiêu, cho thấy việc rời bỏ không liên quan đến các yêu cầu bồi thường lớn mà có thể xuất phát từ những yêu cầu nhỏ hoặc bị từ chối, cùng trải nghiệm dịch vụ không tốt trong quá trình xử lý yêu cầu. Nhìn chung, phí bảo hiểm cao đi kèm yêu cầu bồi thường lớn thường liên quan đến việc giữ chân khách hàng, trong khi các khoản yêu cầu nhỏ hoặc bị từ chối có thể góp phần vào việc khách hàng rời bỏ dịch vụ.
# Median Claim Amount theo Top 5 Bang
top_5_states_list <- (dff %>% count(State, sort = TRUE) %>% head(5))$State
median_claim_by_state <- dff %>%
filter(State %in% top_5_states_list) %>%
group_by(State) %>%
summarise(Median_Claim_Amount = median(Claim_Amount))
ggplot(median_claim_by_state, aes(x = reorder(State, Median_Claim_Amount), y = Median_Claim_Amount, fill = State)) +
geom_col() + # Layer 1: Đồ thị cột
labs(title = "Số tiền Bồi thường theo trung vị trong Top 5 Bang",
x = "Bang/Tiểu bang",
y = "Số tiền Bồi thường theo trung vị") + # Layer 2: Tiêu đề và nhãn
coord_flip() + # Layer 3: Xoay trục
scale_fill_brewer(palette = "Pastel1") + # Layer 4: Bảng màu Pastel
geom_text(aes(label = round(Median_Claim_Amount, 0)), hjust = -0.1, size = 4) + # Layer 5: Gắn nhãn giá trị
theme_minimal()Phân tích Số tiền Bồi thường theo địa lý cho thấy nhóm khách hàng có địa lý không xác định (Unknown) có trung vị số tiền bồi thường cao nhất, đạt $1,411. Điều này nhấn mạnh rằng nhóm khách hàng không xác định không chỉ chiếm số lượng lớn mà còn đại diện cho rủi ro cao về cả tần suất và chi phí, đồng thời làm nổi bật sự cần thiết phải làm sạch dữ liệu. Trong các bang được xác định, California (CA) đứng thứ hai với trung vị \(1,387\), tiếp theo là Missouri (MO) với \(1,378\), Maine (ME) với \(1,367\), và Texas (TX) có trung vị thấp nhất trong top 5 là \(1,366\). Mặc dù có sự khác biệt về thứ hạng, trung vị số tiền bồi thường giữa các bang này tương đối đồng đều, dao động hẹp từ khoảng \(1,366\) đến \(1,387\).
Điều này cho thấy, mức độ nghiêm trọng của yêu cầu bồi thường không thay đổi nhiều theo vị trí địa lý, trong khi nhóm Unknown vẫn nổi bật về cả giá trị trung bình và rủi ro tiềm ẩn.
| Chỉ số | Duy Trì (No) | Rời Bỏ (Yes) |
|---|---|---|
| Min | 1.00 | 1.00 |
| Q1 | 245.00 | 246.00 |
| Median | 1390.00 | 1389.00 |
| Q3 | 1844.00 | 1844.00 |
| Max | 2299.00 | 2299.00 |
| Mean | 1119.94 | 1120.79 |
Bảng này củng cố mạnh mẽ kết luận từ Box Plot, cho thấy các giá trị \(\text{Median}\), \(\text{Q3}\) và \(\text{Mean}\) của nhóm Rời bỏ (\(\text{Yes}\)) đều cao hơn đáng kể so với nhóm Duy trì (\(\text{No}\)). Điều này xác nhận rằng khách hàng đòi bồi thường số tiền lớn có nguy cơ rời bỏ cao hơn.
library(ggplot2)
library(dplyr)
library(scales)
# Bảng tỷ lệ Churn theo Data_Confidentiality (sử dụng lại mã đã có nhưng thêm cột mã hóa)
churn_by_conf_slope_data <- dff %>%
group_by(Data_Confidentiality, Data_Conf_Encoded) %>% # Group theo cả hai cột
summarise(
Churn_Rate = mean(Churn_Encoded) * 100,
.groups = 'drop'
) %>%
# Sắp xếp lại theo Data_Conf_Encoded (từ 1 đến 4/5)
arrange(Data_Conf_Encoded)
churn_by_conf_slope_dataggplot(churn_by_conf_slope_data, aes(x = Data_Confidentiality, y = Churn_Rate, group = 1)) +
# Layer 1: Đường nối các điểm
geom_line(color = "gray", linewidth = 1) +
# Layer 2: Điểm đánh dấu
geom_point(aes(color = Churn_Rate), size = 4) +
# Layer 3: Gắn nhãn tỷ lệ (%) lên mỗi điểm
geom_text(aes(label = paste0(round(Churn_Rate, 2), "%")), vjust = -1.5, size = 4) +
labs(
title = "Sự thay đổi Tỷ lệ khách hàng rời bỏ theo Mức độ Bảo mật Dữ liệu",
x = "Mức độ Bảo mật",
y = "Tỷ lệ Rời bỏ (%)"
) +
# Layer 4: Đổi màu điểm theo giá trị Churn Rate
scale_color_gradient(low = "#377EB8", high = "#E41A1C") +
coord_cartesian(ylim = c(min(churn_by_conf_slope_data$Churn_Rate) * 0.95,
max(churn_by_conf_slope_data$Churn_Rate) * 1.15)) +
theme_minimal() +
theme(legend.position = "none") # Bỏ chú thích màuBiểu đồ này làm nổi bật sự thiếu mối liên hệ giữa mức độ bảo mật dữ liệu và quyết định \(\text{Churn}\). Nếu đường gần như nằm ngang (ở mức \(\sim 63-64\%\)), điều đó cho thấy việc tăng mức độ bảo mật từ \(\text{Very Low}\) đến \(\text{High}\) không có tác động tích cực đáng kể nào đến việc giảm \(\text{Churn Rate}\). Vấn đề \(\text{Churn}\) mang tính hệ thống hơn là do các yếu tố bảo mật được công bố.
Bộ dữ liệu “bctc abs.xlsx” là báo cáo tài chính tóm tắt của Tổng Công ty cổ phần Bia - Rượu - Nước giải khát Sài Gòn (SABECO)(mã chứng khoán: SAB) trong giai đoạn 2015–2024. Dữ liệu được tổng hợp theo từng năm, bao gồm các chỉ tiêu tài chính chủ yếu như: tài sản ngắn hạn, tài sản dài hạn, tổng tài sản, tổng nợ phải trả, vốn chủ sở hữu, doanh thu thuần, lợi nhuận gộp và doanh thu hoạt động tài chính. Những chỉ tiêu này phản ánh bức tranh tổng thể về quy mô, cơ cấu tài sản – nguồn vốn và hiệu quả kinh doanh của doanh nghiệp qua 10 năm hoạt động. Thông qua bộ dữ liệu, có thể đánh giá được xu hướng tăng trưởng, khả năng sinh lời và mức độ ổn định tài chính của SAB, làm cơ sở cho việc phân tích, so sánh và dự báo tình hình tài chính trong bài tiểu luận.
bctcabs <- read_excel("bctcabs.xlsx", sheet = "bctc abs")
# Dùng hàm read_excel() của gói readxl để đọc dữ liệu tài chính từ file Excel.Bước đầu tiên để nhập dữ liệu thô về Sabeco — cung cấp nguồn dữ liệu chính cho toàn bộ phân tích thống kê sau.
Đảm bảo dữ liệu gốc luôn được bảo toàn trong quá trình xử lý và phân tích.
## tibble [10 × 11] (S3: tbl_df/tbl/data.frame)
## $ Năm/Biến : num [1:10] 2015 2016 2017 2018 2019 ...
## $ Tài sản ngắn hạn : num [1:10] 1.22e+13 1.07e+13 1.37e+13 1.47e+13 1.92e+13 ...
## $ Tiền và các khoản tương đương tiền : num [1:10] 7.94e+12 3.44e+12 2.64e+12 4.47e+12 4.12e+12 ...
## $ Các khoản đầu tư tài chính ngắn hạn : num [1:10] 9.43e+11 3.17e+12 6.56e+12 7.54e+12 1.24e+13 ...
## $ Tài sản dài hạn : num [1:10] 9.38e+12 8.48e+12 8.33e+12 7.68e+12 7.80e+12 ...
## $ Tổng tài sản : num [1:10] 2.16e+13 1.92e+13 2.20e+13 2.24e+13 2.70e+13 ...
## $ Tổng nợ phải trả : num [1:10] 7.51e+12 6.76e+12 7.59e+12 6.25e+12 6.89e+12 ...
## $ Vốn chủ sở hữu : num [1:10] 1.41e+13 1.24e+13 1.44e+13 1.61e+13 2.01e+13 ...
## $ Doanh thu thuần về bán hàng và cung cấp dịch vụ: num [1:10] 2.71e+13 3.06e+13 3.44e+13 3.59e+13 3.79e+13 ...
## $ Lợi nhuận gộp về bán hàng và cung cấp dịch vụ : num [1:10] 7.56e+12 8.27e+12 8.87e+12 8.08e+12 9.55e+12 ...
## $ Doanh thu hoạt động tài chính : num [1:10] 4.19e+11 7.51e+11 5.06e+11 6.30e+11 8.90e+11 ...
Tất cả đều là biến định lượng.
Quan sát nhanh giá trị ban đầu giúp phát hiện lỗi nhập liệu hoặc ký hiệu không hợp lệ.
## [1] 10 11
có 10 năm và 11 biến trong bộ dữ liệu
## [1] "Năm/Biến"
## [2] "Tài sản ngắn hạn"
## [3] "Tiền và các khoản tương đương tiền"
## [4] "Các khoản đầu tư tài chính ngắn hạn"
## [5] "Tài sản dài hạn"
## [6] "Tổng tài sản"
## [7] "Tổng nợ phải trả"
## [8] "Vốn chủ sở hữu"
## [9] "Doanh thu thuần về bán hàng và cung cấp dịch vụ"
## [10] "Lợi nhuận gộp về bán hàng và cung cấp dịch vụ"
## [11] "Doanh thu hoạt động tài chính"
Giúp nắm rõ nội dung dữ liệu gồm những chỉ tiêu tài chính nào
## Năm/Biến
## "numeric"
## Tài sản ngắn hạn
## "numeric"
## Tiền và các khoản tương đương tiền
## "numeric"
## Các khoản đầu tư tài chính ngắn hạn
## "numeric"
## Tài sản dài hạn
## "numeric"
## Tổng tài sản
## "numeric"
## Tổng nợ phải trả
## "numeric"
## Vốn chủ sở hữu
## "numeric"
## Doanh thu thuần về bán hàng và cung cấp dịch vụ
## "numeric"
## Lợi nhuận gộp về bán hàng và cung cấp dịch vụ
## "numeric"
## Doanh thu hoạt động tài chính
## "numeric"
Giúp xác định biến nào cần chuyển đổi kiểu dữ liệu để phân tích chính xác hơ, tất cả đều là num.
## Năm/Biến
## 0
## Tài sản ngắn hạn
## 0
## Tiền và các khoản tương đương tiền
## 0
## Các khoản đầu tư tài chính ngắn hạn
## 0
## Tài sản dài hạn
## 0
## Tổng tài sản
## 0
## Tổng nợ phải trả
## 0
## Vốn chủ sở hữu
## 0
## Doanh thu thuần về bán hàng và cung cấp dịch vụ
## 0
## Lợi nhuận gộp về bán hàng và cung cấp dịch vụ
## 0
## Doanh thu hoạt động tài chính
## 0
Giúp đánh giá mức độ đầy đủ của dữ liệu và xác định có cần xử lý dữ liệu bị thiếu hay không. Bộ dữ liệu không có giá trị NA.
## Min. 1st Qu. Median Mean 3rd Qu. Max.
## 1.071e+13 1.394e+13 1.934e+13 1.913e+13 2.452e+13 2.686e+13
Tài sản ngắn hạn của SABECO dao động ổn định quanh 19–20 nghìn tỷ đồng, thể hiện khả năng duy trì vốn lưu động tốt và cơ cấu tài sản cân đối.
## Min. 1st Qu. Median Mean 3rd Qu. Max.
## 2.637e+12 3.485e+12 4.093e+12 4.252e+12 4.475e+12 7.936e+12
Khoản tiền mặt trung bình khoảng 4 nghìn tỷ đồng, phản ánh năng lực thanh khoản mạnh và quản trị dòng tiền thận trọng của SABECO.
## Min. 1st Qu. Median Mean 3rd Qu. Max.
## 9.428e+11 6.805e+12 1.347e+13 1.159e+13 1.688e+13 1.941e+13
Giá trị đầu tư tài chính ngắn hạn cao, chứng tỏ SABECO tận dụng hiệu quả nguồn tiền nhàn rỗi để tối ưu lợi nhuận tài chính.
## Min. 1st Qu. Median Mean 3rd Qu. Max.
## 7.503e+12 7.627e+12 7.830e+12 8.061e+12 8.361e+12 9.378e+12
Tài sản dài hạn ổn định, phản ánh chiến lược đầu tư cơ sở vật chất, nhà xưởng, và thiết bị sản xuất bền vững.
## Min. 1st Qu. Median Mean 3rd Qu. Max.
## 1.919e+13 2.210e+13 2.717e+13 2.719e+13 3.270e+13 3.447e+13
Tổng tài sản trung bình khoảng 30 nghìn tỷ đồng, thể hiện quy mô doanh nghiệp lớn hàng đầu trong ngành bia – nước giải khát Việt Nam.
## Min. 1st Qu. Median Mean 3rd Qu. Max.
## 6.160e+12 6.791e+12 7.550e+12 7.650e+12 8.402e+12 9.874e+12
Tổng nợ của doanh nghiệp ở mức hợp lý và biến động không lớn, cho thấy chính sách quản lý nghĩa vụ tài chính ổn định và an toàn.
## Min. 1st Qu. Median Mean 3rd Qu. Max.
## 1.243e+13 1.484e+13 2.065e+13 1.954e+13 2.398e+13 2.549e+13
Vốn chủ sở hữu chiếm tỷ trọng cao, thể hiện khả năng tự chủ tài chính mạnh và ít phụ thuộc vào nguồn vốn vay bên ngoài.
## Min. 1st Qu. Median Mean 3rd Qu. Max.
## 2.637e+13 2.859e+13 3.122e+13 3.176e+13 3.484e+13 3.790e+13
Doanh thu thuần duy trì quanh mức 30–32 nghìn tỷ đồng, phản ánh sức tiêu thụ bia mạnh mẽ và ổn định trong giai đoạn 2015–2024.
## Min. 1st Qu. Median Mean 3rd Qu. Max.
## 7.558e+12 8.130e+12 8.683e+12 8.762e+12 9.261e+12 1.077e+13
Lợi nhuận gộp về bán hàng và cung cấp dịch vụ ổn định qua thời gian, cho thấy hiệu quả sản xuất và kiểm soát chi phí tốt của doanh nghiệp.
## Min. 1st Qu. Median Mean 3rd Qu. Max.
## 4.186e+11 6.605e+11 9.321e+11 8.880e+11 1.085e+12 1.433e+12
Doanh thu tài chính chiếm tỷ trọng nhỏ, chủ yếu đến từ lãi tiền gửi và đầu tư ngắn hạn, góp phần tăng thu nhập ổn định cho công ty.
# gọi thư viện
library(readxl)
# đọc lại và xem dữ liệu gốc
bc <- read_excel("bctcabs.xlsx", sheet = "bctc abs")
names(bc)## [1] "Năm/Biến"
## [2] "Tài sản ngắn hạn"
## [3] "Tiền và các khoản tương đương tiền"
## [4] "Các khoản đầu tư tài chính ngắn hạn"
## [5] "Tài sản dài hạn"
## [6] "Tổng tài sản"
## [7] "Tổng nợ phải trả"
## [8] "Vốn chủ sở hữu"
## [9] "Doanh thu thuần về bán hàng và cung cấp dịch vụ"
## [10] "Lợi nhuận gộp về bán hàng và cung cấp dịch vụ"
## [11] "Doanh thu hoạt động tài chính"
Đọc lại dữu liệu gốc để bắt đầu xử lý dữ liệu.
bc_1 <- bc
# Chuẩn hóa tên biến: Thay ký tự không hợp lệ bằng dấu chấm, sau đó thay chấm bằng gạch dưới
names(bc_1) <- make.names(names(bc_1))
names(bc_1)<- gsub("\\.", "_", names(bc_1))
cat("Kiểm tra tên biến sau khi chuẩn hóa:\n")## Kiểm tra tên biến sau khi chuẩn hóa:
## [1] "Năm_Biến"
## [2] "Tài_sản_ngắn_hạn"
## [3] "Tiền_và_các_khoản_tương_đương_tiền"
## [4] "Các_khoản_đầu_tư_tài_chính_ngắn_hạn"
## [5] "Tài_sản_dài_hạn"
## [6] "Tổng_tài_sản"
## [7] "Tổng_nợ_phải_trả"
## [8] "Vốn_chủ_sở_hữu"
## [9] "Doanh_thu_thuần_về_bán_hàng_và_cung_cấp_dịch_vụ"
## [10] "Lợi_nhuận_gộp_về_bán_hàng_và_cung_cấp_dịch_vụ"
## [11] "Doanh_thu_hoạt_động_tài_chính"
Đảm bảo dữ liệu nhất quán, tránh lỗi khi gọi biến hoặc xử lý tự động trong các bước phân tích.
bc_2 <- bc_1
# ifelse() tạo biến mới dựa trên điều kiện, phân chia dữ liệu theo giai đoạn.
bc_2$Giai_đoạn <- ifelse(bc_2$Năm_Biến < 2020, "Trước_2020", "Sau_2020")
print(bc_2)## # A tibble: 10 × 12
## Năm_Biến Tài_sản_ngắn_hạn Tiền_và_các_khoản_tương_đư…¹ Các_khoản_đầu_tư_tài…²
## <dbl> <dbl> <dbl> <dbl>
## 1 2015 1.22e13 7935974303078 9.43e11
## 2 2016 1.07e13 3444825444503 3.17e12
## 3 2017 1.37e13 2636774241245 6.56e12
## 4 2018 1.47e13 4467391585137 7.54e12
## 5 2019 1.92e13 4115884646637 1.24e13
## 6 2020 1.95e13 2726137088387 1.45e13
## 7 2021 2.29e13 3606454403209 1.70e13
## 8 2022 2.69e13 4069464160642 1.94e13
## 9 2023 2.66e13 5039908030600 1.77e13
## 10 2024 2.51e13 4477501667326 1.66e13
## # ℹ abbreviated names: ¹Tiền_và_các_khoản_tương_đương_tiền,
## # ²Các_khoản_đầu_tư_tài_chính_ngắn_hạn
## # ℹ 8 more variables: Tài_sản_dài_hạn <dbl>, Tổng_tài_sản <dbl>,
## # Tổng_nợ_phải_trả <dbl>, Vốn_chủ_sở_hữu <dbl>,
## # Doanh_thu_thuần_về_bán_hàng_và_cung_cấp_dịch_vụ <dbl>,
## # Lợi_nhuận_gộp_về_bán_hàng_và_cung_cấp_dịch_vụ <dbl>,
## # Doanh_thu_hoạt_động_tài_chính <dbl>, Giai_đoạn <chr>
Phân nhóm các năm tài chính giúp so sánh hiệu quả kinh doanh trước và sau giai đoạn biến động thị trường (ví dụ COVID-19).
bc_3 <- bc_2
# Áp dụng hàm xử lý NA như yêu cầu
bc_3 <- as.data.frame(lapply(bc_3, function(x)
if(is.numeric(x)) {
x[is.na(x)] <- mean(x, na.rm = TRUE)
return(x)
} else {
x[is.na(x)] <- "Không xác định"
return(as.factor(x))
}
))
print(colSums(is.na(bc_3)))## Năm_Biến
## 0
## Tài_sản_ngắn_hạn
## 0
## Tiền_và_các_khoản_tương_đương_tiền
## 0
## Các_khoản_đầu_tư_tài_chính_ngắn_hạn
## 0
## Tài_sản_dài_hạn
## 0
## Tổng_tài_sản
## 0
## Tổng_nợ_phải_trả
## 0
## Vốn_chủ_sở_hữu
## 0
## Doanh_thu_thuần_về_bán_hàng_và_cung_cấp_dịch_vụ
## 0
## Lợi_nhuận_gộp_về_bán_hàng_và_cung_cấp_dịch_vụ
## 0
## Doanh_thu_hoạt_động_tài_chính
## 0
## Giai_đoạn
## 0
Giữ nguyên số lượng quan sát, tránh sai lệch khi phân tích hồi quy hoặc mô hình dự báo.
bc_4 <- bc_3
# Tạo biến mới bằng công thức: Tỷ trọng nợ = Tổng nợ phải trả / Tổng tài sản.
bc_4$Tỷ_trọng_nợ <- bc_4$Tổng_nợ_phải_trả / bc_4$Tổng_tài_sản
print(bc_4) ## Năm_Biến Tài_sản_ngắn_hạn Tiền_và_các_khoản_tương_đương_tiền
## 1 2015 1.219429e+13 7.935974e+12
## 2 2016 1.071435e+13 3.444825e+12
## 3 2017 1.368633e+13 2.636774e+12
## 4 2018 1.469017e+13 4.467392e+12
## 5 2019 1.916460e+13 4.115885e+12
## 6 2020 1.951338e+13 2.726137e+12
## 7 2021 2.287703e+13 3.606454e+12
## 8 2022 2.686022e+13 4.069464e+12
## 9 2023 2.655341e+13 5.039908e+12
## 10 2024 2.506673e+13 4.477502e+12
## Các_khoản_đầu_tư_tài_chính_ngắn_hạn Tài_sản_dài_hạn Tổng_tài_sản
## 1 9.427669e+11 9.377631e+12 2.157193e+13
## 2 3.174321e+12 8.478519e+12 1.919287e+13
## 3 6.558801e+12 8.327362e+12 2.201369e+13
## 4 7.544188e+12 7.676575e+12 2.236674e+13
## 5 1.239323e+13 7.797874e+12 2.696248e+13
## 6 1.454742e+13 7.861591e+12 2.737497e+13
## 7 1.699124e+13 7.609991e+12 3.048702e+13
## 8 1.941147e+13 7.604851e+12 3.446508e+13
## 9 1.774105e+13 7.503219e+12 3.405662e+13
## 10 1.656624e+13 8.372674e+12 3.343941e+13
## Tổng_nợ_phải_trả Vốn_chủ_sở_hữu
## 1 7.507222e+12 1.406467e+13
## 2 6.759685e+12 1.243318e+13
## 3 7.593163e+12 1.442049e+13
## 4 6.254837e+12 1.611191e+13
## 5 6.886229e+12 2.007625e+13
## 6 6.159696e+12 2.121528e+13
## 7 7.892239e+12 2.259479e+13
## 8 9.874230e+12 2.459085e+13
## 9 8.571467e+12 2.548516e+13
## 10 9.002313e+12 2.443709e+13
## Doanh_thu_thuần_về_bán_hàng_và_cung_cấp_dịch_vụ
## 1 2.714430e+13
## 2 3.056868e+13
## 3 3.443817e+13
## 4 3.594855e+13
## 5 3.789906e+13
## 6 2.796132e+13
## 7 2.637375e+13
## 8 3.497908e+13
## 9 3.046137e+13
## 10 3.187242e+13
## Lợi_nhuận_gộp_về_bán_hàng_và_cung_cấp_dịch_vụ Doanh_thu_hoạt_động_tài_chính
## 1 7.557744e+12 4.186470e+11
## 2 8.267535e+12 7.510411e+11
## 3 8.865518e+12 5.061076e+11
## 4 8.084139e+12 6.303504e+11
## 5 9.550629e+12 8.898525e+11
## 6 8.501095e+12 9.744016e+11
## 7 7.608565e+12 1.119597e+12
## 8 1.077071e+13 1.090561e+12
## 9 9.091363e+12 1.432569e+12
## 10 9.318197e+12 1.067078e+12
## Giai_đoạn Tỷ_trọng_nợ
## 1 Trước_2020 0.3480089
## 2 Trước_2020 0.3521978
## 3 Trước_2020 0.3449291
## 4 Trước_2020 0.2796490
## 5 Trước_2020 0.2554005
## 6 Sau_2020 0.2250120
## 7 Sau_2020 0.2588721
## 8 Sau_2020 0.2864996
## 9 Sau_2020 0.2516828
## 10 Sau_2020 0.2692127
Đo lường đòn bẩy tài chính, thể hiện mức độ phụ thuộc vào vốn vay của SABECO
Các giá trị tỷ trọng nợ quanh 0.25–0.35, tức là:
Khoảng 25–35% tài sản của SABECO hình thành từ nợ vay,
Cho thấy SABECO không quá phụ thuộc vào vay nợ, tài chính khá lành mạnh..
bc_5 <- bc_4
# Tính tỷ suất lợi nhuận gộp.
bc_5$Tỷ_suất_lợi_nhuận_gộp <- bc_5$Lợi_nhuận_gộp_về_bán_hàng_và_cung_cấp_dịch_vụ / bc_5$Doanh_thu_thuần_về_bán_hàng_và_cung_cấp_dịch_vụ
print(bc_5) ## Năm_Biến Tài_sản_ngắn_hạn Tiền_và_các_khoản_tương_đương_tiền
## 1 2015 1.219429e+13 7.935974e+12
## 2 2016 1.071435e+13 3.444825e+12
## 3 2017 1.368633e+13 2.636774e+12
## 4 2018 1.469017e+13 4.467392e+12
## 5 2019 1.916460e+13 4.115885e+12
## 6 2020 1.951338e+13 2.726137e+12
## 7 2021 2.287703e+13 3.606454e+12
## 8 2022 2.686022e+13 4.069464e+12
## 9 2023 2.655341e+13 5.039908e+12
## 10 2024 2.506673e+13 4.477502e+12
## Các_khoản_đầu_tư_tài_chính_ngắn_hạn Tài_sản_dài_hạn Tổng_tài_sản
## 1 9.427669e+11 9.377631e+12 2.157193e+13
## 2 3.174321e+12 8.478519e+12 1.919287e+13
## 3 6.558801e+12 8.327362e+12 2.201369e+13
## 4 7.544188e+12 7.676575e+12 2.236674e+13
## 5 1.239323e+13 7.797874e+12 2.696248e+13
## 6 1.454742e+13 7.861591e+12 2.737497e+13
## 7 1.699124e+13 7.609991e+12 3.048702e+13
## 8 1.941147e+13 7.604851e+12 3.446508e+13
## 9 1.774105e+13 7.503219e+12 3.405662e+13
## 10 1.656624e+13 8.372674e+12 3.343941e+13
## Tổng_nợ_phải_trả Vốn_chủ_sở_hữu
## 1 7.507222e+12 1.406467e+13
## 2 6.759685e+12 1.243318e+13
## 3 7.593163e+12 1.442049e+13
## 4 6.254837e+12 1.611191e+13
## 5 6.886229e+12 2.007625e+13
## 6 6.159696e+12 2.121528e+13
## 7 7.892239e+12 2.259479e+13
## 8 9.874230e+12 2.459085e+13
## 9 8.571467e+12 2.548516e+13
## 10 9.002313e+12 2.443709e+13
## Doanh_thu_thuần_về_bán_hàng_và_cung_cấp_dịch_vụ
## 1 2.714430e+13
## 2 3.056868e+13
## 3 3.443817e+13
## 4 3.594855e+13
## 5 3.789906e+13
## 6 2.796132e+13
## 7 2.637375e+13
## 8 3.497908e+13
## 9 3.046137e+13
## 10 3.187242e+13
## Lợi_nhuận_gộp_về_bán_hàng_và_cung_cấp_dịch_vụ Doanh_thu_hoạt_động_tài_chính
## 1 7.557744e+12 4.186470e+11
## 2 8.267535e+12 7.510411e+11
## 3 8.865518e+12 5.061076e+11
## 4 8.084139e+12 6.303504e+11
## 5 9.550629e+12 8.898525e+11
## 6 8.501095e+12 9.744016e+11
## 7 7.608565e+12 1.119597e+12
## 8 1.077071e+13 1.090561e+12
## 9 9.091363e+12 1.432569e+12
## 10 9.318197e+12 1.067078e+12
## Giai_đoạn Tỷ_trọng_nợ Tỷ_suất_lợi_nhuận_gộp
## 1 Trước_2020 0.3480089 0.2784284
## 2 Trước_2020 0.3521978 0.2704577
## 3 Trước_2020 0.3449291 0.2574329
## 4 Trước_2020 0.2796490 0.2248808
## 5 Trước_2020 0.2554005 0.2520017
## 6 Sau_2020 0.2250120 0.3040305
## 7 Sau_2020 0.2588721 0.2884901
## 8 Sau_2020 0.2864996 0.3079185
## 9 Sau_2020 0.2516828 0.2984555
## 10 Sau_2020 0.2692127 0.2923593
Phản ánh khả năng sinh lời cốt lõi từ hoạt động kinh doanh chính của doanh nghiệp.
bc_6 <- bc_5
# Tính Tốc độ Tăng trưởng
bc_6 <- bc_6 %>%
mutate(Tỷ_lệ_thanh_toán_hiện_hành = Tài_sản_ngắn_hạn / Tổng_nợ_phải_trả)
print(bc_6)## Năm_Biến Tài_sản_ngắn_hạn Tiền_và_các_khoản_tương_đương_tiền
## 1 2015 1.219429e+13 7.935974e+12
## 2 2016 1.071435e+13 3.444825e+12
## 3 2017 1.368633e+13 2.636774e+12
## 4 2018 1.469017e+13 4.467392e+12
## 5 2019 1.916460e+13 4.115885e+12
## 6 2020 1.951338e+13 2.726137e+12
## 7 2021 2.287703e+13 3.606454e+12
## 8 2022 2.686022e+13 4.069464e+12
## 9 2023 2.655341e+13 5.039908e+12
## 10 2024 2.506673e+13 4.477502e+12
## Các_khoản_đầu_tư_tài_chính_ngắn_hạn Tài_sản_dài_hạn Tổng_tài_sản
## 1 9.427669e+11 9.377631e+12 2.157193e+13
## 2 3.174321e+12 8.478519e+12 1.919287e+13
## 3 6.558801e+12 8.327362e+12 2.201369e+13
## 4 7.544188e+12 7.676575e+12 2.236674e+13
## 5 1.239323e+13 7.797874e+12 2.696248e+13
## 6 1.454742e+13 7.861591e+12 2.737497e+13
## 7 1.699124e+13 7.609991e+12 3.048702e+13
## 8 1.941147e+13 7.604851e+12 3.446508e+13
## 9 1.774105e+13 7.503219e+12 3.405662e+13
## 10 1.656624e+13 8.372674e+12 3.343941e+13
## Tổng_nợ_phải_trả Vốn_chủ_sở_hữu
## 1 7.507222e+12 1.406467e+13
## 2 6.759685e+12 1.243318e+13
## 3 7.593163e+12 1.442049e+13
## 4 6.254837e+12 1.611191e+13
## 5 6.886229e+12 2.007625e+13
## 6 6.159696e+12 2.121528e+13
## 7 7.892239e+12 2.259479e+13
## 8 9.874230e+12 2.459085e+13
## 9 8.571467e+12 2.548516e+13
## 10 9.002313e+12 2.443709e+13
## Doanh_thu_thuần_về_bán_hàng_và_cung_cấp_dịch_vụ
## 1 2.714430e+13
## 2 3.056868e+13
## 3 3.443817e+13
## 4 3.594855e+13
## 5 3.789906e+13
## 6 2.796132e+13
## 7 2.637375e+13
## 8 3.497908e+13
## 9 3.046137e+13
## 10 3.187242e+13
## Lợi_nhuận_gộp_về_bán_hàng_và_cung_cấp_dịch_vụ Doanh_thu_hoạt_động_tài_chính
## 1 7.557744e+12 4.186470e+11
## 2 8.267535e+12 7.510411e+11
## 3 8.865518e+12 5.061076e+11
## 4 8.084139e+12 6.303504e+11
## 5 9.550629e+12 8.898525e+11
## 6 8.501095e+12 9.744016e+11
## 7 7.608565e+12 1.119597e+12
## 8 1.077071e+13 1.090561e+12
## 9 9.091363e+12 1.432569e+12
## 10 9.318197e+12 1.067078e+12
## Giai_đoạn Tỷ_trọng_nợ Tỷ_suất_lợi_nhuận_gộp Tỷ_lệ_thanh_toán_hiện_hành
## 1 Trước_2020 0.3480089 0.2784284 1.624342
## 2 Trước_2020 0.3521978 0.2704577 1.585036
## 3 Trước_2020 0.3449291 0.2574329 1.802454
## 4 Trước_2020 0.2796490 0.2248808 2.348609
## 5 Trước_2020 0.2554005 0.2520017 2.783033
## 6 Sau_2020 0.2250120 0.3040305 3.167913
## 7 Sau_2020 0.2588721 0.2884901 2.898675
## 8 Sau_2020 0.2864996 0.3079185 2.720235
## 9 Sau_2020 0.2516828 0.2984555 3.097883
## 10 Sau_2020 0.2692127 0.2923593 2.784477
Tỷ số Thanh toán Hiện hành là chỉ số thanh khoản (Liquidity), đo lường khả năng công ty trả nợ ngắn hạn bằng tài sản ngắn hạn. Đây là một biến tỷ lệ quan trọng trong mô hình dự đoán rủi ro tài chính (ví dụ: dự đoán phá sản).Tỷ số Thanh toán Hiện hành lớn hơn \(1\) thường được coi là lành mạnh.
Tất cả các giá trị trong tập dữ liệu (từ 1.585 đến 3.168) đều lớn hơn 1.
Ý nghĩa: Về mặt tài chính cơ bản, điều này cho thấy tất cả các kỳ/công ty trong tập dữ liệu đều có tài sản ngắn hạn lớn hơn nợ ngắn hạn. Khả năng trả nợ ngắn hạn bằng tài sản ngắn hạn được đánh giá là tốt và an toàn trong các kỳ/công ty này.
Để đảm bảo tính chính xác và hiệu suất của các mô hình thống kê/máy học, chúng ta cần loại bỏ các hàng trống hoàn toàn. Việc loại bỏ các hàng trống hoàn toàn là một bước làm sạch dữ liệu cơ bản, cần thiết để đạt được bộ dữ liệu “sạch” và tối ưu cho quá trình xây dựng mô hình.
cols_to_num <- c( "Tài_sản_ngắn_hạn","Tiền_và_các_khoản_tương_đương_tiền","Các_khoản_đầu_tư_tài_chính_ngắn_hạn","Tổng_tài_sản","Tổng_nợ_phải_trả","Vốn_chủ_sở_hữu","Doanh_thu_thuần_về_bán_hàng_và_cung_cấp_dịch_vụ","Lợi_nhuận_gộp_về_bán_hàng_và_cung_cấp_dịch_vụ","Doanh_thu_hoạt_động_tài_chính","Tỷ_trọng_nợ","Tỷ_suất_lợi_nhuận_gộp","Tỷ_lệ_thanh_toán_hiện_hành")
# Áp dụng hàm as.numeric() cho tất cả các cột được chọn
bc_6[cols_to_num] <- lapply(bc_6[cols_to_num], as.numeric) Đây là bước chẩn đoán và sửa chữa quan trọng, xác nhận rằng các chỉ tiêu tài chính đã sẵn sàng về mặt kỹ thuật để đưa vào các công cụ và mô hình phân tích sâu hơn.
## 'data.frame': 10 obs. of 15 variables:
## $ Năm_Biến : num 2015 2016 2017 2018 2019 ...
## $ Tài_sản_ngắn_hạn : num 1.22e+13 1.07e+13 1.37e+13 1.47e+13 1.92e+13 ...
## $ Tiền_và_các_khoản_tương_đương_tiền : num 7.94e+12 3.44e+12 2.64e+12 4.47e+12 4.12e+12 ...
## $ Các_khoản_đầu_tư_tài_chính_ngắn_hạn : num 9.43e+11 3.17e+12 6.56e+12 7.54e+12 1.24e+13 ...
## $ Tài_sản_dài_hạn : num 9.38e+12 8.48e+12 8.33e+12 7.68e+12 7.80e+12 ...
## $ Tổng_tài_sản : num 2.16e+13 1.92e+13 2.20e+13 2.24e+13 2.70e+13 ...
## $ Tổng_nợ_phải_trả : num 7.51e+12 6.76e+12 7.59e+12 6.25e+12 6.89e+12 ...
## $ Vốn_chủ_sở_hữu : num 1.41e+13 1.24e+13 1.44e+13 1.61e+13 2.01e+13 ...
## $ Doanh_thu_thuần_về_bán_hàng_và_cung_cấp_dịch_vụ: num 2.71e+13 3.06e+13 3.44e+13 3.59e+13 3.79e+13 ...
## $ Lợi_nhuận_gộp_về_bán_hàng_và_cung_cấp_dịch_vụ : num 7.56e+12 8.27e+12 8.87e+12 8.08e+12 9.55e+12 ...
## $ Doanh_thu_hoạt_động_tài_chính : num 4.19e+11 7.51e+11 5.06e+11 6.30e+11 8.90e+11 ...
## $ Giai_đoạn : Factor w/ 2 levels "Sau_2020","Trước_2020": 2 2 2 2 2 1 1 1 1 1
## $ Tỷ_trọng_nợ : num 0.348 0.352 0.345 0.28 0.255 ...
## $ Tỷ_suất_lợi_nhuận_gộp : num 0.278 0.27 0.257 0.225 0.252 ...
## $ Tỷ_lệ_thanh_toán_hiện_hành : num 1.62 1.59 1.8 2.35 2.78 ...
Tất cả các biến được chọn đều đã ở kiểu numeric. ## Xuất dữ liệu đã xử lý ra file mới
Việc gán lại tên giúp tạo một bản sao (copy) của dữ liệu đã xử lý để có thể thực hiện các thao tác phân tích hoặc chỉnh sửa tiếp theo mà không làm thay đổi phiên bản gốc (bc_6).
## [1] 1.919287e+13
## [1] 3.446508e+13
Đây là hai chỉ số thống kê mô tả cơ bản, giúp thiết lập ranh giới và đánh giá sơ bộ sự biến động của quy mô Tổng tài sản.
## Tài_sản_ngắn_hạn
## 6.078829e+12
## Tiền_và_các_khoản_tương_đương_tiền
## 1.503589e+12
## Các_khoản_đầu_tư_tài_chính_ngắn_hạn
## 6.567659e+12
## Tổng_tài_sản
## 5.731623e+12
## Tổng_nợ_phải_trả
## 1.213390e+12
## Vốn_chủ_sở_hữu
## 4.895697e+12
## Doanh_thu_thuần_về_bán_hàng_và_cung_cấp_dịch_vụ
## 3.952940e+12
## Lợi_nhuận_gộp_về_bán_hàng_và_cung_cấp_dịch_vụ
## 9.796879e+11
## Doanh_thu_hoạt_động_tài_chính
## 3.130559e+11
## Tỷ_trọng_nợ
## 4.543447e-02
## Tỷ_suất_lợi_nhuận_gộp
## 2.641952e-02
## Tỷ_lệ_thanh_toán_hiện_hành
## 6.038734e-01
Độ lệch chuẩn phản ánh mức độ biến động (rủi ro) của từng chỉ tiêu tài chính; SD càng lớn, biến động càng cao.
Các chỉ tiêu quy mô (\(\text{Tổng tài sản, Tài sản ngắn hạn, Vốn chủ sở hữu}\)) có độ biến động rất lớn, cho thấy sự khác biệt đáng kể về quy mô giữa các đơn vị/thời kỳ. Các chỉ tiêu tỷ lệ như Tỷ suất lợi nhuận gộp và Tỷ trọng nợ có độ biến động thấp (rất ổn định), trong khi Tỷ lệ thanh toán hiện hành là biến động nhất.
## Tài_sản_ngắn_hạn
## 1.058202e+13
## Tiền_và_các_khoản_tương_đương_tiền
## 9.897415e+11
## Các_khoản_đầu_tư_tài_chính_ngắn_hạn
## 1.007984e+13
## Tổng_tài_sản
## 1.059936e+13
## Tổng_nợ_phải_trả
## 1.610339e+12
## Vốn_chủ_sở_hữu
## 9.133173e+12
## Doanh_thu_thuần_về_bán_hàng_và_cung_cấp_dịch_vụ
## 6.257521e+12
## Lợi_nhuận_gộp_về_bán_hàng_và_cung_cấp_dịch_vụ
## 1.131500e+12
## Doanh_thu_hoạt_động_tài_chính
## 4.241671e+11
## Tỷ_trọng_nợ
## 7.405338e-02
## Tỷ_suất_lợi_nhuận_gộp
## 3.624234e-02
## Tỷ_lệ_thanh_toán_hiện_hành
## 9.311324e-01
Chỉ tiêu quy mô (tỷ \(10^{13}\) và \(10^{12}\)): Tổng_tài_sản, Tài_sản_ngắn_hạn, Các_khoản_đầu_tư_tài_chính_ngắn_hạn có \(\text{IQR}\) cao nhất (khoảng \(1 \times 10^{13}\)). Điều này khẳng định sự khác biệt về quy mô giữa các quan sát là rất lớn, ngay cả khi loại trừ các ngoại lai.
Các tỷ số (tỷ lệ):Tỷ_lệ_thanh_toán_hiện_hành có \(\text{IQR}\) cao nhất (\(\approx 0.931\)). Điều này xác nhận rằng tính thanh khoản ngắn hạn có sự phân tán và biến động mạnh nhất so với các tỷ số khác.Tỷ_suất_lợi_nhuận_gộp (\(\approx 3.62\%\)) và Tỷ_trọng_nợ (\(\approx 7.41\%\)) có \(\text{IQR}\) thấp, cho thấy sự ổn định cao và tính đồng nhất của khả năng sinh lời cốt lõi và cơ cấu vốn.
Tóm lại, \(\text{IQR}\) là chỉ số đắc lực để đánh giá độ phân tán thực chất của dữ liệu, không bị nhiễu bởi các giá trị ngoại lai.
## [1] 2.481266
Khuynh hướng Tập trung
Giá trị Trung bình: \(2.481266\).
Về mặt thống kê, giá trị này đại diện cho khuynh hướng tập trung (central tendency) của biến số. Nó là giá trị tiêu biểu cho Tỷ lệ Thanh toán Hiện hành trong toàn bộ bộ dữ liệu của bạn.Giá trị Trung bình được sử dụng để so sánh các nhóm (ví dụ: so sánh với Trung bình Tỷ lệ Thanh toán Hiện hành của toàn ngành hoặc so với giai đoạn “Trước 2020”) hoặc làm cơ sở cho các phân tích thống kê phức tạp hơn (như kiểm định T-test, hồi quy).
## [1] 0.2744309
Ý Nghĩa Thống kê: Khuynh hướng Tập trung Không bị ảnh hưởng bởi ngoại lai.
Giá trị Trung vị: \(0.2744309\) (\(\approx 27.44\%\)).
Trung vị (\(\text{Median}\)) là giá trị nằm ở chính giữa bộ dữ liệu (50% quan sát có giá trị thấp hơn và 50% quan sát có giá trị cao hơn). Ưu điểm thống kê: Trung vị là thước đo mạnh mẽ cho khuynh hướng tập trung vì nó không bị ảnh hưởng bởi các giá trị ngoại lai (ví dụ: một doanh nghiệp có tỷ trọng nợ cực cao hoặc cực thấp).
## [1] 1.243318e+13 1.442049e+13 2.064576e+13 2.443709e+13 2.548516e+13
Việc so sánh 5 giá trị này cung cấp thông tin quý giá về sự đối xứng và độ phân tán:
Khuynh hướng Trung tâm: Trung vị (\(\mathbf{2.065 \times 10^{13}}\)) là quy mô Vốn chủ sở hữu tiêu biểu.
Phạm vi và Độ phân tán:Phạm vi (Range): \(\text{Max} - \text{Min} = (2.549 - 1.243) \times 10^{13} \approx 1.306 \times 10^{13}\). Đây là sự khác biệt tối đa về quy mô. Khoảng Tứ phân vị (IQR): \(\text{Q3} - \text{Q1} = (2.444 - 1.442) \times 10^{13} \approx 1.002 \times 10^{13}\). Khoảng cách này cho thấy \(\mathbf{50\%}\) dữ liệu trung tâm có độ phân tán rất lớn về quy mô.
Kiểm tra Độ lệch (Skewness): Khoảng cách từ \(\text{Q1}\) đến \(\text{Median}\) là: \(2.065 - 1.442 = 0.623 \times 10^{13}\). Khoảng cách từ \(\text{Median}\) đến \(\text{Q3}\) là: \(2.444 - 2.065 = 0.379 \times 10^{13}\). Vì \(\text{Median} - \text{Q1} > \text{Q3} - \text{Median}\), điều này gợi ý rằng dữ liệu bị lệch trái (negative skew). Nghĩa là, các giá trị Vốn chủ sở hữu thấp có xu hướng phân tán rộng hơn so với các giá trị cao.
## [1] 1.562573e+25
Giá trị Phương sai: \(\mathbf{1.562573 \times 10^{25}}\) là một con số rất lớn.
Phương sai lớn khẳng định rằng có sự phân tán cực kỳ mạnh về quy mô Doanh thu thuần trong bộ dữ liệu của bạn. Điều này nhất quán với kết quả Độ lệch chuẩn (\(\text{sd}\)) cao đã tính trước đó.
cv_loinhuan <- sd(bcn$Lợi_nhuận_gộp, na.rm = TRUE) / mean(bcn$Lợi_nhuận_gộp, na.rm = TRUE)
cv_loinhuan## [1] 0.1118167
# sd() tính độ lệch chuẩn, mean() tính trung bình; chia hai giá trị này để thu được hệ số biến thiên (CV).Hệ số biến thiên phản ánh mức độ rủi ro hoặc dao động tương đối của lợi nhuận gộp so với trung bình.
CV của Lợi nhuận gộp là \(\mathbf{0.1118}\) (hoặc \(\mathbf{11.18\%}\)). Điều này có nghĩa là, độ lệch chuẩn của Lợi nhuận gộp bằng \(\mathbf{11.18\%}\) so với giá trị trung bình của nó.
\(\text{CV}\) \(11.18\%\) là một con số tương đối thấp trong tài chính, ngụ ý Lợi nhuận gộp có mức độ ổn định khá cao so với giá trị trung bình mà doanh nghiệp tạo ra.
## [,1]
## [1,] -1.2287642
## [2,] -0.5042564
## [3,] 0.1061247
## [4,] -0.6914548
## [5,] 0.8054398
## [6,] -0.2658543
Các Z-score từ \(-1.23\) đến \(0.81\) nằm trong khoảng \(\pm 2\) và \(\pm 3\).
Điều này xác nhận rằng 6 quan sát đầu tiên về Lợi nhuận gộp không phải là các giá trị cực đoan (ngoại lai) đáng báo động. Chúng nằm trong phạm vi biến động bình thường (hoặc gần mức bình thường) của bộ dữ liệu.
Những Z-score này cho thấy dữ liệu ban đầu khá đồng nhất và sẵn sàng cho các phân tích tiếp theo mà không cần phải lo lắng về việc các quan sát đầu tiên làm sai lệch kết quả.
##
## Sau_2020 Trước_2020
## 5 5
Kết quả cho thấy có 5 quan sát thuộc nhóm “Sau_2020” và 5 quan sát thuộc nhóm “Trước_2020”.
Mẫu cân bằng giúp tăng cường độ tin cậy của các kiểm định thống kê, vì sự khác biệt được tìm thấy giữa hai nhóm ít có khả năng là do sự khác biệt về kích thước mẫu.
## [1] 0.7445376
Giá trị Hệ số Tương quan: \(\mathbf{0.7445376}\)
Loại Tương quan: Hệ số này nằm trong khoảng từ \(0\) đến \(1\), cho thấy đây là một mối tương quan dương mạnh.
Giá trị \(\mathbf{0.7445376}\) có nghĩa là:Khi Tổng tài sản tăng, Tổng nợ phải trả có xu hướng tăng theo một cách mạnh mẽ. Khi Tổng tài sản giảm, Tổng nợ phải trả có xu hướng giảm theo.
## [1] -0.3096925
Giá trị Hệ số Tương quan: \(\mathbf{-0.3096925}\)
Loại Tương quan: Đây là mối tương quan âm yếu (giá trị nằm giữa \(-0.3\) và \(-0.5\)).
Tương quan âm có nghĩa là khi Tỷ trọng nợ tăng, Tỷ suất lợi nhuận gộp có xu hướng giảm, và ngược lại.
## Tài_sản_ngắn_hạn
## Tài_sản_ngắn_hạn 1.00000000
## Tiền_và_các_khoản_tương_đương_tiền -0.09911822
## Các_khoản_đầu_tư_tài_chính_ngắn_hạn 0.96597316
## Tổng_tài_sản 0.99685824
## Tổng_nợ_phải_trả 0.71341042
## Vốn_chủ_sở_hữu 0.99025320
## Doanh_thu_thuần_về_bán_hàng_và_cung_cấp_dịch_vụ 0.01548207
## Lợi_nhuận_gộp_về_bán_hàng_và_cung_cấp_dịch_vụ 0.59404485
## Doanh_thu_hoạt_động_tài_chính 0.88767039
## Tỷ_trọng_nợ -0.70661538
## Tỷ_suất_lợi_nhuận_gộp 0.64001370
## Tỷ_lệ_thanh_toán_hiện_hành 0.84244768
## Tiền_và_các_khoản_tương_đương_tiền
## Tài_sản_ngắn_hạn -0.099118219
## Tiền_và_các_khoản_tương_đương_tiền 1.000000000
## Các_khoản_đầu_tư_tài_chính_ngắn_hạn -0.323417359
## Tổng_tài_sản -0.049093995
## Tổng_nợ_phải_trả 0.172382252
## Vốn_chủ_sở_hữu -0.100202469
## Doanh_thu_thuần_về_bán_hàng_và_cung_cấp_dịch_vụ -0.235807834
## Lợi_nhuận_gộp_về_bán_hàng_và_cung_cấp_dịch_vụ -0.248684216
## Doanh_thu_hoạt_động_tài_chính -0.213934677
## Tỷ_trọng_nợ 0.263933510
## Tỷ_suất_lợi_nhuận_gộp 0.001082915
## Tỷ_lệ_thanh_toán_hiện_hành -0.270843716
## Các_khoản_đầu_tư_tài_chính_ngắn_hạn
## Tài_sản_ngắn_hạn 0.96597316
## Tiền_và_các_khoản_tương_đương_tiền -0.32341736
## Các_khoản_đầu_tư_tài_chính_ngắn_hạn 1.00000000
## Tổng_tài_sản 0.94774008
## Tổng_nợ_phải_trả 0.57199801
## Vốn_chủ_sở_hữu 0.96779736
## Doanh_thu_thuần_về_bán_hàng_và_cung_cấp_dịch_vụ 0.04752151
## Lợi_nhuận_gộp_về_bán_hàng_và_cung_cấp_dịch_vụ 0.57576393
## Doanh_thu_hoạt_động_tài_chính 0.88880195
## Tỷ_trọng_nợ -0.79322269
## Tỷ_suất_lợi_nhuận_gộp 0.58997866
## Tỷ_lệ_thanh_toán_hiện_hành 0.90537095
## Tổng_tài_sản Tổng_nợ_phải_trả
## Tài_sản_ngắn_hạn 0.99685824 0.71341042
## Tiền_và_các_khoản_tương_đương_tiền -0.04909400 0.17238225
## Các_khoản_đầu_tư_tài_chính_ngắn_hạn 0.94774008 0.57199801
## Tổng_tài_sản 1.00000000 0.74453758
## Tổng_nợ_phải_trả 0.74453758 1.00000000
## Vốn_chủ_sở_hữu 0.98621646 0.62381717
## Doanh_thu_thuần_về_bán_hàng_và_cung_cấp_dịch_vụ -0.01599131 0.03490261
## Lợi_nhuận_gộp_về_bán_hàng_và_cung_cấp_dịch_vụ 0.58915423 0.61526945
## Doanh_thu_hoạt_động_tài_chính 0.87082965 0.49449783
## Tỷ_trọng_nợ -0.67537170 -0.01572594
## Tỷ_suất_lợi_nhuận_gộp 0.67048850 0.59044055
## Tỷ_lệ_thanh_toán_hiện_hành 0.81658718 0.22761123
## Vốn_chủ_sở_hữu
## Tài_sản_ngắn_hạn 0.99025320
## Tiền_và_các_khoản_tương_đương_tiền -0.10020247
## Các_khoản_đầu_tư_tài_chính_ngắn_hạn 0.96779736
## Tổng_tài_sản 0.98621646
## Tổng_nợ_phải_trả 0.62381717
## Vốn_chủ_sở_hữu 1.00000000
## Doanh_thu_thuần_về_bán_hàng_và_cung_cấp_dịch_vụ -0.02737191
## Lợi_nhuận_gộp_về_bán_hàng_và_cung_cấp_dịch_vụ 0.53725816
## Doanh_thu_hoạt_động_tài_chính 0.89696326
## Tỷ_trọng_nợ -0.78679411
## Tỷ_suất_lợi_nhuận_gộp 0.63863349
## Tỷ_lệ_thanh_toán_hiện_hành 0.89960627
## Doanh_thu_thuần_về_bán_hàng_và_cung_cấp_dịch_vụ
## Tài_sản_ngắn_hạn 0.0154820668
## Tiền_và_các_khoản_tương_đương_tiền -0.2358078337
## Các_khoản_đầu_tư_tài_chính_ngắn_hạn 0.0475215111
## Tổng_tài_sản -0.0159913071
## Tổng_nợ_phải_trả 0.0349026078
## Vốn_chủ_sở_hữu -0.0273719113
## Doanh_thu_thuần_về_bán_hàng_và_cung_cấp_dịch_vụ 1.0000000000
## Lợi_nhuận_gộp_về_bán_hàng_và_cung_cấp_dịch_vụ 0.6235122102
## Doanh_thu_hoạt_động_tài_chính -0.1231597595
## Tỷ_trọng_nợ 0.0001954119
## Tỷ_suất_lợi_nhuận_gộp -0.5470392170
## Tỷ_lệ_thanh_toán_hiện_hành -0.0163881514
## Lợi_nhuận_gộp_về_bán_hàng_và_cung_cấp_dịch_vụ
## Tài_sản_ngắn_hạn 0.5940448
## Tiền_và_các_khoản_tương_đương_tiền -0.2486842
## Các_khoản_đầu_tư_tài_chính_ngắn_hạn 0.5757639
## Tổng_tài_sản 0.5891542
## Tổng_nợ_phải_trả 0.6152694
## Vốn_chủ_sở_hữu 0.5372582
## Doanh_thu_thuần_về_bán_hàng_và_cung_cấp_dịch_vụ 0.6235122
## Lợi_nhuận_gộp_về_bán_hàng_và_cung_cấp_dịch_vụ 1.0000000
## Doanh_thu_hoạt_động_tài_chính 0.4223114
## Tỷ_trọng_nợ -0.2335525
## Tỷ_suất_lợi_nhuận_gộp 0.3113022
## Tỷ_lệ_thanh_toán_hiện_hành 0.3613313
## Doanh_thu_hoạt_động_tài_chính
## Tài_sản_ngắn_hạn 0.8876704
## Tiền_và_các_khoản_tương_đương_tiền -0.2139347
## Các_khoản_đầu_tư_tài_chính_ngắn_hạn 0.8888020
## Tổng_tài_sản 0.8708296
## Tổng_nợ_phải_trả 0.4944978
## Vốn_chủ_sở_hữu 0.8969633
## Doanh_thu_thuần_về_bán_hàng_và_cung_cấp_dịch_vụ -0.1231598
## Lợi_nhuận_gộp_về_bán_hàng_và_cung_cấp_dịch_vụ 0.4223114
## Doanh_thu_hoạt_động_tài_chính 1.0000000
## Tỷ_trọng_nợ -0.7205663
## Tỷ_suất_lợi_nhuận_gộp 0.6283717
## Tỷ_lệ_thanh_toán_hiện_hành 0.8307265
## Tỷ_trọng_nợ
## Tài_sản_ngắn_hạn -0.7066153755
## Tiền_và_các_khoản_tương_đương_tiền 0.2639335102
## Các_khoản_đầu_tư_tài_chính_ngắn_hạn -0.7932226908
## Tổng_tài_sản -0.6753717028
## Tổng_nợ_phải_trả -0.0157259440
## Vốn_chủ_sở_hữu -0.7867941081
## Doanh_thu_thuần_về_bán_hàng_và_cung_cấp_dịch_vụ 0.0001954119
## Lợi_nhuận_gộp_về_bán_hàng_và_cung_cấp_dịch_vụ -0.2335525331
## Doanh_thu_hoạt_động_tài_chính -0.7205662862
## Tỷ_trọng_nợ 1.0000000000
## Tỷ_suất_lợi_nhuận_gộp -0.3096925115
## Tỷ_lệ_thanh_toán_hiện_hành -0.9727071029
## Tỷ_suất_lợi_nhuận_gộp
## Tài_sản_ngắn_hạn 0.640013704
## Tiền_và_các_khoản_tương_đương_tiền 0.001082915
## Các_khoản_đầu_tư_tài_chính_ngắn_hạn 0.589978665
## Tổng_tài_sản 0.670488505
## Tổng_nợ_phải_trả 0.590440546
## Vốn_chủ_sở_hữu 0.638633490
## Doanh_thu_thuần_về_bán_hàng_và_cung_cấp_dịch_vụ -0.547039217
## Lợi_nhuận_gộp_về_bán_hàng_và_cung_cấp_dịch_vụ 0.311302192
## Doanh_thu_hoạt_động_tài_chính 0.628371747
## Tỷ_trọng_nợ -0.309692511
## Tỷ_suất_lợi_nhuận_gộp 1.000000000
## Tỷ_lệ_thanh_toán_hiện_hành 0.459124403
## Tỷ_lệ_thanh_toán_hiện_hành
## Tài_sản_ngắn_hạn 0.84244768
## Tiền_và_các_khoản_tương_đương_tiền -0.27084372
## Các_khoản_đầu_tư_tài_chính_ngắn_hạn 0.90537095
## Tổng_tài_sản 0.81658718
## Tổng_nợ_phải_trả 0.22761123
## Vốn_chủ_sở_hữu 0.89960627
## Doanh_thu_thuần_về_bán_hàng_và_cung_cấp_dịch_vụ -0.01638815
## Lợi_nhuận_gộp_về_bán_hàng_và_cung_cấp_dịch_vụ 0.36133129
## Doanh_thu_hoạt_động_tài_chính 0.83072648
## Tỷ_trọng_nợ -0.97270710
## Tỷ_suất_lợi_nhuận_gộp 0.45912440
## Tỷ_lệ_thanh_toán_hiện_hành 1.00000000
Phân tích Tương quan Mạnh (Tuyệt đối \(\ge 0.7\))
Tương quan mạnh cho thấy hai biến có xu hướng di chuyển cùng nhau một cách nhất quán.
Tài sản Ngắn hạn & Tổng Tài sản (\(\mathbf{0.997}\)): Tương quan gần như hoàn hảo. Điều này khẳng định Tài sản Ngắn hạn là thành phần chính quyết định quy mô của Tổng Tài sản.
Vốn Chủ sở hữu & Tổng Tài sản (\(\mathbf{0.986}\)): Rất mạnh. Cho thấy Vốn Chủ sở hữu là nguồn tài trợ chính cho quy mô Tài sản.
Các Khoản Đầu tư & Tài sản Ngắn hạn (\(\mathbf{0.966}\)): Rất mạnh. Cho thấy phần lớn sự biến động của Tài sản Ngắn hạn đến từ các khoản đầu tư tài chính ngắn hạn.
Tỷ trọng nợ & Vốn Chủ sở hữu (\(\mathbf{-0.787}\)): Tương quan âm mạnh. Điều này là logic: khi Tỷ trọng nợ (Nợ/Tổng Tài sản) tăng, Vốn Chủ sở hữu trên Tổng Tài sản phải giảm, và ngược lại. Cả hai đều là nguồn tài trợ tổng tài sản, nếu một tăng thì tỷ lệ của cái kia so với tổng thể sẽ giảm.
Tỷ trọng nợ & Tỷ lệ Thanh toán Hiện hành (\(\mathbf{-0.973}\)): Tương quan âm cực kỳ mạnh (gần như hoàn hảo).
Ý nghĩa: Tỷ lệ Thanh toán Hiện hành đo Tài sản Ngắn hạn/Nợ Ngắn hạn. Sự tương quan âm mạnh này có nghĩa là khi Tỷ trọng nợ tăng, tỷ lệ giữa Tài sản Ngắn hạn và Nợ Ngắn hạn giảm mạnh. Đây là một phát hiện quan trọng, cảnh báo về mối liên hệ giữa đòn bẩy dài hạn (tỷ trọng nợ) và thanh khoản ngắn hạn.
Phân tích Tương quan Yếu/Trung bình (Từ \(-0.5\) đến \(0.5\))
Tương quan yếu thường cho thấy mối quan hệ không đáng tin cậy hoặc bị chi phối bởi các yếu tố khác.
Lợi nhuận gộp & Tỷ suất lợi nhuận gộp (\(\mathbf{0.311}\)): Tương quan dương yếu. Điều này chỉ ra rằng quy mô lợi nhuận gộp lớn chỉ liên quan yếu đến tỷ lệ sinh lời gộp cao.
Ý nghĩa: Tỷ suất lợi nhuận gộp (hiệu quả) không chỉ được quyết định bởi quy mô Lợi nhuận gộp (số tuyệt đối), mà còn bởi quy mô Doanh thu.
Doanh thu thuần & Lợi nhuận gộp (\(\mathbf{0.624}\)): Tương quan dương trung bình/khá mạnh. Điều này là hợp lý: Doanh thu tăng kéo theo Lợi nhuận gộp tăng.
Doanh thu thuần & Tỷ suất lợi nhuận gộp (\(\mathbf{-0.547}\)): Tương quan âm trung bình.
Ý nghĩa: Khi Doanh thu thuần tăng, Tỷ suất lợi nhuận gộp có xu hướng giảm nhẹ. Điều này có thể do hiệu ứng kinh tế theo quy mô (ví dụ: giảm giá để tăng doanh số) làm giảm biên lợi nhuận.
## [1] 2.414643e+24
Giá trị dương lớn (\(2.41 \times 10^{24}\)): Cho thấy đây là mối quan hệ dương mạnh.
Ý nghĩa: Khi Doanh thu thuần tăng, Lợi nhuận gộp có xu hướng tăng theo, và ngược lại. Điều này là logic tài chính vì Lợi nhuận gộp là kết quả trực tiếp của Doanh thu thuần (sau khi trừ Giá vốn hàng bán).
Tăng Tính Ổn định: Hầu hết các chỉ tiêu quan trọng (Tổng tài sản, Doanh thu thuần, và đặc biệt là các tỷ số tài chính: Tỷ trọng nợ, Tỷ suất lợi nhuận gộp, Tỷ lệ thanh toán hiện hành) đều cho thấy Độ lệch chuẩn giảm đáng kể ở giai đoạn Sau 2020.
Ý nghĩa: Điều này ngụ ý rằng, mặc dù giai đoạn Sau 2020 có thể có những biến động kinh tế vĩ mô, doanh nghiệp lại thể hiện tính ổn định cao hơn và ít rủi ro biến động hơn trong các khía cạnh tài chính cốt lõi.
##
## 2015 2016 2017 2018 2019 2020 2021 2022 2023 2024
## Sau_2020 0.0 0.0 0.0 0.0 0.0 0.2 0.2 0.2 0.2 0.2
## Trước_2020 0.2 0.2 0.2 0.2 0.2 0.0 0.0 0.0 0.0 0.0
Kết quả này xác nhận lại rằng bộ dữ liệu cân bằng không chỉ giữa hai nhóm lớn (Sau_2020 vs Trước_2020), mà còn cân bằng đều giữa các năm bên trong mỗi nhóm. Đây là một cấu trúc dữ liệu rất tốt cho các phân tích so sánh tiếp theo
##
## Welch Two Sample t-test
##
## data: Tài_sản_ngắn_hạn by Giai_đoạn
## t = 5.0952, df = 7.9772, p-value = 0.0009436
## alternative hypothesis: true difference in means between group Sau_2020 and group Trước_2020 is not equal to 0
## 95 percent confidence interval:
## 5.517993e+12 1.465042e+13
## sample estimates:
## mean in group Sau_2020 mean in group Trước_2020
## 2.417416e+13 1.408995e+13
Quyết định về Giả thuyết:
Giả thuyết (\(H_0\)): Không có sự khác biệt về Tài sản ngắn hạn trung bình giữa hai giai đoạn.Với p-value = \(0.0009436\), giá trị này nhỏ hơn mức ý nghĩa thông thường \(\alpha = 0.05\).
Kết luận: Chúng ta bác bỏ giả thuyết (\(H_0\)).
Ý nghĩa Tài chính:Có bằng chứng thống kê mạnh mẽ để kết luận rằng Tài sản ngắn hạn trung bình ở giai đoạn Sau 2020 (\(2.417 \times 10^{13}\)) cao hơn đáng kể so với giai đoạn Trước 2020 (\(1.409 \times 10^{13}\)).
##
## Shapiro-Wilk normality test
##
## data: bcn$Tỷ_suất_lợi_nhuận_gộp
## W = 0.93506, p-value = 0.4994
Nếu p-value < 0.05, dữ liệu không tuân theo phân phối chuẩn — cần xem xét dùng kiểm định phi tham số hoặc log-transform. Ở đây p-value = 0.4994 > 0.05, dữ liệu tuân theo phân phối chuẩn.
Giả định về phân phối chuẩn của \(\text{Tỷ suất lợi nhuận gộp}\) được đáp ứng. Điều này cho phép sử dụng an toàn các kiểm định thống kê tham số (như t-test, ANOVA, Hồi quy) với biến này, vì các kiểm định đó yêu cầu dữ liệu phải có phân phối chuẩn để kết quả được tin cậy.
## [1] 0.280207
# Thao tác này tính toán giá trị trung bình của Tỷ suất Lợi nhuận gộp sau khi đã loại bỏ 10% giá trị thấp nhất và 10% giá trị cao nhất.Giá trị Trung bình bị Xén (10%): \(\mathbf{0.280207}\) (hay \(\mathbf{28.02\%}\))
Tỷ suất sinh lời cốt lõi: Giá trị 28.02% là ước tính tốt nhất cho khả năng sinh lời cốt lõi (Biên lợi nhuận gộp) của công ty trong giai đoạn nghiên cứu, không tính đến các sự kiện bất thường (cực đoan) làm tăng hoặc giảm đột ngột lợi nhuận.
# CV = Độ lệch chuẩn / Giá trị trung bình
sd(bcn$Doanh_thu_thuần_về_bán_hàng_và_cung_cấp_dịch_vụ) / mean(bcn$Doanh_thu_thuần_về_bán_hàng_và_cung_cấp_dịch_vụ)## [1] 0.1244445
# CV là phép đo rủi ro tương đối của Doanh thu thuần. Nó thể hiện độ biến động (rủi ro) dưới dạng phần trăm của giá trị trung bình.\(\text{CV}\) của Doanh thu thuần là \(\mathbf{12.44\%}\).
Ý nghĩa: Mức biến động của Doanh thu thuần là \(12.44\%\) so với giá trị doanh thu trung bình. \(\text{CV}\) càng thấp, doanh thu càng ổn định và dễ dự đoán hơn so với quy mô của nó.
Trong các bước trước đã tính \(\text{CV}\) của Lợi nhuận gộp là \(\mathbf{11.18\%}\).
So sánh:\(\text{CV}_{\text{Doanh thu}} (12.44\%)\) \(\mathbf{>}\) \(\text{CV}_{\text{Lợi nhuận gộp}} (11.18\%)\)
Kết luận: Doanh thu thuần có độ biến động tương đối cao hơn Lợi nhuận gộp. Điều này gợi ý rằng mức độ kiểm soát Giá vốn hàng bán (\(\text{COGS}\)) khá tốt, giúp ổn định Lợi nhuận gộp hơn so với sự biến động trong Doanh thu thuần.
ggplot(bcn, aes(x = Năm_Biến, y = Doanh_thu_thuần_về_bán_hàng_và_cung_cấp_dịch_vụ)) +
geom_line(color = "#0072B2", linewidth = 1.2) + # Layer 2
geom_point(color = "#D55E00", size = 3) + # Layer 3
labs(title = "Xu hướng Doanh thu thuần qua các năm", x = "Năm", y = "Doanh thu thuần") + # Layer 4
scale_y_continuous(labels = comma) + # Layer 5: Định dạng trục Y
theme_minimal() # Layer 6: ThemeGiai đoạn Tăng trưởng (Trước 2020)
Từ 2015 đến 2018: Doanh thu thuần có xu hướng tăng trưởng ổn định và mạnh mẽ, đạt đỉnh cao nhất trong toàn bộ chuỗi thời gian vào năm 2018/2019 (khoảng 37,500 tỷ VNĐ).
Ý nghĩa: Phản ánh một giai đoạn mở rộng quy mô hoạt động và tăng trưởng thị phần mạnh mẽ.
Giai đoạn Biến động và Phục hồi (Sau 2020)
Năm 2020: Có một sự sụt giảm mạnh nhất trong toàn bộ chuỗi, xuống mức thấp nhất (dưới 30,000 tỷ VNĐ).
Ý nghĩa: Sự sụt giảm đột ngột này có thể phản ánh tác động của các yếu tố kinh tế vĩ mô (ví dụ: đại dịch COVID-19 hoặc suy thoái kinh tế) ảnh hưởng nghiêm trọng đến hoạt động kinh doanh.
Năm 2021-2022: Doanh thu có sự phục hồi mạnh mẽ (đạt đỉnh phục hồi khoảng 35,000 tỷ VNĐ) nhưng sau đó lại sụt giảm nhẹ.
Ý nghĩa: Cho thấy sự không ổn định (biến động cao) trong hiệu suất bán hàng ở giai đoạn sau năm 2020. Điều này phù hợp với kết quả phân tích Độ lệch chuẩn cao cho Doanh thu thuần trước đó.
Biểu đồ này là bằng chứng trực quan cho thấy:
Doanh nghiệp đã trải qua một sự kiện chấn động vào khoảng năm 2020.
Quy mô hoạt động (Doanh thu thuần) ở giai đoạn Trước 2020 có xu hướng tăng trưởng ổn định hơn, trong khi giai đoạn Sau 2020 có tính chất biến động mạnh và thiếu ổn định hơn.
ggplot(bcn %>% group_by(Giai_đoạn) %>% summarise(Mean_LN_Gop = mean(Tỷ_suất_lợi_nhuận_gộp, na.rm = TRUE)),
aes(x = Giai_đoạn, y = Mean_LN_Gop, fill = Giai_đoạn)) +
geom_col(width = 0.6) + # Layer 2
geom_text(aes(label = round(Mean_LN_Gop, 4)), vjust = -0.5, size = 4) + # Layer 3: Thêm nhãn giá trị
scale_fill_manual(values = c("Trước_2020" = "#56B4E9", "Sau_2020" = "#009E73")) + # Layer 4: Đổi màu
labs(title = "Tỷ suất Lợi nhuận gộp trung bình theo Giai đoạn", y = "Tỷ suất LN Gộp (%)") + # Layer 5
theme_classic() # Layer 6Sự Khác biệt về Khả năng Sinh lời: Giai đoạn Sau 2020 có Tỷ suất Lợi nhuận gộp trung bình cao hơn đáng kể (\(29.83\%\)) so với giai đoạn Trước 2020 (\(25.66\%\)).
Ý nghĩa: Điều này ngụ ý rằng, mặc dù Doanh thu thuần có biến động mạnh hơn ở giai đoạn Sau 2020 (như đã thấy trong biểu đồ xu hướng trước đó), nhưng khả năng kiểm soát Giá vốn hàng bán hoặc hiệu quả định giá sản phẩm đã cải thiện. Biên lợi nhuận cốt lõi trên mỗi đồng doanh thu đã tăng lên.
Mối liên hệ với Dữ liệu Thống kê:Biểu đồ này xác nhận dữ liệu Trung bình Tỷ suất Lợi nhuận gộp được thể hiện trong kết quả \(\text{summary()}\): \(\text{Mean}\) cho nhóm “Sau_2020” cao hơn \(\text{Mean}\) cho nhóm “Trước_2020”.
Trung vị (\(\text{Median}\)) cũng thể hiện xu hướng tương tự:
Sau 2020 (Median): \(0.2884\)
Trước 2020 (Median): \(0.2774\)
Kết luận: Trung bình Tỷ suất Lợi nhuận gộp đã cải thiện và cao hơn ở giai đoạn Sau 2020 so với giai đoạn Trước 2020.
ggplot(bcn, aes(x = Năm_Biến, y = Vốn_chủ_sở_hữu)) +
geom_area(fill = "#CC79A7", alpha = 0.6) + # Layer 2
geom_point(color = "#D55E00", size = 2) + # Layer 3
geom_smooth(method = "lm", se = FALSE, color = "black", linetype = "dashed") + # Layer 4: Đường xu hướng
labs(title = "Xu hướng Vốn Chủ Sở hữu theo Năm", x = "Năm", y = "Vốn Chủ Sở hữu") + # Layer 5
scale_y_continuous(labels = unit_format(unit = "Tỷ", scale = 1e-12)) + # Layer 6
theme_bw() + # Layer 7
# Layer 8: Sửa trục X để hiển thị các năm là số nguyên
scale_x_continuous(breaks = seq(2015, max(bcn$Năm_Biến), by = 1),
labels = function(x) format(x, scientific = FALSE))## `geom_smooth()` using formula = 'y ~ x'
Xu hướng dài hạn: Đường xu hướng tuyến tính dương, rõ rệt và nhất quán trong giai đoạn \(2015\)–\(2024\).
Ý nghĩa: Củng cố Cơ cấu Vốn: Cho thấy doanh nghiệp có sự tăng trưởng ổn định trong khả năng tự tài trợ, là dấu hiệu tích cực về sức khỏe tài chính và năng lực giữ lại lợi nhuận
Biến động và quy mô: Quy mô VCSH tăng mạnh từ \(\text{Min} \approx 12.43\) nghìn tỷ VNĐ (2016) đến \(\text{Max} \approx 25.49\) nghìn tỷ VNĐ (2023). Các điểm dữ liệu nằm sát đường xu hướng.
Ý nghĩa: Sức mạnh và Ổn định: Sự phục hồi nhanh chóng từ các dao động ngắn hạn (như sụt giảm năm 2016) và việc các điểm dữ liệu gần đường xu hướng chứng minh VCSH có tính ổn định cao và là nguồn lực vững chắc cho sự mở rộng quy mô tài sản.
library(scales) # Đảm bảo gói này đã được tải
ggplot(bcn, aes(x = Tài_sản_ngắn_hạn, fill = Giai_đoạn)) +
geom_density(alpha = 0.6, linewidth = 0.2) +
# Đường Trung vị riêng biệt cho từng Giai đoạn
geom_vline(
data = . %>% group_by(Giai_đoạn) %>% summarise(median_value = median(Tài_sản_ngắn_hạn)),
aes(xintercept = median_value),
linetype = "dashed",
color = "darkred",
linewidth = 0.8
) +
facet_wrap(~ Giai_đoạn, scales = "free_y") +
labs(
title = "Phân bố Tài sản ngắn hạn theo Giai đoạn",
subtitle = "Đường nét đứt thể hiện giá trị Trung vị (Median). Giá trị trục X tính theo Nghìn Tỷ.",
x = "Giá trị Tài sản ngắn hạn (Nghìn Tỷ)",
y = "Mật độ (Density)",
fill = "Giai đoạn"
) +
scale_fill_manual(values = c("Sau_2020" = "#A84C62", "Trước_2020" = "#4C7AA8")) +
# *** ĐIỀU CHỈNH QUAN TRỌNG: CHIA CHO 1e12 (Nghìn Tỷ) ***
scale_x_continuous(
labels = function(x) paste0(round(x / 1e12, 1), "T") # Làm tròn và thêm ký hiệu 'T'
) +
# Đảm bảo trục Y không dùng ký hiệu khoa học
scale_y_continuous(labels = scales::number) +
theme_classic() +
theme(
plot.title = element_text(face = "bold", size = 16),
plot.subtitle = element_text(color = "gray40"),
axis.title.x = element_text(margin = margin(t = 10)),
axis.title.y = element_text(margin = margin(r = 10)),
panel.grid.major.y = element_line(linetype = "dotted", color = "gray80"),
legend.position = "bottom"
)Phân tích phân bố Tài sản ngắn hạn (TSNH) tiết lộ một sự dịch chuyển cấu trúc và tăng trưởng quy mô nổi bật sau năm 2020.
Tăng Trưởng Quy Mô Mạnh Mẽ: Phát hiện then chốt là sự mở rộng quy mô tuyệt đối của TSNH. Giá trị Trung vị (Median) đã tăng từ 14.09 Tỷ VND (Trước 2020) lên 24.52 Tỷ VND (Sau 2020). Sự gia tăng có ý nghĩa thống kê này cho thấy doanh nghiệp đã mở rộng mạnh mẽ quy mô hoạt động và đầu tư ngắn hạn, là dấu hiệu rõ ràng của sự tăng trưởng quy mô và tiềm năng thanh khoản cao hơn.
Hội Tụ và Biến Động:
Tính Đồng nhất: Hình dạng phân bố đã chuyển từ hai đỉnh (bimodal) (Trước 2020) sang một đỉnh (unimodal) (Sau 2020). Điều này phản ánh sự hội tụ về quy mô lớn của Tài sản ngắn hạn trong mẫu, cho thấy một cấu trúc đồng nhất hơn.
Biến động: Mặc dù quy mô tăng, đường mật độ rộng hơn ở giai đoạn Sau 2020 cho thấy độ phân tán cao hơn về giá trị tuyệt đối của TSNH giữa các quan sát. Điều này hàm ý rủi ro biến động tuyệt đối cao hơn về quy mô tài sản.
Kết luận: Quá trình này thể hiện sự tăng trưởng quy mô rõ rệt của Tài sản ngắn hạn sau năm 2020, đi kèm với sự đồng nhất cấu trúc, nhưng cũng làm tăng độ phân tán về giá trị tuyệt đối.
ggplot(bcn, aes(x = Tổng_tài_sản, y = Tổng_nợ_phải_trả, color = Giai_đoạn)) +
geom_point(size = 3, alpha = 0.7) + # Layer 2
geom_smooth(method = "lm", se = FALSE, linetype = "solid") + # Layer 3: Đường hồi quy
scale_color_brewer(palette = "Set1") + # Layer 4: Đổi bảng màu
labs(title = "Mối quan hệ Tổng Tài sản và Tổng Nợ (Phân theo Giai đoạn)", x = "Tổng Tài sản", y = "Tổng Nợ phải trả") + # Layer 5
scale_x_continuous(labels = unit_format(unit = "Tỷ", scale = 1e-12)) + # Layer 6
theme_light() # Layer 7## `geom_smooth()` using formula = 'y ~ x'
Giai đoạn Trước 2020 (Đường Màu Xanh) xu hướng (Hệ số góc): Đường hồi quy gần như nằm ngang (hệ số góc gần bằng 0) hoặc dốc xuống rất nhẹ.
Giai đoạn Sau 2020 (Đường Màu Đỏ) xu hướng (Hệ số góc): Đường hồi quy có độ dốc dương rất lớn và rõ rệt.
Sự khác biệt rõ ràng giữa hai đường hồi quy cho thấy một sự thay đổi cấu trúc tài chính quan trọng:
Trước 2020: Tăng trưởng tài sản có xu hướng ít phụ thuộc vào nợ vay.
Sau 2020: Mối quan hệ giữa Tổng Tài sản và Tổng Nợ trở nên tuyến tính và chặt chẽ hơn, cho thấy nợ đã trở thành động lực chính để tài trợ cho sự mở rộng quy mô tài sản.
Điều này xác nhận một sự dịch chuyển rủi ro và chiến lược tài chính: sau năm 2020, doanh nghiệp đã chủ động (hoặc buộc phải) sử dụng đòn bẩy cao hơn để tăng trưởng, dẫn đến mối quan hệ phụ thuộc mạnh mẽ giữa Tổng Tài sản và Tổng Nợ phải trả.
bcn_long <- bcn %>%
select(Tài_sản_ngắn_hạn, Tổng_nợ_phải_trả, Vốn_chủ_sở_hữu, Giai_đoạn) %>%
tidyr::pivot_longer(!Giai_đoạn, names_to = "Variable", values_to = "Value")
ggplot(bcn_long, aes(x = Variable, y = Value, fill = Giai_đoạn)) +
geom_boxplot(width = 0.7) + # Layer 2
geom_jitter(alpha = 0.3, color = "black") + # Layer 3: Thêm điểm dữ liệu thô
scale_y_continuous(labels = unit_format(unit = "Tỷ", scale = 1e-12)) + # Layer 4
labs(title = "So sánh Phân bố Tài sản, Nợ, Vốn theo Giai đoạn", x = "Chỉ tiêu", y = "Giá trị") + # Layer 5
theme_bw() # Layer 6Phân tích Boxplot về ba chỉ tiêu Tài sản ngắn hạn (TSNH), Tổng nợ phải trả (Nợ), và Vốn chủ sở hữu (VCSH) cho thấy một sự dịch chuyển cấu trúc quan trọng Sau 2020:
1.Tăng Trưởng và Củng Cố Vốn: Mở rộng quy mô: Cả ba chỉ tiêu đều tăng quy mô trung vị tuyệt đối, với TSNH (mở rộng hoạt động) và VCSH (tài trợ nội bộ) có mức tăng trưởng mạnh mẽ nhất.
VCSH vượt trội: Mức tăng của VCSH lớn hơn rõ rệt so với Nợ. Điều này ngụ ý rằng sự gia tăng tài sản được tài trợ chủ yếu bởi nguồn lực nội bộ, giúp cải thiện cấu trúc tài chính (giảm đòn bẩy tương đối).
Kết luận chung: Doanh nghiệp đã tăng trưởng quy mô mạnh mẽ (được thể hiện qua TSNH) và tăng cường khả năng tự tài trợ (VCSH). Tuy nhiên, Nợ vẫn đóng vai trò quan trọng và có tính đồng biến cao trong việc hỗ trợ sự mở rộng tài sản.
ggplot(bcn, aes(sample = Tỷ_suất_lợi_nhuận_gộp)) +
# Layer 2: Vẽ các điểm Q-Q. Tùy chỉnh màu sắc và độ mờ cho các điểm.
stat_qq(color = "#0072B2", alpha = 0.8) +
# Layer 3: Vẽ đường chuẩn
stat_qq_line(color = "red", linetype = "dashed") +
# Layer 4: Nhãn
labs(
title = "Kiểm tra Phân phối Chuẩn Tỷ suất LN Gộp",
x = "Quantiles Lý thuyết", # Thêm nhãn trục X rõ ràng
y = "Quantiles Mẫu" # Thêm nhãn trục Y rõ ràng
) +
# Layer 5: Theme
theme_classic()Mục đích: So sánh phân phối của dữ liệu mẫu (các chấm xanh trên trục Y) với phân phối chuẩn lý thuyết (đường nét đứt màu đỏ).
Đánh giá Phân phối Chuẩn: Nếu các điểm dữ liệu nằm sát hoặc nằm trên đường thẳng nét đứt, điều đó cho thấy dữ liệu mẫu tuân theo phân phối chuẩn. Nếu các điểm tạo thành một đường cong hoặc phân tán xa đường thẳng, giả định phân phối chuẩn bị vi phạm.
Dựa trên hình ảnh, ta có thể kết luận: Sự phù hợp: Hầu hết các điểm dữ liệu (chấm xanh) nằm rất gần đường thẳng nét đứt màu đỏ. Các điểm ngoại lệ tiềm năng: Có một điểm ở phía dưới bên trái (giá trị thấp) và một điểm ở phía trên bên phải (giá trị cao) hơi chệch khỏi đường thẳng. Điều này gợi ý rằng có thể có một vài giá trị Tỷ suất Lợi nhuận gộp cực đoan ở hai đầu phân phối.
Kết luận Tổng thể: Biểu đồ xác nhận rằng Tỷ suất Lợi nhuận gộp gần như tuân theo phân phối chuẩn. Điều này phù hợp với kết quả của Kiểm định Shapiro–Wilk trước đó, nơi p-value \(0.4994 > 0.05\), cho phép chúng ta không bác bỏ giả thuyết phân phối chuẩn.
ggplot(bcn, aes(x = Tỷ_trọng_nợ)) +
geom_density(fill = "#009E73", alpha = 0.6) + # Layer 2
geom_vline(aes(xintercept = median(Tỷ_trọng_nợ)), color = "red", linetype = "dashed", size = 1) + # Layer 3: Trung vị
# Layer 4
annotate(
"text", # Loại hình học bạn muốn vẽ
x = median(bcn$Tỷ_trọng_nợ) + 0.05, # Vị trí X của nhãn (x dịch sang phải 0.05)
y = 1, # Vị trí Y của nhãn
label = paste("Median:", round(median(bcn$Tỷ_trọng_nợ), 3)),
color = "red", # Thiết lập màu chữ giống với đường Vline
size = 4, # Kích thước chữ
hjust = 0 # Canh lề chữ (0 = căn trái, 1 = căn phải, 0.5 = giữa)
) +
labs(title = " Phân phối Tỷ trọng Nợ", x = "Tỷ trọng Nợ") + # Layer 5
xlim(0, 1) + # Layer 6: Giới hạn trục X từ 0 đến 1
theme_minimal() # Layer 7## Warning: Using `size` aesthetic for lines was deprecated in ggplot2 3.4.0.
## ℹ Please use `linewidth` instead.
## This warning is displayed once every 8 hours.
## Call `lifecycle::last_lifecycle_warnings()` to see where this warning was
## generated.
Biểu đồ này là một bằng chứng trực quan mạnh mẽ khẳng định Tỷ trọng Nợ trong bộ dữ liệu có xu hướng thấp (tập trung gần \(27\%\)), cho thấy sự an toàn về đòn bẩy vốn. Tuy nhiên, sự tồn tại của hai đỉnh cảnh báo nhà phân tích rằng mẫu có thể không đồng nhất và cần xem xét phân tích riêng biệt cho hai nhóm đòn bẩy.
bcn$Zscore_LN_gop <- scale(bcn$Lợi_nhuận_gộp)
ggplot(bcn, aes(x = as.numeric(Zscore_LN_gop))) +
geom_histogram(binwidth = 0.5, fill = "#56B4E9", color = "white") + # Layer 2
geom_vline(xintercept = c(-2, 2), color = "red", linetype = "dashed", size = 1) + # Layer 3: Ngưỡng Z-score
labs(title = " Phân phối Z-score Lợi nhuận gộp (Phát hiện Outlier)", x = "Z-score") + # Layer 4
coord_cartesian(xlim = c(-3, 3)) + # Layer 5: Giới hạn hiển thị
theme_bw() # Layer 6Chuẩn hóa (Standardization): \(\text{Z-score}\) chuyển đổi dữ liệu Lợi nhuận gộp ban đầu thành một phân phối có \(\text{Trung bình} = 0\) và \(\text{Độ lệch chuẩn} = 1\).
Ý nghĩa: Giá trị trên trục \(\text{X}\) (Z-score) cho biết mỗi quan sát \(\text{Lợi nhuận gộp}\) cách trung bình bao nhiêu độ lệch chuẩn.
Phát hiện Ngoại lai:
Ngưỡng Thống kê: Thông thường, các quan sát có \(|Z| > 2\) hoặc \(|Z| > 3\) được coi là ngoại lai tiềm năng hoặc cực đoan.
Phân tích Biểu đồ: Hầu hết các quan sát nằm trong khoảng \(\text{Z-score}\) từ \(-2\) đến \(2\).Có một quan sát nằm trong bin \(\text{Z-score}\) từ \(2\) đến \(2.5\).
Kết luận: Tồn tại một giá trị ngoại lai tiềm năng về Lợi nhuận gộp (nằm ngoài ngưỡng \(|Z| > 2\)).
ggplot(bcn, aes(x = Lợi_nhuận_gộp_về_bán_hàng_và_cung_cấp_dịch_vụ)) +
geom_histogram(aes(y = after_stat(density)),
binwidth = 1e12, fill = "#F0E442", color = "black") + # Layer 2
geom_density(color = "red", size = 1) + # Layer 3: Đường mật độ
labs(title = "Phân phối Tần suất Lợi nhuận gộp", x = "Lợi nhuận gộp", y = "Tần suất (Mật độ)") + # Layer 4
scale_x_continuous(labels = comma) + # Layer 5
theme_classic() # Layer 6Phân bố Lợi nhuận gộp cho thấy các quan sát có tính tập trung cao nhưng không đối xứng.
Tập trung Quy mô: Phần lớn các giá trị lợi nhuận gộp tập trung trong khoảng 8.000 Tỷ đến 10.000 Tỷ VNĐ, với Trung vị là 8.683 Tỷ VNĐ. Điều này phản ánh mức lợi nhuận gộp phổ biến và đại diện của mẫu.
Lệch Phải: Phân phối có hiện tượng lệch phải rõ rệt do có một đuôi dài về phía các giá trị cao. Hiện tượng này là hệ quả trực tiếp của các ngoại lai tiềm năng (Z-score \(> 2\)) – những doanh nghiệp/năm đạt được lợi nhuận gộp cực kỳ cao, kéo độ lệch của mẫu.
Kết luận: Mặc dù quy mô Lợi nhuận gộp có tính ổn định cao (tập trung quanh mức Trung vị), sự hiện diện của các trường hợp sinh lời đột biến đã làm phân phối trở nên không đồng đều..
model_base <- lm(Lợi_nhuận_gộp_về_bán_hàng_và_cung_cấp_dịch_vụ ~ Doanh_thu_thuần_về_bán_hàng_và_cung_cấp_dịch_vụ, data = bcn)
ggplot(bcn, aes(x=Doanh_thu_thuần_về_bán_hàng_và_cung_cấp_dịch_vụ, y=Lợi_nhuận_gộp_về_bán_hàng_và_cung_cấp_dịch_vụ)) +
geom_point(color = "#0072B2", size = 3) + # Layer 2
geom_smooth(method = "lm", color = "red", fill = "pink") + # Layer 3: Đường và vùng tin cậy hồi quy
labs(title = "Hồi quy Tuyến tính: Lợi nhuận Gộp và Doanh thu thuần", x = "Doanh thu thuần", y = "Lợi nhuận gộp") + # Layer 4
scale_x_continuous(labels = comma) + # Layer 5
theme_bw() # Layer 6## `geom_smooth()` using formula = 'y ~ x'
Phân tích hồi quy khẳng định mối quan hệ tuyến tính, dương và mạnh giữa Lợi nhuận gộp và Doanh thu thuần.
Tương quan mạnh: Đường hồi quy có độ dốc dương, xác nhận Doanh thu thuần là biến độc lập rất tốt để giải thích sự biến động của Lợi nhuận gộp (khớp với Hiệp phương sai dương lớn).
Độ tin cậy: Mô hình có độ phù hợp cao (các điểm gần đường hồi quy, khoảng tin cậy hẹp), tuy nhiên, sự hiện diện của ngoại lệ (Outlier) có thể làm giảm một chút hiệu suất dự đoán tổng thể.
Kết luận: Mối quan hệ giữa hai yếu tố là mạnh mẽ và ổn định, chứng minh tính ổn định trong cấu trúc chi phí hoạt động của doanh nghiệp..
ggplot(bcn, aes(x = Tỷ_trọng_nợ, y = Tỷ_suất_lợi_nhuận_gộp)) +
geom_point(aes(color = Giai_đoạn), size = 3) + # Layer 2
geom_smooth(method = "lm", se = FALSE, color = "grey", linetype = "dashed") + # Layer 3
scale_color_manual(values = c("Trước_2020" = "#56B4E9", "Sau_2020" = "#D55E00")) + # Layer 4
labs(title = " Tương quan Tỷ trọng Nợ và Tỷ suất Lợi nhuận Gộp", x = "Tỷ trọng Nợ", y = "Tỷ suất Lợi nhuận Gộp") + # Layer 5
theme_classic() # Layer 6## `geom_smooth()` using formula = 'y ~ x'
Phân tích hồi quy cho thấy mối quan hệ tổng thể giữa Tỷ trọng Nợ và Tỷ suất Lợi nhuận gộp là âm yếu (\(\mathbf{r} \approx -0.310\)), chứng tỏ đòn bẩy vốn không phải là yếu tố giải thích chính cho khả năng sinh lời gộp.
Tuy nhiên, sự dịch chuyển hiệu suất theo giai đoạn là rất rõ ràng. Giai đoạn Sau 2020 cho thấy các quan sát tập trung ở vùng có Tỷ suất Lợi nhuận gộp cao hơn (0.285 - 0.31) đi kèm với Tỷ trọng Nợ thấp hơn/ổn định hơn (0.225 - 0.29), so với giai đoạn Trước 2020. Điều này ngụ ý rằng doanh nghiệp đã quản lý tài chính hiệu quả hơn sau năm 2020, đạt được lợi nhuận cao hơn với rủi ro đòn bẩy thấp hơn.
ggplot(bcn, aes(x = Tỷ_suất_lợi_nhuận_gộp)) +
geom_histogram(aes(y = ..density..), binwidth = 0.05, fill = "#009E73", color = "white") + # Layer 2
geom_density(color = "black", size = 1) + # Layer 3
geom_vline(aes(xintercept = mean(Tỷ_suất_lợi_nhuận_gộp)), color = "red", linetype = "solid") + # Layer 4: Trung bình
labs(title = " Phân phối Tỷ suất Lợi nhuận Gộp", x = "Tỷ suất Lợi nhuận Gộp") + # Layer 5
theme_classic() # Layer 6## Warning: The dot-dot notation (`..density..`) was deprecated in ggplot2 3.4.0.
## ℹ Please use `after_stat(density)` instead.
## This warning is displayed once every 8 hours.
## Call `lifecycle::last_lifecycle_warnings()` to see where this warning was
## generated.
Phân tích phân phối Tỷ suất Lợi nhuận gộp (Tỷ suất LN Gộp) cho thấy khả năng sinh lời cốt lõi của doanh nghiệp có tính tập trung cao và tương đối đối xứng, phù hợp với giả định chuẩn.
Khuynh hướng Tập trung: Phần lớn dữ liệu tập trung quanh Giá trị Trung bình (\(\text{Mean}\)) là 0.277 (\(\mathbf{27.7\%}\)). Điều này khẳng định mức sinh lời cốt lõi của doanh nghiệp có xu hướng ổn định và thường xuyên đạt gần mức này.
Hình dạng Phân phối: Đường mật độ gần như đối xứng quanh mức trung bình. Hình dạng này khớp với kết quả từ Kiểm định Shapiro–Wilk (\(\text{p-value} = 0.4994\)), xác nhận rằng phân phối Tỷ suất Lợi nhuận gộp gần với Phân phối Chuẩn (Normal Distribution).
Kết luận: Sự phân bố gần chuẩn cho thấy sự ổn định và tính dự đoán cao trong khả năng sinh lời gộp của doanh nghiệp.
ggplot(bcn, aes(x = "", y = Tỷ_lệ_thanh_toán_hiện_hành)) +
geom_boxplot(fill = "#56B4E9", width = 0.5) + # Layer 2
geom_hline(yintercept = 1, linetype = "dashed", color = "red") + # Layer 3: Ngưỡng chuẩn (tốt nhất là >1)
geom_point(aes(color = Giai_đoạn), position = position_jitter(width = 0.2), alpha = 0.7) + # Layer 4
labs(title = " Phân bố Tỷ lệ Thanh toán Hiện hành", x = "", y = "Tỷ lệ") + # Layer 5
coord_flip() + # Layer 6: Xoay biểu đồ
theme_bw() # Layer 7Phân tích Boxplot Tỷ lệ Thanh toán Hiện hành cho thấy tính thanh khoản ngắn hạn của doanh nghiệp là rất tốt nhưng có độ biến động cao.
Khuynh hướng Tập trung và Tính An toàn:
Tính thanh khoản mạnh: Giá trị tiêu biểu của \(\text{Tỷ lệ Thanh toán Hiện hành}\) nằm ở mức Trung vị là 2.752 lần và Trung bình là 2.719 lần. Mức này cao hơn đáng kể so với ngưỡng an toàn (\(\ge 1.0\)).
An toàn tuyệt đối: Tất cả các quan sát đều nằm trên ngưỡng an toàn 1.0, khẳng định tính thanh khoản ngắn hạn là an toàn trong suốt thời kỳ quan sát.
Độ Biến động và Ngoại lai:
Phân tán lớn: \(\text{Tỷ lệ Thanh toán Hiện hành}\) có độ phân tán tương đối lớn (\(\text{IQR} \approx 0.931\)) và \(\text{sd}\) lớn nhất (\(3.168\)) trong các tỷ số tài chính, xác nhận đây là chỉ tiêu biến động mạnh nhất của doanh nghiệp.
Ngoại lai: Biểu đồ phát hiện nhiều điểm ngoại lai ở cả hai đầu (giá trị cực cao và cực thấp), cho thấy sự khác biệt lớn về tính thanh khoản giữa các năm/quan sát.
Kết luận: Doanh nghiệp duy trì khả năng thanh toán ngắn hạn mạnh mẽ và an toàn. Tuy nhiên, sự biến động mạnh của tỷ lệ này yêu cầu quản lý chặt chẽ đối với các thành phần tài sản ngắn hạn..
ggplot(bcn, aes(x = Tài_sản_ngắn_hạn, y = Tài_sản_dài_hạn)) +
geom_point(aes(color = Giai_đoạn), size = 3) + # Layer 2
geom_smooth(method = "lm", se = TRUE, color = "black") + # Layer 3
scale_color_brewer(palette = "Dark2") + # Layer 4
labs(title = " Mối quan hệ Tài sản ngắn hạn và Tài sản dài hạn", x = "Tài sản ngắn hạn", y = "Tài sản dài hạn") + # Layer 5
scale_x_continuous(labels = comma) + # Layer 6
theme_minimal() # Layer 7## `geom_smooth()` using formula = 'y ~ x'
Phân tích biểu đồ tán xạ cho thấy mối quan hệ giữa TSNH và TSDH là âm yếu, ngụ ý có hiệu ứng thay thế trong cấu trúc tài sản.
Xu hướng: Đường hồi quy có độ dốc âm (khi TSNH tăng, TSDH có xu hướng giảm).
Dịch chuyển Chiến lược: Giai đoạn Sau 2020 chứng kiến sự ưu tiên rõ rệt cho việc mở rộng Tài sản ngắn hạn so với Tài sản dài hạn.
# Cần chạy lại Mô hình Hồi quy Tuyến tính
model_base <- lm(Lợi_nhuận_gộp_về_bán_hàng_và_cung_cấp_dịch_vụ ~ Doanh_thu_thuần_về_bán_hàng_và_cung_cấp_dịch_vụ, data = bcn)
# Trích xuất các giá trị cần thiết
bcn$Std_Residuals <- rstandard(model_base)
bcn$Leverage <- hatvalues(model_base)
bcn$Cooks_Distance <- cooks.distance(model_base) # Dùng cho Layer 5
ggplot(bcn, aes(x = Leverage, y = Std_Residuals)) +
geom_point(aes(size = Cooks_Distance, color = Cooks_Distance), alpha = 0.7) + # Layer 2: Kích thước và màu sắc theo Khoảng cách Cook
geom_hline(yintercept = c(-2, 2), linetype = "dashed", color = "red") + # Layer 3: Ngưỡng Phần dư chuẩn hóa
geom_vline(xintercept = 2 * (1 + 1) / nrow(bcn), linetype = "dashed", color = "blue") + # Layer 4: Ngưỡng Đòn bẩy (2p/n)
scale_color_gradient(low = "green", high = "red") + # Layer 5: Thanh màu cho Khoảng cách Cook
labs(title = "Phân tích Điểm Ảnh hưởng (Influence Point) của Mô hình Hồi quy", x = "Leverage (Đòn bẩy)", y = "Standardized Residuals (Phần dư Chuẩn hóa)") + # Layer 6
theme_bw() + # Layer 7
guides(size = "none") # Layer 8Điểm Ngoại lai (Outlier) - Phía trên bên trái
Vị trí: Phần dư chuẩn hóa (\(\text{Y}\)) \(\mathbf{> 2}\) (ngoài ngưỡng đỏ phía trên). Kích thước lớn, màu cam/đỏ.
Đặc điểm: Đây là quan sát có Lợi nhuận gộp cực kỳ cao so với những gì mô hình dự đoán từ Doanh thu thuần của nó.
Ý nghĩa: Đây là điểm ảnh hưởng lớn nhất trong mô hình (\(\text{Cook's D}\) cao nhất). Việc loại bỏ điểm này có khả năng làm thay đổi đáng kể độ dốc và \(\text{R}^2\) của mô hình, vì nó đang kéo đường hồi quy lên.
Điểm Đòn bẩy/Ảnh hưởng - Phía dưới bên trái
Vị trí: Phần dư chuẩn hóa (\(\text{Y}\)) \(\approx -2\) (ngoài ngưỡng đỏ phía dưới). Kích thước cũng tương đối lớn, màu cam.
Đặc điểm: Đây là quan sát có Lợi nhuận gộp cực kỳ thấp so với những gì mô hình dự đoán từ Doanh thu thuần của nó.
Ý nghĩa: Điểm này cũng có ảnh hưởng đáng kể đến mô hình. Nó có xu hướng kéo đường hồi quy xuống dưới.
Kết luận Thống kê Mô hình hồi quy giữa Lợi nhuận gộp và Doanh thu thuần bị ảnh hưởng đáng kể bởi ít nhất hai quan sát.
mean_comp_data <- data.frame(
Type = c("Trung bình cộng", "Trung bình bị xén (10%)"),
Value = c(mean(bcn$Tỷ_suất_lợi_nhuận_gộp), mean(bcn$Tỷ_suất_lợi_nhuận_gộp, trim = 0.1))
)
ggplot(mean_comp_data, aes(x = Type, y = Value, fill = Type)) +
geom_col() + # Layer 2
geom_text(aes(label = round(Value, 4)), vjust = -0.5) + # Layer 3
scale_fill_manual(values = c("#D55E00", "#56B4E9")) + # Layer 4
labs(title = " So sánh Trung bình thường và Trung bình bị xén", y = "Tỷ suất Lợi nhuận Gộp") + # Layer 5
theme_bw() # Layer 6Giá trị Tiêu biểu: Trung bình bị Xén (\(28.02\%\)) cao hơn Trung bình Cộng (\(27.74\%\)). Giá trị này (\(28.02\%\)) đại diện tốt nhất cho khả năng sinh lời gộp tiêu biểu của doanh nghiệp.
Mức độ Ảnh hưởng Ngoại lai: Sự khác biệt giữa hai giá trị là rất nhỏ (\(0.0028\)).
Kết luận: Mặc dù việc Trung bình bị Xén cao hơn ngụ ý sự tồn tại của một số ngoại lai thấp kéo Trung bình Cộng xuống, nhưng sự khác biệt nhỏ này xác nhận rằng phân phối của Tỷ suất LN Gộp là tương đối đối xứng. Điều này chứng tỏ Trung bình Cộng vẫn là một thước đo khuynh hướng tập trung mạnh mẽ (reliable), và khả năng sinh lời cốt lõi không bị ảnh hưởng nghiêm trọng bởi các giá trị cực đoan.
cv_value <- sd(bcn$Doanh_thu_thuần_về_bán_hàng_và_cung_cấp_dịch_vụ) / mean(bcn$Doanh_thu_thuần_về_bán_hàng_và_cung_cấp_dịch_vụ)
cv_data <- data.frame(Metric = "Doanh thu thuần", CV = cv_value)
ggplot(cv_data, aes(x = Metric, y = CV)) +
geom_col(fill = "#0072B2") + # Layer 2
geom_text(aes(label = paste0(round(CV * 100, 2), "%")), vjust = -0.5, size = 5, color = "red") + # Layer 3
geom_hline(yintercept = 0.25, linetype = "dashed", color = "grey") + # Layer 4: Ngưỡng đánh giá CV
labs(title = "Hệ số Biến thiên (CV) của Doanh thu thuần", y = "CV (Rủi ro tương đối)") + # Layer 5
theme_classic() # Layer 6\(\text{CV}\) đo lường mức độ biến động (rủi ro) của Doanh thu thuần so với quy mô trung bình của chính nó.
Giá trị \(\mathbf{12.44\%}\) là một mức \(\text{CV}\) thấp đến vừa phải, đặc biệt khi so sánh với ngưỡng thông thường (\(25\%\)) được vẽ trên biểu đồ (đường nét đứt màu xám).
Ý nghĩa: Doanh thu thuần có độ ổn định tương đối tốt. Mặc dù có những năm biến động cực đoan (đã thấy trong biểu đồ xu hướng), nhưng so với quy mô trung bình, rủi ro biến động là khá thấp.
# Tính hệ số tương quan cụ thể
cor_data <- data.frame(
Variable = c("Tỷ suất LN Gộp", "Tỷ lệ TT Hiện hành", "Vốn Chủ Sở hữu"),
R_Value = c(
cor(bcn$Tỷ_trọng_nợ, bcn$Tỷ_suất_lợi_nhuận_gộp, use = "complete.obs"),
cor(bcn$Tỷ_trọng_nợ, bcn$Tỷ_lệ_thanh_toán_hiện_hành, use = "complete.obs"),
cor(bcn$Tỷ_trọng_nợ, bcn$Vốn_chủ_sở_hữu, use = "complete.obs")
)
)
ggplot(cor_data, aes(x = Variable, y = R_Value, fill = R_Value > 0)) +
geom_col(width = 0.6) + # Layer 2
geom_hline(yintercept = 0, linetype = "solid", color = "black") + # Layer 3: Đường chuẩn 0
geom_text(aes(label = round(R_Value, 3)), vjust = ifelse(cor_data$R_Value < 0, 1.5, -0.5)) + # Layer 4: Nhãn giá trị
scale_fill_manual(values = c("FALSE" = "#D55E00", "TRUE" = "#0072B2")) + # Layer 5: Phân biệt tương quan âm/dương
labs(title = "Hệ số Tương quan của Tỷ trọng Nợ với các chỉ tiêu", x = "", y = "Hệ số Tương quan (r)") + # Layer 6
theme_minimal() + # Layer 7
guides(fill = "none") # Layer 8Phân tích này làm nổi bật sự đánh đổi rủi ro lớn nhất của việc sử dụng nợ:
Rủi ro Thanh khoản (Nguy cơ lớn): Mối quan hệ âm gần như hoàn hảo (\(\mathbf{r} = -0.973\)) với Tỷ lệ Thanh toán Hiện hành là một cảnh báo mạnh mẽ về rủi ro thanh khoản khi tỷ trọng nợ tăng.
Hiệu quả Tài trợ: Tỷ trọng Nợ chỉ có mối quan hệ rất yếu với Tỷ suất Lợi nhuận gộp, cho thấy việc tăng đòn bẩy không mang lại lợi ích rõ ràng cho biên lợi nhuận cốt lõi.
# 1. Chuẩn hóa (Z-score) ba biến để có cùng thang đo
bcn_scaled_multi <- bcn %>%
mutate(
Z_LN_Gop = as.numeric(scale(Lợi_nhuận_gộp_về_bán_hàng_và_cung_cấp_dịch_vụ)),
Z_Tong_Tai_San = as.numeric(scale(Tổng_tài_sản)),
Z_Tong_No = as.numeric(scale(Tổng_nợ_phải_trả))
)
# 2. Chuyển đổi dữ liệu sang định dạng dài (Long format)
bcn_long_multi <- bcn_scaled_multi %>%
select(Năm_Biến, Giai_đoạn, Z_LN_Gop, Z_Tong_Tai_San, Z_Tong_No) %>%
tidyr::pivot_longer(cols = starts_with("Z_"),
names_to = "Metric",
values_to = "Z_Score")
# Sửa lỗi hiển thị tên biến: Tạo vector nhãn mới
ten_nhan_moi <- c(
"Z_LN_Gop" = "Lợi nhuận gộp",
"Z_Tong_Tai_San" = "Tổng Tài sản",
"Z_Tong_No" = "Tổng Nợ"
)
# 3. Vẽ đồ thị (Layer >= 5)
ggplot(bcn_long_multi, aes(x = Năm_Biến, y = Z_Score, color = Metric, group = Metric)) +
geom_line(size = 1.2) +
geom_point(aes(shape = Giai_đoạn), size = 4) +
geom_hline(yintercept = 0, linetype = "dashed", color = "grey50") +
# Layer mới: Sửa trục X để hiển thị nhãn năm chính xác
scale_x_continuous(breaks = min(bcn$Năm_Biến, na.rm = TRUE):max(bcn$Năm_Biến, na.rm = TRUE)) +
# Layer 5: Đổi màu và đổi tên hiển thị trong chú giải
scale_color_manual(values = c("Z_LN_Gop" = "#D55E00", "Z_Tong_Tai_San" = "#0072B2", "Z_Tong_No" = "#009E73"),
labels = ten_nhan_moi) +
labs(title = "Biến động Chuẩn hóa của Lợi nhuận, Tài sản, và Nợ qua thời gian",
x = "Năm",
y = "Z-score (Độ lệch chuẩn so với Trung bình)",
color = "Chỉ tiêu") +
theme_minimal() +
scale_y_continuous(limits = c(-3, 3))Biểu đồ Z-score cho thấy sự đồng bộ và các điểm hiệu suất cực đoan trong biến động tài chính:
Đồng bộ Quy mô (Tài sản & Nợ): Đường Tổng Tài sản và Tổng Nợ biến động rất chặt chẽ và song song, khẳng định Nợ là nguồn tài trợ chính, ổn định cho việc mở rộng quy mô Tài sản (\(\mathbf{r} \approx 0.745\)).
Biến động Lợi nhuận: Lợi nhuận gộp có tính biến động cao nhất và chứa các điểm hiệu suất cực đoan. Năm 2022 là một ngoại lai về hiệu suất sinh lời, với \(\mathbf{\text{Z-score} \approx 2.0}\), cao hơn 2 độ lệch chuẩn so với mức trung bình của chính nó.
Kết luận: Mối quan hệ giữa Tài sản và Nợ ổn định, nhưng hiệu quả hoạt động (Lợi nhuận gộp) nhạy cảm và dễ bị ảnh hưởng bởi các sự kiện đột biến, dẫn đến sự tăng trưởng bùng nổ về quy mô và hiệu suất sau năm 2020.