1 GIỚI THIỆU

Bộ dữ liệu STB_2015-2024 chứa các chỉ số tài chính của Ngân hàng Thương mại Cổ phần Sài Gòn Thương Tín (STB) từ năm 2015 đến 2024. Dữ liệu bao gồm Bảng cân đối kế toán (tài sản và nguồn vốn) và Báo cáo kết quả kinh doanh. Phân tích này nhằm mục đích đánh giá tình hình hoạt động, sự tăng trưởng và hiệu quả kinh doanh của ngân hàng qua các năm.

2 THÔNG TIN CƠ BẢN VỀ BỘ DỮ LIỆU

library(readxl)
library(dplyr)
library(knitr)

# Đọc dữ liệu 
data_stb <- read_excel("C:/Users/adminn/OneDrive - UFM/STB_2015-2024.xlsx", 
                      sheet = "Sheet1" )
                

# Đổi tên các cột quan trọng dựa trên vị trí thực tế
names(data_stb)[1] <- "Year"
names(data_stb)[6] <- "Loans"
names(data_stb)[10] <- "Total_Assets" 
names(data_stb)[33] <- "Net_Profit"

# Chọn chỉ các cột quan trọng và chuyển đổi kiểu dữ liệu
data_stb <- data_stb %>%
  select(Year, Loans, Total_Assets, Net_Profit) %>%
  mutate(
    Year = as.integer(Year),
    Loans = as.numeric(Loans),
    Total_Assets = as.numeric(Total_Assets),
    Net_Profit = as.numeric(Net_Profit)
  ) %>%
  filter(!is.na(Year))  # Loại bỏ dòng không có năm

# Kiểm tra cấu trúc cơ bản của dataset
cat("=== THÔNG TIN CƠ BẢN VỀ BỘ DỮ LIỆU ===\n")
## === THÔNG TIN CƠ BẢN VỀ BỘ DỮ LIỆU ===
cat("Số quan sát (dòng):", nrow(data_stb), "\n")
## Số quan sát (dòng): 10
cat("Số biến (cột):", ncol(data_stb), "\n")
## Số biến (cột): 4
cat("\n")
# Kiểm tra dữ liệu trùng lặp
cat("Số quan sát trùng lặp:", sum(duplicated(data_stb)), "\n")
## Số quan sát trùng lặp: 0
cat("\n")
# Kiểm tra dữ liệu thiếu (missing values) 
cat("DỮ LIỆU THIẾU THEO TỪNG CỘT:\n")
## DỮ LIỆU THIẾU THEO TỪNG CỘT:
missing_summary <- sapply(data_stb, function(x) sum(is.na(x)))
print(missing_summary)
##         Year        Loans Total_Assets   Net_Profit 
##            0            0            0            0
cat("\n")
# Giải thích ý nghĩa các biến trong dữ liệu 
thong_tin_bien <- data.frame(
  "Tên Biến" = c("Year", "Loans", "Total_Assets", "Net_Profit"),
  "Mô Tả" = c(
    "Năm báo cáo",
    "Dư nợ cho vay và cho thuê tài chính khách hàng (Triệu VND)",
    "Tổng tài sản (Triệu VND)",
    "Lợi nhuận sau thuế (Triệu VND)"
  )
)

cat("=== Ý NGHĨA MỘT SỐ BIẾN QUAN TRỌNG TRONG DATASET ===\n")
## === Ý NGHĨA MỘT SỐ BIẾN QUAN TRỌNG TRONG DATASET ===
kable(thong_tin_bien, caption = "THÔNG TIN MÔ TẢ MỘT SỐ BIẾN QUAN TRỌNG")
THÔNG TIN MÔ TẢ MỘT SỐ BIẾN QUAN TRỌNG
Tên.Biến Mô.Tả
Year Năm báo cáo
Loans Dư nợ cho vay và cho thuê tài chính khách hàng (Triệu VND)
Total_Assets Tổng tài sản (Triệu VND)
Net_Profit Lợi nhuận sau thuế (Triệu VND)
# Hiển thị cấu trúc chi tiết của dữ liệu
cat("=== CẤU TRÚC DỮ LIỆU ===\n")
## === CẤU TRÚC DỮ LIỆU ===
str(data_stb)
## tibble [10 × 4] (S3: tbl_df/tbl/data.frame)
##  $ Year        : int [1:10] 2024 2023 2022 2021 2020 2019 2018 2017 2016 2015
##  $ Loans       : num [1:10] 4.73e+08 4.38e+08 4.05e+08 3.70e+08 3.35e+08 ...
##  $ Total_Assets: num [1:10] 7.27e+08 6.74e+08 5.89e+08 5.53e+08 4.93e+08 ...
##  $ Net_Profit  : num [1:10] 4135 3719 2593 1414 1248 ...
cat("\n=== THỐNG KÊ MÔ TẢ ===\n")
## 
## === THỐNG KÊ MÔ TẢ ===
summary(data_stb)
##       Year          Loans            Total_Assets         Net_Profit    
##  Min.   :2015   Min.   :183660021   Min.   :292032736   Min.   :  49.0  
##  1st Qu.:2017   1st Qu.:228423342   1st Qu.:377861780   1st Qu.: 611.2  
##  Median :2020   Median :313456646   Median :473048543   Median :1188.5  
##  Mean   :2020   Mean   :316763578   Mean   :488744528   Mean   :1606.6  
##  3rd Qu.:2022   3rd Qu.:396365711   3rd Qu.:579669366   3rd Qu.:2298.2  
##  Max.   :2024   Max.   :473456903   Max.   :727016711   Max.   :4135.0

3 DATA CLEANING & TRANSFORMATION

# **DATA CLEANING & TRANSFORMATION**

# Tạo các biến mới phục vụ phân tích
data_stb <- data_stb %>%
  arrange(Year) %>%
  mutate(
    # Tỷ lệ cho vay trên tổng tài sản
    loan_to_assets_ratio = Loans / Total_Assets,
    
    # Tỷ suất lợi nhuận trên tổng tài sản (ROA)
    roa = Net_Profit / Total_Assets,
    
    # Tăng trưởng dư nợ so với năm trước
    loan_growth = (Loans - lag(Loans)) / lag(Loans) * 100,
    
    # Tăng trưởng tổng tài sản so với năm trước
    assets_growth = (Total_Assets - lag(Total_Assets)) / lag(Total_Assets) * 100,
    
    # Tăng trưởng lợi nhuận so với năm trước
    profit_growth = (Net_Profit - lag(Net_Profit)) / lag(Net_Profit) * 100
  )

# Kiểm tra lại cấu trúc sau khi chuyển đổi
cat("=== CẤU TRÚC DỮ LIỆU SAU KHI CHUYỂN ĐỔI ===\n")
## === CẤU TRÚC DỮ LIỆU SAU KHI CHUYỂN ĐỔI ===
str(data_stb)
## tibble [10 × 9] (S3: tbl_df/tbl/data.frame)
##  $ Year                : int [1:10] 2015 2016 2017 2018 2019 2020 2021 2022 2023 2024
##  $ Loans               : num [1:10] 1.84e+08 1.96e+08 2.20e+08 2.53e+08 2.92e+08 ...
##  $ Total_Assets        : num [1:10] 2.92e+08 3.32e+08 3.68e+08 4.06e+08 4.54e+08 ...
##  $ Net_Profit          : num [1:10] 444 49 555 780 1129 ...
##  $ loan_to_assets_ratio: num [1:10] 0.629 0.592 0.598 0.623 0.644 ...
##  $ roa                 : num [1:10] 1.52e-06 1.48e-07 1.51e-06 1.92e-06 2.49e-06 ...
##  $ loan_growth         : num [1:10] NA 6.95 12.1 14.94 15.39 ...
##  $ assets_growth       : num [1:10] NA 13.7 11 10.2 11.7 ...
##  $ profit_growth       : num [1:10] NA -89 1032.7 40.5 44.7 ...
cat("\n=== DỮ LIỆU 10 NĂM ===\n")
## 
## === DỮ LIỆU 10 NĂM ===
print(data_stb)
## # A tibble: 10 × 9
##     Year  Loans Total_Assets Net_Profit loan_to_assets_ratio     roa loan_growth
##    <int>  <dbl>        <dbl>      <dbl>                <dbl>   <dbl>       <dbl>
##  1  2015 1.84e8    292032736        444                0.629 1.52e-6       NA   
##  2  2016 1.96e8    332023043         49                0.592 1.48e-7        6.95
##  3  2017 2.20e8    368468840        555                0.598 1.51e-6       12.1 
##  4  2018 2.53e8    406040598        780                0.623 1.92e-6       14.9 
##  5  2019 2.92e8    453581057       1129                0.644 2.49e-6       15.4 
##  6  2020 3.35e8    492516029       1248                0.680 2.53e-6       14.7 
##  7  2021 3.70e8    552748211       1414                0.670 2.56e-6       10.6 
##  8  2022 4.05e8    588643085       2593                0.688 4.41e-6        9.32
##  9  2023 4.38e8    674374966       3719                0.650 5.51e-6        8.25
## 10  2024 4.73e8    727016711       4135                0.651 5.69e-6        7.99
## # ℹ 2 more variables: assets_growth <dbl>, profit_growth <dbl>

4 PHÂN TỔ DỮ LIỆU

4.1 Phân tổ theo Nhóm tăng trưởng lợi nhuận

# Phân loại năm theo mức tăng trưởng lợi nhuận
filtered_data <- data_stb %>% filter(!is.na(profit_growth))
total_years <- nrow(filtered_data)

profit_growth_summary <- filtered_data %>%
  mutate(profit_growth_group = case_when(
    profit_growth > 20 ~ "Tăng trưởng cao (>20%)",
    profit_growth > 0 ~ "Tăng trưởng vừa (0-20%)",
    profit_growth > -20 ~ "Suy giảm nhẹ (-20%-0%)",
    TRUE ~ "Suy giảm mạnh (<-20%)"
  )) %>%
  group_by(profit_growth_group) %>%
  summarise(
    So_Nam = n(),
    Ty_Le = So_Nam / total_years * 100,
    LNST_Trung_Binh = mean(Net_Profit, na.rm = TRUE),
    .groups = 'drop'
  )

cat("=== PHÂN TỔ THEO NHÓM TĂNG TRƯỞNG LỢI NHUẬN ===\n")
## === PHÂN TỔ THEO NHÓM TĂNG TRƯỞNG LỢI NHUẬN ===
kable(profit_growth_summary, digits = 2)
profit_growth_group So_Nam Ty_Le LNST_Trung_Binh
Suy giảm mạnh (<-20%) 1 11.11 49.00
Tăng trưởng cao (>20%) 5 55.56 1755.20
Tăng trưởng vừa (0-20%) 3 33.33 2265.67

4.2 Phân tổ theo Quy mô tổng tài sản

# Phân tổ theo quy mô tổng tài sản
assets_size_summary <- data_stb %>%
  mutate(assets_size = case_when(
    Total_Assets < 400000000 ~ "Quy mô nhỏ (<400,000 tỷ)",
    Total_Assets < 600000000 ~ "Quy mô trung bình (400,000-600,000 tỷ)",
    TRUE ~ "Quy mô lớn (>600,000 tỷ)"
  )) %>%
  group_by(assets_size) %>%
  summarise(
    So_Nam = n(),
    Ty_Le = n() / nrow(data_stb) * 100,  # Sửa thành tổng số năm trong dataset
    LNST_Trung_Binh = mean(Net_Profit, na.rm = TRUE),
    Cho_Vay_Trung_Binh = mean(Loans, na.rm = TRUE),
    .groups = 'drop'
  )

cat("=== PHÂN TỔ THEO QUY MÔ TỔNG TÀI SẢN ===\n")
## === PHÂN TỔ THEO QUY MÔ TỔNG TÀI SẢN ===
kable(assets_size_summary, digits = 2)
assets_size So_Nam Ty_Le LNST_Trung_Binh Cho_Vay_Trung_Binh
Quy mô lớn (>600,000 tỷ) 2 20 3927.00 455934136
Quy mô nhỏ (<400,000 tỷ) 3 30 349.33 200095283
Quy mô trung bình (400,000-600,000 tỷ) 5 50 1432.80 331096333

5 PHÂN TÍCH BIẾN

5.1 Phân tích biến Dư nợ cho vay

library(ggplot2)
library(scales)

# Bảng tần số và tần suất cho dư nợ cho vay
loan_intervals <- cut(data_stb$Loans, 
                     breaks = c(0, 200000000, 400000000, 600000000, Inf),
                     labels = c("0-200,000", "200,000-400,000", "400,000-600,000", ">600,000"),
                     right = FALSE)

frequency_table <- table(loan_intervals)
percentage_table <- prop.table(frequency_table) * 100

loan_distribution <- data.frame(
  Khoang_Du_No = names(frequency_table),
  Tan_So = as.numeric(frequency_table),
  Tan_Suat = as.numeric(percentage_table)
)

cat("=== BẢNG TẦN SỐ VÀ TẦN SUẤT DƯ NỢ CHO VAY ===\n")
## === BẢNG TẦN SỐ VÀ TẦN SUẤT DƯ NỢ CHO VAY ===
kable(loan_distribution, digits = 2)
Khoang_Du_No Tan_So Tan_Suat
0-200,000 2 20
200,000-400,000 5 50
400,000-600,000 3 30
>600,000 0 0
# Thống kê mô tả
cat("=== THỐNG KÊ MÔ TẢ BIẾN DƯ NỢ CHO VAY ===\n")
## === THỐNG KÊ MÔ TẢ BIẾN DƯ NỢ CHO VAY ===
summary(data_stb$Loans)
##      Min.   1st Qu.    Median      Mean   3rd Qu.      Max. 
## 183660021 228423342 313456646 316763578 396365711 473456903
# Biểu đồ xu hướng dư nợ qua các năm
ggplot(data_stb, aes(x = Year, y = Loans)) +
  geom_line(color = "blue", size = 1.5) +
  geom_point(color = "blue", size = 3) +
  scale_y_continuous(labels = comma) +
  labs(title = "XU HƯỚNG DƯ NỢ CHO VAY QUA CÁC NĂM",
       subtitle = "Đơn vị: Triệu VND",
       x = "Năm", 
       y = "Dư nợ cho vay") +
  theme_minimal() +
  theme(plot.title = element_text(hjust = 0.5, face = "bold"))