CHƯƠNG 1. TỔNG QUAN BỘ DỮ LIỆU

Công ty Cổ phần CokyVina (CKV) là một tổ chức có lịch sử phát triển từ năm 1990, khởi điểm là một doanh nghiệp nhà nước trực thuộc Tổng cục Bưu điện. Sau quá trình chuyển đổi mô hình hoạt động, CKV đã được tái cấu trúc thành công ty cổ phần, trong đó vốn Nhà nước chiếm 49%. Lĩnh vực hoạt động chính của CKV bao gồm: viễn thông (phát triển và quản lý hạ tầng mạng, truyền dẫn), công nghệ thông tin (cung cấp các dịch vụ như EKYC, xác thực khuôn mặt) và hoạt động xuất nhập khẩu vật tư, thiết bị chuyên ngành.

1.1. Giới thiệu bộ dữ liệu

a. Chi tiết bộ dữ liệu

data_ckv <- read.csv("C:/Users/Admin/Documents/DataR/Data_ckv.csv")
 # Xóa các cột lỗi (từ X đến X.7)
data_ckv <- data_ckv %>%
  select(-starts_with("X")) 
# GIỮ LẠI 40 DÒNG ĐẦU TIÊN
data_ckv <- data_ckv[1:40, ]

# --- KIỂM TRA SAU KHI CẮT ---
cat("- Số dòng:", nrow(data_ckv), "\n")
## - Số dòng: 40
cat("- Số cột:", ncol(data_ckv), "\n")
## - Số cột: 13
dim(data_ckv)
## [1] 40 13
str(data_ckv)
## 'data.frame':    40 obs. of  13 variables:
##  $ Quarter           : chr  "Q1/2015" "Q2/2015" "Q3/2015" "Q4/2015" ...
##  $ TongTaiSan        : num  2.14e+11 1.88e+11 1.98e+11 2.13e+11 2.20e+11 ...
##  $ Tongno            : num  1.29e+11 1.12e+11 1.15e+11 1.28e+11 1.34e+11 ...
##  $ QuyMo             : num  26.1 26 26 26.1 26.1 ...
##  $ TangTruongTTS...  : num  NA -0.1203 0.0509 0.0772 0.0311 ...
##  $ TySoNo.TTS.DR.    : num  60.1 59.7 58.2 60.2 61 ...
##  $ TSNH              : num  1.33e+11 1.33e+11 1.52e+11 1.69e+11 1.27e+11 ...
##  $ NoNganHan         : num  1.00e+11 1.10e+11 1.14e+11 1.26e+11 1.31e+11 ...
##  $ VCSH              : num  7.76e+10 7.58e+10 8.27e+10 8.49e+10 8.57e+10 ...
##  $ TSNH.TTS          : num  0.62 0.706 0.769 0.792 0.579 ...
##  $ HeSoDBTC.TTS.VCSH.: num  2.76 2.48 2.39 2.51 2.56 ...
##  $ TysoVCSH.TTS      : num  0.363 0.403 0.418 0.398 0.39 ...
##  $ NoNganHan.TongNo  : num  0.778 0.981 0.988 0.98 0.981 ...

Giới thiệu code: Đoạn code trên thực hiện các bước tiền xử lý dữ liệu cơ bản trước khi tiến hành phân tích:

  • Dòng read.csv() dùng để đọc dữ liệu từ file CSV “Data_ckv.csv” được lưu trong máy tính cá nhân.
  • Lệnh select(-starts_with(“X”)) trong gói dplyr có chức năng loại bỏ các cột có tên bắt đầu bằng ký tự “X”, cụ thể là từ “X tới X7” — đây là các cột phát sinh do lỗi trong quá trình xuất file từ Excel, chứa toàn giá trị NA.
  • Dòng data_ckv <- data_ckv[1:40, ] có chức năng giữ lại 40 dòng đầu tiên, loại bỏ các quan sát bị khuyết từ hàng 41 trở đi.
  • Hai lệnh cat(“- Số dòng:”, nrow(data_ckv), “”) và cat(“- Số cột:”, ncol(data_ckv), “”) in ra số lượng dòng và cột hiện tại sau khi xử lý. Trong đó, Hàm nrow() đếm số dòng (quan sát), ncol() đếm số cột (biến) trong bảng data_ckv
  • Cuối cùng, dim(data_ckv) trả về kích thước của bảng dữ liệu, còn str(data_ckv) hiển thị cấu trúc chi tiết gồm kiểu dữ liệu (numeric, character, factor…) và ví dụ một vài giá trị đầu tiên của mỗi biến.

Giới thiệu bộ dữ liệu: Bộ dữ liệu được sử dụng trong phân tích này được thu thập từ Báo cáo tài chính theo quý của Công ty Cổ phần CokyVina trong giai đoạn từ quý I năm 2015 đến quý IV năm 2024, gồm 40 quan sát tương ứng với 40 quý và 13 biến số tài chính chủ yếu. Trong đó, các biến phản ánh các khía cạnh khác nhau của tình hình tài chính doanh nghiệp như sau:

  • Tổng tài sản (TongTaiSan), Tổng nợ (Tongno) và Vốn chủ sở hữu (VCSH) thể hiện quy mô và cơ cấu tài chính của doanh nghiệp.
  • Tăng trưởng tổng tài sản (TangTruongTTS…) giúp theo dõi mức độ mở rộng hoạt động và hiệu quả sử dụng vốn qua thời gian.
  • Các tỷ số tài chính như Tỷ số nợ/Tổng tài sản (TySoNo.TTS.DR.), Tỷ lệ tài sản ngắn hạn/Tổng tài sản (TSNH.TTS), hay Tỷ lệ vốn chủ sở hữu/Tổng tài sản (TysoVCSH.TTS) phản ánh mức độ an toàn tài chính và khả năng thanh khoản.

b. Hiển thị 10 dòng đầu

head(data_ckv,10)
##    Quarter   TongTaiSan       Tongno   QuyMo TangTruongTTS... TySoNo.TTS.DR.
## 1  Q1/2015 214042197072 128626558166 26.0894               NA          60.09
## 2  Q2/2015 188283218987 112468623209 25.9612          -0.1203          59.73
## 3  Q3/2015 197872379506 115146229314 26.0109           0.0509          58.19
## 4  Q4/2015 213147896266 128276641196 26.0853           0.0772          60.18
## 5  Q1/2016 219783960176 134058235710 26.1159           0.0311          61.00
## 6  Q2/2016 230748108527 148634770669 26.1646           0.0499          64.41
## 7  Q3/2016 219402048429 135615211333 26.1142          -0.0492          61.81
## 8  Q4/2016 198243566957  23514990456 26.0128          -0.0964          11.86
## 9  Q1/2017 182493817080  96624713482 25.9300          -0.0794          52.95
## 10 Q2/2017 177278170496  94630594222 25.9010          -0.0286          53.38
##            TSNH    NoNganHan        VCSH TSNH.TTS HeSoDBTC.TTS.VCSH.
## 1  132727112434 100054839994 77612285106   0.6201             2.7578
## 2  132824453803 110368623209 75814595778   0.7055             2.4835
## 3  152110186350 113761295979 82726150192   0.7687             2.3919
## 4  168814373995 125703974027 84871228070   0.7920             2.5114
## 5  127348368660 131453862365 85725724446   0.5794             2.5638
## 6  127171356165 146030397324 82113337858   0.5511             2.8101
## 7  118252158383  93995786810 83786837096   0.5390             2.6186
## 8  111122743129    303132423 85419851209   0.5605             2.3208
## 9   95533409248  73412855449 85869103598   0.5235             2.1253
## 10  92598075484  72923736189 82647576274   0.5223             2.1450
##    TysoVCSH.TTS NoNganHan.TongNo
## 1        0.3626           0.7779
## 2        0.4027           0.9813
## 3        0.4181           0.9880
## 4        0.3982           0.9799
## 5        0.3900           0.9806
## 6        0.3559           0.9825
## 7        0.3819           0.6931
## 8        0.4309           0.0129
## 9        0.4705           0.7598
## 10       0.4662           0.7706

Lệnh head(data_ckv, 10) được sử dụng để hiển thị 10 dòng đầu tiên của bộ dữ liệu data_ckv, cụ thể:

  • Hàm head() dùng để xem nhanh cấu trúc và giá trị mẫu của dữ liệu.
  • Tham số thứ hai (10) cho biết số lượng dòng muốn hiển thị, mặc định nếu không ghi thì sẽ là 6 dòng đầu tiên.

1.2.Xử lý dữ liệu

a. Kiểm tra dữ liệu khuyết NA

# --- KIỂM TRA GIÁ TRỊ NA  ---
colSums(is.na(data_ckv))
##            Quarter         TongTaiSan             Tongno              QuyMo 
##                  0                  0                  0                  0 
##   TangTruongTTS...     TySoNo.TTS.DR.               TSNH          NoNganHan 
##                  1                  0                  0                  0 
##               VCSH           TSNH.TTS HeSoDBTC.TTS.VCSH.       TysoVCSH.TTS 
##                  0                  0                  0                  0 
##   NoNganHan.TongNo 
##                  0

Giải thích code: Để kiểm tra các giá trị khuyết, nhóm chúng em đã thực hiện lệnh sau:

  • Hàm is.na(data_ckv) tạo ra một ma trận logic có cùng kích thước với bộ dữ liệu “data_ckv”. Trong đó, mỗi ô có giá trị “TRUE” nếu phần tử đó bị thiếu dữ liệu (NA), và FALSE nếu có giá trị hợp lệ.
  • Hàm colSums() sau đó được sử dụng để tính tổng số giá trị TRUE (tức là số lượng NA) trong từng cột. Cụ thể, colSums() cộng tất cả các giá trị trong mỗi cột, với quy ước TRUE = 1, FALSE = 0.
  • Kết quả trả về là một vector, trong đó tên mỗi phần tử là tên biến, và giá trị tương ứng là số lượng NA của biến đó.

Kết quả: Từ bảng kết quả trên, ta thấy chỉ có một giá trị bị thiếu (NA) ở biến TangTruongTTS do biến “tăng trưởng tổng tài sản” được tính theo tỷ lệ thay đổi qua các quý, nên quý đầu tiên (Q1/2015) không có dữ liệu của quý trước để so sánh từ đó dẫn đến giá trị bị thiếu.

b. Xử lý dữ liệu bị khuyết(NA)

# --- THAY THẾ GIÁ TRỊ NA BẰNG TRUNG BÌNH CỘNG ---

# Tính giá trị trung bình của cột (bỏ qua NA)
mean_tts <- mean(data_ckv$TangTruongTTS..., na.rm = TRUE)

# Thay thế NA bằng giá trị trung bình
data_ckv$TangTruongTTS...[is.na(data_ckv$TangTruongTTS...)] <- mean_tts

# --- KIỂM TRA LẠI ---
cat("Số lượng NA còn lại trong từng cột:\n")
## Số lượng NA còn lại trong từng cột:
print(colSums(is.na(data_ckv)))
##            Quarter         TongTaiSan             Tongno              QuyMo 
##                  0                  0                  0                  0 
##   TangTruongTTS...     TySoNo.TTS.DR.               TSNH          NoNganHan 
##                  0                  0                  0                  0 
##               VCSH           TSNH.TTS HeSoDBTC.TTS.VCSH.       TysoVCSH.TTS 
##                  0                  0                  0                  0 
##   NoNganHan.TongNo 
##                  0

Giải thích code:

  • Lệnh mean(data_ckv$TangTruongTTS…, na.rm = TRUE) dùng để tính giá trị trung bình của biến TangTruongTTS…, trong đó tham số “na.rm = TRUE” giúp bỏ qua giá trị bị thiếu (NA) khi tính trung bình.
  • Câu lệnh data_ckv$TangTruongTTS…[is.na(…)] <- mean_tts có chức năng thay thế giá trị NA bằng trung bình vừa tính được, đảm bảo cột này không còn thiếu dữ liệu.
  • Cuối cùng, colSums(is.na(data_ckv)) kết hợp với print() được dùng để kiểm tra lại toàn bộ bộ dữ liệu xem còn giá trị NA nào không và in bảng kết quả giúp xác nhận bước xử lý đã hoàn tất.

Kết quả:

  • Biến Tăng trưởng tổng tài sản (%) có duy nhất một giá trị bị khuyết tại quý 1/2015. Do đây là quý đầu tiên trong chuỗi thời gian, giá trị NA được xử lý bằng phương pháp thay thế trung bình cộng, với giá trị thay thế là 0.003487179. Sau xử lý, toàn bộ bộ dữ liệu không còn giá trị bị khuyết.

c. Kiểm tra trùng lặp

# --- KIỂM TRA TRÙNG LẶP ---
duplicated_rows <- sum(duplicated(data_ckv))
cat("Số dòng trùng lặp:", duplicated_rows, "\n")
## Số dòng trùng lặp: 0

Nhóm chúng em sử dụng lệnh “um(duplicated(data_ckv))” để kiểm tra dữ liệu trùng lặp và kết quả đạt được là bộ dữ liệu không có xuất hiện trùng lặp.

d. Chuẩn hóa tên biến

# --- CHUẨN HÓA TÊN BIẾN ---

# Hiển thị tên biến gốc

names(data_ckv)
##  [1] "Quarter"            "TongTaiSan"         "Tongno"            
##  [4] "QuyMo"              "TangTruongTTS..."   "TySoNo.TTS.DR."    
##  [7] "TSNH"               "NoNganHan"          "VCSH"              
## [10] "TSNH.TTS"           "HeSoDBTC.TTS.VCSH." "TysoVCSH.TTS"      
## [13] "NoNganHan.TongNo"
# Dùng gsub() để loại bỏ ký tự đặc biệt, khoảng trắng, thay bằng dấu gạch dưới

names(data_ckv) <- gsub("[^[:alnum:]]+", "_", names(data_ckv))

# Đưa tên về chữ thường cho đồng nhất

names(data_ckv) <- tolower(names(data_ckv))

# Kiểm tra lại danh sách tên biến sau khi chuẩn hóa

names(data_ckv)
##  [1] "quarter"            "tongtaisan"         "tongno"            
##  [4] "quymo"              "tangtruongtts_"     "tysono_tts_dr_"    
##  [7] "tsnh"               "nonganhan"          "vcsh"              
## [10] "tsnh_tts"           "hesodbtc_tts_vcsh_" "tysovcsh_tts"      
## [13] "nonganhan_tongno"

Giải thích code:

  • Lệnh names(data_ckv) hiển thị danh sách tên biến gốc trong bộ dữ liệu.
  • Lệnh gsub(“[1]+”, “”, names(data_ckv)) dùng hàm thay thế ký tự đặc biệt. Trong đó, ”[2]+” nghĩa là mọi ký tự không phải chữ cái hoặc số (ví dụ: dấu chấm, khoảng trắng, ký tự đặc biệt) sẽ được thay thế bằng dấu gạch dưới “” để giúp tên biến dễ đọc hơn và phù hợp với chuẩn R.
  • Lệnh tolower(names(data_ckv)) chuyển toàn bộ tên biến sang chữ thường, giúp đồng nhất định dạng, tránh lỗi khi gọi tên biến.

Kết quả: Kết quả cho thấy tên biến đã được chuẩn hóa thành dạng nhất quán ví dụ như:

  • Biến “TongTaiSan” đổi thành “tongtaisan”
  • Biến “TySoNo.TTS.DR.” đổi thành “tysono_tts_dr_”
  • Biến “HeSoDBTC.TTS.VCSH.” đổi thành “hesodbtc_tts_vcsh_”

e. Chuyển đổi kiểu dữ liệu và kiểm tra kiểu dữ liệu của biến “Quarter”

# liệt kê dữ liệu cột quarter
unique(data_ckv$quarter)
##  [1] "Q1/2015" "Q2/2015" "Q3/2015" "Q4/2015" "Q1/2016" "Q2/2016" "Q3/2016"
##  [8] "Q4/2016" "Q1/2017" "Q2/2017" "Q3/2017" "Q4/2017" "Q1/2018" "Q2/2018"
## [15] "Q3/2018" "Q4/2018" "Q1/2019" "Q2/2019" "Q3/2019" "Q4/2019" "Q1/2020"
## [22] "Q2/2020" "Q3/2020" "Q4/2020" "Q1/2021" "Q2/2021" "Q3/2021" "Q4/2021"
## [29] "Q1/2022" "Q2/2022" "Q3/2022" "Q4/2022" "Q1/2023" "Q2/2023" "Q3/2023"
## [36] "Q4/2023" "Q1/2024" "Q2/2024" "Q3/2024" "Q4/2024"

Để xem dữ liệu cột “Quarter”, nhóm chúng em dùng lệnh “unique(data_ckv$quarter)” để liệt kê chi tiết dữ liệu lấy từ cột “Quarter” ở trong bảng có tên “data_ckv”.

# --- TÁCH QUÝ VÀ NĂM TỪ CỘT QUARTER ---
library(stringr)

data_ckv <- data_ckv %>%
  mutate(
    quarter = as.character(quarter),              # ép kiểu để xử lý regex
    quarter = str_trim(quarter),                  # xóa khoảng trắng thừa nếu có
    Quarter = str_replace_all(quarter, "⁄", "/"), # đổi ký tự chia đặc biệt thành '/'
    qtr  = as.integer(str_extract(quarter, "(?<=Q)\\d")),   # lấy số quý
    year = as.integer(str_extract(quarter, "(?<=/)\\d{4}")) # lấy năm
  )

# Kiểm tra kết quả
data_ckv %>% select(quarter, qtr, year) %>% head(10)
##    quarter qtr year
## 1  Q1/2015   1 2015
## 2  Q2/2015   2 2015
## 3  Q3/2015   3 2015
## 4  Q4/2015   4 2015
## 5  Q1/2016   1 2016
## 6  Q2/2016   2 2016
## 7  Q3/2016   3 2016
## 8  Q4/2016   4 2016
## 9  Q1/2017   1 2017
## 10 Q2/2017   2 2017

Ở phần này, mục đích nhằm tách cột Quarter thành 2 cột riêng thể hiện Quý và Năm tương ứng, nhóm chúng em đã thực hiện các thao tác sau đây:

  • as.character(quarter): Ép kiểu về character giúp dễ xử lý chuỗi.
  • str_trim(quarter): Xóa khoảng trắng dư thừa ở đầu hoặc cuối chuỗi,tránh lỗi khi trích xuất thông tin.
  • str_replace_all(quarter, “⁄”, “/”): Thay các ký tự chia lạ (⁄) bằng ký tự / chuẩn để regex nhận diện chính xác.
  • str_extract(quarter, “(?<=Q)\d”): trong đó (?<=Q)\d có nghĩa là “lấy chữ số xuất hiện ngay sau chữ Q”. Kết quả là số quý (1–4).
  • str_extract(quarter, “(?<=/)\d{4}”): trong đó (?<=/)\d{4} có nghĩa là “lấy 4 chữ số xuất hiện ngay sau dấu /”.
  • data_ckv %>% select(quarter, qtr, year) %>% head(10): ở đây nhóm em kết hợp chọn bảng data_ckv và chỉ lấy quarter, qtr, year bằng lệnh select kết hợp hiển thị 10 dòng đầu bằng lệnh head.

1.3. Tổng kết

mo_ta_bien <- data.frame(
  Bien = c("quarter", "tongtaisan", "tongno", "quymo", 
           "tangtruongtts_", "tysono_tts_dr_", "tsnh", "nonganhan", 
           "vcsh", "tsnh_tts", "hesodbtc_tts_vcsh_", 
           "tysovcsh_tts", "nonganhan_tongno"),
  
  Kieu_Du_Lieu = c("character", "numeric", "numeric", "numeric",
                   "numeric", "numeric", "numeric", "numeric",
                   "numeric", "numeric", "numeric",
                   "numeric", "numeric"),
  
  Y_Nghia = c(
    "Quý quan sát (theo dạng thời gian Q1, Q2, Q3, Q4 hằng năm)",
    "Tổng tài sản của doanh nghiệp trong kỳ",
    "Tổng nợ phải trả trong kỳ",
    "Quy mô doanh nghiệp (ước tính qua tổng tài sản log hoặc gốc)",
    "Tốc độ tăng trưởng tổng tài sản so với kỳ trước",
    "Tỷ số nợ trên tổng tài sản (Debt Ratio)",
    "Tài sản ngắn hạn của doanh nghiệp",
    "Nợ ngắn hạn (phải trả trong vòng 1 năm)",
    "Vốn chủ sở hữu (Equity)",
    "Tỷ lệ tài sản ngắn hạn trên tổng tài sản",
    "Hệ số đảm bảo tài chính giữa tổng tài sản và vốn chủ sở hữu",
    "Tỷ số vốn chủ sở hữu trên tổng tài sản",
    "Tỷ lệ nợ ngắn hạn trên tổng nợ"
  )
)

# Hiển thị bảng 
mo_ta_bien %>%
  kbl(caption = "Bảng 1.1: Mô tả các biến trong bộ dữ liệu CKV", 
      align = c('c', 'c', 'l'),
      col.names = c("Biến", "Kiểu dữ liệu", "Ý nghĩa")) %>%
  kable_paper(full_width = F, lightable_options = "striped") %>%
  column_spec(1, bold = TRUE, width = "5em") %>%
  column_spec(2, width = "6em") %>%
  column_spec(3, width = "30em") %>%
  row_spec(0, bold = TRUE, background = "#BFD3E6")
Bảng 1.1: Mô tả các biến trong bộ dữ liệu CKV
Biến Kiểu dữ liệu Ý nghĩa
quarter character Quý quan sát (theo dạng thời gian Q1, Q2, Q3, Q4 hằng năm)
tongtaisan numeric Tổng tài sản của doanh nghiệp trong kỳ
tongno numeric Tổng nợ phải trả trong kỳ
quymo numeric Quy mô doanh nghiệp (ước tính qua tổng tài sản log hoặc gốc)
tangtruongtts_ numeric Tốc độ tăng trưởng tổng tài sản so với kỳ trước
tysono_tts_dr_ numeric Tỷ số nợ trên tổng tài sản (Debt Ratio)
tsnh numeric Tài sản ngắn hạn của doanh nghiệp
nonganhan numeric Nợ ngắn hạn (phải trả trong vòng 1 năm)
vcsh numeric Vốn chủ sở hữu (Equity)
tsnh_tts numeric Tỷ lệ tài sản ngắn hạn trên tổng tài sản
hesodbtc_tts_vcsh_ numeric Hệ số đảm bảo tài chính giữa tổng tài sản và vốn chủ sở hữu
tysovcsh_tts numeric Tỷ số vốn chủ sở hữu trên tổng tài sản
nonganhan_tongno numeric Tỷ lệ nợ ngắn hạn trên tổng nợ

Sau khi tiền xử lý dữ liệu, chúng em tạo bảng tổng hợp kết quả và mô tả ý nghĩa các biến, cụ thể:

  • Chúng em sử dụng data.frame() để liệt kê tên biến (Bien), kiểu dữ liệu (Kieu_Du_Lieu) và ý nghĩa từng biến (Y_Nghia).
    • Thư viện kableExtra được dùng để trình bày bảng đẹp mắt: kbl() tạo bảng cơ bản với tiêu đề và căn chỉnh cột, kable_paper() thêm style dạng “striped”, column_spec() điều chỉnh độ rộng và in đậm cột, row_spec() định dạng hàng tiêu đề với màu nền và chữ đậm.
    • Kết quả là một bảng tổng hợp trực quan, giúp người đọc dễ dàng nắm được cấu trúc và nội dung các biến trong bộ dữ liệu CKV.

CHƯƠNG 2. PHÂN TÍCH DỮ LIỆU

2.1. Thống kê mô tả

Mục tiêu: Phần này nhằm cung cấp cái nhìn tổng quan về các đặc trưng thống kê cơ bản của từng biến trong bộ dữ liệu CKV, bao gồm trung bình, trung vị, độ lệch chuẩn, phương sai, giá trị nhỏ nhất và lớn nhất, cũng như các đặc trưng hình dạng phân bố như độ lệch (skewness) và độ nhọn (kurtosis).

a. Thống kê mô tả từng biến

Biến Tổng tài sản (tongtaisan)

# Tính toán các chỉ số thống kê cơ bản
mean_tts   <- mean(data_ckv$tongtaisan, na.rm = TRUE)       # Giá trị trung bình
median_tts <- median(data_ckv$tongtaisan, na.rm = TRUE)     # Trung vị
min_tts    <- min(data_ckv$tongtaisan, na.rm = TRUE)        # Giá trị nhỏ nhất
max_tts    <- max(data_ckv$tongtaisan, na.rm = TRUE)        # Giá trị lớn nhất
sd_tts     <- sd(data_ckv$tongtaisan, na.rm = TRUE)         # Độ lệch chuẩn
var_tts    <- var(data_ckv$tongtaisan, na.rm = TRUE)        # Phương sai
mad_tts    <- mad(data_ckv$tongtaisan, na.rm = TRUE)        # Độ lệch tuyệt đối trung vị
iqr_tts    <- IQR(data_ckv$tongtaisan, na.rm = TRUE)        # Khoảng tứ phân vị
range_tts  <- range(data_ckv$tongtaisan, na.rm = TRUE)      # Biên độ giá trị
skew_tts   <- moments::skewness(data_ckv$tongtaisan, na.rm = TRUE)   # Độ lệch (skewness)
kurt_tts   <- moments::kurtosis(data_ckv$tongtaisan, na.rm = TRUE)   # Độ nhọn (kurtosis)

# Tổng hợp kết quả vào bảng
thongke_tts <- data.frame(
  Chỉ_Số = c("Trung bình", "Trung vị", "Nhỏ nhất", "Lớn nhất",
              "Độ lệch chuẩn", "Phương sai", "MAD", 
              "IQR", "Biên độ", "Độ lệch (Skewness)", "Độ nhọn (Kurtosis)"),
  Giá_Trị = c(mean_tts, median_tts, min_tts, max_tts, 
              sd_tts, var_tts, mad_tts, iqr_tts,
              diff(range_tts), skew_tts, kurt_tts)
)

# Hiển thị bảng kết quả đẹp
thongke_tts %>%
  kbl(caption = "Bảng 2.1: Thống kê mô tả biến Tổng tài sản (tongtaisan)",
      align = c("l", "r"),
      col.names = c("Chỉ số thống kê", "Giá trị")) %>%
  kable_paper(full_width = F, lightable_options = "striped") %>%
  row_spec(0, bold = TRUE, background = "#BFD3E6")
Bảng 2.1: Thống kê mô tả biến Tổng tài sản (tongtaisan)
Chỉ số thống kê Giá trị
Trung bình 1.775841e+11
Trung vị 1.749598e+11
Nhỏ nhất 1.309533e+11
Lớn nhất 2.314463e+11
Độ lệch chuẩn 2.890741e+10
Phương sai 8.356385e+20
MAD 3.532826e+10
IQR 4.886679e+10
Biên độ 1.004930e+11
Độ lệch (Skewness) 2.202354e-01
Độ nhọn (Kurtosis) 1.819651e+00

Ở phần này để phân tích thống kê mô tả cho biến Tổng tài sản, nhóm chúng em đã thực hiện các lệnh sau đây:

  • Lệnh mean() và median() lần lượt được dùng để tính giá trị trung bình và trung vị của biến tongtaisan.
  • min() và max() giúp xác định giá trị nhỏ nhất và lớn nhất trong tập dữ liệu.
  • sd() và var() cho biết mức độ phân tán dữ liệu, tương ứng là độ lệch chuẩn và phương sai.
  • mad() (Median Absolute Deviation) đo lường độ lệch tuyệt đối trung vị, giúp nhận diện mức dao động ổn định hơn trong trường hợp có ngoại lệ.
  • IQR() xác định khoảng tứ phân vị (Interquartile Range) — thể hiện phạm vi chứa 50% dữ liệu trung tâm.
  • range() dùng để lấy giới hạn dưới và trên, sau đó diff(range_tts) được sử dụng để tính biên độ giá trị.
  • Cuối cùng, hai hàm moments::skewness() và moments::kurtosis() trong gói moments được sử dụng để đo độ lệch (skewness) và độ nhọn (kurtosis) của phân phối, qua đó phản ánh hình dạng dữ liệu.

Kết quả:

  • Kết quả cho thấy giá trị trung bình của tổng tài sản CKV trong giai đoạn quan sát đạt khoảng 177.584 tỷ đồng, trong khi trung vị là 174.960 tỷ đồng. Hai giá trị này khá gần nhau, cho thấy phân phối dữ liệu tương đối đối xứng, không bị lệch nhiều về một phía.
  • Giá trị nhỏ nhất và lớn nhất lần lượt là 130.953 tỷ đồng và 231.446 tỷ đồng, thể hiện mức chênh lệch đáng kể (biên độ khoảng 100.493 tỷ đồng) — điều này phản ánh quy mô tài sản của công ty có sự biến động tương đối mạnh qua các quý.
  • Độ lệch chuẩn (2.89×10¹⁰) và IQR (4.89×10¹⁰) đều cho thấy mức độ phân tán của dữ liệu ở mức trung bình đến cao, tức là quy mô tổng tài sản không ổn định hoàn toàn mà có những giai đoạn tăng trưởng hoặc giảm nhẹ.
  • Về độ lệch (skewness = 0.22), giá trị dương nhỏ cho thấy phân phối tổng tài sản hơi lệch phải, tức là có một số quý công ty đạt tổng tài sản cao hơn mức trung bình. Độ nhọn (kurtosis = 1.82) nhỏ hơn 3 cho thấy phân phối tương đối bẹt (platykurtic), nghĩa là dữ liệu không tập trung quá nhiều quanh giá trị trung tâm.

Biến Tổng nợ(tongno)

library(psych)
thongke_tongno <- describe(data_ckv$tongno)

# Hiển thị kết quả gọn, chỉ chọn một số chỉ số chính
thongke_tongno_chon <- thongke_tongno %>%
  select(n, mean, median, sd, min, max, range, skew, kurtosis, se)

# Đổi tên cột tiếng Việt cho dễ đọc
colnames(thongke_tongno_chon) <- c(
  "Số quan sát", "Trung bình", "Trung vị", "Độ lệch chuẩn",
  "Nhỏ nhất", "Lớn nhất", "Biên độ", "Độ lệch (Skewness)",
  "Độ nhọn (Kurtosis)", "Sai số chuẩn"
)

# Hiển thị bảng kết quả đẹp
thongke_tongno_chon %>%
  kbl(caption = "Bảng 2.2: Thống kê mô tả biến Tổng nợ (tongno)",
      align = "r",
      digits = 3) %>%
  kable_paper(full_width = F, lightable_options = "striped") %>%
  row_spec(0, bold = TRUE, background = "#BFD3E6")
Bảng 2.2: Thống kê mô tả biến Tổng nợ (tongno)
Số quan sát Trung bình Trung vị Độ lệch chuẩn Nhỏ nhất Lớn nhất Biên độ Độ lệch (Skewness) Độ nhọn (Kurtosis) Sai số chuẩn
X1 40 95123206955 87849724545 27224497420 23514990456 148634770669 125119780213 0.009 -0.39 4304571000

Ở phần này, chúng em sử dụng thư viện psych – một gói thống kê chuyên dụng trong R – để mô tả chi tiết biến Tổng nợ (tongno) thông qua hàm describe().

  • Hàm describe() tự động tính toán đồng thời nhiều chỉ số như: số lượng quan sát, trung bình, trung vị, độ lệch chuẩn, min, max, skewness, kurtosis và sai số chuẩn. Việc sử dụng hàm này giúp tiết kiệm thao tác so với việc gọi từng hàm riêng lẻ như ở mục trên.
  • Sau khi tính toán, chúng em chỉ chọn ra các chỉ số quan trọng bằng câu lệnh select(n, mean, median, sd, min, max, range, skew, kurtosis, se).
  • Và cuối cùng, em dùng hàm colnames() được sử dụng để đổi tên các cột sang tiếng Việt, giúp bảng kết quả dễ hiểu

Mô tả và diễn giải kết quả:

  • Kết quả cho thấy Tổng nợ trung bình của CKV trong giai đoạn 2015–2024 đạt khoảng 95.1 nghìn tỷ đồng, trong khi trung vị thấp hơn (87.8 nghìn tỷ), phản ánh sự lệch nhẹ về phía phải – tức một số quý có tổng nợ tăng đột biến.
  • Độ lệch chuẩn khoảng 27.2 nghìn tỷ, thể hiện mức biến động khá lớn giữa các quý. Giá trị biên độ hơn 125 nghìn tỷ đồng cho thấy sự khác biệt đáng kể giữa các giai đoạn có nợ cao nhất và thấp nhất.
  • Độ lệch (Skewness = 0.009) gần bằng 0 cho thấy phân phối tương đối đối xứng, trong khi độ nhọn (Kurtosis = -0.39) nhỏ hơn 3 cho thấy phân phối dẹt hơn so với chuẩn, tức dữ liệu phân tán đều và ít cực trị.

Biến vốn chủ sở hữu(vcsh)

library(pastecs)
library(dplyr)
library(kableExtra)

# --- 2.2.3 THỐNG KÊ MÔ TẢ BIẾN VỐN CHỦ SỞ HỮU ---
thongke_vcsh <- stat.desc(data_ckv["vcsh"], basic = TRUE, desc = TRUE, norm = TRUE)

# Chuyển kết quả sang data frame
thongke_vcsh_df <- data.frame(
  Chỉ_tiêu = rownames(thongke_vcsh),
  Giá_trị = round(thongke_vcsh$vcsh, 3)
)
rownames(thongke_vcsh_df) <- NULL

# Hiển thị bảng
thongke_vcsh_df %>%
  kbl(caption = "Bảng 2.3: Thống kê mô tả biến Vốn chủ sở hữu (vcsh)",
      align = "lcr") %>%
  kable_paper(full_width = FALSE, lightable_options = "striped") %>%
  row_spec(0, bold = TRUE, background = "#BFD3E6")
Bảng 2.3: Thống kê mô tả biến Vốn chủ sở hữu (vcsh)
Chỉ_tiêu Giá_trị
nbr.val 4.000000e+01
nbr.null 0.000000e+00
nbr.na 0.000000e+00
min 7.555583e+10
max 8.874570e+10
range 1.318988e+10
sum 3.317836e+12
median 8.325649e+10
mean 8.294589e+10
SE.mean 5.508418e+08
CI.mean.0.95 1.114183e+09
var 1.213707e+19
std.dev 3.483829e+09
coef.var 4.200000e-02
skewness -3.480000e-01
skew.2SE -4.660000e-01
kurtosis -8.360000e-01
kurt.2SE -5.710000e-01
normtest.W 9.660000e-01
normtest.p 2.660000e-01

Trong phần này, chúng em sử dụng thư viện pastecs, một gói chuyên dụng trong thống kê mô tả, với hàm stat.desc() để phân tích biến Vốn chủ sở hữu (vcsh).

  • Tham số basic = TRUE yêu cầu tính các chỉ số cơ bản như số lượng, giá trị nhỏ nhất, lớn nhất, trung bình, trung vị, v.v.
  • Tham số desc = TRUE cho phép mở rộng thêm các chỉ tiêu mô tả như độ lệch chuẩn, phương sai, hệ số biến thiên (CV).
  • Tham số norm = TRUE thực hiện kiểm định phân phối chuẩn (dựa trên thống kê Shapiro–Wilk) và tính các chỉ số đặc trưng hình dạng như skewness (độ lệch) và kurtosis (độ nhọn).

Kết quả trả về từ stat.desc() được chuyển đổi sang dạng data frame bằng hàm data.frame() để tiện trình bày. Các giá trị được làm tròn 3 chữ số thập phân nhằm đảm bảo tính nhất quán và dễ đọc.

Diễn giải kết quả

  • Kết quả cho thấy vốn chủ sở hữu trung bình của CKV trong giai đoạn 2015–2024 đạt khoảng 82.95 nghìn tỷ đồng, gần tương đồng với trung vị (83.26 nghìn tỷ đồng), phản ánh phân phối khá cân đối và ít bị lệch.
  • Độ lệch chuẩn chỉ khoảng 3.48 nghìn tỷ đồng, tương đương hệ số biến thiên (CV) là 4.2%, cho thấy vốn chủ sở hữu ổn định qua các quý, ít biến động hơn so với tổng tài sản và tổng nợ.
  • Giá trị skewness âm (-0.35) thể hiện phân phối hơi lệch trái, tức có một vài quý vốn chủ thấp hơn mức trung bình, trong khi kurtosis âm (-0.84) cho thấy phân phối dẹt, ít cực trị.
  • Kiểm định Shapiro–Wilk (p = 0.266 > 0.05) cho thấy không có bằng chứng bác bỏ giả thuyết phân phối chuẩn, tức biến “Vốn chủ sở hữu” có thể coi là phân phối gần chuẩn, phù hợp cho các phân tích thống kê tiếp theo.

b. Phân tích theo quý và năm

Tăng trường trung bình tài sản theo năm

# --- Tăng trưởng trung bình tài sản theo năm ---
tangtruong_taisan_nam <- data_ckv %>%
  group_by(year) %>%
  summarise(
    mean_growth = mean(tangtruongtts_, na.rm = TRUE),
    sd_growth = sd(tangtruongtts_, na.rm = TRUE)
  )

knitr::kable(tangtruong_taisan_nam, caption = "Bảng: Tốc độ tăng trưởng trung bình tài sản theo năm")
Bảng: Tốc độ tăng trưởng trung bình tài sản theo năm
year mean_growth sd_growth
2015 0.0028218 0.0875653
2016 -0.0161500 0.0686234
2017 0.0118500 0.0828293
2018 0.0139500 0.1294899
2019 -0.0145500 0.1843542
2020 -0.0416000 0.0803912
2021 0.0216500 0.0959921
2022 -0.0184250 0.1252931
2023 -0.0023500 0.0631592
2024 0.0776750 0.1567805

Đầu tiên, nhóm chúng em sử dụng hàm group_by(year) trong dplyr để phân nhóm dữ liệu theo từng năm, giúp phân tích sự thay đổi của các chỉ tiêu tài chính theo thời gian.

Tiếp theo, hàm summarise() được dùng để tính giá trị trung bình (mean_growth) và độ lệch chuẩn (sd_growth) của biến tăng trưởng tổng tài sản (tangtruongtts_) trong từng năm.

  • Tham số na.rm = TRUE đảm bảo loại bỏ các giá trị bị thiếu trước khi tính toán, giúp kết quả chính xác hơn.

Kết quả và diễn giải

Năm 2015 – 2024 cho thấy mức tăng trưởng trung bình của tổng tài sản có sự biến động đáng kể qua các giai đoạn: một số năm ghi nhận tăng trưởng dương, trong khi một số khác lại sụt giảm. Cụ thể:

  • Giai đoạn 2015–2017: trong giai đoạn này thì tăng trưởng duy trì mức tích cực nhẹ (khoảng 0.2%–1.1%), phản ánh giai đoạn ổn định sau thời kỳ đầu niêm yết.
  • Giai đoạn 2019–2020: ở giai đoạn này xuất hiện mức giảm mạnh (đặc biệt năm 2020: -4.16%) có thể liên quan đến tác động của đại dịch Covid-19, khiến quy mô tài sản bị chững lại.
  • Năm 2024: ở năm này ghi nhận tăng trưởng đột biến 7.76%, thể hiện dấu hiệu phục hồi mạnh mẽ về quy mô tài sản sau giai đoạn biến động.
  • Độ lệch chuẩn dao động từ 0.06–0.18, cho thấy mức độ biến động nội tại của chỉ số tăng trưởng tài sản qua từng năm vẫn ở mức vừa phải, không quá bất ổn.

So sánh tăng trưởng giữa hai giai đoạn (2015–2019 vs. 2020–2024)

# --- Tạo biến giai đoạn ---
data_ckv <- data_ckv %>%
  mutate(
    period = ifelse(year <= 2019, "Trước 2020", "Từ 2020 trở đi")
  )

# --- Tính trung bình tăng trưởng theo giai đoạn ---
growth_period <- data_ckv %>%
  group_by(period) %>%
  summarise(
    mean_growth = mean(tangtruongtts_, na.rm = TRUE),
    sd_growth = sd(tangtruongtts_, na.rm = TRUE)
  )

knitr::kable(growth_period, caption = "Bảng: So sánh tăng trưởng tài sản giữa hai giai đoạn")
Bảng: So sánh tăng trưởng tài sản giữa hai giai đoạn
period mean_growth sd_growth
Trước 2020 -0.0004156 0.1059378
Từ 2020 trở đi 0.0073900 0.1058929

Diễn giải code: Ở phần này, chúng em tạo biến giai đoạn (period), trong đó:

  • Nếu năm (year) ≤ 2019, quan sát được gán nhãn “Trước 2020”.
  • Ngược lại, nếu năm ≥ 2020, được gán nhãn “Từ 2020 trở đi”. → Mục đích là chia dữ liệu thành hai giai đoạn để tiện so sánh xu hướng tăng trưởng tài sản trước và sau mốc 2020 (thường xem là thời điểm ảnh hưởng bởi Covid-19 và giai đoạn chuyển biến trong hoạt động doanh nghiệp).

Tiếp theo đó để tính thống kê, chúng em đã thực hiện các thao tác sau đây:

  • group_by(period) giúp gom nhóm dữ liệu theo từng giai đoạn (trước và sau 2020).
  • summarise() tính hai chỉ tiêu thống kê cho mỗi giai đoạn:
  • mean_growth: Giá trị trung bình của tốc độ tăng trưởng tài sản (tangtruongtts_).
  • sd_growth: Độ lệch chuẩn, thể hiện mức độ biến động của tăng trưởng trong từng giai đoạn.
  • na.rm = TRUE đảm bảo bỏ qua các giá trị thiếu (NA) để kết quả không bị sai lệch. → Kết quả trả về một bảng tóm tắt gồm hai hàng (mỗi giai đoạn một hàng) và hai cột số liệu chính.

Nhận xét: Kết quả cho thấy tốc độ tăng trưởng tài sản trung bình của công ty CKV có sự khác biệt nhẹ giữa hai giai đoạn.

  • Trước năm 2020, tốc độ tăng trưởng trung bình gần như bằng 0 (≈ -0.0004), phản ánh giai đoạn ổn định nhưng không có nhiều tăng trưởng.
  • Từ năm 2020 trở đi, giá trị trung bình tăng lên nhẹ (≈ 0.0074), cho thấy doanh nghiệp có xu hướng phục hồi và mở rộng tài sản sau đại dịch, dù độ biến động (độ lệch chuẩn ≈ 0.106) vẫn tương đương giai đoạn trước.

c. Hệ số tương quan giữa các biến tổng tài sản, tổng nợ và vốn chủ

# --- Ma trận tương quan ---
library(corrplot)

data_tuongquan <- data_ckv %>%
  select(tongtaisan, tongno, vcsh, tysono_tts_dr_, tysovcsh_tts, nonganhan_tongno)

cor_matrix <- cor(data_tuongquan, use = "complete.obs")

# Hiển thị bảng tương quan
knitr::kable(cor_matrix, caption = "Bảng: Ma trận tương quan giữa các chỉ tiêu tài chính của CKV")
Bảng: Ma trận tương quan giữa các chỉ tiêu tài chính của CKV
tongtaisan tongno vcsh tysono_tts_dr_ tysovcsh_tts nonganhan_tongno
tongtaisan 1.0000000 0.8065567 0.3600881 0.6280981 -0.9643658 -0.0076843
tongno 0.8065567 1.0000000 0.1812405 0.8954284 -0.7756607 0.2937803
vcsh 0.3600881 0.1812405 1.0000000 0.0251669 -0.1357018 -0.0710634
tysono_tts_dr_ 0.6280981 0.8954284 0.0251669 1.0000000 -0.6604711 0.6309582
tysovcsh_tts -0.9643658 -0.7756607 -0.1357018 -0.6604711 1.0000000 -0.0350065
nonganhan_tongno -0.0076843 0.2937803 -0.0710634 0.6309582 -0.0350065 1.0000000

Sau khi phân tích thống kê từng biến riêng lẻ, việc tính toán ma trận tương quan giúp đánh giá mối quan hệ tuyến tính giữa các chỉ tiêu tài chính chính của công ty CKV. Qua đó, có thể nhận biết các biến có xu hướng biến động cùng chiều hay ngược chiều, và mức độ gắn kết của chúng.Trong đó, chúng em chọn ra 6 biến như sau: tongtaisan, tongno, tongno, tysono_tts_dr, tysovcsh_tts, nonganhan_tongno.

Để tính hệ số tương quan Pearson cho từng cặp biến, chúng em dùng hàm cor() và để loại bỏ những giá trị bị thiếu (NA) thì dùng use = “complete.obs”. Kết quả trả về một ma trận 6×6, trong đó mỗi ô biểu thị hệ số tương quan giữa hai biến.

Nhận xét:

  • Tổng tài sản có tương quan rất mạnh và cùng chiều với Tổng nợ (r = 0.81), cho thấy khi quy mô tài sản tăng, nợ cũng tăng theo — đặc trưng phổ biến ở doanh nghiệp sử dụng đòn bẩy tài chính.
  • Ngược lại, Tổng tài sản có tương quan ngược chiều mạnh với tỷ số vốn chủ sở hữu trên tổng tài sản (r = -0.96), điều này phản ánh khi quy mô tài sản tăng, tỷ lệ vốn chủ trong cơ cấu tài trợ giảm, có thể do doanh nghiệp vay nhiều hơn.
  • Tổng nợ và tỷ số nợ/TTS có tương quan rất cao (r = 0.90), hợp lý vì cùng đo lường cấu trúc nợ.
  • Vốn chủ sở hữu (vcsh) có tương quan khá yếu với các chỉ tiêu khác, cho thấy biến động của nó tương đối độc lập so với nợ và tổng tài sản trong giai đoạn nghiên cứu.
  • Các mối tương quan âm giữa nhóm tỷ số (tysono_tts_dr_, tysovcsh_tts) thể hiện mối quan hệ bù trừ trong cấu trúc vốn.

d. Phân tích tương quan theo giai đoạn 2015–2019 với giai đoạn 2020–2024

# --- So sánh hệ số tương quan giữa hai giai đoạn ---
cor_1 <- cor(data_ckv %>% filter(year <= 2019) %>%
               select(tongtaisan, tongno, vcsh, tysono_tts_dr_), use = "complete.obs")
cor_2 <- cor(data_ckv %>% filter(year >= 2020) %>%
               select(tongtaisan, tongno, vcsh, tysono_tts_dr_), use = "complete.obs")

list(
  "2015–2019" = cor_1,
  "2020–2024" = cor_2
)
## $`2015–2019`
##                 tongtaisan     tongno        vcsh tysono_tts_dr_
## tongtaisan      1.00000000  0.6748979 -0.08327695      0.3764861
## tongno          0.67489786  1.0000000 -0.18726772      0.9373132
## vcsh           -0.08327695 -0.1872677  1.00000000     -0.2046768
## tysono_tts_dr_  0.37648610  0.9373132 -0.20467684      1.0000000
## 
## $`2020–2024`
##                tongtaisan      tongno        vcsh tysono_tts_dr_
## tongtaisan     1.00000000  0.71661011  0.05629495      0.9157868
## tongno         0.71661011  1.00000000 -0.05883599      0.6235455
## vcsh           0.05629495 -0.05883599  1.00000000     -0.3067937
## tysono_tts_dr_ 0.91578678  0.62354554 -0.30679365      1.0000000

Để xem xét liệu mối quan hệ giữa các chỉ tiêu tài chính của CKV có thay đổi đáng kể trước và sau năm 2020 (thời điểm nền kinh tế chịu tác động mạnh của đại dịch COVID-19), nhóm tiến hành tách dữ liệu thành hai giai đoạn và tính ma trận tương quan riêng biệt cho từng giai đoạn. Cụ thể, sau đây là các thao tác nhóm đã thực hiện trong R:

Tính ma trận tương quan cho giai đoạn 2015–2019: “cor_1 <- cor(data_ckv %>% filter(year <= 2019) %>% select(tongtaisan, tongno, vcsh, tysono_tts_dr_), use =”complete.obs”)“, trong đó:

  • filter(year <= 2019) → Lọc dữ liệu thuộc giai đoạn trước năm 2020.
  • select(…) → Giữ lại bốn biến tài chính trọng yếu như: tongtaisan, tongno,vcsh, tysono_tts_dr_ → Kết quả là ma trận tương quan 4x4 thể hiện mức độ liên hệ giữa các biến trong giai đoạn 2015–2019.

Tương tự giai đoạn 2020-2024 cũng thực hiện như vậy.

Cuối cùng, hai ma trận được gộp lại trong một danh sách (list) giúp so sánh trực quan giữa hai giai đoạn trong cùng một bảng kết quả.

Diễn giải kết quả:

  • Kết quả cho thấy mối tương quan giữa tổng tài sản và tổng nợ tăng từ 0,67 (2015–2019) lên 0,72 (2020–2024), phản ánh việc CKV phụ thuộc nhiều hơn vào nợ vay để mở rộng tài sản sau năm 2020. Đồng thời, tương quan giữa tổng tài sản và tỷ số nợ/TTS cũng tăng mạnh từ 0,38 lên 0,92, cho thấy mức đòn bẩy tài chính cao hơn rõ rệt.
  • Ngược lại, mối quan hệ giữa vốn chủ sở hữu và tỷ số nợ/TTS giảm từ -0,20 xuống -0,31, hàm ý vốn chủ chiếm tỷ trọng nhỏ hơn trong tổng nguồn vốn. Nhìn chung, giai đoạn sau 2020, CKV có xu hướng sử dụng vốn vay nhiều hơn, giúp mở rộng quy mô nhưng cũng tăng rủi ro tài chính nếu môi trường kinh doanh biến động.

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


  1. :alnum:↩︎

  2. :alnum:↩︎