Nguyễn Quỳnh Anh
GVHD: ThS. Trần Mạnh Tường
Bộ dữ liệu được sử dụng trong tiểu luận được lấy từ nền tảng Kaggle, một kho dữ liệu trực tuyến phổ biến trong nghiên cứu và các dự án phân tích dữ liệu. Dữ liệu phản ánh thông tin khách hàng trong lĩnh vực bảo hiểm nhân thọ, bao gồm đặc điểm nhân khẩu học, hành vi sử dụng dịch vụ và tình trạng rời bỏ.
Mục tiêu của việc sử dụng bộ dữ liệu này là phân tích và xác định những yếu tố ảnh hưởng đến khả năng rời bỏ của khách hàng, từ đó xây dựng mô hình dự báo có độ chính xác cao. Kết quả phân tích giúp doanh nghiệp nhận diện nhóm khách hàng có nguy cơ rời bỏ và đề xuất các chính sách chăm sóc, duy trì khách hàng hiệu quả hơn.
Nghiên cứu đồng thời thể hiện tính ứng dụng của phân tích dữ liệu trong lĩnh vực 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.
library(readxl)
df <- read_excel("Customer.xlsx")
Ý nghĩa kỹ thuật:
Dòng [1] Tải thư viện cần thiết để đọc dữ liệu từ file Exce.
Dòng [3 ] Đọc dữ liệu file excel và lưu vào df.
Ý nghĩa thống kê:
Chuẩn bị môi trường R, nhập dữ liệu thô vào để chuẩn bị cho quá trình làm sạch và phân tích.
dim(df)
## [1] 200000 12
Ý nghĩa kỹ thuật:
Dòng [1] Kiểm tra kích thước của bộ dữ liệu
Ý nghĩa thống kê:
Bộ dữ liệu có 12 biến và 200000 quan sát.
library(knitr)
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"
),
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"
),
stringsAsFactors = FALSE
)
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 |
Ý nghĩa kỹ thuật:
Dòng [1] Tải thư viện knitr, thường dùng để tạo các báo cáo động, đặc biệt là hàm kable().
Dòng [2] Tạo một data frame tên là variable_meaning với hai cột: Variable (Tên biến tiếng Anh) và Meaning (Ý nghĩa tiếng Việt).
Dòng [31] Đảm bảo các chuỗi ký tự trong cột không tự động được chuyển thành factor khi tạo data frame.
Dòng [33] Sử dụng hàm kable để hiển thị data frame vừa tạo dưới dạng bảng định dạng đẹp.
Ý nghĩa thống kê:
Cung cấp ý nghĩa cho 12 biến.
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")
)
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")
)
| Tên Cột | Loại Dữ liệu trong R |
|---|---|
| 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 |
Ý nghĩa kỹ thuật:
Dòng [1] Tải thư viện tibble là một gói R cung cấp phiên bản hiện đại, thông minh hơn của data.frame truyền thống, giúp in ấn và chọn cột an toàn, dễ đoán hơn.
Dòng [2] Tạo bảng tóm tắt, liệt kê Tên cột và Kiểu dữ liệu trong R.
Dòng [11] Hiển thị bảng tóm tắt kiểu dữ liệu.
Ý nghĩa thống kê:
Có 5 biến định lượng (num) và 7 biến định tính (chr).
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
summary(df$Index)
## Min. 1st Qu. Median Mean 3rd Qu. Max.
## 0 50000 100000 100000 149999 199999
Ý nghĩa kỹ thuật:
Dòng [1] Tóm tắt thống kê mô tả biến Index.
Ý nghĩa thống kê:
Đây là biến số thứ tự, nó không mang ý nghĩa thống kê.
summary(df$`Claim Amount`)
## Min. 1st Qu. Median Mean 3rd Qu. Max.
## 1 245 1390 1120 1844 2299
Ý nghĩa kỹ thuật:
Dòng [1] Tóm tắt thống kê mô tả biến Claim Amount.
Ý nghĩa thống kê:
Phát hiện phân phối lệch trái (Median=1390 lớn hơn Mean=1120) của số tiền bồi thường. Điều này cho thấy phần lớn các ca bồi thường có giá trị cao, nhưng có một số ca bồi thường giá trị rất thấp đã kéo giá trị trung bình chung đi xuống.
summary(df$`Category Premium`)
## Min. 1st Qu. Median Mean 3rd Qu. Max.
## 399 1875 14390 8964 14390 14390
Ý nghĩa kỹ thuật:
Dòng [1] Tóm tắt thống kê mô tả biến Category Premium.
Ý nghĩa thống kê:
Phát hiện phân phối cực kỳ lệch trái Median=14390 lớn hơn nhiều so với Mean=896,hơn một nửa quan sát tập trung tại mức phí tối đa, nửa còn lại có giá trị rất thấp đã kéo giá trị trung bình thấp hơn so với trung vị.
df$'Premium/Amount Ratio' <- as.numeric(df$'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
Ý nghĩa kỹ thuật:
Dòng [1] Chuyển đổi biến từ kiểu character sang kiểu numeric vì R hiểu sai.
Dòng [2] Tóm tắt thống kê mô tả biến Premium/Amount Ratio.
Ý nghĩa thống kê:
Phát hiện phân phối đối xứng Median xấp xỉ Mean quanh mức 0.125, điều này cho thấy dữ liệu được phân bố đồng đều ở hai phía trung tâm.
summary(df$BMI)
## Min. 1st Qu. Median Mean 3rd Qu. Max.
## 18.00 20.00 23.00 23.01 26.00 28.00
Ý nghĩa kỹ thuật:
Dòng [1] Tóm tắt thống kê mô tả biến BMI.
Ý nghĩa thống kê:
Phát hiện phân bố rất đối xứng Median xấp xỉ Mean (23.00) nằm trong ngưỡng “cân nặng bình thường”.
Các biến Customer Name, Customer Address và Company Name không mang ý nghĩa thống kê.
table(df$'Claim Reason')
##
## Medical Other Phone Travel
## 109863 30187 30016 29934
Ý nghĩa kỹ thuật:
Dòng [1] Tạo bảng tần suất cho biến Claim Reason.
Ý nghĩa thống kê:
Xác định Medical(Y tế) là lý do phổ biến nhất.
table(df$`Data confidentiality`)
##
## High Low Medium Very low
## 109863 29934 30016 30187
Ý nghĩa kỹ thuật:
Dòng [1] Tạo bảng tần suất cho biến Data confidentiality.
Ý nghĩa thống kê:
Dữ liệu cho thấy có một sự phân cực rõ rệt: phần lớn tập trung ở có mức độ bảo mật cao(High), trong khi ba mức độ còn lại (Low, Medium, Very low) có số lượng thấp hơn đáng kể so với mức High.
table(df$`Claim Request output`)
##
## No Yes
## 192994 7006
Ý nghĩa kỹ thuật:
Dòng [1] Tạo bảng tần suất cho biến Claim Request output.
Ý nghĩa thống kê:
Phát hiện mất cân bằng nghiêm trọng, từ chối lớn hơn nhiều so với chấp thuận.
Số lượng yêu cầu bị từ chối (No) (129994) 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).
table(df$Churn)
##
## No Yes
## 72728 127272
Ý nghĩa kỹ thuật:
Dòng [1] Tạo bảng tần suất cho biến Churn.
Ý nghĩa thống kê:
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ì (No) (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.
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
Ý nghĩa kỹ thuật:
Dòng [1] Đếm tổng số giá trị bị thiếu của từng cột.
Ý nghĩa thống kê:
Bộ dữ liệu không có giá trị bị thiếu.
sum(duplicated(df))
## [1] 0
Ý nghĩa kỹ thuật:
Dòng [1] Đếm tổng số hàng bị trùng lặp hoàn toàn.
Ý nghĩa thống kê:
Xác nhận bộ dữ liệu sạch (không có hàng trùng lặp).
df %>%
summarise(
số_khách_hàng_duy_nhất = n_distinct(`Customer Name`),
số_công_ty_duy_nhất = n_distinct(`Company Name`)
)
Ý nghĩa kỹ thuật:
Dòng [1] Tải bộ thư viện (bao gồm gói dplyr) để R hiểu các hàm toán tử và summarise.
Dòng [2] Tóm tắt toàn bộ 200.000 dòng df của thành một bảng duy nhất có 1 dòng và 2 cột.
Dòng [3] Đếm số lượng tên khách hàng không trùng lặp.
Dòng [4] Đếm số lượng tên công ty không trùng lặp.
Ý nghĩa thống kê:
Cho thấy có nhiều khách hàng đã khiếu nại nhiều lần và công tý cũng xuất hiện nhiều lần. Tuy nhiên khi kiểm tra hàng trùng lặp là 0 vậy nên khách hàng đó sẽ đại diện cho nhiều khiếu nại khác nhau.
library(dplyr)
library(stringr)
library(readr)
library(tibble)
data_start <- df
data_start
Ý nghĩa kỹ thuật:
Dòng [1] đến dòng [4] tải lại các thư viện.
Dòng[5], [6] Tạo bản sao data_start từ df gốc, xem 10 dòng đầu của bảng.
Ý nghĩa thống kê:
Đảm bảo luôn có thể quay lại dữ liệu gốc (df) nếu các bước xử lý gặp lỗi.
data_step_1 <- data_start %>%
mutate(`State_Zip_Block` = str_extract(`Customer_Address`, pattern = "[A-Z]{2}\\s*\\d{5}")) %>%
mutate(State = str_sub(`State_Zip_Block`, 1, 2)) %>%
mutate(State = ifelse(is.na(State), "Unknown", State)) %>%
select(-State_Zip_Block)
print(data_step_1)
## # A tibble: 200,000 × 13
## Index `Customer Name` Customer_Address `Company Name` `Claim Reason`
## <dbl> <chr> <chr> <chr> <chr>
## 1 0 Christine Payne 7627 Anderson Rest Apt… Williams, Hen… Travel
## 2 1 Tony Fernandez 3953 Cindy Brook Apt. … Moore-Goodwin Medical
## 3 2 Christopher Kim 8693 Walters Mountains… Smith-Holmes Phone
## 4 3 Nicole Allen 56926 Webster Coves,Sh… Harrell-Perez Phone
## 5 4 Linda Cruz 489 Thomas Forges Apt.… Simpson, Kram… Phone
## 6 5 Jennifer Kim USCGC Brown,FPO AE 321… Pace-Nelson Medical
## 7 6 James Nguyen 621 Heath Place,North … Smith LLC Medical
## 8 7 Desiree Ponce 652 Lisa Trafficway,La… Porter Ltd Other
## 9 8 Jordan Johnston 1553 Sherry Forest Apt… Eaton, Maddox… Phone
## 10 9 Michelle Williams 1973 Martin Stravenue … Hughes-Hernan… Medical
## # ℹ 199,990 more rows
## # ℹ 8 more variables: `Data confidentiality` <chr>, `Claim Amount` <dbl>,
## # `Category Premium` <dbl>, `Premium/Amount Ratio` <dbl>,
## # `Claim Request output` <chr>, BMI <dbl>, Churn <chr>, State <chr>
print(data_step_1 %>% count(State, sort = TRUE))
## # A tibble: 54 × 2
## State n
## <chr> <int>
## 1 AE 7189
## 2 AA 7051
## 3 AP 7029
## 4 TX 3633
## 5 ME 3620
## 6 CA 3611
## 7 MO 3596
## 8 NJ 3584
## 9 VT 3581
## 10 WA 3581
## # ℹ 44 more rows
Ý nghĩa kỹ thuật:
Dòng [1] Lấy dữ liệu data_start, thực hiện các yêu cầu rồi lưu kết quả vào data_step_1.
Dòng [2] Tạo cột tạm State_Zip_Block bằng cách trích xuất khối Mã Bang + Mã ZIP từ Customer_Address.
Dòng [3] Tạo cột State mới bằng cách lấy 2 ký tự đầu tiên từ cột State_Zip_Block.
Dòng [4] Kiểm tra cột State, nếu giá trị nào bị NA (không tìm thấy), thì thay bằng chữ “Unknown”.
Dòng [5] Xóa cột tạm State_Zip_Block (vì đã dùng xong).
Dòng [6] In 10 dòng đầu của kết quả data_step_1 để kiểm tra.
Dòng [7] Đếm số lần xuất hiện của mỗi State) và in ra bảng tần suất đã sắp xếp.
Ý nghĩa thống kê:
Tạo ra cột State mới chứa mã bang, tiểu bang của khách hàng.
data_step_2 <- data_step_1 %>%
select(-Index, -Customer_Address)
data_step_2
Ý nghĩa kỹ thuật:
Dòng [1] Thực hiện trên data_step_1 rồi gán kết quả vào data_step_2.
Dòng [2] Xóa cột Index và Customer Address.
Dòng [3] Xem 10 dòng đầu.
Ý nghĩa thống kê:
Giảm số lượng biến, làm sạch dữ liệu
data_step_3 <- data_step_2 %>%
mutate('Company Name' = str_to_title(`Company Name`))
data_step_3
Ý nghĩa kỹ thuật:
Dòng [1] Thực hiện trên data_step_2 rồi gán kết quả vào data_step_3.
Dòng [2] Chuẩn hóa Company Name (viết hoa chữ cái đầu mỗi từ).
Dòng [3] Xem 10 dòng đầu.
Ý nghĩa thống kê:
Đảm bảo tính nhất quán trong dữ liệu định tính.
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
Ý nghĩa kỹ thuật:
Dòng [1] Thực hiện trên data_step_3 rồi gán kết quả vào data_step_4.
Dòng [2] Đổi tên các cột có dấu cách.
Dòng [9] Xem 10 dòng đầu.
Ý nghĩa thống kê:
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.
data_step_5 <- data_step_4 %>%
mutate(Claim_Amount = as.integer(Claim_Amount))
data_step_5
Ý nghĩa kỹ thuật:
Dòng [1] Thực hiện trên data_step_4 rồi gán kết quả vào data_step_5.
Dòng [2] Ép kiểu cột Claim Amount thành số nguyên.
Dòng [3] Xem 10 dòng đầu.
Ý nghĩa thống kê:
Đả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).
data_step_6 <- data_step_5 %>%
mutate(Churn_Encoded = ifelse(Churn == "Yes", 1, 0))
data_step_6
Ý nghĩa kỹ thuật:
Dòng [1] Thực hiện trên data_step_5 rồi gán kết quả vào data_step_6.
Dòng [2] Mã hóa nhị phân biến Churn: Yes=1 , No=0 trên cột mới.
Dòng [3] Xem 10 dòng đầu.
Ý nghĩa thống kê:
Chuyển biến mục tiêu Churn từ định tính sang dạng nhị phân.
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
Ý nghĩa kỹ thuật:
Dòng [1] Thực hiện trên data_step_6 rồi gán kết quả vào data_step_7.
Dòng [2] Mã hóa thứ bậc cho Data Confidentiality (Gán nhãn số 1-5 theo thứ tự từ rất thấp đến rất cao).
Dòng [7] Xem 10 dòng đầu.
Ý nghĩa thống kê:
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.
data_step_9 <- data_step_8 %>%
mutate(BMI_Status = cut(BMI,
breaks = c(0, 18.5, 25, 30, Inf),
labels = c("Underweight", "Normal", "Overweight", "Obese"),
include.lowest = TRUE,
right = FALSE))
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
Ý nghĩa kỹ thuật:
Dòng [1] Thực hiện trên data_step_8 rồi gán kết quả vào data_step_9.
Dòng [2] Phân loại BMI thành 4 nhóm định tính (Underweight, Normal, Overweight, Obese).
Dòng [7] Xem bảng phân loại.
Ý nghĩa thống kê:
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, kết quả cho thấy không có khách hàng bị tình trạng béo phì(Obese).
library(forcats)
data_step_10 <- data_step_9 %>%
mutate(
Reason_Simple = fct_lump_n(Claim_Reason, n = 4, other_level = "Other")
)
data_step_10
Ý nghĩa kỹ thuật:
Dòng [1] Tải gói thư viện forcats vào phiên làm việc hiện tại của R.
Dòng [2] Thực hiện trên data_step_9 rồi gán kết quả vào data_step_10.
Dòng [3] Tạo một cột mới.
Dòng [4] Trên cột mới giữ lại 4 giá trị phổ biến, giữ các giá trị khác vào nhóm Other.
Dòng [6] Xem 10 dòng đầu.
Ý nghĩa thống kê:
Để làm giảm nhiễu và tăng tính ổn định khi trong biến có nhiều nhóm.
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
library(knitr)
library(showtext)
## Loading required package: sysfonts
## Loading required package: showtextdb
showtext_auto()
library(sysfonts)
theme_set(theme_minimal(base_family = "Arial"))
dff <- data_step_10
dff
knitr::opts_chunk$set(
fig.width = 5, # chiều rộng biểu đồ (inch)
fig.height = 4, # chiều cao biểu đồ (inch)
out.width = '60%', # thu nhỏ khi hiển thị trong PDF
dpi = 300 # độ phân giải biểu đồ
)
Ý nghĩa kỹ thuật:
Dòng [1] đến dòng [9] là chuẩn bị lại các thư viện cần thiết.
Dòng [11] Gán bộ dữ liệu data_step_10 vào dff.
Dòng [12] Xem 10 dòng đầu.
Dòng [13] Thiết lập mặc định cho biểu đồ.
Ý nghĩa thống kê:
Dễ dàng quay lại sửa lỗi.
library(dplyr)
churn_rate <- dff %>%
summarise(
Total_Customers = n(),
Churned_Customers = sum(Churn_Encoded),
Churn_Rate = mean(Churn_Encoded) * 100
)
churn_rate
Ý nghĩa kỹ thuật:
Dòng [1] Lấy data frame dff và sử dụng nó làm đầu vào cho hàm tiếp theo (toán tử %>%).
Dòng [2] Thực hiện tính toán tóm tắt trên toàn bộ data frame dff.
Dòng [3] Tạo cột Total_Customers chứa hàm đếm tổng số hàng.
Dòng [4] Tạo cột Churned_Customers bằng cách tính tổng của cột Churn_Encode.
Dòng [5] Tạo cột Churn_Rate bằng cách tính giá trị trung bình của cột Churn_Enco và nhân 100 để chuyển thành phần trăm.
Dòng [7] Xem bảng.
Ý nghĩa thống kê:
Cung cấp tỷ lệ khách hàng rời bỏ bảo hiểm tổng thể 63.6636%, khẳng định công ty đang đối mặt với vấn đề khách hàng rời bỏ nhiều.
ggplot(dff, aes(x = Churn, fill = Churn)) +
geom_bar() +
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") +
scale_fill_manual(values = c("Yes" = "#E41A1C", "No" = "#377EB8")) +
geom_text(stat = 'count', aes(label = after_stat(count)), vjust = -0.5, size = 4) +
theme_minimal() +
expand_limits(y = 130000)
Ý nghĩa kỹ thuật:
Dòng [1] Khởi tạo một đối tượng biểu đồ là dữ liệu nguồn, thiết lập ánh xạ thẩm mỹ, cột Churn được dùng cho trục X và cũng được dùng để quyết định màu tô .
Dòng [2] Chỉ định loại biểu đồ là biểu đồ cột. Hàm này tự động đếm số lần xuất hiện của mỗi giá trị trên trục X.
Dòng [3] Thiết lập các nhãn cho tiêu đề , trục X (x), và trục Y (y).
Dòng [6] Tùy chỉnh (manual) màu tô bằng tay. Gán giá trị “Yes” là màu đỏ và “No” là màu xanh.
Dòng [7] Thêm một lớp văn bản vào biểu đồ. Yêu cầu geom_text tự động thực hiện thống kê đếm. Lấy kết quả đếm (biến count) làm nhãn. Điều chỉnh vị trí của nhãn văn bản lên phía trên cột 0.5 đơn vị.
Dòng [8] Áp dụng một chủ đề có sẵn tên.
Dòng [9] Mở rộng giới hạn của trục Y lên đến 130,000, đảm bảo có đủ khoảng trống cho nhãn văn bản không bị cắt.
Ý nghĩa thống kê:
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ó 127272 khách hàng đã rời bỏ so với 72728 khách hàng còn ở lại, chiếm tỷ lệ rời bỏ khoảng 63,636 % 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ả.
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)
bmi_freq
Ý nghĩa kỹ thuật:
Dòng [2] Tạo một cột mới tên là BMI_group. Hàm cut() được dùng để chia cột BMI thành các khoảng. breaks = seq(…): Tạo ra một chuỗi (sequence) các điểm ngắt (breaks) bắt đầu từ giá trị nhỏ nhất của BMI đến giá trị lớn nhất, với mỗi điểm ngắt cách nhau 1 đơn vị (by = 1).
Dòng [3] Nhóm tất cả các hàng lại dựa trên giá trị của cột BMI_group vừa tạo.
Dòng [4] Đếm số lượng hàng trong mỗi nhóm và lưu kết quả vào cột TanSuat.
Dòng [5] Sắp xếp bảng kết quả theo thứ tự tăng dần của cột BMI_group.
Dòng [6] In bảng kết quả.
Ý nghĩa thống kê:
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.
ggplot(dff, aes(x = BMI)) +
geom_histogram(binwidth = 1, fill = "#4DAF4A", color = "white") +
labs(title = "Phân Bố Chỉ Số Khối Cơ Thể (BMI)",
x = "Chỉ số BMI",
y = "Tần suất") +
geom_vline(aes(xintercept = mean(BMI)), color = "red",
linetype = "dashed", linewidth = 1) +
annotate("text", x = mean(dff$BMI) + 2, y = 30000,
label = paste("Mean =",round(mean(dff$BMI), 2)),
color = "red") + # Layer 4
theme_classic()
Ý nghĩa kỹ thuật:
Dòng [1] Khởi tạo biểu đồ, ánh xạ cột BMI vào trục X.
Dòng [2] Chỉ định loại biểu đồ là histogram (biểu đồ tần suất). binwidth = 1 quy định độ rộng của mỗi cột là 1 đơn vị BMI.
Dòng [3] Đặt tiêu đề và nhãn.
Dòng [6] Thêm một đường thẳng đứng đặt vị trí của đường thẳng tại giá trị trung bình của cột BMI, làm cho nó thành đường gạch nối.
Dòng [7] Thêm một chú thích văn bản cố định lên biểu đồ. Chỉ định tọa độ (vị trí) của văn bản. Tạo nội dung văn bản nối chuỗi “Mean =” với giá trị trung bình của BMI đã được làm tròn.
Dòng [8] Áp dụng chủ đề classic.
Ý nghĩa thống kê:
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.
summary_list <- tapply(dff$Claim_Amount, dff$Churn, summary)
summary_table_base_r <- do.call(rbind, summary_list)
print(summary_table_base_r)
## Min. 1st Qu. Median Mean 3rd Qu. Max.
## No 1 245 1390 1119.940 1844 2299
## Yes 1 246 1389 1120.787 1844 2299
Ý nghĩa kỹ thuật:
Dòng 1 Chia dữ liệu thành các nhóm và tính toán thống kê cho từng nhóm.
Dòng 2 Lấy các kết quả riêng lẻ từ list đó và xếp chúng lại thành một bảng duy nhất, dễ đọc.
Dòng 3 Hiển thị bảng.
Ý nghĩa thống kê:
Với các số xấp xỉ gần bằng nhau cho thấy số lượng khách hàng rời bỏ hay ở lại đều có hành vi yêu cầu bồi thường với số tiền như nhau.
ggplot(dff, aes(x = Churn, y = Claim_Amount, fill = Churn)) +
geom_boxplot() +
labs(title = "Phân Bố Số Tiền Yêu Cầu Bồi Thường Theo Trạng Thái Rời Bỏ",
x = "Khách hàng rời bỏ",
y = "Số tiền Bồi thường") +
coord_flip() + # Layer 3
scale_fill_manual(values = c("Yes" = "#E41A1C", "No" = "#377EB8")) +
theme_bw()
Ý nghĩa kỹ thuật:
Dòng [1] Khởi tạo biểu đồ. Churn được ánh xạ vào trục X, Claim_Amount vào trục Y, và Churn cũng vào màu tô .
Dòng [2] Chỉ định loại biểu đồ là biểu đồ hộp (box plot).
Dòng [3] Đặt tiêu đề và nhãn.
Dòng [6] Hoán đổi trục X và Y. Biểu đồ hộp sẽ nằm ngang thay vì nằm dọc.
Dòng [7] Tùy chỉnh màu tô.
Dòng [8] Áp dụng chủ đề “black and white”.
Ý nghĩa thống kê:
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 khách hàng đã rời bỏ có hành vi đòi bồi thường rất giống với một khách hàng còn ở lại.
churn_by_conf_table <- dff %>%
group_by(Data_Confidentiality) %>%
summarise(
Total_Customers = n(),
Churned_Customers = sum(Churn_Encoded),
Churn_Rate = mean(Churn_Encoded) * 100
) %>%
mutate(
Data_Confidentiality =
factor(Data_Confidentiality,
levels = c(
"Very low", "Low", "Medium", "High", "Very high"))) %>%
arrange(Data_Confidentiality) %>%
mutate(Churn_Rate = round(Churn_Rate, 2))
kable(churn_by_conf_table,
caption = "Bảng tỷ lệ rời bỏ theo mức độ bảo mật dữu 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 |
Ý nghĩa kỹ thuật:
Dòng [2] Nhóm dữ liệu theo các giá trị trong cột Data_Confidentiality.
Dòng [3] Tính toán các chỉ số tóm tắt cho mỗi nhóm bảo mật.
Dòng [8] Chuyển đổi cột Data_Confidentiality từ kiểu văn bản sang kiểu factor.
Dòng [13] Sắp xếp lại bảng kết quả dựa trên thứ tự factor đã định nghĩa ở trên.
Dòng [14] Làm tròn giá trị ở cột Churn_Rate còn 2 chữ số thập phân.
Dòng [15] Sử dụng hàm kable để định dạng bảng và thêm tiêu đề cho bảng.
Ý nghĩa thống kê:
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 về tỷ lệ rời bỏ. 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”.
ggplot(churn_by_conf_table, aes(x = Data_Confidentiality, y = Churn_Rate)) +
geom_col(fill = "#FF7F00") +
geom_text(aes(label = paste0(round(Churn_Rate, 2), "%")),
vjust = -0.5,
size = 4) +
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ỏ (%)"
) +
scale_y_continuous(limits = c(0, max(churn_by_conf_table$Churn_Rate) * 1.1)) +
theme_minimal()
Ý nghĩa kỹ thuật:
Dòng [1] Khởi tạo biểu đồ, sử dụng dữ liệu từ bảng tóm tắt churn_by_conf_table.
Dòng [2] Chỉ định loại biểu đồ là cột. geom_col sử dụng giá trị y để xác định chiều cao cột.
Dòng [3] Thêm nhãn văn bản, tạo nhãn bằng cách lấy giá trị Churn_Rate, làm tròn, và thêm ký tự “%” vào sau.
Dòng [11] Tùy chỉnh trục Y, đặt giới hạn trục Y từ 0 đến 110% giá trị Churn_Rate cao nhất (để có khoảng trống cho nhãn).
Ý nghĩa thống kê:
Kết quả trực quan và thống kê cho thấy mức độ bảo mật dữu 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ề việc khách hàng rời bỏ.
ggplot(dff, aes(x = Category_Premium)) +
geom_density(fill = "#984EA3", alpha = 0.7) +
labs(title = "Phân Bố Mức Phí Bảo Hiểm",
x = "Mức Phí Bảo hiểm",
y = "Mật độ") +
geom_rug(alpha = 0.5) +
geom_vline(aes(xintercept = median(Category_Premium)),
color = "darkgreen", linetype = "solid", linewidth = 1) +
theme_light()
Ý nghĩa kỹ thuật:
Dòng [1] Khởi tạo biểu đồ, ánh xạ Category_Premium vào trục X.
Dòng [2] Chỉ định loại biểu đồ là biểu đồ mật độ alpha = 0.7 làm cho màu tô trong suốt 30%.
Dòng [5] Thêm một lớp các vạch nhỏ dưới chân biểu đồ, hiển thị vị trí của từng điểm dữ liệu.
Dòng [6] Thêm một đường thẳng đứng tại vị trí trung vị của Category_Premium.
Dòng [7] Áp dụng chủ đề light.
Ý nghĩa thống kê:
Biểu đồ mật độ 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í 15000, 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 14000-15000), 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.
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
Ý nghĩa kỹ thuật:
Dòng [2] Nhóm dữ liệu thành hai nhóm (“Yes” và “No”) dựa trên cột Claim_Request_Output.
Dòng [3] Tính toán Churn_Rate (trung bình của Churn_Encoded) cho từng nhóm.
Dòng [4] In kết quả bảng tóm tắt.
Ý nghĩa thống kê:
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.
ggplot(churn_by_claim_output, aes(x = Claim_Request_Output,
y = Churn_Rate, fill = Claim_Request_Output)) +
geom_col() + # Layer 1
labs(title =
"Tỷ lệ khách hàng rời bỏ khi yêu cầu bồi thường được hoặ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
scale_fill_manual(values = c("No" = "#E41A1C", "Yes" = "#4DAF4A")) + # Layer 3
geom_text(aes(label = paste0(round(Churn_Rate, 2), "%")),
vjust = -1.5, size = 6) +
coord_cartesian(ylim = c(0, 75)) +
theme_bw() # Layer 5
Ý nghĩa kỹ thuật:
Dòng [1] Khởi tạo biểu đồ, sử dụng bảng tóm tắt churn_by_claim_output.
Dòng [2] Vẽ biểu đồ cột dựa trên giá trị Churn_Rate.
Dòng [7] Thêm nhãn văn bản. vjust = -1.5 đẩy nhãn lên cao hơn.
Dòng [8] Đặt giới hạn trục Y (từ 0 đến 75).
Ý nghĩa thống kê:
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.
mean_claim_by_reason_fixed <- dff %>%
group_by(Reason_Simple) %>%
summarise(Mean_Claim_Amount = mean(Claim_Amount)) %>%
rename(Claim_Reason_Fixed = Reason_Simple)
mean_claim_by_reason_fixed
Ý nghĩa kỹ thuật:
Dòng [2] Nhóm dữ liệu theo cột Reason_Simple.
Dòng [3] Tính giá trị trung bình của Claim_Amount cho từng nhóm lý do.
Dòng [4] Đổi tên (rename) cột Reason_Simple thành Claim_Reason_Fixed.
Ý nghĩa thống kê:
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.
ggplot(mean_claim_by_reason_fixed, aes(x = Claim_Reason_Fixed,
y = Mean_Claim_Amount, fill = Claim_Reason_Fixed)) +
geom_bar(stat = "identity") +
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") +
scale_fill_brewer(palette = "Set1") +
geom_text(aes(label = round(Mean_Claim_Amount, 0)), vjust = -0.5, size = 4) +
scale_y_continuous(expand = expansion(mult = c(0, 0.1))) +
theme_classic() +
theme(axis.text.x = element_text(angle = 45, hjust = 1))
Ý nghĩa kỹ thuật:
Dòng [1] Khởi tạo biểu đồ, sử dụng bảng tóm tắt mean_claim_by_reason_fixed.
Dòng [2] Vẽ biểu đồ cột, yêu cầu ggplot sử dụng giá trị y (Mean_Claim_Amount) làm chiều cao cột, thay vì tự đếm.
Dòng [6] Sử dụng một bảng màu (palette) có sẵn tên là “Set1” để tô màu các cột.
Dòng [9] Tùy chỉnh các yếu tố của theme.
Ý nghĩa thống kê:
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).
cor_data <- dff %>%
select(Claim_Amount, Category_Premium,
BMI, Claim_Premium_Ratio, Churn_Encoded) %>%
mutate(across(everything(), as.numeric))
M <- cor(cor_data, use = "complete.obs")
correlation_table <- M %>%
as.data.frame() %>%
round(3)
print(correlation_table)
## Claim_Amount Category_Premium BMI Claim_Premium_Ratio
## Claim_Amount 1.000 0.959 0.001 0.160
## Category_Premium 0.959 1.000 0.001 -0.001
## BMI 0.001 0.001 1.000 -0.003
## Claim_Premium_Ratio 0.160 -0.001 -0.003 1.000
## Churn_Encoded 0.001 0.000 -0.836 0.001
## Churn_Encoded
## Claim_Amount 0.001
## Category_Premium 0.000
## BMI -0.836
## Claim_Premium_Ratio 0.001
## Churn_Encoded 1.000
Ý nghĩa kỹ thuật:
Dòng [2] Chọn (select) một tập con, chỉ bao gồm 5 cột được liệt kê.
Dòng [4] Áp dụng hàm as.numeric cho tất cả (everything) các cột đã chọn, ép kiểu chúng thành số (numeric) để đảm bảo hàm cor() hoạt động.
Dòng [5] Tính toán ma trận tương quan cho data frame cor_data và lưu kết quả vào biến M. use = “complete.obs” chỉ thị hàm cor() bỏ qua các hàng có chứa giá trị NA (thiếu) khi tính toán.
Dòng [6] Chuyển đổi ma trận M thành một data.frame và làm tròn các giá trị đến 3 chữ số thập phân.
Dòng [9] In bảng tương quan.
Ý nghĩa thống kê:
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, 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.
corrplot::corrplot(M,
method = "circle", # Layer 1
type = "upper", # Layer 2
order = "hclust", # Layer 3
tl.col = "black", # Layer 4
tl.srt = 45, # Layer 5
diag = FALSE)
Ý nghĩa kỹ thuật:
Dòng [1] Gọi hàm corrplot từ thư viện corrplot (ký hiệu ::) để vẽ ma trận M.
Dòng [2] Chỉ định phương thức hiển thị là hình tròn.
Dòng [3] Chỉ hiển thị nửa trên của ma trận .
Dòng [4] Sắp xếp lại thứ tự các biến dựa trên thuật toán phân cụm thứ bậc, giúp các nhóm biến tương quan cao ở gần nhau.
Dòng [5] Tùy chỉnh màu và góc xoay của nhãn.
Dòng [7] Ẩn (FALSE) các giá trị trên đường chéo chính (luôn bằng 1 ).
Ý nghĩa thống kê:
Mối quan hệ giữa Claim_Amount và Category_Premium là rất mạnh (gần 1), 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.
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.
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.
churn_by_bmi <- dff %>%
group_by(BMI_Status) %>%
summarise(Churn_Rate = mean(Churn_Encoded) * 100)
print(churn_by_bmi)
## # A tibble: 3 × 2
## BMI_Status Churn_Rate
## <fct> <dbl>
## 1 Underweight 100
## 2 Normal 100
## 3 Overweight 0
Ý nghĩa kỹ thuật:
Dòng [2] Nhóm dữ liệu theo cột BMI_Status.
Dòng [3] Tính Churn_Rate cho từng nhóm BMI.
Ý nghĩa thống kê:
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.
ggplot(churn_by_bmi, aes(x = BMI_Status, y = Churn_Rate, fill = BMI_Status)) +
geom_col() + # Layer 1
labs(title = "Tỷ lệ rời bỏ theo tình trạng BMI",
x = "Tình trạng BMI",
y = "Tỷ lệ Churn (%)") + # Layer 2
scale_fill_brewer(palette = "Dark2") + # Layer 3
geom_text(aes(label = paste0(round(Churn_Rate, 2), "%")),
vjust = -0.5, size = 4) +
theme_void() + # Layer 5
theme(plot.title = element_text(hjust = 0.5)) # Căn giữa tiêu đề
Ý nghĩa kỹ thuật:
Dòng [1] Khởi tạo biểu đồ, sử dụng bảng tóm tắt churn_by_bmi.
Dòng [7] Áp dụng chủ đề “trống” (void), xóa tất cả các yếu tố nền, trục, nhãn trục, và lưới.
Dòng [8] Tùy chỉnh lại theme. Cụ thể, căn giữa (hjust = 0.5) tiêu đề của biểu đồ .
Ý nghĩa thống kê:
Nhóm Underweight và Normal không có sự giữ chân khách hàng nào.
ggplot(dff, aes(x = Churn, y = Category_Premium, fill = Churn)) +
geom_violin(trim = FALSE) + # Layer 1
geom_boxplot(width = 0.1, color = "black", alpha = 0.8) + # Layer 2
labs(title = "Phân bố phí bảo hiểm theo trạng thái rời bỏ",
x = "Trạng thái rời bỏ",
y = "Phí Bảo hiểm") + # Layer 3
scale_fill_manual(values = c("Yes" = "#E41A1C", "No" = "#377EB8")) + # Layer 4
theme_minimal() # Layer 5
Ý nghĩa kỹ thuật:
Dòng [2] Vẽ biểu đồ violin (kết hợp giữa box plot và density plot). trim = FALSE yêu cầu ggplot vẽ toàn bộ hình dạng phân bố.
Dòng [3] Thêm một lớp (layer) biểu đồ hộp (box plot) chồng lên trên biểu đồ violin. width = 0.1 làm cho box plot rất hẹp, vừa vặn bên trong violin.
Ý nghĩa thống kê:
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ỏ và khách hàng ở lại.
claim_data_long <- dff %>%
count(Reason_Simple) %>%
rename(Claim_Reason_Fixed = Reason_Simple, Num_Claims = n)
print(claim_data_long)
## # A tibble: 4 × 2
## Claim_Reason_Fixed Num_Claims
## <fct> <int>
## 1 Medical 109863
## 2 Other 30187
## 3 Phone 30016
## 4 Travel 29934
Ý nghĩa kỹ thuật:
Dòng [2] Đếm số lần xuất hiện của mỗi giá trị trong cột Reason_Simple.
Dòng [3] Đổi tên cột Reason_Simple thành Claim_Reason_Fixed và cột n (do count() tạo ra) thành Num_Claims.
Ý nghĩa thống kê:
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 (109863 yêu cầu), vượt xa các loại hình khác (Other, Phone, Travel) chỉ ở mức khoảng 30 nghìn yêu cầu.
ggplot(dff, aes(x = Reason_Simple, y = Claim_Amount, fill = Reason_Simple)) +
geom_boxplot(outlier.shape = NA) + # Layer 1 (ẩ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
scale_fill_brewer(palette = "Set2") + # Layer 3
theme_bw() + # Layer 4
theme(legend.position = "none") # Layer 5
Ý nghĩa kỹ thuật:
Dòng [1] Khởi tạo biểu đồ, sử dụng data frame dff gốc.
Dòng [2] Vẽ biểu đồ hộp. outlier.shape = NA ẩn (không vẽ) các điểm dữ liệu ngoại lai (outliers), giúp biểu đồ gọn gàng hơn.
Dòng [8] Ẩn phần chú giải (legend) của biểu đồ (vì màu sắc và trục X (Reason_Simple) là trùng lặp thông tin).
Ý nghĩa thống kê:
Cùng với tần suất cao, 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.
top_10_states <- dff %>%
count(State, sort = TRUE) %>%
head(10)
top_10_states
Ý nghĩa kỹ thuật:
Dòng [1]: Đếm số lượng khách hàng theo từng State, sắp xếp giảm dần, và lọc lấy 10 hàng đầu tiên.
Ý nghĩa thống kê:
Dữ liệu cho thấy AE, AA, AP là những bang quan trọng nhất cần được ưu tiên trong mọi chiến lược kinh doanh và phân tích sâu hơn về hành vi khách hàng.
ggplot(top_10_states, aes(x = reorder(State, n), y = n, fill = State)) +
geom_col() + # Layer 1
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") +
coord_flip() + # Layer 3
scale_fill_hue(l = 50) + # Layer 4
geom_text(aes(label = n), hjust = 1.1, vjust = 0.5, size = 4, color = "white") +
theme_light()
Ý nghĩa kỹ thuật:
Dòng [1] Khởi tạo ánh xạ thiết lập biểu đồ, sắp xếp cột theo n, ánh xạ State (X), n (Y) và màu sắc.
Dòng [2]Vẽ các cột với chiều cao bằng chính giá trị n.
Dòng [5] Biến cột dọc thành cột ngang.
Dòng [8] Gắn nhãn bên trong: Đặt nhãn số liệu (n) bên trong cột và căn giữa.
Dòng [9] Áp dụng giao diện sáng .
Ý nghĩa thống kê:
Biểu đồ xác định rõ ràng rằng các hoạt động kinh doanh và rủi ro của công ty đang tập trung mạnh mẽ tại ba bang đầu tiên.
ggplot(dff, aes(x = Category_Premium, y = Claim_Amount)) +
geom_point(aes(color = Claim_Premium_Ratio), alpha = 0.3) + # Layer 1
scale_color_viridis_c() + # Layer 2
facet_grid(Claim_Request_Output ~ Churn, scales = "free") + # Layer 3
geom_smooth(method = "lm", color = "red", se = FALSE, linewidth = 1) + # Layer 4
labs(title = "Tương tác Premium và 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)") +
theme_bw()
## `geom_smooth()` using formula = 'y ~ x'
Ý nghĩa kỹ thuật:
Dòng [1] Khởi tạo biểu đồ scatter plot, Category_Premium (X) vs Claim_Amount (Y).
Dòng [2] Vẽ các điểm. aes(color = Claim_Premium_Ratio) tô màu mỗi điểm dựa trên giá trị Claim_Premium_Ratio. alpha = 0.3 làm mờ các điểm để thấy rõ sự chồng chéo.
Dòng [3] Sử dụng thang màu Viridis cho color.
Dòng [4] Chia biểu đồ thành một lưới (grid) 2x2. Claim_Request_Output : Các giá trị của biến này sẽ quyết định các hàng của lưới. Churn: Các giá trị của biến này sẽ quyết định các cột của lưới. scales = “free”: Cho phép trục X và Y của mỗi ô trong 4 ô có phạm vi (scale) riêng, không bị ép buộc theo một trục chung.
Dòng [5] Thêm một đường xu hướng. method = “lm” (linear model) vẽ đường hồi quy tuyến tính. se = FALSE ẩn dải lỗi.
Ý nghĩa thống kê:
Sự rời bỏ không phụ thuộc vào phí bảo hiểm hay quy mô bồi thường mà phụ thuộc vào việc công ty đã làm sai điều gì đó với nhóm khách hàng có yêu cầu bồi thường nhỏ, khiến họ thất vọng và rời đi.
slope_data <- dff %>%
group_by(BMI_Status, Churn) %>%
summarise(Median_Premium = median(Category_Premium), .groups = 'drop')
slope_data
Ý nghĩa kỹ thuật:
Dòng [1] Tạo bảng tóm tắt slope_data. Tính toán giá trị trung vị (median) của Category_Premium cho mọi tổ hợp của BMI_Status và Churn.
Ý nghĩa thống kê:
Mức phí bảo hiểm ở giữa của ba nhóm khách hàng này là như nhau.
ggplot(
slope_data, aes(x = BMI_Status,
y = Median_Premium,
group = Churn, color = Churn)) +
geom_line(linewidth = 1.5) + # Layer 1
geom_point(size = 4) + # Layer 2
labs(title = "Sự thay đổi trung vị phí bảo hiểm theo BMI Status và Churn",
x = "Tình trạng BMI",
y = "Trung vị phí Bảo hiểm (Category Premium)") + # Layer 3
scale_color_manual(values = c("Yes" = "#E41A1C", "No" = "#377EB8")) + # Layer 4
theme_bw() + # Layer 5
theme(axis.text.x = element_text(angle = 45, hjust = 1))
Ý nghĩa kỹ thuật:
Dòng [1] Sử dụng bảng slope_data đã tóm tắt. group = Churn: Quan trọng. Chỉ thị này bảo ggplot rằng các điểm dữ liệu thuộc cùng một nhóm Churn, tạo thành hai đường riêng biệt.
Dòng [6] (geom_line(…)): Vẽ các đường nối (slope).
Dòng [7] (geom_point(…)): Vẽ các điểm (markers) tại mỗi điểm dữ liệu.
Ý nghĩa thống kê:
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ụ.
claim_quantile_table <- dff %>%
group_by(Churn) %>%
summarise(
Min = min(Claim_Amount),
Q1 = quantile(Claim_Amount, 0.25),
Median = median(Claim_Amount),
Q3 = quantile(Claim_Amount, 0.75),
Max = max(Claim_Amount),
Mean = mean(Claim_Amount)
) %>%
tidyr::pivot_longer(cols = Min:Mean,
names_to = "Statistic", values_to = "Value") %>%
tidyr::pivot_wider(names_from = Churn, values_from = Value) %>%
mutate(across(c("No", "Yes"), ~round(.x, 2)))
knitr::kable(claim_quantile_table,
caption =
"Bảng so sánh thống kê Tứ phân vị (Quantile) của Claim Amount theo Churn",
col.names = c("Chỉ số", "Duy Trì (No)", "Rời Bỏ (Yes)"))
| 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 |
Ý nghĩa kỹ thuật:
Dòng [2] Nhóm theo Churn và tính toán các chỉ số thống kê.
Dòng [11] (tidyr::pivot_longer(…)): Chuyển đổi bảng từ dạng rộng (wide) sang dạng dài (long). Các tên cột (Min, Q1, Median…) được gom vào một cột Statistic, và giá trị của chúng được gom vào cột Value.
Dòng [12] Chuyển đổi bảng từ dạng dài trở lại dạng rộng), nhưng lần này, các giá trị trong cột Churn (“Yes”, “No”) được dùng để tạo các cột mới.
Dòng [13] Làm tròn các giá trị trong hai cột “No” và “Yes”.
Dòng [15] Hiển thị bảng, và tùy chỉnh (col.names) tên của các cột trong bảng kết quả.
Ý nghĩa thống kê:
Củng cố mạnh mẽ kết luận về mối quan hệ giữa hành vi yêu cầu bồi thường và việc hủy hợp đồng.
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))
top_5_states_list
## [1] "AE" "AA" "AP" "TX" "ME"
Ý nghĩa kỹ thuật:
Dòng [1] Lấy Top 5 bang
Dòng [3]Lọc data frame dff gốc, chỉ giữ lại các hàng mà cột State nằm trong danh sách top_5_states_list.
Dòng [4-5] Tính toán giá trị trung vị (median) của Claim_Amount cho 5 bang này.
Ý nghĩa thống kê:
Tìm ra 5 bang, tiểu bang có số tiền bồi thường theo trung vị cao nhất.
ggplot(median_claim_by_state, aes(x = reorder(State, Median_Claim_Amount),
y = Median_Claim_Amount, fill = State)) +
geom_col() + # Layer 1
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
coord_flip() + # Layer 3
scale_fill_brewer(palette = "Pastel1") + # Layer 4
geom_text(aes(label = round(Median_Claim_Amount, 0)),
hjust = 1.2,
color = "black",
size = 4) +
theme_minimal()
Ý nghĩa kỹ thuật:
Dòng [1] Khởi tạo biểu đồ, sử dụng bảng tóm tắt median_claim_by_state.
Dòng [1] Sắp xếp các bang trên trục X theo giá trị Median_Claim_Amount (tăng dần).
Ý nghĩa thống kê:
AE và AA được xác định là hai bang có chi phí bồi thường trung tâm cao nhất (1416 và 1411), cho thấy rủi ro chi phí tại hai khu vực này là cao nhất.
reason_summary <- dff %>%
count(Reason_Simple) %>%
mutate(
fraction = n / sum(n),
percentage = paste0(round(fraction * 100, 2), "%"),
ymax = cumsum(fraction),
ymin = c(0, head(ymax, -1)),
label_position = (ymin + ymax) / 2
) %>%
arrange(desc(Reason_Simple))
reason_summary
Ý nghĩa kỹ thuật:
Dòng [2] Nhóm dữ liệu theo các giá trị duy nhất trong cột Reason_Simple và sau đó đếm số lượng quan sát cho mỗi nhóm, tạo ra một cột mới tên là n (count).
Dòng [3] Tính toán các giá trị
Dòng [10] Sắp xếp các hàng của dataframe theo cột Reason_Simple theo thứ tự giảm dần.
Ý nghĩa thống kê:
Lập bảng tỷ lệ phân bố cho biểu đồ.
pie_reason <- ggplot(reason_summary, aes(ymax = ymax, ymin = ymin, xmax = 4,
xmin = 3, fill = Reason_Simple)) +
geom_rect() +
geom_text(x = 3.5, aes(y = label_position, label = percentage), size = 4) +
labs(title = "Phân bố lý do yêu cầu bồi thường chính", fill = "Lý do ") +
coord_polar(theta = "y") +
theme_void() +
theme(legend.position = "bottom")
print(pie_reason)
Ý nghĩa kỹ thuật:
Dòng [1] Khởi tạo đối tượng đồ họa và cung cấp data frame reason_summary làm nguồn dữ liệu.
Dòng [2] Vẽ các hình chữ nhật cơ bản.
Dòng [3] Đặt nhãn để nằm gọn trong vòng Donut.
Ý nghĩa thống kê:
Tập trung xử lý yêu cầu và kiểm soát rủi ro vào nhóm Medical. Nhận thấy các nhóm Phone, Other, và Travel có tỷ lệ gần như nhau, cần theo dõi sát sao để phát hiện sự thay đổi hoặc tăng trưởng đột biến trong các nhóm này.
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'
) %>%
arrange(Data_Conf_Encoded)
churn_by_conf_slope_data
Ý nghĩa kỹ thuật:
Dòng [2] Nhóm theo cả tên và mã số.
Dòng [3-6] Tính Churn_Rate cho từng nhóm.
Dòng [7] Sắp xếp bảng theo cột mã số (đảm bảo thứ tự logic “Very low” -> “Very high”).
Ý nghĩa thống kê:
Tạo bảng tỷ lệ theo thứ tự từ thấp đến cao.
churn_by_conf_slope_data$Data_Conf_Encoded <-
as.numeric(as.character(churn_by_conf_slope_data$Data_Conf_Encoded))
ggplot(churn_by_conf_slope_data, aes(x = Data_Conf_Encoded,
y = Churn_Rate, group = 1)) +
geom_line(color = "gray", linewidth = 1) +
geom_point(aes(color = Churn_Rate), size = 4) +
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ỏ (%)"
) +
scale_x_continuous(breaks = churn_by_conf_slope_data$Data_Conf_Encoded,
labels = churn_by_conf_slope_data$Data_Confidentiality) +
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
Ý nghĩa kỹ thuật:
Dòng [3] Sử dụng cột số (Data_Conf_Encoded) cho trục X.
Dòng [4] Vẽ đường nối các điểm.
Dòng [5] Vẽ các điểm.
Dòng [12] Kỹ thuật tùy chỉnh trục X.
Dòng [14] Áp dụng một thang màu cho color, từ màu xanh (giá trị thấp) đến màu đỏ (giá trị cao).
Ý nghĩa thống kê:
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 được công bố và quyết định Khách hàng rời bỏ.
dff_claim_group <- dff %>%
mutate(
Claim_Group = cut(
Claim_Amount,
breaks = c(0, 245, 1390, Inf),
labels = c("Low", "Medium", "High"),
include.lowest = TRUE,
right = FALSE
)
) %>%
filter(Reason_Simple != "Other")
dff_claim_group
Ý nghĩa kỹ thuật:
Dòng [2] Tạo cột mới Claim_Group.
Dòng [11] Lọc dữ liệu để chỉ giữ lại các hàng mà cột Reason_Simple không mang giá trị “Other”.
Ý nghĩa thống kê:
Phân bố nhóm tiền bồi thường và loại bỏ những giá trị khồn nằm trong đó.
ggplot(dff_claim_group, aes(x = Claim_Group, fill = Churn)) +
geom_bar(position = "stack") +
facet_wrap(~ Reason_Simple, scales = "free_y", ncol = 3) +
geom_text(
stat = 'count',
aes(label = after_stat(count)),
position = position_stack(vjust = 0.5),
size = 3, color = "white", fontface = "bold"
) +
labs(
title = "Phân bố số lượng khách hàng rời bỏ theo nhóm tiền bồi thường",
x = "Nhóm Số tiền Bồi thường",
y = "Số lượng Khách hàng",
fill = "Trạng thái Rời bỏ"
) +
scale_fill_manual(values = c("Yes" = "#CC0000", "No" = "#0072B2")) +
scale_y_continuous(labels = scales::comma) +
theme_minimal() +
theme(
legend.position = "bottom",
plot.title = element_text(face = "bold", hjust = 0.5),
# angle = 0 và size = 9 để tối ưu nhãn ngang
axis.text.x = element_text(angle = 0, hjust = 0.5, size = 9),
strip.text = element_text(face = "bold")
)
Ý nghĩa kỹ thuật:
Dòng [1] Khởi tạo biểu đồ.
Dòng [2] Tạo các biểu đồ chồng.
Dòng [3] Chia biểu đồ thành nhiều ô nhỏ.
Dòng [4] Thêm nhãn số lượng vào bên trong mỗi phần của cột.
Dòng [16] Thiết lập bảng màu thủ công, định dạng trục .
Dòng [19] Tùy chỉnh chi tiết thẩm mỹ của theme.
Ý nghĩa thống kê:
Biểu đồ này giúp cách ly và định lượng các nhóm khách hàng rủi ro cao để đưa ra chiến lược giữ chân khách hàng mục tiê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.
bctcabs <- read_excel("bctcabs.xlsx", sheet = "bctc abs")
Ý nghĩa kỹ thuật:
Dòng [1] Hàm read_excel() của gói readxl để đọc dữ liệu tài chính từ file Excel.
Ý nghĩa thống kê:
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.
bc <- bctcabs
bc
Ý nghĩa kỹ thuật:
Dòng [1] gán dữ liệu gốc vào đối tượng bc để thao tác nhanh, tránh thay đổi dữ liệu
Ý nghĩa thống kê:
Đả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.
ktbc <- sapply(bc, class)
print(ktbc)
## 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"
Ý nghĩa kỹ thuật:
Dòng [1] hiển thị cấu trúc dataset – kiểu dữ liệu, số dòng và số cột.
Ý nghĩa thống kê:
Tất cả đều là biến định lượng.
head(bc, 10)
Ý nghĩa kỹ thuật:
Dòng [1] hiển thị 10 dòng đầu tiên để kiểm tra dữ liệu thực tế.
Ý nghĩa thống kê:
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ệ.
dim(bc)
## [1] 10 11
Ý nghĩa kỹ thuật:
Dòng [1] Trả về số hàng (quan sát) và cột (biến) trong bộ dữ liệu
Ý nghĩa thống kê:
Có 10 năm và 11 biến trong bộ dữ liệu
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"
Ý nghĩa kỹ thuật:
Dòng [1] Xem tên biến.
Ý nghĩa thống kê:
Giúp nắm rõ nội dung dữ liệu gồm những chỉ tiêu tài chính nào
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"
Ý nghĩa kỹ thuật:
Dòng [1] áp dụng hàm class() cho từng cột để xem kiểu dữ liệu (numeric, character…).
Ý nghĩa thống kê:
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.
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
Ý nghĩa kỹ thuật:
Dòng [1] s.na() phát hiện giá trị trống, colSums() đếm tổng số NA của từng cột.
Ý nghĩa thống kê:
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.
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
Ý nghĩa kỹ thuật:
Dòng [1] Tạo bảng thống kê mô tả nhanh (min, max, mean, median…).
Ý nghĩa thống kê:
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
Ý nghĩa kỹ thuật:
Dòng [1] Tạo bảng thống kê mô tả nhanh (min, max, mean, median…).
Ý nghĩa thống kê:
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
Ý nghĩa kỹ thuật:
Dòng [1] Tạo bảng thống kê mô tả nhanh (min, max, mean, median…).
Ý nghĩa thống kê:
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
Ý nghĩa kỹ thuật:
Dòng [1] Tạo bảng thống kê mô tả nhanh (min, max, mean, median…).
Ý nghĩa thống kê:
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
Ý nghĩa kỹ thuật:
Dòng [1] Tạo bảng thống kê mô tả nhanh (min, max, mean, median…).
Ý nghĩa thống kê:
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
Ý nghĩa kỹ thuật:
Dòng [1] Tạo bảng thống kê mô tả nhanh (min, max, mean, median…).
Ý nghĩa thống kê:
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
Ý nghĩa kỹ thuật:
Dòng [1] Tạo bảng thống kê mô tả nhanh (min, max, mean, median…).
Ý nghĩa thống kê:
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
Ý nghĩa kỹ thuật:
Dòng [1] Tạo bảng thống kê mô tả nhanh (min, max, mean, median…).
Ý nghĩa thống kê:
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
Ý nghĩa kỹ thuật:
Dòng [1] Tạo bảng thống kê mô tả nhanh (min, max, mean, median…).
Ý nghĩa thống kê:
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
Ý nghĩa kỹ thuật:
Dòng [1] Tạo bảng thống kê mô tả nhanh (min, max, mean, median…).
Ý nghĩa thống kê:
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.
range(bc$`Năm/Biến`, na.rm = TRUE)
## [1] 2015 2024
Ý nghĩa kỹ thuật:
Dòng [1] Xác định giá trị nhỏ nhất và lớn nhất của biến năm.
Ý nghĩa thống kê:
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.
library(readxl)
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"
Ý nghĩa kỹ thuật:
Dòng [1] Gọi thư viện cần thiết.
Dòng [2] Đọc lại dữ liệu.
Ý nghĩa thống kê:
Đọc lại dữu liệu gốc để bắt đầu xử lý dữ liệu.
bc_1 <- bc
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"
Ý nghĩa kỹ thuật:
Dòng [2] 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
Ý nghĩa thống kê:
Đảm bảo dữ liệu nhất quán, tránh lỗi khi gọi biến hoặc xử lý tự động trong các bước phân tích.
bc_2 <- bc_1
bc_2$Giai_đoạn <- ifelse(bc_2$Năm_Biến < 2020, "Trước_2020", "Sau_2020")
print(bc_2$Giai_đoạn)
## [1] "Trước_2020" "Trước_2020" "Trước_2020" "Trước_2020" "Trước_2020"
## [6] "Sau_2020" "Sau_2020" "Sau_2020" "Sau_2020" "Sau_2020"
Ý nghĩa kỹ thuật:
Dòng[2] 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.
Ý nghĩa thống kê:
Phân nhóm các năm tài chính giúp so sánh hiệu quả kinh doanh trước và sau giai đoạn biến động thị trường (ví dụ COVID-19).
bc_3 <- bc_2
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
Ý nghĩa kỹ thuật:
Dòng [2] Áp dụng hàm xử lý NA như yêu cầu.
Ý nghĩa thống kê:
Giữ nguyên số lượng quan sát, tránh sai lệch khi phân tích hồi quy hoặc mô hình dự báo.
bc_4 <- bc_3
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$Tỷ_trọng_nợ)
## [1] 0.3480089 0.3521978 0.3449291 0.2796490 0.2554005 0.2250120 0.2588721
## [8] 0.2864996 0.2516828 0.2692127
Ý nghĩa kỹ thuật:
Dòng [2] 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
Ý nghĩa thống kê:
Đo lường đòn bẩy tài chính, thể hiện mức độ phụ thuộc vào vốn vay của SABECO
Các giá trị tỷ trọng nợ quanh 0.25–0.35, tức là:
Khoảng 25–35% tài sản của SABECO hình thành từ nợ vay,
Cho thấy SABECO không quá phụ thuộc vào vay nợ, tài chính khá lành mạnh..
bc_5 <- bc_4
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$Tỷ_suất_lợi_nhuận_gộp)
## [1] 0.2784284 0.2704577 0.2574329 0.2248808 0.2520017 0.3040305 0.2884901
## [8] 0.3079185 0.2984555 0.2923593
Ý nghĩa kỹ thuật:
Dòng [2] Tính tỷ suất lợi nhuận gộp.
Ý nghĩa thống kê:
Phản ánh khả năng sinh lời cốt lõi từ hoạt động kinh doanh chính của doanh nghiệp.
bc_6 <- bc_5
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$Tỷ_lệ_thanh_toán_hiện_hành)
## [1] 1.624342 1.585036 1.802454 2.348609 2.783033 3.167913 2.898675 2.720235
## [9] 3.097883 2.784477
Ý nghĩa kỹ thuật:
Dòng [2] Tính tốc độ Tăng trưởng
Ý nghĩa thống kê:
Về mặt tài chính cơ bản, điều này cho thấy tất cả các kỳ trên 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ỳ.
bc_6 <- bc_6[rowSums(is.na(bc)) != ncol(bc_6), ]
Ý nghĩa kỹ thuật:
Dòng [1] Lọc bỏ giá trị NA.
Ý nghĩa thống kê:
Để đảm bảo tính chính xác và hiệu suất của các mô hình thống kê, chúng ta cần loại bỏ các hàng trống hoàn toàn.
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")
bc_6[cols_to_num] <- lapply(bc_6[cols_to_num], as.numeric)
Ý nghĩa kỹ thuật:
Dòng [8] Áp dụng hàm as.numeric() cho tất cả các cột được chọn
Ý nghĩa thống kê:
Đâ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.
ktdlbc6 <- sapply(bc_6, class)
print(ktdlbc6)
## 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"
## Giai_đoạn
## "factor"
## Tỷ_trọng_nợ
## "numeric"
## Tỷ_suất_lợi_nhuận_gộp
## "numeric"
## Tỷ_lệ_thanh_toán_hiện_hành
## "numeric"
Ý nghĩa kỹ thuật:
Dòng [1] xác định kiểu dữ liệu.
Ý nghĩa thống kê:
Tất cả các biến được chọn đều đã ở kiểu numeric.
bcn <- bc_6
Ý nghĩa kỹ thuật:
Dòng [1] gán vào file mới.
Ý nghĩa thống kê:
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).
# 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)
min(bcn$Tổng_tài_sản, na.rm = TRUE)
## [1] 1.919287e+13
max(bcn$Tổng_tài_sản, na.rm = TRUE)
## [1] 3.446508e+13
Ý nghĩa kỹ thuật:
Dòng [1] Tìm giá trị nhỏ nhất
Dòng [2] Tìm giá trị lớn nhất
Ý nghĩa thống kê:
Đâ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.
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
Ý nghĩa kỹ thuật:
Dòng [1] 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ố.
Ý nghĩa thống kê:
Các chỉ tiêu quy mô 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.
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
Ý nghĩa kỹ thuật:
Dòng [1] 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.
Ý nghĩa thống kê:
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.
mean(bcn$Tỷ_lệ_thanh_toán_hiện_hành, na.rm = TRUE)
## [1] 2.481266
Ý nghĩa kỹ thuật:
Dòng [1] tính giá trị trung bình, na.rm=TRUE loại bỏ giá trị NA.
Ý nghĩa thống kê:
Giá trị trung bình này là một chỉ số thống kê mô tả đại diện cho khuynh hướng tập trung của biến số. Nó đóng vai trò 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, được sử dụng như một chỉ số tham chiếu để so sánh hiệu suất giữa các nhóm và là cơ sở dữ liệu đầu vào cho các phân tích suy luận phức tạp hơn như kiểm định t hay mô hình hồi quy.
median(bcn$Tỷ_trọng_nợ, na.rm = TRUE)
## [1] 0.2744309
Ý nghĩa kỹ thuật:
Dòng [1] 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.
Trung vị 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.
fivenum(bcn$Vốn_chủ_sở_hữu)
## [1] 1.243318e+13 1.442049e+13 2.064576e+13 2.443709e+13 2.548516e+13
Ý nghĩa kỹ thuật:
Dòng [1] tạo ra bộ 5 giá trị tóm tắt gồm Min, Q1, Median, Q3, Max cho một biến số.
Ý nghĩa thống kê:
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ị
var(bcn$Doanh_thu_thuần, na.rm = TRUE)
## [1] 1.562573e+25
Ý nghĩa kỹ thuật:
Dòng [1] tính giá trị phương sai.
Ý nghĩa thống kê:
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 ch cao đã tính trước đó.
cv_loinhuan <- sd(bcn$Lợi_nhuận_gộp, na.rm = TRUE) / mean(bcn$Lợi_nhuận_gộp, na.rm = TRUE)
cv_loinhuan
## [1] 0.1118167
Ý nghĩa kỹ thuật:
Dòng [1] 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).
Ý nghĩa thống kê:
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.
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
Ý nghĩa kỹ thuật:
Dòng [1] 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.
Ý nghĩa thống kê: Các Z-score từ trong khoản
Đ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.
table(bcn$Giai_đoạn)
##
## Sau_2020 Trước_2020
## 5 5
Ý nghĩa kỹ thuật:
Dòng [1] đếm số lượng quan sát thuộc từng nhóm trong biến phân loại.
Ý nghĩa thống kê: 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.
cor(bcn$Tổng_tài_sản, bcn$Tổng_nợ_phải_trả, use = "complete.obs")
## [1] 0.7445376
Ý nghĩa kỹ thuật:
Dòng [1] tính hệ số tương quan Pearson giữa hai biến số, bỏ qua giá trị NA.
Ý nghĩa thống kê:
Giá trị Hệ số Tương quan: Loại Tương quan: Hệ số này nằm trong khoảng từ , cho thấy đây là một mối tương quan dương mạnh.
Giá trị đó 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.
cor(bcn$Tỷ_suất_lợi_nhuận_gộp, bcn$Tỷ_trọng_nợ, use = "complete.obs")
## [1] -0.3096925
Ý nghĩa kỹ thuật:
Dòng [1] đo lường mối quan hệ tuyến tính giữa hai biến định lượng.
Ý nghĩa thống kê:
Loại Tương quan: Đây là mối tương quan âm yếu
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.
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
Ý nghĩa kỹ thuật:
Dòng [1] á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.
Ý nghĩa thống kê:
Phân tích tương quan cho thấy sabeco có cấu trúc tài chính rất chặt chẽ và bền vững: tài sản ngắn hạn là động lực quy mô chính, được tài trợ chủ yếu bằng vốn chủ sở hữu. Tuy nhiên, mối quan hệ âm cực kỳ mạnh giữa tỷ trọng nợ và tỷ lệ thanh toán hiện hành cảnh báo rằng việc tăng đòn bẩy dài hạn sẽ làm suy giảm nghiêm trọng khả năng thanh khoản ngắn hạn. Về hiệu suất, lợi nhuận gộp có mối quan hệ dương yếu với tỷ suất lợi nhuận gộp, cho thấy hiệu suất sinh lời không hoàn toàn được đảm bảo bởi quy mô lợi nhuận, với tỷ suất có xu hướng giảm nhẹ khi quy mô doanh thu thuần tăng.
cov(bcn$Doanh_thu_thuần, bcn$Lợi_nhuận_gộp, use = "complete.obs")
## [1] 2.414643e+24
Ý nghĩa kỹ thuật:
Dòng [1] tính hiệp phương sai – đo sự thay đổi đồng thời của hai biến.
Ý nghĩa thống kê: Giá trị dương lớn 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).
aggregate(. ~ Giai_đoạn, data = bcn, FUN = sd)
Ý nghĩa kỹ thuật:
Dòng [1] tính độ lệch chuẩn (sd) cho tất cả các biến theo từng nhóm Giai_đoạn.
Ý nghĩa thống kê:
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.
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
Ý nghĩa kỹ thuật:
Dòng [1] 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.
Ý nghĩa thống kê:
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
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
Ý nghĩa kỹ thuật:
Dòng [1] 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.
Ý nghĩa thống kê:
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 cao hơn đáng kể so với giai đoạn trước 2020 .
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
Ý nghĩa kỹ thuật:
Dòng [1] kiểm tra giả định phân phối chuẩn của biến định lượng.
Ý nghĩa thống kê:
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. Đ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.
mean(bcn$Tỷ_suất_lợi_nhuận_gộp, trim = 0.1)
## [1] 0.280207
Ý nghĩa kỹ thuật:
Dòng [1] 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.
Ý nghĩa thống kê:
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 làm tăng hoặc giảm đột ngột lợi nhuận.
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
Ý nghĩa kỹ thuật:
Dòng [1] tính CV = Độ lệch chuẩn / Giá trị trung bình
Ý nghĩa thống kê:
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 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.
# Gọi thư viện cần thiết
library(ggplot2)
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
Ý nghĩa kỹ thuật:
Dòng [1] Khởi tạo biểu đồ, sử dụng DataFrame bcn. Ánh xạ biến năm lên trục X và doanh thu thuần lên trục Y.
Dòng [5] Đặt tên tiêu đề cho biểu đồ và nhãn cho các trục.
Ý nghĩa thống kê:
Giai đoạn Tăng trưởng (Trước 2020) 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.
Ý 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): 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.
Ý 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ẽ nhưng sau đó lại sụt giảm nhẹ.
Ý nghĩa: Cho thấy sự không ổn định (biến động cao) trong hiệu suất bán hàng ở giai đoạn sau năm 2020. Điều này phù hợp với kết quả phân tích Độ lệch chuẩn cao cho Doanh thu thuần trước đó.
Biểu đồ này là bằng chứng trực quan cho thấy:
Doanh nghiệp đã trải qua một sự kiện chấn động vào khoảng năm 2020.
Quy mô hoạt động (Doanh thu thuần) ở giai đoạn Trước 2020 có xu hướng tăng trưởng ổn định hơn, trong khi giai đoạn Sau 2020 có tính chất biến động mạnh và thiếu ổn định hơn.
ggplot(bcn %>% group_by(Giai_đoạn) %>%
summarise(Mean_LN_Gop = mean(Tỷ_suất_lợi_nhuận_gộp, na.rm = TRUE)),
aes(x = Giai_đoạn, y = Mean_LN_Gop, fill = Giai_đoạn)) +
geom_col(width = 0.6) + # Layer 2
geom_text(aes(label = round(Mean_LN_Gop, 4)),
vjust = -0.5, size = 4) + # Layer 3: Thêm nhãn giá trị
scale_fill_manual(values = c("Trước_2020" = "#56B4E9",
"Sau_2020" = "#009E73")) + # Layer 4: Đổi màu
labs(title = "Tỷ suất lợi nhuận gộp trung bình theo giai đoạn",
y = "Tỷ suất LN Gộp (%)") + # Layer 5
theme_classic() # Layer 6
Ý nghĩa kỹ thuật:
Dòng [1] Khởi tạo biểu đồ, ánh xạ..
Dòng [9] Đặt tên tiêu đề cho biểu đồ và nhãn cho các trục.
Ý nghĩa thống kê:
Phân tích thống kê chỉ ra rằng khả năng sinh lời cốt lõi của SABECO đã cải thiện và củng cố đáng kể ở giai đoạn sau năm 2020. Cụ thể, cả tỷ suất lợi nhuận gộp trung bình và trung vị đều cao hơn giai đoạn trước 2020 (Trung vị: 0.2884 so với 0.2774. Điều này ngụ ý rằng, mặc dù doanh thu thuần có biến động, doanh nghiệp đã kiểm soát giá vốn hàng bán tốt hơn hoặc tối ưu hóa định giá sản phẩm, dẫn đến biên lợi nhuận cốt lõi trên mỗi đồng doanh thu tăng lên và hiệu quả hoạt động được nâng cao.
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'
Ý nghĩa kỹ thuật:
Dòng [1] Khởi tạo biểu đồ, ánh xạ Năm lên trục X và Vốn Chủ Sở hữu lên trục Y.
Dòng [6] Đặt tiêu đề và nhãn cho các trục.
Ý nghĩa thống kê:
Xu hướng dài hạn của vốn chủ sở hữu cho thấy sự tăng trưởng tuyến tính dương, rõ rệt và nhất quán, khẳng định khả năng tự tài trợ và củng cố cơ cấu vốn mạnh mẽ của doanh nghiệp. Mức tăng trưởng quy mô vốn ấn tượng cùng với việc các điểm dữ liệu nằm sát đường xu hướng chứng tỏ vốn chủ sở hữ có tính ổn định cao, là một nguồn lực vững chắc và đáng tin cậy cho sự mở rộng quy mô tài sản và sức khỏe tài chính dài hạ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) +
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")) +
scale_x_continuous(
labels = function(x) paste0(round(x / 1e12, 1), "T") # Làm tròn và thêm ký hiệu 'T'
) +
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"
)
Ý nghĩa kỹ thuật:
Dòng [4] Đường trung vị riêng biệt cho từng giai đoạn
Dòng [26] Đảm bảo trục Y không dùng ký hiệu khoa học
Ý nghĩa thống kê:
Quá trình này thể hiện sự tăng trưởng quy mô rõ rệt của Tài sản ngắn hạn sau năm 2020, đi kèm với sự đồng nhất cấu trúc, nhưng cũng làm tăng độ phân tán về giá trị tuyệt đối.
ggplot(bcn, aes(x = Tổng_tài_sản, y = Tổng_nợ_phải_trả, color = Giai_đoạn)) +
geom_point(size = 3, alpha = 0.7) + # Layer 2
geom_smooth(method = "lm", se = FALSE,
linetype = "solid") + # Layer 3: Đường hồi quy
scale_color_brewer(palette = "Set1") + # Layer 4: Đổi bảng màu
labs(title = "Mối quan hệ Tổng Tài sản và Tổng Nợ (Phân theo Giai đoạn)",
x = "Tổng Tài sản", y = "Tổng Nợ phải trả") + # Layer 5
scale_x_continuous(labels = unit_format(unit = "Tỷ", scale = 1e-12)) + # Layer 6
theme_light() # Layer 7
## `geom_smooth()` using formula = 'y ~ x'
Ý nghĩa kỹ thuật:
Dòng [1] Khởi tạo biểu đồ, ánh xạ.Vẽ các điểm dữ liệu thô. Thêm hai đường hồi quy tuyến tính (lm)
Dòng [6] Đặt tiêu đề và nhãn cho các trục.
Ý nghĩa thống kê:
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), 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 sử dụng đòn bẩy cao hơn để tăng trưởng, dẫn đến mối quan hệ phụ thuộc mạnh mẽ giữa tổng tài sản và tổng nợ phải trả.
bcn_long <- bcn %>%
select(Tài_sản_ngắn_hạn, Tổng_nợ_phải_trả, Vốn_chủ_sở_hữu, Giai_đoạn) %>%
tidyr::pivot_longer(!Giai_đoạn, names_to = "Variable", values_to = "Value")
ggplot(bcn_long, aes(x = Variable, y = Value, fill = Giai_đoạn)) +
geom_boxplot(width = 0.7) + # Layer 2
geom_jitter(alpha = 0.3, color = "black") + # Layer 3: Thêm điểm dữ liệu thô
scale_y_continuous(labels = unit_format(unit = "Tỷ", scale = 1e-12)) + # Layer 4
labs(title = "So sánh phân bố tài sản, nợ, vốn theo giai đoạn",
x = "Chỉ tiêu", y = "Giá trị") + # Layer 5
theme_bw() # Layer 6
Ý nghĩa kỹ thuật:
Dòng [1] Tái cấu trúc dữ liệu.
Dòng [4] Vẽ biểu đồ, ánh xạ. Thêm lớp biểu đồ hộp.
Dòng [8] Đặt tiêu đề và nhãn cho các trục.
Ý nghĩa thống kê:
Boxplot cho thấy mức tăng tuyệt đối của vốn chủ sở hữu vượt trội rõ rệt so với nợ , ngụ ý rằng phần lớn sự mở rộng tài sản được tài trợ bởi nguồn lực nội bộ, giúp cải thiện cấu trúc vốn và giảm đòn bẩy tương đối. Tuy nhiên, mặc dù vốn chủ sở hữ là động lực tăng trưởng về mặt số học, Biểu đồ tán xạ chỉ ra rằng Nợ vẫn có mối tương quan tuyến tính chặt chẽ với Tài sản. Điều này kết luận rằng doanh nghiệp đã thành công trong việc củng cố khả năng tự tài trợ trong khi vẫn sử dụng nợ một cách có hệ thống như một công cụ hỗ trợ và đồng hành không thể thiếu, đảm bảo tốc độ mở rộng tài sản tối đa.
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 lợi nhuận 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()
Ý nghĩa kỹ thuật:
Dòng [1] Khởi tạo biểu đồ, thiết lập biến Tỷ suất Lợi nhuận Gộp là mẫu cần kiểm tra. Tính toán và vẽ các điểm dữ liệu.Vẽ đường tham chiếu.
Dòng [7] Đặt tiêu đề và nhãn.
Ý nghĩa thống kê:
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.
Biểu đồ xác nhận rằng tỷ suất lợi nhuận gộp gần như tuân theo phân phối chuẩn. Điều này phù hợp với kết quả của Kiểm định Shapiro–Wilk trước đó, nơi p-value 0.4994 > 0.05, cho phép chúng ta không bác bỏ giả thuyết phân phối chuẩn.
ggplot(bcn, aes(x = Tỷ_trọng_nợ)) +
geom_density(fill = "#009E73", alpha = 0.6) + # Layer 2
geom_vline(aes(xintercept = median(Tỷ_trọng_nợ)),
color = "red", linetype = "dashed", linewidth = 1) +
# Layer 4
annotate(
"text", # Loại hình học bạn muốn vẽ
x = median(bcn$Tỷ_trọng_nợ) + 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
Ý nghĩa kỹ thuật:
Dòng [1] Vẽ biểu đồ và ánh xạ. Thêm lớp biểu đồ mật độ.Thêm đường thẳng đứng tại giá trị trung vị của tỷ trọng Nợ.
Dòng [15] Đặt tiêu đề và nhãn trục.
Ý nghĩa thống kê:
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 0.27), cho thấy sự an toàn về đòn bẩy vốn. Tuy nhiên, sự tồn tại của hai đỉnh cảnh báo nhà phân tích rằng mẫu có thể không đồng nhất và cần xem xét phân tích riêng biệt cho hai nhóm đòn bẩy.
bcn$Zscore_LN_gop <- scale(bcn$Lợi_nhuận_gộp)
ggplot(bcn, aes(x = as.numeric(Zscore_LN_gop))) +
geom_histogram(binwidth = 0.5, fill = "#56B4E9", color = "white") + # Layer 2
geom_vline(xintercept = c(-2, 2), color = "red",
linetype = "dashed", size = 1) + # Layer 3: Ngưỡng Z-score
labs(title = " Phân phối Z score lợi nhuận gộp (Phát hiện Outlier)",
x = "Z score") + # Layer 4
coord_cartesian(xlim = c(-3, 3)) + # Layer 5: Giới hạn hiển thị
theme_bw() # Layer 6
## 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.
Ý nghĩa kỹ thuật:
Dòng [1] Tính toán Z-score= (Giá trị-Trung bình)/Độ lệch chuẩn.
Dòng [2] Tạo biểu đồ tần suất của các Z-score.
Dòng [5] Đặt tiêu đề và nhãn trục. Giới hạn trục X từ -3 đến 3.
Ý nghĩa thống kê:
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).Việc phát hiện ngoại lai này (có lợi nhuận gộp cao hơn hẳn so với mức trung bình và độ biến động của dữ liệu) hoàn toàn khớp với phân tích ban đầu về Điểm Ngoại lai ở phần hồi quy, nơi nó kéo đường hồi quy lên
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
Ý nghĩa kỹ thuật:
Dòng [1] Khởi tạo biểu đồ và ánh xạ.
Dòng [4] Nhãn và tiêu đề.
Ý nghĩa thống kê:
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.
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 những doanh nghiệp/năm đạt được lợi nhuận gộp cực kỳ cao, kéo độ lệch của mẫu.
Kết luận: Mặc dù quy mô Lợi nhuận gộp có tính ổn định cao (tập trung quanh mức Trung vị), sự hiện diện của các trường hợp sinh lời đột biến đã làm phân phối trở nên không đồng đều..
model_base <- lm(Lợi_nhuận_gộp_về_bán_hàng_và_cung_cấp_dịch_vụ
~ Doanh_thu_thuần_về_bán_hàng_và_cung_cấp_dịch_vụ, data = bcn)
ggplot(bcn, aes(x=Doanh_thu_thuần_về_bán_hàng_và_cung_cấp_dịch_vụ,
y=Lợi_nhuận_gộp_về_bán_hàng_và_cung_cấp_dịch_vụ)) +
geom_point(color = "#0072B2", size = 3) + # Layer 2
geom_smooth(method = "lm", color = "red", fill = "pink") +
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'
Ý nghĩa kỹ thuật:
Dòng [1] Tính toán các hệ số hồi quy.
Dòng [2] Khởi tạo biểu đồ.
Dòng [5] Đặt tiêu đề và nhãn cho các trục.
Ý nghĩa thống kê:
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ệ có thể làm giảm một chút hiệu suất dự đoán tổng thể.
Kết luận: Mối quan hệ giữa hai yếu tố là mạnh mẽ và ổn định, chứng minh tính ổn định trong cấu trúc chi phí hoạt động của doanh nghiệp.
ggplot(bcn, aes(x = Tỷ_trọng_nợ, y = Tỷ_suất_lợi_nhuận_gộp)) +
geom_point(aes(color = Giai_đoạn), size = 3) + # Layer 2
geom_smooth(method = "lm", se = FALSE,
color = "grey", linetype = "dashed") + # Layer 3
scale_color_manual(values = c("Trước_2020" = "#56B4E9",
"Sau_2020" = "#D55E00")) + # Layer 4
labs(title = " Tương quan tỷ trọng nợ và tỷ suất lợi nhuận gộp"
, x = "Tỷ trọng Nợ", y = "Tỷ suất Lợi nhuận Gộp") + # Layer 5
theme_classic() # Layer 6
## `geom_smooth()` using formula = 'y ~ x'
Ý nghĩa kỹ thuật:
Dòng [1] Khởi tạo biểu đồ, ánh xạ.
Dòng [4] Gán màu cụ thể cho từng giai đoạn
Dòng [5] nhán nhãn cho biểu đồ
Ý nghĩa thống kê:
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 , 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.
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.
Ý nghĩa kỹ thuật:
Dòng [1] Khởi tạo biểu đồ và ánh xạ.
Dòng [2] Vẽ biểu đồ tần suất, biểu đồ mật độ và đường tham chiêys trung bình.
Dòng [5] Nhãn đề và tiêu đề.
Ý nghĩa thống kê:
Phân tích thống kê cho thấy tỷ suất lợi nhuận gộp của sabeco có tính ổn định và đối xứng cao, với hầu hết dữ liệu tập trung quanh mức trung bình 0.277, phù hợp với giả định phân phối chuẩn. Sự phân bố gần chuẩn này xác nhận rằng khả năng sinh lời cốt lõi của doanh nghiệp là bền vững và dễ dự đoán, chứng tỏ khả năng kiểm soát giá vốn hàng bán tốt và tạo ra độ tin cậy cao cho các mô hình dự báo và phân tích tài chính sâu hơn.
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ệ thánh toán hiện hành", x = "",
y = "Tỷ lệ") + # Layer 5
coord_flip() + # Layer 6: Xoay biểu đồ
theme_bw() # Layer 7
Ý nghĩa kỹ thuật:
Dòng [1] khời tạo biểu đồ và ánh xạ, biểu đồ hộp.
Dòng [3] Đường tham chiếu, biểu đồ điểm phân tán.
Dòng [5] Thiết lập nhãn và tiêu đề.
Ý nghĩa thống kê:
Biểu đồ này là bằng chứng trực quan cho thấy liệu SABECO có đang theo đuổi chiến lược tăng trưởng ổn định dài hạn (mối quan hệ dương) hay đang tập trung vào thanh khoản ngắn hạn và quản lý vốn lưu động (mối quan hệ âm hoặc phân nhóm rõ rệt) trong các giai đoạn khác nhau.
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'
Ý nghĩa kỹ thuật:
Dòng [1] Vẽ biểu đồ, thiết lập ánh xạ tọa độ.
Dòng [2] Vẽ từng quan sát trên mặt phẳng tọa độ.
Dòng [5] Thiết lập biểu đồ.
Ý nghĩa thống kê:
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).
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)
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) +
geom_hline(yintercept = c(-2, 2),
linetype = "dashed", color = "red") +
geom_vline(xintercept = 2 * (1 + 1) / nrow(bcn),
linetype = "dashed", color = "blue") +
scale_color_gradient(low = "green", high = "red") +
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
Ý nghĩa kỹ thuật:
Dòng [1] Cần chạy lại mô hình hồi quy tuyến tính.
Dòng [2] Trích xuất các giá trị cần thiết.
Dòng [4] Vẽ biểu đồ.
Ý nghĩa thống kê:
Phân tích biểu đồ chỉ ra rằng mô hình hồi quy giữa lợi nhuận gộp và doanh thu thuần đang bị méo mó nghiêm trọng bởi hai quan sát có ảnh hưởng lớn: điểm ngoại lai (outlier) ở phía trên bên trái có phần dư dương lớn, đang kéo đường hồi quy lên trên, và điểm đòn bẩy trên ảnh hưởng ở phía dưới bên trái có phần dư âm lớn, đang kéo đường hồi quy xuống dưới. sự đối nghịch này làm cho các hệ số của mô hình hiện tại (độ dốc và chặn) không đại diện chính xác cho mối quan hệ của phần lớn dữ liệu, do đó, cần kiểm tra nguồn gốc của hai điểm này (lỗi dữ liệu hay trường hợp đặc biệt) trước khi tiến hành loại bỏ hoặc điều chỉnh mô hình.
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 cộng và trung bình bị xén",
y = "Tỷ suất lợi nhuận gộp") + # Layer 5
theme_bw() # Layer 6
Ý nghĩa kỹ thuật:
Dòng [1] Tính toán trung bình cộng, trung bình bị xén.
Dòng [5] Vẽ biểu đồ. Ánh xạ loại trung bình vào trục X và giá trị tính toán vào trục Y. Gán màu sắc thủ công cho hai cột. Đặt tiêu đề và nhãn trục Y. Áp dụng theme màu đen và trắng.
Ý nghĩa thống kê:
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 lợi nhuận 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ẽ, và khả năng sinh lời cốt lõi không bị ảnh hưởng nghiêm trọng bởi các giá trị cực đoan.
cv_value <- sd(bcn$Doanh_thu_thuần_về_bán_hàng_và_cung_cấp_dịch_vụ) /
mean(bcn$Doanh_thu_thuần_về_bán_hàng_và_cung_cấp_dịch_vụ)
cv_data <- data.frame(Metric = "Doanh thu thuần", CV = cv_value)
ggplot(cv_data, aes(x = Metric, y = CV)) +
geom_col(fill = "#0072B2") + # Layer 2
geom_text(aes(label = paste0(round(CV * 100, 2), "%")),
vjust = -0.5, size = 5, color = "red") + # Layer 3
geom_hline(yintercept = 0.25, linetype = "dashed", color = "grey") +
labs(title = "Hệ số Biến thiên (CV) của Doanh thu thuần",
y = "CV (Rủi ro tương đối)") +
theme_classic() # Layer 6
Ý nghĩa kỹ thuật:
Dòng [1] Tính hệ số biến thiên.
Dòng [3] Tạo data frame đơn giản chứa tên chỉ tiêu và giá trị CV đã tính.
Dòng [4] Vẽ biểu đồ.
Dòng [8] Đặt tiêu đề rõ ràng, nhấn mạnh rằng CV đo lường rủi ro tương đối.
Ý nghĩa thống kê:
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.
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") +
geom_text(aes(label = round(R_Value, 3)),
vjust = ifelse(cor_data$R_Value < 0, 1.5, -0.5)) +
scale_fill_manual(values = c("FALSE" = "#D55E00", "TRUE" = "#0072B2")) +
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)") +
guides(fill = "none") + # Layer 8
theme_minimal() # Layer 7
Ý nghĩa kỹ thuật:
Dòng [1] Tính hệ số tương quan cụ thể.
Dòng [9] Vẽ biểu đồ
Dòng [10] Vẽ biểu đồ cột với chiều cao chính xác
Ý nghĩa thống kê:
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 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.
bcn_long_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ả))
) %>%
select(Năm_Biến, Giai_đoạn, starts_with("Z_")) %>%
pivot_longer(
cols = starts_with("Z_"),
names_to = "Metric",
values_to = "Z_Score"
)
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") +
scale_x_continuous(breaks = min(bcn$Năm_Biến,
na.rm = TRUE):max(bcn$Năm_Biến, na.rm = TRUE)) +
scale_color_manual(
values = c("Z_LN_Gop" = "#D55E00", "Z_Tong_Tai_San" = "#0072B2",
"Z_Tong_No" = "#009E73"),
labels = 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ợ")
) +
scale_y_continuous(limits = c(-3, 3)) + # Giữ nguyên giới hạn Y
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()
Ý nghĩa kỹ thuật:
Dòng[1] Chuẩn hóa và Chuyển đổi dữ liệu sang định dạng dài (Long format).
Dòng [13] Vẽ đồ thị.
Dòng [15] Biểu đồ đường và điểm.
Dòng [17] Đường tham chiếu trung bình.
Ý nghĩa thống kê:
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.