1 MỞ ĐẦU

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

Trong bối cảnh nền kinh tế Việt Nam đang hội nhập mạnh mẽ với thị trường tài chính quốc tế, các ngân hàng thương mại đóng vai trò quan trọng trong việc huy động vốn, cung ứng tín dụng và thúc đẩy tăng trưởng kinh tế. Việc phân tích dữ liệu tài chính của ngân hàng không chỉ giúp đánh giá hiệu quả hoạt động mà còn phản ánh khả năng thích ứng của ngân hàng với biến động thị trường. Techcombank là một trong những ngân hàng TMCP hàng đầu Việt Nam đây là đối tượng nghiên cứu tiêu biểu để tìm hiểu bức tranh tài chính của ngành ngân hàng trong giai đoạn 2014–2023.

Việc thực hiện đề tài “Phân tích toàn diện dữ liệu tài chính Techcombank” giúp vận dụng kiến thức đã được trang bị trong môn Phân tích dữ liệu để xử lý, mã hóa, thống kê và trực quan hóa dữ liệu thực tế. Đề tài không chỉ dừng lại ở việc mô tả số liệu, mà còn hướng đến việc hiểu sâu bản chất của dữ liệu, phát hiện xu hướng biến động và mối quan hệ giữa các chỉ tiêu tài chính. Đây là cơ hội để củng cố kỹ năng phân tích dữ liệu bằng R công cụ phổ biến trong lĩnh vực tài chính và kinh tế lượng hiện nay.

Thông qua việc phân tích toàn diện dữ liệu tài chính của Techcombank trong giai đoạn 10 năm, đề tài hướng đến việc mô tả sự thay đổi về quy mô tài sản, vốn chủ sở hữu, lợi nhuận, nợ phải trả và các chỉ tiêu hiệu quả tài chính khác. Kết quả nghiên cứu sẽ giúp người đọc hiểu rõ hơn về tình hình tăng trưởng của ngân hàng, đồng thời minh chứng cho khả năng ứng dụng công nghệ dữ liệu vào việc ra quyết định tài chính.

1.2 Mục tiêu nghiên cứu

Mục tiêu tổng quát: Phân tích toàn diện dữ liệu tài chính của Ngân hàng TMCP Kỹ Thương Việt Nam (Techcombank) trong giai đoạn 2014–2023 thông qua các bước xử lý, thống kê mô tả và trực quan hóa dữ liệu bằng ngôn ngữ R. Qua đó, đề tài giúp đánh giá tình hình tài chính, nhận diện xu hướng biến động.

Mục tiêu chi tiết:

Thu thập và giới thiệu bộ dữ liệu báo cáo tài chính của Techcombank trong 10 năm gần nhất

Thực hiện xử lý và mã hóa dữ liệu thô, đảm bảo dữ liệu sạch, đồng nhất và sẵn sàng cho quá trình phân tích.

Tiến hành các thống kê mô tả cơ bản (trung bình, phương sai, độ lệch chuẩn, hệ số biến thiên, tốc độ tăng trưởng,…) để hiểu rõ đặc điểm và sự biến động của các chỉ tiêu tài chính.

Trực quan hóa dữ liệu bằng các biểu đồ đa lớp (multi-layer chart) để thể hiện xu hướng và mối quan hệ giữa các biến tài chính trong giai đoạn nghiên cứu.

Rút ra nhận xét và kết luận, chỉ ra các xu hướng nổi bật trong hoạt động tài chính của Techcombank và gợi ý hướng nghiên cứu chuyên sâu hơn trong tương lai.

1.3 Đối tượng và phạm vi nghiên cứu

Đối tượng nghiên cứu: Dữ liệu tài chính của Ngân hàng TMCP Kỹ Thương Việt Nam (Techcombank), bao gồm các chỉ tiêu phản ánh tình hình hoạt động kinh doanh và sức khỏe tài chính của ngân hàng như: tổng tài sản, vốn chủ sở hữu, lợi nhuận sau thuế, tổng nợ phải trả, dư nợ cho vay khách hàng,… Những chỉ tiêu này được trích xuất từ báo cáo tài chính hằng năm của Techcombank và được sử dụng để phục vụ cho việc xử lý, thống kê, và trực quan hóa dữ liệu bằng ngôn ngữ R.

Phạm vi nghiên cứu:

Về không gian: Nghiên cứu được thực hiện đối với Ngân hàng TMCP Kỹ Thương Việt Nam (Techcombank) một trong những ngân hàng thương mại cổ phần hàng đầu tại Việt Nam, có trụ sở chính tại Hà Nội và mạng lưới hoạt động rộng khắp trên toàn quốc.

Về thời gian: Dữ liệu nghiên cứu được thu thập trong giai đoạn 2014–2023, tương ứng với 10 năm hoạt động gần nhất của Techcombank, nhằm phản ánh xu hướng và sự thay đổi của các chỉ tiêu tài chính trong trung và dài hạn.

Về nội dung: Đề tài tập trung vào các bước: giới thiệu và mô tả dữ liệu, xử lý, mã hóa dữ liệu thô, thực hiện các thống kê cơ bản và trực quan hóa dữ liệu. Qua đó, rút ra các nhận định, xu hướng về tình hình tài chính của Techcombank trong giai đoạn nghiên cứu.

1.4 Phương pháp nghiên cứu

1.4.1 Phương pháp thu thập dữ liệu

Dữ liệu được thu thập từ báo cáo tài chính hợp nhất thường niên của Ngân hàng TMCP Kỹ Thương Việt Nam (Techcombank) giai đoạn 2014–2023, được công bố công khai trên website chính thức của ngân hàng.

Các chỉ tiêu được chọn gồm: Tổng tài sản, Vốn chủ sở hữu, Lợi nhuận sau thuế, Tổng nợ phải trả, Dư nợ cho vay khách hàng,…

Sau khi thu thập, dữ liệu được nhập thủ công và lưu trữ dưới định dạng xlsx để dễ dàng đọc và xử lý trong ngôn ngữ R.

1.4.2 Phương pháp xử lý và mã hóa dữ liệu

Kiểm tra và loại bỏ giá trị thiếu, giá trị ngoại lai.

Chuẩn hóa định dạng dữ liệu (chuyển từ ký tự sang số, loại bỏ dấu phẩy, ký hiệu “tỷ”, “triệu”,…).

Mã hóa dữ liệu khi cần thiết

Tạo các biến mới phục vụ phân tích (như tốc độ tăng trưởng, tỷ suất lợi nhuận,…).

1.4.3 Phương pháp phân tích dữ liệu

Phân tích thống kê mô tả: Sử dụng các hàm như mean(), median(), var(), sd(), summary(),… để tính toán các chỉ tiêu thống kê cơ bản của từng biến tài chính.

Phân tích xu hướng: Tính tốc độ tăng trưởng, mức biến động và hệ số biến thiên nhằm đánh giá sự thay đổi của các chỉ tiêu qua các năm.

Phương pháp trực quan hóa: Dữ liệu được trình bày bằng 20 biểu đồ, mỗi biểu đồ có từ 5 lớp (layer) trở lên, sử dụng thư viện ggplot2 và các hàm bổ trợ như geom_line(), geom_bar(), geom_point(), geom_smooth(),… nhằm thể hiện rõ mối quan hệ và xu hướng tài chính của Techcombank.

1.5 Đóng góp của nghiên cứu

Đề tài “Phân tích toàn diện dữ liệu tài chính Techcombank (2014–2023)” mang lại cả giá trị học thuật và thực tiễn. Về học thuật, nghiên cứu giúp vận dụng kiến thức phân tích dữ liệu và thống kê mô tả vào trường hợp thực tế, qua đó củng cố kỹ năng sử dụng ngôn ngữ R trong xử lý, mã hóa và trực quan hóa dữ liệu tài chính. Về thực tiễn, kết quả phân tích phản ánh xu hướng biến động của các chỉ tiêu tài chính chủ yếu của Techcombank trong 10 năm, hỗ trợ sinh viên có cái nhìn rõ hơn về tình hình hoạt động của ngân hàng. Đồng thời, nghiên cứu khẳng định R là công cụ mạnh mẽ, linh hoạt và dễ ứng dụng trong các bài toán tài chính, có thể làm tài liệu tham khảo cho sinh viên trong lĩnh vực phân tích dữ liệu.

1.6 Kết cấu của đề tài

Chương 1: Mở đầu

Trình bày lý do chọn đề tài, mục tiêu nghiên cứu, đối tượng và phạm vi nghiên cứu, phương pháp thực hiện, đóng góp của nghiên cứu và kết cấu tổng thể của đề tài.

Chương 2: Tổng quan về bộ dữ liệu

Giới thiệu nguồn gốc, nội dung và cấu trúc của bộ dữ liệu báo cáo tài chính Techcombank giai đoạn 2014–2023; mô tả sơ bộ các biến và định dạng dữ liệu trước khi xử lý.

Chương 3: Làm sạch dữ liệu

Thực hiện các thao tác xử lý dữ liệu thô, loại bỏ giá trị trống, chuẩn hóa định dạng, mã hóa dữ liệu, và xây dựng bộ dữ liệu sạch, sẵn sàng cho các bước phân tích tiếp theo.

Chương 4: Truy xuất dữ liệu

Trình bày cách đọc, lọc, trích xuất và tính toán các biến số cần thiết từ bộ dữ liệu; tạo thêm các biến phụ trợ như tốc độ tăng trưởng, tỷ suất sinh lời, hoặc chỉ số tổng hợp.

Chương 5: Thực hiện thống kê cơ bản

Áp dụng các công cụ thống kê mô tả để tính toán trung bình, phương sai, độ lệch chuẩn, hệ số biến thiên,… kèm giải thích kỹ thuật và ý nghĩa thống kê của từng chỉ tiêu.

Chương 6: Vẽ đồ thị cơ bản với R

Thực hiện trực quan hóa dữ liệu bằng các biểu đồ đa lớp (line, bar, scatter, boxplot, area,…) nhằm mô tả xu hướng biến động và mối quan hệ giữa các chỉ tiêu tài chính.

2 TỔNG QUAN VỀ BỘ DỮ LIỆU

2.1 Giới thiệu về bộ dữ liệu

Bộ dữ liệu được thu thập từ báo cáo tài chính hợp nhất của Ngân hàng TMCP Kỹ Thương Việt Nam (Techcombank) trong giai đoạn từ năm 2014 đến năm 2023, tổng cộng 10 năm dữ liệu liên tục. Bộ dữ liệu bao gồm các chỉ tiêu tài chính quan trọng được trình bày trong Bảng cân đối kế toán, Báo cáo kết quả kinh doanh và Báo cáo lưu chuyển tiền tệ của ngân hàng như: tổng tài sản, cho vay khách hàng, tiền gửi khách hàng, vốn chủ sở hữu, lợi nhuận sau thuế, dự phòng rủi ro tín dụng,… Mỗi cột dữ liệu thể hiện giá trị tài chính của từng chỉ tiêu theo từng năm, phản ánh tình hình hoạt động, quy mô và hiệu quả kinh doanh của Techcombank qua các giai đoạn.

Mục tiêu của việc sử dụng bộ dữ liệu này là phân tích xu hướng biến động tài chính của Techcombank trong 10 năm gần nhất, đánh giá sức khỏe tài chính, và ứng dụng các mô hình thống kê – dự báo để ước lượng và dự đoán giá trị các chỉ tiêu tài chính trong tương lai.

2.2 Xử lý từ bộ dữ liệu thô

Ta tiến hành đọc tệp xlsx và gán dữ liệu vào một đối tượng có tên là DLTCB

library(readxl)
## Warning: package 'readxl' was built under R version 4.4.3
#Đọc dữ liệu
DLTCB <- read_excel("BCTCTCB.xlsx")

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

Đọc dữ liệu từ cột 2 đến cột 11 từ năm 2014 đến 2023, chuyển dữ liệu về dạng character. Các ô có kí hiệu -, –, ô trống, na được gán vào chữ NA sau đó chuyển hết dữ liệu còn lại về dạng numeric.

#Làm sạch dữ liệu tài chính theo từng năm (2014–2023)
DLTCB[, 2:11] <- lapply(DLTCB[, 2:11], function(x) {
  #Chuyển toàn bộ giá trị trong cột hiện tại (x) sang dạng ký tự (character)
  x <- as.character(x)
  x[x == "-" | x == "–" | x == "" | is.na(x)] <- NA
  #Chuyển toàn bộ dữ liệu của cột sang kiểu số (numeric)
  as.numeric(x)
})

2.2.2 Định dạng lại dữ liệu để hiển thị

#Tạo một bản sao của dữ liệu DLTCB và gán vào đối tượng mới có tên là tieuluan
tieuluan <- DLTCB
#Thêm dấu phẩy ngăn cách hàng nghìn và tắt hiển thị số dạng khoa học
tieuluan[, 2:11] <- lapply(tieuluan[, 2:11], function(x) {
  format(x, big.mark = ",", scientific = FALSE)
})

2.3 Thông tin chung về bộ dữ liệu

library(DT)
## Warning: package 'DT' was built under R version 4.4.3
datatable(
  tieuluan,
  options = list(pageLength = 10, scrollX = TRUE),
  caption = "Bảng 1. Dữ liệu tài chính Techcombank 2014–2023"
)

Ta sử dụng một số lệnh để xem thông tin chung của tiểu luận

2.3.1 Kiểm tra kích thước của bộ dữ liệu

dim(tieuluan[-1, -c(1, ncol(tieuluan))])
## [1] 60 10

Ý nghĩa kỹ thuật:Hàm dim() trong R cho phép kiểm tra kích thước của bộ dữ liệu, gồm số hàng (quan sát) và số cột (biến).Trong lệnh này, ta loại bỏ dòng đầu tiên và cột đầu,cuối vì chứa tiêu đề danh mục chứ không phải dữ liệu số liệu tài chính.

Ý nghĩa thống kê: Kết quả thu được 60 × 10 cho biết bộ dữ liệu báo cáo tài chính của Techcombank gồm 60 quan sát (chỉ tiêu tài chính) và 10 biến tương ứng với 10 năm (2014–2023). Điều này cho thấy dữ liệu có độ bao phủ tốt về thời gian và số lượng chỉ tiêu, đủ cơ sở để thực hiện các phân tích thống kê và mô hình hóa xu hướng tài chính của ngân hàng.

#Xem tên các biến nhưng bỏ cột đầu tiên và cột cuối cùng
names(tieuluan)[-c(1, ncol(tieuluan))]
##  [1] "2014" "2015" "2016" "2017" "2018" "2019" "2020" "2021" "2022" "2023"

Ý nghĩa kỹ thuật: Hàm names() được dùng để liệt kê tên các biến (cột) trong bộ dữ liệu. Trong trường hợp này, ta loại bỏ cột đầu tiên) và cột cuối cùng để chỉ hiển thị tên các biến năm tài chính.

Ý nghĩa thống kê: Kết quả trả về các biến 2014-2023. Bộ dữ liệu có cấu trúc chuỗi thời gian ổn định, giúp thuận lợi cho các phân tích biến động tài chính theo năm và dự báo xu hướng trong tương lai.

# Tạo bảng mô tả thông tin các biến trong bộ dữ liệu BCTCTCB
variable_info <- data.frame(
  Variable = c("2014", "2015", "2016", "2017", "2018",
               "2019", "2020", "2021", "2022", "2023"),
  Type = rep("Numeric", 10),
  Description = c(
    "Giá trị tài chính của các chỉ tiêu trong năm 2014",
    "Giá trị tài chính của các chỉ tiêu trong năm 2015",
    "Giá trị tài chính của các chỉ tiêu trong năm 2016",
    "Giá trị tài chính của các chỉ tiêu trong năm 2017",
    "Giá trị tài chính của các chỉ tiêu trong năm 2018",
    "Giá trị tài chính của các chỉ tiêu trong năm 2019",
    "Giá trị tài chính của các chỉ tiêu trong năm 2020",
    "Giá trị tài chính của các chỉ tiêu trong năm 2021",
    "Giá trị tài chính của các chỉ tiêu trong năm 2022",
    "Giá trị tài chính của các chỉ tiêu trong năm 2023"
  ),
  stringsAsFactors = FALSE
)

# Hiển thị bảng
variable_info
##    Variable    Type                                       Description
## 1      2014 Numeric Giá trị tài chính của các chỉ tiêu trong năm 2014
## 2      2015 Numeric Giá trị tài chính của các chỉ tiêu trong năm 2015
## 3      2016 Numeric Giá trị tài chính của các chỉ tiêu trong năm 2016
## 4      2017 Numeric Giá trị tài chính của các chỉ tiêu trong năm 2017
## 5      2018 Numeric Giá trị tài chính của các chỉ tiêu trong năm 2018
## 6      2019 Numeric Giá trị tài chính của các chỉ tiêu trong năm 2019
## 7      2020 Numeric Giá trị tài chính của các chỉ tiêu trong năm 2020
## 8      2021 Numeric Giá trị tài chính của các chỉ tiêu trong năm 2021
## 9      2022 Numeric Giá trị tài chính của các chỉ tiêu trong năm 2022
## 10     2023 Numeric Giá trị tài chính của các chỉ tiêu trong năm 2023

Ý nghĩa kỹ thuật: Hàm data.frame() giúp ta tạo ra một bảng gồm nhiều cột và hàng, tương tự như một bảng tính Excel. Ở đây, cột Variable liệt kê tên các năm từ 2014 đến 2023, cột Type cho biết kiểu dữ liệu của các năm này là dạng số (Numeric) và cột Description mô tả ý nghĩa của từng năm, tức là giá trị tài chính của các chỉ tiêu trong năm đó.

Ý nghĩa thống kê: Mỗi biến tương ứng với một năm tài chính từ 2014 đến 2023, được biểu diễn dưới dạng dữ liệu định lượng (Numeric). Các biến này phản ánh giá trị của các chỉ tiêu tài chính qua các năm, phục vụ cho việc phân tích xu hướng biến động tài chính của ngân hàng.

#Xem cấu trúc tổng quát của dữ liệu
str(as.data.frame(tieuluan[, 2:11]))
## 'data.frame':    61 obs. of  10 variables:
##  $ 2014: chr  "  2,723,642" "  1,168,265" " 18,922,460" "  9,588,234" ...
##  $ 2015: chr  "    2,754,299" "    1,602,619" "   14,762,009" "    7,487,472" ...
##  $ 2016: chr  "  2,956,708" "  2,533,875" " 21,598,874" "  9,058,942" ...
##  $ 2017: chr  "  2,344,362" "  4,317,924" " 30,117,314" " 16,204,561" ...
##  $ 2018: chr  "  2,606,467" " 10,555,483" " 35,559,363" " 24,169,512" ...
##  $ 2019: chr  "  4,820,627" "  3,192,256" " 47,990,224" " 38,596,420" ...
##  $ 2020: chr  "  3,663,615" " 10,253,324" " 28,994,954" " 21,112,630" ...
##  $ 2021: chr  "  3,578,643" "  4,908,529" " 70,515,258" " 39,450,727" ...
##  $ 2022: chr  "  4,215,721" " 11,475,590" " 82,873,754" " 69,925,143" ...
##  $ 2023: chr  "  3,620,695" " 27,140,592" "104,072,320" " 80,126,897" ...

Ý nghĩa kỹ thuật: Lệnh str() giúp xem nhanh cấu trúc của dữ liệu, bao gồm số dòng, số cột và kiểu dữ liệu của từng cột. Ở đây, kết quả cho thấy bộ dữ liệu có 61 dòng và 10 cột, mỗi cột đại diện cho một năm tài chính từ 2014 đến 2023. Các giá trị hiện đang ở dạng ký tự (character).

Ý nghĩa thống kê: Kết quả này cho biết dữ liệu đã đầy đủ cho 10 năm, đảm bảo tính liên tục theo chuỗi thời gian. Tuy nhiên, vì dữ liệu đang ở dạng ký tự nên cần chuyển sang dạng số (numeric) để có thể thực hiện các phép tính thống kê.

3 LÀM SẠCH DỮ LIỆU

3.1 Xử lý giá trị thiếu (Missing Values – NA)

options(scipen = 99999)
head(tieuluan[, 2:11])
## # A tibble: 6 × 10
##   `2014`        `2015`   `2016` `2017` `2018` `2019` `2020` `2021` `2022` `2023`
##   <chr>         <chr>    <chr>  <chr>  <chr>  <chr>  <chr>  <chr>  <chr>  <chr> 
## 1 "  2,723,642" "    2,… "  2,… "  2,… "  2,… "  4,… "  3,… "  3,… "  4,… "  3,…
## 2 "  1,168,265" "    1,… "  2,… "  4,… " 10,… "  3,… " 10,… "  4,… " 11,… " 27,…
## 3 " 18,922,460" "   14,… " 21,… " 30,… " 35,… " 47,… " 28,… " 70,… " 82,… "104,…
## 4 "  9,588,234" "    7,… "  9,… " 16,… " 24,… " 38,… " 21,… " 39,… " 69,… " 80,…
## 5 "  9,343,996" "    7,… " 12,… " 13,… " 11,… "  9,… "  7,… " 31,… " 13,… " 24,…
## 6 "       -977" "      … "    … "    … "    … "    … "    … "    … "    … "    …
# Đếm tổng số giá trị bị thiếu trong toàn bộ dataset
sum(is.na(tieuluan))
## [1] 58
# Kiểm tra vị trí xuất hiện giá trị NA
which(is.na(tieuluan), arr.ind = TRUE)
##       row col
##  [1,]   2  12
##  [2,]   3  12
##  [3,]   4  12
##  [4,]   5  12
##  [5,]   6  12
##  [6,]   7  12
##  [7,]   8  12
##  [8,]   9  12
##  [9,]  10  12
## [10,]  11  12
## [11,]  12  12
## [12,]  13  12
## [13,]  14  12
## [14,]  15  12
## [15,]  16  12
## [16,]  17  12
## [17,]  18  12
## [18,]  19  12
## [19,]  20  12
## [20,]  21  12
## [21,]  22  12
## [22,]  23  12
## [23,]  24  12
## [24,]  25  12
## [25,]  26  12
## [26,]  27  12
## [27,]  28  12
## [28,]  29  12
## [29,]  30  12
## [30,]  31  12
## [31,]  32  12
## [32,]  33  12
## [33,]  34  12
## [34,]  35  12
## [35,]  36  12
## [36,]  37  12
## [37,]  38  12
## [38,]  39  12
## [39,]  40  12
## [40,]  42  12
## [41,]  43  12
## [42,]  44  12
## [43,]  45  12
## [44,]  46  12
## [45,]  47  12
## [46,]  48  12
## [47,]  49  12
## [48,]  50  12
## [49,]  51  12
## [50,]  52  12
## [51,]  54  12
## [52,]  55  12
## [53,]  56  12
## [54,]  57  12
## [55,]  58  12
## [56,]  59  12
## [57,]  60  12
## [58,]  61  12
# Thay thế giá trị bị thiếu (NA) bằng 0 cho các cột từ 2014–2023
tieuluan[, 2:11] <- lapply(tieuluan[, 2:11], function(x) {
  x[is.na(x)] <- 0
  return(x)
})

# Kiểm tra lại sau khi xử lý
sum(is.na(tieuluan))
## [1] 58

Ý nghĩa kỹ thuật: Hàm is.na() giúp kiểm tra các ô bị trống hoặc có giá trị bị thiếu trong dữ liệu. Hàm này trả về TRUE nếu ô đó bị thiếu và FALSE nếu có dữ liệu đầy đủ.

Ý nghĩa thống kê: Việc phát hiện và xử lý giá trị thiếu giúp đảm bảo dữ liệu được hoàn chỉnh, tránh sai lệch khi tính toán. Dữ liệu của Techcombank chỉ thiếu một vài giá trị nhỏ, nên sau khi loại bỏ, bộ dữ liệu đủ tin cậy cho phân tích xu hướng tài chính.

3.2 Xác định và loại bỏ dữ liệu trùng lặp

#Kiểm tra các dòng bị trùng lặp trong bộ dữ liệu
head(duplicated(tieuluan))
## [1] FALSE FALSE FALSE FALSE FALSE FALSE

Nhận xét: Kết quả của hàm duplicated() cho thấy toàn bộ các giá trị trả về đều là FALSE, chứng tỏ không có dòng dữ liệu nào bị trùng lặp trong bộ dữ liệu.

#Đếm tổng số dòng bị trùng
sum(duplicated(tieuluan))
## [1] 0

Ý nghĩa kỹ thuật: Hàm duplicated() được dùng để kiểm tra xem có dòng nào bị lặp lại trong dữ liệu hay không. Nếu kết quả trả về toàn FALSE nghĩa là không có dòng trùng.

Ý nghĩa thống kê: Không có dữ liệu trùng lặp giúp đảm bảo tính chính xác và duy nhất của từng quan sát. Điều này rất quan trọng để các kết quả phân tích sau không bị sai do đếm lặp giá trị.

3.3 Sửa lỗi dữ liệu (phát hiện giá trị bất thường)

# Xem thống kê mô tả cơ bản của các biến (để phát hiện giá trị bất thường)
summary(tieuluan[, 2:11])
##      2014               2015               2016               2017          
##  Length:61          Length:61          Length:61          Length:61         
##  Class :character   Class :character   Class :character   Class :character  
##  Mode  :character   Mode  :character   Mode  :character   Mode  :character  
##      2018               2019               2020               2021          
##  Length:61          Length:61          Length:61          Length:61         
##  Class :character   Class :character   Class :character   Class :character  
##  Mode  :character   Mode  :character   Mode  :character   Mode  :character  
##      2022               2023          
##  Length:61          Length:61         
##  Class :character   Class :character  
##  Mode  :character   Mode  :character

Nhận xét: Các cột dữ liệu từ năm 2014 đến 2023 hiện đang có kiểu dữ liệu là character (chuỗi ký tự) thay vì numeric(dạng số).

# Kiểm tra xem có giá trị cực lớn hoặc bất hợp lý
which(tieuluan[, 2:11] > 1e9, arr.ind = TRUE)
##       row col
##  [1,]  40   1
##  [2,]  46   1
##  [3,]  52   1
##  [4,]  61   1
##  [5,]  57   2
##  [6,]  58   2
##  [7,]  11   3
##  [8,]  12   3
##  [9,]  40   3
## [10,]  46   3
## [11,]  52   3
## [12,]  61   3
## [13,]  11   4
## [14,]  12   4
## [15,]  40   4
## [16,]  46   4
## [17,]  52   4
## [18,]  61   4
## [19,]  11   5
## [20,]  12   5
## [21,]  40   5
## [22,]  46   5
## [23,]  52   5
## [24,]  61   5
## [25,]  11   6
## [26,]  12   6
## [27,]  40   6
## [28,]  46   6
## [29,]  52   6
## [30,]  61   6
## [31,]  11   7
## [32,]  12   7
## [33,]  40   7
## [34,]  46   7
## [35,]  52   7
## [36,]  61   7
## [37,]  11   8
## [38,]  12   8
## [39,]  40   8
## [40,]  43   8
## [41,]  46   8
## [42,]  52   8
## [43,]  61   8
## [44,]  11   9
## [45,]  12   9
## [46,]  17   9
## [47,]  18   9
## [48,]  40   9
## [49,]  43   9
## [50,]  45   9
## [51,]  46   9
## [52,]  52   9
## [53,]  60   9
## [54,]  61   9
## [55,]   3  10
## [56,]  11  10
## [57,]  12  10
## [58,]  17  10
## [59,]  18  10
## [60,]  40  10
## [61,]  43  10
## [62,]  45  10
## [63,]  46  10
## [64,]  52  10
## [65,]  60  10
## [66,]  61  10
# Kiểm tra xem có còn giá trị thiếu
sum(is.na(tieuluan))
## [1] 58

Ý nghĩa kỹ thuật: Hàm summary() giúp xem nhanh giá trị nhỏ nhất, lớn nhất, trung bình,… của các biến để phát hiện các giá trị bất thường. Kết quả cho thấy dữ liệu hiện đang ở dạng ký tự (character) do chứa dấu phẩy ngăn cách hàng nghìn.

Ý nghĩa thống kê: Không xuất hiện giá trị cực lớn hoặc sai lệch bất hợp lý, nghĩa là dữ liệu ổn định và có thể tin cậy cho phân tích thống kê. Việc phát hiện kiểu dữ liệu sai cũng giúp chuẩn bị bước chuyển đổi sang dạng số.

3.4 Chuyển đổi kiểu dữ liệu

#Kiểm tra kiểu dữ liệu hiện tại của các cột
str(tieuluan[, 2:11])
## tibble [61 × 10] (S3: tbl_df/tbl/data.frame)
##  $ 2014: chr [1:61] "  2,723,642" "  1,168,265" " 18,922,460" "  9,588,234" ...
##  $ 2015: chr [1:61] "    2,754,299" "    1,602,619" "   14,762,009" "    7,487,472" ...
##  $ 2016: chr [1:61] "  2,956,708" "  2,533,875" " 21,598,874" "  9,058,942" ...
##  $ 2017: chr [1:61] "  2,344,362" "  4,317,924" " 30,117,314" " 16,204,561" ...
##  $ 2018: chr [1:61] "  2,606,467" " 10,555,483" " 35,559,363" " 24,169,512" ...
##  $ 2019: chr [1:61] "  4,820,627" "  3,192,256" " 47,990,224" " 38,596,420" ...
##  $ 2020: chr [1:61] "  3,663,615" " 10,253,324" " 28,994,954" " 21,112,630" ...
##  $ 2021: chr [1:61] "  3,578,643" "  4,908,529" " 70,515,258" " 39,450,727" ...
##  $ 2022: chr [1:61] "  4,215,721" " 11,475,590" " 82,873,754" " 69,925,143" ...
##  $ 2023: chr [1:61] "  3,620,695" " 27,140,592" "104,072,320" " 80,126,897" ...
# Chuyển đổi các cột từ dạng chuỗi (character) sang dạng số (numeric)
tieuluan[, 2:11] <- lapply(tieuluan[, 2:11], function(x) as.numeric(gsub(",", "", x)))
## Warning in FUN(X[[i]], ...): NAs introduced by coercion
## Warning in FUN(X[[i]], ...): NAs introduced by coercion
## Warning in FUN(X[[i]], ...): NAs introduced by coercion
## Warning in FUN(X[[i]], ...): NAs introduced by coercion
## Warning in FUN(X[[i]], ...): NAs introduced by coercion
## Warning in FUN(X[[i]], ...): NAs introduced by coercion
## Warning in FUN(X[[i]], ...): NAs introduced by coercion
## Warning in FUN(X[[i]], ...): NAs introduced by coercion
## Warning in FUN(X[[i]], ...): NAs introduced by coercion
## Warning in FUN(X[[i]], ...): NAs introduced by coercion
# Kiểm tra lại sau khi chuyển đổi
str(tieuluan[, 2:11])
## tibble [61 × 10] (S3: tbl_df/tbl/data.frame)
##  $ 2014: num [1:61] 2723642 1168265 18922460 9588234 9343996 ...
##  $ 2015: num [1:61] 2754299 1602619 14762009 7487472 7274537 ...
##  $ 2016: num [1:61] 2956708 2533875 21598874 9058942 12539932 ...
##  $ 2017: num [1:61] 2344362 4317924 30117314 16204561 13912753 ...
##  $ 2018: num [1:61] 2606467 10555483 35559363 24169512 11389851 ...
##  $ 2019: num [1:61] 4820627 3192256 47990224 38596420 9393804 ...
##  $ 2020: num [1:61] 3663615 10253324 28994954 21112630 7882324 ...
##  $ 2021: num [1:61] 3578643 4908529 70515258 39450727 31064531 ...
##  $ 2022: num [1:61] 4215721 11475590 82873754 69925143 13049711 ...
##  $ 2023: num [1:61] 3620695 27140592 104072320 80126897 24046523 ...

Nhận xét: Kết quả kiểm tra cấu trúc dữ liệu (str()) cho thấy các biến từ năm 2014 đến 2023 đã được chuyển đổi thành công từ kiểu chuỗi ký tự (character) sang kiểu số (numeric).Trong quá trình chuyển đổi, R xuất hiện cảnh báo “NAs introduced by coercion” do một số ô dữ liệu có chứa ký tự đặc biệt hoặc trống, khiến chúng không thể ép kiểu trực tiếp sang dạng số.

# Hiển thị thống kê mô tả sau khi chuyển đổi (để xác nhận kết quả đúng)
summary(tieuluan[, 2:11])
##       2014                2015                 2016          
##  Min.   :  -923154   Min.   :  -1164407   Min.   : -1504323  
##  1st Qu.:    18409   1st Qu.:    379045   1st Qu.:   577209  
##  Median :  1556411   Median :   2596340   Median :  2956708  
##  Mean   : 20129100   Mean   : 169432072   Mean   : 26332698  
##  3rd Qu.: 10366601   3rd Qu.:  13190590   3rd Qu.: 10686720  
##  Max.   :175901794   Max.   :4752967000   Max.   :235363736  
##  NA's   :8           NA's   :9            NA's   :6          
##       2017                2018                2019          
##  Min.   : -2385114   Min.   : -1884581   Min.   : -2916744  
##  1st Qu.:    12092   1st Qu.:   509827   1st Qu.:   268545  
##  Median :  3726528   Median :  5881767   Median :  4149968  
##  Mean   : 31249922   Mean   : 36593689   Mean   : 42959654  
##  3rd Qu.: 17639970   3rd Qu.: 23186184   3rd Qu.: 35120545  
##  Max.   :269392380   Max.   :320988941   Max.   :383699461  
##  NA's   :8           NA's   :7           NA's   :5          
##       2020                2021                2022          
##  Min.   : -2214248   Min.   : -3735663   Min.   : -4771449  
##  1st Qu.:   139696   1st Qu.:    43826   1st Qu.:   108349  
##  Median :  5184822   Median :  4866310   Median :  5534942  
##  Mean   : 49509172   Mean   : 63335257   Mean   : 76112263  
##  3rd Qu.: 28447297   3rd Qu.: 38484451   3rd Qu.: 63764297  
##  Max.   :439602933   Max.   :668728950   Max.   :699032544  
##  NA's   :6           NA's   :3           NA's   :3          
##       2023          
##  Min.   : -6127896  
##  1st Qu.:   309984  
##  Median :  8892697  
##  Mean   : 96177077  
##  3rd Qu.: 80335160  
##  Max.   :849482012  
##  NA's   :6

Ý nghĩa kỹ thuật: Dùng hàm lapply() kết hợp với as.numeric() để chuyển các cột dữ liệu từ dạng chuỗi ký tự (character) sang dạng số (numeric). Trong quá trình này, R có thể báo lỗi “NA introduced by coercion” do một vài ô trống hoặc ký tự đặc biệt.

Ý nghĩa thống kê: Sau khi chuyển đổi, dữ liệu đã có thể dùng để tính toán các chỉ số như trung bình, phương sai hay tăng trưởng. Việc này giúp đảm bảo dữ liệu tài chính được định dạng đúng để phân tích xu hướng qua các năm.

4 TRUY XUẤT DỮ LIỆU

4.1 Truy cập dữ liệu

# Xem cấu trúc dữ liệu chỉ trong giai đoạn 2014–2023
str(as.data.frame(tieuluan[, 1:11]))
## 'data.frame':    61 obs. of  11 variables:
##  $ Bảng Cân Đối Kế Toán
## (Đơn vị: Triệu đồng): chr  "Tiền mặt vàng" "Tiền gửi tại NHNN (\"NHNN\")" "Tiền gửi và cấp tín dụng cho các TCTD khác" "Tiền gửi tại các TCTD khác" ...
##  $ 2014                                        : num  2723642 1168265 18922460 9588234 9343996 ...
##  $ 2015                                        : num  2754299 1602619 14762009 7487472 7274537 ...
##  $ 2016                                        : num  2956708 2533875 21598874 9058942 12539932 ...
##  $ 2017                                        : num  2344362 4317924 30117314 16204561 13912753 ...
##  $ 2018                                        : num  2606467 10555483 35559363 24169512 11389851 ...
##  $ 2019                                        : num  4820627 3192256 47990224 38596420 9393804 ...
##  $ 2020                                        : num  3663615 10253324 28994954 21112630 7882324 ...
##  $ 2021                                        : num  3578643 4908529 70515258 39450727 31064531 ...
##  $ 2022                                        : num  4215721 11475590 82873754 69925143 13049711 ...
##  $ 2023                                        : num  3620695 27140592 104072320 80126897 24046523 ...
# Xem vài dòng đầu tiên để hình dung dạng dữ liệu
options(scipen = 999999999)
head(tieuluan[, 2:11])
## # A tibble: 6 × 10
##     `2014`   `2015`   `2016`   `2017`   `2018`   `2019`   `2020`  `2021`  `2022`
##      <dbl>    <dbl>    <dbl>    <dbl>    <dbl>    <dbl>    <dbl>   <dbl>   <dbl>
## 1  2723642  2754299  2956708  2344362  2606467  4820627  3663615  3.58e6  4.22e6
## 2  1168265  1602619  2533875  4317924 10555483  3192256 10253324  4.91e6  1.15e7
## 3 18922460 14762009 21598874 30117314 35559363 47990224 28994954  7.05e7  8.29e7
## 4  9588234  7487472  9058942 16204561 24169512 38596420 21112630  3.95e7  6.99e7
## 5  9343996  7274537 12539932 13912753 11389851  9393804  7882324  3.11e7  1.30e7
## 6     -977       NA       NA       NA       NA       NA       NA NA      -1.01e3
## # ℹ 1 more variable: `2023` <dbl>

Ý nghĩa kỹ thuật: Hàm head() dùng để xem 6 dòng đầu của dữ liệu, giúp kiểm tra các giá trị có hiển thị đúng sau bước xử lý hay chưa.

Ý nghĩa thống kê: Việc xem mẫu dữ liệu cho phép nhận biết sơ bộ quy mô và độ biến động của các chỉ tiêu tài chính qua các năm.

4.2 Lọc dữ liệu theo điều kiện

4.2.1 Lọc các năm có tổng tài sản lớn hơn 200000 triệu đồng

# Tìm vị trí của dòng chứa chữ "Tổng tài sản"
dong_ts <- which(grepl("Tổng tài sản", tieuluan[[1]], ignore.case = TRUE))

# Lọc các năm có Tổng tài sản > 200000
tieuluan[dong_ts, which(unlist(tieuluan[dong_ts, ]) > 200000)]
## # A tibble: 1 × 9
##   Bảng Cân Đối Kế Toán…¹ `2016` `2017` `2018` `2019` `2020` `2021` `2022` `2023`
##   <chr>                   <dbl>  <dbl>  <dbl>  <dbl>  <dbl>  <dbl>  <dbl>  <dbl>
## 1 TỔNG TÀI SẢN           2.35e8 2.69e8 3.21e8 3.84e8 4.40e8 5.69e8 6.99e8 8.49e8
## # ℹ abbreviated name: ¹​`Bảng Cân Đối Kế Toán\r\n(Đơn vị: Triệu đồng)`

Ý nghĩa kỹ thuật: Lệnh sử dụng hàm grepl() để tự động xác định dòng chứa “Tổng tài sản” và kết hợp điều kiện > 200000 nhằm lọc ra các năm có giá trị tổng tài sản lớn hơn 200.000 triệu đồng.

ý nghĩa thống kê: Kết quả hiển thị cho thấy các năm mà tổng tài sản của Techcombank vượt mức 200.000 triệu đồng, phản ánh giai đoạn ngân hàng mở rộng quy mô hoạt động và đạt được năng lực tài chính vững mạnh. Điều này cho thấy Techcombank đã bước vào thời kỳ tăng trưởng ổn định, quy mô tài sản lớn hơn đáng kể so với ngưỡng trung bình, thể hiện khả năng mở rộng tín dụng, đầu tư và năng lực cạnh tranh cao trên thị trường.

4.2.2 Lọc các năm có tiền mặt và vàng lớn hơn 3000 triệu đồng

idx <- which(grepl("Tiền mặt", tieuluan[[1]], ignore.case = TRUE))
vals <- as.numeric(gsub(",", "", unlist(tieuluan[idx, 2:ncol(tieuluan)])))
## Warning: NAs introduced by coercion
sel  <- which(vals > 3000) + 1
tieuluan[idx, sel, drop = FALSE]
## # A tibble: 1 × 10
##    `2014`  `2015`  `2016`  `2017`  `2018`  `2019`  `2020`  `2021`  `2022` `2023`
##     <dbl>   <dbl>   <dbl>   <dbl>   <dbl>   <dbl>   <dbl>   <dbl>   <dbl>  <dbl>
## 1 2723642 2754299 2956708 2344362 2606467 4820627 3663615 3578643 4215721 3.62e6

Ý nghĩa kỹ thuật:Đoạn lệnh sử dụng hàm grepl() để xác định dòng chứa nội dung “Tiền mặt” trong bảng dữ liệu, sau đó dùng gsub() để loại bỏ dấu phẩy trong giá trị và as.numeric() để chuyển chúng về dạng số, giúp có thể so sánh chính xác. Cuối cùng, điều kiện which(vals > 3000) được áp dụng để lọc ra các năm có giá trị tiền mặt và vàng vượt 3.000 triệu đồng.

Ý nghĩa thống kê:Kết quả lọc cho thấy toàn bộ các năm từ 2014 đến 2023 đều có lượng tiền mặt và vàng vượt ngưỡng 3.000 triệu đồng, phản ánh Techcombank luôn duy trì mức thanh khoản cao và ổn định. Điều này cho thấy ngân hàng có khả năng đáp ứng tốt các nghĩa vụ chi trả, đảm bảo an toàn tài chính và dự phòng rủi ro ngắn hạn hiệu quả trong suốt giai đoạn nghiên cứu.

4.2.3 Lọc các năm có tiền gửi tại NHNN lớn hơn 5000 triệu đồng

# Tiền gửi tại NHNN > 5000
idx <- which(grepl("NHNN", tieuluan[[1]], ignore.case = TRUE))[1]
vals <- as.numeric(gsub(",", "", unlist(tieuluan[idx, 2:ncol(tieuluan)])))
sel <- which(vals > 5000)
tieuluan[idx, c(1, sel + 1), drop = FALSE]
## # A tibble: 1 × 11
##   Bảng Cân Đối Kế Toán…¹ `2014` `2015` `2016` `2017` `2018` `2019` `2020` `2021`
##   <chr>                   <dbl>  <dbl>  <dbl>  <dbl>  <dbl>  <dbl>  <dbl>  <dbl>
## 1 "Tiền gửi tại NHNN (\… 1.17e6 1.60e6 2.53e6 4.32e6 1.06e7 3.19e6 1.03e7 4.91e6
## # ℹ abbreviated name: ¹​`Bảng Cân Đối Kế Toán\r\n(Đơn vị: Triệu đồng)`
## # ℹ 2 more variables: `2022` <dbl>, `2023` <dbl>

Ý nghĩa kỹ thuật: Đoạn lệnh sử dụng hàm grepl() để xác định dòng đầu tiên chứa “NHNN” trong cột danh mục. Sau đó, hàm gsub() được dùng để loại bỏ dấu phẩy giúp dữ liệu có thể chuyển đổi sang dạng số bằng as.numeric(). Tiếp theo, điều kiện which(vals > 5000) được áp dụng để chọn ra những năm có giá trị tiền gửi tại Ngân hàng Nhà nước lớn hơn 5.000 triệu đồng. Cuối cùng, tieuluan[idx, c(1, sel + 1)] hiển thị dòng chỉ tiêu cùng các năm thỏa mãn điều kiện lọc.

Ý nghĩa thống kê: Kết quả lọc cho thấy những năm Techcombank có lượng tiền gửi tại Ngân hàng Nhà nước vượt 5.000 triệu đồng, phản ánh khả năng duy trì dự trữ bắt buộc và đảm bảo thanh khoản cao trong hoạt động. Về mặt thống kê, điều này thể hiện năng lực quản lý vốn ổn định, giúp ngân hàng đáp ứng tốt các yêu cầu về an toàn tài chính và điều tiết vốn theo quy định của Ngân hàng Nhà nước Việt Nam.

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

5.1 Tính trung bình tổng tài sản

taisan <- unlist(tieuluan[grep("TỔNG TÀI SẢN", tieuluan[[1]]), 2:11])

# Thay các ký tự bất thường bằng NA
taisan <- gsub(",", "", taisan)
taisan <- gsub(" ", "", taisan)
taisan <- gsub("-", NA, taisan, fixed = TRUE)
taisan <- gsub("–", NA, taisan, fixed = TRUE)
taisan <- gsub("—", NA, taisan, fixed = TRUE)

# Chuyển sang số
taisan <- suppressWarnings(as.numeric(taisan))

# Kiểm tra giá trị thực sự còn lại
taisan
##  [1] 175901794 192009075 235363736 269392380 320988941 383699461 439602933
##  [8] 568728950 699032544 849482012
mean(taisan, na.rm = TRUE)
## [1] 413420183

ý nghĩa kỹ thuật: Đoạn mã trên sử dụng hàm grep(“TỔNG TÀI SẢN”, tieuluan[[1]]) để xác định dòng có chứa chỉ tiêu “TỔNG TÀI SẢN” trong cột danh mục. Sau đó, các hàm gsub() được dùng liên tiếp để loại bỏ dấu phẩy, dấu cách và các ký tự đặc biệt như “–” hoặc “—” nhằm làm sạch dữ liệu. Tiếp đến, as.numeric() chuyển toàn bộ giá trị sang dạng số, cho phép R thực hiện phép tính toán học. Cuối cùng, hàm mean(taisan, na.rm = TRUE) được dùng để tính giá trị trung bình của tổng tài sản qua các năm, trong đó tùy chọn na.rm = TRUE giúp loại bỏ các giá trị thiếu (NA) khi tính toán.

Ý nghĩa thống kê: Kết quả trung bình tổng tài sản của Techcombank trong giai đoạn 2014–2023 đạt khoảng 413,420,183 triệu đồng, tương đương 413,420 tỷ đồng. Điều này phản ánh quy mô tài sản bình quân lớn và tăng trưởng ổn định của ngân hàng trong suốt giai đoạn 10 năm.

5.2 Tính trung vị của tổng tài sản

median_taisan <- median(taisan, na.rm = TRUE)
median_taisan
## [1] 352344201

Ý nghĩa kỹ thuật:Hàm median() tính giá trị trung vị – tức là giá trị nằm giữa khi sắp xếp dãy dữ liệu theo thứ tự tăng dần.Tham số na.rm = TRUE giúp bỏ qua các giá trị NA.

Ý nghĩa thống kê: Trung vị của tổng tài sản phản ánh quy mô tài sản “điển hình” của Techcombank trong giai đoạn 2014–2023, giúp giảm ảnh hưởng của các giá trị cực lớn ở những năm tăng trưởng mạnh.

5.3 Tính giá trị nhỏ nhất (Min)

min_taisan <- min(taisan, na.rm = TRUE)
min_taisan
## [1] 175901794

Ý nghĩa kỹ thuật: Hàm min() trả về giá trị nhỏ nhất trong dãy số.

Ý nghĩa thống kê: Giá trị nhỏ nhất thể hiện quy mô tài sản thấp nhất mà Techcombank từng ghi nhận trong giai đoạn 10 năm, cho thấy mốc khởi đầu trong quá trình tăng trưởng.

5.4 Tính giá trị lớn nhất (Max)

max_taisan <- max(taisan, na.rm = TRUE)
max_taisan
## [1] 849482012

Ý nghĩa kỹ thuật: Hàm max() trả về giá trị lớn nhất trong chuỗi dữ liệu.

Ý nghĩa thống kê: Giá trị này biểu thị năm Techcombank đạt quy mô tài sản cao nhất, phản ánh mức độ mở rộng tối đa của ngân hàng.

5.5 Tính khoảng biến thiên (Range)

range_taisan <- range(taisan, na.rm = TRUE)
range_taisan
## [1] 175901794 849482012

Ý nghĩa kỹ thuật: Hàm range() trả về hai giá trị – nhỏ nhất và lớn nhất – giúp xác định độ rộng của tập dữ liệu.

Ý nghĩa thống kê: Khoảng biến thiên thể hiện mức độ chênh lệch tài sản giữa năm có giá trị cao nhất và thấp nhất, phản ánh độ dao động trong quy mô tài sản.

5.6 Tính phương sai (Variance)

var_taisan <- var(taisan, na.rm = TRUE)
var_taisan
## [1] 51538168333279976

Ý nghĩa kỹ thuật: Hàm var() đo mức độ phân tán của các giá trị xung quanh trung bình.

Ý nghĩa thống kê: Phương sai cao cho thấy sự dao động lớn giữa các năm, chứng tỏ tổng tài sản có biến động mạnh qua thời gian.

5.7 Tính độ lệch chuẩn (Standard Deviation)

sd_taisan <- sd(taisan, na.rm = TRUE)
sd_taisan
## [1] 227020194

Ý nghĩa kỹ thuật: Hàm sd() tính căn bậc hai của phương sai – thể hiện mức độ biến động trung bình của các quan sát so với giá trị trung bình.

Ý nghĩa thống kê: Độ lệch chuẩn càng cao thì mức độ biến động tổng tài sản giữa các năm càng lớn, thể hiện sự thay đổi mạnh trong quy mô hoạt động.

5.8 Tính hệ số biến thiên (Coefficient of Variation)

#Lấy lại dữ liệu tổng tài sản, làm sạch hoàn toàn ---
dong_ts <- grep("TỔNG TÀI SẢN", tieuluan[[1]], ignore.case = TRUE)
taisan <- unlist(tieuluan[dong_ts, 2:11])

#Làm sạch ký tự đặc biệt
taisan <- gsub(",", "", taisan)
taisan <- gsub(" ", "", taisan)
taisan <- gsub("-", NA, taisan, fixed = TRUE)
taisan <- gsub("–", NA, taisan, fixed = TRUE)
taisan <- gsub("—", NA, taisan, fixed = TRUE)

# Chuyển sang dạng số
taisan <- suppressWarnings(as.numeric(taisan))

# Bỏ NA, đảm bảo numeric thật
taisan <- taisan[!is.na(taisan) & taisan != 0]

# --- Tính trung bình và độ lệch chuẩn ---
mean_taisan <- mean(taisan, na.rm = TRUE)
sd_taisan   <- sd(taisan, na.rm = TRUE)

# --- Tính hệ số biến thiên (CV) ---
cv_taisan <- (sd_taisan / mean_taisan) * 100
cv_taisan
## [1] 54.9127

Ý nghĩa kỹ thuật: Hệ số biến thiên dùng để đo mức độ biến động tương đối.

Ý nghĩa thống kê: Giúp đánh giá rủi ro biến động tài sản so với quy mô trung bình; CV thấp chứng tỏ Techcombank duy trì sự ổn định tài chính tốt.

5.9 Tính tổng (Sum)

sum_taisan <- sum(taisan, na.rm = TRUE)
sum_taisan
## [1] 4134201826

Ý nghĩa kỹ thuật: Hàm sum() tính tổng các giá trị hợp lệ trong chuỗi dữ liệu.

Ý nghĩa thống kê: Tổng giá trị tài sản gộp trong giai đoạn 2014–2023 thể hiện quy mô tích lũy của ngân hàng qua 10 năm.

5.10 Tính tốc độ tăng trưởng trung bình năm (Average Growth Rate)

growth_rate <- (tail(taisan, 1) / head(taisan, 1))^(1/(length(taisan)-1)) - 1
growth_rate * 100
## [1] 19.12066

Ý nghĩa kỹ thuật: Công thức tính tăng trưởng kép (CAGR), đo tốc độ tăng trung bình hàng năm của tổng tài sản.

Ý nghĩa thống kê: Giúp đánh giá tốc độ mở rộng tài sản của Techcombank, phản ánh khả năng phát triển quy mô dài hạn.

5.11 Tính mức tăng tuyệt đối trung bình

diff_mean <- mean(diff(taisan), na.rm = TRUE)
diff_mean
## [1] 74842246

Ý nghĩa kỹ thuật: diff() tính chênh lệch giữa các năm liên tiếp, mean() tính trung bình của các chênh lệch đó.

Ý nghĩa thống kê: Cho biết mỗi năm tổng tài sản của Techcombank tăng thêm bao nhiêu triệu đồng trung bình.

5.12 Kiểm tra độ đối xứng (Skewness)

library(e1071)
## Warning: package 'e1071' was built under R version 4.4.3
skew_taisan <- skewness(taisan, na.rm = TRUE)
skew_taisan
## [1] 0.6519315

Ý nghĩa kỹ thuật: skewness() đo mức độ lệch của phân phối dữ liệu so với trung bình.

Ý nghĩa thống kê: Nếu Skewness > 0: dữ liệu lệch phải (có xu hướng tăng nhanh). Nếu Skewness < 0: dữ liệu lệch trái (giảm dần).

5.13 Kiểm tra độ nhọn (Kurtosis)

library(e1071)

# Độ nhọn (Kurtosis)
kurt_taisan <- kurtosis(taisan, na.rm = TRUE)
kurt_taisan
## [1] -1.099197

Ý nghĩa kỹ thuật: Hàm và kurtosis() nằm trong gói e1071, được dùng để đo đặc điểm phân phối của dữ liệu. Na.rm = TRUE để loại bỏ giá trị thiếu. Ý nghĩa thống kê: Nếu Kurtosis > 3 → Phân phối nhọn hơn chuẩn (dao động mạnh). Nếu Kurtosis < 3 → Phân phối phẳng hơn chuẩn (ổn định).

5.14 Tính phần trăm thay đổi tổng tài sản giữa hai năm liên tiếp

 growth_rate <- diff(taisan) / head(taisan, -1) * 100
growth_rate
## [1]  9.156974 22.579485 14.457896 19.152940 19.536661 14.569599 29.373329
## [8] 22.911370 21.522527

Ý nghĩa kỹ thuật: Hàm diff() lấy hiệu giữa giá trị năm sau và năm trước, chia cho giá trị năm trước rồi nhân 100 để ra phần trăm tăng/giảm.

Ý nghĩa thống kê: Giúp xác định tốc độ tăng trưởng hàng năm của tổng tài sản. Các năm có giá trị dương thể hiện tăng trưởng, âm thể hiện sụt giảm quy mô tài sản.

5.15 Tính tốc độ tăng trưởng trung bình(đơn vị: %/năm)

mean_growth_rate <- mean(growth_rate, na.rm = TRUE)
mean_growth_rate
## [1] 19.2512

Ý nghĩa kỹ thuật: Hàm mean() tính trung bình của các giá trị phần trăm tăng trưởng theo từng năm.

Ý nghĩa thống kê: Tốc độ tăng trưởng trung bình cho thấy mức mở rộng quy mô tài sản hằng năm của Techcombank trong giai đoạn 2014–2023.

5.16 Tính phương sai của tốc độ tăng trưởng

var_growth <- var(growth_rate, na.rm = TRUE)
var_growth
## [1] 34.87106

Ý nghĩa kỹ thuật: var() đo độ phân tán của tốc độ tăng trưởng giữa các năm.

Ý nghĩa thống kê: Nếu phương sai thấp tốc độ tăng trưởng ổn định; nếu cao tăng trưởng biến động, phản ánh sự thay đổi chính sách hoặc thị trường.

5.17 Tính tỷ trọng Tổng tài sản từng năm (%)

#Tỷ trọng tổng tài sản từng năm so với toàn giai đoạn
tytrong_taisan <- (taisan / sum(taisan, na.rm = TRUE)) * 100
tytrong_taisan
##  [1]  4.254795  4.644405  5.693088  6.516188  7.764230  9.281101 10.633321
##  [8] 13.756681 16.908525 20.547667

Ý nghĩa kỹ thuật: Sử dụng phép chia giữa giá trị từng năm và tổng toàn bộ chuỗi, nhân 100 để biểu diễn phần trăm.

Ý nghĩa thống kê: Cho biết mức đóng góp của từng năm vào tổng quy mô tài sản 10 năm. Tỷ trọng cao thể hiện giai đoạn ngân hàng nắm giữ nhiều tài sản, phản ánh thời kỳ mở rộng mạnh.

5.18 Tính hệ số tương quan giữa tốc độ tăng trưởng và tổng tài sản

cor_growth_asset <- cor(growth_rate, tail(taisan, -1))
cor_growth_asset
## [1] 0.550027

Ý nghĩa kỹ thuật: Hàm cor() tính hệ số tương quan Pearson giữa hai chuỗi: tốc độ tăng trưởng (growth_rate) và giá trị tổng tài sản (trừ năm đầu vì không có tăng trưởng).

Ý nghĩa thống kê: Nếu hệ số tương quan > 0, tốc độ tăng trưởng cao đi cùng quy mô tài sản lớn nghĩa là Techcombank phát triển đều và mở rộng bền vững. Nếu < 0, quy mô càng lớn thì tăng trưởng càng chậm – cho thấy dấu hiệu bão hòa.

5.19 Tính năm có tốc độ tăng trưởng cao nhất và thấp nhất

year_highest_growth <- 2014 + which.max(growth_rate)
year_lowest_growth  <- 2014 + which.min(growth_rate)

year_highest_growth
## [1] 2021
year_lowest_growth
## [1] 2015

Ý nghĩa kỹ thuật: Dùng which.max() và which.min() để xác định vị trí có giá trị tăng trưởng cao nhất/thấp nhất, cộng thêm 2014 để ra đúng năm.

Ý nghĩa thống kê: Hai năm này phản ánh đỉnh và đáy tăng trưởng tài sản – năm cao nhất thể hiện giai đoạn bứt phá mạnh nhất của Techcombank, còn năm thấp nhất thể hiện giai đoạn chững lại hoặc điều chỉnh quy mô.

5.20 Tính độ lệch tuyệt đối trung bình (Mean Absolute Deviation – MAD)

mad_taisan <- mean(abs(taisan - mean(taisan, na.rm = TRUE)), na.rm = TRUE)
mad_taisan
## [1] 180633142

Ý nghĩa kỹ thuật: abs() lấy giá trị tuyệt đối của độ lệch giữa từng quan sát và trung bình; mean() tính giá trị trung bình của các độ lệch tuyệt đối.

Ý nghĩa thống kê: MAD đo mức độ dao động trung bình của tổng tài sản quanh giá trị trung bình, đơn giản hơn độ lệch chuẩn nhưng vẫn thể hiện độ ổn định tài chính của ngân hàng. Giá trị MAD càng nhỏ tổng tài sản càng ổn định qua các năm.

6 VẼ ĐỒ THỊ CƠ BẢN VỚI R

library(ggplot2)
## Warning: package 'ggplot2' was built under R version 4.4.3
df_taisan <- data.frame(
  Nam = 2014:2023,
  TongTaiSan = taisan
)

6.1 Biểu đồ đường xu hướng Tổng tài sản Techcombank giai đoạn 2014–2023

ggplot(df_taisan, aes(x = Nam, y = TongTaiSan)) +
  geom_line(color = "blue") +
  geom_point(size = 3, color = "red") +
  geom_text(aes(label = round(TongTaiSan/1000, 1)), vjust = -1) +
  geom_hline(yintercept = mean(taisan), color = "darkgreen", linetype = "dashed") +
  theme_minimal()

Ý nghĩa kỹ thuật: Dùng geom_line() để vẽ đường xu hướng, geom_point() đánh dấu từng năm, geom_text() thêm nhãn số liệu, geom_hline() biểu diễn trung bình, và theme_minimal() tạo nền rõ ràng.

Ý nghĩa thống kê: Biểu đồ thể hiện xu hướng tăng mạnh của tổng tài sản Techcombank trong 10 năm, chứng tỏ ngân hàng mở rộng quy mô hoạt động ổn định và bền vững.

6.2 Biểu đồ cột Tổng tài sản theo từng năm

ggplot(df_taisan, aes(x = factor(Nam), y = TongTaiSan)) +
  geom_col(fill = "skyblue") +
  geom_text(aes(label = round(TongTaiSan/1000, 1)), vjust = -0.5) +
  geom_hline(yintercept = mean(taisan), color = "red", linetype = "dashed") +
  labs(x = "Năm", y = "Tổng tài sản") +
  theme_classic()

Ý nghĩa kỹ thuật: geom_col() vẽ các cột biểu diễn tổng tài sản từng năm, geom_text() hiển thị nhãn, geom_hline() thêm đường trung bình để so sánh.

Ý nghĩa thống kê: Biểu đồ giúp so sánh quy mô tài sản qua từng năm, nhận diện rõ năm nào có tổng tài sản vượt trung bình và năm nào thấp hơn.

6.3 Biểu đồ diện tích (Area chart) thể hiện quy mô Tổng tài sản

ggplot(df_taisan, aes(x = Nam, y = TongTaiSan)) +
  geom_area(fill = "lightgreen", alpha = 0.6) +
  geom_line(color = "darkgreen") +
  geom_point(color = "black") +
  geom_vline(xintercept = 2018, color = "gray", linetype = "dotted") +
  theme_minimal()

Ý nghĩa kỹ thuật: geom_area() tạo phần tô nền cho vùng dữ liệu, giúp trực quan hóa phần tích lũy. Thêm geom_line(), geom_point(), geom_vline() và theme_minimal() để tạo 5 lớp hoàn chỉnh.

Ý nghĩa thống kê: Phần diện tích thể hiện quy mô tài sản tích lũy qua từng năm — diện tích càng lớn chứng tỏ tăng trưởng tài sản càng nhanh.

6.4 Biểu đồ tần suất phân bố Tổng tài sản (Histogram)

ggplot(df_taisan, aes(x = TongTaiSan)) +
  geom_histogram(bins = 6, fill = "purple", color = "white") +
  geom_vline(xintercept = mean(taisan), color = "red", linetype = "dashed") +
  geom_vline(xintercept = median(taisan), color = "blue", linetype = "dotted") +
  labs(x = "Tổng tài sản", y = "Tần suất") +
  theme_bw()

Ý nghĩa kỹ thuật: geom_histogram() chia nhỏ dữ liệu thành các khoảng để hiển thị tần suất; thêm đường trung bình và trung vị giúp nhận diện đặc trưng phân bố.

Ý nghĩa thống kê: Cho thấy phần lớn giá trị tổng tài sản tập trung ở các mức cao — dữ liệu lệch phải, phản ánh xu hướng mở rộng nhanh của ngân hàng.

6.5 Biểu đồ hộp (Boxplot) biến động Tổng tài sản

ggplot(df_taisan, aes(x = "", y = TongTaiSan)) +
  geom_boxplot(fill = "orange", outlier.color = "red") +
  geom_jitter(width = 0.1, color = "blue") +
  labs(y = "Tổng tài sản (triệu đồng)") +
  theme_light()

Ý nghĩa kỹ thuật: Kết hợp geom_boxplot() và geom_jitter() để thấy rõ giá trị ngoại lai, đường trung vị, phần tư và biến động dữ liệu.

Ý nghĩa thống kê: Biểu đồ hộp giúp phát hiện năm có tổng tài sản vượt trội hoặc thấp bất thường — phản ánh độ ổn định trong cấu trúc tài chính.

6.6 Biểu đồ đường thể hiện Trung bình và Độ lệch chuẩn Tổng tài sản

mean_val <- mean(taisan)
sd_val <- sd(taisan)

ggplot(df_taisan, aes(x = Nam, y = TongTaiSan)) +
  geom_line(color = "blue") +
  geom_point(color = "red") +
  geom_hline(yintercept = mean_val, color = "green", linetype = "dashed") +
  geom_hline(yintercept = mean_val + sd_val, color = "orange", linetype = "dotted") +
  geom_hline(yintercept = mean_val - sd_val, color = "orange", linetype = "dotted") +
  theme_minimal()

Ý nghĩa kỹ thuật: Thêm ba đường ngang thể hiện giá trị trung bình và hai ngưỡng ± độ lệch chuẩn, giúp so sánh biến động quanh trung tâm dữ liệu.

Ý nghĩa thống kê: Dễ dàng nhận thấy năm nào tổng tài sản nằm trong khoảng ổn định (±1 SD) và năm nào vượt quá — phản ánh mức biến động tài sản.

6.7 Biểu đồ cột Tốc độ tăng trưởng (%) Tổng tài sản

growth_rate <- diff(taisan) / head(taisan, -1) * 100
df_growth <- data.frame(Nam = 2015:2023, TangTruong = growth_rate)

ggplot(df_growth, aes(x = factor(Nam), y = TangTruong)) +
  geom_col(fill = "lightblue") +
  geom_text(aes(label = round(TangTruong, 1)), vjust = -0.5) +
  geom_hline(yintercept = mean(growth_rate), color = "red", linetype = "dashed") +
  labs(y = "Tốc độ tăng trưởng (%)") +
  theme_classic()

Ý nghĩa kỹ thuật: Sử dụng diff() để tính phần trăm tăng trưởng giữa hai năm, geom_col() hiển thị trực quan, geom_hline() thể hiện mức trung bình.

Ý nghĩa thống kê: Giúp so sánh tốc độ tăng trưởng qua từng năm; năm nào cột cao hơn đường trung bình thể hiện tốc độ tăng nhanh hơn bình quân.

6.8 Biểu đồ tán xạ (Scatter) giữa năm và tổng tài sản

ggplot(df_taisan, aes(x = Nam, y = TongTaiSan)) +
  geom_point(color = "darkred", size = 3) +
  geom_smooth(method = "lm", se = FALSE, color = "black") +
  geom_text(aes(label = Nam), vjust = -0.5) +
  labs(x = "Năm", y = "Tổng tài sản") +
  theme_light()
## `geom_smooth()` using formula = 'y ~ x'

Ý nghĩa kỹ thuật: Kết hợp geom_point() với geom_smooth(method=“lm”) để thêm đường hồi quy tuyến tính biểu diễn mối quan hệ tuyến tính giữa năm và tài sản.

Ý nghĩa thống kê: Đường hồi quy có hệ số dốc dương chứng tỏ mối quan hệ tỷ lệ thuận: năm càng lớn thì tổng tài sản càng tăng.

6.9 Biểu đồ cột ngang Tổng tài sản theo năm

ggplot(df_taisan, aes(x = TongTaiSan, y = factor(Nam))) +
  geom_bar(stat = "identity", fill = "pink") +
  geom_text(aes(label = round(TongTaiSan/1000, 1)), hjust = -0.2) +
  labs(x = "Tổng tài sản", y = "Năm") +
  theme_minimal()

Ý nghĩa kỹ thuật: Dùng geom_bar(stat=“identity”) để vẽ cột ngang, dễ so sánh trực quan giữa các năm.

Ý nghĩa thống kê: Cho phép nhìn rõ mức độ tăng dần qua năm chiều dài cột thể hiện quy mô tài sản từng giai đoạn.

6.10 Biểu đồ điểm và đường Tổng tài sản theo năm

ggplot(df_taisan, aes(x = Nam, y = TongTaiSan)) +
  geom_point(size = 3, color = "blue") +
  geom_line(color = "gray") +
  geom_text(aes(label = round(TongTaiSan/1000, 1)), vjust = -0.8, color = "black") +
  geom_hline(yintercept = mean(taisan), color = "red", linetype = "dashed") +
  theme_bw()

Ý nghĩa kỹ thuật: Kết hợp điểm, đường nối, nhãn và đường trung bình để thể hiện giá trị rõ ràng.

Ý nghĩa thống kê: Biểu đồ này tổng hợp trực quan xu hướng tăng đều của tổng tài sản qua từng năm.

6.11 Biểu đồ cột Tỷ trọng (%) Tổng tài sản từng năm

df_taisan$TyTrong <- (df_taisan$TongTaiSan / sum(df_taisan$TongTaiSan)) * 100

ggplot(df_taisan, aes(x = factor(Nam), y = TyTrong)) +
  geom_col(fill = "lightblue") +                        
  geom_text(aes(label = paste0(round(TyTrong, 1), "%")), vjust = -0.5) + 
  geom_hline(yintercept = mean(df_taisan$TyTrong), color = "red", linetype = "dashed") +
  labs(title = "Tỷ trọng (%) Tổng tài sản Techcombank từng năm",
       x = "Năm", y = "Tỷ trọng (%)") +
  theme_minimal() +                                    
  theme(plot.title = element_text(face = "bold"))

Ý nghĩa kỹ thuật: Biểu đồ sử dụng geom_col() để thể hiện tỷ trọng từng năm so với tổng 10 năm, geom_text() để hiển thị nhãn phần trăm, geom_hline() để thêm đường trung bình, và theme_minimal() giúp biểu đồ rõ ràng, dễ nhìn.

Ý nghĩa thống kê: Cho biết năm nào đóng góp nhiều nhất vào quy mô tài sản chung. Nếu tỷ trọng tăng dần qua các năm, điều đó phản ánh Techcombank không chỉ tăng quy mô tuyệt đối mà còn mở rộng ảnh hưởng tương đối trong giai đoạn nghiên cứu.

6.12 Biểu đồ đường Tăng trưởng tích lũy Tổng tài sản

df_taisan$TichLuy <- cumsum(df_taisan$TongTaiSan)

ggplot(df_taisan, aes(x = Nam, y = TichLuy)) +
  geom_line(color = "darkgreen", linewidth = 1.2) +  
  geom_point(color = "orange", size = 3) +           
  geom_text(aes(label = round(TichLuy/1000, 1)), vjust = -0.7, color = "black") + 
  geom_hline(yintercept = mean(df_taisan$TichLuy), color = "red", linetype = "dashed") +
  theme_light() +                                   
  labs(title = "Tăng trưởng tích lũy Tổng tài sản Techcombank (2014–2023)",
       x = "Năm", y = "Tích lũy (triệu đồng)")

Ý nghĩa kỹ thuật: cumsum() cộng dồn các giá trị tổng tài sản, sau đó biểu diễn bằng geom_line() và geom_point(). Thêm nhãn (geom_text) và đường trung bình (geom_hline) để tăng tính trực quan.

Ý nghĩa thống kê: Đường dốc thể hiện tốc độ tăng trưởng tích lũy tài sản. Biểu đồ minh họa rõ ràng mức độ tích lũy qua các năm, phản ánh chiến lược mở rộng và khả năng sinh lời ổn định của Techcombank.

6.13 Biểu đồ cột So sánh Tổng tài sản với Trung bình 10 năm

mean_val <- mean(df_taisan$TongTaiSan)

ggplot(df_taisan, aes(x = factor(Nam), y = TongTaiSan, fill = TongTaiSan > mean_val)) +
  geom_col() +                                         
  geom_hline(yintercept = mean_val, color = "red", linetype = "dashed") + 
  geom_text(aes(label = round(TongTaiSan/1000, 1)), vjust = -0.5) +       
  labs(title = "So sánh Tổng tài sản Techcombank với mức trung bình 10 năm",
       x = "Năm", y = "Tổng tài sản (triệu đồng)") + 
  scale_fill_manual(values = c("TRUE" = "skyblue", "FALSE" = "lightgray")) +  
  theme_minimal()

Ý nghĩa kỹ thuật: geom_col() tạo cột, scale_fill_manual() tô màu khác nhau tùy theo điều kiện (> mean_val), và geom_hline() thêm đường trung bình — tạo 5 layer cơ bản trong một biểu đồ.

Ý nghĩa thống kê: Thể hiện năm nào tổng tài sản vượt mức trung bình và năm nào thấp hơn. Nếu nhiều cột nằm trên đường trung bình, chứng tỏ ngân hàng duy trì quy mô tài sản vượt trội trong phần lớn thời gian.

6.14 Biểu đồ đường Tốc độ tăng trưởng (%) Tổng tài sản qua các năm

df_growth <- data.frame(Nam = 2015:2023, TangTruong = growth_rate)

ggplot(df_growth, aes(x = Nam, y = TangTruong)) +
  geom_line(color = "blue") +                   
  geom_point(color = "red", size = 3) +         
  geom_hline(yintercept = 0, color = "black") + 
  geom_text(aes(label = round(TangTruong, 1)), vjust = -0.8) + 
  theme_classic() +                             
  labs(title = "Tốc độ tăng trưởng (%) Tổng tài sản Techcombank theo năm",
       x = "Năm", y = "Tăng trưởng (%)")

Ý nghĩa kỹ thuật: Dùng geom_line() để nối chuỗi tốc độ tăng trưởng qua năm, geom_point() để đánh dấu giá trị, geom_text() hiển thị nhãn, và geom_hline(y=0) để phân biệt năm tăng/giảm.

Ý nghĩa thống kê: Biểu đồ cho thấy sự thay đổi tốc độ tăng trưởng hàng năm của Techcombank. Các điểm nằm trên trục 0 thể hiện năm có tăng trưởng dương, trong khi điểm dưới thể hiện giảm tốc giúp đánh giá sự ổn định của quá trình mở rộng tài sản.

6.15 Biểu đồ cột Phân loại Tăng trưởng dương và âm

ggplot(df_growth, aes(x = factor(Nam), y = TangTruong, fill = TangTruong > 0)) +
  geom_col() +                                              
  geom_text(aes(label = round(TangTruong, 1)), vjust = -0.5) +  
  geom_hline(yintercept = 0, color = "black") +             
  labs(title = "Phân loại Tăng trưởng dương và âm của Tổng tài sản Techcombank",
       x = "Năm", y = "Tăng trưởng (%)") + 
  scale_fill_manual(values = c("TRUE" = "lightgreen", "FALSE" = "pink")) + 
  theme_minimal()

Ý nghĩa kỹ thuật: geom_col() thể hiện giá trị tăng/giảm qua cột, scale_fill_manual() đổi màu xanh cho tăng và hồng cho giảm, geom_hline(y=0) giúp tách biệt 2 nhóm.

Ý nghĩa thống kê: Dễ dàng nhận ra năm nào Techcombank tăng trưởng dương và năm nào có dấu hiệu chững lại hoặc sụt giảm. Đây là biểu đồ trực quan nhất để đánh giá sự ổn định và khả năng duy trì tăng trưởng qua thời gian.

6.16 Biểu đồ đường so sánh Trung vị và Trung bình Tổng tài sản

mean_val <- mean(df_taisan$TongTaiSan)
median_val <- median(df_taisan$TongTaiSan)

ggplot(df_taisan, aes(x = Nam, y = TongTaiSan)) +
  geom_line(color = "blue", linewidth = 1.2) +          # Layer 1
  geom_point(color = "red", size = 3) +                 # Layer 2
  geom_hline(yintercept = mean_val, color = "darkgreen", linetype = "dashed") + # Layer 3
  geom_hline(yintercept = median_val, color = "orange", linetype = "dotted") +  # Layer 4
  geom_text(aes(x = 2016, y = mean_val, label = "Trung bình"), color = "darkgreen", vjust = -1) + # Layer 5
  labs(title = "So sánh Trung bình và Trung vị Tổng tài sản Techcombank",
       x = "Năm", y = "Tổng tài sản (triệu đồng)") +
  theme_minimal()
## Warning in geom_text(aes(x = 2016, y = mean_val, label = "Trung bình"), : All aesthetics have length 1, but the data has 10 rows.
## ℹ Please consider using `annotate()` or provide this layer with data containing
##   a single row.

Ý nghĩa kỹ thuật: Dùng geom_hline() để thêm hai đường trung bình và trung vị, geom_line() thể hiện xu hướng, và geom_text() để ghi chú trực tiếp trên đồ thị.

Ý nghĩa thống kê: Khi trung bình cao hơn trung vị, chứng tỏ phân phối lệch phải tức là tổng tài sản tăng mạnh ở các năm cuối, phản ánh giai đoạn tăng trưởng vượt trội.

6.17 Biểu đồ Scatter thể hiện mối quan hệ giữa Tổng tài sản và Tăng trưởng (%)

ggplot(df_growth, aes(x = TangTruong, y = df_taisan$TongTaiSan[-1])) +
  geom_point(color = "blue", size = 3) +                 # Layer 1
  geom_smooth(method = "lm", color = "red", se = FALSE) + # Layer 2
  geom_text(aes(label = Nam), vjust = -0.5) +            # Layer 3
  geom_vline(xintercept = 0, color = "gray", linetype = "dashed") + # Layer 4
  geom_hline(yintercept = mean(df_taisan$TongTaiSan), color = "green", linetype = "dotted") + # Layer 5
  labs(title = "Mối quan hệ giữa Tổng tài sản và Tốc độ tăng trưởng (%)",
       x = "Tăng trưởng (%)", y = "Tổng tài sản (triệu đồng)") +
  theme_light()
## `geom_smooth()` using formula = 'y ~ x'

Ý nghĩa kỹ thuật: geom_smooth(method=“lm”) tạo đường hồi quy tuyến tính, giúp xác định mối quan hệ giữa hai biến; thêm geom_vline và geom_hline để biểu thị trung tâm dữ liệu.

Ý nghĩa thống kê: Biểu đồ cho thấy tổng tài sản tăng mạnh đi kèm với tốc độ tăng trưởng cao, phản ánh tính đồng biến giữa quy mô tài sản và hiệu quả mở rộng hoạt động.

6.18 Biểu đồ cột thể hiện Biến động phần trăm từng năm so với năm trước

df_taisan$PhanTram <- c(NA, round(diff(df_taisan$TongTaiSan) / head(df_taisan$TongTaiSan, -1) * 100, 2))

ggplot(df_taisan[-1, ], aes(x = factor(Nam), y = PhanTram)) +
  geom_col(fill = "lightcoral") +                      # Layer 1
  geom_text(aes(label = paste0(PhanTram, "%")), vjust = -0.5) + # Layer 2
  geom_hline(yintercept = 0, color = "black") +        # Layer 3
  geom_hline(yintercept = mean(df_taisan$PhanTram, na.rm = TRUE),
             color = "blue", linetype = "dashed") +    # Layer 4
  theme_minimal() +                                   # Layer 5
  labs(title = "Biến động (%) Tổng tài sản Techcombank theo từng năm",
       x = "Năm", y = "Biến động (%)")

Ý nghĩa kỹ thuật: diff() tính phần trăm biến động, geom_col() biểu diễn mức thay đổi từng năm, và geom_hline() giúp xác định trung bình biến động.

Ý nghĩa thống kê: Cho thấy mức độ ổn định của tốc độ thay đổi tài sản qua từng năm. Nếu giá trị dương đều Techcombank duy trì tăng trưởng liên tục, còn nếu có giá trị âm xuất hiện giai đoạn điều chỉnh quy mô.

6.19 Biểu đồ Boxplot thể hiện phân tán của Tốc độ tăng trưởng (%)

ggplot(df_growth, aes(x = "", y = TangTruong)) +
  geom_boxplot(fill = "lightyellow", outlier.color = "red") +   # Layer 1
  geom_jitter(width = 0.1, color = "blue", size = 2) +          # Layer 2
  geom_hline(yintercept = mean(df_growth$TangTruong), color = "green", linetype = "dashed") + # Layer 3
  geom_hline(yintercept = 0, color = "black") +                 # Layer 4
  labs(title = "Phân bố và biến động Tốc độ tăng trưởng (%) Tổng tài sản",
       y = "Tốc độ tăng trưởng (%)") +                         # Layer 5
  theme_classic()

Ý nghĩa kỹ thuật: geom_boxplot() biểu diễn độ phân tán, geom_jitter() thêm điểm cụ thể, geom_hline() biểu diễn mức trung bình — giúp nhìn rõ xu hướng và biến động.

Ý nghĩa thống kê: Thể hiện độ biến thiên của tốc độ tăng trưởng; khoảng hộp càng nhỏ chứng tỏ mức tăng trưởng ổn định, còn hộp dài hoặc có ngoại lai thể hiện biến động mạnh theo thời gian.

6.20 Biểu đồ đường chồng (Multi-line) so sánh Tổng tài sản và Tích lũy

ggplot() +
  geom_line(data = df_taisan, aes(x = Nam, y = TongTaiSan, color = "Tổng tài sản"), linewidth = 1.2) + # Layer 1
  geom_line(data = df_taisan, aes(x = Nam, y = TichLuy, color = "Tích lũy"), linewidth = 1.2, linetype = "dashed") + # Layer 2
  geom_point(data = df_taisan, aes(x = Nam, y = TongTaiSan), color = "red", size = 3) + # Layer 3
  geom_point(data = df_taisan, aes(x = Nam, y = TichLuy), color = "blue", size = 3) + # Layer 4
  labs(title = "So sánh xu hướng Tổng tài sản và Tổng tích lũy Techcombank (2014–2023)",
       x = "Năm", y = "Giá trị (triệu đồng)", color = "Biến") +  # Layer 5
  theme_minimal()

Ý nghĩa kỹ thuật: Biểu đồ kết hợp hai đường (geom_line) trong cùng hệ tọa độ, thể hiện đồng thời biến Tổng tài sản và biến Tích lũy, với màu và kiểu đường khác nhau.

Ý nghĩa thống kê: Giúp so sánh trực tiếp giữa giá trị tài sản hằng năm và tổng tích lũy qua thời gian. Khoảng cách hai đường càng lớn thể hiện tốc độ tích lũy tăng nhanh, chứng tỏ ngân hàng có khả năng tái đầu tư hiệu quả.