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

1 GIỚI THIỆU VỀ DỮ LIỆU

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.

2 PHẦN 1: THÔNG TIN CƠ BẢN VỀ BỘ DỮ LIỆU

2.1 Đọc 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

2.2 Số biến, số quan sát

#Kiểm tra kích thước của bộ dữ liệu
dim(df)
## [1] 200000     12

Bộ dữ liệu có 12 biến và 200000 quan sát.

2.3 Ý nghĩa các biến

# 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.

2.4 Kiểu dữ liệu các biến

# 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)")
)
Bảng Tóm Tắt Loại Dữ liệu
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).

2.5 Thống kê mô tả các biến định lượng

# Tóm tắt biến Index 
summary(df$Index)
##    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ê

# Tóm tắt biến Claim Amount
summary(df$`Claim Amount`)
##    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.

# Tóm tắt biến Category Premium
summary(df$`Category Premium`)
##    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).

# Tóm tắt biến BMI 
summary(df$BMI)
##    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.

2.6 Thống kê mô tả các biến định tính

Các biến Customer Name, Customer Address và Company Name không mang ý nghĩa thống kê

# Số lần xuất hiện của các giá trị trong biến Claim Reason
table(df$'Claim Reason')
## 
## 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.

# Số lần xuất hiện của các giá trị trong biến Data confidentiality
table(df$`Data confidentiality`)
## 
##     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.

# Số lần xuất hiện của các giá trị trong biến Claim Request output
table(df$`Claim Request output`)
## 
##     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).

# Số lần xuất hiện của các giá trị trong biến Churn 
table(df$Churn)
## 
##     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.

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

# Kiểm tra dữ liệu bị thiếu 
colSums(is.na(df))
##                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

2.8 Kiểm tra trùng lặp

# kiểm tra các hàng trùng lặp 
sum(duplicated(df))
## [1] 0

Bộ dữ liệu không có hàng nào giống nhau hoàn toàn

3 PHẦN 2: XỬ LÝ VÀ MÃ HÓA

# Tải lại các thư viện cần thiết
library(dplyr)
## 
## 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 

3.1 Tách các Bang/tiểu Bang trong Customer Address

# 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_1

Tạo ra cột State mới chứa mã bang/tiểu bang của khách hàng.

3.2 Xóa cột Index và Address để làm sạch

# 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_2

Giảm số lượng biến, làm sạch dữ liệu

3.3 Chuẩn hóa tên các công ty

# 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.

3.4 Đổi tên cột

# Đổ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_4

Tă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.

3.5 Chuyển kiểu dữ liệu đảm bảo biến Claim Amount là số nguyên

# 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).

3.6 Mã hóa nhị phân ở Churn

# 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_6

Chuyể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).

3.7 Mã hóa thứ bậc cho Data Confidentiality

# 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_7

Mã 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.

3.8 Tạo cột tỷ lệ Claim_Amount/Category_Premium

# Tạo cột mới Claim_Premium_Ratio bằng cách chia giá trị bồi thường (Claim_Amount) cho mức phí bảo hiểm (Category_Premium).
data_step_8 <- data_step_7 %>%
  mutate(Claim_Premium_Ratio = Claim_Amount / Category_Premium)
data_step_8

Tạo một biến đặc trưng mới quan trọng, thể hiện mức độ rủi ro mà công ty bảo hiểm phải chi trả so với khoản thu từ khách hàng đó.

3.9 Phân nhóm cho BMI

# 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
print(data_step_9 %>% count(BMI_Status))
## # 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.

3.10 Mã hóa cho các giá trị của Claim Reason

# 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_10

Thao 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.

4 PHẦN 3: CÁC THỐNG KÊ CƠ BẢN, PHÂN TÍCH VÀ TRỰC QUAN HÓA DỮ LIỆU

library(dplyr)    
library(ggplot2)  
library(tidyr)    
library(corrplot) 
## corrplot 0.95 loaded
library(scales)
## 
## Attaching package: 'scales'
## The following object is masked from 'package:readr':
## 
##     col_factor
dff <- data_step_10
dff 

4.1 Thống kê tỷ lệ khách hàng rời bỏ (Churn Rate)

4.1.1 Tỷ lệ Churn

# 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_rate

Cung 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.

4.1.2 Phân bố biến mục tiêu Churn (Bar Plot)

# 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ên

Biể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ả.

4.2 Phân bố Chỉ số Khối Cơ thể (BMI) (Histogram)

4.2.1 Bảng tần số BMI

# 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_freq

Bả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.

4.2.2 Biểu đồ Histogram cho BMI

# 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ển

Phâ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.

4.3 So sánh Lượng Bồi thường theo Trạng thái Rời bỏ (Box Plot)

# 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ắng

Biể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.

4.4 Tỷ lệ Churn theo Mức độ Bảo mật Dữ liệu (Bar Plot Tỷ lệ)

4.4.1 Bảng tỷ lệ

# 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")
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”.

4.4.2 Biểu đồ Cột tỷ lệ khách hàng rời bỏ

# 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.

4.5 Phân bố Phí Bảo hiểm (Category Premium) (Density Plot)

# Biểu đồ mật độ (Density Plot) cho Category Premium
ggplot(dff, aes(x = Category_Premium)) +
geom_density(fill = "#984EA3", alpha = 0.7) + # Layer 1: Biểu đồ mật độ
labs(title = "Phân Bố Mức Phí Bảo Hiểm (Category Premium)",
x = "Mức Phí Bảo hiểm",
y = "Mật độ") + # Layer 2: Tiêu đề và nhãn
geom_rug(alpha = 0.5) + # Layer 3: Dấu gạch (rug plot) trên trục x
geom_vline(aes(xintercept = median(Category_Premium)), color = "darkgreen", linetype = "solid", linewidth = 1) + # Layer 4: Đường trung vị
theme_light() # Layer 5: Chủ đề sáng

Biểu đồ mật độ (Density Plot) này cho thấy sự phân bố đa mô hình của Mức Phí Bảo Hiểm, với ba đỉnh rõ rệt, ngụ ý dữ liệu thuộc về ba nhóm khác nhau. Đỉnh thứ ba, gần mức phí 15,000, có mật độ cực kỳ cao, chỉ ra rằng phần lớn các trường hợp có mức phí tập trung ở mức tối đa này. Đường Trung Vị (Median) màu xanh đậm nằm sát đỉnh cao nhất (khoảng 14,000-15,000), xác nhận rằng hơn 50% mức phí bảo hiểm có giá trị cao. Phân bố này bị lệch trái nghiêm trọng, nhấn mạnh sự cần thiết phải điều tra nguyên nhân khiến một lượng lớn phí bảo hiểm tập trung tại giá trị cao nhất.

4.6 Tỷ lệ khách hàng rời bỏ theo Kết quả Yêu cầu Bồi thường (Bar Plot So sánh)

4.6.1 Bảng Dữ Liệu

# 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.

4.6.2 Biểu đồ

# 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ắng

Việ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.

4.7 Số tiền Yêu cầu Bồi thường trung bình theo Lý do Bồi thường (Grouped Bar Plot)

4.7.1 Tính toán bồi thường trung bình cho từng lý do

# 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_fixed

Cá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.

4.7.2 Trực quan hóa

  # 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 x

Cá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ế.

4.8 Phân tích Tương quan giữa các biến số (Correlation Plot)

4.8.1 Chọn các biến số và tính ma trận tương quan

# 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).

4.8.2 Trực quan hóa

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).

4.9 Phân bố Claim_Premium_Ratio (Line/Density Plot)

4.9.1 Lập Bảng Tần Suất

# Tính toán các điểm cắt (breaks)
bin_width <- 0.005
min_val <- 0
max_val <- 0.5
breaks <- seq(min_val, max_val, by = bin_width)

# Tạo bảng tần suất (chỉ xem xét dữ liệu trong phạm vi 0 đến 0.5)
# Sử dụng dplyr::count để tạo bảng tần suất rõ ràng hơn
library(dplyr)
# Lọc dữ liệu trong phạm vi (0, 0.5]
dff_filtered <- dff %>%
  filter(Claim_Premium_Ratio > 0 & Claim_Premium_Ratio <= 0.5)

# Phân loại vào các bins và đếm
frequency_table <- dff_filtered %>%
  mutate(Bin = cut(Claim_Premium_Ratio,
                   breaks = breaks,
                   include.lowest = TRUE,
                   right = TRUE,
                   labels = FALSE)) %>%
  # Tính toán giá trị trung tâm (center) của mỗi bin cho dễ hình dung
  mutate(Bin_Center = breaks[Bin] + bin_width / 2) %>%
  # Đếm tần suất
  count(Bin, Bin_Center, name = "Frequency") %>%
  # Chọn các cột cần thiết và đổi tên cột Bin_Center cho dễ hiểu
  select(Bin_Center, Frequency) %>%
  rename(`Claim/Premium Ratio Center` = Bin_Center, `Tần Suất` = Frequency)

# Hiển thị 10 dòng đầu của bảng tần suất
head(frequency_table, 10)

Phân bố Tương đối Đồng đều: Ngoại trừ khoảng giá trị thấp nhất (0.0025) có tần suất thấp hơn đáng kể (297), các khoảng giá trị còn lại (từ 0.0075 đến 0.0475) đều có tần suất tương đối đồng đều và cao hơn, dao động khoảng \(600-640\).

Khoảng giá trị phổ biến: Giá trị trung tâm khoảng phổ biến nhất trong 10 dòng đầu là 0.0075 với tần suất là 638.

Tập trung ở giá trị thấp: Tất cả các giá trị trung tâm khoảng đều rất nhỏ (tối đa chỉ 0.0475, tức 4.75%), cho thấy Tỷ lệ Bồi thường trên Phí bảo hiểm của hầu hết khách hàng là rất thấp. Điều này có thể do phần lớn khách hàng không yêu cầu bồi thường hoặc chỉ yêu cầu bồi thường với số tiền nhỏ so với phí bảo hiểm họ đã đóng.

4.9.2 Trực quan hóa biểu đồ tần suất Claim_Premium_Ratio

ggplot(dff, aes(x = Claim_Premium_Ratio)) +
  geom_freqpoly(binwidth = 0.005, color = "#FF7F00", linewidth = 1.2) + # Layer 1: Đồ thị tần suất đường
  labs(title = "Phân Bố Tỷ Lệ Bồi Thường/Phí Bảo Hiểm",
       x = "Tỷ lệ Claim/Premium",
       y = "Số lượng") + # Layer 2: Tiêu đề và nhãn
  geom_density(aes(y = after_stat(count) * 0.005), alpha = 0.2, fill = "#FF7F00") + # Layer 3: Biểu đồ mật độ với scaling
  geom_vline(aes(xintercept = median(Claim_Premium_Ratio)), color = "blue", linetype = "dashed") + # Layer 4: Đường trung vị
  theme_minimal() + # Layer 5: Chủ đề tối giản
  xlim(0, 0.5) # Giới hạn trục X để dễ quan sát hơn
## Warning: Removed 2 rows containing missing values or values outside the scale range
## (`geom_path()`).

Phân bố cho thấy rằng: Đa số (phần lớn) khách hàng yêu cầu bồi thường với số tiền chỉ bằng khoảng 10% mức phí bảo hiểm họ đã đóng. Điều này là một chỉ dấu tích cực về rủi ro tổng thể của danh mục bảo hiểm.

4.10 Tỷ lệ khách hàng rời bỏ theo phân nhóm BMI

4.10.1 Tỷ lệ Churn theo BMI

# 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.

4.10.2 Biểu đồ

# 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

4.11 Phân bố Phí Bảo hiểm theo Trạng thái khách hàng rời bỏ (Violin Plot)

# 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ản

Mứ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.

4.12 Phân bố số tiền khách hàng yêu cầu bồi thường theo lý do yêu cầu

4.12.1 Chuyển đổi dữ liệu và xử lý lỗi kiểu dữ liệ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.

4.12.2 Trực quan hóa Biểu đồ Hộp (Box Plot)

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ải

Y 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.

4.13 Tổng hợp Churn theo Lý do Claim (Ordered Bar Plot)

4.13.1 TỶ LỆ KHÁCH HÀNG RỜI BỎ THEO KHÁCH HÀNG YÊU CẦU BỒI THƯỜNG

# 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
# In bảng tính toán
print(churn_rate_by_reason_fixed)
## # 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.

4.13.2 Trực quan hóa Biểu đồ Cột

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.

4.14 Phân bố Địa lý của Khách hàng (Top 10 State)

# 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.

4.15 Tương tác đa chiều 4 biến (Small Multiples Scatter Plot)

# 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ụ.

4.16 So sánh Claim_Premium_Ratio theo Trạng thái Churn (Grouped Density Plot)

# Biểu đồ Mật độ cho Claim_Premium_Ratio theo Churn
ggplot(dff, aes(x = Claim_Premium_Ratio, fill = Churn)) +
  geom_density(alpha = 0.6) + # Layer 1: Biểu đồ mật độ (alpha để thấy sự chồng lấp)
  labs(title = "Phân Bố Tỷ lệ Claim/Premium theo Trạng thái Churn",
       x = "Tỷ lệ Claim/Premium",
       y = "Mật độ") + # Layer 2: Tiêu đề và nhãn
  scale_fill_manual(values = c("Yes" = "#E41A1C", "No" = "#377EB8")) + # Layer 3: Đổi màu
  geom_vline(data = dff %>% group_by(Churn) %>% summarise(mean_ratio = mean(Claim_Premium_Ratio)),
             aes(xintercept = mean_ratio, color = Churn), linetype = "dashed") + # Layer 4: Đường trung bình cho mỗi nhóm
  theme_classic() + # Layer 5: Chủ đề cổ điển
  xlim(0, 0.4) # Giới hạn trục X

Phân tích biểu đồ tỷ lệ Claim/Premium cho thấy cả hai đường mật độ của nhóm khách hàng còn ở lại (No Churn, màu xanh) và nhóm đã rời đi (Yes Churn, màu đỏ) có hình dạng gần như giống hệt nhau và trùng lặp hoàn toàn. Trục X cho thấy tỷ lệ này tập trung mạnh ở các giá trị rất thấp, từ 0 đến 0.4, nghĩa là phần lớn khách hàng nhận số tiền bồi thường rất nhỏ so với phí bảo hiểm đã đóng. Sự trùng lặp gần như hoàn hảo giữa hai nhóm cũng đồng nghĩa với việc đường trung bình (mean_ratio) của cả hai nhóm nằm gần như cùng một vị trí.

Kết quả này cho thấy Claim/Premium không phải là yếu tố dự báo Churn, tức việc khách hàng nhận được nhiều hay ít tiền bồi thường so với phí bảo hiểm không quyết định họ có rời bỏ dịch vụ hay không. Thay vào đó, kết quả củng cố phân tích trước đó rằng nguyên nhân chính liên quan đến trải nghiệm tồi tệ trong quá trình xử lý yêu cầu bồi thường, bất kể giá trị tài chính cuối cùng (Claim/Premium) như thế nào.

4.17 Sự thay đổi Median Premium (Slope Chart)

# Biểu đồ Dạng Dốc (Slope Chart)
slope_data <- dff %>%
  group_by(BMI_Status, Churn) %>%
  summarise(Median_Premium = median(Category_Premium), .groups = 'drop')

ggplot(slope_data, aes(x = BMI_Status, y = Median_Premium, group = Churn, color = Churn)) +
  geom_line(linewidth = 1.5) + # Layer 1: Đường nối
  geom_point(size = 4) + # Layer 2: Điểm
  labs(title = "Sự thay đổi Premium Trung vị theo BMI Status và Churn",
       x = "Tình trạng BMI", y = "Trung vị Phí Bảo hiểm (Category Premium)") + # Layer 3: Tiêu đề và nhãn
  scale_color_manual(values = c("Yes" = "#E41A1C", "No" = "#377EB8")) + # Layer 4: Đổi màu theo Churn
  theme_bw() + # Layer 5: Chủ đề đen trắng
  theme(axis.text.x = element_text(angle = 45, hjust = 1))

Phân tích biểu đồ trung vị Phí Bảo hiểm theo nhóm BMI và trạng thái Churn cho thấy các giá trị trên trục Y nằm trong khoảng từ 14,389.95 đến 14,390.03, tức là gần như đồng đều cho mọi nhóm BMI và mọi trạng thái Churn. Tất cả các điểm dữ liệu, cả nhóm còn ở lại (No Churn, màu xanh) và nhóm đã rời đi (Yes Churn, màu đỏ), đều nằm sát mức ~14,390, cho thấy Phí Bảo hiểm mà khách hàng phải đóng không phụ thuộc vào tình trạng BMI và không có sự khác biệt về trung vị giữa các nhóm Churn. Các đường nối màu đỏ và xanh gần như nằm ngang, nghĩa là thay đổi tình trạng BMI từ Underweight sang Normal rồi Overweight không làm thay đổi trung vị Phí Bảo hiểm.

Kết quả này cho thấy Phí Bảo hiểm không phải là biến quan trọng trong dự đoán hành vi Churn hay phân biệt khách hàng theo BMI, mà có thể đã được chuẩn hóa hoặc áp dụng mức giá chung, không phản ánh sự khác biệt về rủi ro sức khỏe hay ảnh hưởng đến quyết định rời bỏ dịch vụ.

4.18 Phân bố Claim_Amount theo Bang/Tiểu bang (Top 5 Median)

# 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.

4.19 Phân bố Claim_Premium_Ratio theo BMI Status và Churn (Faceted Density Plot)

library(ggplot2)
library(dplyr)
library(scales) # Đã được load ở phần 3
# Giới hạn trục X (tập trung vào phạm vi 0 - 0.5)
dff_filtered_ratio_bmi <- dff %>% 
  filter(Claim_Premium_Ratio <= 0.5) %>%
  # Đảm bảo thứ tự BMI Status để hiển thị đẹp hơn
  mutate(BMI_Status = factor(BMI_Status, 
                             levels = c("Underweight", "Normal", "Overweight", "Obese")))
# Biểu đồ Mật độ Đa Lưới (Faceted Density Plot)
ggplot(dff_filtered_ratio_bmi, aes(x = Claim_Premium_Ratio, fill = Churn)) +
  # Layer 1: Biểu đồ mật độ, làm mờ (alpha = 0.6)
  geom_density(alpha = 0.6) +
  # Layer 2: Chia đồ thị theo BMI_Status
  facet_wrap(~ BMI_Status, scales = "fixed", ncol = 2) +
  # Layer 3: Gắn nhãn, đặt tên
  labs(title = "Phân Bố Tỷ lệ Claim/Premium theo BMI Status và Trạng thái Churn",
       x = "Tỷ lệ Claim/Premium (Giới hạn < 0.5)",
       y = "Mật độ",
       fill = "Rời bỏ") +
  # Layer 4: Đổi màu theo Churn (Yes/No)
  scale_fill_manual(values = c("Yes" = "#E41A1C", "No" = "#377EB8")) + 
  # Layer 5: Thêm đường trung vị cho mỗi nhóm (optional, nhưng giúp phân tích)
  geom_vline(data = dff_filtered_ratio_bmi %>% 
               group_by(BMI_Status, Churn) %>% 
               summarise(median_ratio = median(Claim_Premium_Ratio), .groups = 'drop'), 
             aes(xintercept = median_ratio, color = Churn), 
             linetype = "dashed", 
             linewidth = 1) +
  # Layer 6: Chủ đề đen trắng
  theme_bw() +
  theme(legend.position = "bottom")

Biểu đồ này tạo ra bốn biểu đồ mật độ riêng biệt (cho mỗi \(\text{BMI Status}\)). Bằng cách so sánh đường mật độ của nhóm “Yes” và “No” trong mỗi ô \(\text{BMI}\):Nếu đường “Yes” trong một nhóm \(\text{BMI}\) (ví dụ: \(\text{Obese}\)) dịch chuyển rõ rệt sang phải (về phía tỷ lệ cao hơn) so với đường “No”, điều đó chỉ ra rằng trong nhóm \(\text{Obese}\), những khách hàng có tỷ lệ \(\text{Claim/Premium}\) cao sẽ rất dễ \(\text{Churn}\).Ngược lại, nếu hai đường mật độ chồng lấp nhau gần như hoàn toàn (như trong nhóm \(\text{Normal}\)), điều đó cho thấy \(\text{Claim/Premium Ratio}\) không phải là yếu tố phân biệt \(\text{Churn}\) mạnh mẽ đối với nhóm khách hàng này.Phân tích này giúp định vị chính xác nhóm khách hàng nào (dựa trên \(\text{BMI Status}\)) có hành vi \(\text{Claim}\) rủi ro nhất (tỷ lệ \(\text{Claim/Premium}\) cao) dẫn đến \(\text{Churn}\).

4.20 Bảng Tứ phân vị (Quantile) của Claim Amount theo Trạng thái Churn

Bảng So sánh Thống kê Tứ phân vị (Quantile) của Claim Amount theo Churn
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}\)\(\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.

4.21 Tỷ lệ khách hàng rời bỏ theo Data Confidentiality

4.21.1 Bảng tỷ lệ khách hàng rời bỏ theo Data_Confidentiality

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_data

4.21.2 Trực quan hóa dữ liệu

ggplot(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àu

Biể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ố.

4.22 Bảng Tóm tắt Claim/Premium Ratio theo Claim Request Output

ratio_summary <- dff %>%
  group_by(Claim_Request_Output) %>%
  summarise(
    Mean_Ratio = mean(Claim_Premium_Ratio),
    Median_Ratio = median(Claim_Premium_Ratio),
    SD_Ratio = sd(Claim_Premium_Ratio),
    Total_Claims = n()
  ) %>%
  mutate(across(where(is.numeric), ~round(.x, 4))) # Làm tròn 4 chữ số thập phân

knitr::kable(ratio_summary, 
             caption = "Bảng Tóm tắt Claim/Premium Ratio theo Kết quả Yêu cầu Bồi thường",
             col.names = c("Claim Output", "Mean Ratio", "Median Ratio", "SD Ratio", "Tổng Số bồi thường"))
Bảng Tóm tắt Claim/Premium Ratio theo Kết quả Yêu cầu Bồi thường
Claim Output Mean Ratio Median Ratio SD Ratio Tổng Số bồi thường
No 0.1285 0.1263 0.0300 192994
Yes 0.0301 0.0301 0.0167 7006

Phân tích Tỷ lệ Rủi ro (Claim/Premium) cho thấy sự khác biệt rõ rệt giữa các yêu cầu bị từ chối và được chấp thuận. Các yêu cầu bị từ chối (No) có Mean Ratio ~12.85%, cao hơn đáng kể so với nhóm được chấp thuận (~3.01%), đồng thời độ biến động cũng lớn hơn, cho thấy các claim rủi ro cao thường bị từ chối và nhóm No bao gồm nhiều trường hợp khác nhau.

Kết quả này chứng tỏ công ty đang kiểm soát rủi ro tài chính hiệu quả, nhưng chính sách từ chối các bồi thường rủi ro cao cũng có thể là nguyên nhân dẫn đến Churn cao, khi khách hàng bất mãn vì các yêu cầu bồi thường lớn của họ bị từ chối.

CHƯƠNG 2: BỘ DỮ LIỆU CHỨNG KHOÁN SAB

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

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.

6 PHẦN 1: THÔNG TIN CƠ BẢN VỀ BỘ DỮ LIỆU

6.1 Đọc dữ liệu Excel

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.

6.2 Gán đối tượng dữ liệu

bc <- bctcabs
bc 
# Gán dữ liệu gốc vào đối tượng bc để thao tác nhanh, tránh thay đổi dữ liệu gốc.

Đả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.

6.3 Kiểm tra cấu trúc dữ liệu

str(bc)
## 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 ...
# Hàm str() hiển thị cấu trúc dataset – kiểu dữ liệu, số dòng và số cột.

Tất cả đều là biến định lượng.

6.4 Xem 10 dòng đầu tiên

head(bc, 10)
# head() hiển thị 10 dòng đầu tiên để kiểm tra dữ liệu thực tế.

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ệ.

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

dim(bc)
## [1] 10 11
# dim() trả về số hàng (quan sát) và cột (biến) trong bộ dữ liệu.

có 10 năm và 11 biến trong bộ dữ liệu

6.6 Liệt kê tên biến

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"
# names() liệt kê toàn bộ tên cột có trong dataset.

Giúp nắm rõ nội dung dữ liệu gồm những chỉ tiêu tài chính nào

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

sapply(bc, class)
##                                        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"
#sapply() áp dụng hàm class() cho từng cột để xem kiểu dữ liệu (numeric, character...).

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.

6.8 Kiểm tra giá trị bị thiếu (NA)

colSums(is.na(bc))
##                                        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
# is.na() phát hiện giá trị trống, colSums() đếm tổng số NA của từng cột.

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.

6.9 Tóm tắt nhanh các biến số

summary(bc$`Tài sản ngắn hạn`)
##      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
# summary() tạo bảng thống kê mô tả nhanh (min, max, mean, median...).

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.

summary(bc$`Tiền và các khoản tương đương tiền`)
##      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
# summary() tạo bảng thống kê mô tả nhanh (min, max, mean, median...).

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.

summary(bc$`Các khoản đầu tư tài chính ngắn hạn`)
##      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
# summary() tạo bảng thống kê mô tả nhanh (min, max, mean, median...).

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.

summary(bc$`Tài sản dài hạn`)
##      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
# summary() tạo bảng thống kê mô tả nhanh (min, max, mean, median...).

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.

summary(bc$`Tổng tài sản`)
##      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
# summary() tạo bảng thống kê mô tả nhanh (min, max, mean, median...).

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.

summary(bc$`Tổng nợ phải trả`)
##      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
# summary() tạo bảng thống kê mô tả nhanh (min, max, mean, median...).

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.

summary(bc$`Vốn chủ sở hữu`)
##      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
# summary() tạo bảng thống kê mô tả nhanh (min, max, mean, median...).

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.

summary(bc$`Doanh thu thuần về bán hàng và cung cấp dịch vụ`)
##      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
# summary() tạo bảng thống kê mô tả nhanh (min, max, mean, median...).

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.

summary(bc$`Lợi nhuận gộp về bán hàng và cung cấp dịch vụ`)
##      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
# summary() tạo bảng thống kê mô tả nhanh (min, max, mean, median...).

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.

summary(bc$`Doanh thu hoạt động tài chính`)
##      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
# summary() tạo bảng thống kê mô tả nhanh (min, max, mean, median...).

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.

6.10 Kiểm tra phạm vi thời gian

range(bc$`Năm/Biến`, na.rm = TRUE)
## [1] 2015 2024
# Giải thích kỹ thuật: range() xác định giá trị nhỏ nhất và lớn nhất của biến năm.

Xác định giai đoạn nghiên cứu (2015–2024), đảm bảo chuỗi thời gian đủ dài và liên tục để phân tích xu hướng tài chính.

7 PHẦN 2: XỬ LÝ VÀ MÃ HÓA

7.1 Đọc lại dữ liệu gốc

# 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.

7.2 Chuẩn hóa tên biến

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:
print(names(bc_1))
##  [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.

7.3 Tạo biến phân nhóm theo giai đoạn tài chính

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).

7.4 Xử lý giá trị bị thiếu (NA)

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.

7.5 Tạo biến tỷ trọng nợ

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

7.6 Tạo biến tỷ suất lợi nhuận gộp

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.

7.7 Tạo biến Tỷ lệ Thanh toán hiện hành

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.

7.8 Lọc bỏ các hàng có toàn NA (nếu có)

bc_6 <- bc_6[rowSums(is.na(bc)) != ncol(bc_6), ]  
bc_6 

Để đả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.

7.9 Chuẩn hóa kiểu dữ liệu (đảm bảo số liệu là numeric)

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.

7.10 Kiểm tra lại dữ liệu sau xử lý

str(bc_6) 
## '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

bcn <- bc_6 
bcn 

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).

8 PHẦN 3: CÁC THỐNG KÊ CƠ BẢN

# Cài đặt thư viện (Chỉ cần chạy một lần)
# Gọi thư viện cần thiết
library(readxl)
library(dplyr)

8.1 Tìm giá trị nhỏ nhất và lớn nhất của Tổng tài sản

# Tìm giá trị nhỏ nhất 
min(bcn$Tổng_tài_sản, na.rm = TRUE)
## [1] 1.919287e+13
# Tìm giá trị lớn nhất 
max(bcn$Tổng_tài_sản, na.rm = TRUE)
## [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.

8.2 Tính Độ lệch chuẩn

sapply(bcn[cols_to_num], sd)
##                                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
# sapply() áp dụng hàm sd() lên từng biến số để tính độ lệch chuẩn cho toàn bộ các cột số.

Độ 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.

8.3 Tính Khoảng Tứ phân vị

sapply(bcn[cols_to_num], IQR)
##                                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
# IQR đo phạm vi giữa Q1 và Q3 (IQR= Q3 - Q1), thể hiện độ phân tán của 50% dữ liệu trung tâm.

Chỉ tiêu quy mô (tỷ \(10^{13}\)\(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.

8.4 Trung bình Tỷ lệ Thanh toán Hiện hành

mean(bcn$Tỷ_lệ_thanh_toán_hiện_hành, na.rm = TRUE)
## [1] 2.481266
# mean() tính giá trị trung bình, na.rm=TRUE loại bỏ giá trị NA.

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).

8.5 Trung vị của Tỷ trọng nợ

median(bcn$Tỷ_trọng_nợ, na.rm = TRUE)
## [1] 0.2744309
# median() tính giá trị nằm giữa phân bố dữ liệu, giúp loại bỏ ảnh hưởng của ngoại lai.

Ý 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).

8.6 Năm giá trị tóm tắt của Vốn chủ sở hữu

fivenum(bcn$Vốn_chủ_sở_hữu)
## [1] 1.243318e+13 1.442049e+13 2.064576e+13 2.443709e+13 2.548516e+13
# fivenum() tạo ra bộ 5 giá trị tóm tắt gồm Min, Q1, Median, Q3, Max cho một biến số.

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.

8.7 Phương sai của Doanh thu thuần

var(bcn$Doanh_thu_thuần, na.rm = TRUE)
## [1] 1.562573e+25
# var() tính phương sai, đo mức độ phân tán của dữ liệu quanh trung bình.

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 đó.

8.8 Tính hệ số biến thiên của Lợi nhuận gộp

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.

8.9 Xác định độ lệch chuẩn chuẩn hóa (Z-score) cho Lợi nhuận gộp

bcn$Zscore_LN_gop <- scale(bcn$Lợi_nhuận_gộp)
head(bcn$Zscore_LN_gop)
##            [,1]
## [1,] -1.2287642
## [2,] -0.5042564
## [3,]  0.1061247
## [4,] -0.6914548
## [5,]  0.8054398
## [6,] -0.2658543
#scale() chuẩn hóa dữ liệu theo công thức Z = (x - mean)/sd, giúp đưa các biến về cùng thang đo.

Các Z-score từ \(-1.23\) đến \(0.81\) nằm trong khoảng \(\pm 2\)\(\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ả.

8.10 Bảng tần suất của biến Giai đoạn

table(bcn$Giai_đoạn)
## 
##   Sau_2020 Trước_2020 
##          5          5
# table() đếm số lượng quan sát thuộc từng nhóm trong biến phân loại.

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.

8.11 Tương quan giữa Tổng tài sản và Tổng nợ phải trả

cor(bcn$Tổng_tài_sản, bcn$Tổng_nợ_phải_trả, use = "complete.obs")
## [1] 0.7445376
# cor() tính hệ số tương quan Pearson giữa hai biến số, bỏ qua giá trị NA.

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.

8.12 Tương quan giữa Tỷ suất lợi nhuận gộp và Tỷ trọng nợ

cor(bcn$Tỷ_suất_lợi_nhuận_gộp, bcn$Tỷ_trọng_nợ, use = "complete.obs")
## [1] -0.3096925
# cor() đo lường mối quan hệ tuyến tính giữa hai biến định lượng.

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\)\(-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.

8.13 Ma trận tương quan giữa các biến số

cor(bcn[cols_to_num], use = "pairwise.complete.obs")
##                                                 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
# cor() áp dụng cho toàn bộ các cột số, trả về ma trận hệ số tương quan giữa các biến.

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.

8.14 Hiệp phương sai giữa Doanh thu thuần và Lợi nhuận gộp

cov(bcn$Doanh_thu_thuần, bcn$Lợi_nhuận_gộp, use = "complete.obs")
## [1] 2.414643e+24
#cov() tính hiệp phương sai – đo sự thay đổi đồng thời của hai biến.

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).

8.15 Độ lệch chuẩn theo từng giai đoạn

aggregate(. ~ Giai_đoạn, data = bcn, FUN = sd)
# aggregate() tính độ lệch chuẩn (sd) cho tất cả các biến theo từng nhóm Giai_đoạ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.

8.16 Tỷ lệ tương đối của Năm_Biến trong từng Giai đoạn

prop.table(table(bcn$Giai_đoạn, bcn$Năm_Biến), 1)
##             
##              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
# prop.table() tính tỷ lệ phần trăm của các quan sát theo từng hàng trong bảng tần suất hai chiều.

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

8.17 Kiểm định t độc lập giữa hai giai đoạn

t.test(Tài_sản_ngắn_hạn ~ Giai_đoạn, data = bcn)
## 
##  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
# t.test() kiểm tra sự khác biệt trung bình giữa hai nhóm độc lập của biến Giai_đoạn.

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}\)).

8.18 Kiểm định Shapiro–Wilk cho Tỷ suất lợi nhuận gộp

shapiro.test(bcn$Tỷ_suất_lợi_nhuận_gộp)
## 
##  Shapiro-Wilk normality test
## 
## data:  bcn$Tỷ_suất_lợi_nhuận_gộp
## W = 0.93506, p-value = 0.4994
# shapiro.test() kiểm tra giả định phân phối chuẩn của biến định lượng.

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.

8.19 Tính Trung bình bị xén

mean(bcn$Tỷ_suất_lợi_nhuận_gộp, trim = 0.1)
## [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.

8.20 Tính Hệ số Biến thiê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.

9 PHẦN 4: TRỰC QUAN HÓA DỮ LIỆU

# Gọi thư viện cần thiết
library(ggplot2)

9.1 Xu hướng 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: Theme

Giai đ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.

9.2 So sánh Tỷ suất LN Gộp theo Giai đoạ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 6

Sự 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.

9.3 Biến động Vốn Chủ Sở hữu

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.

9.4 Phân bố Tài sản ngắn hạn theo Giai đoạ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.

9.5 Tương quan Tài sản và Nợ theo Giai đoạn (Biểu đồ tán xạ)

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ả.

9.6 Boxplot tổng hợp các chỉ tiêu chính

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 6

Phâ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).

  1. Lưu ý về Đòn bẩy: Mặc dù Boxplot cho thấy VCSH là động lực chính của quy mô, kết quả từ Biểu đồ tán xạ (Tài sản - Nợ) trước đó lại chỉ ra Nợ có mối tương quan tuyến tính chặt chẽ với Tài sản trong giai đoạn Sau 2020.

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.

9.7 Phân phối Chuẩn (Q-Q Plot) cho Tỷ suất Lợi nhuận gộp

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.

9.8 Mật độ Tỷ trọng Nợ với Trung vị

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.

9.9 Phân phối Z-score của Lợi nhuận gộp

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 6

Chuẩ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\)\(\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\)).

9.10 Histogram Lợi nhuận Gộp

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 6

Phâ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..

9.11 Tán xạ Hồi quy (Lợi nhuận ~ Doanh thu)

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

9.12 Tán xạ Tỷ trọng Nợ và Lợi nhuận

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.

9.13 Histogram Tỷ suất LN Gộp (kiểm tra phân phối)

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.

9.14 Boxplot Tỷ lệ Thanh toán Hiện hành

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 7

Phâ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..

9.15 Tán xạ Tài sản ngắn hạn vs Dài 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.

9.16 Phân tích Đòn bẩy (Leverage) và Phần dư Chuẩn hóa

# 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.

9.17 Trực quan hóa Trung bình bị xén so với Trung bình cộng

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 6

Giá 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.

9.18 Trực quan hóa Hệ số Biến thiên (CV) của Doanh thu thuần

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.

9.19 Biểu đồ Cột Tương quan (Tỷ trọng Nợ vs. 3 Chỉ tiêu)

# 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 8

Phâ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.

9.20 Biểu đồ tổng hợp đa tuyến (Z-score)

# 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.