1 LỜI CẢM ƠN

Chúng em xin chân thành cảm ơn Thầy ThS. Trần Mạnh Tường đã tận tình hướng dẫn, chỉ bảo và luôn đồng hành cùng chúng em trong suốt quá trình thực hiện bài tiểu luận.

Nhờ những góp ý quý báu và sự hỗ trợ tận tâm của Thầy, chúng em đã hiểu rõ hơn nội dung học phần, rèn luyện được tư duy phân tích dữ liệu và kỹ năng trình bày kết quả một cách khoa học, rõ ràng hơn.

Bài tiểu luận này là kết quả của sự nỗ lực học tập và cố gắng của nhóm 14 dưới sự hướng dẫn tận tình của Thầy.

Chúng em xin gửi đến Thầy lời cảm ơn chân thành và kính chúc Thầy sức khỏe, thành công trong sự nghiệp giảng dạy.

Chúng em xin chân thành cảm ơn Thầy!

2 LỜI CAM ĐOAN

Em xin cam đoan rằng bài tiểu luận môn học này là tác phẩm nghiên cứu của cá nhân em. Các số liệu và kết quả được trình bày trong bài báo cáo là chính xác, đầy đủ và trung thực. Dữ liệu được trình bày trong bài nghiên cứu được công khai một cách minh bạch và được chấp thuận từ các cơ quan.

3 CHƯƠNG 1: PHÂN TÍCH HÀNH VI MUA SẮM TRỰC TUYẾN CỦA KHÁCH HÀNG

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

3.1.1 Bối cảnh & câu hỏi nghiên cứu

Bối cảnh Bộ dữ liệu ghi nhận hệ sinh thái hành vi mua sắm trên một nền tảng bán lẻ trực tuyến ở cấp mục giao dịch (item-level). Mỗi bản ghi gắn người mua (UserID, nhân khẩu học, quốc gia), sản phẩm (ProductID, tên, ngành hàng, giá), diễn biến giao dịch (thời điểm mua, số lượng, chiết khấu, thành tiền) cùng các tín hiệu trải nghiệm số (thời lượng phiên, thiết bị, nguồn giới thiệu) và phản hồi sau mua (điểm và văn bản đánh giá). Cấu trúc này cho phép chúng ta quan sát đồng thời động lực doanh thu, hiệu quả khuyến mãi, khác biệt hành vi đa kênh, và cảm nhận khách hàng trên một dòng thời gian đủ dài.

Mục tiêu kinh doanh

Phân tích nhằm phác họa chân dung khách hàng theo đặc điểm nhân khẩu học và hành vi sử dụng để nhận diện các phân khúc có giá trị cao; đồng thời xem xét các yếu tố ảnh hưởng đến doanh thu như đặc điểm sản phẩm, mức chi tiêu và xu hướng mua hàng giữa các nhóm người dùng. Nghiên cứu cũng đánh giá mức độ tương tác trên nền tảng qua thời lượng truy cập và kênh tiếp cận, cùng với mối liên hệ giữa trải nghiệm khách hàng và hành vi chi tiêu thông qua điểm đánh giá. Từ đó, đề xuất các giải pháp vận hành giúp tối ưu chiến lược giá, danh mục sản phẩm và định hướng marketing theo từng nhóm khách hàng và thị trường.

Giá trị kỳ vọng

Kết quả không chỉ dừng ở mô tả, mà hướng tới bằng chứng định lượng cho quyết định kinh doanh: xác định nhóm khách hàng trọng tâm, khung ưu đãi hiệu quả theo ngành hàng, khung giờ “vàng” cho chuyển đổi, và những nút thắt trải nghiệm cần cải thiện.

3.1.2 Mô tả & chất lượng dữ liệu

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

1. library(readr)
2. dataecommerce <- read_csv(file.choose())
3. dim(dataecommerce)
## [1] 100000     21

Giải thích kỹ thuật: (số dòng) thể hiển số dòng có trên code

(1) library(readr) giúp sử dụng hàm read_csv() của gói readr – công cụ nhanh và an toàn để đọc file CSV.

(2) file.choose() cho phép người dùng chọn trực tiếp file dữ liệu trên máy tính (trực quan, dễ dùng trong tiểu luận).

(3) Hàm dim() trả về một vector gồm 2 phần tử:

    Phần tử thứ nhất: số lượng quan sát (rows)

    Phần tử thứ hai: số lượng biến (columns)

Ý nghĩa thống kê:

Kết quả [1] 100000 21 cho biết bộ dữ liệu có 100.000 quan sát tương ứng với số dòng và 21 biến tương ứng với số cột.

3.1.2.2 Danh mục biến

1. library(dplyr)
2. colnames(dataecommerce)
##  [1] "UserID"             "UserName"           "Age"               
##  [4] "Gender"             "Country"            "SignUpDate"        
##  [7] "ProductID"          "ProductName"        "Category"          
## [10] "Price"              "PurchaseDate"       "Quantity"          
## [13] "TotalAmount"        "HasDiscountApplied" "DiscountRate"      
## [16] "ReviewScore"        "ReviewText"         "LastLogin"         
## [19] "SessionDuration"    "DeviceType"         "ReferralSource"

Giải thích kỹ thuật: (số dòng) thể hiển số dòng có trên code

Dòng 1: library(dplyr) → Nạp thư viện dplyr để thao tác và phân tích dữ liệu.

Dòng 2: colnames(dataecommerce) → Hiển thị tên các cột trong bảng dữ liệu dataecommerce.

Ý nghĩa:

Bộ dữ liệu dataecommerce gồm 21 biến, thể hiện đầy đủ các khía cạnh chính của hoạt động thương mại điện tử: thông tin người dùng, sản phẩm, giao dịch, hành vi truy cập, và đánh giá sau mua.

Lập bảng

Bảng 1. Danh mục biến trong bộ dữ liệu e-commerce
Tên_biến Ý_nghĩa
UserID Mã định danh của người dùng
UserName Tên hiển thị của người dùng
Age Tuổi của người dùng (năm)
Gender Giới tính của người dùng
Country Quốc gia cư trú
SignUpDate Ngày người dùng đăng ký tài khoản
ProductID Mã định danh của sản phẩm
ProductName Tên sản phẩm
Category Ngành hàng hoặc nhóm sản phẩm
Price Giá niêm yết của sản phẩm
PurchaseDate Ngày diễn ra giao dịch mua hàng
Quantity Số lượng sản phẩm được mua
TotalAmount Tổng giá trị của giao dịch
HasDiscountApplied Có áp dụng khuyến mãi hay không
DiscountRate Tỷ lệ chiết khấu
ReviewScore Điểm đánh giá sản phẩm
ReviewText Nội dung đánh giá bằng văn bản
LastLogin Thời điểm người dùng đăng nhập gần nhất
SessionDuration Thời lượng phiên truy cập (giây hoặc phút)
DeviceType Loại thiết bị truy cập (Mobile, Desktop, Tablet, …)
ReferralSource Nguồn giới thiệu hoặc kênh truy cập

3.1.2.3 Kiểu dữ liệu từng biến

1. table(sapply(dataecommerce, function(x) class(x)[1]))
## 
## character      Date   logical   numeric   POSIXct 
##         8         2         1         9         1

Giải thích kỹ thuật:

sapply(dataecommerce, function(x) class(x)[1]): lấy kiểu dữ liệu chính của từng cột trong bảng.

table(...): đếm số lượng biến theo từng kiểu dữ liệu (chr, dbl, lgl, Date, dttm, …).

Ý nghĩa:

Bộ dữ liệu bao gồm cả biến định tính, định lượng, nhị phân và thời gian, phản ánh đầy đủ các khía cạnh của hành vi mua sắm trực tuyến.

  • character (8 biến): chứa thông tin định tính như tên, giới tính, quốc gia, loại thiết bị, nội dung đánh giá,…

  • numeric (9 biến): gồm các biến định lượng như tuổi, giá, số lượng, tổng tiền, điểm đánh giá, thời lượng phiên,…

  • logical (1 biến): là biến nhị phân HasDiscountApplied, cho biết giao dịch có áp dụng giảm giá hay không.

  • POSIXct (1 biến): biểu thị thời gian chi tiết, ví dụ LastLogin — thời điểm đăng nhập gần nhất.

  • Date (2 biến): gồm SignUpDate và PurchaseDate, thể hiện ngày đăng ký tài khoản và ngày mua hàng.

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

1. colSums(is.na(dataecommerce))
##             UserID           UserName                Age             Gender 
##                  0                  0                  0                  0 
##            Country         SignUpDate          ProductID        ProductName 
##                  0                  0                  0                  0 
##           Category              Price       PurchaseDate           Quantity 
##                  0                  0                  0                  0 
##        TotalAmount HasDiscountApplied       DiscountRate        ReviewScore 
##                  0                  0                  0                  0 
##         ReviewText          LastLogin    SessionDuration         DeviceType 
##                  0                  0                  0                  0 
##     ReferralSource 
##                  0

Giải thích kỹ thuật:

Hàm is.na() xác định các giá trị bị thiếu trong từng cột, còn colSums() tính tổng số giá trị NA của mỗi biến.

Nhận xét:

Kết quả cho thấy không có giá trị bị thiếu (NA) trong toàn bộ bộ dữ liệu dataecommerce.

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

1. sum(duplicated(dataecommerce))
## [1] 0

Giải thích kỹ thuật:

duplicated(): hàm trong R dùng để xác định các dòng trùng lặp.

sum(duplicated(dataecommerce)): đếm tổng số dòng trùng lặp hoàn toàn giống nhau.

Nhận xét:

Kết quả cho thấy không có dòng trùng lặp trong bộ dữ liệu. Điều này chứng tỏ dữ liệu được ghi nhận duy nhất cho mỗi giao dịch, phản ánh chính xác hoạt động mua sắm.

3.1.2.6 Kiểm tra giá trị bất thường

Sau khi xác định các giá trị nằm ngoài miền hợp lệ, bước tiếp theo là kiểm tra tính logic giữa các biến nhằm đảm bảo dữ liệu được ghi nhận đúng theo mối quan hệ kinh tế và quy trình giao dịch thực tế, từ đó tăng độ tin cậy cho các phân tích ở các phần sau.

1. summary(dataecommerce[, c("Age", "Price", "Quantity", "DiscountRate")])
##       Age            Price           Quantity      DiscountRate   
##  Min.   :18.00   Min.   :  10.0   Min.   :1.000   Min.   :0.0000  
##  1st Qu.:31.00   1st Qu.: 257.1   1st Qu.:1.000   1st Qu.:0.1300  
##  Median :43.00   Median : 505.9   Median :2.000   Median :0.2500  
##  Mean   :43.46   Mean   : 505.6   Mean   :2.496   Mean   :0.2498  
##  3rd Qu.:56.00   3rd Qu.: 753.7   3rd Qu.:4.000   3rd Qu.:0.3700  
##  Max.   :69.00   Max.   :1000.0   Max.   :4.000   Max.   :0.5000

Giải thích kỹ thuật:

summary(): hiển thị thống kê tóm tắt (min, median, mean, max, quartiles) cho các biến định lượng được chọn.

Việc xem các giá trị tối thiểu và tối đa (min–max) giúp phát hiện những điểm ngoài miền hợp lệ, chẳng hạn:

Age < 0 hoặc > 100 → dữ liệu sai.

Price hoặc Quantity = 0 → cần kiểm tra lại logic kinh doanh.

DiscountRate > 1 hoặc < 0 → tỷ lệ chiết khấu không hợp lệ.

Ý nghĩa thống kê:

Kết quả cho thấy các biến đều nằm trong khoảng giá trị hợp lý. Không xuất hiện trường hợp nào vượt ngoài miền hợp lệ, chứng tỏ dữ liệu được ghi nhận chính xác và ổn định.

Điều này giúp đảm bảo độ tin cậy cho các phép thống kê tiếp theo, đặc biệt là khi tính trung bình, phương sai và xây dựng mô hình hồi quy.

3.1.2.7 Kiểm tra tính ràng buộc logic

Trước khi tiến hành các phân tích thống kê chi tiết, cần thực hiện kiểm tra tính logic và tính nhất quán của dữ liệu nhằm bảo đảm rằng các giá trị được ghi nhận phù hợp với mối quan hệ kinh tế thực tế, không vi phạm các quy tắc tính toán hay quy luật thời gian. Hai phép tính cần thực hiện để kiểm tra tính chính xác:

  • Kiểm tra ràng buộc giữa TotalAmount và Price * Quantity * (1 - DiscountRate) (**)

  • Kiểm tra tính nhất quán giữa HasDiscountApplied và DiscountRate > 0 (***)

1. library(dplyr)
2. check_amount <- dataecommerce %>%
3.   mutate(ExpectedAmount = Price * Quantity * (1 - DiscountRate),
4.          Sai_số = TotalAmount - ExpectedAmount)
5. summary(check_amount$Sai_số)
##    Min. 1st Qu.  Median    Mean 3rd Qu.    Max. 
##    0.00   71.49  198.41  314.88  443.26 1999.00
1. table(dataecommerce$HasDiscountApplied, dataecommerce$DiscountRate > 0)
##        
##         FALSE  TRUE
##   FALSE   486 49735
##   TRUE    529 49250

Giải thích kỹ thuật: (số dòng) thể hiển số dòng có trên code

(**)

(1) Nạp gói dữ liệu để dùng %>%, mutate()

(2) %>% → Toán tử pipe, truyền dữ liệu dataecommerce vào hàm sau.

(3) mutate() tạo biến mới ExpectedAmount tính tổng tiền lý thuyết dựa trên giá, số lượng và tỷ lệ chiết khấu.

So sánh TotalAmount với ExpectedAmount để phát hiện sai lệch do làm tròn hoặc lỗi nhập liệu.(Sai_số = TotalAmount - ExpectedAmount)

(4) Summary() cho biết mức độ sai lệch trung bình và cực trị.

(***)

(1) table() đối chiếu biến nhị phân HasDiscountApplied với điều kiện DiscountRate > 0 nhằm kiểm tra tính logic của việc gắn nhãn “có khuyến mãi”.

Nhận xét:

Vì lí do bộ dữ liệu là mô phỏng nên độ chính xác và logic vẫn còn nhiều hạn chế. Nên, sai số giữa TotalAmount và công thức Price × Quantity × (1 – DiscountRate) dao động khá lớn, trung bình 314,88.

Mối quan hệ giữa HasDiscountApplied và DiscountRate cũng chưa nhất quán, khi một số giao dịch được gắn nhãn “không khuyến mãi” nhưng vẫn có tỷ lệ giảm giá, và ngược lại.

Vì vậy, trong Phần 2 - Phương pháp và xử lý dữ liệu, cần chuẩn hóa lại các biến liên quan đến giá trị và khuyến mãi để đảm bảo tính logic và độ tin cậy cho các phân tích tiếp theo.

3.2 PHƯƠNG PHÁP VÀ XỬ LÝ DỮ LIỆU

3.2.1 Làm sạch dữ liệu

3.2.1.1 Xử lý không ăn khớp giữa các biến

3.2.1.1.1 Xử lý không ăn khớp giữa ProductName và Category**

Việc chuẩn hóa mối quan hệ giữa ProductName và Category giúp đảm bảo tính nhất quán trong phân loại sản phẩm, tránh tình trạng cùng một mặt hàng bị gán vào nhiều nhóm khác nhau.

Nhờ đó, các phân tích thống kê sau này như doanh thu theo danh mục, hành vi mua sắm theo ngành hàng sẽ trở nên chính xác và có ý nghĩa hơn.

1. library(dplyr)
2. category_map <- data.frame(
3.   ProductName = c("Laptop", "Smartphone", "Headphones", "Shoes", "T-shirt", "Book", "Watch"),
4.   CorrectCategory = c("Electronics", "Electronics", "Electronics", "Apparel", "Apparel", "Books", "Accessories")
5. )
6. dataecommerce <- dataecommerce %>%
7.   left_join(category_map, by = "ProductName") %>%
8.   mutate(Category = CorrectCategory) %>%
9.   select(-CorrectCategory)
10. head(dataecommerce, 10) 
1. dim(dataecommerce)
## [1] 100000     21

Giải thích kỹ thuật: (số dòng) thể hiển số dòng có trên code

(1) nạp thư viện dplyr để dùng các hàm xử lí dữ liệu

(2) Tạo bảng category_map là bảng ánh xạ chuẩn, chứa cột ProductName và CorrectCategory, dùng làm cơ sở đối chiếu giữa tên sản phẩm và danh mục đúng.

(8) left_join() dùng để nối bảng chính dataecommerce với category_map theo khóa ProductName, giúp lấy ra danh mục chuẩn.

(9) mutate(Category = CorrectCategory) cập nhật lại giá trị trong cột Category bằng danh mục đúng.

(10) select(-CorrectCategory) loại bỏ cột tạm sau khi cập nhật để dữ liệu gọn gàng.

(12)-(13) head() xem 10 dòng đầu và dim() xác nhận số quan sát, đảm bảo không bị mất dữ liệu trong quá trình nối.
3.2.1.1.2 Xử lý không ăn khớp giữa ReviewScore và ReviewText

Vì bộ dữ liệu ban đầu có sự không trùng khớp giữa ReviewScore và ReviewText, cụ thể như các số điểm mà khách hàng đánh giá không đồng nhất với mức đánh giá (ví dụ 5 điểm sẽ cho là average nhưng chỗ khác sẽ là poor).

Chính vì vậy nhóm em đã phân tổ số điểm như sau để quy ra các mức đánh giá, thuận tiện trong việc phân tích hành vi khách hàng dễ hơn.

  • Dưới 4 điểm: “Poor”

  • Từ 4 điểm đến dưới 7 điểm: “Average”

  • Từ 7 điểm đến dưới 9 điểm: “Good”

  • Trên 9 điểm: “Exellent”

1. library(dplyr)
2. dataecommerce <- dataecommerce %>%
3.   mutate(
4.     ReviewText = case_when(
5.       ReviewScore < 4 ~ "Poor",
6.       ReviewScore >= 4 & ReviewScore < 7 ~ "Average",
7.       ReviewScore >= 7 & ReviewScore < 9 ~ "Good",
8.       ReviewScore >= 9 ~ "Excellent",
9.       TRUE ~ "Unknown"
10.     )
11.   )
12. table(dataecommerce$ReviewText)
## 
## Average    Good    Poor 
##   52145     159   47696
1. summary(dataecommerce$ReviewScore)
##    Min. 1st Qu.  Median    Mean 3rd Qu.    Max. 
##  -0.600   3.300   4.000   4.006   4.700   8.600

Giải thích kỹ thuật: (số dòng) thể hiển số dòng có trên code

Chuẩn hóa và phân loại lại ReviewScore theo mức cảm xúc tương ứng của ReviewText

(3) mutate() tạo hoặc cập nhật biến ReviewText dựa vào giá trị ReviewScore.

(4) case_when() chia ReviewScore thành 4 mức:

  < 4 → Poor

  4–6.9 → Average

  7–8.9 → Good

  ≥ 9 → Excellent

(9) TRUE ~ "Unknown" đóng vai trò “điều kiện bắt tất cả”, giúp gán nhãn cho các giá trị ngoài khoảng hợp lệ hoặc NA, tránh phát sinh giá trị trống khi xử lý.

(13) Tạo bảng tần suất nội dung đánh giá (ReviewText).
(14) Thống kê mô tả điểm đánh giá (ReviewScore).

3.2.2 Chuẩn hóa ràng buộc logic

Sau khi đã làm sạch và chuẩn hóa các biến mô tả, bước tiếp theo là kiểm tra và hiệu chỉnh ràng buộc logic giữa các biến giá trị trong giao dịch.

Mục tiêu là đảm bảo công thức tính toán và trạng thái khuyến mãi trong dữ liệu phản ánh đúng thực tế kinh doanh, không sai lệch do nhập liệu hay làm tròn giá trị.

1. library(dplyr)
2. dataecommerce <- dataecommerce %>%
3.   mutate(ExpectedAmount = Price * Quantity * (1 - DiscountRate),
4.          Difference = TotalAmount - ExpectedAmount)
5. dataecommerce <- dataecommerce %>%
6.   mutate(LogicFlag = ifelse(abs(Difference) / ExpectedAmount > 0.02, 1, 0))
7. dataecommerce <- dataecommerce %>%
8.   mutate(HasDiscountApplied = ifelse(DiscountRate > 0, 1, 0))
9. summary(dataecommerce$Difference)
##    Min. 1st Qu.  Median    Mean 3rd Qu.    Max. 
##    0.00   71.49  198.41  314.88  443.26 1999.00
1. table(dataecommerce$LogicFlag)
## 
##     0     1 
##  3011 96989
1. table(dataecommerce$HasDiscountApplied)
## 
##     0     1 
##  1015 98985

Giải thích kỹ thuật: (số dòng) thể hiển số dòng có trên code

(1) Nạp thư viện dplyr để sử dụng các hàm xử lý dữ liệu
.
(3-4) Tính ExpectedAmount (tổng tiền lý thuyết) và Difference (sai lệch giữa thực tế và lý thuyết).

(7) Tạo biến LogicFlag; gán 1 nếu sai lệch > 2%, ngược lại 0.

(10) Chuẩn hóa biến HasDiscountApplied; gán 1 nếu có giảm giá (DiscountRate > 0), ngược lại 0.

(12) summary(Difference) → xem thống kê mô tả của sai lệch.

(13) table(LogicFlag) → đếm số bản ghi sai lệch và hợp lệ.

(14) table(HasDiscountApplied) → đếm số giao dịch có và không áp dụng khuyến mãi.

Ý nghĩa thống kê

Kết quả cho thấy chênh lệch giữa TotalAmount thực tế và giá trị tính theo công thức chuẩn có trung vị khoảng 198.41 và trung bình khoảng 314.88, với sai lệch lớn nhất lên tới 1.999.

Bên cạnh đó, cột LogicFlag cho thấy có 3.011 dòng (≈3%) bị gắn cờ sai lệch logic, trong khi 96.989 dòng (≈97%) tuân thủ công thức tính.

Đối với HasDiscountApplied, có 1.015 dòng ghi nhận không nhất quán với điều kiện DiscountRate > 0.

-> Điều này chứng tỏ cần chuẩn hóa lại các biến giá trị và trạng thái khuyến mãi để đảm bảo tính thống nhất trước khi phân tích sâu hơn về doanh thu và hành vi khách hàng ở các phần tiếp theo:

1. library(dplyr)
2. dataecommerce <- dataecommerce %>%
3.   mutate(TotalAmount = Price * Quantity * (1 - DiscountRate))
4. dataecommerce <- dataecommerce %>%
5.   mutate(HasDiscountApplied = ifelse(DiscountRate > 0, TRUE, FALSE))
6. summary(dataecommerce$TotalAmount)
##     Min.  1st Qu.   Median     Mean  3rd Qu.     Max. 
##    5.228  356.311  730.275  945.968 1378.670 3977.000
1. table(dataecommerce$HasDiscountApplied)
## 
## FALSE  TRUE 
##  1015 98985

Giải thích kỹ thuật: (số dòng) thể hiển số dòng có trên code

(3) mutate() được dùng để ghi đè giá trị TotalAmount bằng công thức chuẩn:

TotalAmount=Price×Quantity×(1−DiscountRate) nhằm loại bỏ sai lệch do làm tròn, thuế, hoặc lỗi nhập liệu.

(5) Biến HasDiscountApplied được chuyển về dạng logic (TRUE/FALSE):

TRUE nếu có giảm giá (DiscountRate > 0),

FALSE nếu không có giảm giá (DiscountRate = 0).

(7-8) Việc kiểm tra bằng summary(): xem thống kê mô tả tổng tiền và table(): đếm số giao dịch có và không áp dụng giảm giá. giúp đảm bảo giá trị được cập nhật đúng và không mất dữ liệu.

Ý nghĩa thống kê

Sau khi hiệu chỉnh, biến TotalAmount có giá trị dao động từ 5.23 đến 3,977, với trung vị khoảng 730.28 và trung bình khoảng 945.97, phản ánh hợp lý quy mô thanh toán trong các giao dịch thương mại điện tử.

Cột HasDiscountApplied cho thấy 98,985 giao dịch (≈99%) có khuyến mãi và 1,015 giao dịch (≈1%) không áp dụng giảm giá, chứng tỏ chương trình khuyến mãi được triển khai rộng rãi trong dữ liệu.

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

Phần này trình bày các bước thông kê mô tả và phân tích dữ liệu dựa trên bộ dữ liệu thương mại điện tử và được chuẩn hóa ở các chương trước.

Mục tiêu nhằm mô tả đặc điểm chung của khách hàng, sản phẩm và hành vi mua sắm và phát hiện các xu hướng, mối quan hệ và sự khác biệt giữa các nhóm biến. Từ đó làm cơ sở cho các mô hình phân tích nâng cao hơn ở phần sau.

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

Phân tổ giúp nhóm các biến liên tục hoặc rời rạc thành các nhóm có ý nghĩa thống kê và kinh doanh, nhằm thuận tiện cho việc mô tả, so sánh, và trực quan hóa trong các phần tiếp theo. Những phân tổ dưới đây được xây dựng dựa trên đặc điểm tự nhiên của biến và thực tiễn thương mại điện tử.

3.3.1.1 Phân tổ theo Giá sản phẩm (PriceGroup)

Mục đích: Nhóm các sản phẩm thành phân khúc giá để đánh giá hành vi mua và doanh thu theo cấp độ giá.

1. dataecommerce <- dataecommerce %>%
2.   mutate(PriceGroup = case_when(
3.     Price < 50 ~ "Giá thấp (<50)",
4.     Price >= 50 & Price < 150 ~ "Trung bình thấp (50–149)",
5.     Price >= 150 & Price < 300 ~ "Trung bình (150–299)",
6.     Price >= 300 & Price < 600 ~ "Trung bình cao (300–599)",
7.     TRUE ~ "Cao cấp (≥600)"
8.   ))
9. price_table <- table(dataecommerce$PriceGroup)
10. format(price_table, big.mark = ".", scientific = FALSE)
## 
##           Cao cấp (≥600)           Giá thấp (<50)     Trung bình (150–299) 
##                 "40.585"                 " 4.054"                 "15.340" 
## Trung bình cao (300–599) Trung bình thấp (50–149) 
##                 "30.020"                 "10.001"

Giải thích kỹ thuật:

(2) mutate() dùng để tạo biến mới.  
(2) case_when() chia giá trị Price theo điều kiện cụ thể: (3-7)  
(7) TRUE ~ đóng vai trò “điều kiện mặc định” cho các giá trị còn lại.  
(10) dataecommerce$PriceGroup cho biết tần suất   
(11) format(..., big.mark = ".") là cách chuẩn để hiển thị số có dấu phân cách hàng nghìn

Ý nghĩa thống kê

Nhóm sản phẩm cao cấp (≥600) chiếm tỷ trọng lớn nhất với 40.585 giao dịch, cho thấy phân khúc này đóng vai trò chủ lực trong doanh thu.
Nhóm trung bình cao (300–599) cũng có lượng mua đáng kể (30.020), phản ánh nhu cầu ổn định ở phân khúc tầm trung.
Các nhóm trung bình (150–299) và trung bình thấp (50–149) có quy mô nhỏ hơn (15.340 và 10.001), trong khi giá thấp (<50) chỉ chiếm tỷ lệ rất nhỏ (4.054).
Điều này cho thấy người tiêu dùng có xu hướng tập trung vào các sản phẩm tầm trung và cao cấp hơn là giá rẻ, phản ánh đặc trưng tiêu dùng của khách hàng có thu nhập khá và định hướng chất lượng sản phẩm.

3.3.1.2 Phân tổ theo Số lượng mua (QuantityGroup)

Mục đích: Nhận diện hành vi mua lẻ hay mua số lượng lớn.

1. dataecommerce <- dataecommerce %>%
2.   mutate(QuantityGroup = case_when(
3.     Quantity == 1 ~ "Mua đơn chiếc",
4.     Quantity >= 2 & Quantity <= 5 ~ "Mua nhỏ lẻ (2–5)",
5.     Quantity > 5 & Quantity <= 10 ~ "Mua vừa (6–10)",
6.     TRUE ~ "Mua lớn (>10)"
7.   ))
8. quantity_table <- table(dataecommerce$QuantityGroup)
9. format(quantity_table, big.mark = ".", scientific = FALSE)
## 
##    Mua đơn chiếc Mua nhỏ lẻ (2–5) 
##         "25.244"         "74.756"

Giải thích kỹ thuật:

(2) case_when() chia nhóm dựa trên điều kiện về Quantity: (3-6)

(6) TRUE ~ đóng vai trò “điều kiện mặc định” cho các giá trị còn lại.

(9) table(dataecommerce$QuantityGroup) cho biết tần suất từng nhóm.

(10)  format(..., big.mark = ".") là cách chuẩn để hiển thị số có dấu phân cách hàng nghìn

Ý nghĩa thống kê

Phần lớn các giao dịch thuộc nhóm mua nhỏ lẻ (2–5 sản phẩm) với 74.756 lượt, chiếm tỷ trọng áp đảo trong toàn bộ dữ liệu.

Trong khi đó, nhóm mua đơn chiếc chỉ có 25.244 giao dịch, thể hiện rằng khách hàng có xu hướng mua nhiều sản phẩm trong cùng một đơn hàng - có thể nhằm tận dụng khuyến mãi hoặc giảm chi phí vận chuyển.

Điều này phản ánh hành vi mua sắm thông minh và có tính tối ưu, đặc trưng của người tiêu dùng trên các nền tảng thương mại điện tử, nơi các chính sách khuyến mãi theo số lượng khuyến khích người dùng mua nhiều hơn trong một lần giao dịch.

3.3.1.3 Phân tổ theo Thời gian đăng ký (SignUpPeriod)

Mục đích: Xác định nhóm khách hàng theo thời kỳ gia nhập hệ thống để phân tích “tuổi đời tài khoản” và hành vi mua theo cohort.

1. dataecommerce <- dataecommerce %>%
2.   mutate(SignUpPeriod = case_when(
3.     SignUpDate < as.Date("2020-01-01") ~ "Trước 2020",
4.     SignUpDate >= as.Date("2020-01-01") & SignUpDate < as.Date("2021-01-01") ~ "Năm 2020",
5.     SignUpDate >= as.Date("2021-01-01") & SignUpDate < as.Date("2022-01-01") ~ "Năm 2021",
6.     SignUpDate >= as.Date("2022-01-01") & SignUpDate < as.Date("2023-01-01") ~ "Năm 2022",
7.     TRUE ~ "Từ 2023 trở đi"
8.   ))
9. table(dataecommerce$SignUpPeriod)
## 
## Năm 2020 Năm 2021 Năm 2022 
##    33629    33142    33229

Giải thích kỹ thuật:

as.Date() chuyển chuỗi ký tự thành định dạng ngày.

mutate() thêm cột phân nhóm mới.

table() tóm tắt số lượng khách theo từng năm đăng ký.

Ý nghĩa thống kê

Số lượng người dùng đăng ký khá ổn định qua các năm, với 33.629 tài khoản trong năm 2020, 33.142 trong năm 2021, và 33.229 trong năm 2022.

Sự chênh lệch nhỏ giữa các năm cho thấy tốc độ thu hút người dùng duy trì ổn định, không có biến động lớn.

Điều này phản ánh nền tảng thương mại điện tử có khả năng giữ mức tăng trưởng người dùng bền vững, thể hiện chiến lược marketing và giữ chân khách hàng tương đối hiệu quả trong giai đoạn 2020–2022.

3.3.1.4 Phân tổ theo Thời lượng phiên (SessionGroup)

Mục tiêu: Nhận biết nhóm người dùng theo mức độ tương tác (session duration).

1. dataecommerce <- dataecommerce %>%
2.   mutate(SessionGroup = case_when(
3.     SessionDuration < 60 ~ "Ngắn (<1 phút)",
4.     SessionDuration >= 60 & SessionDuration < 300 ~ "Trung bình (1–5 phút)",
5.     SessionDuration >= 300 & SessionDuration < 900 ~ "Dài (5–15 phút)",
6.     TRUE ~ "Rất dài (>15 phút)"
7.   ))
8. table(dataecommerce$SessionGroup)
## 
##        Ngắn (<1 phút) Trung bình (1–5 phút) 
##                 47818                 52182

Giải thích kỹ thuật:

(2) SessionDuration được chia theo mốc thời gian quy đổi sang giây hoặc phút.

case_when() nhóm theo ngưỡng định sẵn.

table() cho biết tần suất từng loại phiên.

Ý nghĩa thống kê

Phần lớn người dùng có thời lượng phiên truy cập trung bình (1–5 phút) với 52.182 phiên, cao hơn nhóm phiên ngắn (<1 phút) gồm 47.818 phiên.

Điều này cho thấy đa số khách hàng dành thời gian vừa đủ để xem xét sản phẩm trước khi quyết định mua, phản ánh mức độ tương tác khá tích cực trên nền tảng.

Tuy nhiên, tỷ lệ phiên ngắn vẫn lớn, gợi ý rằng một phần người dùng rời bỏ sớm — có thể do trải nghiệm chưa tối ưu hoặc không tìm thấy sản phẩm mong muốn, cần được xem xét cải thiện giao diện và gợi ý sản phẩm.

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

Phần này tiến hành mô tả thống kê các biến định lượng quan trọng còn lại trong bộ dữ liệu thương mại điện tử, nhằm nhận diện đặc điểm phân phối, độ biến động và xu hướng trung tâm của từng biến.

3.3.2.1 Biến Price (Giá sản phẩm)

1. library(dplyr)
2. dataecommerce %>%
3.   summarise(
4.     So_nam = n(),
5.     Gia_tri_trung_binh = mean(Price, na.rm = TRUE),
6.     Trung_vi = median(Price, na.rm = TRUE),
7.     Lon_nhat = max(Price, na.rm = TRUE),
8.     Nho_nhat = min(Price, na.rm = TRUE),
9.     Do_lech_chuan = sd(Price, na.rm = TRUE),
10.     Heso_Bien_thien = sd(Price, na.rm = TRUE) / mean(Price, na.rm = TRUE) * 100,
11.     Q1 = quantile(Price, 0.25, na.rm = TRUE),
12.     Q3 = quantile(Price, 0.75, na.rm = TRUE)
13.   )

Giải thích kỹ thuật:

(2) dataecommerce %>% summarise(...) → Tạo bảng tóm tắt thống kê cho biến Price.

(3) So_nam = n() → Đếm số lượng quan sát (số dòng dữ liệu).

(4) Gia_tri_trung_binh = mean(Price, na.rm = TRUE) → Tính giá trị trung bình của Price, bỏ qua giá trị NA.

(5) Trung_vi = median(Price, na.rm = TRUE) → Tính trung vị – giá trị nằm giữa tập dữ liệu.

(6) Lon_nhat = max(Price, na.rm = TRUE) → Tìm giá trị lớn nhất.

(7) Nho_nhat = min(Price, na.rm = TRUE) → Tìm giá trị nhỏ nhất.

(8) Do_lech_chuan = sd(Price, na.rm = TRUE) → Tính độ lệch chuẩn, thể hiện mức độ phân tán của giá.

(9) Heso_Bien_thien = sd(Price, na.rm = TRUE) / mean(Price, na.rm = TRUE) * 100
→ Tính hệ số biến thiên (%), đo mức độ dao động tương đối của giá so với trung bình.

(10) Q1 = quantile(Price, 0.25, na.rm = TRUE) → Tính tứ phân vị thứ nhất (Q1) – 25% giá trị nhỏ hơn mức này.

(11) Q3 = quantile(Price, 0.75, na.rm = TRUE) → Tính tứ phân vị thứ ba (Q3) – 75% giá trị nhỏ hơn mức này.

Ý nghĩa thống kê

Giá sản phẩm trung bình 505,63, dao động từ 10 đến 999,98, cho thấy danh mục hàng hóa rất đa dạng.

Độ lệch chuẩn 286,14 và hệ số biến thiên 56,6% phản ánh mức biến động giá cao.

Khoảng tứ phân vị 257–754 cho thấy phần lớn sản phẩm thuộc phân khúc trung và trung–cao cấp, trong khi nhóm cao cấp chỉ chiếm tỷ trọng nhỏ nhưng kéo trung bình lên.

→ Vậy ta nhận định được giá của các sản phẩm có ở bộ dữ liệu có sự phân hóa rõ rệt, xu hướng tập trung vào sản phẩm trung nhưng vẫn chịu ảnh hưởng đáng kể từ 1 số mặt hàng cao cấp.

3.3.2.2 Biến Quantity (Số lượng mua)

1. dataecommerce %>%
2.   summarise(
3.     So_quansat = n(),
4.     Gia_tri_trung_binh = mean(Quantity, na.rm = TRUE),
5.     Trung_vi = median(Quantity, na.rm = TRUE),
6.     Lon_nhat = max(Quantity, na.rm = TRUE),
7.     Nho_nhat = min(Quantity, na.rm = TRUE),
8.     Do_lech_chuan = sd(Quantity, na.rm = TRUE),
9.     Heso_Bien_thien = sd(Quantity, na.rm = TRUE) / mean(Quantity, na.rm = TRUE) * 100,
10.     Q1 = quantile(Quantity, 0.25, na.rm = TRUE),
11.     Q3 = quantile(Quantity, 0.75, na.rm = TRUE)
12.   )

Giải thích kỹ thuật:

Tao bảng tóm tắt thống kê cho biến Quantity

Mục đích tương tự như biến Price

Ý nghĩa thống kê

Số lượng mua trung bình 2,50 sản phẩm, trung vị 2, dao động từ 1 đến 4, cho thấy khách hàng chủ yếu mua ít sản phẩm mỗi đơn.

Độ lệch chuẩn 1,12 và hệ số biến thiên 44,9% thể hiện mức biến động vừa phải, phù hợp với hành vi mua lẻ phổ biến trong thương mại điện tử.

3.3.2.3 Biến SessionDuration (Thời lượng phiên truy cập)

1. dataecommerce %>%
2.   summarise(
3.     So_quansat = n(),
4.     Gia_tri_trung_binh = mean(SessionDuration, na.rm = TRUE),
5.     Trung_vi = median(SessionDuration, na.rm = TRUE),
6.     Lon_nhat = max(SessionDuration, na.rm = TRUE),
7.     Nho_nhat = min(SessionDuration, na.rm = TRUE),
8.     Do_lech_chuan = sd(SessionDuration, na.rm = TRUE),
9.     Heso_Bien_thien = sd(SessionDuration, na.rm = TRUE) / mean(SessionDuration, na.rm = TRUE) * 100,
10.     Q1 = quantile(SessionDuration, 0.25, na.rm = TRUE),
11.     Q3 = quantile(SessionDuration, 0.75, na.rm = TRUE)
12.   )

Giải thích kỹ thuật:

Tạo bảng tóm tắt thống kê cho biến SessionDuration

Mục đích tương tự như biến Price

Ý nghĩa thống kê

Thời lượng phiên trung bình 62,41 giây, trung vị tương đương (62,42), dao động từ 5 đến 120 giây.

Độ lệch chuẩn 33,18 và hệ số biến thiên 53,16% cho thấy mức độ phân tán vừa phải, phản ánh sự khác biệt về mức độ tương tác của người dùng.

Phần lớn phiên truy cập nằm trong khoảng 33–91 giây, thể hiện hành vi xem xét sản phẩm nhanh, phổ biến trong thương mại điện tử hiện nay.

3.3.2.4 Biến ExpectedAmount (Tổng tiền kỳ vọng)

1. dataecommerce %>%
2.   summarise(
3.     So_quansat = n(),
4.     Gia_tri_trung_binh = mean(ExpectedAmount, na.rm = TRUE),
5.     Trung_vi = median(ExpectedAmount, na.rm = TRUE),
6.     Lon_nhat = max(ExpectedAmount, na.rm = TRUE),
7.     Nho_nhat = min(ExpectedAmount, na.rm = TRUE),
8.     Do_lech_chuan = sd(ExpectedAmount, na.rm = TRUE),
9.     Heso_Bien_thien = sd(ExpectedAmount, na.rm = TRUE) / mean(ExpectedAmount, na.rm = TRUE) * 100,
10.     Q1 = quantile(ExpectedAmount, 0.25, na.rm = TRUE),
11.     Q3 = quantile(ExpectedAmount, 0.75, na.rm = TRUE)
12.   )

Giải thích kỹ thuật:

ExpectedAmount được tính theo công thức chuẩn Price * Quantity * (1 - DiscountRate).

summarise() cung cấp tóm tắt nhanh toàn bộ phân phối giá trị.

Ý nghĩa thống kê

Giá trị trung bình 945,97, trung vị 730,27, dao động từ 5,23 đến 3.977, cho thấy sự chênh lệch lớn giữa các giao dịch.

Độ lệch chuẩn 758,65 và hệ số biến thiên 80,20% phản ánh mức biến động cao, đặc trưng của giá trị thanh toán không đồng nhất giữa các nhóm khách hàng.

Khoảng tứ phân vị 356–1.379 cho thấy phần lớn đơn hàng có giá trị trung bình đến cao, trong khi một số ít giao dịch có tổng tiền rất lớn kéo trung bình tăng mạnh.

3.3.3 Phân tích đa biến

3.3.3.1 Phân tích theo loại thiết bị truy cập và tổng tiền kỳ vọng

Trong phân tích này, ta xem xét mối quan hệ giữa loại thiết bị truy cập (DeviceType) và tổng tiền kỳ vọng (ExpectedAmount). Mục tiêu nhằm xác định thiết bị nào mang lại giá trị giao dịch trung bình cao hơn, từ đó đánh giá hiệu quả hành vi mua sắm theo nền tảng.

1. thongke_Device_Amount <- dataecommerce %>%
2. group_by(DeviceType) %>%
3. summarise(
4. Soluong = n(),
5. TB_Tongtien = mean(ExpectedAmount, na.rm = TRUE),
6. Lon_nhat = max(ExpectedAmount, na.rm = TRUE),
7. Nho_nhat = min(ExpectedAmount, na.rm = TRUE),
8. Trung_vi = median(ExpectedAmount, na.rm = TRUE),
9. Do_lech_chuan = sd(ExpectedAmount, na.rm = TRUE),
10. Q1 = quantile(ExpectedAmount, 0.25, na.rm = TRUE),
11. Q3 = quantile(ExpectedAmount, 0.75, na.rm = TRUE)
12. ) %>%
13. arrange(DeviceType)
14. thongke_Device_Amount

Giải thích kỹ thuật:

(1–2) Dùng toán tử %>% và group_by(DeviceType) để chia dữ liệu thành từng nhóm theo loại thiết bị (Desktop, Mobile, Tablet). Mỗi nhóm sẽ được tính thống kê riêng.

(3–10) summarise(...)
→ Tạo bảng thống kê mô tả theo từng loại thiết bị cho biến ExpectedAmount:

(4) Soluong = n() → Đếm số giao dịch trên mỗi loại thiết bị.

(5) TB_Tongtien = mean(ExpectedAmount, na.rm = TRUE) → Tính tổng tiền kỳ vọng trung bình theo từng thiết bị.

(6) Lon_nhat = max(...) → Giá trị ExpectedAmount lớn nhất trên thiết bị đó.

(7) Nho_nhat = min(...) → Giá trị ExpectedAmount nhỏ nhất.

(8) Trung_vi = median(...) → Trung vị của tổng tiền kỳ vọng.

(9) Do_lech_chuan = sd(...) → Độ lệch chuẩn, thể hiện mức độ biến động của tổng tiền kỳ vọng.

(10) Q1 = quantile(..., 0.25, ...) → Tứ phân vị thứ nhất (Q1) – mức mà 25% giao dịch có tổng tiền kỳ vọng thấp hơn.

(11) Q3 = quantile(..., 0.75, ...) → Tứ phân vị thứ ba (Q3) – 75% giao dịch có tổng tiền kỳ vọng thấp hơn mức này.

(13) arrange(DeviceType)
→ Sắp xếp lại kết quả theo tên loại thiết bị (DeviceType) cho dễ đọc.

(14) In ra bảng kết quả thống kê theo từng loại thiết bị.

Ý nghĩa thống kê

Kết quả cho thấy sự khác biệt giữa ba loại thiết bị là không lớn, với tổng tiền kỳ vọng trung bình dao động quanh 942–950.

  • Người dùng Mobile có giá trị trung bình cao nhất (949,84),

  • Theo sau là Tablet (945,97) và Desktop (942,03).

  • Độ lệch chuẩn (≈755–761) tương đương nhau, phản ánh mức độ biến động giá trị giao dịch ổn định giữa các thiết bị.

Điều này cho thấy hành vi mua sắm khá đồng nhất trên các nền tảng, tuy nhiên nhóm người dùng di động (Mobile) có thể là phân khúc tiềm năng hơn nhờ sự tiện lợi và tần suất truy cập cao của điện thoại di động.

3.3.3.2 Phân tích theo quốc gia và tổng tiền kỳ vọng

Phân tích này nhằm đánh giá sự khác biệt về tổng tiền kỳ vọng (ExpectedAmount) giữa các quốc gia (Country), qua đó nhận diện mức chi tiêu trung bình và độ biến động giao dịch theo từng thị trường. Kết quả giúp hiểu rõ hơn về hành vi mua sắm theo khu vực địa lý.

1. thongke_Country_Amount <- dataecommerce %>%
2. group_by(Country) %>%
3. summarise(
4. Soluong = n(),
5. TB_Tongtien = mean(ExpectedAmount, na.rm = TRUE),
6. Lon_nhat = max(ExpectedAmount, na.rm = TRUE),
7. Nho_nhat = min(ExpectedAmount, na.rm = TRUE),
8. Trung_vi = median(ExpectedAmount, na.rm = TRUE),
9. Do_lech_chuan = sd(ExpectedAmount, na.rm = TRUE),
10. Q1 = quantile(ExpectedAmount, 0.25, na.rm = TRUE),
11. Q3 = quantile(ExpectedAmount, 0.75, na.rm = TRUE)
12. ) %>%
13. arrange(desc(TB_Tongtien))
14. thongke_Country_Amount

Giải thích kỹ thuật:

Mục đích tương tự như mục "Phân tích theo Loại thiết bị truy cập và Tổng tiền kỳ vọng"

Ý nghĩa thống kê

Giữa các quốc gia, mức tổng tiền kỳ vọng dao động hẹp (942–949), cho thấy hành vi chi tiêu khá đồng nhất.

  • UK có mức trung bình cao nhất (949,35) và USA thấp nhất (942,65), song chênh lệch không đáng kể.

  • Trung vị (~726–738) phản ánh sự ổn định trong phân bố chi tiêu.

  • Độ lệch chuẩn (~755–762) gần tương đương giữa các quốc gia, cho thấy mức biến động giá trị đơn hàng tương tự nhau.

Nhìn chung, không có sự khác biệt rõ ràng giữa các thị trường, tuy nhiên các quốc gia như UK, Australia có thể được xem là phân khúc khách hàng chi tiêu cao hơn nhẹ, thích hợp để ưu tiên trong chiến lược marketing mở rộng.

3.3.3.3 Phân tích theo nguồn giới thiệu và tổng tiền kỳ vọng

Phân tích này xem xét tổng tiền kỳ vọng (ExpectedAmount) theo nguồn giới thiệu (ReferralSource), nhằm đánh giá hiệu quả của các kênh marketing trong việc thu hút khách hàng có giá trị giao dịch cao.

1. thongke_Referral_Amount <- dataecommerce %>%
2. group_by(ReferralSource) %>%
3. summarise(
4. Soluong = n(),
5. TB_Tongtien = mean(ExpectedAmount, na.rm = TRUE),
6. Lon_nhat = max(ExpectedAmount, na.rm = TRUE),
7. Nho_nhat = min(ExpectedAmount, na.rm = TRUE),
8. Trung_vi = median(ExpectedAmount, na.rm = TRUE),
9. Do_lech_chuan = sd(ExpectedAmount, na.rm = TRUE),
10. Q1 = quantile(ExpectedAmount, 0.25, na.rm = TRUE),
11. Q3 = quantile(ExpectedAmount, 0.75, na.rm = TRUE)
12. ) %>%
13. arrange(desc(TB_Tongtien))
14. thongke_Referral_Amount

Giải thích kỹ thuật:

Mục đích tương tự như mục "Phân tích theo Loại thiết bị truy cập và Tổng tiền kỳ vọng"

Ý nghĩa thống kê

Kết quả cho thấy sự khác biệt nhẹ giữa các nguồn giới thiệu, với tổng tiền kỳ vọng trung bình dao động trong khoảng 942–951.

  • Ad Campaign đạt mức trung bình cao nhất (950,69), thể hiện hiệu quả quảng cáo trả phí tốt trong việc thu hút khách hàng có giá trị mua cao.

  • Email Marketing và Social Media có giá trị trung bình tương đương (~945), chứng tỏ sự ổn định của các kênh tiếp cận trực tiếp.

  • Organic Search thấp nhất (942,65), phản ánh người dùng tự tìm kiếm thường chi tiêu thận trọng hơn.

Độ lệch chuẩn (≈753–764) giữa các nhóm gần tương đồng, cho thấy mức độ biến động giá trị giao dịch giữa các nguồn là tương đối ổn định.

Tổng thể, Ad Campaign có thể được xem là kênh mang lại hiệu quả cao nhất về doanh thu tiềm năng.

3.3.3.4 Phân tích theo ngành hàng và giá sản phẩm

Phân tích này xem xét mối quan hệ giữa ngành hàng (Category) và giá sản phẩm (Price), nhằm đánh giá sự khác biệt về mức giá trung bình giữa các nhóm sản phẩm và nhận diện ngành hàng có giá trị cao hơn trên thị trường.

1. thongke_Category_Price <- dataecommerce %>%
2. group_by(Category) %>%
3. summarise(
4. Soluong = n(),
5. TB_Gia = mean(Price, na.rm = TRUE),
6. Lon_nhat = max(Price, na.rm = TRUE),
7. Nho_nhat = min(Price, na.rm = TRUE),
8. Trung_vi = median(Price, na.rm = TRUE),
9. Do_lech_chuan = sd(Price, na.rm = TRUE),
10. Q1 = quantile(Price, 0.25, na.rm = TRUE),
11. Q3 = quantile(Price, 0.75, na.rm = TRUE)
12. ) %>%
13. arrange(desc(TB_Gia))
14. thongke_Category_Price

Giải thích kỹ thuật:

Mục đích tương tự như mục "Phân tích theo Loại thiết bị truy cập và Tổng tiền kỳ vọng"

Ý nghĩa thống kê

Kết quả cho thấy giá trung bình giữa các ngành hàng khá tương đồng, dao động quanh 505–506, chứng tỏ mức giá được định hướng ổn định trên toàn danh mục sản phẩm.

  • Apparel có giá trung bình cao nhất (506,14), phản ánh sự đa dạng trong mẫu mã và mức giá.

  • Các nhóm Books, Electronics, Accessories có giá trung bình thấp hơn nhẹ (~505), thể hiện tính cạnh tranh và tính phổ biến của sản phẩm.

Độ lệch chuẩn gần tương đương (≈285–286), cho thấy mức dao động giá giữa các ngành hàng không đáng kể.

Nhìn chung, không có sự chênh lệch lớn về giá trung bình, tuy nhiên ngành Apparel có thể xem là phân khúc có biên độ giá linh hoạt và giá trị cao hơn nhẹ so với các nhóm khác.

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

3.4.1 Phân bố người dùng theo giới tính

Biểu đồ trên thể hiện phân bố người dùng theo giới tính (Gender) trong tập dữ liệu. Mục tiêu là xác định tỷ trọng của các nhóm giới tính tham gia nền tảng, từ đó hiểu rõ hơn về cấu trúc nhân khẩu học của người dùng.

1. library(ggplot2)
2. ggplot(dataecommerce, aes(x = Gender, fill = Gender)) +
3.   geom_bar() +
4.   geom_text(stat = "count", aes(label = ..count..), vjust = -0.5) +
5.   labs(
6.     title = "Phân bố người dùng theo giới tính",
7.     x = "Giới tính",
8.     y = "Số lượng người dùng"
9.   ) +
10.   theme_minimal()

Giải thích kỹ thuật ngắn gọn:

(2) Tạo đối tượng đồ họa với dữ liệu dataecommerce, trục hoành là biến Gender, và tô màu cột theo giới tính.

(3) geom_bar() → vẽ cột đếm số lượng từng nhóm.

(4) Thêm nhãn số lượng (count) lên mỗi cột, căn giữa theo chiều dọc (vjust = 0.5).

(5) labs() → thêm tiêu đề và trục x, y.

(6) theme_minimal() → giao diện sáng, tối giản.

Ý nghĩa thống kê

Ba nhóm giới tính Female, Male và Non-Binary có quy mô gần tương đương nhau, mỗi nhóm chiếm khoảng 1/3 tổng số người dùng.

Điều này cho thấy sự đa dạng giới tính trong dữ liệu khá cao và nền tảng có độ bao phủ đồng đều giữa các nhóm giới - không có sự chênh lệch đáng kể về tỷ lệ tham gia.

3.4.2 Phân bố độ tuổi người dùng

Biểu đồ trên thể hiện phân bố độ tuổi người dùng (Age) trong tập dữ liệu. Mục tiêu nhằm nhận diện độ tuổi chủ yếu của khách hàng và đánh giá mức độ đa dạng về độ tuổi trong cộng đồng người dùng.

1. ggplot(dataecommerce, aes(x = Age)) +
2.   geom_histogram(
3.     bins = 20,
4.     fill = "#0D44CE",    
5.     color = "white",
6.     alpha = 0.9
7.   ) +
8.   geom_text(
9.     stat = "bin",
10.     bins = 20,
11.     aes(label = ..count..),
12.     vjust = 0.5,
13.     size = 4.5,
14.     color = "white",
15.     angle = 90,  
16.     hjust = 1.5
17.   ) +
18.   labs(
19.     title = "Phân bố độ tuổi người dùng",
20.     subtitle = "Tần suất xuất hiện của từng nhóm tuổi trong tập dữ liệu mô phỏng",
21.     x = "Độ tuổi",
22.     y = "Số lượng người dùng"
23.   ) +
24.   theme_minimal(base_size = 13) +
25.   theme(
26.     plot.title = element_text(face = "bold", size = 15, color = "#2E4057"),
27.     plot.subtitle = element_text(size = 11, color = "#555555"),
28.     panel.grid.minor = element_blank()
29.   )

Giải thích kỹ thuật:

geom_text(stat = "bin", aes(label = ..count..)): tự động hiển thị số lượng người dùng trên từng cột.

subtitle: thêm mô tả ngắn giúp biểu đồ có ngữ cảnh.

theme_minimal() + chỉnh plot.title: tạo cảm giác hiện đại, dễ đọc.

bins = 20: vẫn giữ chi tiết độ tuổi đủ mịn.

Ý nghĩa thống kê

Phân bố độ tuổi tương đối đồng đều, trải rộng từ 18 đến 70 tuổi. Không có nhóm tuổi nào chiếm ưu thế rõ rệt, tuy nhiên các nhóm từ 20–60 tuổi có mật độ cao hơn, dao động quanh 5.000–6.000 người mỗi nhóm.

Điều này cho thấy nền tảng thu hút người dùng ở nhiều độ tuổi khác nhau, đặc biệt là người trưởng thành trong độ tuổi lao động, phản ánh tệp khách hàng đa dạng và ổn định.

3.4.3 Phân bố thời lượng phiên truy cập

Mục tiêu: Mô tả sự phân bố thời lượng phiên (SessionDuration) để xem người dùng thường ở lại nền tảng bao lâu, qua đó đánh giá mức độ tương tác của họ.

1. library(ggplot2)
2. ggplot(dataecommerce, aes(x = SessionDuration)) +
3.   geom_histogram(
4.     binwidth = 10,
5.     fill = "#FFA94D",          # cam sáng, tươi và nổi bật
6.     color = "white",
7.     alpha = 0.9
8.   ) +
9.   geom_text(
10.     stat = "bin",
11.     binwidth = 10,
12.     aes(label = ..count..),
13.     vjust = -0.4,
14.     size = 3.5,
15.     color = "#333333"
16.   ) +
17.   geom_vline(
18.     aes(xintercept = mean(SessionDuration, na.rm = TRUE)),
19.     color = "#2E4057",
20.     linetype = "dashed",
21.     size = 1
22.   ) +
23.   labs(
24.     title = "Phân bố thời lượng phiên truy cập của người dùng",
25.     subtitle = "Mỗi cột thể hiện số lượng phiên tương ứng với khoảng thời lượng (tính bằng phút)",
26.     x = "Thời lượng phiên (phút)",
27.     y = "Số lượng phiên",
28.     caption = "Đường nét đứt thể hiện thời lượng phiên trung bình"
29.   ) +
30.   theme_minimal(base_size = 13) +
31.   theme(
32.     plot.title = element_text(face = "bold", size = 15, color = "#2E4057"),
33.     plot.subtitle = element_text(size = 11, color = "#555555"),
34.     panel.grid.minor = element_blank()
35.   )

Giải thích kỹ thuật:

geom_histogram() vẽ biểu đồ tần suất, giúp quan sát phân bố dữ liệu liên tục.

binwidth xác định độ rộng cột, ở đây chia thời lượng thành các nhóm 10 phút.

Màu sắc giúp dễ nhận biết mật độ người dùng theo từng khoảng thời gian.

Ý nghĩa thống kê

Phân bố thời lượng phiên khá đều và trải rộng từ 0 đến hơn 120 phút, không có sự chênh lệch lớn giữa các nhóm thời lượng.

Phần lớn người dùng có thời gian truy cập dao động trong khoảng 20–100 phút, cho thấy mức độ tương tác ổn định và phân tán tương đối đồng đều giữa các nhóm người dùng.

Những phiên có thời lượng trên 120 phút bắt đầu giảm nhẹ, có thể là do người dùng hoàn thành hành động mua hàng hoặc rời khỏi trang sau một khoảng thời gian nhất định.

3.4.4 Phân bố giá sản phẩm

Biểu đồ dưới đây mô tả phân bố mức giá của các sản phẩm theo từng nhóm hàng, nhằm giúp nhận diện sự khác biệt giữa các phân khúc giá thấp, trung bình và cao. Qua đó có thể đánh giá cơ cấu danh mục sản phẩm và chiến lược định vị giá của doanh nghiệp.

1. library(ggplot2)
2. ggplot(dataecommerce, aes(x = Price, fill = Category)) +
3.   geom_histogram(
4.     binwidth = 50,
5.     color = "white",
6.     alpha = 0.85,
7.     position = "dodge"  # đặt các cột cạnh nhau thay vì chồng lên
8.   ) +
9.   labs(
10.     title = "Phân bố giá sản phẩm theo từng nhóm hàng",
11.     subtitle = "Giúp nhận diện phân khúc giá thấp – trung bình – cao của từng loại sản phẩm",
12.     x = "Giá sản phẩm",
13.     y = "Số lượng sản phẩm"
14.   ) +
15.   scale_fill_brewer(palette = "Set2", name = "Nhóm sản phẩm") +
16.   theme_minimal(base_size = 13) +
17.   theme(
18.     plot.title = element_text(face = "bold", size = 15, color = "#2E4057"),
19.     plot.subtitle = element_text(size = 11, color = "#555555"),
20.     legend.position = "top",
21.     panel.grid.minor = element_blank()
22.   )

Giải thích kỹ thuật:

geom_histogram() tạo biểu đồ tần suất (histogram) thể hiện phân bố của biến liên tục.

binwidth = 50 chia giá sản phẩm thành các khoảng giá 50 đơn vị để dễ quan sát.

fill và color dùng để làm nổi bật các cột, giúp đồ thị trực quan hơn.

Ý nghĩa thống kê

Biểu đồ cho thấy phân bố giá sản phẩm theo nhóm hàng rõ ràng. Nhóm Electronics chiếm tỷ trọng lớn ở hầu hết mức giá → tập trung phân khúc trung–cao. Apparel phân bố chủ yếu ở mức giá trung bình, còn Books và Accessories tập trung ở phân khúc thấp. Tổng thể, doanh nghiệp hướng đến sản phẩm giá trung–cao, với màu sắc và cách trình bày giúp biểu đồ rõ và sinh động.

3.4.5 Phân bố tổng tiền kỳ vọng

Mục tiêu: Biểu đồ này nhằm mô tả sự phân bố của tổng tiền kỳ vọng trong các giao dịch – giúp xem khách hàng thường dự kiến chi bao nhiêu và có xuất hiện những giao dịch “đột biến” (outlier) hay không.

1. ggplot(dataecommerce, aes(x = ExpectedAmount)) +
2.   geom_histogram(binwidth = 200, fill = "#17A589", color = "white") +
3.   labs(
4.     title = "Phân bố tổng tiền kỳ vọng của người dùng",
5.     x = "Tổng tiền kỳ vọng (ExpectedAmount)",
6.     y = "Số lượng giao dịch"
7.   ) +
8.   theme_minimal()

Giải thích kỹ thuật:

geom_histogram() biểu diễn tần suất giá trị tổng tiền kỳ vọng, cho thấy khuynh hướng chi tiêu của người dùng.

binwidth = 200 giúp chia tổng tiền thành các nhóm đều nhau, phù hợp khi giá trị có độ biến thiên lớn.

fill chọn màu dịu mắt, dễ đọc khi số lượng điểm lớn.

Ý nghĩa thống kê

Phân bố có dạng lệch phải - phần lớn người dùng có tổng tiền kỳ vọng dưới 1.000 đơn vị, trong khi một số ít có giá trị kỳ vọng rất cao (từ 2.000–4.000).

Điều này cho thấy đa số khách hàng thực hiện các giao dịch quy mô nhỏ hoặc trung bình, còn giao dịch lớn chỉ chiếm tỷ lệ nhỏ nhưng góp phần đáng kể vào tổng doanh thu kỳ vọng.

3.4.6 Xu hướng tổng tiền kỳ vọng theo độ tuổi người dùng

Biểu đồ đường trên thể hiện xu hướng thay đổi của tổng tiền kỳ vọng trung bình (ExpectedAmount) theo độ tuổi người dùng. Qua đó, ta có thể nhận diện sự khác biệt trong hành vi chi tiêu theo từng nhóm tuổi, giúp doanh nghiệp hiểu rõ hơn về độ tuổi khách hàng tiềm năng.

1. library(dplyr)
2. library(ggplot2)
3. dataecommerce %>%
4.   group_by(Age) %>%
5.   summarise(Avg_Expected = mean(ExpectedAmount, na.rm = TRUE)) %>%
6.   ggplot(aes(x = Age, y = Avg_Expected)) +
7.   geom_line(color = "#00BFC4", size = 1) +
8.   geom_point(color = "#F8766D", size = 2) +
9.   labs(
10.     title = "Xu hướng tổng tiền kỳ vọng theo độ tuổi người dùng",
11.     x = "Độ tuổi",
12.     y = "Tổng tiền kỳ vọng trung bình"
13.   ) +
14.   theme_minimal()

Giải thích kỹ thuật:

group_by(Age) + summarise() tính trung bình ExpectedAmount theo từng độ tuổi.

geom_line() thể hiện xu hướng liên tục của giá trị trung bình.

geom_point() giúp nhấn mạnh các điểm dữ liệu quan trọng trên đường.

Ý nghĩa thống kê

Quan sát biểu đồ, có thể thấy tổng tiền kỳ vọng trung bình dao động quanh mức 940–970, không có xu hướng tăng hoặc giảm rõ rệt theo độ tuổi.

Một số đỉnh nổi bật xuất hiện ở các nhóm tuổi 25, 35, 45 và 55, cho thấy đây là các nhóm có mức chi tiêu kỳ vọng cao hơn trung bình.

Ngược lại, các độ tuổi khoảng 20, 40 và 65 có xu hướng chi tiêu thấp hơn một chút, phản ánh sự khác biệt trong khả năng tài chính hoặc thói quen tiêu dùng.

Biểu đồ dao động liên tục nhưng trong biên độ hẹp, chứng tỏ mức chi tiêu giữa các độ tuổi tương đối ổn định và không có nhóm tuổi nào vượt trội quá mức.

3.4.7 Xu hướng tổng tiền kỳ vọng theo thời lượng phiên truy cập trung bình.

Biểu đồ trên mô tả xu hướng thay đổi của tổng tiền kỳ vọng trung bình (ExpectedAmount) theo thời lượng phiên truy cập (SessionDuration) của người dùng. Mục tiêu là để xác định xem người dùng ở lại lâu hơn trên nền tảng có xu hướng chi tiêu kỳ vọng cao hơn hay không.

1. library(dplyr)
2. library(ggplot2)
3. dataecommerce %>%
4.   mutate(SessionGroup = cut(SessionDuration, breaks = seq(0, max(SessionDuration), by = 10))) %>% 
5.   group_by(SessionGroup) %>%
6.   summarise(Avg_Expected = mean(ExpectedAmount, na.rm = TRUE)) %>%
7.   ggplot(aes(x = SessionGroup, y = Avg_Expected, group = 1)) +
8.   geom_line(color = "#92C3CE", size = 1) +
9.   geom_point(color = "#F7B96E", size = 2) +
10.   geom_text(
11.     aes(label = round(Avg_Expected, 1)),
12.     vjust = 0.6,    # đẩy nhẹ lên trên
13.     hjust = 1,     # đẩy sang trái
14.     size = 3.2,
15.     color = "black"
16.   ) +
17.   labs(
18.     title = "Xu hướng tổng tiền kỳ vọng theo nhóm \n thời lượng phiên truy cập",
19.     subtitle = "Hiển thị giá trị trung bình của tổng tiền kỳ vọng \n  theo từng khoảng thời lượng",
20.     x = "Khoảng thời lượng phiên (phút)",
21.     y = "Tổng tiền kỳ vọng trung bình"
22.   ) +
23.   theme_minimal(base_size = 13) +
24.   theme(
25.     axis.text.x = element_text(angle = 45, hjust = 1),
26.     plot.title = element_text(face = "bold", size = 15, color = "#2E4057"),
27.     plot.subtitle = element_text(size = 11, color = "#555555")
28.   )

Giải thích kỹ thuật:

group_by(SessionDuration) + summarise() tính trung bình ExpectedAmount cho từng khoảng thời lượng.

geom_line() biểu diễn xu hướng chi tiêu theo thời gian ở lại.

geom_point() giúp nhấn mạnh các điểm dữ liệu cụ thể, dễ đọc hơn.

Ý nghĩa thống kê

Quan sát biểu đồ, ta thấy rằng phần lớn các giá trị tổng tiền kỳ vọng tập trung trong khoảng 800–1200 đơn vị, bất kể thời lượng phiên là bao nhiêu.

Biểu đồ không cho thấy xu hướng tăng hoặc giảm rõ ràng của tổng tiền kỳ vọng khi thời lượng phiên truy cập tăng.

Có một số điểm ngoại lệ (outliers) với giá trị tổng tiền kỳ vọng cao (lên đến gần 3000), tuy nhiên chúng phân bố rải rác, không tập trung vào nhóm thời lượng nào cụ thể.

Điều này cho thấy thời gian ở lại lâu hơn chưa chắc dẫn đến mức chi tiêu kỳ vọng cao hơn, mà có thể phụ thuộc vào mục đích truy cập, loại sản phẩm hoặc hành vi cụ thể của người dùng trong phiên.

3.4.8 Xu hướng tổng tiền kỳ vọng theo loại thiết bị và giới tính

Biểu đồ trên thể hiện tổng tiền kỳ vọng trung bình (ExpectedAmount) của người dùng được phân theo giới tính (Female, Male, Non-Binary) và loại thiết bị truy cập (Desktop, Mobile, Tablet).

Mục tiêu là nhận diện xem có sự khác biệt đáng kể nào trong hành vi chi tiêu trung bình giữa các nhóm giới tính và nền tảng sử dụng hay không.

1. ggplot(dataecommerce, aes(x = DeviceType, y = ExpectedAmount, fill = Gender)) +
2.   stat_summary(fun = mean, geom = "bar", position = position_dodge(width = 0.8)) +
3.   labs(
4.     title = "Tổng tiền kỳ vọng trung bình theo giới tính \n  và loại thiết bị",
5.     x = "Loại thiết bị",
6.     y = "Tổng tiền kỳ vọng trung bình"
7.   ) +
8.   theme_minimal() +
9.   theme(legend.title = element_blank())

Giải thích kỹ thuật:

stat_summary(fun = mean, geom = "bar") dùng để vẽ giá trị trung bình thay vì từng điểm dữ liệu.

fill = Gender giúp phân biệt giới tính bằng màu sắc.

Biểu đồ này cho phép so sánh trực tiếp giữa các giới trong từng nhóm thiết bị (Desktop, Mobile, Tablet).

Ý nghĩa thống kê

Tổng thể, mức tiền kỳ vọng trung bình giữa các giới tính gần như tương đương nhau, dao động quanh 950–970 đơn vị.

Sự khác biệt giữa các thiết bị (Desktop, Mobile, Tablet) cũng không đáng kể, cho thấy người dùng duy trì hành vi chi tiêu tương đối ổn định bất kể nền tảng truy cập.

Nhóm nữ giới (Female) có mức trung bình nhỉnh hơn nhẹ trên tất cả các thiết bị, đặc biệt ở Tablet, gợi ý rằng người dùng nữ có xu hướng sẵn sàng chi tiêu cao hơn.

Giới Non-Binary và nam giới (Male) có giá trị trung bình khá gần nhau, thể hiện mức chi tiêu tương đối đồng nhất.

3.4.9 So sánh tổng tiền kỳ vọng theo giới tính

Biểu đồ hộp trên thể hiện phân bố tổng tiền kỳ vọng (ExpectedAmount) của người dùng theo giới tính (Gender), bao gồm ba nhóm: Female, Male và Non-Binary. Mục tiêu nhằm so sánh mức chi tiêu kỳ vọng trung bình và mức độ biến động giữa các nhóm giới tính.

1. ggplot(dataecommerce, aes(x = Gender, y = ExpectedAmount, fill = Gender)) +
2.   geom_boxplot(alpha = 0.7, outlier.color = "red") +
3.   labs(
4.     title = "So sánh tổng tiền kỳ vọng của người dùng theo giới tính",
5.     x = "Giới tính",
6.     y = "Tổng tiền kỳ vọng (ExpectedAmount)"
7.   ) +
8.   theme_minimal() +
9.   theme(legend.position = "none")

Giải thích kỹ thuật:

geom_boxplot() hiển thị phân bố ExpectedAmount cho từng giới tính qua trung vị, tứ phân vị và giá trị ngoại lệ.

fill = Gender giúp mỗi giới có màu riêng, dễ nhận diện.

outlier.color = "red" làm nổi bật các giá trị chi tiêu bất thường cao/thấp.

Ý nghĩa thống kê

Cả ba nhóm giới tính đều có phân bố tương đối tương đồng, với trung vị (median) dao động quanh mức 700–750.

Phần lớn các giá trị nằm trong khoảng từ 0 đến 1500, cho thấy hành vi chi tiêu phổ biến khá giống nhau.

Các giá trị ngoại lệ (outliers) xuất hiện rõ ở cả ba nhóm, thể hiện một số người dùng chi tiêu vượt trội, lên đến hơn 4000 đơn vị.

Nhóm Non-Binary có độ phân tán nhẹ cao hơn, thể hiện qua phần hộp và râu dài hơn một chút — gợi ý rằng sự đa dạng trong hành vi chi tiêu ở nhóm này có thể lớn hơn so với Male và Female.

3.4.10 So sánh tổng tiền kỳ vọng theo loại thiết bị truy cập

Biểu đồ hộp trên mô tả phân bố tổng tiền kỳ vọng (ExpectedAmount) của người dùng theo loại thiết bị truy cập (DeviceType) gồm ba nhóm: Desktop, Mobile và Tablet. Mục tiêu là xem xét liệu hành vi chi tiêu của người dùng có thay đổi đáng kể giữa các nền tảng thiết bị hay không.

1. ggplot(dataecommerce, aes(x = DeviceType, y = ExpectedAmount, fill = DeviceType)) +
2.   geom_boxplot(alpha = 0.7, outlier.color = "red") +
3.   labs(
4.     title = "So sánh tổng tiền kỳ vọng của người\n dùng theo loại thiết bị truy cập",
5.     x = "Loại thiết bị",
6.     y = "Tổng tiền kỳ vọng (ExpectedAmount)"
7.   ) +
8.   theme_minimal() +
9.   theme(legend.position = "none")

Giải thích kỹ thuật:

geom_boxplot() giúp so sánh trực quan mức trung vị, tứ phân vị và độ phân tán giữa các thiết bị.

Màu sắc phân biệt theo thiết bị (fill = DeviceType) giúp nhận biết nhanh nhóm nào có giá trị cao hơn.

Các outlier màu đỏ biểu thị người dùng có mức chi tiêu vượt trội.

Ý nghĩa thống kê

Nhìn chung, phân bố tổng tiền kỳ vọng giữa các thiết bị khá tương đồng, với trung vị dao động quanh mức 700–750 đơn vị.

Cả ba nhóm đều có mức độ phân tán tương đối giống nhau, cho thấy người dùng chi tiêu ổn định trên các thiết bị khác nhau.

Xuất hiện nhiều giá trị ngoại lệ (outliers) ở mức trên 3000–4000, thể hiện có một nhóm nhỏ người dùng chi tiêu vượt trội, không phụ thuộc vào loại thiết bị.

Tablet có xu hướng biến động nhẹ cao hơn, thể hiện qua phần hộp và râu dài hơn — gợi ý sự đa dạng hành vi chi tiêu trên thiết bị này.

Người dùng trên Desktop, Mobile và Tablet có mức chi tiêu kỳ vọng tương đương nhau, chứng tỏ loại thiết bị truy cập không phải là yếu tố chính ảnh hưởng đến hành vi chi tiêu. Tuy nhiên, nhóm outlier vẫn là đối tượng tiềm năng cho chiến lược tiếp cận riêng biệt.

3.4.11 So sánh độ tuổi người dùng theo giới tính

Mục tiêu: Đánh giá sự khác biệt về phân bố độ tuổi giữa các giới tính (Male, Female, Non-Binary) — nhằm xác định liệu nhóm giới nào có xu hướng trẻ hoặc lớn tuổi hơn khi sử dụng nền tảng.

1. ggplot(dataecommerce, aes(x = Gender, y = Age, fill = Gender)) +
2.   geom_boxplot() +
3.   labs(
4.     title = "So sánh độ tuổi người dùng theo giới tính",
5.     x = "Giới tính",
6.     y = "Độ tuổi"
7.   ) +
8.   theme_minimal()

Giải thích kỹ thuật:

geom_boxplot() tạo biểu đồ hộp, giúp thể hiện phân bố, trung vị, tứ phân vị, và ngoại lệ (outliers).

fill = Gender phân biệt màu theo giới.

Trung vị (đường giữa hộp) thể hiện giá trị tuổi điển hình của từng giới.

Ý nghĩa thống kê

Phân bố độ tuổi của ba nhóm Female, Male và Non-Binary tương đối tương đồng, với trung vị dao động quanh 40–45 tuổi.

Khoảng tứ phân vị (IQR) khá rộng (khoảng 30–55 tuổi), cho thấy độ tuổi người dùng phân bố đa dạng trong từng giới.

Không có nhóm nào thể hiện sự chênh lệch đáng kể về độ tuổi, chứng tỏ sự phân bố công bằng về mặt độ tuổi giữa các giới tính.

3.4.12 So sánh tổng tiền kỳ vọng theo quốc gia

Biểu đồ trên thể hiện phân bố tổng tiền kỳ vọng (ExpectedAmount) của người dùng theo từng quốc gia. Sử dụng biểu đồ violin plot, ta có thể quan sát được hình dạng phân bố dữ liệu, mức trung vị và độ biến động của giá trị chi tiêu kỳ vọng giữa các thị trường khác nhau.

1. ggplot(dataecommerce, aes(x = Country, y = ExpectedAmount, fill = Country)) +
2.   geom_violin(trim = FALSE, alpha = 0.7) +
3.   geom_boxplot(width = 0.1, fill = "white", outlier.shape = NA) +
4.   labs(
5.     title = "Phân bố tổng tiền kỳ vọng theo quốc gia",
6.     x = "Quốc gia",
7.     y = "Tổng tiền kỳ vọng (ExpectedAmount)"
8.   ) +
9.   theme_minimal() +
10.   theme(legend.position = "none")

Giải thích kỹ thuật nhanh:

geom_violin() thể hiện phân bố xác suất của biến định lượng (ExpectedAmount) theo từng nhóm (Country).

trim = FALSE giúp hiển thị đầy đủ phần đuôi phân bố (tail).

geom_boxplot() chèn thêm hộp trung vị vào giữa violin, giúp dễ so sánh trung bình & độ phân tán.

Ý nghĩa thống kê

Nhìn chung, phân bố tổng tiền kỳ vọng giữa các quốc gia khá tương đồng, với phần lớn giá trị tập trung quanh mức 900–1000 đơn vị tiền tệ.

Hình dạng đối xứng và hẹp dần về phía đỉnh cho thấy phần lớn người dùng có hành vi chi tiêu tương tự nhau trong mỗi quốc gia.

Tuy nhiên, Australia, Canada và USA có phần phân bố “mở rộng” hơn ở phần đuôi trên, cho thấy một số khách hàng chi tiêu cao hơn trung bình — nhóm khách hàng tiềm năng hoặc có sức mua mạnh.

Trung vị của các quốc gia tương đối gần nhau, chứng tỏ không có chênh lệch lớn về mức chi tiêu kỳ vọng trung bình giữa các thị trường.

Biểu đồ hộp trên thể hiện sự so sánh tổng tiền kỳ vọng (ExpectedAmount) của người dùng theo quốc gia (Australia, Canada, Germany, India, UK và USA). Mục đích là đánh giá xem có sự khác biệt đáng kể trong hành vi chi tiêu của người dùng đến từ các quốc gia khác nhau hay không.

1. ggplot(dataecommerce, aes(x = Country, y = ExpectedAmount, fill = Country)) +
2.   geom_boxplot(alpha = 0.7, outlier.color = "red") +
3.   labs(
4.     title = "So sánh tổng tiền kỳ vọng của người dùng theo quốc gia",
5.     x = "Quốc gia",
6.     y = "Tổng tiền kỳ vọng (ExpectedAmount)"
7.   ) +
8.   theme_minimal() +
9.   theme(legend.position = "none")

Giải thích kỹ thuật:

geom_boxplot() giúp thể hiện phân phối, trung vị, tứ phân vị và outliers của tổng tiền kỳ vọng theo từng quốc gia.

fill = Country tạo màu sắc riêng cho từng quốc gia, giúp so sánh trực quan hơn.

Outliers (điểm đỏ) thể hiện nhóm người dùng chi tiêu vượt trội trong từng quốc gia.

Ý nghĩa thống kê

Trung vị tổng tiền kỳ vọng ở tất cả các quốc gia đều nằm quanh mức 700–750, cho thấy mức chi tiêu trung bình tương đối đồng đều giữa các quốc gia.

Biên độ dao động (độ cao của hộp) ở các nước gần như tương tự nhau, chứng tỏ mức độ biến thiên trong hành vi chi tiêu là tương đồng.

Tất cả các quốc gia đều có nhiều giá trị ngoại lệ (outliers) — thể hiện nhóm người dùng chi tiêu vượt trội, đặc biệt ở mức trên 3000–4000.

Quốc gia Australia và Canada có xu hướng trung vị cao hơn một chút, cho thấy mức chi tiêu trung bình của người dùng ở đây có phần nhỉnh hơn so với các quốc gia còn lại.

Tổng thể, người dùng ở các quốc gia khác nhau có mức tổng tiền kỳ vọng khá tương tự nhau, phản ánh mô hình chi tiêu toàn cầu tương đối đồng nhất. Tuy nhiên, một số quốc gia như Australia và Canada có thể đại diện cho thị trường tiềm năng hơn, với xu hướng chi tiêu trung bình cao hơn một chút.

3.4.13 Mối quan hệ giữa độ tuổi, giới tính và tổng tiền kỳ vọng

Biểu đồ trên mô tả xu hướng tổng tiền kỳ vọng trung bình (ExpectedAmount) của người dùng theo độ tuổi và giới tính.

Mục tiêu là xác định xem giữa các nhóm giới tính (Female, Male, Non-Binary) có sự khác biệt đáng kể nào về mức chi tiêu kỳ vọng tại các độ tuổi khác nhau hay không.

1. library(dplyr)
2. library(ggplot2)
3. # Tính tổng tiền kỳ vọng trung bình theo độ tuổi và giới tính
4. avg_by_age_gender <- dataecommerce %>%
5.   group_by(Age, Gender) %>%
6.   summarise(AverageExpected = mean(ExpectedAmount))
7. # Vẽ biểu đồ đường
8. ggplot(avg_by_age_gender, aes(x = Age, y = AverageExpected, color = Gender)) +
9.   geom_line(size = 1) +
10.   geom_point(size = 1.8) +
11.   labs(
12.     title = "Xu hướng tổng tiền kỳ vọng trung bình \n theo độ tuổi và giới tính",
13.     x = "Độ tuổi",
14.     y = "Tổng tiền kỳ vọng trung bình"
15.   ) +
16.   theme_minimal() +
17.   theme(legend.title = element_blank())

Giải thích thống kê

group_by(Age, Gender): chia dữ liệu theo độ tuổi và giới tính.

summarise(mean(ExpectedAmount)): tính giá trị trung bình tổng tiền kỳ vọng cho từng nhóm.

→ Kết quả: bảng gồm Age – Gender – AverageExpected.

Ý nghĩa thống kê

Nhìn chung, các đường biểu diễn (Female, Male, Non-Binary) dao động quanh giá trị 900–1000, thể hiện mức tổng tiền kỳ vọng trung bình khá tương đồng giữa các giới.

Dữ liệu có biến động mạnh theo độ tuổi, không theo xu hướng tăng hay giảm rõ rệt — cho thấy độ tuổi không phải là yếu tố chi phối trực tiếp đến mức chi tiêu kỳ vọng.

Trong một số độ tuổi nhất định (khoảng 25–30 và 50–55), nhóm nữ (Female) có xu hướng chi tiêu cao hơn một chút so với các nhóm khác.

Nhóm Non-Binary và Male thường dao động gần nhau, thể hiện hành vi mua sắm khá tương đồng.

Độ nhiễu lớn (dao động liên tục giữa các độ tuổi) gợi ý rằng các yếu tố khác như loại sản phẩm, thu nhập, hoặc thời lượng phiên truy cập có thể ảnh hưởng mạnh hơn đến tổng tiền kỳ vọng.

3.4.14 Phân bố mật độ giữa thời lượng phiên truy cập và tổng tiền kỳ vọng của người dùng.

Biểu đồ này mô tả phân bố mật độ hai chiều giữa thời lượng phiên truy cập và tổng tiền kỳ vọng. Mục tiêu nhằm xác định vùng tập trung hành vi - nơi người dùng có xu hướng ở lại bao lâu và chi tiêu ở mức nào - qua đó đánh giá mức độ tương tác và tiềm năng giao dịch trên nền tảng.

1. ggplot(dataecommerce, aes(x = SessionDuration, y = ExpectedAmount)) +
2.   geom_density_2d_filled() +
3.   scale_fill_viridis_d(option = "C") +
4.   labs(
5.     title = "Mật độ phân bố giữa thời lượng phiên và tổng tiền kỳ vọng",
6.     x = "Thời lượng phiên (giây)",
7.     y = "Tổng tiền kỳ vọng"
8.   ) +
9.   theme_minimal(base_size = 13)

Giải thích kỹ thuật:

Ý nghĩa thông kê

3.4.15 Phân bố giá sản phẩm trung bình theo độ tuổi người dùng

Biểu đồ thể hiện giá sản phẩm trung bình mà người dùng ở các nhóm tuổi khác nhau tương tác. Mục tiêu nhằm xem xét liệu độ tuổi có ảnh hưởng đến mức giá sản phẩm mà người dùng quan tâm hay không.

1. dataecommerce %>%
2.   mutate(AgeGroup = cut(Age, breaks = seq(min(Age), max(Age), by = 5))) %>%
3.   group_by(AgeGroup) %>%
4.   summarise(AvgPrice = mean(Price, na.rm = TRUE)) %>%
5.   ggplot(aes(x = AgeGroup, y = AvgPrice, group = 1)) +
6.   geom_col(fill = "#00BFC4", alpha = 0.8) +
7.   geom_text(aes(label = round(AvgPrice, 0)), vjust = -0.5, size = 3.2) +
8.   labs(
9.     title = "Giá sản phẩm trung bình theo \n nhóm độ tuổi người dùng",
10.     x = "Nhóm độ tuổi",
11.     y = "Giá sản phẩm trung bình"
12.   ) +
13.   theme_minimal(base_size = 13) +
14.   theme(axis.text.x = element_text(angle = 45, hjust = 1))

Giải thích kỹ thuật:

mutate(cut()): chia biến Age thành các nhóm 5 tuổi.

summarise(mean()): tính giá trung bình của sản phẩm trong từng nhóm tuổi.

geom_col(): vẽ cột biểu diễn giá trung bình,

geom_text(): hiển thị giá trị trung bình trên đỉnh cột giúp dễ so sánh.

theme_minimal(): làm biểu đồ gọn, rõ và dễ đọc.

Ý nghĩa thống kê

Biểu đồ cho thấy giá sản phẩm trung bình giữa các nhóm độ tuổi gần như tương đương, dao động quanh mức 500. Không có sự chênh lệch đáng kể nào giữa các nhóm, cho thấy độ tuổi người dùng không ảnh hưởng rõ rệt đến mức giá sản phẩm mà họ tương tác. Điều này phản ánh dữ liệu mô phỏng có phân bố giá sản phẩm khá đồng đều giữa các nhóm tuổi.

3.4.16 Mối quan hệ giữa Giá sản phẩm và Tổng tiền kỳ vọng

Mục tiêu: Đồ thị này nhằm kiểm tra mối liên hệ giữa giá sản phẩm và tổng tiền kỳ vọng - xem liệu việc tăng giá sản phẩm có dẫn đến kỳ vọng chi tiêu cao hơn từ người dùng hay không.

1. ggplot(dataecommerce, aes(x = Price, y = ExpectedAmount)) +
2.   geom_point(alpha = 0.4, color = "#0073C2FF") +
3.   geom_smooth(method = "lm", color = "red", se = FALSE) +
4.   labs(
5.     title = "Mối quan hệ giữa giá sản phẩm và tổng tiền kỳ vọng",
6.     x = "Giá sản phẩm (Price)",
7.     y = "Tổng tiền kỳ vọng (ExpectedAmount)"
8.   ) +
9.   theme_minimal()

Giải thích kỹ thuật:

geom_point() dùng để hiển thị các điểm dữ liệu, mỗi điểm là một quan sát (sản phẩm/giao dịch).

geom_smooth(method = "lm") thêm đường hồi quy tuyến tính, giúp nhận diện xu hướng tương quan giữa hai biến.

alpha = 0.4 giảm độ đậm, giúp biểu đồ dễ đọc khi có nhiều điểm chồng lên nhau.

Ý nghĩa thống kê

Biểu đồ cho thấy mối quan hệ tuyến tính dương rất rõ ràng: khi giá sản phẩm tăng, tổng tiền kỳ vọng cũng tăng theo tương ứng. Đường hồi quy màu đỏ minh họa xu hướng này khá ổn định, cho thấy giá sản phẩm là yếu tố chính quyết định tổng tiền kỳ vọng trong các giao dịch.

Tuy nhiên, biên độ phân tán dọc theo trục tung mở rộng dần ở mức giá cao, gợi ý rằng khi sản phẩm đắt hơn, sự khác biệt trong hành vi chi tiêu giữa khách hàng cũng lớn hơn.

3.4.17 Tổng tiền kỳ vọng trung bình theo nguồn giới thiệu

Biểu đồ thể hiện mức tổng tiền kỳ vọng trung bình của người dùng theo nguồn giới thiệu và giới tính, giúp quan sát sự khác biệt trong hành vi chi tiêu giữa các nhóm người dùng đến từ các kênh marketing khác nhau.

1. avg_referral_gender <- dataecommerce %>%
2.   group_by(ReferralSource, Gender) %>%
3.   summarise(AverageExpected = mean(ExpectedAmount))
4. ggplot(avg_referral_gender, aes(x = ReferralSource, y = AverageExpected, fill = Gender)) +
5.   geom_bar(stat = "identity", position = "dodge") +
6.   labs(
7.     title = "Tổng tiền kỳ vọng trung bình theo \n nguồn giới thiệu và giới tính",
8.     x = "Nguồn giới thiệu",
9.     y = "Tổng tiền kỳ vọng trung bình"
10.   ) +
11.   theme_minimal() +
12.   theme(axis.text.x = element_text(angle = 20, hjust = 1))

Giải thích kỹ thuật

dataecommerce : bộ dữ liệu gốc.

%>% : toán tử pipe của dplyr, truyền kết quả bước trước sang bước sau.

group_by(ReferralSource, Gender) : gom dữ liệu thành các nhóm theo Nguồn giới thiệu và Giới tính.

summarise(AverageExpected = mean(ExpectedAmount)) : với mỗi nhóm, tính giá trị trung bình của ExpectedAmount và lưu vào biến mới AverageExpected.

→ Kết quả là một bảng tóm tắt gồm các cột: ReferralSource, Gender, AverageExpected.

Ý nghĩa thống kê

Biểu đồ cho thấy tổng tiền kỳ vọng trung bình của người dùng khá đồng đều giữa các nguồn giới thiệu như Ad Campaign, Email Marketing, Organic Search và Social Media.

Giới tính không tạo khác biệt rõ rệt — ba nhóm Female, Male và Non-Binary có giá trị trung bình gần như tương đương nhau.

Ad Campaign có xu hướng cao nhất nhẹ, cho thấy hiệu quả quảng cáo có thể giúp người dùng chi tiêu cao hơn một chút.

Nhìn chung, mức độ khác biệt giữa các nhóm rất nhỏ, phản ánh rằng nguồn giới thiệu và giới tính không phải yếu tố quyết định mạnh đến tổng tiền kỳ vọng.

3.4.18 Tỷ lệ người dùng theo quốc gia

Biểu đồ tròn trên thể hiện tỷ lệ người dùng theo quốc gia (Country), giúp quan sát phân bố địa lý của khách hàng trong tập dữ liệu. Mục tiêu là xác định thị trường trọng điểm và mức độ đồng đều giữa các quốc gia trong cơ sở người dùng.

1. library(ggplot2)
2. library(dplyr)
3. dataecommerce %>%
4.   count(Country) %>%
5.   ggplot(aes(x = "", y = n, fill = Country)) +
6.   geom_col(color = "white") +
7.   geom_text(aes(label = scales::percent(n / sum(n), accuracy = 0.1)),
8.             position = position_stack(vjust = 0.5)) +
9.   coord_polar("y") +
10.   labs(title = "Tỷ lệ người dùng theo quốc gia", fill = "Quốc gia") +
11.   theme_minimal()

Giải thích kỹ thuật:

count(Country) dùng để đếm số người dùng theo từng quốc gia.

geom_col() tạo các cột giá trị tương ứng,

coord_polar("y") chuyển từ biểu đồ cột sang biểu đồ tròn.

Màu sắc được gán qua fill = Country để phân biệt từng quốc gia.

Ý nghĩa thống kê

Kết quả cho thấy 6 quốc gia (Australia, Canada, Germany, India, UK, USA) có tỷ lệ người dùng gần như tương đương nhau, thể hiện phân bổ khách hàng rất cân bằng giữa các thị trường.

Không có quốc gia nào chiếm ưu thế rõ rệt, chứng tỏ nền tảng có mức độ phổ biến tương đối đồng đều toàn cầu, và các hoạt động tiếp thị đang được triển khai một cách rộng rãi, không thiên lệch khu vực.

3.4.19 Bản đồ nhiệt tổng tiền kỳ vọng trung bình theo giới tính và nguồn giới thiệu

1. # Tính trung bình theo giới tính và nguồn giới thiệu
2. heat_data <- dataecommerce %>%
3.   group_by(Gender, ReferralSource) %>%
4.   summarise(AverageExpected = mean(ExpectedAmount))
5. # Vẽ heatmap
6. ggplot(heat_data, aes(x = ReferralSource, y = Gender, fill = AverageExpected)) +
7.   geom_tile(color = "white") +
8.   scale_fill_gradient(low = "lightblue", high = "red") +
9.   labs(
10.     title = "Bản đồ nhiệt: Tổng tiền kỳ vọng trung bình theo\n giới tính và nguồn giới thiệu",
11.     x = "Nguồn giới thiệu",
12.     y = "Giới tính",
13.     fill = "Tổng tiền kỳ vọng TB"
14.   ) +
15.   theme_minimal() +
16.   theme(axis.text.x = element_text(angle = 25, hjust = 1))

Giải thích kỹ thuật

group_by(Gender, ReferralSource) : nhóm dữ liệu theo giới tính và nguồn giới thiệu.

summarise(mean(ExpectedAmount)) : tính giá trị trung bình của tổng tiền kỳ vọng cho từng nhóm.

geom_tile() : tạo ô màu cho từng cặp giá trị (giới tính – nguồn giới thiệu).

scale_fill_gradient() : chuyển màu từ xanh nhạt → đỏ đậm, biểu thị mức độ cao thấp.

theme_minimal() và angle = 25 giúp đồ thị gọn gàng và dễ đọc hơn.

Ý nghĩa thống kê

Biểu đồ cho thấy nhóm Female có tổng tiền kỳ vọng trung bình cao nhất, đặc biệt ở nguồn Ad Campaign.

Male có mức thấp hơn, nhất là qua Organic Search, còn Non-Binary giữ mức ổn định.

Nhìn chung, Ad Campaign là kênh hiệu quả nhất, cho thấy tiềm năng tối ưu quảng cáo theo giới tính.

4 CHƯƠNG 2: PHÂN TÍCH TÌNH HÌNH TÀI CHÍNH CỦA NGÂN HÀNG TMCP NGOẠI THƯƠNG VIỆT NAM (VIETCOMBANK - VCB) GIAI ĐOẠN 2015 - 2024

4.1 GIỚI THIỆU CHUNG

4.1.1 Lý do chọn đề tài

Trong bối cảnh nền kinh tế Việt Nam đang phát triển mạnh mẽ và hội nhập sâu rộng, hệ thống ngân hàng đóng vai trò quan trọng trong việc huy động vốn, phân bổ nguồn lực và điều tiết dòng tiền của nền kinh tế. Ngân hàng TMCP Ngoại thương Việt Nam (Vietcombank – VCB) là một trong những ngân hàng thương mại lớn nhất và uy tín nhất tại Việt Nam, có tình hình tài chính ổn định, minh bạch và hiệu quả hoạt động cao.

Việc lựa chọn Vietcombank làm đối tượng nghiên cứu mang tính thực tiễn cao vì dữ liệu tài chính của ngân hàng này được công bố đều đặn qua các năm, giúp việc phân tích xu hướng và đánh giá hiệu quả tài chính trở nên chính xác, khách quan.

Song song đó, trong thời đại Cách mạng công nghiệp 4.0, việc ứng dụng ngôn ngữ R trong xử lý và phân tích dữ liệu tài chính là kỹ năng cần thiết đối với sinh viên kinh tế, tài chính và ngân hàng. Thông qua công cụ RStudio, người học có thể thực hành toàn bộ quy trình phân tích dữ liệu bảng – từ nhập dữ liệu, làm sạch, mã hóa, tính toán, đến trực quan hóa và rút ra nhận định định lượng.

Do đó, đề tài “Phân tích dữ liệu bảng về Ngân hàng Vietcombank (VCB) giai đoạn 2015–2024 bằng RStudio” được lựa chọn với mục tiêu kết hợp giữa kiến thức chuyên môn về tài chính và kỹ năng lập trình, qua đó thể hiện năng lực phân tích, đánh giá dữ liệu thực tế và minh họa rõ vai trò của công nghệ trong nghiên cứu tài chính.

4.1.2 Mục tiêu

  • Làm sạch, tổ chức, mã hóa và xử lý dữ liệu bảng của Vietcombank giai đoạn 2015–2024.
  • Tạo và phân loại các biến tài chính mới thuộc hai nhóm: chỉ số thanh khoản và sinh lời.
  • Thực hiện phân tổ biến, phân tích đơn biến và phân tích đa biến để tìm hiểu xu hướng và đánh giá sức khỏa tài chính của doanh nghiệp.
  • Trực quan hóa dữ liệu bằng hệ thống biểu đồ đa dạng, qua đó thể hiện mối quan hệ giữa các yếu tố tài chính theo thời gian.
  • Hình thành kỹ năng lập trình phân tích dữ liệu thực tế và trình bày kết quả bằng công cụ RStudio.

4.1.3 Giới thiệu bộ dữ liệu

4.1.3.1 Giới thiệu tổng quan

Bộ dữ liệu được sử dụng trong bài tiểu luận là dữ liệu báo cáo tài chính hợp nhất của Ngân hàng TMCP Ngoại thương Việt Nam (Vietcombank – VCB) trong giai đoạn 2015–2024, được thu thập, tổng hợp và xử lý dưới dạng dữ liệu bảng.
Dữ liệu bao gồm 10 quan sát (mỗi quan sát là 1 năm) và 121 biến tài chính phản ánh các nhóm chỉ tiêu chính như tài sản, nguồn vốn, lợi nhuận, doanh thu, chi phí, và dòng tiền,..
Đây là dữ liệu có cấu trúc ổn định, được chuẩn hóa theo từng năm, giúp thuận lợi cho việc phân tích xu hướng, tính toán chỉ số tài chính và trực quan hóa trong RStudio.

1. library(readxl)
2. chuonghai <- read_xlsx(file.choose())
3. dim(chuonghai)
## [1]  10 121
1. head(chuonghai)
1. tail(chuonghai)

Giải thích kỹ thuật

(2) chuonghai <- read_xlsx(file.choose()) → Mở hộp thoại chọn file và đọc dữ liệu Excel vào biến chuonghai.  
dim(chuonghai) → Trả về (số dòng, số cột) của bảng dữ liệu.  
head(chuonghai) → Hiển thị 6 dòng đầu để xem sơ bộ dữ liệu.  
tail(chuonghai) → Hiển thị 6 dòng cuối để kiểm tra phần cuối dữ liệu.  

4.1.3.2 Mục đích sử dụng dữ liệu

Bộ dữ liệu được sử dụng nhằm phục vụ cho quá trình phân tích tài chính của Ngân hàng Vietcombank (VCB) trong giai đoạn 2015–2024, với mục tiêu chính là vận dụng ngôn ngữ lập trình R để xử lý, phân tích và trực quan hóa dữ liệu bảng thực tế.
Cụ thể, việc sử dụng dữ liệu hướng tới các mục tiêu sau:
- Phân tích xu hướng tài chính qua thời gian: Theo dõi sự thay đổi của các chỉ tiêu như tổng tài sản, doanh thu, lợi nhuận, vốn chủ sở hữu, nợ phải trả… trong suốt 10 năm.
- Đánh giá hiệu quả hoạt động: Thông qua việc tính toán các chỉ số thanh khoản (CR, QR, ICR, hệ số thanh toán tức thời) và chỉ số sinh lời (ROA, ROE, ROS, ROI, BEP).
- Phân tổ và phân tích thống kê: Nhóm dữ liệu theo các giai đoạn, biến tài chính hoặc phân loại hiệu quả hoạt động để rút ra xu hướng và mối quan hệ giữa các biến.
- Thực hành kỹ năng xử lý dữ liệu bảng trong RStudio: Bao gồm đọc dữ liệu, làm sạch, mã hóa, tạo biến mới, phân tích mô tả, phân tích đa biến và trực quan hóa.
- Trực quan hóa và trình bày kết quả: Sử dụng biểu đồ đa dạng (đường, cột, hộp, tán xạ, heatmap…) để biểu diễn xu hướng tài chính của Vietcombank, giúp kết quả trực quan và dễ diễn giải hơn.

4.1.3.3 Cấu trúc dữ liệu và các biến

Bộ dữ liệu bao gồm 121 biến (cột) và 10 dòng quan sát (năm từ 2015 đến 2024). Dữ liệu được tổ chức dưới dạng dữ liệu bảng (panel data), trong đó mỗi dòng tương ứng với một năm hoạt động của Ngân hàng Vietcombank (VCB), và mỗi cột thể hiện một chỉ tiêu tài chính cụ thể.

Cấu trúc dữ liệu thể hiện rõ sự ổn định và tính hệ thống của báo cáo tài chính ngân hàng, giúp thuận tiện cho việc xử lý, so sánh và phân tích theo thời gian.

1. colnames(chuonghai)
##   [1] "Năm"                                                                                                           
##   [2] "TỔNG TÀI SẢN"                                                                                                  
##   [3] "Tiền mặt"                                                                                                      
##   [4] "Tiền gửi ngân hàng"                                                                                            
##   [5] "Tiền gửi tại các TCTD khác và cho vay các TCTD khác"                                                           
##   [6] "Chứng khoán kinh doanh"                                                                                        
##   [7] "Dự phòng giảm giá chứng khoán kinh doanh"                                                                      
##   [8] "Các công cụ tài chính phái sinh và các tài sản tài chính khác"                                                 
##   [9] "Cho vay khách hàng"                                                                                            
##  [10] "Dự phòng rủi ro cho vay khách hàng"                                                                            
##  [11] "Chứng khoán đầu tư"                                                                                            
##  [12] "Chứng khoán đầu tư sẵn sàng để bán"                                                                            
##  [13] "Chứng khoán đầu tư giữ đến ngày đáo hạn"                                                                       
##  [14] "Dự phòng giảm giá chứng khoán đầu tư"                                                                          
##  [15] "Góp vốn, đầu tư dài hạn"                                                                                       
##  [16] "Đầu tư vào công ty con"                                                                                        
##  [17] "Đầu tư vào công ty liên doanh"                                                                                 
##  [18] "Đầu tư dài hạn khác"                                                                                           
##  [19] "Dự phòng giảm giá đầu tư dài hạn"                                                                              
##  [20] "TSCD"                                                                                                          
##  [21] "TSCDHH"                                                                                                        
##  [22] "Tài sản cố định thuê tài chính"                                                                                
##  [23] "TSCDVH"                                                                                                        
##  [24] "Tài sản khác"                                                                                                  
##  [25] "NỢ PHẢI TRẢ VÀ VỐN CHỦ SỞ HỮU"                                                                                 
##  [26] "Tổng nợ phải trả"                                                                                              
##  [27] "Các khoản nợ chính phủ và NHNN Việt Nam"                                                                       
##  [28] "Tiền gửi và vay các Tổ chức tín dụng khác"                                                                     
##  [29] "Tiền gửi của khách hàng"                                                                                       
##  [30] "Các công cụ tài chính phái sinh và các khoản nợ tài chính khác"                                                
##  [31] "Vốn tài trợ, uỷ thác đầu tư của Chính phủ và các tổ chức tín dụng khác"                                        
##  [32] "Phát hành giấy tờ có giá"                                                                                      
##  [33] "Các khoản nợ khác"                                                                                             
##  [34] "VỐN CHỦ SỞ HỮU"                                                                                                
##  [35] "Vốn của tổ chức tín dụng"                                                                                      
##  [36] "Vốn điều lệ"                                                                                                   
##  [37] "Vốn đầu tư XDCB"                                                                                               
##  [38] "Thặng dư vốn cổ phần"                                                                                          
##  [39] "Cổ phiếu Quỹ"                                                                                                  
##  [40] "Cổ phiếu ưu đãi"                                                                                               
##  [41] "Vốn khác"                                                                                                      
##  [42] "Quỹ của tổ chức tín dụng"                                                                                      
##  [43] "Chênh lệch tỷ giá hối đoái"                                                                                    
##  [44] "Chênh lệch đánh giá lại tài sản"                                                                               
##  [45] "Lợi nhuận chưa phân phối"                                                                                      
##  [46] "Lợi ích của cổ đông thiểu số...46"                                                                             
##  [47] "Thu nhập lãi và các khoản thu nhập tương tự"                                                                   
##  [48] "Chi phí lãi và các chi phí tương tự"                                                                           
##  [49] "Thu nhập lãi thuần"                                                                                            
##  [50] "Thu nhập từ hoạt động dịch vụ"                                                                                 
##  [51] "chi phí hoạt động dịch vụ"                                                                                     
##  [52] "Lãi thuần từ hoạt động dịch vụ"                                                                                
##  [53] "Lãi/(lỗ) thuần từ hoạy động kinh doanh ngoại hối và vàng"                                                      
##  [54] "Lãi/(lỗ) thuần từ mua bán chứng khoán kinh doanh"                                                              
##  [55] "Lãi/(lỗ) thuần từ mua bán chứng khoán đầu tư"                                                                  
##  [56] "Thu nhập từ hoạt động khác"                                                                                    
##  [57] "Chi phí hoạt động khác"                                                                                        
##  [58] "Lãi/(lỗ) thuần từ hoạt động khác"                                                                              
##  [59] "Thu nhập từ góp vốn, mua cổ phần"                                                                              
##  [60] "Tổng thu nhập hoạt động"                                                                                       
##  [61] "Chi phí hoạt động"                                                                                             
##  [62] "LN thuần từ hoạt động kinh doanh trước CF dự phòng rủi ro tín dụng"                                            
##  [63] "Chi phí dự phòng rủi ro tín dụng"                                                                              
##  [64] "Tổng lợi nhuận trước thuế"                                                                                     
##  [65] "Chi phí thuế TNDN hiện hành"                                                                                   
##  [66] "Chi phí thuế TNDN hoãn lại"                                                                                    
##  [67] "Chi phí thuế thu nhập doanh nghiệp"                                                                            
##  [68] "Lợi nhuận sau thuế"                                                                                            
##  [69] "Lợi ích của cổ đông thiểu số...69"                                                                             
##  [70] "Cổ đông của Công ty mẹ"                                                                                        
##  [71] "Lãi cơ bản trên cổ phiếu"                                                                                      
##  [72] "Lưu chuyển tiền thuần từ các hoạt động sản xuất kinh doanh"                                                    
##  [73] "Lưu chuyển tiền thuần từ hoạt động kinh doanh trước thuế thu nhập DN"                                          
##  [74] "Lãi/lỗ trước những thay đổi vốn lưu động"                                                                      
##  [75] "Thu nhập lãi và các khoản tương đương"                                                                         
##  [76] "Chi phí lãi và các khoản tương đương"                                                                          
##  [77] "Thu nhập từ hoạt động dịch vụ nhận được"                                                                       
##  [78] "Thu nhập từ hoạt động kinh doanh chứng khoán"                                                                  
##  [79] "Thu nhập khác"                                                                                                 
##  [80] "Tiền thu các khoản nợ đã được xử lý, xóa, bù đắp bằng nguồn rủi ro"                                            
##  [81] "Thanh toán cho nhân viên và nhà cung cấp"                                                                      
##  [82] "Tiền chi nộp thuế thu nhập doanh nghiệp"                                                                       
##  [83] "(Tăng)/Giảm các khoản tiền gửi và cho vay các tổ chức tín dụng khác"                                           
##  [84] "(Tăng)/giảm các khoản về kinh doanh chứng khoán"                                                               
##  [85] "(Tăng)/Giảm các công cụ tài chính phái sinh và các tài sản tài chính khác"                                     
##  [86] "(Tăng)/Giảm các khoản cho vay khách hàng"                                                                      
##  [87] "(Tăng)/Giảm lãi, phí phải thu"                                                                                 
##  [88] "Tăng/(Giảm) nguồn dự phòng để bù đắp tổn thất các khoản"                                                       
##  [89] "(Tăng)/Giảm khác về tài sản hoạt động"                                                                         
##  [90] "Tăng/(Giảm) các khoản nợ chính phủ và NHNN"                                                                    
##  [91] "Tăng/(Giảm) các khoản tiền gửi và vay các TCTD khác"                                                           
##  [92] "Tăng/(Giảm) tiền gửi của khách hàng"                                                                           
##  [93] "Tăng/(Giảm) các công cụ tài chính phái sinh và các khoản nợ tài chính khác"                                    
##  [94] "Tăng/(Giảm) vốn tài trợ, uỷ thác đầu tư của chính phủ và các TCTD khác"                                        
##  [95] "Tăng/(Giảm) phát hành giấy tờ có giá"                                                                          
##  [96] "Tăng/(Giảm) lãi, phí phải trả"                                                                                 
##  [97] "Tăng/(Giảm) khác về công nợ hoạt động"                                                                         
##  [98] "Thuế thu nhập doanh nghiệp đã trả"                                                                             
##  [99] "Chi từ các quỹ của TCTD"                                                                                       
## [100] "Thu được từ nợ khó đòi"                                                                                        
## [101] "Lưu chuyển tiền thuần từ hoạt động đầu tư"                                                                     
## [102] "Tiền mua tài sản cố định và các tài sản dài hạn khác"                                                          
## [103] "Tiền thu được từ thanh lý tài sản cố định"                                                                     
## [104] "Tiền chi từ thanh lý, nhượng bán TSCĐ"                                                                         
## [105] "Mua sắm Bất động sản đầu tư"                                                                                   
## [106] "Tiền thu từ bán, thanh lý bất động sản đầu tư"                                                                 
## [107] "Tiền chi ra do bán, thanh lý bất động sản đầu tư"                                                              
## [108] "Đầu tư vào các doanh nghiệp khác"                                                                              
## [109] "Tiền thu từ việc bán các khoản đầu tư vào các doanh nghiệp khác"                                               
## [110] "Cổ tức và tiền lãi nhận được"                                                                                  
## [111] "Lưu chuyển tiền từ hoạt động tài chính"                                                                        
## [112] "Tiền thu từ phát hành cổ phiếu và vốn góp"                                                                     
## [113] "Tiền thu từ phát hành giấy tờ có giá dài hạn đủ điều kiện tính vào vốn tự có và các khoản vốn vay dài hạn khác"
## [114] "Tiền chi thanh toán giấy tờ có giá dài hạn đủ điều kiện tính vào vốn tự có và các khoản vốn vay dài hạn khác"  
## [115] "Cổ tức đã trả"                                                                                                 
## [116] "Tiền chi ra mua cổ phiếu quỹ"                                                                                  
## [117] "Tiền thu được do bán cổ phiếu quỹ"                                                                             
## [118] "Lưu chuyển tiền thuần trong kỳ"                                                                                
## [119] "Tiền và tương đương tiền đầu kỳ"                                                                               
## [120] "Ảnh hưởng của chênh lệch tỷ giá"                                                                               
## [121] "Tiền và tương đương tiền cuối kỳ"
1. table(sapply(chuonghai, class))
## 
## character   numeric 
##         1       120

Giải thích kỹ thuật

(1) Xem tên tất cả các biến trong dữ liệu
(2) Xem kiểu dữ liệu của từng biến

Nhận xét tổng quan

Các biến trong dữ liệu chủ yếu thuộc kiểu số (120)), thuận tiện cho việc tính toán, tạo biến mới và thống kê mô tả.
Dữ liệu được tổ chức gọn, không có dữ liệu dạng lặp hoặc ký tự, nên có thể dễ dàng chuyển đổi và phân tích trong RStudio.

Bảng: Danh sách các biến trong bộ dữ liệu Vietcombank (2015–2024)
Nguồn: Tác giả tổng hợp từ báo cáo tài chính hợp nhất Vietcombank
STT Tên biến trong bộ dữ liệu
1 Năm
2 TỔNG TÀI SẢN
3 Tiền mặt
4 Tiền gửi ngân hàng
5 Tiền gửi tại các TCTD khác và cho vay các TCTD khác
6 Chứng khoán kinh doanh
7 Dự phòng giảm giá chứng khoán kinh doanh
8 Các công cụ tài chính phái sinh và các tài sản tài chính khác
9 Cho vay khách hàng
10 Dự phòng rủi ro cho vay khách hàng
11 Chứng khoán đầu tư
12 Chứng khoán đầu tư sẵn sàng để bán
13 Chứng khoán đầu tư giữ đến ngày đáo hạn
14 Dự phòng giảm giá chứng khoán đầu tư
15 Góp vốn, đầu tư dài hạn
16 Đầu tư vào công ty con
17 Đầu tư vào công ty liên doanh
18 Đầu tư dài hạn khác
19 Dự phòng giảm giá đầu tư dài hạn
20 TSCD
21 TSCDHH
22 Tài sản cố định thuê tài chính
23 TSCDVH
24 Tài sản khác
25 NỢ PHẢI TRẢ VÀ VỐN CHỦ SỞ HỮU
26 Tổng nợ phải trả
27 Các khoản nợ chính phủ và NHNN Việt Nam
28 Tiền gửi và vay các Tổ chức tín dụng khác
29 Tiền gửi của khách hàng
30 Các công cụ tài chính phái sinh và các khoản nợ tài chính khác
31 Vốn tài trợ, uỷ thác đầu tư của Chính phủ và các tổ chức tín dụng khác
32 Phát hành giấy tờ có giá
33 Các khoản nợ khác
34 VỐN CHỦ SỞ HỮU
35 Vốn của tổ chức tín dụng
36 Vốn điều lệ
37 Vốn đầu tư XDCB
38 Thặng dư vốn cổ phần
39 Cổ phiếu Quỹ
40 Cổ phiếu ưu đãi
41 Vốn khác
42 Quỹ của tổ chức tín dụng
43 Chênh lệch tỷ giá hối đoái
44 Chênh lệch đánh giá lại tài sản
45 Lợi nhuận chưa phân phối
46 Lợi ích của cổ đông thiểu số
47 Thu nhập lãi và các khoản thu nhập tương tự
48 Chi phí lãi và các chi phí tương tự
49 Thu nhập lãi thuần
50 Thu nhập từ hoạt động dịch vụ
51 Chi phí hoạt động dịch vụ
52 Lãi thuần từ hoạt động dịch vụ
53 Lãi/(lỗ) thuần từ hoạt động kinh doanh ngoại hối và vàng
54 Lãi/(lỗ) thuần từ mua bán chứng khoán kinh doanh
55 Lãi/(lỗ) thuần từ mua bán chứng khoán đầu tư
56 Thu nhập từ hoạt động khác
57 Chi phí hoạt động khác
58 Lãi/(lỗ) thuần từ hoạt động khác
59 Thu nhập từ góp vốn, mua cổ phần
60 Tổng thu nhập hoạt động
61 Chi phí hoạt động
62 LN thuần từ hoạt động kinh doanh trước CF dự phòng rủi ro tín dụng
63 Chi phí dự phòng rủi ro tín dụng
64 Tổng lợi nhuận trước thuế
65 Chi phí thuế TNDN hiện hành
66 Chi phí thuế TNDN hoãn lại
67 Chi phí thuế thu nhập doanh nghiệp
68 Lợi nhuận sau thuế
69 Lợi ích của cổ đông thiểu số (sau thuế)
70 Cổ đông của Công ty mẹ
71 Lãi cơ bản trên cổ phiếu
72 Lưu chuyển tiền thuần từ hoạt động sản xuất kinh doanh
73 Lưu chuyển tiền thuần từ hoạt động kinh doanh trước thuế thu nhập DN
74 Lãi/lỗ trước những thay đổi vốn lưu động
75 Thu nhập lãi và các khoản tương đương
76 Chi phí lãi và các khoản tương đương
77 Thu nhập từ hoạt động dịch vụ nhận được
78 Thu nhập từ hoạt động kinh doanh chứng khoán
79 Thu nhập khác
80 Tiền thu các khoản nợ đã được xử lý, xóa, bù đắp bằng nguồn rủi ro
81 Thanh toán cho nhân viên và nhà cung cấp
82 Tiền chi nộp thuế thu nhập doanh nghiệp
83 (Tăng)/Giảm các khoản tiền gửi và cho vay các tổ chức tín dụng khác
84 (Tăng)/giảm các khoản về kinh doanh chứng khoán
85 (Tăng)/Giảm các công cụ tài chính phái sinh và các tài sản tài chính khác
86 (Tăng)/Giảm các khoản cho vay khách hàng
87 (Tăng)/Giảm lãi, phí phải thu
88 Tăng/(Giảm) nguồn dự phòng để bù đắp tổn thất các khoản
89 (Tăng)/Giảm khác về tài sản hoạt động
90 Tăng/(Giảm) các khoản nợ chính phủ và NHNN
91 Tăng/(Giảm) các khoản tiền gửi và vay các TCTD khác
92 Tăng/(Giảm) tiền gửi của khách hàng
93 Tăng/(Giảm) các công cụ tài chính phái sinh và các khoản nợ tài chính khác
94 Tăng/(Giảm) vốn tài trợ, uỷ thác đầu tư của chính phủ và các TCTD khác
95 Tăng/(Giảm) phát hành giấy tờ có giá
96 Tăng/(Giảm) lãi, phí phải trả
97 Tăng/(Giảm) khác về công nợ hoạt động
98 Thuế thu nhập doanh nghiệp đã trả
99 Chi từ các quỹ của TCTD
100 Thu được từ nợ khó đòi
101 Lưu chuyển tiền thuần từ hoạt động đầu tư
102 Tiền mua tài sản cố định và các tài sản dài hạn khác
103 Tiền thu được từ thanh lý tài sản cố định
104 Tiền chi từ thanh lý, nhượng bán TSCĐ
105 Mua sắm Bất động sản đầu tư
106 Tiền thu từ bán, thanh lý bất động sản đầu tư
107 Tiền chi ra do bán, thanh lý bất động sản đầu tư
108 Đầu tư vào các doanh nghiệp khác
109 Tiền thu từ việc bán các khoản đầu tư vào các doanh nghiệp khác
110 Cổ tức và tiền lãi nhận được
111 Lưu chuyển tiền từ hoạt động tài chính
112 Tiền thu từ phát hành cổ phiếu và vốn góp
113 Tiền thu từ phát hành giấy tờ có giá dài hạn và vốn vay dài hạn khác
114 Tiền chi thanh toán giấy tờ có giá dài hạn và vốn vay dài hạn khác
115 Cổ tức đã trả
116 Tiền chi ra mua cổ phiếu quỹ
117 Tiền thu được do bán cổ phiếu quỹ
118 Lưu chuyển tiền thuần trong kỳ
119 Tiền và tương đương tiền đầu kỳ
120 Ảnh hưởng của chênh lệch tỷ giá
121 Tiền và tương đương tiền cuối kỳ

4.2 PHƯƠNG PHÁP VÀ XỬ LÝ DỮ LIỆU

4.2.1 Làm sạch dữ liệu

Mục tiêu của bước này là đảm bảo bộ dữ liệu Vietcombank giai đoạn 2015–2024 có chất lượng tốt, không bị trùng lặp, không thiếu giá trị, và có định dạng phù hợp cho phân tích tài chính.

1. sum(duplicated(chuonghai))
## [1] 0
1. colSums(is.na(chuonghai))[colSums(is.na(chuonghai)) > 0]
## named numeric(0)

Giải thích kỹ thuật

(1) Kiểm tra trùng lặp toàn bộ dòng
(2) Kiểm tra giá trị thiếu toàn bộ bảng, khi xuất kết quả: chỉ in ra những cột có NA, ẩn các cột không có NA.

Kết quả cho thấy bộ dữ liệu không có biến trung lặp và biến có giá trị NA. Cho thấy bộ dữ liệu sạch và phản ánh chính xác các chỉ số tài chính trong bảng báo cáo tài chính của doanh nghiệp VCB.

4.2.2 Xử lý tên biến, chuẩn hóa dữ liệu

Trước khi tiến hành phân tích, cần chuẩn hóa tên biến để đảm bảo dữ liệu có thể xử lý ổn định trong RStudio. Do dữ liệu gốc lấy từ báo cáo tài chính nên tên biến thường chứa dấu tiếng Việt, khoảng trắng hoặc ký tự đặc biệt - dễ gây lỗi khi lập trình. Vì vậy, ta sử dụng hàm clean_names() thuộc gói janitor để loại bỏ dấu, viết thường toàn bộ, thay khoảng trắng bằng dấu gạch dưới. Sau bước này, tên biến trở nên thống nhất, dễ gọi và thuận tiện cho các thao tác phân tích, tạo biến mới và trực quan hóa sau này.

1. library(janitor)
2. chuonghai <- clean_names(chuonghai)

4.2.3 Tạo biến mới phục vụ phân tích

Trong phân tích dữ liệu tài chính, các biến gốc trong báo cáo tài chính (như tổng tài sản, doanh thu, lợi nhuận, nợ phải trả, vốn chủ sở hữu…) chỉ phản ánh quy mô và cấu trúc cơ bản của doanh nghiệp. Tuy nhiên, để đánh giá sâu hơn về năng lực tài chính, khả năng thanh toán và hiệu quả hoạt động, cần phải xây dựng thêm các biến mới (các chỉ tiêu tài chính) từ dữ liệu gốc.
Việc tạo các biến mới giúp:
- Chuẩn hóa và lượng hóa thông tin tài chính, từ đó dễ dàng so sánh giữa các năm.
- Phân tích hiệu quả hoạt động của ngân hàng qua các chỉ số chuẩn.
- Trực quan hóa xu hướng tài chính và phục vụ mô hình phân tích, đánh giá.
Trong đề tài này, các biến mới được chia thành hai nhóm chính, mỗi nhóm mang một mục tiêu phân tích riêng biệt.

4.2.4 Nhóm chỉ số thanh khoản

Nhóm này phản ánh khả năng đáp ứng nghĩa vụ ngắn hạn của ngân hàng, đánh giá mức độ an toàn tài chính và tính ổn định nguồn vốn lưu động.

Bảng: Nhóm chỉ số thanh khoản
STT Tên biến Ý nghĩa
1 CR Tỷ số thanh toán hiện hành – phản ánh khả năng thanh toán nợ ngắn hạn bằng tài sản ngắn hạn.
2 QR Hệ số đảm bảo lãi vay – thể hiện khả năng trả lãi vay từ lợi nhuận trước thuế.
3 ICR Chỉ số thanh khoản tổng thể – phản ánh khả năng đáp ứng nợ bằng tổng tài sản ngắn hạn.
4 Hệ số tức tời (Cash Ratio) Hệ số thanh toán tức thời – đo lường khả năng thanh toán ngay bằng tiền mặt..

4.2.5 Nhóm chỉ số sinh lời

Nhóm này đo lường hiệu quả sinh lợi từ hoạt động kinh doanh, phản ánh khả năng tạo lợi nhuận trên tài sản và vốn của ngân hàng.
Tuy nhiên, đối với lĩnh vực ngân hàng thì không có Sales theo nghĩa bán hàng hóa nên ta xác định doanh thu hoạt động chính là “Thu nhập từ hoạt động dịch vụ”

Bảng: Nhóm chỉ số sinh lời
STT Tên biến Ý nghĩa
1 ROA Hiệu quả sử dụng tài sản – đo lường lợi nhuận ròng tạo ra trên mỗi đồng tài sản.
2 ROE Hiệu quả sử dụng vốn chủ sở hữu – phản ánh lợi nhuận trên mỗi đồng vốn tự có.
3 ROS Tỷ suất lợi nhuận trên doanh thu – thể hiện khả năng kiểm soát chi phí và sinh lời từ doanh thu.
4 ROI Tỷ suất sinh lợi đầu tư – đánh giá lợi nhuận thu được so với tổng đầu tư.

4.2.6 Thực hiện thao tác

1. library(dplyr)
2. chuonghai <- chuonghai %>%
3.   mutate(
4.     # Tạo hai biến trung gian: tài sản ngắn hạn & nợ ngắn hạn
5.     tai_san_ngan_han = tien_mat +
6.                        tien_gui_ngan_hang +
7.                        tien_gui_tai_cac_tctd_khac_va_cho_vay_cac_tctd_khac +
8.                        chung_khoan_kinh_doanh +
9.                        cho_vay_khach_hang,
10. 
11.     no_ngan_han = tien_gui_cua_khach_hang +
12.                    tien_gui_va_vay_cac_to_chuc_tin_dung_khac +
13.                    phat_hanh_giay_to_co_gia +
14.                    cac_khoan_no_khac,
15.     # 🔹 Nhóm chỉ số thanh khoản
16.     cr = tai_san_ngan_han / no_ngan_han,
17.     qr = (tai_san_ngan_han - chung_khoan_kinh_doanh) / no_ngan_han,
18.     icr = tong_loi_nhuan_truoc_thue / chi_phi_lai_va_cac_chi_phi_tuong_tu,
19.     tysothanhkhoan = tai_san_ngan_han / tong_no_phai_tra,
20.     heso_tucthoi = tien_mat / no_ngan_han,
21.     # 🔸 Nhóm chỉ số sinh lời
22.     roa = loi_nhuan_sau_thue / tong_tai_san ,
23.     roe = loi_nhuan_sau_thue / von_chu_so_huu ,
24.     ros = loi_nhuan_sau_thue / tong_thu_nhap_hoat_dong ,
25.     roi = tong_loi_nhuan_truoc_thue / tong_tai_san
26.   )

Giải thích kỹ thuật

mutate() lấy các biến gốc (tiền, nợ, lợi nhuận, tài sản…) để tính ra các chỉ tiêu tài chính mới rồi gắn thêm vào chính dataframe chuonghai.

4.2.7 Kiểm tra biến mới

1. names(chuonghai)[(ncol(chuonghai)-10):ncol(chuonghai)]
##  [1] "tai_san_ngan_han" "no_ngan_han"      "cr"               "qr"              
##  [5] "icr"              "tysothanhkhoan"   "heso_tucthoi"     "roa"             
##  [9] "roe"              "ros"              "roi"
1. chuonghai %>%
2.   select(nam, cr, qr, icr, tysothanhkhoan, heso_tucthoi, roa, roe, ros, roi) %>%
3.   head()

giải thích kỹ thuật

(1) Kiểm tra danh sách biến mới

(3-4) Xem nhanh dữ liệu của các chỉ số

Việc tạo hai biến trung gian giúp đảm bảo các chỉ số thanh khoản phản ánh chính xác quy mô hoạt động ngắn hạn của Vietcombank.
Các chỉ số sinh lời cho thấy hiệu quả sử dụng tài sản và vốn trong giai đoạn 2015–2024, là cơ sở cho các bước phân tổ, phân tích đơn biến và đa biến ở các phần sau.

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

4.3.1 PHÂN TỔ CÁC BIẾN

Phân tổ các biến là bước chia dữ liệu thành các nhóm có đặc điểm tương đồng để đánh giá xu hướng, mối quan hệ và khác biệt giữa các chỉ tiêu tài chính của Vietcombank. Việc này giúp:
- Hiểu rõ sự thay đổi của các chỉ số thanh khoản và sinh lời theo từng giai đoạn;
- Xác định các năm hoạt động tốt – trung bình – yếu;
- Chuẩn bị cơ sở cho phân tích đơn biến và đa biến tiếp theo.

4.3.1.1 Phân tổ theo giai đoạn phát triển (lấy COVID-19 làm mốc)

Mục tiêu: Đánh giá ảnh hưởng của đại dịch COVID-19 đến hiệu quả tài chính của Vietcombank.

1. chuonghai <- chuonghai %>%
2.   mutate(
3.     giai_doan_covid = case_when(
4.       nam %in% 2015:2019 ~ "Trước COVID (2015–2019)",
5.       nam %in% 2020:2021 ~ "Trong COVID (2020–2021)",
6.       nam %in% 2022:2024 ~ "Sau COVID (2022–2024)"
7.     )
8.   )
9. phan_to_covid <- chuonghai %>%
10.   group_by(giai_doan_covid) %>%
11.   summarise(
12.     CR_tb = mean(cr, na.rm = TRUE),
13.     QR_tb = mean(qr, na.rm = TRUE),
14.     ROA_tb = mean(roa, na.rm = TRUE),
15.     ROE_tb = mean(roe, na.rm = TRUE),
16.     ROS_tb = mean(ros, na.rm = TRUE),
17.     ROI_tb = mean(roi, na.rm = TRUE)
18.   )
19. phan_to_covid

Giải thích kỹ thuật

(2) Hàm mutate() thêm cột mới giai_doan_covid vào bảng chuonghai.  
(3) case_when() phân loại từng dòng dựa trên năm   
(11) group_by(giai_doan_covid) → gom dữ liệu theo từng giai đoạn.  
(12) summarise() → tính giá trị trung bình (mean) của các chỉ số thanh khoản và sinh lời.  
(13-18) na.rm = TRUE để bỏ qua giá trị thiếu (NA).

Nhận xét:

Phân tích cho thấy VCB có xu hướng cải thiện rõ rệt về hiệu quả hoạt động và khả năng sinh lời qua ba giai đoạn: trước COVID-19 (2015–2019), trong COVID-19 (2020–2021) và sau COVID-19 (2022–2024).
- Thanh khoản: CR và QR duy trì cao trước dịch (0,9798; 0,9718), giảm nhẹ trong dịch (0,9425; 0,9406) rồi phục hồi sau dịch (0,9947; 0,9930), thể hiện năng lực quản trị thanh khoản tốt.
- Hiệu quả tài sản: ROA tăng từ 1,09% → 1,47% → 1,69%; ROE ổn định cao ở 17,90% → 19,89% → 19,78%, phản ánh khả năng sinh lợi bền vững.
- Biên lợi nhuận & đầu tư: ROS tăng mạnh 32,35% → 38,26% → 47,37%; ROI từ 1,36% → 1,84% → 2,19%, cho thấy hiệu quả chi phí và đầu tư được nâng cao.

Kết luận VCB duy trì ổn định trong khủng hoảng và phục hồi mạnh sau dịch, thể hiện năng lực quản trị tài chính vững vàng và hiệu quả hoạt động vượt trội..

4.3.1.2 Phân tổ theo giá trị chỉ số

Mục tiêu: Phân nhóm các năm dựa trên mức CR và ROA, để xem liệu thanh khoản cao có đi kèm hiệu quả sinh lời cao không.

1. chuonghai <- chuonghai %>%
2.   mutate(
3.     nhom_cr = case_when(
4.       cr < quantile(cr, 0.33, na.rm = TRUE) ~ "Thấp",
5.       cr < quantile(cr, 0.66, na.rm = TRUE) ~ "Trung bình",
6.       TRUE ~ "Cao"
7.     ),
8.     nhom_roa = case_when(
9.       roa < quantile(roa, 0.33, na.rm = TRUE) ~ "Thấp",
10.       roa < quantile(roa, 0.66, na.rm = TRUE) ~ "Trung bình",
11.       TRUE ~ "Cao"
12.     )
13.   )
14. phan_to_chiso <- chuonghai %>%
15.   group_by(nhom_cr, nhom_roa) %>%
16.   summarise(
17.     ROE_tb = mean(roe, na.rm = TRUE),
18.     ICR_tb = mean(icr, na.rm = TRUE),
19.     .groups = "drop"
20.   )
21. phan_to_chiso

Giải thích kỹ thuật

(2) mutate(...) Tạo thêm 2 biến mới:  
(3-6) nhom_cr: chia chỉ số CR thành 3 mức — Thấp, Trung bình, Cao — dựa theo phân vị 33% và 66%.  
(8-11) nhom_roa: chia chỉ số ROA thành 3 mức tương tự.  
group_by(nhom_cr, nhom_roa) → Nhóm dữ liệu theo kết hợp các mức CR và ROA.  
summarise(...) Tính trung bình ROE (ROE_tb) và trung bình ICR (ICR_tb) cho từng nhóm, bỏ qua giá trị thiếu (na.rm = TRUE).  

Nhận xét:

Nhóm CR trung bình – ROA cao có ROE cao nhất (22,06%), cho thấy khả năng sinh lời mạnh khi cân bằng thanh khoản và hiệu quả tài sản.
Ngược lại, nhóm CR thấp – ROA thấp chỉ đạt ROE 13,06%, phản ánh rủi ro thanh khoản và hiệu suất sử dụng tài sản yếu.
Nhìn chung, ROE tăng khi ROA cao, còn ICR âm ở mọi nhóm cho thấy chi phí lãi vay lớn hoặc hiệu quả tài chính chưa ổn định..

4.3.1.3 Phân tổ theo quy mô tài sản

Mục tiêu: Đánh giá xem quy mô tài sản có ảnh hưởng đến khả năng sinh lời hay không.

1. chuonghai <- chuonghai %>%
2.   mutate(
3.     nhom_taisan = case_when(
4.       tong_tai_san < quantile(tong_tai_san, 0.33, na.rm = TRUE) ~ "Quy mô nhỏ",
5.       tong_tai_san < quantile(tong_tai_san, 0.66, na.rm = TRUE) ~ "Quy mô trung bình",
6.       TRUE ~ "Quy mô lớn"
7.     )
8.   )
9. phan_to_taisan <- chuonghai %>%
10.   group_by(nhom_taisan) %>%
11.   summarise(
12.     ROA_tb = mean(roa, na.rm = TRUE),
13.     ROE_tb = mean(roe, na.rm = TRUE),
14.     CR_tb = mean(cr, na.rm = TRUE)
15.   )
16. phan_to_taisan

Giải thích kỹ thuật

(2-6) mutate(...) Tạo biến mới nhom_taisan, chia tổng tài sản thành 3 nhóm dựa theo phân vị 33% và 66%.  
group_by(nhom_taisan) → Gom dữ liệu theo từng nhóm quy mô.  
summarise(...) Tính giá trị trung bình của các chỉ số và bỏ qua giá trị thiếu với na.rm = TRUE  

Nhận xét:

Phân tích cho thấy VCB có mối quan hệ tích cực rõ rệt giữa quy mô tài sản và khả năng sinh lời:
- Hiệu quả sử dụng tài sản: ROA tăng từ 0,84% (quy mô nhỏ) lên 1,43% (trung bình) và đến 1,66% (lớn), cho thấy quy mô càng lớn, ngân hàng càng khai thác tài sản hiệu quả hơn nhờ lợi thế kinh tế theo quy mô.
- Hiệu quả sinh lời cho cổ đông: ROE tăng từ 14,49% lên 19,88% và đến 22,04%, cao hơn 52% khi chuyển từ quy mô nhỏ lên lớn, phản ánh khả năng tận dụng đòn bẩy tài chính và đa dạng hóa nguồn thu tốt hơn.
- Thanh khoản: CR duy trì cao trên 96% (0,9826 → 0,9783 → 0,9690). Dù giảm nhẹ theo quy mô, điều này cho thấy VCB tối ưu hóa tài sản thanh khoản mà vẫn đảm bảo an toàn hoạt động.

Kết luận: Việc mở rộng quy mô giúp VCB tăng mạnh cả ROA và ROE, đồng thời vẫn giữ thanh khoản an toàn, khẳng định chiến lược tăng trưởng hiệu quả, quản trị tài chính vững vàng và phát triển bền vững.

4.3.1.4 Phân tổ theo giai đoạn tăng trưởng (theo chu kỳ hoạt động)

Mục tiêu: Phân chia 10 năm thành 3 chu kỳ phát triển hoạt động kinh doanh để so sánh xu hướng.

1. chuonghai <- chuonghai %>%
2.   mutate(
3.     giai_doan_pt = case_when(
4.       nam %in% 2015:2017 ~ "2015–2017: Ổn định",
5.       nam %in% 2018:2020 ~ "2018–2020: Tăng tốc",
6.       TRUE ~ "2021–2024: Phục hồi"
7.     )
8.   )
9. phan_to_pt <- chuonghai %>%
10.   group_by(giai_doan_pt) %>%
11.   summarise(
12.     ROA_tb = mean(roa, na.rm = TRUE),
13.     ROE_tb = mean(roe, na.rm = TRUE),
14.     CR_tb = mean(cr, na.rm = TRUE),
15.     ROI_tb = mean(roi, na.rm = TRUE)
16.   )
17. phan_to_pt

Giải thích kỹ thuật

mutate(...) Tạo biến mới giai_doan_pt, chia dữ liệu theo năm thành 3 giai đoạn.  
group_by(giai_doan_pt) Gom dữ liệu theo từng giai đoạn.  
summarise(...) Tính giá trị trung bình của các chỉ tiêu tài chính trong mỗi giai đoạn và na.rm = TRUE bỏ qua giá trị thiếu.  

Nhận xét

Phân tích cho thấy VCB có xu hướng cải thiện liên tục và bền vững về hiệu quả hoạt động và khả năng sinh lời qua ba giai đoạn: ổn định (2015–2017), tăng tốc (2018–2020) và phục hồi (2021–2024).
- Hiệu quả sử dụng tài sản: ROA tăng mạnh từ 0,84% → 1,43% → 1,66% (tăng tổng cộng 98%), cho thấy khả năng khai thác tài sản ngày càng hiệu quả và ổn định.
- Sinh lời cho cổ đông: ROE tăng từ 14,49% → 22,04% → 19,88%; dù giảm nhẹ ở giai đoạn phục hồi, mức này vẫn cao hơn 37% so với ban đầu, phản ánh khả năng tạo giá trị bền vững.
- Thanh khoản: CR duy trì cao (0,9826 → 0,9690 → 0,9783), thể hiện sự cân bằng giữa tăng trưởng và an toàn tài chính khi ngân hàng phục hồi.
- Hiệu quả đầu tư: ROI tăng đều từ 1,07% → 1,78% → 2,07% (tăng 93%), khẳng định năng lực đầu tư và sử dụng vốn hiệu quả.

Kết luận: VCB duy trì đà tăng trưởng mạnh, cân bằng giữa hiệu quả, thanh khoản và an toàn tài chính; phản ánh chiến lược phát triển bền vững, quản trị linh hoạt và vị thế dẫn đầu trong ngành ngân hàng Việt Nam.

4.3.1.5 Phân tổ theo tỷ trọng nợ trên vốn (Đòn bẩy tài chính)

Mục tiêu: Đánh giá tác động của đòn bẩy tài chính đến các chỉ số sinh lời.

1. chuonghai <- chuonghai %>%
2.   mutate(
3.     donbay = tong_no_phai_tra / von_chu_so_huu,
4.     nhom_donbay = case_when(
5.       donbay < quantile(donbay, 0.33, na.rm = TRUE) ~ "Thấp",
6.       donbay < quantile(donbay, 0.66, na.rm = TRUE) ~ "Trung bình",
7.       TRUE ~ "Cao"
8.     )
9.   )
10. phan_to_donbay <- chuonghai %>%
11.   group_by(nhom_donbay) %>%
12.   summarise(
13.     ROE_tb = mean(roe, na.rm = TRUE),
14.     ROA_tb = mean(roa, na.rm = TRUE),
15.     ICR_tb = mean(icr, na.rm = TRUE)
16.   )
17. phan_to_donbay

Giải thích kỹ thuật

(2-3) mutate(...) : Tạo biến donbay = tong_no_phai_tra / von_chu_so_huu.  
Tạo biến nhom_donbay chia đòn bẩy thành 3 nhóm dựa trên phân vị 33% và 66%.  
(11) Gom dữ liệu theo từng nhóm đòn bẩy.  
(12) summarise(...) Tính trung bình của các chỉ tiêu tài chính và na.rm = TRUE bỏ qua giá trị thiếu.

Nhận xét:

Nhóm đòn bẩy cao có ROE cao nhất (19,54%) nhưng ROA thấp nhất (1,16%), cho thấy hiệu quả sinh lời chủ yếu đến từ đòn bẩy tài chính chứ không phải hiệu suất tài sản.
Ngược lại, nhóm đòn bẩy thấp có ROA cao nhất (1,66%) và ICR thấp hơn (-0,94), phản ánh khả năng sinh lời nội tại tốt hơn nhưng chịu áp lực chi phí vốn.
Nhìn chung, ROE tăng theo mức đòn bẩy, song đi kèm rủi ro tài chính cao và hiệu quả sử dụng tài sản giảm.

4.3.1.6 Phân tổ theo tỷ suất chi phí hoạt động / doanh thu

Mục tiêu: Đánh giá hiệu quả quản lý chi phí của Vietcombank qua các nhóm tỷ suất chi phí.

1. chuonghai <- chuonghai %>%
2.   mutate(
3.     chi_phi_ty_le = chi_phi_hoat_dong / tong_thu_nhap_hoat_dong * 100,
4.     nhom_chiphi = case_when(
5.       chi_phi_ty_le < quantile(chi_phi_ty_le, 0.33, na.rm = TRUE) ~ "Hiệu quả cao",
6.       chi_phi_ty_le < quantile(chi_phi_ty_le, 0.66, na.rm = TRUE) ~ "Hiệu quả TB",
7.       TRUE ~ "Hiệu quả thấp"
8.     )
9.   )
10. phan_to_chiphi <- chuonghai %>%
11.   group_by(nhom_chiphi) %>%
12.   summarise(
13.     ROA_tb = mean(roa, na.rm = TRUE),
14.     ROE_tb = mean(roe, na.rm = TRUE),
15.     ROS_tb = mean(ros, na.rm = TRUE)
16.   )
17. phan_to_chiphi

Nhận xét:

Nhóm hiệu quả trung bình đạt ROE cao nhất (21,25%) và ROS 42,43%, cho thấy cân bằng tốt giữa chi phí và doanh thu.
Nhóm hiệu quả thấp cũng duy trì ROA 1,60% và ROS tương đương (42,32%), phản ánh chiến lược đầu tư mở rộng dù chi phí cao.
Ngược lại, nhóm hiệu quả cao có ROA và ROE thấp nhất (0,85% và 14,49%), cho thấy cắt giảm chi phí quá mức làm giảm khả năng sinh lời.

→ Mức chi phí hoạt động vừa phải giúp ngân hàng đạt hiệu quả sinh lời tối ưu hơn so với việc chi quá ít hoặc quá nhiều.

4.3.1.7 Phân tổ theo tốc độ tăng trưởng lợi nhuận sau thuế

Mục tiêu: Phân loại các năm theo tốc độ tăng lợi nhuận sau thuế để xác định giai đoạn tăng trưởng mạnh.

1. chuonghai <- chuonghai %>%
2.   arrange(nam) %>%
3.   mutate(
4.     tangtruong_loinhuan = (loi_nhuan_sau_thue - lag(loi_nhuan_sau_thue)) / lag(loi_nhuan_sau_thue) * 100,
5.     nhom_loinhuan = case_when(
6.       tangtruong_loinhuan < 0 ~ "Giảm lợi nhuận",
7.       tangtruong_loinhuan < 10 ~ "Tăng nhẹ",
8.       TRUE ~ "Tăng mạnh"
9.     )
10.   )
11. phan_to_loinhuan <- chuonghai %>%
12.   group_by(nhom_loinhuan) %>%
13.   summarise(
14.     ROA_tb = mean(roa, na.rm = TRUE),
15.     ROE_tb = mean(roe, na.rm = TRUE),
16.     CR_tb = mean(cr, na.rm = TRUE)
17.   )
18. phan_to_loinhuan

Giải thích kỹ thuật

(2) sắp xếp theo năm.
(3) tính % tăng trưởng lợi nhuận so với năm trước.
(5) case_when() → chia 3 nhóm: Giảm, Tăng nhẹ, Tăng mạnh.
(12) group_by(nhom_loinhuan) → nhóm theo mức tăng trưởng.
(13) summarise() → tính trung bình ROA, ROE, CR cho từng nhóm.

Nhận xét:

Nhóm tăng nhẹ có ROA cao nhất (1,62%) và CR cao nhất (1,04), cho thấy hiệu quả sinh lời và khả năng thanh toán tốt nhất.
Nhóm tăng mạnh có ROE cao (19,03%) nhưng ROA thấp hơn, phản ánh tăng trưởng lợi nhuận chủ yếu nhờ đòn bẩy vốn.
Nhóm giảm lợi nhuận vẫn duy trì ROE 19,63%, cho thấy khả năng sinh lời cho cổ đông ổn định dù lợi nhuận giảm.

4.3.2 PHÂN TÍCH ĐƠN BIẾN

Phân tích đơn biến nhằm mô tả xu hướng, mức độ biến động và đặc điểm phân phối của từng biến tài chính chính trong bộ dữ liệu Vietcombank (2015–2024).
Các biến được chọn thuộc 4 nhóm lớn:
- Tài sản & vốn: TTS, VCSH
- Doanh thu & lợi nhuận: Doanh thu, LNST
- Thanh khoản & sinh lời: CR, ROA, ROE
- Dòng tiền hoạt động: Lưu chuyển tiền SXKD
Code hàm mẫu tổng quát: Việc sử dụng hàm mẫu tổng quát để rút gọn và làm giảm các thao tác ngắn xuống hết mức nhất có thể.

1. library(dplyr)
2. thongke_mota <- function(data, bien){
3.   data %>%
4.     summarise(
5.       So_nam = n(),
6.       Gia_tri_trung_binh = mean({{bien}}, na.rm = TRUE),
7.       Trung_vi = median({{bien}}, na.rm = TRUE),
8.       Lon_nhat = max({{bien}}, na.rm = TRUE),
9.       Nho_nhat = min({{bien}}, na.rm = TRUE),
10.       Do_lech_chuan = sd({{bien}}, na.rm = TRUE),
11.       Heso_Bien_thien = sd({{bien}}, na.rm = TRUE) / mean({{bien}}, na.rm = TRUE) * 100,
12.       Q1 = quantile({{bien}}, 0.25, na.rm = TRUE),
13.       Q3 = quantile({{bien}}, 0.75, na.rm = TRUE)
14.     )
15. }

4.3.2.1 Tổng tài sản

1. thongke_mota(chuonghai, tong_tai_san)

Kết quả: Trung bình 1.33 triệu tỷ đồng, tăng từ 674 nghìn tỷ lên hơn 2 triệu tỷ.
Nhận xét: Quy mô tài sản tăng liên tục và ổn định, thể hiện chiến lược mở rộng hoạt động kinh doanh bền vững của Vietcombank. Biên độ dao động khá lớn (hệ số biến thiên > 30%), phản ánh tốc độ tăng trưởng cao giai đoạn 2015–2024

4.3.2.2 Vốn chủ sở hữu

1. thongke_mota(chuonghai, von_chu_so_huu)

Kết quả: Bình quân 47,1 nghìn tỷ đồng, cao nhất đạt 68,6 nghìn tỷ năm 2024.
Nhận xét: Doanh thu tăng mạnh và ổn định, phản ánh hiệu quả mở rộng tín dụng và dịch vụ. Độ lệch chuẩn khá lớn → quy mô doanh thu tăng nhanh trong các năm gần đây

4.3.2.3 Doanh thu (tổng thu nhập hoạt động)

1. thongke_mota(chuonghai, tong_thu_nhap_hoat_dong)

Kết quả: Bình quân 47,1 nghìn tỷ đồng, cao nhất đạt 68,6 nghìn tỷ năm 2024.
Nhận xét: Doanh thu tăng mạnh và ổn định, phản ánh hiệu quả mở rộng tín dụng và dịch vụ. Độ lệch chuẩn khá lớn → quy mô doanh thu tăng nhanh trong các năm gần đây

4.3.2.4 Lợi nhuận sau thuế

1. thongke_mota(chuonghai, loi_nhuan_sau_thue)

Kết quả: Trung bình 19,2 nghìn tỷ đồng, đạt đỉnh 33,9 nghìn tỷ năm 2024.
Nhận xét: Lợi nhuận tăng trưởng ấn tượng, đặc biệt sau 2019. Điều này thể hiện khả năng kiểm soát chi phí tốt và hiệu quả hoạt động cao, giúp Vietcombank duy trì vị thế dẫn đầu ngành ngân hàng.

4.3.2.5 Tỷ số thanh toán hiện hành

1. thongke_mota(chuonghai, cr)

Kết quả: Trung bình ~0,98 lần, khá ổn định.
Nhận xét: Chỉ số CR duy trì quanh 1, cho thấy khả năng thanh toán ngắn hạn vững vàng, Vietcombank không gặp áp lực về thanh khoản trong giai đoạn 2015–2024.

4.3.2.6 Lợi nhuận trên tài sản

1. thongke_mota(chuonghai, roa)

Kết quả: Trung bình 1,34%, cao nhất 1,8%.
Nhận xét: ROA ổn định ở mức cao so với mặt bằng ngành ngân hàng Việt Nam (~1%), thể hiện khả năng sử dụng tài sản tạo lợi nhuận hiệu quả.

4.3.2.7 Lợi nhuận trên vốn chủ

1. thongke_mota(chuonghai, roe)

Kết quả: Trung bình 18,9%, cao nhất 23,5%.
Nhận xét: ROE duy trì ở mức rất tốt, phản ánh hiệu quả đầu tư và khả năng sinh lời của vốn chủ sở hữu cao, cho thấy VCB đang tối ưu hóa lợi nhuận cho cổ đông.

4.3.2.8 Lưu chuyển tiền thuần từ hoạt động SXKD

1. thongke_mota(chuonghai, luu_chuyen_tien_tu_hoat_dong_tai_chinh)

Kết quả: Trung bình âm 1,55 nghìn tỷ đồng, dao động khá lớn giữa các năm.
Nhận xét: Biến động dòng tiền thể hiện sự thay đổi chu kỳ đầu tư và huy động vốn, tuy đôi lúc âm nhưng không ảnh hưởng lớn đến khả năng thanh khoản do ngân hàng có nguồn huy động ổn định và quy mô vốn lớn

4.3.3 PHÂN TÍCH ĐA BIẾN

Mục tiêu

Phân tích đa biến theo nhóm nhằm đánh giá sự khác biệt giữa các chỉ tiêu tài chính (ROE, ROA, LNST) của Vietcombank khi được chia thành các nhóm đặc trưng về giai đoạn kinh tế, quy mô hoạt động và mức thanh khoản.
Qua đó, ta có thể xác định các yếu tố ảnh hưởng mạnh nhất đến hiệu quả sinh lời và ổn định tài chính của ngân hàng trong giai đoạn 2015–2024.

Thiết lập nhóm phân tổ

Trước khi tiến hành phân tích đa biến, cần phân loại (phân tổ) dữ liệu thành các nhóm để so sánh và đánh giá khác biệt giữa các giai đoạn, quy mô hay mức độ thanh khoản.

Việc phân nhóm giúp mô hình hóa biến động tài chính theo điều kiện cụ thể, đồng thời tạo nền tảng cho việc thực hiện các thống kê mô tả có điều kiện (grouped summaries) trong R.

Ở đây, ta chia dữ liệu thành 3 hệ nhóm chính:

  • Nhóm theo giai đoạn kinh tế: trước COVID-19 (2015–2019), trong COVID (2020–2021), và sau COVID (2022–2024).

  • Nhóm theo quy mô tài sản: dựa trên các phần tư (quantile) của tổng tài sản để phân thành quy mô nhỏ, trung bình, lớn.

  • Nhóm theo mức thanh khoản (CR): dựa trên chỉ số thanh khoản hiện hành, chia thành thấp, trung bình, cao.

1. VCB <- chuonghai %>%
2.   mutate(
3.     # Giai đoạn kinh tế
4.     Giai_doan = case_when(
5.       nam <= 2019 ~ "Trước COVID-19",
6.       nam %in% 2020:2021 ~ "Trong COVID-19",
7.       nam >= 2022 ~ "Sau COVID-19"
8.     ),
9.     # Quy mô tài sản
10.     Nhom_TTS = case_when(
11.       tong_tai_san < quantile(tong_tai_san, 0.33, na.rm = TRUE) ~ "Quy mô nhỏ",
12.       tong_tai_san < quantile(tong_tai_san, 0.67, na.rm = TRUE) ~ "Quy mô trung bình",
13.       TRUE ~ "Quy mô lớn"
14.     ),
15.     # Mức thanh khoản
16.     Muc_CR = case_when(
17.       cr < quantile(cr, 0.33, na.rm = TRUE) ~ "Thấp",
18.       cr < quantile(cr, 0.67, na.rm = TRUE) ~ "Trung bình",
19.       TRUE ~ "Cao"
20.     )
21.   )

Giải thích kỹ thuật

mutate() được dùng để tạo thêm các biến nhóm mới trong bảng dữ liệu.  
case_when() giúp gán nhãn phân loại điều kiện (theo năm, giá trị tài sản, hoặc tỷ số CR).  
Phương pháp phân tổ này đảm bảo dữ liệu được chia hợp lý và khách quan theo cấu trúc thực tế.

4.3.3.1 ROE theo giai đoạn kinh tế

Mục tiêu của phần này là đánh giá hiệu quả sinh lời trên vốn chủ sở hữu (ROE) của Vietcombank trong các giai đoạn kinh tế khác nhau:
- Trước COVID-19 (2015–2019),
- Trong đại dịch (2020–2021),
- Sau COVID-19 (2022–2024).

Phân tích này giúp xác định khả năng phục hồi và tính bền vững trong quản trị vốn của ngân hàng.

1. thongke_ROE_GiaiDoan <- VCB %>%
2.   group_by(Giai_doan) %>%
3.   summarise(
4.     Soluong = n(),
5.     ROE_tb = mean(roe, na.rm = TRUE),
6.     ROE_max = max(roe, na.rm = TRUE),
7.     ROE_min = min(roe, na.rm = TRUE),
8.     Trungvi = median(roe, na.rm = TRUE),
9.     Dolechchuan = sd(roe, na.rm = TRUE),
10.     Q1 = quantile(roe, 0.25, na.rm = TRUE),
11.     Q3 = quantile(roe, 0.75, na.rm = TRUE)
12.   ) %>%
13.   arrange(Giai_doan)
14. thongke_ROE_GiaiDoan

Nhận xét

1.Giai đoạn trước COVID-19 (2015–2019):

ROE trung bình đạt ~17.98%, tuy nhiên có biến động khá lớn (độ lệch chuẩn 5.18%).

Biên dao động ROE (11.8% – 23.5%) cho thấy hiệu quả sinh lời còn phụ thuộc mạnh vào điều kiện kinh tế từng năm.

Giai đoạn này ngân hàng vẫn trong quá trình mở rộng quy mô và cơ cấu danh mục tín dụng, dẫn tới chênh lệch hiệu quả giữa các năm.

2.Giai đoạn COVID-19 (2020–2021):

ROE trung bình tăng nhẹ lên 19.98%, biên độ dao động rất thấp (±0.4%).

Điều này phản ánh VCB duy trì hoạt động ổn định, nhờ cơ cấu tài sản an toàn, dự phòng rủi ro cao và chính sách hỗ trợ lãi suất hợp lý.

Sự ổn định thể hiện khả năng ứng phó linh hoạt và hiệu quả trong thời kỳ khủng hoảng.

3.Giai đoạn sau COVID-19 (2022–2024):

ROE trung bình duy trì ở mức cao (~19.78%), chỉ thấp hơn một chút so với giai đoạn dịch.

Mức dao động ROE hẹp và ổn định hơn so với trước đại dịch (chênh lệch chuẩn 2.4%).

Đây là dấu hiệu cho thấy VCB phục hồi mạnh mẽ, giữ vững khả năng sinh lời ổn định và bền vững sau khủng hoảng.

4.3.3.2 ROA theo quy mô tài sản

Phân tích này nhằm xem xét mức độ hiệu quả sử dụng tài sản (ROA) ở các nhóm ngân hàng có quy mô tổng tài sản khác nhau.

Kỳ vọng rằng: quy mô càng lớn, ROA càng cao do hiệu ứng kinh tế theo quy mô (economies of scale).

1. thongke_ROA_TTS <- VCB %>%
2.   group_by(Nhom_TTS) %>%
3.   summarise(
4.     Soluong = n(),
5.     ROA_tb = mean(roa, na.rm = TRUE),
6.     ROA_max = max(roa, na.rm = TRUE),
7.     ROA_min = min(roa, na.rm = TRUE),
8.     Trungvi = median(roa, na.rm = TRUE),
9.     Dolechchuan = sd(roa, na.rm = TRUE),
10.     Q1 = quantile(roa, 0.25, na.rm = TRUE),
11.     Q3 = quantile(roa, 0.75, na.rm = TRUE)
12.   ) %>%
13.   arrange(Nhom_TTS)
14. thongke_ROA_TTS

Nhận xét

1.Nhóm quy mô nhỏ:

ROA trung bình 0.85%, thấp nhất trong ba nhóm, biên dao động hẹp (0.79% – 0.88%).

Điều này phản ánh hiệu quả sử dụng tài sản còn hạn chế, chủ yếu do quy mô hoạt động nhỏ, chưa tận dụng tốt lợi thế quy mô.

2.Nhóm quy mô trung bình:

ROA trung bình 1.46%, tăng so với nhóm nhỏ; độ lệch chuẩn thấp (0.09%) cho thấy mức ổn định khá tốt.

Nhóm này đạt hiệu quả cân bằng giữa mở rộng và quản trị rủi ro, phản ánh giai đoạn phát triển ổn định của ngân hàng.

3.Nhóm quy mô lớn:

ROA trung bình 1.69%, cao nhất trong ba nhóm, biến động thấp (độ lệch chuẩn 0.09%).

Điều này cho thấy các ngân hàng quy mô lớn như VCB tận dụng tốt tài sản, tăng năng suất sinh lời, nhờ hiệu ứng kinh tế theo quy mô và khả năng quản lý chi phí tốt hơn.

Tổng kết: ROA tăng dần theo quy mô tổng tài sản, chứng tỏ VCB càng mở rộng quy mô thì hiệu quả sử dụng tài sản càng cao, đồng thời duy trì sự ổn định tài chính vững chắc.

4.3.3.3 Lợi nhuận sau thuế theo mức thanh khoản

Phần này xem xét mức độ thanh khoản (CR) có ảnh hưởng thế nào đến lợi nhuận sau thuế.

Một ngân hàng có thanh khoản tốt thường duy trì ổn định hoạt động và khả năng sinh lời, nhưng quá thanh khoản có thể làm giảm hiệu quả đầu tư.

1. thongke_LNST_CR <- VCB %>%
2.   group_by(Muc_CR) %>%
3.   summarise(
4.     Soluong = n(),
5.     LNST_tb = mean(loi_nhuan_sau_thue, na.rm = TRUE),
6.     LNST_max = max(loi_nhuan_sau_thue, na.rm = TRUE),
7.     LNST_min = min(loi_nhuan_sau_thue, na.rm = TRUE),
8.     Trungvi = median(loi_nhuan_sau_thue, na.rm = TRUE),
9.     Dolechchuan = sd(loi_nhuan_sau_thue, na.rm = TRUE),
10.     Q1 = quantile(loi_nhuan_sau_thue, 0.25, na.rm = TRUE),
11.     Q3 = quantile(loi_nhuan_sau_thue, 0.75, na.rm = TRUE)
12.   ) %>%
13.   arrange(Muc_CR)
14. thongke_LNST_CR

Nhận xét:

1.Nhóm thanh khoản thấp:

LNST trung bình ≈ 1.14×1013 đồng, thấp nhất trong ba nhóm, với biên độ dao động lớn (độ lệch chuẩn ~9.21×1012).

Điều này cho thấy mức thanh khoản thấp gắn với rủi ro hoạt động cao hơn, hiệu quả sinh lời kém ổn định.

2.Nhóm thanh khoản trung bình:

LNST trung bình ≈ 2.04×1013 đồng, tăng gần gấp đôi so với nhóm thấp, độ lệch chuẩn giảm (6.60×1012).

Nhóm này thể hiện cân bằng tốt giữa khả năng thanh toán và hiệu quả sinh lời, phản ánh cấu trúc vốn an toàn.

3.Nhóm thanh khoản cao:

LNST trung bình ≈ 2.53×1013 đồng, cao nhất, với mức biến động tương đối ổn định (1.40×1013).

Điều này cho thấy VCB có khả năng tối ưu hóa nguồn vốn khả dụng, đảm bảo hiệu quả sinh lời cao ngay cả khi duy trì mức thanh khoản lớn.

Tổng kết Lợi nhuận sau thuế tăng dần theo mức thanh khoản (CR), chứng tỏ VCB quản lý vốn hiệu quả, duy trì cân bằng giữa an toàn thanh khoản và tối đa hóa lợi nhuận, phản ánh hiệu quả hoạt động bền vững của ngân hàng.

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

Phần này nhằm trực quan hóa các biến tài chính chủ đạo của Vietcombank trong giai đoạn 2015–2024, giúp người đọc nhận diện xu hướng, biến động và cấu trúc tài chính qua thời gian.

Các biểu đồ được thiết kế để thể hiện hiệu quả hoạt động, khả năng thanh khoản, khả năng sinh lời và dòng tiền – những chỉ tiêu phản ánh sức khỏe tài chính toàn diện của ngân hàng.

4.4.1 Biến động tổng tài sản qua năm

1. chuonghai$nam <- as.numeric(chuonghai$nam)
2. library(ggplot2)
3. ggplot(chuonghai, aes(x = factor(nam), y = tong_tai_san / 1e12)) +
4.   geom_col(fill = "#1B9E77", width = 0.6) + 
5.   geom_text(aes(label = round(tong_tai_san / 1e12, 1)), 
6.             vjust = -0.5, size = 2.5, color = "black") + 
7.   labs(title = "Biến động Tổng tài sản Vietcombank (2015–2024)",
8.        subtitle = "Đơn vị: Nghìn tỷ đồng",
9.        x = "Năm", y = "Tổng tài sản (nghìn tỷ đồng)") +
10.   scale_y_continuous(labels = scales::comma) +
11.   theme_minimal(base_size = 12) +
12.   theme(
13.     plot.title = element_text(face = "bold", color = "#1B9E77", size = 11),
14.     axis.title = element_text(face = "bold"),
15.     panel.grid.minor = element_blank()
16.   )

Giải thích kỹ thuật

(3) aes(x = factor(nam), y = tong_tai_san / 1e12) Biểu diễn dữ liệu theo năm (x) và tổng tài sản chia 1e12 (y) giúp thu gọn giá trị lớn thành đơn vị nghìn tỷ đồng  
(4) geom_col()    Vẽ biểu đồ cột theo chiều cao tỷ lệ với giá trị để  thể hiện rõ quy mô từng năm  
(5) geom_text()   Gắn giá trị cụ thể lên đầu mỗi cột giúp dễ nhận biết số liệu  
(10) scale_y_continuous(labels = scales::comma)    Hiển thị giá trị có dấu phẩy ngăn cách hàng nghìn làm dữ liệu dễ đọc hơn  
(11) theme_minimal() Giao diện đơn giản, hiện đại giúp nổi bật phần nội dung biểu đồ  
(12) theme()   Tùy chỉnh thêm cho tiêu đề, trục và màu sắc Làm biểu đồ đẹp, chuyên nghiệp hơn  

Nhận xét

Tổng tài sản Vietcombank tăng liên tục và ổn định từ 674,4 nghìn tỷ đồng năm 2015 lên 2.085,9 nghìn tỷ đồng năm 2024, gấp hơn 3 lần sau 10 năm.

Giai đoạn 2021–2022 ghi nhận mức tăng mạnh nhất (~28%), phản ánh sự phục hồi sau COVID-19 và chiến lược mở rộng tín dụng hiệu quả.

Trong thời kỳ COVID-19 (2020–2021), tổng tài sản vẫn tăng đều, cho thấy khả năng quản trị rủi ro và thanh khoản tốt.

Kết luận: Vietcombank đã duy trì được đà tăng trưởng tài sản liên tục trong suốt 10 năm, trở thành ngân hàng có quy mô tài sản hàng đầu Việt Nam, thể hiện sức khỏe tài chính vững vàng, khả năng huy động vốn mạnh và hiệu quả sử dụng tài sản cao.

4.4.2 Cơ cấu tài sản Vietcombank qua các năm

Thể hiện sự thay đổi cơ cấu tài sản qua các năm — gồm Tiền mặt, Cho vay khách hàng, Chứng khoán đầu tư, Tài sản khác — giúp nhận diện xu hướng tăng trưởng của các cấu phần chính.

1. library(ggplot2)
2. library(scales)
3. library(dplyr)
4. library(tidyr)
5. data_taisan <- chuonghai %>%
6.   select(
7.     nam,
8.     tien_mat,
9.     tien_gui_ngan_hang,
10.     cho_vay_khach_hang,
11.     chung_khoan_dau_tu,
12.     tai_san_khac
13.   ) %>%
14.   rename(
15.     "Tiền mặt" = tien_mat,
16.     "Tiền gửi NHNN" = tien_gui_ngan_hang,
17.     "Cho vay khách hàng" = cho_vay_khach_hang,
18.     "Chứng khoán đầu tư" = chung_khoan_dau_tu,
19.     "Tài sản khác" = tai_san_khac
20.   ) %>%
21.   pivot_longer(
22.   cols = -nam,
23.   names_to = "Khoan_muc",
24.   values_to = "Gia_tri"
25. )
26. # Tách dữ liệu theo từng nhóm tài sản
27. data_list <- split(data_taisan, data_taisan$Khoan_muc)
28. # Đặt bảng màu riêng cho từng nhóm tài sản (màu pastel dịu mắt)
29. palette_colors <- c(
30.   "Tiền mặt" = "#1b9e77",        # xanh ngọc đậm
31.   "Tiền gửi NHNN" = "#d95f02",   # cam đất
32.   "Cho vay khách hàng" = "#7570b3", # tím xanh
33.   "Chứng khoán đầu tư" = "#e7298a", # hồng đậm
34.   "Tài sản khác" = "#66a61e"     # xanh lá tươi
35. )
36. # Vẽ từng biểu đồ riêng
37. for (name in names(data_list)) {
38.   color_fill <- palette_colors[name]  # chọn màu tương ứng với từng nhóm
39.   
40.   p <- ggplot(data_list[[name]], aes(x = nam, y = Gia_tri / 1e12)) +
41.     geom_col(width = 0.6, fill = color_fill) +
42.     geom_text(aes(label = number(Gia_tri / 1e12, accuracy = 0.1)),
43.               hjust = 1.5, size = 4.5, color = "white", fontface = "bold") +
44.     scale_x_continuous(
45.       breaks = seq(min(data_list[[name]]$nam), max(data_list[[name]]$nam), by = 1)
46.     ) +
47.     coord_flip() +
48.     labs(
49.       title = paste("Xu hướng", name),
50.       subtitle = "Đơn vị: Nghìn tỷ đồng",
51.       x = "Năm", y = "Giá trị (nghìn tỷ đồng)"
52.     ) +
53.     theme_minimal(base_size = 15) +
54.     theme(
55.       plot.title = element_text(face = "bold", color = color_fill, size = 18),
56.       plot.subtitle = element_text(size = 13),
57.       axis.title = element_text(face = "bold", size = 14),
58.       axis.text = element_text(size = 12, face = "bold"),
59.       panel.grid.minor = element_blank()
60.     )
61.   
62.   print(p)
63. }

Giải thích kỹ thuật

data_list <- split(data_taisan, data_taisan$Khoan_muc)
→ Tách data_taisan thành nhiều data frame nhỏ, mỗi cái tương ứng 1 khoản mục tài sản.

palette_colors <- c(...)
→ Tạo bảng màu: gán sẵn một mã màu đẹp cho từng khoản mục (Tiền mặt, Tiền gửi NHNN,…).

for (name in names(data_list)) { ... }
→ Dùng vòng lặp để vẽ lần lượt từng biểu đồ cho từng nhóm tài sản.

color_fill <- palette_colors[name]
→ Lấy đúng màu tương ứng với khoản mục đang vẽ.

ggplot(... ) + geom_col(..., fill = color_fill)
→ Vẽ biểu đồ cột nằm ngang cho nhóm đó, toàn bộ cột dùng 1 màu duy nhất.

geom_text(... label = number(...))
→ In giá trị lên đầu cột, làm tròn 1 chữ số thập phân.

scale_x_continuous(breaks = seq(...))
→ Cho trục năm hiển thị năm nguyên 2015, 2016, ….

coord_flip()
→ Đảo trục để cột nằm ngang.

theme_minimal(...) + theme(...)
→ Chỉnh font, kích thước chữ, màu tiêu đề cho biểu đồ rõ và đẹp hơn.

Nhận xét

Cho vay khách hàng: Là khoản mục lớn nhất, tăng mạnh từ 379,1 nghìn tỷ (2015) lên 1.418 nghìn tỷ (2024), phản ánh mở rộng tín dụng ổn định và vai trò trụ cột trong cơ cấu tài sản.

Chứng khoán đầu tư: Biến động nhẹ quanh 130–190 nghìn tỷ, đạt đỉnh năm 2022, cho thấy VCB điều chỉnh danh mục đầu tư linh hoạt để kiểm soát rủi ro thị trường.

Tài sản khác: Tăng đột biến năm 2022 (61 nghìn tỷ) rồi giảm, có thể liên quan đến các khoản phải thu hoặc dự phòng, thể hiện sự biến động trong cơ cấu tài sản phụ.

Tiền mặt và tương đương tiền: Tăng đều đến 2022 (18,3 nghìn tỷ) rồi giảm nhẹ, phản ánh chính sách duy trì thanh khoản an toàn trong và sau giai đoạn biến động kinh tế.

→ Tổng kết: Cơ cấu tài sản của Vietcombank tăng trưởng ổn định, an toàn và linh hoạt, với tín dụng là trụ cột chính, cùng quản trị đầu tư và thanh khoản hiệu quả.

4.4.3 Quy mô và tăng trưởng lợi nhuận

1. library(ggplot2)
2. library(dplyr)
3. ggplot(chuonghai, aes(x = factor(nam))) +
4.   # Cột lợi nhuận sau thuế
5.   geom_col(aes(y = loi_nhuan_sau_thue / 1e12, fill = "Lợi nhuận sau thuế"), width = 0.6) +
6.   
7.   # Đường lợi nhuận trước thuế
8.   geom_line(aes(y = tong_loi_nhuan_truoc_thue / 1e12, color = "Lợi nhuận trước thuế", group = 1), size = 1.2) +
9.   geom_point(aes(y = tong_loi_nhuan_truoc_thue / 1e12, color = "Lợi nhuận trước thuế"), size = 2) +
10.   
11.   # Thêm nhãn giá trị cho từng cột (LNST)
12.   geom_text(aes(y = loi_nhuan_sau_thue / 1e12,
13.                 label = round(loi_nhuan_sau_thue / 1e12, 1)),
14.             vjust = 1, color = "blue", size = 2.8, fontface = "bold") +
15.   
16.   # Thêm nhãn cho đường (LNTT)
17.   geom_text(aes(y = tong_loi_nhuan_truoc_thue / 1e12,
18.                 label = round(tong_loi_nhuan_truoc_thue / 1e12, 1)),
19.             vjust = -1, color = "red", size = 2.8, fontface = "bold") +
20.   
21.   # Màu sắc & định dạng
22.   scale_y_continuous(name = "Giá trị (nghìn tỷ đồng)") +
23.   scale_fill_manual(values = "#FCA311") +
24.   scale_color_manual(values = "#1B9E77") +
25.   
26.   labs(
27.     title = "Quy mô và tăng trưởng lợi nhuận VCB (2015–2024)",
28.     subtitle = "So sánh LNST và LNTT – Đơn vị: Nghìn tỷ đồng",
29.     x = "Năm", fill = "", color = ""
30.   ) +
31.   theme_minimal(base_size = 10) +
32.   theme(
33.     plot.title = element_text(face = "bold", color = "#1B9E77", size = 12),
34.     axis.title = element_text(face = "bold"),
35.     axis.text.x = element_text(size = 9)
36.   )

Giải thích kỹ thuật

factor(nam) → giúp ggplot hiểu rằng “mỗi năm là một danh mục riêng biệt”, không phải giá trị liên tục.

Thêm group = 1 trong geom_line() để đường nối không bị tách rời.

Giờ thì mỗi cột = 1 năm, không còn các mốc như “2015.0 – 2017.5” nữa.

Nhận xét:

Biểu đồ cho thấy lợi nhuận trước và sau thuế của Vietcombank tăng trưởng mạnh mẽ giai đoạn 2015–2024.

Lợi nhuận trước thuế (LNTT) tăng liên tục từ khoảng 6,8 nghìn tỷ (2015) lên 42,2 nghìn tỷ đồng (2024) – gấp hơn 6 lần.

Lợi nhuận sau thuế (LNST) cũng tăng tương ứng, duy trì khoảng 80% LNTT, phản ánh hiệu quả kiểm soát chi phí thuế và hoạt động ổn định.

Tăng trưởng nổi bật giai đoạn 2018–2022, cho thấy hiệu quả sử dụng vốn và quản trị chi phí cải thiện rõ rệt.

→ Tổng kết: Vietcombank duy trì xu hướng tăng lợi nhuận bền vững, khẳng định vị thế ngân hàng dẫn đầu về hiệu quả sinh lời trong hệ thống.

4.4.4 Biên lợi nhuận hoạt động

Biên lợi nhuận hoạt động (Operating Margin) là một trong những chỉ tiêu quan trọng nhất để đánh giá hiệu quả hoạt động kinh doanh cốt lõi của ngân hàng.

Chỉ số này cho biết một đồng doanh thu tạo ra bao nhiêu đồng lợi nhuận sau khi trừ chi phí vận hành, từ đó phản ánh khả năng kiểm soát chi phí và tối ưu hóa hiệu suất hoạt động.

Đối với Vietcombank, việc duy trì biên lợi nhuận cao và ổn định là minh chứng cho năng lực quản trị nội bộ hiệu quả và mô hình kinh doanh bền vững.

cat(“Công thức tính Biên lợi nhuận hoạt động:”)

textBie^nlợinhuậnhoạtđộng=fractextTổngthunhậphoạtđộng−textChiphıˊhoạtđộngtextTổngthunhậphoạtđộngtimes100

1. library(ggplot2)
2. library(dplyr)
3. # Tạo biến biên lợi nhuận hoạt động
4. data_bien_loinhuan <- chuonghai %>%
5.   mutate(bien_loi_nhuan_hoat_dong = 
6.            (tong_thu_nhap_hoat_dong - chi_phi_hoat_dong) / tong_thu_nhap_hoat_dong * 100)
7. # Vẽ biểu đồ
8. ggplot(data_bien_loinhuan, aes(x = as.factor(nam), y = bien_loi_nhuan_hoat_dong)) +
9.   geom_line(group = 1, color = "#1B9E77", size = 1.2) +
10.   geom_point(size = 2.5, color = "#FCA311") +
11.   geom_text(aes(label = paste0(round(bien_loi_nhuan_hoat_dong, 2), "%")), 
12.             vjust = -0.6, size = 3.2, fontface = "bold") +
13.   labs(
14.     title = "Biên lợi nhuận hoạt động của Vietcombank",
15.     subtitle = "Phản ánh khả năng kiểm soát chi phí và hiệu quả tạo lợi nhuận \n  từ hoạt động kinh doanh chính",
16.     x = "Năm",
17.     y = "Biên lợi nhuận hoạt động (%)"
18.   ) +
19.   theme_minimal(base_size = 11) +
20.   theme(
21.     plot.title = element_text(face = "bold", color = "#1B9E77", size = 13),
22.     axis.title = element_text(face = "bold"),
23.     panel.grid.minor = element_blank()
24.   )

Giải thích kỹ thuật

mutate() tạo biến mới tính toán biên lợi nhuận hoạt động (%).

geom_line() và geom_point() giúp hiển thị xu hướng tăng giảm theo năm.

geom_text() hiển thị giá trị phần trăm cụ thể trên từng điểm.

Màu xanh (#1B9E77) → thể hiện hiệu quả vận hành ổn định, màu cam (#FCA311) → nhấn điểm nổi bật.

Nhận xét

Biểu đồ cho thấy biên lợi nhuận hoạt động của Vietcombank duy trì ở mức rất cao, quanh 130–140%, phản ánh khả năng kiểm soát chi phí hiệu quả và lợi nhuận ổn định.

Giai đoạn 2015–2017 đạt đỉnh trên 140%, sau đó giảm nhẹ do chi phí tăng nhanh hơn thu nhập, nhưng vẫn giữ xu hướng ổn định và phục hồi trở lại sau 2022.

Điều này chứng tỏ Vietcombank duy trì hiệu suất sinh lời tốt và quản lý chi phí hiệu quả trong dài hạn.

4.4.5 Tiền gửi khách hàng và vay TCTD khác

1. library(ggplot2)
2. library(dplyr)
3. library(reshape2)
4. data_huydong <- chuonghai %>%
5.   select(nam, tien_gui_cua_khach_hang, tien_gui_va_vay_cac_to_chuc_tin_dung_khac) %>%
6.   mutate(across(c(tien_gui_cua_khach_hang, tien_gui_va_vay_cac_to_chuc_tin_dung_khac), ~ . / 1e12)) %>%
7.   melt(id.vars = "nam")
8. ggplot(data_huydong, aes(x = nam, y = value, fill = variable)) +
9.   geom_col(position = "dodge", width = 0.7) +
10.   geom_text(aes(label = round(value, 1)), 
11.             position = position_dodge(width = 0.7), 
12.             vjust = -0.5, size = 3, fontface = "bold") +
13.   scale_fill_manual(values = c("#219EBC", "#FB8500"),
14.                     labels = c("Tiền gửi khách hàng", "Tiền gửi & vay TCTD khác")) +
15.   labs(title = "So sánh tiền gửi khách hàng và vay các TCTD khác",
16.        subtitle = "Phản ánh cơ cấu huy động vốn từ\n  khách hàng và hệ thống ngân hàng",
17.        x = "Năm", y = "Giá trị (Nghìn tỷ đồng)", fill = "Khoản mục") +
18.   theme_minimal(base_size = 11) +
19.   theme(plot.title = element_text(face = "bold", color = "#1B9E77", size = 13),
20.         axis.title = element_text(face = "bold"))

Giải thích kỹ thuật

select() + mutate(): lấy hai biến huy động chính và chuẩn hóa đơn vị về nghìn tỷ đồng.  
melt(): chuyển dữ liệu từ dạng rộng sang dạng dài, giúp ggplot hiểu được biến phân loại (variable) và giá trị (value).  
geom_col(position = "dodge"): vẽ các cột song song cho từng năm — so sánh trực tiếp giữa tiền gửi khách hàng và vay từ TCTD khác.  
geom_text(): hiển thị giá trị cụ thể trên đầu mỗi cột.  
scale_fill_manual(): gán màu riêng cho từng nguồn vốn, giúp phân biệt rõ ràng.  
theme_minimal(): tạo giao diện sạch, dễ đọc, phù hợp cho báo cáo tài chính.

Nhận xét

Biểu đồ cho thấy tiền gửi khách hàng chiếm tỷ trọng áp đảo trong tổng nguồn vốn huy động của Vietcombank, tăng mạnh từ khoảng 500 nghìn tỷ năm 2015 lên hơn 1,500 nghìn tỷ năm 2024.
Trong khi đó, khoản vay và tiền gửi từ các tổ chức tín dụng khác tăng nhẹ nhưng duy trì ở mức thấp và ổn định, cho thấy ngân hàng phụ thuộc chủ yếu vào nguồn vốn huy động từ khách hàng cá nhân và doanh nghiệp, phản ánh nền tảng huy động vốn vững chắc và bền vững.

4.4.6 Tỷ lệ huy động vốn từ khách hàng

Tỷ lệ huy động vốn từ khách hàng càng cao cho thấy ngân hàng có nền tảng khách hàng vững mạnh, chi phí vốn ổn định, và ít phụ thuộc vào thị trường liên ngân hàng hoặc vay mượn từ tổ chức tín dụng khác.
Ngược lại, tỷ lệ này thấp phản ánh ngân hàng đang dựa nhiều vào các nguồn vay thứ cấp, tiềm ẩn rủi ro thanh khoản.

1. library(ggplot2)
2. library(dplyr)
3. # Tạo biến tỷ lệ huy động vốn
4. data_von <- chuonghai %>%
5. mutate(
6. ty_le_huy_dong_khach_hang = (tien_gui_cua_khach_hang / no_phai_tra_va_von_chu_so_huu) * 100
7. )
8. # Vẽ biểu đồ đường thể hiện xu hướng
9. ggplot(data_von, aes(x = as.factor(nam), y = ty_le_huy_dong_khach_hang)) +
10. geom_line(group = 1, color = "#1B9E77", size = 1.2) +
11. geom_point(size = 2.5, color = "#FCA311") +
12. geom_text(aes(label = paste0(round(ty_le_huy_dong_khach_hang, 2), "%")),
13. vjust = -0.6, size = 3, fontface = "bold") +
14. labs(
15. title = "Tỷ lệ huy động vốn từ khách hàng ",
16. subtitle = "Phản ánh mức độ ổn định và tự chủ tài chính trong cấu trúc nguồn vốn",
17. x = "Năm",
18. y = "Tỷ lệ huy động (%)"
19. ) +
20. theme_minimal(base_size = 11) +
21. theme(
22. plot.title = element_text(face = "bold", color = "#1B9E77", size = 13),
23. axis.title = element_text(face = "bold")
24. )

Giải thích kỹ thuật

mutate() tạo biến mới ty_le_huy_dong_khach_hang theo công thức đã nêu.  
geom_line() thể hiện xu hướng biến động tỷ lệ qua các năm.  
geom_point() và geom_text() giúp dễ nhận diện giá trị từng năm.  
Dữ liệu được trình bày đơn vị %, dễ đọc và phù hợp cho so sánh chuỗi thời gian.

Nhận xét

Biểu đồ thể hiện tỷ lệ huy động vốn từ khách hàng của Vietcombank giai đoạn 2015–2024 dao động quanh mức 70–80%, cho thấy nguồn vốn huy động chủ yếu đến từ khách hàng, phản ánh độ ổn định và khả năng tự chủ tài chính cao.

Tuy nhiên, có những biến động giảm nhẹ trong các năm 2017 và 2022, cho thấy giai đoạn này ngân hàng có thể chịu tác động từ điều kiện thị trường hoặc chính sách huy động, nhưng nhìn chung xu hướng duy trì ổn định và bền vững.

4.4.7 Nhóm chi phí hoạt động

1.Mục tiêu phân tích

Phân tích nhóm Chi phí hoạt động (Operating Expenses) nhằm đánh giá khả năng kiểm soát chi phí, cơ cấu phân bổ giữa các khoản mục và tác động của chúng đến lợi nhuận ròng.

Nhóm này phản ánh hiệu quả nội tại của ngân hàng — mức độ tinh gọn bộ máy, hiệu quả vận hành và chi phí nhân sự.

2.Các biến sử dụng

Từ dữ liệu của bạn (chuonghai), ta chọn các biến thể hiện chi phí vận hành:

  • chi_phi_hoat_dong — Tổng chi phí hoạt động

  • chi_phi_hoat_dong_dich_vu — Chi phí cho hoạt động dịch vụ

  • chi_phi_hoat_dong_khac — Chi phí khác ngoài dịch vụ

  • thanh_toan_cho_nhan_vien_va_nha_cung_cap — Chi cho nhân viên & nhà cung cấp

  • chi_tu_cac_quy_cua_tctd — Chi từ các quỹ của tổ chức tín dụng

1. library(dplyr)
2. library(reshape2)
3. library(ggplot2)
4. # Chuẩn bị dữ liệu nhóm chi phí hoạt động
5. data_cp_hoatdong <- chuonghai %>%
6.   select(
7.     nam,
8.     chi_phi_hoat_dong,
9.     chi_phi_hoat_dong_dich_vu,
10.     chi_phi_hoat_dong_khac,
11.     thanh_toan_cho_nhan_vien_va_nha_cung_cap,
12.     chi_tu_cac_quy_cua_tctd
13.   ) %>%
14.   rename(
15.     "Chi phí hoạt động" = chi_phi_hoat_dong,
16.     "Chi phí dịch vụ" = chi_phi_hoat_dong_dich_vu,
17.     "Chi phí khác" = chi_phi_hoat_dong_khac,
18.     "Thanh toán cho nhân viên & NCC" = thanh_toan_cho_nhan_vien_va_nha_cung_cap,
19.     "Chi từ các quỹ của TCTD" = chi_tu_cac_quy_cua_tctd
20.   ) %>%
21.   mutate(across(-nam, ~ . / 1e12)) %>%  # Quy đổi sang nghìn tỷ đồng
22.   melt(id.vars = "nam", variable.name = "Khoan_muc", value.name = "Gia_tri")
23. # Vẽ biểu đồ
24. ggplot(data_cp_hoatdong, aes(x = as.factor(nam), y = Gia_tri, fill = Khoan_muc)) +
25.   geom_col(width = 0.8) +
26.   geom_text(
27.     aes(label = round(Gia_tri, 1)),
28.     position = position_stack(vjust = 0.5),
29.     size = 2.8,
30.     color = "white",
31.     fontface = "bold"
32.   ) +
33.   scale_fill_manual(
34.     values = c("#1B9E77", "#FCA311", "#E63946", "#457B9D", "#2A9D8F"),
35.     labels = c(
36.       "Chi phí hoạt động",
37.       "Chi phí dịch vụ",
38.       "Chi phí khác",
39.       "Chi nhân viên & NCC",
40.       "Chi từ quỹ TCTD"
41.     )
42.   ) +
43.   labs(
44.     title = "Cơ cấu chi phí hoạt động ",
45.     subtitle = "Phản ánh cơ cấu và biến động các \n khoản chi vận hành chính (Đơn vị: Nghìn tỷ đồng)",
46.     x = "Năm",
47.     y = "Giá trị (Nghìn tỷ đồng)",
48.     fill = "Khoản mục"
49.   ) +
50.   theme_minimal(base_size = 11) +
51.   theme(
52.     plot.title = element_text(face = "bold", color = "#1B9E77", size = 13),
53.     axis.title = element_text(face = "bold"),
54.     legend.position = "right"
55.   )

Giải thích kỹ thuật

Biểu đồ sử dụng geom_col() để tạo cột chồng, giúp thể hiện cơ cấu từng
loại chi phí trong tổng chi phí hoạt động của Vietcombank.  
Dữ liệu được chuyển từ dạng rộng sang dài bằng melt() để dễ dàng biểu
diễn nhiều biến cùng lúc.

Nhận xét

Biểu đồ cho thấy chi phí hoạt động và chi trả cho nhân viên & nhà cung cấp chiếm tỷ trọng lớn nhất trong cơ cấu chi phí của Vietcombank giai đoạn 2015–2024.
Các khoản chi phí dịch vụ, chi phí khác và chi từ quỹ TCTD chỉ chiếm tỷ lệ nhỏ, ít biến động.
Tổng thể, tổng chi phí hoạt động tăng dần qua các năm, phản ánh quy mô hoạt động mở rộng, tuy nhiên cơ cấu chi phí được duy trì ổn định, cho thấy ngân hàng kiểm soát tốt chi phí vận hành trong khi vẫn tăng trưởng.

4.4.8 Nhóm chi phí tài chính

1.Mục tiêu phân tích

Phân tích nhóm Chi phí tài chính nhằm đánh giá khả năng kiểm soát chi phí vốn, mức độ rủi ro tín dụng, và tác động của thuế đến lợi nhuận sau thuế.
Đây là phần chi phí mang tính “bắt buộc” trong hoạt động ngân hàng, nên xu hướng tăng/giảm sẽ phản ánh chất lượng quản trị tài chính của VCB.

2.Các biến sử dụng

Dựa trên bộ dữ liệu bạn cung cấp, ta chọn 5 biến tiêu biểu:

  • chi_phi_lai_va_cac_chi_phi_tuong_tu — Chi phí lãi vay và chi phí tài chính tương tự
  • chi_phi_du_phong_rui_ro_tin_dung — Chi phí dự phòng rủi ro tín dụng
  • chi_phi_thue_tndn_hien_hanh — Chi phí thuế thu nhập doanh nghiệp hiện hành
  • chi_phi_thue_tndn_hoan_lai — Chi phí thuế thu nhập hoãn lại
  • chi_phi_thue_thu_nhap_doanh_nghiep — Tổng chi phí thuế thu nhập doanh nghiệp
1. library(dplyr)
2. library(reshape2)
3. library(ggplot2)
4. data_cp_taichinh <- chuonghai %>%
5.   select(
6.     nam,
7.     chi_phi_lai_va_cac_chi_phi_tuong_tu,
8.     chi_phi_du_phong_rui_ro_tin_dung,
9.     chi_phi_thue_tndn_hien_hanh,
10.     chi_phi_thue_tndn_hoan_lai,
11.     chi_phi_thue_thu_nhap_doanh_nghiep
12.   ) %>%
13.   mutate(across(-nam, ~ . / 1e12)) %>%  # Quy đổi sang nghìn tỷ đồng
14.   melt(id.vars = "nam", variable.name = "Khoan_muc", value.name = "Gia_tri")
15. ggplot(data_cp_taichinh, aes(x = as.factor(nam), y = Gia_tri, fill = Khoan_muc)) +
16.   geom_col(position = "dodge", width = 0.7) +
17.   geom_text(
18.     aes(label = round(Gia_tri, 1)),
19.     position = position_dodge(width = 0.7),
20.     vjust = -0.5,
21.     size = 2,
22.     fontface = "bold"
23.   ) +
24.   scale_fill_manual(
25.     values = c("#1B9E77", "#FCA311", "#E63946", "#457B9D", "#2A9D8F"),
26.     labels = c(
27.       "Chi phí lãi vay",
28.       "Chi phí dự phòng rủi ro tín dụng",
29.       "Thuế TNDN hiện hành",
30.       "Thuế TNDN hoãn lại",
31.       "Tổng chi phí thuế TNDN"
32.     )
33.   ) +
34.   labs(
35.     title = "Cơ cấu chi phí tài chính ",
36.     subtitle = "So sánh các khoản mục chi phí tài chính \n trọng yếu (Đơn vị: Nghìn tỷ đồng)",
37.     x = "Năm",
38.     y = "Giá trị (Nghìn tỷ đồng)",
39.     fill = "Khoản mục"
40.   ) +
41.   theme_minimal(base_size = 8) +
42.   theme(
43.     plot.title = element_text(face = "bold", color = "#1B9E77", size = 14),
44.     axis.title = element_text(face = "bold"),
45.     legend.position = "right"
46.   )

Giải thích kỹ thuật

  Biểu đồ dùng geom_col(position = "dodge") để so sánh giá trị từng loại chi phí tài chính giữa các năm.  
  Dữ liệu được chuẩn hóa sang “nghìn tỷ đồng” để dễ đọc và xử lý qua melt() nhằm chuyển dạng wide → long, giúp ggplot nhận diện biến động theo từng khoản mục.

Nhận xét

Biểu đồ cho thấy chi phí lãi vay là khoản chi tài chính lớn nhất của Vietcombank, tăng đều qua các năm — phản ánh quy mô huy động và cho vay mở rộng.
Chi phí dự phòng rủi ro tín dụng biến động mạnh, đặc biệt tăng cao giai đoạn 2020–2022, cho thấy ngân hàng tăng trích lập dự phòng để phòng ngừa rủi ro tín dụng.
Trong khi đó, chi phí thuế TNDN duy trì ổn định và chiếm tỷ trọng nhỏ hơn.
Tổng thể, cơ cấu chi phí tài chính cho thấy Vietcombank duy trì chiến lược an toàn tài chính, đồng thời kiểm soát tốt rủi ro và nghĩa vụ thuế.

4.4.9 Phân tích đồng biến động giữa các chỉ số thanh khoản

Kiểm tra mối tương quan nội tại giữa các chỉ số thanh khoản (cr, qr, icr, tysothanhkhoan, heso_tucthoi) nhằm đánh giá tính nhất quán trong quản trị thanh khoản của Vietcombank. Nếu các biến này biến động cùng hướng (đồng biến), ngân hàng đang duy trì chính sách thanh khoản ổn định và thống nhất; ngược lại, nếu có nghịch biến, có thể tồn tại xung đột trong chiến lược quản trị vốn.

1. library(ggcorrplot)
2. # Tạo ma trận tương quan giữa 5 chỉ số thanh khoản
3. corr_matrix <- cor(chuonghai %>%
4.                      select(cr, qr, icr, tysothanhkhoan, heso_tucthoi),
5.                    use = "complete.obs")
6. # Vẽ biểu đồ tương quan
7. ggcorrplot(corr_matrix, 
8.            hc.order = TRUE, 
9.            type = "lower",
10.            lab = TRUE, 
11.            lab_size = 3,
12.            method = "square",
13.            colors = c("#E74C3C", "white", "#1B9E77"),
14.            title = "Ma trận tương quan giữa các chỉ số thanh khoản",
15.            ggtheme = theme_minimal())

Giải thích kỹ thuật:

cor() tạo ma trận hệ số tương quan Pearson giữa các biến.

ggcorrplot() trực quan hóa mối tương quan:

Màu xanh đậm → tương quan dương mạnh (đồng biến).

Màu đỏ đậm → tương quan âm (nghịch biến).

Số hiển thị trong từng ô thể hiện mức độ chặt chẽ của mối quan hệ (từ –1 đến 1).

Nhận xét

1.CR và QR (hệ số thanh toán hiện hành & nhanh)

Tương quan rất mạnh (0.99) → hai chỉ số gần như biến động song hành tuyệt đối, phản ánh cơ cấu tài sản ngắn hạn ổn định.

Điều này cho thấy Vietcombank quản lý dòng tiền ngắn hạn hiệu quả và nhất quán, không phụ thuộc nhiều vào tài sản kém thanh khoản.

2.ICR (khả năng đảm bảo lãi vay)

Có tương quan dương với heso_tucthoi (0.59) → khi ngân hàng tăng khả năng thanh toán tức thời, khả năng trả lãi vay cũng được củng cố.

Tuy nhiên, ICR nghịch biến mạnh với tysothanhkhoan (–0.70) → hàm ý rằng khi ngân hàng tăng tỷ lệ tài sản ngắn hạn so với tổng nợ, khả năng trả lãi vay có thể giảm, do vốn bị dàn trải hơn, hiệu quả sinh lợi từ đòn bẩy thấp đi.

3.heso_tucthoi và tysothanhkhoan

Nghịch biến rất mạnh (–0.93) → khi Vietcombank nắm giữ nhiều tiền mặt (tức thời), tỷ lệ thanh khoản tổng thể lại giảm.

Điều này cho thấy ngân hàng có xu hướng “giữ tiền” nhiều hơn khi lo ngại rủi ro, nhưng lại làm giảm hiệu quả sử dụng tài sản — một chiến lược an toàn nhưng kém tối ưu lợi nhuận.

4.Tổng quan xu hướng

Nhìn chung, các chỉ số thanh khoản ngắn hạn (CR, QR) đồng biến mạnh, trong khi ICR và heso_tucthoi thể hiện hướng ngược lại so với nhóm trên.

Điều này phản ánh Vietcombank duy trì chính sách thanh khoản thận trọng, nhưng khi tăng cường an toàn thanh khoản, hiệu quả sử dụng vốn (qua ICR) có xu hướng giảm — một sự đánh đổi hợp lý giữa an toàn và lợi nhuận.

4.4.10 Xu hướng ROA và ROE

1. chuonghai$nam <- as.numeric(chuonghai$nam)
2. ggplot(chuonghai, aes(x = nam)) +
3.   geom_line(aes(y = roa * 100, color = "ROA"), size = 1.2) +
4.   geom_point(aes(y = roa * 100, color = "ROA"), size = 2.8) +
5.   geom_line(aes(y = roe * 100, color = "ROE"), size = 1.2, linetype = "dashed") +
6.   geom_point(aes(y = roe * 100, color = "ROE"), size = 2.8, shape = 17) +
7.   geom_text(aes(y = roa * 100, label = round(roa * 100, 2)),
8.             vjust = -0.8, color = "#E69F00", size = 3.2, fontface = "bold") +
9.   geom_text(aes(y = roe * 100, label = round(roe * 100, 2)),
10.             vjust = -0.8, color = "#56B4E9", size = 3.2, fontface = "bold") +
11.   labs(
12.     title = "Xu hướng ROA và ROE ",
13.     subtitle = "Đơn vị: %",
14.     x = "Năm", y = "Tỷ suất (%)", color = "Chỉ tiêu"
15.   ) +
16.   scale_color_manual(values = c("ROA" = "#E69F00", "ROE" = "#56B4E9")) +
17.   
18.   # Mở rộng trục Y để tránh mất nhãn ở đầu/cuối
19.   expand_limits(y = max(chuonghai$roe * 100, na.rm = TRUE) + 3) +
20.   theme_minimal(base_size = 13) +
21.   theme(
22.     plot.title = element_text(face = "bold", color = "#1B9E77", size = 14),
23.     axis.title = element_text(face = "bold"),
24.     legend.position = "top"
25.   )

Giải thích kỹ thuật

- vjust = -0.8  Dịch nhãn số lên cao hơn một chút   Tránh chồng số lên điểm dữ liệu

- size = 3.2    Giảm nhẹ kích thước chữ Dễ đọc và không tràn

- expand_limits(y = ... + 3)    Mở rộng trục tung thêm 3%   Tránh mất số ở đỉnh đồ thị (như năm 2019–2020)

- fontface = "bold" Làm đậm số liệu Giúp nhìn rõ hơn trên nền sáng

Nhận xét

2015–2017: ROE tăng mạnh từ 11,8% lên 17,3%, ROA ổn định quanh 0,8%, cho thấy hiệu quả sinh lời cải thiện rõ rệt.

2018–2019: Cả hai chỉ tiêu đạt đỉnh (ROA 1,52%; ROE 23,5%), phản ánh hiệu suất hoạt động tối ưu trước dịch.

2020–2021 (COVID-19): Giảm nhẹ nhưng vẫn duy trì mức cao, chứng minh khả năng chống chịu tốt.

2022–2024: ROA ~1,6%, ROE ~20%; dù 2024 giảm nhẹ còn 17,25%, hiệu quả sinh lời vẫn ổn định và dẫn đầu ngành.

→ Vietcombank duy trì ROA ổn định và ROE ở mức cao suốt giai đoạn 2015–2024, khẳng định vị thế ngân hàng hiệu quả hàng đầu Việt Nam, với mô hình tài chính bền vững, an toàn và có sức chống chịu tốt trước biến động kinh tế.

4.4.11 Xu hướng CR và QR

So sánh sự biến động của tỷ số thanh toán hiện hành (CR) và tỷ số thanh toán nhanh (QR) qua các năm 2015–2024 để:

Xem mức độ khác biệt giữa hai chỉ số → phản ánh tỷ trọng tài sản kém thanh khoản trong tài sản ngắn hạn.

Đánh giá khả năng thanh toán thực tế của Vietcombank trong ngắn hạn.

1. ggplot(chuonghai, aes(x = nam)) +
2.   geom_line(aes(y = cr, color = "CR"), size = 1) +
3.   geom_point(aes(y = cr, color = "CR"), size = 2.5) +
4.   geom_line(aes(y = qr, color = "QR"), size = 1, linetype = "dashed") +
5.   geom_point(aes(y = qr, color = "QR"), size = 2.5, shape = 17) +
6.    geom_text(aes(y = cr, label = round(cr, 4)), 
7.             vjust = -1.0, color = "#006400", size = 2, fontface = "bold") +
8.   geom_text(aes(y = qr, label = round(qr, 4)), 
9.             vjust = 1.5, color = "#CC6600", size = 2, fontface = "bold") +
10.   labs(
11.     title = "So sánh hệ số CR và QR của VCB ",
12.     subtitle = "Phân tích sự khác biệt giữa CR và QR",
13.     x = "Năm",
14.     y = "Giá trị hệ số",
15.     color = "Chỉ tiêu"
16.   ) +
17.   scale_color_manual(values = c("CR" = "#1B9E77", "QR" = "#E69F00")) +
18.   theme_minimal(base_size = 13) +
19.   theme(
20.     plot.title = element_text(face = "bold", color = "#1B9E77", size = 14),
21.     axis.title = element_text(face = "bold"),
22.     legend.position = "top"
23.   )

Giải thích kỹ thuật

ggplot(chuonghai, aes(x = nam)): dùng năm làm trục X (nên để numeric để line nối đúng).

geom_line(aes(y = cr, color = "CR"), size = 1) và geom_line(... qr ..., linetype = "dashed"):
vẽ 2 đường xu hướng; CR màu xanh đậm, QR nét gạch để phân biệt.

geom_point(..., size = 2.5): chấm dữ liệu từng năm để dễ định vị giá trị.

geom_text(aes(y = cr, label = round(cr, 4)), ...) và cho QR tương tự:

scale_color_manual(values = c("CR" = "#006400", "QR" = "#CC6600")): đồng bộ màu đường với màu nhãn.

theme_minimal(...) + theme(...): giao diện gọn, tiêu đề/nhãn trục bold; legend.position = "top" cho dễ đọc.

Nhận xét

Cả CR (tỷ số thanh toán hiện hành) và QR (tỷ số thanh toán nhanh) của Vietcombank giai đoạn 2015–2024 đều duy trì quanh mức 0.93–1.08, cho thấy khả năng đáp ứng nợ ngắn hạn ổn định.

Hai chỉ số biến động cùng chiều, phản ánh cơ cấu tài sản ngắn hạn chủ yếu gồm tiền và cho vay khách hàng – ít phụ thuộc vào tài sản khó chuyển đổi.

Đỉnh năm 2017 thể hiện giai đoạn thanh khoản dồi dào, trong khi 2020–2021 giảm nhẹ do ảnh hưởng dịch COVID-19 khiến dòng tiền chậm lại.

Giai đoạn 2022–2024, CR và QR cùng phục hồi, củng cố năng lực quản trị thanh khoản vững vàng và hiệu quả của Vietcombank.

Khoảng cách giữa CR và QR nhỏ (<0.02) cho thấy danh mục tài sản ngắn hạn của ngân hàng an toàn và linh hoạt, phản ánh mức độ thanh khoản cao và rủi ro thấp.

→ Tóm lại, Vietcombank duy trì vị thế thanh khoản mạnh, thể hiện khả năng quản lý tài sản – nợ ngắn hạn hiệu quả và nền tảng tài chính ổn định trong dài hạn.

4.4.12 Mối quan hệ giữa CR và ROA

1. library(ggplot2)
2. library(dplyr)
3. library(ggrepel)
4. library(ggthemes)
5. # Chuẩn bị dữ liệu
6. data_cr_roa <- chuonghai %>%
7.   select(nam, cr, roa) %>%
8.   mutate(roa = roa * 100)   # đổi sang %
9. # Biểu đồ scatter với hồi quy
10. ggplot(data_cr_roa, aes(x = cr, y = roa)) +
11.   geom_point(aes(size = nam, color = nam), alpha = 0.5) +
12.   geom_smooth(method = "lm", se = TRUE, color = "#1B9E77", linetype = "dashed", linewidth = 1) +
13.   geom_text_repel(aes(label = nam), size = 2, color = "black") +
14.   scale_color_viridis_c(option = "C") +
15.   labs(
16.     title = "MQH giữa CR và ROA (2015–2024)",
17.     subtitle = "Phân tích MQH giữa khả năng thanh khoản và hiệu quả sinh lời tài sản",
18.     x = "Tỷ số thanh toán hiện hành (CR)",
19.     y = "Tỷ suất sinh lời trên tài sản (ROA, %)",
20.     color = "Năm",
21.     size = "Quy mô điểm theo năm"
22.   ) +
23.   theme_economist_white(base_size = 10) +
24.   theme(
25.     plot.title = element_text(face = "bold", color = "#1B9E77", size = 10),
26.     axis.title = element_text(face = "bold"),
27.     legend.position = "right"
28.   )

Giải thích kỹ thuật

geom_point(aes(size = nam, color = nam)) → kích thước & màu điểm thể hiện thứ tự thời gian (từ năm 2015 đến 2024).

geom_smooth(method = "lm") → thêm đường hồi quy tuyến tính, để xem xu hướng tương quan giữa CR và ROA.

geom_text_repel() → dán nhãn năm tại từng điểm, không bị chồng.

scale_color_viridis_c() → bảng màu liên tục giúp thấy tiến trình thời gian rõ ràng.

Nhận xét

CR ổn định quanh mức 1 → Vietcombank duy trì thanh khoản an toàn.

Mối quan hệ yếu giữa CR và ROA → thanh khoản cao không làm lợi nhuận tăng đáng kể.

2018–2023: ROA cải thiện dù CR ít thay đổi → ngân hàng sử dụng tài sản hiệu quả hơn.

2024: ROA giảm nhẹ → lợi nhuận chững lại.

Tổng kết: Thanh khoản ổn định, sinh lời hiệu quả, phản ánh chiến lược cân bằng giữa an toàn và lợi nhuận của Vietcombank.

4.4.13 Mối quan hệ giữa ICR và ROE

Mối quan hệ giữa ICR (khả năng đảm bảo lãi vay) và ROE (hiệu quả sử dụng vốn chủ sở hữu) là một mối quan hệ hai chiều: ICR cao có thể hỗ trợ ROE, trong khi ROE cao cho thấy hiệu quả hoạt động và khả năng trả nợ tốt hơn, gián tiếp ảnh hưởng đến ICR. ICR cao thể hiện sức khỏe tài chính, cho phép công ty sử dụng đòn bẩy tài chính (nợ) để tăng lợi nhuận trên vốn chủ sở hữu, từ đó có thể nâng cao ROE. Ngược lại, ROE cao cho thấy công ty tạo ra lợi nhuận hiệu quả từ tài sản ròng, giúp tăng khả năng trả nợ và cải thiện ICR.

1. library(ggplot2)
2. ggplot(chuonghai, aes(x = icr, y = roe * 100, label = nam)) +
3.   geom_point(aes(size = roe, color = icr), alpha = 0.8) +
4.   geom_smooth(method = "lm", se = TRUE, color = "#1B9E77", linetype = "dashed") +
5.   geom_text(vjust = -0.5, size = 2) +
6.   scale_color_gradient(low = "#E9A3C9", high = "#1B9E77") +
7.   scale_size(range = c(1, 6)) +
8.   labs(
9.     title = "Mối quan hệ giữa ICR và ROE Vietcombank (2015–2024)",
10.     subtitle = "Phân tích khả năng trả lãi vay và hiệu quả sử dụng vốn chủ sở hữu",
11.     x = "Khả năng đảm bảo lãi vay (ICR)",
12.     y = "Tỷ suất sinh lời trên vốn chủ sở hữu (ROE, %)"
13.   ) +
14.   theme_minimal(base_size = 8) +
15.   theme(
16.     plot.title = element_text(face = "bold", color = "#1B9E77"),
17.     plot.subtitle = element_text(size = 7),
18.     axis.title = element_text(face = "bold")
19.   )

Giải thích kỹ thuật

ICR: đo khả năng ngân hàng trả lãi vay → ICR cao nghĩa là rủi ro tài chính thấp.


ROE: phản ánh hiệu quả sử dụng vốn chủ sở hữu.


geom_point(): vẽ điểm dữ liệu thể hiện từng năm.


geom_smooth(method="lm"): thêm đường hồi quy tuyến tính → xem xu hướng giữa ICR và ROE.


Màu sắc (color) biểu thị giá trị ICR, kích thước điểm (size) thể hiện ROE → dễ nhìn xu hướng chung.

Nhận xét

Trong giai đoạn 2015–2024, mối quan hệ giữa ICR và ROE của Vietcombank thể hiện xu hướng nghịch nhẹ — khi khả năng đảm bảo lãi vay (ICR) giảm, ROE có xu hướng giảm theo.

Giai đoạn 2018–2019 ghi nhận hiệu quả cao nhất cả về khả năng trả lãi và sinh lời, trong khi 2023–2024 cho thấy ICR giảm mạnh, phản ánh áp lực chi phí vốn tăng và biên lợi nhuận thu hẹp.

→ Kết luận: Khả năng trả lãi suy yếu đang ảnh hưởng đến hiệu quả sử dụng vốn, cần kiểm soát chi phí tài chính để duy trì mức ROE ổn định.

4.4.14 Mối quan hệ giữa tổng thu nhập và lợi nhuận ròng

1. library(ggplot2)
2. library(scales)
3. ggplot(chuonghai, aes(x = as.factor(nam))) +
4.   geom_col(aes(y = tong_thu_nhap_hoat_dong / 1e12, fill = "Tổng thu nhập"), width = 0.6) +
5.   geom_line(aes(y = (loi_nhuan_sau_thue / 1e12) * 5, color = "Lợi nhuận sau thuế"), group = 1, size = 1) + 
6.   scale_y_continuous(
7.     name = "Tổng thu nhập (Nghìn tỷ đồng)",
8.     sec.axis = sec_axis(~./5, name = "Lợi nhuận sau thuế (Nghìn tỷ đồng)")
9.   ) +
10.   scale_fill_manual(values = "#FCA311") +
11.   scale_color_manual(values = "#1B9E77") +
12.   labs(
13.     title = "Biểu đồ song trục: Tổng thu nhập và Lợi nhuận sau thuế (2015–2024)",
14.     subtitle = "So sánh xu hướng tăng trưởng hai chỉ tiêu chính của Vietcombank",
15.     x = "Năm", fill = "", color = ""
16.   ) +
17.   theme_minimal(base_size = 11) +
18.   theme(plot.title = element_text(face = "bold", color = "#1B9E77"))

Giải thích kỹ thuật

geom_col(): tạo các cột thể hiện tổng thu nhập từng năm.

geom_line(): vẽ đường xu hướng lợi nhuận sau thuế theo năm (đã nhân hệ số 5 để hiển thị cùng trục).

scale_y_continuous() + sec_axis(): thiết lập hai trục tung – trục trái cho tổng thu nhập, trục phải cho lợi nhuận sau thuế.

scale_fill_manual() và scale_color_manual(): tùy chỉnh màu sắc cho từng chỉ tiêu.

theme_minimal(): giúp biểu đồ gọn, dễ đọc, tông màu hài hòa.

Nhận xét

Biểu đồ thể hiện xu hướng tăng trưởng đồng đều giữa tổng thu nhập và lợi nhuận sau thuế của Vietcombank giai đoạn 2015–2024.

Tổng thu nhập tăng mạnh, đặc biệt từ sau 2018, kéo theo lợi nhuận sau thuế cũng tăng tương ứng.

Điều này phản ánh hiệu quả hoạt động kinh doanh bền vững, cho thấy ngân hàng duy trì tăng trưởng doanh thu song song với khả năng sinh lời cao và ổn định.

4.4.15 So sánh các tỷ suất sinh lời (ROA, ROE, ROI, ROS)

1. library(ggplot2)
2. library(reshape2)
3. library(dplyr)
4. data_sinhloi <- chuonghai %>%
5.   select(nam, roa, roe, roi, ros) %>%
6.   melt(id.vars = "nam")
7. ggplot(data_sinhloi, aes(x = nam, y = value * 100, color = variable, group = variable)) +
8.   geom_line(size = 1.2) +
9.   geom_point(size = 2.5) +
10.   
11.   # Điều chỉnh vị trí chữ theo từng chỉ tiêu để tránh đè nhau
12.   geom_text(
13.     aes(
14.       label = round(value * 100, 2),
15.       vjust = case_when(
16.         variable == "roa" ~ 1.3,   # ROA: đẩy xuống
17.         variable == "roi" ~ -1.0,  # ROI: đẩy lên
18.         variable == "roe" ~ -0.6,  # ROE: nhẹ lên trên
19.         variable == "ros" ~ -0.8,  # ROS: giữ cao để không chồng
20.         TRUE ~ 0
21.       )
22.     ),
23.     size = 3.3,
24.     fontface = "bold",
25.     show.legend = FALSE
26.   ) +
27.   
28.   scale_color_brewer(palette = "Set1") +
29.   labs(
30.     title = "Tỷ suất sinh lời của Vietcombank (2015–2024)",
31.     subtitle = "So sánh ROA, ROE, ROI và ROS (Đơn vị: %)",
32.     x = "Năm", y = "Tỷ suất (%)", color = "Chỉ tiêu"
33.   ) +
34.   theme_minimal(base_size = 12) +
35.   theme(
36.     plot.title = element_text(face = "bold", color = "#1B9E77", size = 8),
37.     axis.title = element_text(face = "bold"),
38.     legend.position = "right",
39.     legend.title = element_text(face = "bold"),
40.     legend.text = element_text(size = 8)
41.   )

Giải thích kỹ thuật

select(nam, roa, roe, roi, ros) %>% melt(id.vars = "nam"):
gom 4 chỉ tiêu ROA, ROE, ROI, ROS từ dạng rộng (mỗi cột 1 biến) sang dạng dài với cột variable (tên chỉ tiêu) và value (giá trị) → thuận tiện cho ggplot vẽ nhiều đường cùng lúc.

aes(x = nam, y = value * 100, color = variable, group = variable):

Trục X: năm.

Trục Y: giá trị % (nhân 100 từ dạng tỷ lệ).

color = variable: mỗi chỉ tiêu một màu.

group = variable: đảm bảo mỗi chỉ tiêu là một đường riêng.

geom_line() + geom_point(): vẽ đường xu hướng + điểm dữ liệu cho từng năm.

geom_text(label = round(value * 100, 2), ...): gắn số cụ thể (%) trên từng điểm, giúp đọc trực tiếp mà không cần nhìn trục.

scale_color_brewer(palette = "Set1"): dùng bảng màu đồng bộ, dễ phân biệt từng chỉ tiêu.

theme_minimal() + theme(...): giao diện tối giản, tiêu đề in đậm, màu xanh lá cho tiêu đề chính để đồng bộ với các biểu đồ khác.

Nhận xét

ROE: tăng mạnh từ 11,8% (2015) lên đỉnh 23,52% (2018), sau đó dao động quanh 20–22% và giảm nhẹ còn 17,25% (2024) → Vietcombank duy trì hiệu quả sử dụng vốn chủ rất cao, dù biên lợi nhuận có dấu hiệu chịu áp lực giai đoạn gần đây.

ROA: dao động quanh 0,8–1,8%, mức này cao hơn trung bình hệ thống ngân hàng, cho thấy chất lượng tài sản và hiệu quả sử dụng tài sản tốt.

ROI: tăng từ khoảng 1,0% lên trên 2%, phản ánh các khoản đầu tư và sử dụng tổng tài sản mang lại lợi nhuận ổn định và cải thiện dần.

ROS: cải thiện rõ rệt từ 25,15% lên khoảng 49% cuối kỳ → biên lợi nhuận trên doanh thu hoạt động ngày càng dày, chứng tỏ VCB kiểm soát chi phí tốt và nâng cao hiệu quả hoạt động cốt lõi.

→ Tóm lại: Bộ chỉ tiêu cho thấy Vietcombank là ngân hàng có khả năng sinh lời cao và tương đối bền vững, dù giai đoạn sau 2022 lợi nhuận trên vốn (ROE) có dấu hiệu hạ nhiệt, song biên lợi nhuận hoạt động (ROS) và hiệu quả sử dụng tài sản (ROA, ROI) vẫn ở mức rất tích cực đối với nhà đầu tư.

4.4.16 So sánh và nhận xét mối quan hệ giữa chi phí hoạt động và lợi nhuận sau thuế

Phân tích mối quan hệ giữa Chi phí hoạt động (chi_phi_hoat_dong) và Lợi nhuận sau thuế (loi_nhuan_sau_thue), nhằm đánh giá hiệu quả kiểm soát chi phí và khả năng chuyển hóa doanh thu thành lợi nhuận thực.

1. chuonghai$nam <- as.numeric(chuonghai$nam)
2. library(ggplot2)
3. library(ggrepel)
4. ggplot(chuonghai, aes(x = chi_phi_hoat_dong / 1e12, y = loi_nhuan_sau_thue / 1e12)) +
5.   geom_point(aes(size = nam, color = nam), alpha = 0.8) +
6.   geom_smooth(method = "lm", se = TRUE, color = "#1B9E77", linetype = "dashed") +
7.   geom_text_repel(aes(label = nam), size = 3.2, color = "black", fontface = "bold") +
8.   scale_color_viridis_c(option = "C", direction = -1) +
9.   labs(
10.     title = "Mối quan hệ giữa Chi phí hoạt động và LNST của VCB",
11.     subtitle = "Phân tích khả năng kiểm soát chi phí và hiệu quả sinh lời",
12.     x = "Chi phí hoạt động (Nghìn tỷ đồng)",
13.     y = "Lợi nhuận sau thuế (Nghìn tỷ đồng)",
14.     color = "Năm", size = "Năm"
15.   ) +
16.   theme_minimal(base_size = 11) +
17.   theme(
18.     plot.title = element_text(face = "bold", color = "#1B9E77", size = 13),
19.     axis.title = element_text(face = "bold"),
20.     legend.position = "right"
21.   )

Giải thích kỹ thuật

geom_smooth(method = "lm"): vẽ đường hồi quy tuyến tính thể hiện mối quan hệ giữa hai biến.

geom_text_repel() (từ thư viện ggrepel): gắn nhãn năm cho từng điểm và tự động tránh chồng chữ.

scale_color_viridis_c(): dùng bảng màu hiện đại, dễ phân biệt và thân thiện khi in ấn.

theme_minimal(): giúp biểu đồ gọn gàng, nhấn mạnh vào nội dung dữ liệu.

Nhận xét

Biểu đồ cho thấy mối quan hệ tuyến tính chặt chẽ giữa chi phí hoạt động và lợi nhuận sau thuế của Vietcombank giai đoạn 2015–2024 — chi phí càng cao thì lợi nhuận cũng tăng tương ứng, phản ánh hiệu quả mở rộng quy mô hoạt động.

Từ 2020 trở đi, các điểm dịch chuyển lên trên rõ rệt, cho thấy ngân hàng kiểm soát chi phí tốt hơn nhưng vẫn gia tăng mạnh lợi nhuận, thể hiện năng lực sinh lời bền vững và hiệu quả chi phí cải thiện qua thời gian.

1. library(ggplot2)
2. library(dplyr)
3. library(reshape2)
4. chuonghai$nam <- as.numeric(chuonghai$nam)
5. # Chuẩn bị dữ liệu
6. data_cp_loi <- chuonghai %>%
7.   select(nam, chi_phi_hoat_dong, loi_nhuan_sau_thue) %>%
8.   mutate(across(c(chi_phi_hoat_dong, loi_nhuan_sau_thue), ~ . / 1e12)) %>%  # đổi sang nghìn tỷ đồng
9.   melt(id.vars = "nam")
10. # Vẽ biểu đồ cột
11. ggplot(data_cp_loi, aes(x = as.factor(nam), y = value, fill = variable)) +
12.   geom_col(position = position_dodge(width = 0.8), width = 0.7) +
13.   geom_text(aes(label = round(value, 1)), 
14.             position = position_dodge(width = 0.8), 
15.             vjust = -0.5, size = 3.2, fontface = "bold") +
16.   scale_fill_manual(values = c("chi_phi_hoat_dong" = "#FCA311", 
17.                                "loi_nhuan_sau_thue" = "#1B9E77"),
18.                     labels = c("Chi phí hoạt động", "Lợi nhuận sau thuế")) +
19.   labs(
20.     title = "So sánh Chi phí hoạt động và Lợi nhuận sau thuế của VCB ",
21.     subtitle = " (Đơn vị: Nghìn tỷ đồng)",
22.     x = "Năm",
23.     y = "Giá trị (Nghìn tỷ đồng)",
24.     fill = "Chỉ tiêu"
25.   ) +
26.   theme_minimal(base_size = 11) +
27.   theme(
28.     plot.title = element_text(face = "bold", color = "#1B9E77", size = 13),
29.     axis.title = element_text(face = "bold"),
30.     legend.title = element_text(face = "bold"),
31.     legend.position = "right"
32.   )

Giải thích kỹ thuật

Dữ liệu được chuẩn hóa về nghìn tỷ đồng (/1e12) và chuyển sang dạng dài bằng melt() để vẽ nhiều biến cùng lúc.

geom_col() tạo biểu đồ cột ghép đôi giúp so sánh trực tiếp hai chỉ tiêu theo từng năm.

geom_text() thêm nhãn giá trị lên mỗi cột, làm tròn 1 chữ số để dễ đọc.

scale_fill_manual() tùy chỉnh màu sắc và tên hiển thị cho từng biến.

theme_minimal() và theme() dùng để làm biểu đồ rõ, chuyên nghiệp, nhấn mạnh nội dung dữ liệu.

Nhận xét

1. Quan sát từ biểu đồ cột

Cả chi phí hoạt động và lợi nhuận sau thuế đều tăng mạnh qua các năm 2015–2024, cho thấy quy mô hoạt động của Vietcombank ngày càng mở rộng.

Mặc dù chi phí hoạt động tăng liên tục (từ khoảng 8 nghìn tỷ năm 2015 lên hơn 23 nghìn tỷ năm 2024), lợi nhuận sau thuế vẫn tăng nhanh hơn (từ 5,3 nghìn tỷ lên 33,9 nghìn tỷ). → Điều này phản ánh ngân hàng kiểm soát chi phí hiệu quả, đảm bảo tăng trưởng lợi nhuận bền vững.

2. Quan sát từ biểu đồ phân tán (scatter)

Biểu đồ cho thấy mối quan hệ tuyến tính dương rõ ràng giữa hai biến: khi chi phí hoạt động tăng, lợi nhuận sau thuế cũng tăng.

Đường hồi quy tuyến tính có độ dốc cao, chứng tỏ hiệu quả chuyển hóa chi phí thành lợi nhuận tốt – mỗi mức tăng chi phí hoạt động đều đi kèm với mức tăng tương ứng của lợi nhuận.

Giai đoạn 2021–2024, các điểm dữ liệu nằm ở vùng cao của biểu đồ, biểu thị doanh nghiệp mở rộng quy mô nhưng vẫn duy trì hiệu suất sinh lời ổn định.

Tổng kết

→ Có mối quan hệ tỷ lệ thuận giữa chi phí hoạt động và lợi nhuận sau thuế.

Điều này chứng minh Vietcombank sử dụng chi phí một cách hiệu quả, tăng chi để đầu tư cho mở rộng hoạt động nhưng vẫn nâng cao lợi nhuận, cho thấy hiệu quả quản trị tài chính và năng lực sinh lời vượt trội.

4.4.17 So sánh thu nhập hoạt động & chi phí hoạt động

1. library(ggplot2)
2. library(dplyr)
3. library(reshape2)
4. # Chuẩn bị dữ liệu
5. data_thunhap_chiphi <- chuonghai %>%
6.   select(nam, tong_thu_nhap_hoat_dong, chi_phi_hoat_dong) %>%
7.   mutate(across(c(tong_thu_nhap_hoat_dong, chi_phi_hoat_dong), ~ . / 1e12)) %>%
8.   melt(id.vars = "nam")
9. # Vẽ biểu đồ
10. ggplot(data_thunhap_chiphi, aes(x = as.factor(nam), y = value, fill = variable)) +
11.   geom_col(position = position_dodge(width = 0.75), width = 0.65) +
12.   geom_text(aes(label = round(value, 1)), 
13.             position = position_dodge(width = 0.75),
14.             vjust = -0.5, size = 3, fontface = "bold") +
15.   scale_fill_manual(values = c("tong_thu_nhap_hoat_dong" = "#1B9E77",
16.                                "chi_phi_hoat_dong" = "#E63946"),
17.                     labels = c("Tổng thu nhập hoạt động", "Chi phí hoạt động")) +
18.   labs(
19.     title = "So sánh Tổng thu nhập và Chi phí hoạt động",
20.     subtitle = "Phản ánh hiệu quả quản lý chi phí và \n  khả năng tạo lợi nhuận từ hoạt động kinh doanh",
21.     x = "Năm",
22.     y = "Giá trị (Nghìn tỷ đồng)",
23.     fill = "Chỉ tiêu"
24.   ) +
25.   theme_minimal(base_size = 11) +
26.   theme(
27.     plot.title = element_text(face = "bold", color = "#1B9E77", size = 13),
28.     axis.title = element_text(face = "bold"),
29.     legend.title = element_text(face = "bold"),
30.     legend.position = "right"
31.   )

Giải thích kỹ thuật

mutate(... / 1e12) đổi đơn vị sang nghìn tỷ đồng để dễ đọc.

melt() giúp gom hai cột (thu nhập & chi phí) thành dạng “dài” để ggplot có thể so sánh song song.

geom_col(position = "dodge") vẽ hai cột cạnh nhau theo từng năm.

geom_text() hiển thị giá trị cụ thể trên cột để dễ đối chiếu.

scale_fill_manual() định màu rõ ràng:

Xanh lá = Tổng thu nhập

Đỏ = Chi phí hoạt động

Nhận xét

Biểu đồ cho thấy tổng thu nhập hoạt động của Vietcombank tăng mạnh và ổn định qua các năm, trong khi chi phí hoạt động cũng tăng nhưng với tốc độ chậm hơn.

Từ năm 2020 trở đi, khoảng cách giữa hai cột ngày càng mở rộng — chứng tỏ ngân hàng kiểm soát chi phí hiệu quả hơn, đồng thời nâng cao khả năng tạo lợi nhuận từ hoạt động kinh doanh chính.

Điều này phản ánh mức độ hiệu quả và bền vững trong hoạt động vận hành của Vietcombank giai đoạn 2015–2024.

4.4.18 So sánh tổng tài sản và vốn chủ sở hữu

1. ggplot(chuonghai, aes(x = nam)) +
2.   geom_line(aes(y = tong_tai_san / 1e12, color = "Tổng tài sản"), size = 1.4) +
3.   geom_point(aes(y = tong_tai_san / 1e12, color = "Tổng tài sản"), size = 3) +
4.   geom_line(aes(y = von_chu_so_huu / 1e12, color = "Vốn chủ sở hữu"), size = 1.4, linetype = "dashed") +
5.   geom_point(aes(y = von_chu_so_huu / 1e12, color = "Vốn chủ sở hữu"), size = 3, shape = 17) +
6.   labs(
7.     title = "Xu hướng Tổng tài sản và Vốn chủ sở hữu",
8.     subtitle = "Đơn vị: Nghìn tỷ đồng",
9.     x = "Năm", y = "Giá trị (nghìn tỷ đồng)", color = "Chỉ tiêu"
10.   ) +
11.   scale_color_manual(values = c("Tổng tài sản" = "#1B9E77", "Vốn chủ sở hữu" = "#7570B3")) +
12.   scale_x_continuous(breaks = unique(chuonghai$nam), labels = as.integer(unique(chuonghai$nam))) +
13.   geom_text(aes(y = tong_tai_san / 1e12, label = round(tong_tai_san / 1e12, 1)),
14.             vjust = -1, color = "#1B9E77", size = 3.5) +
15.   geom_text(aes(y = von_chu_so_huu / 1e12, label = round(von_chu_so_huu / 1e12, 1)),
16.             vjust = -1, color = "#7570B3", size = 3.5) +
17.   theme_minimal(base_size = 13) +
18.   theme(
19.     plot.title = element_text(face = "bold", color = "#1B9E77", size = 14),
20.     axis.title = element_text(face = "bold"),
21.     legend.position = "top"
22.   )

Giải thích kỹ thuật

(1) ggplot(chuonghai, aes(x = nam)) Tạo biểu đồ với trục x là năm.

geom_line & geom_point Vẽ đường xu hướng và điểm cho tổng tài sản và vốn chủ sở hữu.

labs(...) Đặt tiêu đề, nhãn trục và chú giải.

scale_color_manual(...) Gán màu thủ công cho từng chỉ tiêu.

scale_x_continuous(...) Hiển thị năm dạng số nguyên, không có .0.

geom_text(...) Ghi giá trị thực tế lên mỗi điểm dữ liệu.

theme_minimal() + theme(...) Dùng giao diện tối giản, in đậm tiêu đề, chú giải trên cùng.

Nhận xét

Biểu đồ cho thấy quá trình tăng trưởng mạnh mẽ và ổn định của Vietcombank trong giai đoạn 2015–2024. Tổng tài sản tăng từ 674,4 nghìn tỷ đồng (2015) lên 2.085,9 nghìn tỷ đồng (2024) - gấp hơn 3 lần, thể hiện quy mô mở rộng liên tục.

Vốn chủ sở hữu cũng tăng từ 45,2 lên 196,2 nghìn tỷ đồng, gấp hơn 4 lần, phản ánh khả năng tích lũy lợi nhuận và tăng vốn tự có ổn định.

Khoảng cách giữa hai đường ngày càng giãn rộng, cho thấy tốc độ tăng tổng tài sản nhanh hơn vốn tự có, phù hợp với mô hình đòn bẩy tài chính của ngân hàng thương mại.

Dù vậy, cả hai chỉ tiêu đều tăng đều, không có biến động giảm, chứng tỏ Vietcombank duy trì được cơ cấu tài chính an toàn, hiệu quả sử dụng vốn cao.

Kết luận: Vietcombank thể hiện sức khỏe tài chính vững vàng, vừa mở rộng quy mô tài sản, vừa duy trì tăng trưởng vốn chủ ổn định, phản ánh hiệu quả quản trị và nền tảng tài chính bền vững trong suốt giai đoạn 2015–2024.