1 Chương 2: Báo cáo tài chính

1.1 GIỚI THIỆU BỘ DỮ LIỆU

1.1.1 Bối cảnh và câu hỏi nghiên cứu

Ngân hàng TMCP Ngoại thương Việt Nam (VCB) là một trong những ngân hàng thương mại hàng đầu tại Việt Nam, có quy mô tài sản, vốn chủ sở hữu và lợi nhuận nằm trong nhóm dẫn đầu hệ thống. Trong giai đoạn 10 năm gần đây, hoạt động của VCB chịu ảnh hưởng bởi quá trình tái cơ cấu hệ thống ngân hàng, yêu cầu tăng cường an toàn vốn và đổi mới mô hình kinh doanh theo chuẩn quốc tế. Việc theo dõi và phân tích xu hướng tài chính của ngân hàng trong giai đoạn dài là cần thiết để đánh giá hiệu quả hoạt động, khả năng sinh lời cũng như mức độ ổn định tài chính.

Đề tài này tập trung phân tích bộ dữ liệu báo cáo tài chính của VCB trong 10 năm liên tiếp (2015–2024) nhằm nhận diện xu hướng biến động của các chỉ tiêu tài chính chủ yếu như: tổng tài sản, vốn chủ sở hữu, nợ phải trả, và một số tỷ số tài chính cơ bản.

Phân tích kết quả từ bộ dữ liệu này sẽ giúp hình thành bức tranh tổng thể về xu hướng tài chính của VCB, đồng thời làm cơ sở cho các đánh giá sâu hơn về hiệu quả hoạt động và định hướng phát triển trong các giai đoạn tiếp theo.

1.1.2 Mô tả và chất lượng dữ liệu

Bộ dữ liệu được nhóm tác giả thu thập từ báo cáo tài chính của Ngân hàng TMCP Ngoại thương Việt Nam (VCB) trong giai đoạn 2015–2024, được lưu trữ dưới dạng tệp Excel và đọc vào RStudio bằng hàm read_excel() của gói readxl. Sau khi nhập, dữ liệu được kiểm tra sơ bộ để mô tả cấu trúc, xác định số lượng và kiểu biến, đồng thời đánh giá chất lượng thông qua việc phát hiện giá trị thiếu, trùng lặp và các điểm bất thường nhằm đảm bảo độ tin cậy cho phân tích tiếp theo.

library(readxl)
bctc <- read_excel("D:/ngon ngu lap trinh/bctc.xlsx")

Giải thích kỹ thuật

Hai lệnh trên được sử dụng để đọc dữ liệu từ tệp Excel vào môi trường làm việc của R. Lệnh library(readxl) có chức năng nạp gói readxl, đây là gói hỗ trợ R đọc các tệp Excel có phần mở rộng .xls hoặc .xlsx. Nếu không gọi gói này trước, R sẽ không thể sử dụng các hàm đọc dữ liệu từ Excel.

Dòng lệnh: bctc <- read_excel(“D:/ngon ngu lap trinh/bctc.xlsx”) được dùng để đọc (nạp) dữ liệu từ một file Excel vào trong R và lưu lại dưới dạng một bảng dữ liệu (data frame) để có thể xử lý, phân tích hoặc trực quan hóa sau này.

Cụ thể:

  • read_excel() là hàm thuộc thư viện readxl, dùng để mở và đọc dữ liệu từ file Excel (.xls hoặc .xlsx). Hàm này tự động nhận dạng định dạng cột (số, chữ, ngày tháng…) và tạo thành bảng dữ liệu trong R.

  • “D:/ngon ngu lap trinh/bctc.xlsx” là đường dẫn tuyệt đối đến file Excel trên máy tính. Đường dẫn này cho R biết vị trí chính xác của tệp cần đọc.

    • bctc <- là phép gán, nghĩa là toàn bộ dữ liệu đọc được từ file Excel sẽ được lưu vào đối tượng có tên là bctc trong môi trường làm việc của R.

1.1.2.1 Danh mục biến (Phân tích tên và ý nghĩa của các biến)

Các biến được lựa chọn tập trung vào những chỉ tiêu có ảnh hưởng lớn đến hiệu quả hoạt động và khả năng sinh lời của VCB. Cụ thể, chúng bao gồm nhóm tài sản (tài sản ngắn hạn, tiền và tương đương tiền, tài sản cố định), nhóm nguồn vốn (nợ ngắn hạn, nợ dài hạn, vốn chủ sở hữu), cùng nhóm phản ánh kết quả kinh doanh (doanh thu thuần, lợi nhuận sau thuế). Ngoài ra, biến Năm được dùng làm trục thời gian giúp theo dõi xu hướng biến động của các chỉ tiêu trong 10 năm nghiên cứu.

Những biến này tạo thành nền tảng cho việc phân tích xu hướng tài chính, cho phép so sánh sự thay đổi qua thời gian, đánh giá cơ cấu tài chính và xác định các nhân tố thể hiện rõ nhất hiệu quả hoạt động của ngân hàng.

names(bctc)
##  [1] "Nam"                                      
##  [2] "Tai san ngan han"                         
##  [3] "Tien va cac khoan tuong duong tien"       
##  [4] "Cac khoan phai thu khac"                  
##  [5] "Tai san dai han"                          
##  [6] "Tai san co dinh"                          
##  [7] "Tai san co dinh huu hinh"                 
##  [8] "Nguyen gia TSCD HH"                       
##  [9] "Gia tri hao mon luy ke HH"                
## [10] "Tai san co dinh vo hinh"                  
## [11] "Nguyen gia TSCD VH"                       
## [12] "Gia tri hao mon luy ke VH"                
## [13] "Tai san dai han khac"                     
## [14] "Chi phi tra truoc dai han"                
## [15] "Tong cong tai san"                        
## [16] "No phai tra"                              
## [17] "No ngan han"                              
## [18] "Vay va no ngan han"                       
## [19] "Phai tra hoat dong giao dich chung khoan" 
## [20] "Thue va cac khoan phai nop Nha nuoc"      
## [21] "Phai tra nguoi lao dong"                  
## [22] "Chi phi phai tra"                         
## [23] "Quy khen thuong va phuc loi"              
## [24] "Phai tra giao dich mua ban lai trai phieu"
## [25] "No dai han"                               
## [26] "Von chu so huu"                           
## [27] "Von dieu le"                              
## [28] "Von khac"                                 
## [29] "Quy du phong tai chinh"                   
## [30] "Tong cong nguon von"

Giải thích kỹ thuật

Lệnh names(bctc) trong R được sử dụng để hiển thị danh sách tên của tất cả các biến trong bảng dữ liệu bctc. Khi chạy lệnh này, R sẽ trả về một vector chứa các tên cột theo đúng thứ tự xuất hiện trong dữ liệu, giúp ta biết được bộ dữ liệu đang gồm những chỉ tiêu nào để thuận tiện cho việc lựa chọn, xử lý hoặc đổi tên biến sau này.

Ý nghĩa

Danh sách trên phản ánh đầy đủ cơ cấu tài sản, nợ phải trả và vốn chủ sở hữu của Ngân hàng TMCP Ngoại thương Việt Nam (VCB) trong các năm. Cụ thể, dữ liệu được chia thành ba nhóm chính:

  • Nhóm tài sản: bao gồm các biến như Tài sản ngắn hạn, Tài sản dài hạn, Tài sản cố định, Tài sản cố định hữu hình, Tài sản cố định vô hình và các khoản chi tiết như Nguyên giá, Giá trị hao mòn lũy kế hay Chi phí trả trước dài hạn. Các biến này phản ánh quy mô và cơ cấu đầu tư của ngân hàng.

  • Nhóm nợ phải trả: gồm Nợ ngắn hạn, Nợ dài hạn, Vay và nợ ngắn hạn, Phải trả hoạt động giao dịch chứng khoán, Thuế và các khoản phải nộp Nhà nước, Chi phí phải trả… thể hiện nghĩa vụ tài chính của ngân hàng với các bên liên quan.

  • Nhóm vốn chủ sở hữu: gồm Vốn chủ sở hữu, Vốn điều lệ, Vốn khác, Quỹ dự phòng tài chính và Tổng cộng nguồn vốn, thể hiện phần vốn thuộc sở hữu của cổ đông và các quỹ nội bộ.

1.1.2.2 Thống kê kích thước

Ở phần này,ta tiến hành kiểm tra kích thước của bộ dữ liệu để xác định số lượng biến và số năm quan sát trước khi thực hiện các bước xử lý và phân tích tiếp theo. Việc thống kê kích thước giúp hiểu rõ phạm vi và cấu trúc của dữ liệu, đồng thời đảm bảo rằng tập dữ liệu được đọc đầy đủ từ tệp Excel, không bị thiếu dòng hoặc cột. Lệnh dim(bctc) sẽ được sử dụng để hiển thị số hàng và số cột của bảng dữ liệu bctc.

dim(bctc)
## [1] 10 30
head(bctc)
tail(bctc)

Giải thích kỹ thuật

Lệnh dim(bctc) trong R được dùng để hiển thị kích thước của bảng dữ liệu bctc, cụ thể là số hàng (dòng) và số cột (biến) trong tập dữ liệu. Kết quả trả về là một vector gồm hai giá trị.

Lệnh head(bctc) hiển thị 6 dòng đầu tiên của bảng dữ liệu, giúp quan sát cấu trúc, định dạng và giá trị của các biến ở phần đầu.

Lệnh tail(bctc) hiển thị 6 dòng cuối cùng, thường được dùng để kiểm tra xem dữ liệu có bị thiếu, trống hoặc sai sót ở phần cuối tệp hay không.

Ý nghĩa

Kết quả cho biết bảng dữ liệu bctc có 10 dòng và 30 cột. Điều này nghĩa là bộ dữ liệu bao gồm 10 quan sát, tương ứng với 10 năm tài chính được ghi nhận, và 30 biến thể hiện các chỉ tiêu tài chính khác nhau của Ngân hàng VCB.

Hai lệnh head(bctc) và tail(bctc) được dùng để xem nhanh nội dung dữ liệu trong bảng bctc.

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

Bước này được thực hiện nhằm giúp nhận biết kiểu dữ liệu của từng biến để đảm bảo chúng được định dạng đúng (ví dụ: biến số, biến định danh, hay biến ngày tháng).

str(bctc) 
## tibble [10 × 30] (S3: tbl_df/tbl/data.frame)
##  $ Nam                                      : num [1:10] 2015 2016 2017 2018 2019 ...
##  $ Tai san ngan han                         : num [1:10] 2.21e+12 2.42e+12 3.23e+12 2.87e+12 3.50e+12 ...
##  $ Tien va cac khoan tuong duong tien       : num [1:10] 8.07e+11 2.42e+12 3.22e+12 2.86e+12 3.50e+12 ...
##  $ Cac khoan phai thu khac                  : num [1:10] 1.35e+09 2.15e+11 1.18e+11 4.74e+10 5.06e+10 ...
##  $ Tai san dai han                          : num [1:10] 6.25e+11 1.71e+11 3.96e+10 4.35e+10 4.51e+10 ...
##  $ Tai san co dinh                          : num [1:10] 3.40e+10 2.13e+10 1.21e+10 7.26e+09 9.50e+09 ...
##  $ Tai san co dinh huu hinh                 : num [1:10] 1.87e+10 1.19e+10 6.91e+09 7.26e+09 6.64e+09 ...
##  $ Nguyen gia TSCD HH                       : num [1:10] 4.78e+10 4.80e+10 4.68e+10 5.13e+10 5.17e+10 ...
##  $ Gia tri hao mon luy ke HH                : num [1:10] -2.90e+10 -3.61e+10 -3.99e+10 -4.41e+10 -4.51e+10 ...
##  $ Tai san co dinh vo hinh                  : num [1:10] 1.53e+10 9.37e+09 5.23e+09 5.23e+09 2.86e+09 ...
##  $ Nguyen gia TSCD VH                       : num [1:10] 2.00e+10 2.00e+10 2.37e+10 2.37e+10 2.70e+10 ...
##  $ Gia tri hao mon luy ke VH                : num [1:10] -4.73e+09 -1.07e+10 -1.85e+10 -2.37e+10 -2.41e+10 ...
##  $ Tai san dai han khac                     : num [1:10] 3.13e+10 2.89e+10 2.74e+10 3.63e+10 3.56e+10 ...
##  $ Chi phi tra truoc dai han                : num [1:10] 6.34e+09 3.80e+09 4.25e+09 2.98e+09 1.74e+09 ...
##  $ Tong cong tai san                        : num [1:10] 2.83e+12 2.59e+12 3.26e+12 2.91e+12 3.55e+12 ...
##  $ No phai tra                              : num [1:10] 1.76e+12 1.46e+12 1.99e+12 1.49e+12 2.01e+12 ...
##  $ No ngan han                              : num [1:10] 1.29e+12 1.46e+12 1.63e+12 1.48e+12 1.81e+12 ...
##  $ Vay va no ngan han                       : num [1:10] 4.55e+10 7.54e+11 1.15e+12 9.13e+11 1.16e+12 ...
##  $ Phai tra hoat dong giao dich chung khoan : num [1:10] 1.53e+09 2.30e+09 3.80e+09 3.24e+09 3.03e+09 ...
##  $ Thue va cac khoan phai nop Nha nuoc      : num [1:10] 7.33e+09 5.70e+09 1.43e+10 1.48e+10 1.39e+10 ...
##  $ Phai tra nguoi lao dong                  : num [1:10] 5.93e+09 2.62e+10 5.29e+10 3.25e+10 2.92e+10 ...
##  $ Chi phi phai tra                         : num [1:10] 1.25e+10 1.39e+10 1.50e+10 9.08e+09 4.72e+09 ...
##  $ Quy khen thuong va phuc loi              : num [1:10] 1.34e+10 6.94e+09 4.26e+09 1.46e+10 2.41e+10 ...
##  $ Phai tra giao dich mua ban lai trai phieu: num [1:10] 1.63e+11 3.58e+11 3.77e+11 2.78e+11 5.70e+11 ...
##  $ No dai han                               : num [1:10] 4.72e+11 2.84e+11 3.59e+11 5.41e+09 1.92e+11 ...
##  $ Von chu so huu                           : num [1:10] 1.08e+12 1.13e+12 1.27e+12 1.42e+12 1.54e+12 ...
##  $ Von dieu le                              : num [1:10] 7e+11 7e+11 1e+12 1e+12 1e+12 ...
##  $ Von khac                                 : num [1:10] 9.15e+08 9.15e+08 4.70e+10 5.59e+10 6.31e+10 ...
##  $ Quy du phong tai chinh                   : num [1:10] 3.87e+10 4.20e+10 1.92e+11 3.20e+11 4.25e+11 ...
##  $ Tong cong nguon von                      : num [1:10] 2.83e+12 2.59e+12 3.26e+12 2.91e+12 3.55e+12 ...

Giải thích kỹ thuật

Lệnh str(bctc) dùng để xem cấu trúc của bảng dữ liệu có tên là bctc, bao gồm: số dòng, số cột, tên và kiểu dữ liệu của từng biến cùng một vài giá trị mẫu. Lệnh này giúp kiểm tra nhanh dữ liệu đã được đọc đúng định dạng hay chưa trước khi phân tích.

Ý nghĩa

Tất cả các biến đều có kiểu dữ liệu số (num), cho phép thực hiện các phép tính, thống kê và trực quan hóa trực tiếp trong R. Điều này cho thấy dữ liệu được đọc chính xác và phù hợp cho các bước phân tích định lượng.

1.1.2.4 Kiểm tra dữ liệu thiếu

Bước này nhằm xác định xem trong bộ dữ liệu có tồn tại các giá trị bị thiếu (NA) hay không. Việc phát hiện dữ liệu thiếu giúp đảm bảo độ chính xác của các phép tính thống kê và mô hình phân tích

colSums(is.na(bctc))
##                                       Nam 
##                                         0 
##                          Tai san ngan han 
##                                         0 
##        Tien va cac khoan tuong duong tien 
##                                         0 
##                   Cac khoan phai thu khac 
##                                         0 
##                           Tai san dai han 
##                                         0 
##                           Tai san co dinh 
##                                         0 
##                  Tai san co dinh huu hinh 
##                                         0 
##                        Nguyen gia TSCD HH 
##                                         0 
##                 Gia tri hao mon luy ke HH 
##                                         0 
##                   Tai san co dinh vo hinh 
##                                         0 
##                        Nguyen gia TSCD VH 
##                                         0 
##                 Gia tri hao mon luy ke VH 
##                                         0 
##                      Tai san dai han khac 
##                                         0 
##                 Chi phi tra truoc dai han 
##                                         0 
##                         Tong cong tai san 
##                                         0 
##                               No phai tra 
##                                         0 
##                               No ngan han 
##                                         0 
##                        Vay va no ngan han 
##                                         0 
##  Phai tra hoat dong giao dich chung khoan 
##                                         0 
##       Thue va cac khoan phai nop Nha nuoc 
##                                         0 
##                   Phai tra nguoi lao dong 
##                                         0 
##                          Chi phi phai tra 
##                                         0 
##               Quy khen thuong va phuc loi 
##                                         0 
## Phai tra giao dich mua ban lai trai phieu 
##                                         0 
##                                No dai han 
##                                         0 
##                            Von chu so huu 
##                                         0 
##                               Von dieu le 
##                                         0 
##                                  Von khac 
##                                         0 
##                    Quy du phong tai chinh 
##                                         0 
##                       Tong cong nguon von 
##                                         0

Giải thích kỹ thuật

Lệnh colSums(is.na(bctc)) được dùng để kiểm tra và đếm số lượng giá trị bị thiếu (NA) trong từng cột của bảng dữ liệu bctc.

Cụ thể:

  • is.na(bctc) sẽ tạo ra một bảng logic có cùng kích thước với bctc, trong đó mỗi ô nhận giá trị TRUE nếu ô dữ liệu đó bị thiếu, và FALSE nếu có giá trị.

  • colSums(…) sau đó cộng các giá trị TRUE (được tính là 1) theo từng cột, cho ra tổng số ô bị thiếu trong mỗi biến.

Kết quả trả về là một danh sách hiển thị số lượng giá trị thiếu của từng biến, giúp người phân tích xác định dữ liệu có bị khuyết hay không để tiến hành xử lý phù hợp.

Ý nghĩa

Kết quả cho thấy tất cả các biến trong bộ dữ liệu bctc đều có giá trị bằng 0, nghĩa là không có ô dữ liệu nào bị thiếu (NA). Điều này chứng tỏ bộ dữ liệu hoàn chỉnh, đầy đủ cho cả 30 biến và 10 năm quan sát.

1.1.2.5 Kiểm tra dữ liệu trùng lặp

Mục đích của bước này là phát hiện xem trong bộ dữ liệu có tồn tại các dòng bị trùng lặp hay không, tức là các quan sát có giá trị giống hệt nhau ở tất cả các biến. Dữ liệu trùng lặp có thể làm sai lệch kết quả thống kê và phân tích, đặc biệt khi tính trung bình, tổng hoặc mô hình hồi quy.

sum(duplicated(bctc))
## [1] 0

Giải thích Kỹ thuật

Lệnh sum(duplicated(bctc)) dùng để kiểm tra xem trong bảng dữ liệu có bao nhiêu dòng bị lặp lại.

Hiểu đơn giản là R sẽ so sánh từng dòng trong bảng bctc với các dòng khác: nếu có hai dòng giống hệt nhau thì chúng được xem là trùng lặp. Hàm duplicated() đánh dấu các dòng trùng bằng giá trị TRUE, còn sum() cộng tất cả các giá trị đó lại để cho ra tổng số dòng bị trùng.

Nếu kết quả là 0, nghĩa là không có dòng nào trùng nhau; còn nếu ra số khác 0, tức là có dòng dữ liệu bị lặp, cần kiểm tra và loại bỏ để tránh sai lệch khi phân tích.

Ý nghĩa

Kết quả [1] 0 cho biết trong bảng dữ liệu bctc không có dòng nào bị trùng lặp. Điều này nghĩa là tất cả các quan sát trong dữ liệu — tức 10 năm tài chính — đều là duy nhất và không lặp lại, đảm bảo tính chính xác và đáng tin cậy cho các bước phân tích tiếp theo.

1.1.2.6 Mô tả đặc điểm của một vài biến

Phần này trình bày mô tả đặc điểm của một vài biến chính trong tập dữ liệu, nhằm giúp hiểu rõ hơn về cấu trúc và xu hướng chung của các chỉ tiêu tài chính. Thông qua việc thống kê mô tả các biến như Tài sản ngắn hạn, Tổng cộng tài sản, Vay và nợ ngắn hạn,… ta có thể nhận thấy quy mô, mức độ phân tán và đặc điểm phân bố của từng biến. Đây là bước quan trọng giúp người phân tích có cái nhìn tổng quan trước khi thực hiện các phân tích sâu hơn hoặc xây dựng mô hình thống kê.

1. Thống kê mô tả cho biến “Tài sản ngắn hạn”

Ta có thể đánh giá quy mô, mức độ biến động và xu hướng thay đổi của chỉ tiêu này trong giai đoạn 10 năm.

summary(bctc$`Tai san ngan han`)
##      Min.   1st Qu.    Median      Mean   3rd Qu.      Max. 
## 2.210e+12 2.956e+12 4.650e+12 6.082e+12 8.727e+12 1.275e+13

Giải thích kỹ thuật

Dòng lệnh summary(bctc$Tai san ngan han) trong R được dùng để tóm tắt nhanh dữ liệu của cột “Tài sản ngắn hạn” trong bảng dữ liệu bctc. Cụ thể, bctc là tên của bảng dữ liệu.

Dấu $ dùng để truy cập vào một cột cụ thể trong bảng, và phần Tài sản ngắn hạn là tên của cột cần xem. Hàm summary() sẽ hiển thị các thông tin thống kê mô tả cơ bản như giá trị nhỏ nhất, lớn nhất, trung vị, trung bình và các phân vị nếu cột là dữ liệu số; hoặc hiển thị tần suất xuất hiện của từng giá trị nếu cột là dữ liệu dạng chữ

Ý nghĩa

Kết quả trên là bảng tóm tắt thống kê cho cột “Tài sản ngắn hạn” trong dữ liệu bctc. Các giá trị bao gồm: nhỏ nhất (Min) là 2.210e+12, trung vị (Median) là 4.650e+12, trung bình (Mean) là 6.082e+12, và lớn nhất (Max) là 1.275e+13. Ngoài ra, hai giá trị phân vị là 1st Qu. = 2.956e+12 và 3rd Qu. = 8.727e+12 cho biết 25% dữ liệu thấp hơn giá trị thứ nhất và 75% thấp hơn giá trị thứ hai.

Nhìn chung, “Tài sản ngắn hạn” của các doanh nghiệp trong dữ liệu dao động từ khoảng 2,21 nghìn tỷ đến 12,75 nghìn tỷ, với mức trung bình khoảng 6,08 nghìn tỷ. Việc trung bình cao hơn trung vị cho thấy phân bố dữ liệu lệch phải, tức là có một số doanh nghiệp có giá trị “Tài sản ngắn hạn” rất lớn so với phần còn lại.

2. Thống kê mô tả cho biến “Tổng cộng tài sản”

summary(bctc$`Tong cong tai san`)
##      Min.   1st Qu.    Median      Mean   3rd Qu.      Max. 
## 2.595e+12 2.998e+12 4.697e+12 6.224e+12 8.788e+12 1.290e+13

Giải thích kĩ thuật

Tương tự, dòng lệnh summary(bctc$Tong cong tai san) được dùng để tóm tắt nhanh dữ liệu của cột “Tổng cộng tài sản” trong bảng bctc. Cú pháp này cũng bao gồm tên bảng dữ liệu

bctc là tên của bảng dữ liệu đã được nạp (thường từ file Excel)

Dấu $ để truy cập vào cột, và phần trong dấu nháy ngược là tên cột có chứa khoảng trắng. Khi thực hiện, hàm summary() sẽ cung cấp các thống kê mô tả cơ bản như giá trị nhỏ nhất, lớn nhất, trung vị, trung bình và các phân vị của biến “Tổng cộng tài sản”

Ý nghĩa

Kết quả trên là bảng tóm tắt thống kê cho cột “Tổng cộng tài sản” trong dữ liệu bctc. Các giá trị bao gồm: nhỏ nhất (Min) là 2.595e+12, trung vị (Median) là 4.697e+12, trung bình (Mean) là 6.224e+12, và lớn nhất (Max) là 1.290e+13. Ngoài ra, hai giá trị phân vị là 1st Qu. = 2.998e+12 và 3rd Qu. = 8.788e+12 cho biết 25% dữ liệu thấp hơn giá trị thứ nhất và 75% thấp hơn giá trị thứ hai.

Nhìn chung, “Tổng cộng tài sản” của các doanh nghiệp trong dữ liệu dao động từ khoảng 2,60 nghìn tỷ đến 12,90 nghìn tỷ, với mức trung bình khoảng 6,22 nghìn tỷ. Việc giá trị trung bình cao hơn trung vị cho thấy phân bố dữ liệu bị lệch phải, tức là có một số doanh nghiệp có quy mô tổng tài sản rất lớn so với phần còn lại.

3. Thống kê mô tả cho biến “Vay và nợ ngắn hạn”

summary(bctc$`Vay va no ngan han`)
##      Min.   1st Qu.    Median      Mean   3rd Qu.      Max. 
## 4.546e+10 9.733e+11 1.938e+12 3.104e+12 5.307e+12 7.855e+12

Giải thích kỹ thuật Dòng lệnh summary(bctc$Vay va no ngan han) trong R được dùng để tóm tắt thống kê mô tả cho cột “Vay va no ngan han” trong bảng dữ liệu bctc.

bctc là tên của bảng dữ liệu đã được nạp (thường từ file Excel).

Dấu $ dùng để truy cập vào một cột cụ thể trong bảng, ở đây là cột “Vay va no ngan han”.

Hàm summary() sẽ hiển thị các giá trị thống kê cơ bản như giá trị nhỏ nhất (Min), phân vị 1 (1st Qu.), trung vị (Median), trung bình (Mean), phân vị 3 (3rd Qu.) và giá trị lớn nhất (Max) nếu cột là dữ liệu số.

1.2 XỬ LÝ DỮ LIỆU THÔ, MÃ HÓA DỮ LIỆU

Bước xử lý dữ liệu thô và mã hóa dữ liệu là giai đoạn đầu tiên và rất quan trọng trong quá trình phân tích dữ liệu. Dữ liệu thô thường chứa lỗi như giá trị bị thiếu, ký tự đặc biệt, định dạng không thống nhất hoặc tên biến có dấu tiếng Việt, gây khó khăn cho việc xử lý bằng phần mềm như R. Vì vậy, cần phải làm sạch và chuẩn hóa dữ liệu — bao gồm việc đổi tên cột, loại bỏ ký tự không hợp lệ, chuyển đổi kiểu dữ liệu, và mã hóa lại các biến để phù hợp với yêu cầu phân tích.

Việc thực hiện bước này giúp đảm bảo tính chính xác, đồng nhất và dễ thao tác của dữ liệu trong các bước tiếp theo. Ngoài ra, mã hóa dữ liệu (như bỏ dấu tiếng Việt hoặc thay thế khoảng trắng bằng dấu gạch dưới) giúp tránh lỗi khi chạy lệnh và nâng cao hiệu quả xử lý, trực quan hóa và mô hình hóa dữ liệu.

1.2.1 Tên các biến của bộ dữ liệu, chọn 10 biến trong số các biến

Việc xem tên các biến và chọn 10 biến trong bộ dữ liệu là bước rất quan trọng trong quá trình phân tích dữ liệu.

Trước hết, xem tên các biến (bằng lệnh names(bctc)) giúp người phân tích hiểu rõ cấu trúc của dữ liệu, biết được mỗi cột đại diện cho loại thông tin nào — chẳng hạn như “Tài sản ngắn hạn”, “Nợ phải trả”, hay “Vốn chủ sở hữu”. Điều này giúp định hướng được những biến nào có thể quan trọng và phù hợp cho mục tiêu nghiên cứu.

Tiếp theo, chọn ra 10 biến có liên quan nhất dựa trên hệ số tương quan giúp giảm bớt số lượng biến, tránh dư thừa và tập trung vào các yếu tố có mối quan hệ chặt chẽ nhất trong bộ dữ liệu. Bước này không chỉ giúp phân tích gọn hơn, dễ quan sát hơn, mà còn tăng độ chính xác và hiệu quả cho các mô hình thống kê hoặc mô hình dự báo được xây dựng sau đó.

names(bctc)
##  [1] "Nam"                                      
##  [2] "Tai san ngan han"                         
##  [3] "Tien va cac khoan tuong duong tien"       
##  [4] "Cac khoan phai thu khac"                  
##  [5] "Tai san dai han"                          
##  [6] "Tai san co dinh"                          
##  [7] "Tai san co dinh huu hinh"                 
##  [8] "Nguyen gia TSCD HH"                       
##  [9] "Gia tri hao mon luy ke HH"                
## [10] "Tai san co dinh vo hinh"                  
## [11] "Nguyen gia TSCD VH"                       
## [12] "Gia tri hao mon luy ke VH"                
## [13] "Tai san dai han khac"                     
## [14] "Chi phi tra truoc dai han"                
## [15] "Tong cong tai san"                        
## [16] "No phai tra"                              
## [17] "No ngan han"                              
## [18] "Vay va no ngan han"                       
## [19] "Phai tra hoat dong giao dich chung khoan" 
## [20] "Thue va cac khoan phai nop Nha nuoc"      
## [21] "Phai tra nguoi lao dong"                  
## [22] "Chi phi phai tra"                         
## [23] "Quy khen thuong va phuc loi"              
## [24] "Phai tra giao dich mua ban lai trai phieu"
## [25] "No dai han"                               
## [26] "Von chu so huu"                           
## [27] "Von dieu le"                              
## [28] "Von khac"                                 
## [29] "Quy du phong tai chinh"                   
## [30] "Tong cong nguon von"
num_vars <- bctc[, sapply(bctc, is.numeric)]

cor_mat <- cor(num_vars, use = "complete.obs")

avg_cor <- sort(rowMeans(abs(cor_mat), na.rm = TRUE), decreasing = TRUE)

top10_vars <- names(head(avg_cor, 10))

bctc10 <- bctc[, unique(c("Nam", top10_vars))]

head(bctc10)

Giải thích kỹ thuật

names(bctc):

  • Mục đích: Kiểm tra tên các biến (cột) trong bộ dữ liệu bctc.

  • Cách hoạt động: Hàm names() trong R trả về một vector chứa tên các cột của dataframe.

num_vars <- bctc[, sapply(bctc, is.numeric)]: Lọc ra chỉ những biến có kiểu dữ liệu số (numeric) để phục vụ tính toán thống kê hoặc ma trận tương quan.

  • Cách hoạt động:

  • sapply(bctc, is.numeric) kiểm tra từng cột của bctc, trả về TRUE nếu cột đó là số, FALSE nếu không.

  • bctc[, …] sử dụng kết quả TRUE/FALSE để chỉ lấy các cột có giá trị TRUE.

  • Kết quả lưu vào num_vars là một dataframe chỉ gồm các biến dạng số.

cor_mat <- cor(num_vars, use = “complete.obs”)

Mục đích: Tạo ma trận tương quan (correlation matrix) giữa các biến số.

Cách hoạt động:

  • Hàm cor() tính hệ số tương quan Pearson giữa mọi cặp biến trong num_vars.

  • Tham số use = “complete.obs” chỉ sử dụng các dòng không bị thiếu giá trị (complete cases).

Kết quả:

  • Một ma trận vuông (số biến × số biến), trong đó mỗi phần tử là hệ số tương quan từ -1 đến 1.

  • Ví dụ: 0.9 thể hiện tương quan rất mạnh, 0 nghĩa là không tương quan, -0.8 là tương quan nghịch mạnh.

  • Tác dụng: Dùng để xác định mức độ liên hệ giữa các biến, giúp chọn ra biến nào có ý nghĩa phân tích cao nhất.

avg_cor <- sort(rowMeans(abs(cor_mat), na.rm = TRUE), decreasing = TRUE)

Mục đích: Tính độ liên quan trung bình của từng biến với tất cả các biến khác, rồi sắp xếp theo mức độ mạnh dần.

Cách hoạt động:

  • abs(cor_mat) lấy giá trị tuyệt đối của hệ số tương quan (vì chỉ quan tâm độ mạnh, không quan tâm dấu âm hay dương).

  • rowMeans(…, na.rm = TRUE) tính trung bình theo hàng (mỗi hàng là một biến), bỏ qua giá trị NA.

  • sort(…, decreasing = TRUE) sắp xếp kết quả giảm dần để biến có tương quan trung bình cao nhất đứng đầu.

Ý nghĩa: Biến có độ tương quan trung bình cao nhất là biến “gắn kết” mạnh nhất với các biến khác, thường có vai trò trung tâm trong tập dữ liệu.

top10_vars <- names(head(avg_cor, 10))

Mục đích: Lấy 10 biến có mức độ liên quan cao nhất (tức có giá trị trung bình tương quan lớn nhất).

Cách hoạt động:

  • head(avg_cor, 10) chọn ra 10 giá trị đầu tiên trong danh sách đã sắp xếp ở bước trước.

  • names() lấy tên tương ứng của các biến đó.

Kết quả là top10_vars là danh sách tên của 10 biến có mối liên hệ mạnh nhất với các biến khác — và đây chính là cơ sở để bạn chọn ra những biến quan trọng cho phân tích tiếp theo.

bctc10 <- bctc[, unique(c(“Nam”, top10_vars))] được dùng để tạo một bảng dữ liệu mới (bctc10) chỉ chứa các cột cần thiết trong bộ dữ liệu gốc bctc.

  • c(“Nam”, top10_vars) ghép tên cột “Nam” với danh sách 10 biến có liên quan cao nhất (được lưu trong top10_vars). Để đảm bảo cột “Nam” luôn xuất hiện đầu tiên.

  • Hàm unique() đảm bảo rằng nếu cột “Nam” vô tình trùng với một trong các biến nằm trong top10_vars, thì chỉ giữ lại một bản duy nhất, tránh lặp cột.

  • bctc[, …] là cách R chọn cột từ một bảng dữ liệu (data.frame) — ở đây là chọn tất cả các hàng (:) và chỉ giữ lại các cột có tên trong danh sách vừa tạo.

Kết quả: bctc10 là một bộ dữ liệu mới gồm cột “Nam” đứng đầu và 10 biến số có mức độ tương quan cao nhất — sẵn sàng cho các bước phân tích tiếp theo (như vẽ biểu đồ, phân tích tương quan chi tiết, hay hồi quy).

head(bctc10)

Mục đích: Hiển thị 6 dòng đầu tiên của bảng bctc10 để kiểm tra kết quả.

Cách hoạt động: Hàm head() mặc định in ra 6 dòng đầu tiên của dataframe.

Tác dụng: Giúp kiểm tra nhanh xem dữ liệu đã được chọn đúng biến chưa, có bị trùng hay mất cột nào không.

1.2.2 Phát hiện và xử lí giá trị ngoại lai

Phần này nhằm phát hiện và xử lý các giá trị ngoại lai trong bộ dữ liệu, tức là những giá trị quá lớn hoặc quá nhỏ so với phần còn lại. Việc xác định và kiểm soát các ngoại lệ giúp đảm bảo tính chính xác của phân tích, tránh làm sai lệch kết quả thống kê và mô hình hóa dữ liệu.

1.2.2.1 Biến Vay nợ ngắn hạn

boxplot(bctc10$`Vay va no ngan han`)

Giải thích kỹ thuật

Đoạn mã boxplot(bctc10$‘Vay va no ngan han’) được sử dụng để vẽ biểu đồ hộp (boxplot)* cho biến “Vay và nợ ngắn hạn” trong tập dữ liệu bctc10. Biểu đồ hộp là công cụ trực quan giúp mô tả phân bố dữ liệu, xác định độ biến thiên, trung vị, và phát hiện giá trị ngoại lệ (outlier) nếu có.

Kết quả, ý nghĩa

Trong hình trên, hộp màu xám thể hiện khoảng giá trị từ tứ phân vị thứ nhất (Q1) đến tứ phân vị thứ ba (Q3), còn đường kẻ đậm bên trong biểu thị giá trị trung vị của biến. Hai đường đứt bên ngoài hộp (whiskers) thể hiện phạm vi biến động của dữ liệu không chứa ngoại lệ.

Kết quả cho thấy dữ liệu “Vay và nợ ngắn hạn” của VCB phân bố khá rộng, giá trị trung vị nằm ở khoảng 2×10¹² đồng, trong khi các giá trị cao nhất gần 8×10¹² đồng, thể hiện sự tăng trưởng mạnh mẽ về nợ ngắn hạn qua các năm. Không có điểm dữ liệu nào nằm ngoài whiskers, nghĩa là không có giá trị ngoại lệ rõ rệt. Điều này cho thấy mức vay và nợ ngắn hạn của VCB tuy biến động lớn nhưng vẫn trong phạm vi hợp lý, phản ánh quy mô hoạt động và khả năng mở rộng tín dụng ổn định của ngân hàng.

1.2.2.2 Biến Tiền và các khoản tương đương tiền

boxplot(bctc10$`Tien va cac khoan tuong duong tien`)

Cũng tương tự như phần trên, kết quả từ biểu đồ hộp cho thấy giá trị “Tiền và các khoản tương đương tiền” của VCB dao động trong khoảng từ khoảng 2×10¹² đồng đến 1.2×10¹³ đồng. Giá trị trung vị khoảng 6×10¹² đồng, thể hiện mức cân bằng của lượng tiền mặt và các tài sản có tính thanh khoản cao mà ngân hàng nắm giữ qua các năm.

Khoảng tứ phân vị (Q1–Q3) trải từ 4×10¹² đến gần 1×10¹³ đồng, phản ánh mức biến động tương đối lớn giữa các năm, nhưng không xuất hiện giá trị nằm ngoài phạm vi whiskers — nghĩa là không có ngoại lệ (outlier). Như vậy, lượng tiền và tương đương tiền của VCB biến động mạnh nhưng ổn định, cho thấy ngân hàng có khả năng duy trì nguồn thanh khoản vững vàng, đáp ứng tốt các nghĩa vụ tài chính ngắn hạn trong suốt giai đoạn phân tích

1.2.3 Tạo các biến tài chính mới

Việc tạo các biến tài chính mới (chỉ số tài chính) giúp bạn khai thác sâu hơn ý nghĩa của báo cáo, thay vì chỉ nhìn vào các con số gốc. Dưới đây là một số biến mới quan trọng mà bạn có thể dễ dàng tạo từ bộ dữ liệu bctc của VCB, cùng với ý nghĩa và công thức tương ứng.

1.2.3.1 Tỷ lệ nợ

Biến “Tỷ lệ nợ” được tạo ra nhằm đánh giá mức độ phụ thuộc của ngân hàng vào nguồn vốn vay trong tổng cơ cấu tài sản. Chỉ số này phản ánh rủi ro tài chính và khả năng tự chủ về vốn của VCB. Khi tỷ lệ nợ cao, ngân hàng đang sử dụng nhiều đòn bẩy tài chính, tiềm ẩn rủi ro thanh khoản; ngược lại, tỷ lệ thấp cho thấy cấu trúc tài chính an toàn và bền vững hơn.

bctc$Ty_le_no <- bctc$`No phai tra` / bctc$`Tong cong tai san`
bctc$Ty_le_no
##  [1] 0.6207740 0.5632855 0.6096716 0.5118204 0.5656502 0.6911985 0.7440473
##  [8] 0.5121735 0.6551477 0.6506628

Giải thích kỹ thuật

Lệnh bctc\(Ty_le_no <- bctc\)No phai tra / bctc$Tong cong tai san thực hiện thao tác tạo một cột mới trong bảng dữ liệu bctc có tên là Ty_le_no.

  • Dấu $ được dùng để truy cập hoặc thêm một cột trong bảng dữ liệu.

  • Cụm bctc\(`Nợ phải trả` / bctc\)Tổng cộng tài sản là phép chia từng phần tử (theo hàng) giữa hai cột “Nợ phải trả” và “Tổng cộng tài sản”.

  • Kết quả của phép chia này được gán lại cho cột mới Ty_le_no bằng toán tử <-.

  • Như vậy, sau khi chạy lệnh, trong bảng bctc sẽ xuất hiện thêm một cột chứa tỷ lệ nợ của từng năm, giúp người dùng có thể sử dụng biến này cho các bước thống kê, trực quan hoặc phân tích tiếp theo.

Lệnh bctc$Ty_le_no trong R được dùng để truy cập đến cột “Ty_le_no” trong bảng dữ liệu bctc.

  • Dấu $ là toán tử đặc biệt trong R, cho phép trích xuất hoặc tham chiếu trực tiếp đến một biến (cột) trong một bảng dữ liệu (data frame hoặc tibble). Phần bctc là tên bảng dữ liệu, còn Ty_le_no là tên của cột cần truy cập.

  • Khi chạy lệnh này, R sẽ trả về toàn bộ giá trị trong cột “Ty_le_no” dưới dạng một vector số, tương ứng với tỷ lệ nợ của từng năm.

Kết quả

Kết quả trên biểu thị tỷ lệ nợ (Ty_le_no) của Ngân hàng VCB qua 10 năm, với các giá trị dao động từ 0.51 đến 0.74, tương đương 51%–74% tổng tài sản được tài trợ bằng nợ. Cụ thể:

  • Các năm có tỷ lệ cao như 0.74 hoặc 0.69 cho thấy mức độ sử dụng đòn bẩy tài chính lớn, nghĩa là VCB vay mượn nhiều hơn để mở rộng quy mô hoạt động. Điều này giúp tăng khả năng sinh lời khi thị trường thuận lợi nhưng cũng tiềm ẩn rủi ro tài chính cao hơn.

  • Ngược lại, những năm có tỷ lệ thấp hơn như 0.51 hoặc 0.56 phản ánh sự giảm phụ thuộc vào nợ, cho thấy ngân hàng hoạt động an toàn và chủ động hơn về nguồn vốn.

Nhìn chung, tỷ lệ nợ của VCB duy trì quanh mức 60–65%, thể hiện cấu trúc tài chính cân đối, trong đó phần lớn tài sản vẫn được tài trợ bằng nợ — đặc trưng của lĩnh vực ngân hàng. Mức này cho thấy VCB đang sử dụng đòn bẩy tài chính ở mức hợp lý, vừa đảm bảo tăng trưởng, vừa giữ được khả năng thanh khoản và an toàn vốn. #### Tỷ lệ vốn chủ sở hữu

Biến này phản ánh mức độ tự chủ tài chính của ngân hàng, cho biết bao nhiêu phần trăm tổng tài sản được tài trợ bằng vốn của chính ngân hàng. Tỷ lệ này càng cao thì ngân hàng càng ít phụ thuộc vào nợ, thể hiện khả năng tài chính bền vững và an toàn hơn.

bctc$Ty_le_von <- bctc$`Von chu so huu` / bctc$`Tong cong nguon von`
bctc$Ty_le_von
##  [1] 0.3792260 0.4367145 0.3903284 0.4881796 0.4343498 0.3088015 0.2559527
##  [8] 0.4878265 0.3448523 0.3493372

Giải thích kỹ thuật

bctc$Ty_le_von tạo một cột mới trong bảng dữ liệu bctc có tên là Ty_le_von.

Biểu thức bctc\(Ty_le_von <- bctc\)Von chu so huu / bctc$Tong cong nguon von thực hiện phép chia từng dòng giữa hai cột tương ứng để tính tỷ lệ.

Toán tử <- gán kết quả này vào cột mới vừa tạo.

Sau khi chạy lệnh, trong bảng bctc sẽ xuất hiện cột Ty_le_von, thể hiện tỷ lệ vốn chủ sở hữu qua từng năm — giúp đánh giá mức độ an toàn tài chính và khả năng duy trì nguồn vốn tự có của VCB trong suốt giai đoạn phân tích.

Kết quả

Kết quả trên thể hiện tỷ lệ vốn chủ sở hữu (Ty_le_von) của Ngân hàng VCB qua 10 năm. Các giá trị dao động từ khoảng 0.25 đến 0.49, tức là vốn chủ sở hữu chiếm từ 25% đến gần 49% tổng nguồn vốn.Cụ thể:

  • Những năm có tỷ lệ thấp, như 0.26 (năm có giá trị nhỏ nhất), cho thấy ngân hàng phụ thuộc nhiều vào nợ vay, làm tăng rủi ro tài chính.

  • Ngược lại, các năm có tỷ lệ cao, như 0.49, phản ánh mức độ tự chủ vốn mạnh mẽ, khi gần một nửa nguồn vốn đến từ vốn chủ sở hữu.

Nhìn chung, tỷ lệ này biến động quanh mức 35–45%, thể hiện cấu trúc tài chính tương đối ổn định của VCB. Tuy có những giai đoạn ngân hàng sử dụng nhiều vốn vay hơn, nhưng nhìn tổng thể, VCB vẫn duy trì được mức độ an toàn tài chính khá tốt, đảm bảo khả năng tự chủ và hạn chế rủi ro trong hoạt động kinh doanh

TỔNG KẾT

Phần xử lý dữ liệu thô và mã hóa dữ liệu đã giúp chuẩn hóa tập dữ liệu ban đầu, đảm bảo các biến được đặt tên rõ ràng, loại bỏ lỗi định dạng và sẵn sàng cho phân tích. Sau đó, việc lựa chọn 10 biến có tương quan cao nhất đã giúp thu gọn dữ liệu, tập trung vào những chỉ tiêu tài chính có mối quan hệ chặt chẽ nhất, phục vụ tốt cho phân tích chuyên sâu.

Trong bước phát hiện và xử lý giá trị ngoại lai, các biểu đồ hộp cho thấy dữ liệu của VCB nhìn chung ổn định, không có giá trị bất thường, phản ánh độ tin cậy cao của số liệu tài chính.

Cuối cùng, quá trình tạo các biến tài chính mới như tỷ lệ nợ đã mở rộng khả năng khai thác dữ liệu, giúp đánh giá sâu hơn về mức độ rủi ro, cấu trúc vốn và khả năng tự chủ tài chính của ngân hàng. Nhờ đó, bộ dữ liệu giờ đây không chỉ sạch và hoàn chỉnh mà còn mang tính phân tích cao, sẵn sàng cho các bước thống kê mô tả, trực quan hóa và mô hình hóa tiếp theo.

1.3 THỰC HIỆN CÁC THỐNG KÊ CƠ BẢN

1.3.1 Phân tích đơn biến

1.3.1.1 Phân tích theo nhóm Vốn điều lệ

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
bctc <- bctc %>%
  mutate(Nhom_VonDieuLe = cut(`Von dieu le`,
                              breaks = c(0, 7e11, 1e12, Inf),
                              labels = c("Thap", "Trung_binh", "Cao"),
                              include.lowest = TRUE))

# Thống kê tần số và tần suất theo nhóm
thongke_vondieule <- bctc %>%
  group_by(Nhom_VonDieuLe) %>%
  summarise(tan_so = n()) %>%
  mutate(tan_suat = round(tan_so / sum(tan_so) * 100, 2))

print(thongke_vondieule)
## # A tibble: 3 × 3
##   Nhom_VonDieuLe tan_so tan_suat
##   <fct>           <int>    <dbl>
## 1 Thap                2       20
## 2 Trung_binh          5       50
## 3 Cao                 3       30

Giải thích kỹ thuật

Đoạn mã đầu tiên thực hiện hai bước chính:

  1. tạo biến phân loại Nhom_VonDieuLe từ cột Von dieu le bằng mutate() và cut(),

  2. tổng hợp tần số/tần suất cho từng nhóm bằng group_by() + summarise() và mutate(). Cụ thể về mặt kỹ thuật:

bctc <- bctc %>% mutate(Nhom_VonDieuLe = cut(…))

  • mutate() thêm (hoặc thay) cột mới vào dataframe bctc.

  • cut(x, breaks = c(0, 7e11, 1e12, Inf), labels = c(“Thap”,“Trung_binh”,“Cao”), include.lowest = TRUE) chia vector số x thành các khoảng (bins) theo ngưỡng trong breaks.

  • breaks = c(0, 7e11, 1e12, Inf) nghĩa là: nhóm 1 là giá trị ≥0 và ≤7×10^11, nhóm 2 là (7×10^11, 1×10^12], nhóm 3 là (1×10^12, +∞). Inf đảm bảo bao trùm mọi giá trị lớn hơn ngưỡng cuối.

  • labels gán nhãn cho mỗi khoảng; bạn dùng nhãn không dấu để tránh lỗi mã hóa.

  • include.lowest = TRUE đảm bảo giá trị nhỏ nhất nằm trong khoảng đầu.

Kết quả là Nhom_VonDieuLe là một factor chứa nhãn nhóm tương ứng cho mỗi hàng.

Đoạn mã thứ 2: Phần tổng hợp:

  • group_by(Nhom_VonDieuLe) gom các hàng theo nhóm vừa tạo.

  • summarise(tan_so = n()) đếm số quan sát (n()) trong mỗi nhóm, lưu vào cột tan_so.

  • mutate(tan_suat = round(tan_so / sum(tan_so). 100, 2)) tính tần suất (%) mỗi nhóm so với tổng (lưu ý sum(tan_so) ở đây là tổng trong ngữ cảnh nhóm hóa — do dùng sau summarise() trên toàn bộ bảng nên thực chất đang dùng tổng số hàng), làm tròn 2 chữ số thập phân.

  • print(thongke_vondieule) in kết quả ra console.

Kết quả

Kết quả trên cho biết phân bố của biến “Vốn điều lệ” sau khi được chia thành ba nhóm (“Thấp”, “Trung bình”, “Cao”) theo các ngưỡng định trước. Cụ thể:

  • Nhóm Thấp (Thap): có 2 quan sát, chiếm 20% tổng số năm trong bộ dữ liệu. Đây là các năm mà vốn điều lệ của VCB ở mức dưới hoặc bằng 7×10¹¹ đồng.

  • Nhóm Trung bình (Trung_binh): có 5 quan sát, tương ứng 50%, là giai đoạn mà vốn điều lệ nằm trong khoảng từ 7×10¹¹ đến 1×10¹² đồng — tức mức vốn ổn định và phổ biến nhất của ngân hàng trong 10 năm.

  • Nhóm Cao (Cao): có 3 quan sát, chiếm 30%, là các năm mà vốn điều lệ vượt trên 1×10¹² đồng, thể hiện các giai đoạn VCB tăng vốn đáng kể, mở rộng quy mô hoạt động và nâng cao năng lực tài chính.

→ Ý nghĩa tổng quát: kết quả cho thấy phần lớn các năm VCB duy trì vốn điều lệ ở mức trung bình (50%), trong khi giai đoạn tăng mạnh vốn điều lệ (nhóm “Cao”) chỉ chiếm 30%. Điều này phản ánh quá trình tăng vốn diễn ra theo lộ trình dần dần, ổn định hơn là đột ngột, cho thấy chiến lược tăng trưởng có kiểm soát của ngân hàng.

Kết quả cho thấy trong giai đoạn 10 năm, vốn điều lệ của VCB chủ yếu nằm trong nhóm “Trung bình”, chiếm 50% tổng số năm quan sát. Điều này phản ánh giai đoạn mà vốn điều lệ của ngân hàng duy trì ổn định ở mức trung bình (khoảng từ 700 tỷ đến 1.000 tỷ đồng).

Bên cạnh đó, có 2 năm (20%) nằm trong nhóm “Thấp”, tương ứng với các năm đầu giai đoạn khi VCB chưa thực hiện các đợt tăng vốn lớn. Trong khi đó, 3 năm (30%) thuộc nhóm “Cao”, thể hiện các năm gần đây khi ngân hàng tăng vốn điều lệ vượt mức 1.000 tỷ đồng, cho thấy xu hướng tăng cường quy mô vốn tự có nhằm mở rộng hoạt động và nâng cao năng lực tài chính.

Như vậy, qua phân tổ, có thể nhận thấy VCB có lộ trình tăng vốn điều lệ rõ ràng và bền vững, chuyển dịch dần từ nhóm thấp sang trung bình và cao trong 10 năm qua.

1.3.1.2 Phân tích theo nhóm Tỷ lệ nợ

library(dplyr)
bctc <- bctc %>%
  mutate(Nhom_TyLeNo = case_when(
    Ty_le_no < 0.3 ~ "Thấp",
    Ty_le_no < 0.6 ~ "Trung bình",
    TRUE ~ "Cao"
  ))

thongke_tyleno <- bctc %>%
  group_by(Nhom_TyLeNo) %>%
  summarise(
    tan_so = n()  # đếm số lần xuất hiện trong mỗi nhóm
  ) %>%
  mutate(
    tan_suat = round(tan_so / sum(tan_so) * 100, 2)  # tính phần trăm tần suất
  ) %>%
  arrange(desc(tan_so))

print(thongke_tyleno)
## # A tibble: 2 × 3
##   Nhom_TyLeNo tan_so tan_suat
##   <chr>        <int>    <dbl>
## 1 Cao              6       60
## 2 Trung bình       4       40

Giải thích kỹ thuật

Đoạn mã đầu: tạo biến phân loại Nhom_TyLeNo từ Ty_le_no

  • mutate(): thêm (hoặc cập nhật) cột mới vào dataframe bctc.

  • cut(x, breaks = c(0,0.4,0.6,Inf), labels = …, include.lowest = TRUE): chia vector số Ty_le_no thành các khoảng (bins) theo ngưỡng trong breaks.

  • breaks = c(0, 0.4, 0.6, Inf) nghĩa là:

  • nhóm 1: giá trị ≥ 0 và ≤ 0.4 → An_toan;

  • nhóm 2: (0.4, 0.6] → Trung_binh;

  • nhóm 3: (0.6, +∞) → Rui_ro.

  • labels gán nhãn cho mỗi khoảng; dùng nhãn không dấu để tránh lỗi mã hóa.

  • include.lowest = TRUE đảm bảo giá trị nhỏ nhất được xếp vào nhóm đầu.

Kết quả: Nhom_TyLeNo là một factor (cột phân loại) chứa nhãn nhóm rủi ro cho mỗi hàng (mỗi năm).

Đoạn mã thứ hai: tổng hợp tần số và tần suất theo Nhom_TyLeNo

group_by(Nhom_TyLeNo): gom các hàng có cùng giá trị Nhom_TyLeNo thành các nhóm (mỗi nhóm được xử lý riêng).

summarise(tan_so = n()): với mỗi nhóm, n() đếm số quan sát (số năm) thuộc nhóm đó; kết quả là một bảng tóm tắt có một hàng cho mỗi nhóm và cột tan_so.

mutate(tan_suat = round(tan_so / sum(tan_so) * 100, 2)): thêm cột tan_suat là tần suất phần trăm của từng nhóm:

tan_so / sum(tan_so) lấy tỷ lệ từng nhóm so với tổng (tổng ở đây là tổng tan_so trên bảng tóm tắt, tức tổng quan sát được đếm); nhân * 100 để ra phần trăm; round(…, 2) làm tròn 2 chữ số thập phân.

arrange(desc(tan_so)): sắp xếp bảng kết quả theo tan_so giảm dần, nhóm xuất hiện nhiều nhất lên đầu.

print(thongke_tyleno): in bảng kết quả ra console.

1.3.2 Phân tổ các biến

1.3.2.1 Phân tổ dựa theo tỉ lệ vốn điều lệ và Tổng tài sản

library(dplyr)

vondieule_summary <- bctc %>%
  group_by(Nhom_VonDieuLe) %>%
  summarise(
    Min_TaiSan = min(`Tong cong tai san`, na.rm = TRUE),
    Max_TaiSan = max(`Tong cong tai san`, na.rm = TRUE),
    Avg_TaiSan = mean(`Tong cong tai san`, na.rm = TRUE),
    Median_TaiSan = median(`Tong cong tai san`, na.rm = TRUE),
    Count = n()
  ) %>%
  arrange(desc(Avg_TaiSan))

print(vondieule_summary)
## # A tibble: 3 × 6
##   Nhom_VonDieuLe    Min_TaiSan Max_TaiSan Avg_TaiSan Median_TaiSan Count
##   <fct>                  <dbl>      <dbl>      <dbl>         <dbl> <int>
## 1 Cao            7356216582847    1.29e13    1.07e13       1.17e13     3
## 2 Trung_binh     2909701366631    9.27e12    4.97e12       3.55e12     5
## 3 Thap           2594904363462    2.83e12    2.71e12       2.71e12     2

Giải thích kỹ thuật

  • group_by(Nhom_VonDieuLe): chia dữ liệu thành 3 nhóm theo mức vốn điều lệ (“Thấp”, “Trung_bình”, “Cao”). Mỗi nhóm chứa các năm có cùng loại vốn điều lệ.

  • summarise(): tính các chỉ tiêu thống kê cho từng nhóm.

  • min(): giá trị nhỏ nhất của “Tổng cộng tài sản”.

  • max(): giá trị lớn nhất.

  • mean(): trung bình cộng.

  • median(): trung vị (giá trị điển hình, ít bị ảnh hưởng bởi ngoại lệ).

  • n(): đếm số năm (số dòng) trong nhóm.

  • arrange(desc(Avg_TaiSan)): sắp xếp các nhóm theo tổng tài sản trung bình giảm dần, giúp dễ so sánh nhóm có tài sản lớn nhất.

Kết quả

Nhóm “Cao”: có tổng tài sản trung bình ~1.07×10¹³ đồng, cao nhất trong ba nhóm. Điều này cho thấy khi vốn điều lệ tăng lên mức cao, quy mô tài sản của ngân hàng cũng mở rộng mạnh. Giá trị trung vị (1.17×10¹³) gần với trung bình, chứng tỏ phân bố khá ổn định.

Nhóm “Trung_bình”: gồm 5 năm, có tổng tài sản trung bình ~4.97×10¹² đồng. Mức chênh giữa min (2.91×10¹²) và max (9.27×10¹²) khá lớn, thể hiện giai đoạn ngân hàng tăng trưởng nhanh, chuyển từ quy mô trung bình sang cao.

Nhóm “Thấp”: chỉ có 2 năm, với tổng tài sản ổn định quanh 2.7×10¹² đồng, phản ánh giai đoạn đầu khi VCB chưa mở rộng mạnh về quy mô.

-> Tóm lại: tổng tài sản của VCB tăng tỷ lệ thuận với vốn điều lệ. Khi ngân hàng tăng vốn, quy mô tài sản cũng tăng tương ứng, thể hiện chiến lược mở rộng hoạt động và tăng năng lực tài chính bền vững.

1.3.2.2 Phân tổ dựa theo tỉ lệ nợ và vốn chủ sở hữu

library(dplyr)

tyleno_summary <- bctc %>%
  group_by(Nhom_TyLeNo) %>%
  summarise(
    Min_VonChuSoHuu = min(`Von chu so huu`, na.rm = TRUE),
    Max_VonChuSoHuu = max(`Von chu so huu`, na.rm = TRUE),
    Avg_VonChuSoHuu = mean(`Von chu so huu`, na.rm = TRUE),
    Median_VonChuSoHuu = median(`Von chu so huu`, na.rm = TRUE),
    Count = n()
  ) %>%
  arrange(desc(Avg_VonChuSoHuu))

print(tyleno_summary)
## # A tibble: 2 × 6
##   Nhom_TyLeNo Min_VonChuSoHuu Max_VonChuSoHuu Avg_VonChuSoHuu Median_VonChuSoHuu
##   <chr>                 <dbl>           <dbl>           <dbl>              <dbl>
## 1 Cao           1075021992989   4506235252978         2.51e12      2088665396071
## 2 Trung bình    1133232338546   3588557324765         1.92e12      1480289757568
## # ℹ 1 more variable: Count <int>

Giải thích kỹ thuật

Đoạn mã trên sử dụng gói dplyr để tính toán các thống kê mô tả về vốn chủ sở hữu (Vốn chủ sở hữu) theo từng nhóm tỷ lệ nợ (Nhom_TyLeNo). Cụ thể:

group_by(Nhom_TyLeNo)

  • Chia dữ liệu trong bảng bctc thành các nhóm dựa theo giá trị của biến Nhom_TyLeNo (được phân loại trước đó thành các mức “An_toan”, “Trung_binh” và “Rui_ro”).

  • Sau bước này, mọi phép tính phía sau (summarise) sẽ được thực hiện riêng biệt cho từng nhóm tỷ lệ nợ.

summarise()

  • Tính toán các chỉ tiêu thống kê cơ bản cho cột Vốn chủ sở hữu trong từng nhóm:

  • min(): giá trị nhỏ nhất (thể hiện mức vốn thấp nhất trong nhóm).

  • max(): giá trị lớn nhất (mức vốn cao nhất trong nhóm).

  • mean(): giá trị trung bình – phản ánh mức vốn bình quân của nhóm.

  • median(): trung vị – giúp nhận biết mức vốn điển hình, ít bị ảnh hưởng bởi các giá trị ngoại lệ.

  • n(): đếm số năm quan sát (Count) trong nhóm đó.

  • Tham số na.rm = TRUE giúp loại bỏ các giá trị trống (NA) khỏi phép tính, đảm bảo không gây lỗi.

arrange(desc(Avg_VonChuSoHuu))

  • Sắp xếp kết quả theo thứ tự giảm dần của giá trị trung bình vốn chủ sở hữu, giúp dễ dàng quan sát nhóm nào có vốn bình quân cao nhất.

print(tyleno_summary)

  • In ra bảng kết quả tóm tắt cuối cùng, trong đó mỗi hàng đại diện cho một nhóm tỷ lệ nợ (Nhom_TyLeNo) cùng các chỉ tiêu thống kê tương ứng.

Kết quả

Bảng kết quả cho thấy sự khác biệt đáng kể về vốn chủ sở hữu giữa hai nhóm tỷ lệ nợ — “Rủi ro” và “Trung bình”, phản ánh mối quan hệ ngược chiều giữa mức độ vay nợ và khả năng tích lũy vốn tự có của ngân hàng.

Nhóm “Rủi ro” (tỷ lệ nợ cao, >0.65):

Có vốn chủ sở hữu trung bình đạt khoảng 2.51×10¹² đồng, cao hơn nhóm “Trung bình”.

Biên độ biến động rất lớn (từ 1.07×10¹² đến 4.50×10¹²), cho thấy trong những năm ngân hàng đẩy mạnh huy động và mở rộng quy mô tài sản, vốn chủ sở hữu cũng tăng theo, phản ánh quy mô hoạt động lớn và tốc độ tăng trưởng nhanh.

Tuy nhiên, sự biến động cao cũng hàm ý mức rủi ro tài chính lớn hơn, do ngân hàng sử dụng nhiều đòn bẩy nợ để mở rộng hoạt động.

Nhóm “Trung bình” (tỷ lệ nợ từ 0.5–0.65):

Có vốn chủ sở hữu trung bình thấp hơn (khoảng 1.92×10¹² đồng), dao động trong khoảng 1.13×10¹² đến 3.59×10¹² đồng.

Trung vị chỉ 1.48×10¹² đồng, thấp hơn đáng kể so với nhóm “Rủi ro”, thể hiện mức tích lũy vốn ổn định nhưng không tăng mạnh.

Đây là giai đoạn VCB duy trì cân bằng giữa vốn vay và vốn chủ sở hữu, hướng tới cấu trúc tài chính an toàn hơn.

1.4 TRỰC QUAN HÓA DỮ LIỆU

library(ggplot2)

ggplot(bctc, aes(x = Nam, y = `Tai san ngan han`)) +
  geom_area(fill = "skyblue", alpha = 0.3) +
  geom_line(color = "steelblue", linewidth = 1) +
  geom_point(color = "darkorange", size = 2) +
  geom_smooth(method = "loess", se = FALSE, color = "red", linetype = "dashed") +
  geom_text(aes(label = round(`Tai san ngan han`, 2)), vjust = -1, size = 3) +
  labs(title = "Biểu đồ: Tài sản ngắn hạn", x = "Năm", y = "Tài sản ngắn hạn (VND)") +
  theme_minimal(base_size = 13)
## `geom_smooth()` using formula = 'y ~ x'

library(ggplot2)
ggplot(bctc, aes(x = Nam, y = `Tong cong tai san`)) +
  geom_area(fill = "skyblue", alpha = 0.3) +
  geom_line(color = "steelblue", linewidth = 1) +
  geom_point(color = "darkorange", size = 2) +
  geom_smooth(method = "loess", se = FALSE, color = "red", linetype = "dashed") +
  geom_text(aes(label = round(`Tong cong tai san`, 2)), vjust = -1, size = 3) +
  labs(title = "Biểu đồ: Tổng cộng tài sản", x = "Năm", y = "Tổng tài sản (VND)") +
  theme_minimal(base_size = 13)
## `geom_smooth()` using formula = 'y ~ x'

ggplot(bctc, aes(x = Nam, y = `Tong cong nguon von`)) +
  geom_area(fill = "skyblue", alpha = 0.3) +
  geom_line(color = "steelblue", linewidth = 1) +
  geom_point(color = "darkorange", size = 2) +
  geom_smooth(method = "loess", se = FALSE, color = "red", linetype = "dashed") +
  geom_text(aes(label = round(`Tong cong nguon von`, 2)), vjust = -1, size = 3) +
  labs(title = "Biểu đồ: Tổng cộng nguồn vốn", x = "Năm", y = "Nguồn vốn (VND)") +
  theme_minimal(base_size = 13)
## `geom_smooth()` using formula = 'y ~ x'

ggplot(bctc, aes(x = Nam, y = `No dai han`)) +
  geom_area(fill = "skyblue", alpha = 0.3) +
  geom_line(color = "steelblue", linewidth = 1) +
  geom_point(color = "darkorange", size = 2) +
  geom_smooth(method = "loess", se = FALSE, color = "red", linetype = "dashed") +
  geom_text(aes(label = round(`No dai han`, 2)), vjust = -1, size = 3) +
  labs(title = "Biểu đồ: Nợ dài hạn", x = "Năm", y = "Nợ dài hạn (VND)") +
  theme_minimal(base_size = 13)
## `geom_smooth()` using formula = 'y ~ x'

ggplot(bctc, aes(x = Nam, y = `Von dieu le`)) +
  geom_area(fill = "skyblue", alpha = 0.3) +
  geom_line(color = "steelblue", linewidth = 1) +
  geom_point(color = "darkorange", size = 2) +
  geom_smooth(method = "loess", se = FALSE, color = "red", linetype = "dashed") +
  geom_text(aes(label = round(`Von dieu le`, 2)), vjust = -1, size = 3) +
  labs(title = "Biểu đồ: Vốn điều lệ", x = "Năm", y = "Vốn điều lệ (VND)") +
  theme_minimal(base_size = 13)
## `geom_smooth()` using formula = 'y ~ x'

ggplot(bctc, aes(x = Nam, y = `Phai tra nguoi lao dong`)) +
  geom_area(fill = "skyblue", alpha = 0.3) +
  geom_line(color = "steelblue", linewidth = 1) +
  geom_point(color = "darkorange", size = 2) +
  geom_smooth(method = "loess", se = FALSE, color = "red", linetype = "dashed") +
  geom_text(aes(label = round(`Phai tra nguoi lao dong`, 2)), vjust = -1, size = 3) +
  labs(title = "Biểu đồ: Phải trả người lao động", x = "Năm", y = "Giá trị (VND)") +
  theme_minimal(base_size = 13)
## `geom_smooth()` using formula = 'y ~ x'

ggplot(bctc, aes(x = Nam, y = `Tai san co dinh huu hinh`)) +
  geom_area(fill = "skyblue", alpha = 0.3) +
  geom_line(color = "steelblue", linewidth = 1) +
  geom_point(color = "darkorange", size = 2) +
  geom_smooth(method = "loess", se = FALSE, color = "red", linetype = "dashed") +
  geom_text(aes(label = round(`Tai san co dinh huu hinh`, 2)), vjust = -1, size = 3) +
  labs(title = "Biểu đồ: Tài sản cố định hữu hình", x = "Năm", y = "Giá trị (VND)") +
  theme_minimal(base_size = 13)
## `geom_smooth()` using formula = 'y ~ x'

ggplot(bctc, aes(x = Nam, y = `Tai san co dinh vo hinh`)) +
  geom_area(fill = "skyblue", alpha = 0.3) +
  geom_line(color = "steelblue", linewidth = 1) +
  geom_point(color = "darkorange", size = 2) +
  geom_smooth(method = "loess", se = FALSE, color = "red", linetype = "dashed") +
  geom_text(aes(label = round(`Tai san co dinh vo hinh`, 2)), vjust = -1, size = 3) +
  labs(title = "Biểu đồ: Tài sản cố định vô hình", x = "Năm", y = "Giá trị (VND)") +
  theme_minimal(base_size = 13)
## `geom_smooth()` using formula = 'y ~ x'

ggplot(vondieule_summary, aes(x = Nhom_VonDieuLe)) +
  geom_linerange(aes(ymin = Min_TaiSan, ymax = Max_TaiSan), color = "gray50", size = 1.2) +
  geom_point(aes(y = Avg_TaiSan), color = "blue", size = 3) +
  geom_point(aes(y = Median_TaiSan), color = "red", size = 3, shape = 17) +
  geom_text(aes(y = Avg_TaiSan, label = round(Avg_TaiSan, 0)), vjust = -1, size = 3.2) +
  labs(
    title = "Khoảng biến thiên Tổng tài sản theo nhóm Vốn điều lệ",
    subtitle = "Chấm xanh: Trung bình | Chấm đỏ: Trung vị",
    x = "Nhóm Vốn điều lệ",
    y = "Tổng tài sản (VND)"
  ) +
  theme_minimal(base_size = 13)
## 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.