LỜI CẢM ƠN

Nhóm chúng em xin gửi lời cảm ơn chân thành và sâu sắc đến Thầy Trần Mạnh Tường, giảng viên hướng dẫn học phần “Ngôn ngữ lập trình trong phân tích dữ liệu”, đã tận tình giảng dạy, hướng dẫn và hỗ trợ chúng em trong suốt quá trình học tập cũng như thực hiện bài tiểu luận này.

Nhờ sự hướng dẫn và góp ý quý báu của Thầy, nhóm đã có cơ hội tiếp cận, tìm hiểu và vận dụng ngôn ngữ lập trình R vào phân tích dữ liệu thực tế, từ đó củng cố thêm kiến thức về thống kê, lập trình và tư duy khoa học trong nghiên cứu.

Mặc dù nhóm đã cố gắng hết sức, nhưng do thời gian và kinh nghiệm còn hạn chế, bài làm chắc chắn vẫn còn nhiều thiếu sót. Nhóm rất mong nhận được sự góp ý từ Thầy để bài nghiên cứu được hoàn thiện hơn.

1 CHƯƠNG 1: PHÂN TÍCH BỘ DỮ LIỆU VỀ CÁC YẾU TỐ SINH HỌC VÀ LỐI SỐNG ẢNH HƯỞNG ĐẾN NGUY CƠ MẮC BỆNH TIỂU ĐƯỜNG

1.1 MỞ ĐẦU

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

Nhóm chọn đề tài “Phân tích bộ dữ liệu về các yếu tố sinh học và lối sống ảnh hưởng đến nguy cơ mắc bệnh tiểu đường bằng ngôn ngữ lập trình R” nhằm kết hợp giữa kiến thức lập trình và ứng dụng thực tiễn trong y học. Bệnh tiểu đường hiện là vấn đề sức khỏe cộng đồng nghiêm trọng, việc hiểu rõ nguyên nhân và yếu tố nguy cơ là cần thiết để đưa ra biện pháp phòng tránh.

Bên cạnh đó, bộ dữ liệu “Diabetes Health Indicators Dataset” có quy mô lớn, chứa 31 biến và 100.000 quan sát, cung cấp thông tin phong phú về sức khỏe, lối sống và nhân khẩu học. Đây là nguồn dữ liệu lý tưởng để sinh viên rèn luyện kỹ năng phân tích dữ liệu thực tế. Đồng thời, việc sử dụng R giúp nhóm phát triển kỹ năng xử lý dữ liệu, thống kê mô tả và trình bày kết quả bằng công cụ lập trình hiện đại.

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

Mục tiêu tổng quát của đề tài là ứng dụng ngôn ngữ R trong phân tích dữ liệu y sinh học để nhận diện các yếu tố sinh học và lối sống có ảnh hưởng đến nguy cơ mắc bệnh tiểu đường.

Cụ thể, nhóm hướng đến:

Xử lý, làm sạch và mã hóa dữ liệu theo chuẩn y học (WHO, CDC, AHA).

Phân tích thống kê mô tả và kiểm định mối liên hệ giữa các biến sinh học (như huyết áp, cholesterol, insulin, triglycerides…) với giai đoạn bệnh.

Trực quan hóa dữ liệu bằng biểu đồ để mô tả xu hướng và mối tương quan giữa các yếu tố sức khỏe và lối sống.

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

Đối tượng nghiên cứu:

Dữ liệu của 100.000 cá nhân trong bộ “Diabetes Health Indicators Dataset”, bao gồm các chỉ số sinh học, lối sống, tiền sử bệnh và thông tin nhân khẩu học.

Phạm vi nghiên cứu:

Nghiên cứu tập trung vào 10 biến chính gồm 6 biến định lượng (như huyết áp tâm trương, cholesterol, triglycerides, insulin, tỷ lệ eo/hông) và 4 biến định tính (trình độ học vấn, việc làm, giai đoạn bệnh, tiền sử gia đình). Phân tích được thực hiện bằng R thông qua các bước thống kê, kiểm định và trực quan hóa dữ liệu, không đi sâu vào mô hình dự báo.

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

Đề tài sử dụng phương pháp định lượng với công cụ chính là ngôn ngữ lập trình R. Các bước nghiên cứu bao gồm:

Tiền xử lý dữ liệu: đọc, làm sạch, mã hóa và loại bỏ giá trị ngoại lai dựa trên chuẩn y học.

Thống kê mô tả: xác định đặc điểm trung bình, phương sai, hệ số biến thiên của các biến định lượng.

Kiểm định thống kê và phân tích tương quan: áp dụng các kiểm định K–S, ANOVA, Kruskal–Wallis, Chi-square, Pearson để xác định mối liên hệ giữa các yếu tố.

Trực quan hóa dữ liệu: sử dụng ggplot2 để xây dựng các biểu đồ Histogram, Boxplot, Scatter, Density, Violin, Bar Chart và Facet nhằm minh họa kết quả.

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

Đề tài góp phần ứng dụng thực tế ngôn ngữ lập trình R trong phân tích dữ liệu y học, giúp sinh viên hiểu rõ quy trình xử lý và khai thác dữ liệu lớn. Nghiên cứu cũng chỉ ra mối liên hệ giữa các yếu tố sinh học (HDL, LDL, triglycerides, insulin, WHR) với tiến triển bệnh tiểu đường, qua đó làm rõ vai trò của lối sống và yếu tố di truyền trong nguy cơ mắc bệnh.

Kết quả nghiên cứu cung cấp minh chứng khoa học cho việc sử dụng R trong lĩnh vực y sinh học, đồng thời góp phần nâng cao nhận thức cộng đồng về tầm quan trọng của dinh dưỡng, vận động và tầm soát sớm bệnh tiểu đường.

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

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

# Cài đặt các gói cần thiết
install.packages("DT", repos = "https://cloud.r-project.org")
## Installing package into 'C:/Users/maica/AppData/Local/R/win-library/4.4'
## (as 'lib' is unspecified)
## package 'DT' successfully unpacked and MD5 sums checked
## 
## The downloaded binary packages are in
##  C:\Users\maica\AppData\Local\Temp\RtmpW6aTY1\downloaded_packages
install.packages("readxl", repos = "https://cloud.r-project.org")
## Installing package into 'C:/Users/maica/AppData/Local/R/win-library/4.4'
## (as 'lib' is unspecified)
## package 'readxl' successfully unpacked and MD5 sums checked
## 
## The downloaded binary packages are in
##  C:\Users\maica\AppData\Local\Temp\RtmpW6aTY1\downloaded_packages
# Nạp thư viện
library(DT)
## Warning: package 'DT' was built under R version 4.4.3
library(readxl)
## Warning: package 'readxl' was built under R version 4.4.3
# Đọc dữ liệu từ file Excel
diabetes <- read_excel("C:/Users/maica/Downloads/PHAN1/Diabetes Health Indicators Dataset.xlsx")

# Hiển thị bảng dữ liệu đầu tiên
datatable(head(diabetes, 100))

Ý nghĩa kỹ thuật:

read_excel: Đọc toàn bộ file Excel vào bộ nhớ RAM, mỗi cột trong file được ánh xạ thành một vector trong R giúp R có thể xử lý từng biến một cách riêng biệt.

datatable(d): Tạo bảng dữ liệu tương tác cho phép người dùng quan sát toàn bộ tập dữ liệu lớn (100.000 dòng) một cách trực quan, có thể tìm kiếm, sắp xếp, và lọc nhanh theo biến hoặc từ khóa.

Nhận xét:

Đây là bước đọc và chuẩn hóa dữ liệu ban đầu, giúp chuyển đổi từ file Excel sang dạng khung dữ liệu (data frame) trong R.

Việc hiển thị dữ liệu dưới dạng bảng tương tác giúp nhìn tổng quan về các biến và cấu trúc dữ liệu, từ đó xác định rõ các yếu tố cần phân tích.

1.2.2 Danh sách các biến

names(diabetes)
##  [1] "age"                                "gender"                            
##  [3] "ethnicity"                          "education_level"                   
##  [5] "income_level"                       "employment_status"                 
##  [7] "smoking_status"                     "alcohol_consumption_per_week"      
##  [9] "physical_activity_minutes_per_week" "diet_score"                        
## [11] "sleep_hours_per_day"                "screen_time_hours_per_day"         
## [13] "family_history_diabetes"            "hypertension_history"              
## [15] "cardiovascular_history"             "bmi"                               
## [17] "waist_to_hip_ratio"                 "systolic_bp"                       
## [19] "diastolic_bp"                       "heart_rate"                        
## [21] "cholesterol_total"                  "hdl_cholesterol"                   
## [23] "ldl_cholesterol"                    "triglycerides"                     
## [25] "glucose_fasting"                    "glucose_postprandial"              
## [27] "insulin_level"                      "hba1c"                             
## [29] "diabetes_risk_score"                "diabetes_stage"                    
## [31] "diagnosed_diabetes"

Ý nghĩa kỹ thuật:

Lệnh names(diabetes) được sử dụng để liệt kê toàn bộ tên các biến (cột) trong bộ dữ liệu Diabetes Health Indicators Dataset.

R trả về một vector chứa tên của tất cả 31 biến, giúp người dùng nhận biết cấu trúc dữ liệu và xác định loại thông tin được thu thập trong tập dữ liệu.

Nhận xét

Bộ dữ liệu Diabetes Health Indicators gồm 31 biến, phản ánh các nhóm thông tin chính sau:

Đặc điểm nhân khẩu học: age, gender, ethnicity, education_level, income_level, employment_status.

Thói quen sinh hoạt: smoking_status, alcohol_consumption_per_week, physical_activity_minutes_per_week, diet_score, sleep_hours_per_day, screen_time_hours_per_day.

Tiền sử bệnh lý: family_history_diabetes, hypertension_history, cardiovascular_history.

Chỉ số sức khỏe: bmi, waist_to_hip_ratio, systolic_bp, diastolic_bp, heart_rate.

Chỉ số sinh hóa: cholesterol_total, hdl_cholesterol, ldl_cholesterol, triglycerides, glucose_fasting, glucose_postprandial, insulin_level, hba1c.

Chỉ số đánh giá tiểu đường: diabetes_risk_score, diabetes_stage, diagnosed_diabetes.

Mô tả đặc trưng của dữ liệu

# Mô tả các đặc trưng của dữ liệu
variable <- c("age", "gender", "ethnicity", "education_level", "income_level",
              "employment_status", "smoking_status", "alcohol_consumption_per_week",
              "physical_activity_minutes_per_week", "diet_score", "sleep_hours_per_day",
              "screen_time_hours_per_day", "family_history_diabetes", "hypertension_history",
              "cardiovascular_history", "bmi", "waist_to_hip_ratio", "systolic_bp",
              "diastolic_bp", "heart_rate", "cholesterol_total", "hdl_cholesterol",
              "ldl_cholesterol", "triglycerides", "glucose_fasting", "glucose_postprandial",
              "insulin_level", "hba1c", "diabetes_risk_score", "diabetes_stage",
              "diagnosed_diabetes")

description <- c(
  "Tuổi của người tham gia khảo sát (tính bằng năm).",
  "Giới tính của người tham gia (Male/Female/Other).",
  "Dân tộc hoặc nhóm chủng tộc (Asian, White, Hispanic, Black...).",
  "Trình độ học vấn cao nhất đạt được (Highschool, Graduate, Postgraduate...).",
  "Mức thu nhập của cá nhân (Low, Lower-Middle, Middle, Upper-Middle, High).",
  "Tình trạng việc làm (Employed, Unemployed, Retired, Student...).",
  "Tình trạng hút thuốc (Never, Former, Current).",
  "Số lần uống rượu/bia trung bình mỗi tuần.",
  "Tổng số phút hoạt động thể chất mỗi tuần.",
  "Điểm đánh giá chế độ ăn uống lành mạnh (càng cao càng tốt).",
  "Số giờ ngủ trung bình mỗi ngày.",
  "Thời gian trung bình nhìn màn hình mỗi ngày (giờ/ngày).",
  "Tiền sử gia đình có người mắc tiểu đường (1: Có, 0: Không).",
  "Có tiền sử cao huyết áp hay không (1: Có, 0: Không).",
  "Có tiền sử bệnh tim mạch hay không (1: Có, 0: Không).",
  "Chỉ số khối cơ thể (BMI).",
  "Tỷ lệ vòng eo/vòng hông.",
  "Huyết áp tâm thu (mmHg).",
  "Huyết áp tâm trương (mmHg).",
  "Nhịp tim (lần/phút).",
  "Tổng lượng cholesterol (mg/dL).",
  "Cholesterol tốt (HDL) (mg/dL).",
  "Cholesterol xấu (LDL) (mg/dL).",
  "Triglycerides trong máu (mg/dL).",
  "Đường huyết khi đói (mg/dL).",
  "Đường huyết sau ăn (mg/dL).",
  "Mức insulin (µU/mL).",
  "Chỉ số HbA1c (%).",
  "Điểm nguy cơ mắc tiểu đường.",
  "Giai đoạn bệnh tiểu đường (No Diabetes, Prediabetes, Type 1, Type 2).",
  "Trạng thái chẩn đoán: 1 = Có bệnh, 0 = Không."
)

variable_description <- data.frame(Ten_bien = variable, Mo_ta_chi_tiet = description)

# Hiển thị bảng
knitr::kable(variable_description, align = "l", caption = "Mô tả các đặc trưng của dữ liệu")
Mô tả các đặc trưng của dữ liệu
Ten_bien Mo_ta_chi_tiet
age Tuổi của người tham gia khảo sát (tính bằng năm).
gender Giới tính của người tham gia (Male/Female/Other).
ethnicity Dân tộc hoặc nhóm chủng tộc (Asian, White, Hispanic, Black…).
education_level Trình độ học vấn cao nhất đạt được (Highschool, Graduate, Postgraduate…).
income_level Mức thu nhập của cá nhân (Low, Lower-Middle, Middle, Upper-Middle, High).
employment_status Tình trạng việc làm (Employed, Unemployed, Retired, Student…).
smoking_status Tình trạng hút thuốc (Never, Former, Current).
alcohol_consumption_per_week Số lần uống rượu/bia trung bình mỗi tuần.
physical_activity_minutes_per_week Tổng số phút hoạt động thể chất mỗi tuần.
diet_score Điểm đánh giá chế độ ăn uống lành mạnh (càng cao càng tốt).
sleep_hours_per_day Số giờ ngủ trung bình mỗi ngày.
screen_time_hours_per_day Thời gian trung bình nhìn màn hình mỗi ngày (giờ/ngày).
family_history_diabetes Tiền sử gia đình có người mắc tiểu đường (1: Có, 0: Không).
hypertension_history Có tiền sử cao huyết áp hay không (1: Có, 0: Không).
cardiovascular_history Có tiền sử bệnh tim mạch hay không (1: Có, 0: Không).
bmi Chỉ số khối cơ thể (BMI).
waist_to_hip_ratio Tỷ lệ vòng eo/vòng hông.
systolic_bp Huyết áp tâm thu (mmHg).
diastolic_bp Huyết áp tâm trương (mmHg).
heart_rate Nhịp tim (lần/phút).
cholesterol_total Tổng lượng cholesterol (mg/dL).
hdl_cholesterol Cholesterol tốt (HDL) (mg/dL).
ldl_cholesterol Cholesterol xấu (LDL) (mg/dL).
triglycerides Triglycerides trong máu (mg/dL).
glucose_fasting Đường huyết khi đói (mg/dL).
glucose_postprandial Đường huyết sau ăn (mg/dL).
insulin_level Mức insulin (µU/mL).
hba1c Chỉ số HbA1c (%).
diabetes_risk_score Điểm nguy cơ mắc tiểu đường.
diabetes_stage Giai đoạn bệnh tiểu đường (No Diabetes, Prediabetes, Type 1, Type 2).
diagnosed_diabetes Trạng thái chẩn đoán: 1 = Có bệnh, 0 = Không.

Ý nghĩa kỹ thuật:

Hai vector variable và description được khai báo:

variable lưu trữ tên của các biến trong bộ dữ liệu (gồm 31 biến).

description lưu trữ mô tả chi tiết tương ứng với từng biến.

Hàm data.frame() được sử dụng để kết hợp hai vector này lại thành một khung dữ liệu mới có tên là variable_description.

Hàm kable() của gói knitr để hiển thị bảng mô tả

Nhận xét:

Bảng trên thể hiện mô tả đầy đủ của 31 biến trong bộ dữ liệu Diabetes Health Indicators Dataset, phản ánh nhiều khía cạnh khác nhau về người tham gia khảo sát, bao gồm:

Đặc điểm nhân khẩu học:

age, gender, ethnicity, education_level, income_level, employment_status.

Thói quen và lối sống:

smoking_status, alcohol_consumption_per_week, physical_activity_minutes_per_week, diet_score, sleep_hours_per_day, screen_time_hours_per_day.

Tiền sử bệnh lý:

family_history_diabetes, hypertension_history, cardiovascular_history.

Chỉ số sức khỏe:

bmi, waist_to_hip_ratio, systolic_bp, diastolic_bp, heart_rate.

Chỉ số sinh hóa:

cholesterol_total, hdl_cholesterol, ldl_cholesterol, triglycerides, glucose_fasting, glucose_postprandial, insulin_level, hba1c.

Chỉ số về bệnh tiểu đường:

diabetes_risk_score, diabetes_stage, diagnosed_diabetes.

Các biến này cung cấp cái nhìn toàn diện về nhân khẩu học, thói quen sinh hoạt, sức khỏe và tình trạng bệnh lý của từng cá nhân.

1.2.3 Số quan sát và số biến

dim(diabetes)
## [1] 100000     31

Ý nghĩa kỹ thuật:

Lệnh dim(diabetes) được sử dụng để kiểm tra kích thước của bộ dữ liệu đang phân tích.

Kết quả đầu tiên (100000) cho biết số lượng quan sát (số hàng) trong tập dữ liệu, tức là 100.000 cá nhân được khảo sát.

Kết quả thứ hai (31) cho biết số lượng biến (số cột), tương ứng với 31 đặc trưng được ghi nhận cho mỗi cá nhân.

Nhận xét:

Bộ dữ liệu Diabetes Health Indicators Dataset có 100.000 quan sát và 31 biến, là một tập dữ liệu lớn và đa dạng, phản ánh nhiều khía cạnh khác nhau của đối tượng nghiên cứu.

Với quy mô này, dữ liệu đủ mạnh để thực hiện các phân tích thống kê, hồi quy và mô hình dự báo về nguy cơ mắc bệnh tiểu đường.

1.2.4 Kiểm tra cấu trúc tổng quát

str(diabetes)
## tibble [100,000 × 31] (S3: tbl_df/tbl/data.frame)
##  $ age                               : num [1:100000] 58 48 60 74 46 46 75 62 42 59 ...
##  $ gender                            : chr [1:100000] "Male" "Female" "Male" "Female" ...
##  $ ethnicity                         : chr [1:100000] "Asian" "White" "Hispanic" "Black" ...
##  $ education_level                   : chr [1:100000] "Highschool" "Highschool" "Highschool" "Highschool" ...
##  $ income_level                      : chr [1:100000] "Lower-Middle" "Middle" "Middle" "Low" ...
##  $ employment_status                 : chr [1:100000] "Employed" "Employed" "Unemployed" "Retired" ...
##  $ smoking_status                    : chr [1:100000] "Never" "Former" "Never" "Never" ...
##  $ alcohol_consumption_per_week      : num [1:100000] 0 1 1 0 1 2 0 1 1 3 ...
##  $ physical_activity_minutes_per_week: num [1:100000] 215 143 57 49 109 124 53 75 114 86 ...
##  $ diet_score                        : num [1:100000] 5.7 6.7 6.4 3.4 7.2 9 9.2 4.1 6.7 8.2 ...
##  $ sleep_hours_per_day               : num [1:100000] 7.9 6.5 10 6.6 7.4 6.2 7.8 9 8.5 5.3 ...
##  $ screen_time_hours_per_day         : num [1:100000] 7.9 8.7 8.1 5.2 5 5.4 8 12.9 8.5 7.4 ...
##  $ family_history_diabetes           : num [1:100000] 0 0 1 0 0 0 0 0 0 0 ...
##  $ hypertension_history              : num [1:100000] 0 0 0 0 0 0 1 1 0 0 ...
##  $ cardiovascular_history            : num [1:100000] 0 0 0 0 0 0 0 1 1 0 ...
##  $ bmi                               : num [1:100000] 30.5 23.1 22.2 26.8 21.2 26.1 25.1 23.9 24.7 26.7 ...
##  $ waist_to_hip_ratio                : num [1:100000] 0.89 0.8 0.81 0.88 0.78 0.85 0.88 0.86 0.84 0.81 ...
##  $ systolic_bp                       : num [1:100000] 134 129 115 120 92 95 129 128 103 124 ...
##  $ diastolic_bp                      : num [1:100000] 78 76 73 93 67 81 77 83 71 81 ...
##  $ heart_rate                        : num [1:100000] 68 67 74 68 67 57 81 76 72 70 ...
##  $ cholesterol_total                 : num [1:100000] 239 116 213 171 210 218 238 241 187 188 ...
##  $ hdl_cholesterol                   : num [1:100000] 41 55 66 50 52 61 46 49 33 52 ...
##  $ ldl_cholesterol                   : num [1:100000] 160 50 99 79 125 119 161 159 132 103 ...
##  $ triglycerides                     : num [1:100000] 145 30 36 140 160 179 155 120 98 104 ...
##  $ glucose_fasting                   : num [1:100000] 136 93 118 139 137 100 101 110 116 76 ...
##  $ glucose_postprandial              : num [1:100000] 236 150 195 253 184 133 100 189 172 109 ...
##  $ insulin_level                     : num [1:100000] 6.36 2 5.07 5.28 12.74 ...
##  $ hba1c                             : num [1:100000] 8.18 5.63 7.51 9.03 7.2 6.03 5.24 7.04 6.9 4.99 ...
##  $ diabetes_risk_score               : num [1:100000] 29.6 23 44.7 38.2 23.5 23.5 36.1 34.2 26.7 30 ...
##  $ diabetes_stage                    : chr [1:100000] "Type 2" "No Diabetes" "Type 2" "Type 2" ...
##  $ diagnosed_diabetes                : num [1:100000] 1 0 1 1 1 0 0 1 1 0 ...

Ý nghĩa kỹ thuật:

Lệnh str(diabetes) được sử dụng để kiểm tra cấu trúc tổng quát của bộ dữ liệu. Hàm này hiển thị thông tin quan trọng bao gồm:

Tên các biến (cột) trong bộ dữ liệu.

Kiểu dữ liệu (class) của từng biến như num (số), chr (chuỗi ký tự), factor, v.v.

Số lượng phần tử (quan sát) trong mỗi biến.

Nhận xét

Dữ liệu mô phỏng tình huống phân tích các yếu tố ảnh hưởng đến nguy cơ mắc bệnh tiểu đường.

Các biến độc lập phản ánh:

Điều kiện sống & hành vi sức khỏe (lối sống, dinh dưỡng, vận động, hút thuốc…). Yếu tố sinh học & y học (BMI, đường huyết, huyết áp…)

1.2.5 Số lượng biến định tính và định lượng

1.2.5.1 Biến định tính

sum(sapply(diabetes, is.character) | sapply(diabetes, is.factor))
## [1] 7

Ý nghĩa kỹ thuật:

sapply(diabetes, is.factor) Kiểm tra xem từng biến có thuộc kiểu dữ liệu factor (biến phân loại) hay không. Kết quả cũng là vector TRUE/FALSE.

Dấu “|” (hoặc) được dùng để kết hợp hai điều kiện trên. Một biến sẽ được xem là biến định tính nếu nó là kiểu character hoặc factor.

sum(…) Hàm sum() đếm tổng số giá trị TRUE là tổng số biến định tính trong bộ dữ liệu.

Nhận xét:

Bộ dữ liệu có 7 biến định tính, gồm các biến như: gender, ethnicity, education_level, income_level, employment_status, smoking_status, và diabetes_stage.

Các biến này mô tả đặc điểm nhân khẩu học và hành vi lối sống, có vai trò quan trọng trong việc phân loại đối tượng và phân tích sự khác biệt giữa các nhóm trong nghiên cứu bệnh tiểu đường.

1.2.5.2 Biến định lượng

sum(sapply(diabetes, is.numeric))
## [1] 24

Ý nghĩa kỹ thuật:

Hàm sapply(diabetes, is.numeric) Duyệt qua toàn bộ các cột trong bộ dữ liệu diabetes và kiểm tra xem biến có kiểu dữ liệu số (numeric) không. Kết quả trả về là vector TRUE/FALSE, với giá trị TRUE cho các biến định lượng.

Hàm sum() đếm tổng số giá trị TRUE trong kết quả ở trên, tức là tổng số biến định lượng trong bộ dữ liệu.

Nhận xét:

Bộ dữ liệu Diabetes Health Indicators Dataset có 24 biến định lượng, bao gồm các biến như: “age”, “bmi”, “waist_to_hip_ratio”,” systolic_bp”, “diastolic_bp”, “cholesterol_total”, “hdl_cholesterol”, “ldl_cholesterol”, “glucose_fasting”, “hba1c”, “insulin_level”,…

Các biến này thể hiện các giá trị đo lường cụ thể về nhân trắc học, huyết áp, chỉ số sinh hóa và các yếu tố y học khác.

1.2.6 Một vài dòng đầu và dòng cuối

library(knitr)
## Warning: package 'knitr' was built under R version 4.4.3
library(kableExtra)
## Warning: package 'kableExtra' was built under R version 4.4.3

1.2.6.1 Xem dữ liệu 6 dòng đầu

head(diabetes, 6) %>%
  kbl(caption = "6 dòng đầu tiên của bộ dữ liệu Diabetes Health Indicators Dataset",
      align = "c") %>%
  kable_paper("hover", full_width = FALSE)
6 dòng đầu tiên của bộ dữ liệu Diabetes Health Indicators Dataset
age gender ethnicity education_level income_level employment_status smoking_status alcohol_consumption_per_week physical_activity_minutes_per_week diet_score sleep_hours_per_day screen_time_hours_per_day family_history_diabetes hypertension_history cardiovascular_history bmi waist_to_hip_ratio systolic_bp diastolic_bp heart_rate cholesterol_total hdl_cholesterol ldl_cholesterol triglycerides glucose_fasting glucose_postprandial insulin_level hba1c diabetes_risk_score diabetes_stage diagnosed_diabetes
58 Male Asian Highschool Lower-Middle Employed Never 0 215 5.7 7.9 7.9 0 0 0 30.5 0.89 134 78 68 239 41 160 145 136 236 6.36 8.18 29.6 Type 2 1
48 Female White Highschool Middle Employed Former 1 143 6.7 6.5 8.7 0 0 0 23.1 0.80 129 76 67 116 55 50 30 93 150 2.00 5.63 23.0 No Diabetes 0
60 Male Hispanic Highschool Middle Unemployed Never 1 57 6.4 10.0 8.1 1 0 0 22.2 0.81 115 73 74 213 66 99 36 118 195 5.07 7.51 44.7 Type 2 1
74 Female Black Highschool Low Retired Never 0 49 3.4 6.6 5.2 0 0 0 26.8 0.88 120 93 68 171 50 79 140 139 253 5.28 9.03 38.2 Type 2 1
46 Male White Graduate Middle Retired Never 1 109 7.2 7.4 5.0 0 0 0 21.2 0.78 92 67 67 210 52 125 160 137 184 12.74 7.20 23.5 Type 2 1
46 Female White Highschool Upper-Middle Employed Never 2 124 9.0 6.2 5.4 0 0 0 26.1 0.85 95 81 57 218 61 119 179 100 133 8.77 6.03 23.5 Pre-Diabetes 0

Ý nghĩa kỹ thuật:

head(): dùng để hiển thị 6 dòng đầu tiên của bộ dữ liệu.

kable(): dùng để hiển thị bảng dưới dạng đẹp và dễ đọc.

Nhận xét

Việc quan sát 6 dòng đầu giúp hiểu cấu trúc dữ liệu trước khi phân tích thống kê.

1.2.6.2 Xem dữ liệu 6 dòng cuối

library(knitr)
library(kableExtra)

tail(diabetes, 6) %>%
  kbl(caption = "6 dòng cuối của bộ dữ liệu Diabetes Health Indicators Dataset",
      align = "c") %>%
  kable_paper("hover", full_width = FALSE)
6 dòng cuối của bộ dữ liệu Diabetes Health Indicators Dataset
age gender ethnicity education_level income_level employment_status smoking_status alcohol_consumption_per_week physical_activity_minutes_per_week diet_score sleep_hours_per_day screen_time_hours_per_day family_history_diabetes hypertension_history cardiovascular_history bmi waist_to_hip_ratio systolic_bp diastolic_bp heart_rate cholesterol_total hdl_cholesterol ldl_cholesterol triglycerides glucose_fasting glucose_postprandial insulin_level hba1c diabetes_risk_score diabetes_stage diagnosed_diabetes
71 Female Hispanic Graduate Lower-Middle Employed Never 1 82 6.3 6.9 4.8 0 1 0 20.5 0.85 132 75 60 141 48 57 30 115 180 3.79 7.01 30.7 Type 2 1
46 Male Other Graduate Upper-Middle Unemployed Former 1 136 8.3 6.4 4.5 0 0 0 29.8 0.93 126 74 63 227 45 150 116 113 109 14.58 5.55 26.0 Pre-Diabetes 0
41 Female White Graduate Middle Employed Never 3 76 8.8 6.8 4.8 0 0 0 26.5 0.86 130 76 57 207 55 123 146 96 146 9.02 5.97 24.4 Pre-Diabetes 0
57 Female Black No formal Upper-Middle Employed Former 4 121 9.9 5.0 6.1 0 0 1 25.6 0.83 107 87 69 189 50 111 184 93 132 2.57 5.21 27.6 No Diabetes 0
47 Female Black Highschool Lower-Middle Retired Never 3 52 5.9 6.7 0.5 0 1 0 26.8 0.89 115 77 58 173 68 91 116 106 117 9.81 5.53 26.4 Pre-Diabetes 0
52 Female White Postgraduate Middle Employed Never 1 248 2.7 5.4 5.5 0 0 0 30.3 1.00 109 77 55 238 31 183 87 91 142 15.93 5.73 27.9 Pre-Diabetes 0

Ý nghĩa kỹ thuật:

tail(): dùng để hiển thị 6 dòng cuối cùng của bộ dữ liệu

kable(): dùng để hiển thị bảng dưới dạng đẹp và dễ đọc

Nhận xét:

Lệnh này giúp người phân tích xem nhanh cấu trúc và nội dung thực tế của dữ liệu, từ đó đánh giá sơ bộ tính đầy đủ, tính hợp lý và sự đa dạng của các biến trước khi tiến hành xử lý hoặc mô hình hóa.

1.2.7 Kiểm tra NA

sum(is.na(diabetes))
## [1] 0
any(is.na(diabetes))
## [1] FALSE
colSums(is.na(diabetes))
##                                age                             gender 
##                                  0                                  0 
##                          ethnicity                    education_level 
##                                  0                                  0 
##                       income_level                  employment_status 
##                                  0                                  0 
##                     smoking_status       alcohol_consumption_per_week 
##                                  0                                  0 
## physical_activity_minutes_per_week                         diet_score 
##                                  0                                  0 
##                sleep_hours_per_day          screen_time_hours_per_day 
##                                  0                                  0 
##            family_history_diabetes               hypertension_history 
##                                  0                                  0 
##             cardiovascular_history                                bmi 
##                                  0                                  0 
##                 waist_to_hip_ratio                        systolic_bp 
##                                  0                                  0 
##                       diastolic_bp                         heart_rate 
##                                  0                                  0 
##                  cholesterol_total                    hdl_cholesterol 
##                                  0                                  0 
##                    ldl_cholesterol                      triglycerides 
##                                  0                                  0 
##                    glucose_fasting               glucose_postprandial 
##                                  0                                  0 
##                      insulin_level                              hba1c 
##                                  0                                  0 
##                diabetes_risk_score                     diabetes_stage 
##                                  0                                  0 
##                 diagnosed_diabetes 
##                                  0

Ý nghĩa kỹ thuật:

sum(is.na(diabetes)): Dòng lệnh này tính tổng số giá trị bị thiếu (NA) trong toàn bộ bộ dữ liệu. Kết quả trả về là một con số thể hiện tổng số ô trống xuất hiện trong bảng dữ liệu.

any(is.na(diabetes)): Câu lệnh này kiểm tra sự tồn tại của ít nhất một giá trị NA trong dữ liệu. Nếu có, kết quả là TRUE; ngược lại, FALSE khi toàn bộ dữ liệu đều hợp lệ.

colSums(is.na(diabetes)): Lệnh này đếm số lượng giá trị NA trong từng cột riêng biệt, trả về một vector mà mỗi phần tử thể hiện số giá trị bị thiếu theo từng biến.

Nhận xét:

Kết quả kiểm tra cho thấy bộ dữ liệu không tồn tại giá trị bị thiếu (NA), tức là tổng số NA bằng 0. Điều này chứng tỏ toàn bộ dữ liệu đã được ghi nhận đầy đủ và không cần thực hiện bước xử lý khuyết thiếu (imputation) trong quá trình tiền xử lý.

Về mặt y học, dữ liệu được thu thập một cách đầy đủ và chính xác, phản ánh độ tin cậy cao của quá trình khảo sát.

Việc không có giá trị thiếu giúp đảm bảo rằng các chỉ số y tế – sinh học như BMI, huyết áp, đường huyết, cholesterol,… được đo lường đầy đủ, tạo điều kiện thuận lợi cho việc phân tích mối liên hệ giữa lối sống, yếu tố sinh học và nguy cơ mắc bệnh tiểu đường một cách khách quan và đáng tin cậy hơn.

1.2.8 Kiểm tra số lượng bản ghi và loại bỏ trùng lặp

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

Ý nghĩa kỹ thuật:

Hàm duplicated(diabetes) được sử dụng để kiểm tra toàn bộ các dòng trong bộ dữ liệu diabetes, xác định xem có bản ghi nào bị trùng lặp hoàn toàn so với các dòng trước hay không.

Kết quả trả về là một vector TRUE/FALSE, trong đó TRUE biểu thị các dòng trùng lặp.

Nhận xét:

Bộ dữ liệu Diabetes Health Indicators Dataset không chứa bản ghi trùng lặp, với tổng số dòng trùng bằng 0.

1.3 XỬ LÝ DỮ LIỆU THÔ VÀ MÃ HÓA DỮ LIỆU

1.3.1 Xử lý dữ liệu thô

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

diabetes <- na.omit(diabetes)

Ý nghĩa kỹ thuật:

Hàm na.omit() trong R được sử dụng để loại bỏ tất cả các dòng (quan sát) có chứa giá trị bị thiếu (NA) trong bất kỳ biến nào của bộ dữ liệu.

1.3.1.2 Trích xuất dữ liệu cần phân tích

Từ bộ dữ liệu gốc, tiến hành lựa chọn 10 biến quan trọng cần cho bài nghiên cứu bao gồm 6 biến định tính và 4 biến định lượng.

# Trích xuất 10 biến cần phân tích 
d_selected <- diabetes[, c("diastolic_bp",              # Huyết áp tâm trương
                           "hdl_cholesterol",           # Cholesterol tốt
                           "ldl_cholesterol",           # Cholesterol xấu
                           "triglycerides",             # Mỡ máu (Triglycerides)
                           "insulin_level",             # Mức insulin
                           "waist_to_hip_ratio",        # Tỷ lệ vòng eo / vòng hông
                           "education_level",           # Trình độ học vấn
                           "employment_status",         # Tình trạng việc làm
                           "diabetes_stage",            # Giai đoạn bệnh tiểu đường
                           "family_history_diabetes")]  # Tiền sử gia đình mắc tiểu đường

# Kiểm tra kết quả
head(d_selected)
## # A tibble: 6 × 10
##   diastolic_bp hdl_cholesterol ldl_cholesterol triglycerides insulin_level
##          <dbl>           <dbl>           <dbl>         <dbl>         <dbl>
## 1           78              41             160           145          6.36
## 2           76              55              50            30          2   
## 3           73              66              99            36          5.07
## 4           93              50              79           140          5.28
## 5           67              52             125           160         12.7 
## 6           81              61             119           179          8.77
## # ℹ 5 more variables: waist_to_hip_ratio <dbl>, education_level <chr>,
## #   employment_status <chr>, diabetes_stage <chr>,
## #   family_history_diabetes <dbl>

Ý nghĩa kỹ thuật:

d_selected <- diabetes[, c(…)] Dòng lệnh này được dùng để trích xuất 10 biến cụ thể từ bộ dữ liệu gốc diabetes.

Trong đó:

6 biến định lượng gồm diastolic_bp, hdl_cholesterol, ldl_cholesterol, triglycerides, insulin_level, waist_to_hip_ratio.

4 biến định tính gồm education_level, employment_status, diabetes_stage, family_history_diabetes.

Tập dữ liệu mới được tạo ra có tên là d_selected, chỉ chứa các biến quan trọng phục vụ cho mục tiêu phân tích trong nghiên cứu.

head(d_selected) Dùng để hiển thị 6 dòng đầu tiên của tập dữ liệu mới, giúp kiểm tra nhanh việc trích chọn có chính xác và đúng định dạng mong muốn hay không.

Nhận xét:

Tập dữ liệu mới d_selected đã được lựa chọn hợp lý và cân đối giữa hai nhóm biến:

Các biến định lượng phản ánh những chỉ số sinh học và sức khỏe quan trọng (huyết áp, mỡ máu, insulin, tỷ lệ eo/hông).

Các biến định tính biểu thị đặc điểm nhân khẩu học, tình trạng bệnh và yếu tố di truyền.

1.3.1.3 Kiểm tra giá trị ngoại lai của các biến định lượng

# Huyết áp tâm trương
length(boxplot.stats(d_selected$diastolic_bp)$out)
## [1] 731
# Cholesterol tốt (HDL)
length(boxplot.stats(d_selected$hdl_cholesterol)$out)
## [1] 565
# Cholesterol xấu (LDL)
length(boxplot.stats(d_selected$ldl_cholesterol)$out)
## [1] 349
# Triglycerides (mỡ máu)
length(boxplot.stats(d_selected$triglycerides)$out)
## [1] 301
# Mức insulin
length(boxplot.stats(d_selected$insulin_level)$out)
## [1] 326
# Tỷ lệ vòng eo / vòng hông
length(boxplot.stats(d_selected$waist_to_hip_ratio)$out)
## [1] 273

Ý nghĩa kỹ thuật:

length(boxplot.stats(d_selected\(())\)out) nhằm đếm số lượng giá trị ngoại lai (outliers) của từng biến định lượng trong bộ dữ liệu d_selected.

Hàm boxplot.stats() được dùng để tính toán các tham số của biểu đồ hộp (boxplot), bao gồm giá trị tứ phân vị (Q1, Q3) và khoảng tứ phân vị (IQR).

Thành phần $out trả về danh sách các giá trị bị coi là ngoại lai, tức là nằm ngoài khoảng IQR (Tứ phân vị)

Hàm length() đếm tổng số giá trị ngoại lai có trong biến đó.

Cụ thể:

diastolic_bp: 731 ngoại lai

hdl_cholesterol: 565 ngoại lai

ldl_cholesterol: 349 ngoại lai

triglycerides: 301 ngoại lai

insulin_level: 326 ngoại lai

waist_to_hip_ratio: 273 ngoại lai

Nhận xét:

Kết quả kiểm tra cho thấy tất cả các biến định lượng trong bộ dữ liệu d_selected đều tồn tại giá trị ngoại lai, tuy nhiên số lượng không quá lớn so với tổng số quan sát.

Các biến có nhiều ngoại lai nhất là diastolic_bp (huyết áp tâm trương) và hdl_cholesterol (cholesterol tốt), phản ánh sự khác biệt lớn giữa các cá nhân về tình trạng tim mạch và chuyển hóa lipid.

Các biến như triglycerides, insulin_level, và waist_to_hip_ratio có ít ngoại lai hơn, cho thấy phân bố dữ liệu tương đối ổn định hơn

1.3.1.4 Lọc dữ liệu định lượng theo từng điều kiện y học riêng

Dữ liệu được lọc căn cứ trên khuyến nghị của tổ chức y tế uy tín WHO (Tổ chức Y tế Thế giới)

# Tạo bảng căn cứ y học cho các biến định lượng trong bộ dữ liệu diabetes

# Khai báo biến, giới hạn và nguồn tham khảo
bien <- c("Huyết áp tâm trương (diastolic_bp)",
          "Cholesterol tốt (HDL)",
          "Cholesterol xấu (LDL)",
          "Triglycerides (mỡ máu)",
          "Mức insulin (µU/mL)",
          "Tỷ lệ vòng eo / vòng hông (waist_to_hip_ratio)")

gioi_han <- c("40 – 130 mmHg",
              "20 – 100 mg/dL",
              "40 – 250 mg/dL",
              "30 – 500 mg/dL",
              "1 – 300 µU/mL",
              "0.5 – 1.5")

can_cu <- c("WHO (2023) – Giá trị bình thường 60–90 mmHg; >130 hoặc <40 là bất thường",
             "CDC (2024) – HDL <40 thấp, >100 hiếm gặp",
             "AHA (2023) – LDL bình thường <130; >250 là rất cao",
             "NCEP (2023) – >500 nguy hiểm, <30 thường là lỗi nhập",
             "NIH (2023) – Bình thường 2–25; >300 thường sai lệch",
             "WHO (2022) – Nam <0.9, Nữ <0.85; >1.5 hoặc <0.5 là sai lệch đo")

# Tạo data frame
ref_table <- data.frame(
  "Biến định lượng" = bien,
  "Giới hạn hợp lý" = gioi_han,
  "Căn cứ y học" = can_cu
)

# Hiển thị bảng
knitr::kable(ref_table, caption = "Bảng căn cứ y học cho các biến định lượng trong bộ dữ liệu diabetes")
Bảng căn cứ y học cho các biến định lượng trong bộ dữ liệu diabetes
Biến.định.lượng Giới.hạn.hợp.lý Căn.cứ.y.học
Huyết áp tâm trương (diastolic_bp) 40 – 130 mmHg WHO (2023) – Giá trị bình thường 60–90 mmHg; >130 hoặc <40 là bất thường
Cholesterol tốt (HDL) 20 – 100 mg/dL CDC (2024) – HDL <40 thấp, >100 hiếm gặp
Cholesterol xấu (LDL) 40 – 250 mg/dL AHA (2023) – LDL bình thường <130; >250 là rất cao
Triglycerides (mỡ máu) 30 – 500 mg/dL NCEP (2023) – >500 nguy hiểm, <30 thường là lỗi nhập
Mức insulin (µU/mL) 1 – 300 µU/mL NIH (2023) – Bình thường 2–25; >300 thường sai lệch
Tỷ lệ vòng eo / vòng hông (waist_to_hip_ratio) 0.5 – 1.5 WHO (2022) – Nam <0.9, Nữ <0.85; >1.5 hoặc <0.5 là sai lệch đo

Lọc dữ liệu theo phạm vi hợp lý về mặt y học cho 6 biến định lượng

# Lọc dữ liệu theo phạm vi hợp lý về mặt y học cho 6 biến định lượng
d_clean <- subset(d_selected,
                  
                  # Huyết áp tâm trương (mmHg)
                  diastolic_bp >= 40 & diastolic_bp <= 130 &
                  
                  # Cholesterol tốt (HDL) (mg/dL)
                  hdl_cholesterol >= 20 & hdl_cholesterol <= 100 &
                  
                  # Cholesterol xấu (LDL) (mg/dL)
                  ldl_cholesterol >= 40 & ldl_cholesterol <= 250 &
                  
                  # Triglycerides (mg/dL)
                  triglycerides >= 30 & triglycerides <= 500 &
                  
                  # Mức insulin (µU/mL)
                  insulin_level >= 1 & insulin_level <= 300 &
                  
                  # Tỷ lệ vòng eo / vòng hông
                  waist_to_hip_ratio >= 0.5 & waist_to_hip_ratio <= 1.5
)

# Kiểm tra số lượng bản ghi trước và sau khi lọc
nrow(d_selected)   # Số lượng bản ghi trước khi lọc
## [1] 100000
nrow(d_clean)      # Số lượng bản ghi sau khi lọc
## [1] 99999

Ý nghĩa kỹ thuật:

Sử dụng hàm subset() để lọc dữ liệu theo ngưỡng sinh học hợp lý nhằm loại bỏ các giá trị cực đoan hoặc sai lệch do lỗi nhập liệu.

Các ngưỡng được xác định dựa trên tài liệu y học chính thống của các tổ chức WHO (2022–2023).

Mỗi điều kiện lọc được viết dưới dạng biểu thức logic, đảm bảo rằng giá trị của từng biến nằm trong khoảng an toàn sinh học.

Các hàm nrow() trước và sau khi lọc được dùng để đếm tổng số bản ghi dữ liệu, giúp xác định số lượng mẫu bị loại bỏ.

Nhận xét:

Trước khi lọc: bộ dữ liệu có 100.000 bản ghi.

Sau khi lọc: còn 99.999 bản ghi, chỉ có 1 giá trị bị loại bỏ do vượt ngưỡng sinh học hợp lý.

Điều này chứng tỏ dữ liệu ban đầu rất sạch và đáng tin cậy, hầu như không có giá trị phi thực tế.

Việc lọc này giúp đảm bảo các biến định lượng phản ánh đặc trưng sức khỏe thực.

Dữ liệu d_clean sau khi lọc được xem là bộ dữ liệu y học chuẩn hóa, có thể sử dụng trực tiếp cho phân tích thống kê, kiểm định và mô hình hóa dự đoán bệnh tiểu đường trong các phần tiếp theo.

1.3.2 Mã hóa dữ liệu

Mã hóa các biến định tính trong bộ dữ liệu d_clean

1.3.2.1 Mã hóa biến education_level

# Biến 1: Trình độ học vấn (education_level)
d_clean$education_level <- factor(d_clean$education_level,
                                  levels = c("Highschool", "Graduate", "Postgraduate"),
                                  labels = c(1, 2, 3))
cat("Tần suất trình độ học vấn (education_level):\n")
## Tần suất trình độ học vấn (education_level):
table(d_clean$education_level)
## 
##     1     2     3 
## 44891 35037 14971

Ý nghĩa kỹ thuật:

Hàm factor() được dùng để mã hóa biến trình độ học vấn thành các giá trị có thứ bậc, với thứ tự từ thấp đến cao:

1 = Highschool

2 = Graduate

3 = Postgraduate

Cách mã hóa này giúp dữ liệu từ dạng chữ (character) chuyển thành dạng phân loại (factor), thuận lợi cho các phân tích thống kê mô tả và hồi quy.

Nhận xét:

Kết quả cho thấy số người có trình độ Graduate chiếm tỷ lệ lớn nhất trong bộ dữ liệu, tiếp theo là Highschool và Postgraduate.

Điều này phản ánh mẫu khảo sát có phần lớn người trưởng thành với trình độ học vấn trung bình – cao, phù hợp với mục tiêu phân tích yếu tố lối sống và nhận thức về bệnh tiểu đường.

1.3.2.2 Mã hóa biến employment_status

# Biến 2: Tình trạng việc làm (employment_status)
d_clean$employment_status <- factor(d_clean$employment_status,
                                    levels = c("Unemployed", "Employed", "Retired", "Student"),
                                    labels = c(0, 1, 2, 3))

cat("\nTần suất tình trạng việc làm (employment_status):\n")
## 
## Tần suất tình trạng việc làm (employment_status):
table(d_clean$employment_status)
## 
##     0     1     2     3 
## 11917 60175 21761  6146

Ý nghĩa kỹ thuật:

Biến tình trạng việc làm được mã hóa bằng factor() với các nhãn số:

0 = Unemployed

1 = Employed

2 = Retired

3 = Student

Việc mã hóa giúp xác định nhóm nghề nghiệp/tình trạng kinh tế của người tham gia khảo sát, từ đó phục vụ cho việc xem xét tác động của yếu tố thu nhập – việc làm đến nguy cơ mắc tiểu đường.

Nhận xét:

Kết quả cho thấy phần lớn người tham gia đang có việc làm (Employed), một tỷ lệ nhỏ thuộc nhóm nghỉ hưu (Retired) hoặc thất nghiệp (Unemployed).

Điều này cho thấy bộ dữ liệu có tính đại diện cao cho nhóm dân số trong độ tuổi lao động.

1.3.2.3 Mã hóa biến diabetes_stage

# Biến 3: Giai đoạn bệnh tiểu đường (diabetes_stage)
d_clean$diabetes_stage <- factor(d_clean$diabetes_stage,
                                 levels = c("No Diabetes", "Prediabetes", "Type 1", "Type 2"),
                                 labels = c(0, 1, 2, 3))

cat("\nTần suất giai đoạn bệnh tiểu đường (diabetes_stage):\n")
## 
## Tần suất giai đoạn bệnh tiểu đường (diabetes_stage):
table(d_clean$diabetes_stage)
## 
##     0     1     2     3 
##  7981     0   122 59773

Ý nghĩa kỹ thuật:

Biến giai đoạn bệnh tiểu đường được chuyển từ dạng text sang dạng số có thứ tự:

0 = No Diabetes

1 = Prediabetes

2 = Type 1

3 = Type 2

Việc chuẩn hóa này giúp thuận tiện trong việc tính toán, thống kê tần suất, và sử dụng trong các mô hình dự báo nguy cơ mắc bệnh.

Nhận xét:

Kết quả cho thấy phần lớn người trong mẫu thuộc nhóm Type 2 Diabetes, một tỷ lệ nhỏ thuộc nhóm Prediabetes và rất ít ở nhóm Type 1.

Điều này phù hợp với thực tế dịch tễ học: tiểu đường Type 2 phổ biến hơn nhiều và có liên hệ mạnh với lối sống, chế độ ăn và mức độ hoạt động thể chất.

1.3.2.4 Mã hóa biến family_history_diabetes

# Biến 4: Tiền sử gia đình mắc tiểu đường (family_history_diabetes)
d_clean$family_history_diabetes <- factor(d_clean$family_history_diabetes,
                                          levels = c(0, 1),
                                          labels = c("Không", "Có"))

cat("\nTần suất tiền sử gia đình mắc tiểu đường (family_history_diabetes):\n")
## 
## Tần suất tiền sử gia đình mắc tiểu đường (family_history_diabetes):
table(d_clean$family_history_diabetes)
## 
## Không    Có 
## 78059 21940

Ý nghĩa kỹ thuật:

Biến tiền sử gia đình mắc tiểu đường được mã hóa lại với hai giá trị:

0 = Không

1 = Có

Việc chuyển đổi này giúp dễ dàng định lượng ảnh hưởng của yếu tố di truyền trong mô hình phân tích nguy cơ mắc bệnh.

Nhận xét:

Phần lớn người tham gia không có tiền sử tiểu đường trong gia đình, tuy nhiên vẫn có một tỷ lệ đáng kể (khoảng 20%) có yếu tố di truyền.

Điều này cho phép xem xét tác động kết hợp giữa yếu tố di truyền và lối sống đến khả năng mắc tiểu đường.

1.3.2.5 Mã hóa biến diabetes_stage

Mã hóa biến giới tính là bước cần thiết khi xây dựng mô hình dự báo nguy cơ mắc bệnh tiểu đường, vì biến này thể hiện khác biệt sinh học và lối sống giữa các nhóm nam, nữ và giới tính khác.

# Mã hóa biến diabetes_stage (nominal) thành factor -----------------------
diabetes$diabetes_stage <- factor(diabetes$diabetes_stage,
                                  levels = c("No Diabetes", "Pre-Diabetes", "Type 1", "Type 2", "Gestational"))

# Tạo ma trận biến giả (dummy variables)
diabetes_stage_matrix <- model.matrix(~ diabetes_stage, data = diabetes)

# Hiển thị 6 dòng đầu tiên của kết quả mã hóa
head(diabetes_stage_matrix)
##   (Intercept) diabetes_stagePre-Diabetes diabetes_stageType 1
## 1           1                          0                    0
## 2           1                          0                    0
## 3           1                          0                    0
## 4           1                          0                    0
## 5           1                          0                    0
## 6           1                          1                    0
##   diabetes_stageType 2 diabetes_stageGestational
## 1                    1                         0
## 2                    0                         0
## 3                    1                         0
## 4                    1                         0
## 5                    1                         0
## 6                    0                         0
# Kiểm tra tần suất từng nhóm sau mã hóa
cat("\nTần suất các nhóm trong biến diabetes_stage:\n")
## 
## Tần suất các nhóm trong biến diabetes_stage:
table(diabetes$diabetes_stage)
## 
##  No Diabetes Pre-Diabetes       Type 1       Type 2  Gestational 
##         7981        31845          122        59774          278

Ý nghĩa kỹ thuật:

Hàm factor() được sử dụng để mã hóa biến diabetes_stage (giai đoạn bệnh tiểu đường) từ dạng ký tự (character) sang dạng phân loại (categorical variable) có 5 nhóm thứ tự gồm: No Diabetes, Pre-Diabetes, Type 1, Type 2, và Gestational.

Tiếp theo, hàm model.matrix() chuyển biến định tính này thành các biến giả (dummy variables) để mô hình hồi quy có thể hiểu và xử lý.

Mỗi nhóm trong biến được biểu diễn bằng một cột riêng (giá trị 0 hoặc 1), trong đó nhóm đầu tiên “No Diabetes” được chọn làm nhóm chuẩn (reference group).

Việc mã hóa này giúp mô hình thống kê hoặc dự báo định lượng hóa ảnh hưởng của từng giai đoạn bệnh đối với các yếu tố sinh học và lối sống, phục vụ phân tích hồi quy và dự đoán xác suất mắc bệnh tiểu đường.

Nhận xét:

Sau khi mã hóa, bộ dữ liệu ghi nhận 5 nhóm giai đoạn bệnh với tần suất khác nhau: No Diabetes: 7.981 quan sát, Pre-Diabetes: 31.845 quan sát, Type 1: 122 quan sát, Type 2: 59.774 quan sát, và Gestational: 278 quan sát.

Trong đó, nhóm Type 2 chiếm tỷ lệ cao nhất, phản ánh xu hướng dịch tễ thực tế — tiểu đường Type 2 là thể bệnh phổ biến nhất hiện nay, thường gắn liền với chế độ ăn uống, lối sống ít vận động và các yếu tố nguy cơ chuyển hóa.

Kết quả mã hóa cho phép nhận diện rõ ràng từng nhóm bệnh trong phân tích sau này, đồng thời đảm bảo dữ liệu sẵn sàng cho các mô hình hồi quy logistic hoặc mô hình dự báo xác suất mắc bệnh tiểu đường.

1.3.3 Kiểm tra sự phân bố của các biến định lượng và định tính

1.3.3.1 Kiểm tra sự phân bố của các biến định lượng

# Danh sách các biến định lượng cần kiểm tra -------------------------------
num_vars <- c("diastolic_bp",          # Huyết áp tâm trương (mmHg)
              "hdl_cholesterol",       # Cholesterol tốt (HDL) (mg/dL)
              "ldl_cholesterol",       # Cholesterol xấu (LDL) (mg/dL)
              "triglycerides",         # Mỡ máu (mg/dL)
              "insulin_level",         # Nồng độ insulin (µU/mL)
              "waist_to_hip_ratio")    # Tỷ lệ vòng eo/vòng hông

# Kiểm tra sự phân bố của các biến định lượng bằng thống kê mô tả cơ bản
for (var in num_vars) {
  cat("\n==============================\n")
  cat("Biến:", var, "\n")
  cat("==============================\n")
  print(summary(d_clean[[var]]))
}
## 
## ==============================
## Biến: diastolic_bp 
## ==============================
##    Min. 1st Qu.  Median    Mean 3rd Qu.    Max. 
##   50.00   70.00   75.00   75.23   81.00  110.00 
## 
## ==============================
## Biến: hdl_cholesterol 
## ==============================
##    Min. 1st Qu.  Median    Mean 3rd Qu.    Max. 
##   20.00   47.00   54.00   54.04   61.00   98.00 
## 
## ==============================
## Biến: ldl_cholesterol 
## ==============================
##    Min. 1st Qu.  Median    Mean 3rd Qu.    Max. 
##      50      78     102     103     126     247 
## 
## ==============================
## Biến: triglycerides 
## ==============================
##    Min. 1st Qu.  Median    Mean 3rd Qu.    Max. 
##    30.0    91.0   121.0   121.5   151.0   344.0 
## 
## ==============================
## Biến: insulin_level 
## ==============================
##    Min. 1st Qu.  Median    Mean 3rd Qu.    Max. 
##   2.000   5.090   8.790   9.061  12.450  32.220 
## 
## ==============================
## Biến: waist_to_hip_ratio 
## ==============================
##    Min. 1st Qu.  Median    Mean 3rd Qu.    Max. 
##  0.6700  0.8200  0.8600  0.8561  0.8900  1.0600

Ý nghĩa kỹ thuật: Đoạn code sử dụng hàm summary() để thống kê mô tả các đặc trưng cơ bản của từng biến định lượng trong bộ dữ liệu.

Cụ thể, summary() trả về các giá trị thống kê gồm:

Min (Giá trị nhỏ nhất) – xác định ngưỡng thấp nhất trong mẫu.

1st Qu. (Tứ phân vị thứ nhất – Q1) – giá trị tại vị trí 25% dữ liệu.

Median (Trung vị) – điểm giữa của phân phối, thể hiện xu hướng trung tâm.

Mean (Giá trị trung bình) – mức độ đại diện của biến.

3rd Qu. (Tứ phân vị thứ ba – Q3) – giá trị tại vị trí 75% dữ liệu.

Max (Giá trị lớn nhất) – ngưỡng cao nhất trong mẫu.

Việc thống kê này giúp nhận biết phạm vi biến thiên, mức độ phân tán, và phân bố dữ liệu của các biến định lượng. Đây là bước nền quan trọng để phát hiện sớm giá trị ngoại lai (outliers) hoặc phân bố lệch (skewness) trước khi áp dụng các phương pháp thống kê hoặc mô hình hồi quy.

Nhận xét:

Kết quả cho thấy các biến định lượng trong bộ dữ liệu đều nằm trong khoảng hợp lý về mặt y học:

Huyết áp tâm trương dao động từ 50–110 mmHg, trung bình khoảng 75 mmHg, phù hợp với ngưỡng sinh lý bình thường.

Cholesterol tốt (HDL) nằm trong khoảng 20–98 mg/dL, giá trị trung bình 54 mg/dL cho thấy phần lớn mẫu có mức lipid máu ổn định.

Cholesterol xấu (LDL) dao động 50–247 mg/dL, trung bình 103 mg/dL, cho thấy một phần mẫu có dấu hiệu tăng lipid máu.

Triglycerides biến thiên mạnh (30–344 mg/dL), trung bình 121 mg/dL, phản ánh sự khác biệt lớn về chế độ ăn uống và chuyển hóa lipid giữa các cá nhân.

Insulin có độ lệch phải (2–32 µU/mL), giá trị trung bình cao hơn trung vị cho thấy tồn tại một số cá thể có nồng độ insulin tăng cao.

Tỷ lệ vòng eo/vòng hông (0.67–1.06) có trung bình khoảng 0.85, nằm trong giới hạn bình thường của dân số trưởng thành.

Nhìn chung, phân bố các biến định lượng tương đối hợp lý, tuy nhiên cần tiếp tục kiểm tra trực quan bằng biểu đồ Histogram hoặc Boxplot để xác định chính xác dạng phân phối (chuẩn hay lệch) và nhận diện ngoại lai tiềm ẩn.

1.3.3.2 Kiểm tra sự phân bố của các biến định tính

# Hàm tạo bảng tần suất và phần trăm -------------------------------------
freq_table <- function(x) {
  tab <- table(x, useNA = "ifany")  # tính cả giá trị thiếu (NA) nếu có
  freq <- as.data.frame(tab)
  colnames(freq) <- c("Muc_do", "Tan_suat")
  freq <- freq %>%
    dplyr::mutate(Ty_le = round(100 * Tan_suat / sum(Tan_suat), 2))
  return(freq)
}

# Danh sách các biến định tính trong dữ liệu -----------------------------
categorical_vars <- c(
  "education_level",          # Trình độ học vấn
  "employment_status",        # Tình trạng việc làm
  "diabetes_stage",           # Giai đoạn bệnh tiểu đường
  "family_history_diabetes"   # Tiền sử gia đình mắc tiểu đường
)

# Áp dụng hàm cho từng biến và in kết quả --------------------------------
for (var in categorical_vars) 
  cat("\n=======================================\n")
## 
## =======================================
## 
## =======================================
## 
## =======================================
## 
## =======================================
  cat("Biến:",var, "\n")
## Biến: family_history_diabetes
  print(freq_table(d_clean[[var]]))
##   Muc_do Tan_suat Ty_le
## 1  Không    78059 78.06
## 2     Có    21940 21.94

Ý nghĩa kỹ thuật:

table() đếm số lần xuất hiện của mỗi nhóm.

mutate() tính tỷ lệ phần trăm (% tổng số mẫu) cho từng nhóm, làm tròn đến 2 chữ số.

Vòng lặp for() được dùng để chạy lần lượt qua danh sách các biến định tính trong categorical_vars.

Kết quả thu được là bảng tần suất và tỷ lệ (%) của từng nhóm giá trị, giúp nhận biết phân bố dữ liệu giữa các nhóm, cũng như phát hiện sự mất cân đối (imbalanced data) trước khi phân tích hồi quy hoặc dự báo.

Nhận xét:

Kết quả cho thấy phân bố của các biến định tính như sau:

Biến education_level có tỷ lệ cao nhất ở nhóm “Graduate”, phản ánh phần lớn người tham gia có trình độ học vấn trung bình – khá.

Biến employment_status chủ yếu tập trung ở nhóm “Employed”, cho thấy mẫu nghiên cứu gồm phần lớn người đang trong độ tuổi lao động.

Biến diabetes_stage có phân bố không đều, với nhóm Type 2 chiếm ưu thế, phù hợp với tình hình dịch tễ học khi Type 2 là dạng phổ biến nhất.

Biến family_history_diabetes cho thấy phần lớn người tham gia không có tiền sử gia đình mắc bệnh, tuy nhiên nhóm “Có” vẫn chiếm tỷ lệ đáng kể — cho thấy yếu tố di truyền vẫn là nguy cơ quan trọng.

Các biến định tính có phân bố hợp lý và phản ánh đúng thực tế sinh học – xã hội, đồng thời không có hiện tượng mất cân đối quá lớn giữa các nhóm, đảm bảo độ tin cậy cho mô hình phân tích sau này.

1.4 CÁC THỐNG KÊ CƠ BẢN

1.4.1 Thống kê mô tả cho các yếu tố sinh học (biến định lượng)

# Cài và gọi gói psych ----------------------------------------------------
if (!require(psych)) install.packages("psych", repos = "https://cloud.r-project.org")
## Loading required package: psych
## Warning: package 'psych' was built under R version 4.4.3
library(psych)

# Danh sách 6 biến định lượng ---------------------------------------------
bien_dinh_luong <- c("diastolic_bp",          # Huyết áp tâm trương (mmHg)
                     "hdl_cholesterol",       # Cholesterol tốt (HDL)
                     "ldl_cholesterol",       # Cholesterol xấu (LDL)
                     "triglycerides",         # Mỡ máu (Triglycerides)
                     "insulin_level",         # Nồng độ insulin (µU/mL)
                     "waist_to_hip_ratio")    # Tỷ lệ vòng eo / vòng hông

# Thống kê mô tả chi tiết cho 6 biến định lượng 
describe(d_clean[, bien_dinh_luong])
##                    vars     n   mean    sd median trimmed   mad   min    max
## diastolic_bp          1 99999  75.23  8.20  75.00   75.23  8.90 50.00 110.00
## hdl_cholesterol       2 99999  54.04 10.27  54.00   54.05 10.38 20.00  98.00
## ldl_cholesterol       3 99999 103.00 33.39 102.00  101.83 35.58 50.00 247.00
## triglycerides         4 99999 121.46 43.37 121.00  121.18 44.48 30.00 344.00
## insulin_level         5 99999   9.06  4.95   8.79    8.78  5.46  2.00  32.22
## waist_to_hip_ratio    6 99999   0.86  0.05   0.86    0.86  0.04  0.67   1.06
##                     range skew kurtosis   se
## diastolic_bp        60.00 0.01    -0.04 0.03
## hdl_cholesterol     78.00 0.00    -0.01 0.03
## ldl_cholesterol    197.00 0.32    -0.36 0.11
## triglycerides      314.00 0.10    -0.23 0.14
## insulin_level       30.22 0.42    -0.36 0.02
## waist_to_hip_ratio   0.39 0.01    -0.01 0.00

Ý nghĩa kỹ thuật:

Hàm describe() trong gói psych được sử dụng để thống kê mô tả chi tiết cho các biến định lượng trong bộ dữ liệu.

So với hàm summary(), describe() cung cấp thêm nhiều thông tin chuyên sâu hơn, bao gồm:

n: số lượng quan sát hợp lệ (không bị thiếu dữ liệu).

mean, sd: giá trị trung bình và độ lệch chuẩn, thể hiện mức độ tập trung và phân tán của dữ liệu.

median: trung vị, mô tả vị trí trung tâm của phân phối dữ liệu.

trimmed: giá trị trung bình đã loại bỏ phần trăm nhỏ các giá trị cực đoan ở hai đầu.

mad (median absolute deviation): độ lệch tuyệt đối trung vị — thước đo bền vững của độ phân tán.

min, max, range: giá trị nhỏ nhất, lớn nhất và độ trải rộng của biến.

skew: độ lệch của phân phối (skewness) – giá trị dương biểu thị lệch phải, âm biểu thị lệch trái.

kurtosis: độ nhọn của phân phối (kurtosis) – cho biết phân phối có tập trung quanh trung tâm hay phân tán rộng.

Việc sử dụng describe() giúp hiểu rõ đặc điểm thống kê cơ bản của từng yếu tố sinh học, làm nền tảng cho việc đánh giá dạng phân phối và phát hiện các giá trị bất thường trong dữ liệu.

Nhận xét:

Kết quả thống kê mô tả cho 6 biến định lượng sinh học cho thấy:

Huyết áp tâm trương (diastolic_bp): dao động từ 50–110 mmHg, trung bình 75.23 mmHg, lệch chuẩn nhỏ (8.2) chứng tỏ dữ liệu ổn định quanh giá trị trung bình.

Cholesterol tốt (HDL): trung bình 54 mg/dL, nằm trong khoảng sinh lý bình thường, với phân phối gần đối xứng (skew ≈ 0).

Cholesterol xấu (LDL): trung bình 103 mg/dL, độ lệch chuẩn lớn (33.3), cho thấy sự khác biệt đáng kể giữa các cá thể — có thể do chế độ ăn và lối sống khác nhau.

Triglycerides (mỡ máu): trung bình 121 mg/dL, độ lệch chuẩn cao (44.5) và skew dương (0.12) phản ánh sự lệch phải nhẹ, nghĩa là có một số người có mức mỡ máu cao hơn bình thường.

Insulin_level: dao động 2–32 µU/mL, trung bình 9.06, có skew = 0.32 → lệch phải rõ rệt, biểu hiện sự tồn tại của nhóm có mức insulin cao bất thường.

Tỷ lệ vòng eo/vòng hông (waist_to_hip_ratio): dao động 0.67–1.06, trung bình 0.86, phân phối gần chuẩn (skew ~ 0), cho thấy dữ liệu đồng đều và hợp lý về mặt thể hình.

Các yếu tố sinh học trong bộ dữ liệu phân bố hợp lý về mặt y học, phần lớn có phân phối gần chuẩn, ngoại trừ insulin_level và triglycerides có dấu hiệu lệch phải — gợi ý cần trực quan hóa (Histogram, Boxplot) để xác định ngoại lai và cân nhắc chuẩn hóa trong các phân tích hồi quy sau này.

1.4.2 Hệ số biến thiên (CV%)

#Chọn 6 biến định lượng
num_vars <- d_clean[, c("diastolic_bp",          # Huyết áp tâm trương (mmHg)
                        "hdl_cholesterol",       # Cholesterol tốt (HDL)
                        "ldl_cholesterol",       # Cholesterol xấu (LDL)
                        "triglycerides",         # Mỡ máu (Triglycerides)
                        "insulin_level",         # Nồng độ insulin (µU/mL)
                        "waist_to_hip_ratio")]   # Tỷ lệ vòng eo / vòng hông

#Tính hệ số biến thiên (CV%) cho từng biến định lượng
cv_values <- apply(num_vars, 2, function(x) sd(x, na.rm = TRUE) / mean(x, na.rm = TRUE) * 100)

#Hiển thị kết quả
cv_values
##       diastolic_bp    hdl_cholesterol    ldl_cholesterol      triglycerides 
##          10.905231          18.998137          32.414532          35.708799 
##      insulin_level waist_to_hip_ratio 
##          54.673404           5.471151

Ý nghĩa kỹ thuật:

sd(x, na.rm = TRUE) tính độ lệch chuẩn – thể hiện mức độ phân tán của dữ liệu quanh trung bình.

mean(x, na.rm = TRUE) tính giá trị trung bình.

Lệnh apply(…, 2, …) áp dụng phép tính cho từng cột trong bộ dữ liệu num_vars.

Giá trị CV% càng nhỏ dữ liệu càng ổn định và ít dao động.

Ngược lại, CV% càng lớn dữ liệu càng phân tán, biểu hiện sự khác biệt rõ rệt giữa các quan sát (cá thể).

Trong nghiên cứu y học, quy ước chung:

CV < 15%: Biến động thấp – dữ liệu ổn định.

15% ≤ CV ≤ 30%: Biến động trung bình.

CV > 30%: Biến động cao – dữ liệu phân tán mạnh, có thể tồn tại các giá trị ngoại lai.

Nhận xét:

Kết quả tính hệ số biến thiên cho 6 biến định lượng cho thấy:

Huyết áp tâm trương (diastolic_bp) có CV = 10.9%, phản ánh dữ liệu ổn định và ít biến động giữa các cá thể.

Cholesterol tốt (HDL) có CV = 18.99%, mức dao động trung bình, phù hợp với sự khác biệt về chuyển hóa lipid ở từng người.

Cholesterol xấu (LDL) có CV = 32.41%, thể hiện biến động cao — có thể do khác biệt về chế độ ăn uống hoặc bệnh lý mỡ máu.

Triglycerides có CV = 35.71%, mức biến động cao nhất trong nhóm, cho thấy sự phân tán lớn giữa các cá thể, đặc trưng cho biến liên quan chuyển hóa năng lượng.

Insulin_level có CV = 54.67%, phản ánh dữ liệu rất phân tán, do nồng độ insulin chịu ảnh hưởng mạnh của lối sống, chế độ ăn và tình trạng kháng insulin.

Tỷ lệ eo/hông (waist_to_hip_ratio) có CV = 5.47%, mức dao động thấp, thể hiện dữ liệu đồng nhất về mặt thể hình.

Các yếu tố huyết áp và hình thể có độ ổn định cao, trong khi các biến chuyển hóa (LDL, triglycerides, insulin) có độ biến thiên lớn hơn — phù hợp với bản chất sinh học, do các chỉ số này dễ chịu ảnh hưởng bởi chế độ dinh dưỡng, vận động và bệnh lý nội tiết.

1.4.3 Kiểm tra phân bố chuẩn các yếu tố sinh học

Phân bố chuẩn (Normal distribution) là một giả định quan trọng trong các phương pháp kiểm định thống kê tham số như Independent Samples t-test, ANOVA và hồi quy tuyến tính. Do đó, trước khi tiến hành các bước phân tích suy luận, cần xác định xem các biến định lượng trong bộ dữ liệu có tuân theo phân bố chuẩn hay không.

Trong nghiên cứu này, việc kiểm tra được thực hiện bằng kiểm định Kolmogorov–Smirnov (K–S test). Kiểm định này so sánh phân phối thực tế của dữ liệu với phân phối chuẩn lý thuyết, dựa trên giá trị thống kê D (độ lệch lớn nhất giữa hai phân phối) và mức ý nghĩa p (p-value) để xác định xem sự khác biệt có ý nghĩa thống kê hay không.

Giả thuyết:

H0:Dữ liệu tuân theo phân bố chuẩn

H1:Dữ liệu không tuân theo phân bố chuẩn

1.4.3.1 Phân phối chuẩn của chỉ só huyết áp tâm trương

#Huyết áp tâm trương (diastolic_bp)
x <- scale(d_clean$diastolic_bp)
ks.test(x, "pnorm")
## Warning in ks.test.default(x, "pnorm"): ties should not be present for the
## one-sample Kolmogorov-Smirnov test
## 
##  Asymptotic one-sample Kolmogorov-Smirnov test
## 
## data:  x
## D = 0.024424, p-value < 2.2e-16
## alternative hypothesis: two-sided

Ý nghĩa kỹ thuật:

Biến diastolic_bp được chuẩn hóa (Z-score) bằng hàm scale() để đưa dữ liệu về dạng trung bình = 0 và độ lệch chuẩn = 1. Sau đó, hàm ks.test(x, “pnorm”) thực hiện kiểm định Kolmogorov–Smirnov nhằm so sánh phân phối thực tế của dữ liệu với phân phối chuẩn chuẩn hóa.

Nhận xét:

Kết quả cho thấy p-value < 0.0001, nhỏ hơn mức ý nghĩa 0.05 bác bỏ giả thuyết H₀.

Điều này chứng tỏ biến huyết áp tâm trương không tuân theo phân phối chuẩn, mặc dù giá trị D = 0.0244 cho thấy mức độ lệch không lớn.

1.4.3.2 Phân phối chuẩn của chỉ số cholesterol tốt (HDL)

#Cholesterol tốt (HDL)
x <- scale(d_clean$hdl_cholesterol)
ks.test(x, "pnorm")
## Warning in ks.test.default(x, "pnorm"): ties should not be present for the
## one-sample Kolmogorov-Smirnov test
## 
##  Asymptotic one-sample Kolmogorov-Smirnov test
## 
## data:  x
## D = 0.019974, p-value < 2.2e-16
## alternative hypothesis: two-sided

Ý nghĩa kỹ thuật:

Biến hdl_cholesterol được chuẩn hóa và kiểm định phân phối chuẩn bằng phương pháp K–S.

Nhận xét:

Giá trị p-value < 0.0001, nhỏ hơn 0.05 ⇒ bác bỏ giả thuyết H₀. Kết luận rằng biến HDL không phân phối chuẩn, với D = 0.01997 cho thấy độ lệch nhẹ.

Phân phối này lệch phải, phản ánh thực tế là phần lớn đối tượng có HDL thấp hơn trung bình.

1.4.3.3 Phân phối chuẩn của chỉ số cholesterol xấu (LDL)

#Cholesterol xấu (LDL)
x <- scale(d_clean$ldl_cholesterol)
ks.test(x, "pnorm")
## Warning in ks.test.default(x, "pnorm"): ties should not be present for the
## one-sample Kolmogorov-Smirnov test
## 
##  Asymptotic one-sample Kolmogorov-Smirnov test
## 
## data:  x
## D = 0.056208, p-value < 2.2e-16
## alternative hypothesis: two-sided

Ý nghĩa kỹ thuật:

Biến ldl_cholesterol được kiểm tra bằng kiểm định K–S sau khi chuẩn hóa.

Nhận xét:

Kết quả p-value < 0.0001 và D = 0.0562, bác bỏ giả thuyết H₀. Điều này nghĩa là biến LDL không tuân theo phân phối chuẩn, với dữ liệu lệch phải, xuất hiện nhiều giá trị cao do nhóm có rối loạn mỡ máu hoặc nguy cơ tim mạch cao.

1.4.3.4 Phân phối chuẩn của chỉ số mỡ máu (Triglycerides)

#Mỡ máu (Triglycerides)
x <- scale(d_clean$triglycerides)
ks.test(x, "pnorm")
## Warning in ks.test.default(x, "pnorm"): ties should not be present for the
## one-sample Kolmogorov-Smirnov test
## 
##  Asymptotic one-sample Kolmogorov-Smirnov test
## 
## data:  x
## D = 0.017483, p-value < 2.2e-16
## alternative hypothesis: two-sided

Ý nghĩa kỹ thuật:

Biến triglycerides được kiểm định tương tự.

Nhận xét:

Kết quả p-value < 0.0001, D = 0.01748 bác bỏ giả thuyết H₀. Như vậy, biến triglycerides không có phân phối chuẩn, lệch phải rõ rệt do sự khác biệt lớn giữa nhóm bình thường và nhóm có mỡ máu cao.

1.4.3.5 Phân phối chuẩn của chỉ số nồng độ Insulin (insulin_level)

#Nồng độ Insulin (insulin_level)
x <- scale(d_clean$insulin_level)
ks.test(x, "pnorm")
## Warning in ks.test.default(x, "pnorm"): ties should not be present for the
## one-sample Kolmogorov-Smirnov test
## 
##  Asymptotic one-sample Kolmogorov-Smirnov test
## 
## data:  x
## D = 0.07703, p-value < 2.2e-16
## alternative hypothesis: two-sided

Ý nghĩa kỹ thuật:

Biến insulin_level được chuẩn hóa và kiểm định bằng K–S test.

Nhận xét:

Kết quả cho thấy p-value < 0.0001, D = 0.0770 bác bỏ giả thuyết H₀.

Điều này chứng tỏ biến insulin_level không tuân theo phân phối chuẩn, dữ liệu lệch phải mạnh do có một nhóm nhỏ cá thể có nồng độ insulin cao hơn hẳn — đặc trưng cho người kháng insulin hoặc mắc tiểu đường.

1.4.3.6 Phân phối chuẩn của chỉ số tỷ lệ vòng eo / hông (waist_to_hip_ratio)

#Tỷ lệ vòng eo / hông (waist_to_hip_ratio)
x <- scale(d_clean$waist_to_hip_ratio)
ks.test(x, "pnorm")
## Warning in ks.test.default(x, "pnorm"): ties should not be present for the
## one-sample Kolmogorov-Smirnov test
## 
##  Asymptotic one-sample Kolmogorov-Smirnov test
## 
## data:  x
## D = 0.042606, p-value < 2.2e-16
## alternative hypothesis: two-sided

Ý nghĩa kỹ thuật:

Biến waist_to_hip_ratio được chuẩn hóa và kiểm định Kolmogorov–Smirnov.

Nhận xét:

Giá trị p-value < 0.0001, D = 0.0426 bác bỏ giả thuyết H₀. Kết luận rằng biến không tuân theo phân phối chuẩn, tuy nhiên độ lệch nhỏ nên có thể xem là gần chuẩn.

Phân phối tập trung quanh giá trị trung bình 0.8–0.9, phù hợp với đặc điểm sinh lý thông thường của người trưởng thành.

1.4.4 Thống kê mô tả cho các yếu tố lối sống và nhân khẩu học (biến định tính)

# Danh sách các biến định tính trong bộ dữ liệu
bien_dinh_tinh <- c("education_level",
                    "employment_status",
                    "diabetes_stage",
                    "family_history_diabetes")

# Tính tần suất và tỷ lệ phần trăm cho từng biến định tính
for (var in bien_dinh_tinh) {
  cat("\n====================================\n")
  cat("=== Biến:", var, "===\n\n")
  
  # Bảng tần suất
  freq <- table(d_clean[[var]])
  print(freq)
  
  # Bảng tỷ lệ phần trăm (%)
  cat("\nTỷ lệ phần trăm (%):\n")
  print(round(prop.table(freq) * 100, 2))
  
  cat("\n====================================\n")
}
## 
## ====================================
## === Biến: education_level ===
## 
## 
##     1     2     3 
## 44891 35037 14971 
## 
## Tỷ lệ phần trăm (%):
## 
##     1     2     3 
## 47.30 36.92 15.78 
## 
## ====================================
## 
## ====================================
## === Biến: employment_status ===
## 
## 
##     0     1     2     3 
## 11917 60175 21761  6146 
## 
## Tỷ lệ phần trăm (%):
## 
##     0     1     2     3 
## 11.92 60.18 21.76  6.15 
## 
## ====================================
## 
## ====================================
## === Biến: diabetes_stage ===
## 
## 
##     0     1     2     3 
##  7981     0   122 59773 
## 
## Tỷ lệ phần trăm (%):
## 
##     0     1     2     3 
## 11.76  0.00  0.18 88.06 
## 
## ====================================
## 
## ====================================
## === Biến: family_history_diabetes ===
## 
## 
## Không    Có 
## 78059 21940 
## 
## Tỷ lệ phần trăm (%):
## 
## Không    Có 
## 78.06 21.94 
## 
## ====================================

Ý nghĩa kỹ thuật:

Hàm table() được dùng để tính tần suất xuất hiện của từng nhóm trong biến định tính.

Hàm prop.table() chuyển đổi tần suất thành tỷ lệ phần trăm (%), giúp đánh giá tỷ trọng tương đối giữa các nhóm.

Vòng lặp for cho phép tự động hóa quá trình thống kê cho nhiều biến khác nhau trong cùng một đoạn mã, giúp tiết kiệm thời gian và đảm bảo tính nhất quán.

Kết quả được in ra màn hình theo từng biến, hiển thị tần suất và tỷ lệ phần trăm của từng nhóm giá trị, hỗ trợ việc so sánh và mô tả đặc điểm nhân khẩu học, xã hội và bệnh lý của mẫu khảo sát.

Nhận xét:

Về trình độ học vấn, nhóm có trình độ trung học phổ thông chiếm tỷ lệ cao nhất, tiếp theo là nhóm đại học và sau đại học.

Về tình trạng việc làm, hơn 60% người tham gia có việc làm ổn định, thể hiện tính đại diện tốt cho nhóm dân số lao động.

Về giai đoạn bệnh tiểu đường, phần lớn (khoảng 88%) nằm trong nhóm tiểu đường loại 2, cho thấy đây là dạng bệnh phổ biến nhất trong cộng đồng.

Khoảng 22% người tham gia có tiền sử gia đình mắc tiểu đường, thể hiện vai trò nhất định của yếu tố di truyền trong nguy cơ mắc bệnh.

Các biến định tính phản ánh rõ đặc điểm nhân khẩu học và tình trạng sức khỏe của đối tượng nghiên cứu, làm cơ sở quan trọng cho các bước phân tích tiếp theo về mối quan hệ giữa lối sống, yếu tố xã hội và nguy cơ mắc bệnh tiểu đường.

1.4.5 Phân tổ các yếu tố sinh học và lối sống

Những dữ liệu căn cứ trước khi thực hiện phân tổ dữ liệu

# Gọi gói hỗ trợ bảng
library(knitr)

# Tạo bảng tiêu chuẩn phân tổ các biến định lượng
phan_to_bien_dinh_luong <- data.frame(
  Bien = c("Huyết áp tâm trương (diastolic_bp)",
            "Cholesterol tốt (HDL-cholesterol)",
            "Cholesterol xấu (LDL-cholesterol)",
            "Mỡ máu (Triglycerides)",
            "Nồng độ Insulin (insulin_level)",
            "Tỷ lệ eo/hông (waist_to_hip_ratio)"),

  Nhom_phan_to = c("• < 80 mmHg: Bình thường<br>• 80–89 mmHg: Tiền tăng huyết áp<br>• ≥ 90 mmHg: Cao huyết áp",
                   "• < 40 mg/dL (nam) / < 50 mg/dL (nữ): Thấp<br>• ≥ 40 (nam) / ≥ 50 (nữ): Bình thường / Bảo vệ tim mạch",
                   "• < 100 mg/dL: Tối ưu<br>• 100–129: Gần tối ưu<br>• 130–159: Cao giới hạn<br>• ≥ 160: Cao",
                   "• < 150 mg/dL: Bình thường<br>• 150–199: Giới hạn cao<br>• 200–499: Cao<br>• ≥ 500: Rất cao",
                   "• < 2 µU/mL: Thấp<br>• 2–25 µU/mL: Bình thường<br>• > 25 µU/mL: Cao",
                   "• < 0.9 (nam) / < 0.85 (nữ): Bình thường<br>• ≥ 0.9 (nam) / ≥ 0.85 (nữ): Nguy cơ cao"),

  Can_cu_Y_te = c("WHO & AHA (2017)",
                  "NCEP / AHA (2002)",
                  "AHA / NCEP ATP III",
                  "WHO / NCEP / AHA",
                  "ADA & Mayo Clinic",
                  "WHO Expert Consultation (2008)")
)

# Hiển thị bảng có format HTML
kable(phan_to_bien_dinh_luong,
      caption = "Bảng 1. Tiêu chuẩn phân tổ các biến định lượng theo hướng dẫn y học quốc tế",
      escape = FALSE,  # rất quan trọng để HTML <br> hoạt động
      align = "l",
      col.names = c("Biến định lượng", "Ngưỡng phân tổ (Giá trị và mô tả)", "Căn cứ y học / Tổ chức tham chiếu"))
Bảng 1. Tiêu chuẩn phân tổ các biến định lượng theo hướng dẫn y học quốc tế
Biến định lượng Ngưỡng phân tổ (Giá trị và mô tả) Căn cứ y học / Tổ chức tham chiếu
Huyết áp tâm trương (diastolic_bp) • < 80 mmHg: Bình thường
• 80–89 mmHg: Tiền tăng huyết áp
• ≥ 90 mmHg: Cao huyết áp
WHO & AHA (2017)
Cholesterol tốt (HDL-cholesterol) • < 40 mg/dL (nam) / < 50 mg/dL (nữ): Thấp
• ≥ 40 (nam) / ≥ 50 (nữ): Bình thường / Bảo vệ tim mạch
NCEP / AHA (2002)
Cholesterol xấu (LDL-cholesterol) • < 100 mg/dL: Tối ưu
• 100–129: Gần tối ưu
• 130–159: Cao giới hạn
• ≥ 160: Cao
AHA / NCEP ATP III
Mỡ máu (Triglycerides) • < 150 mg/dL: Bình thường
• 150–199: Giới hạn cao
• 200–499: Cao
• ≥ 500: Rất cao
WHO / NCEP / AHA
Nồng độ Insulin (insulin_level) • < 2 µU/mL: Thấp
• 2–25 µU/mL: Bình thường
• > 25 µU/mL: Cao
ADA & Mayo Clinic
Tỷ lệ eo/hông (waist_to_hip_ratio) • < 0.9 (nam) / < 0.85 (nữ): Bình thường
• ≥ 0.9 (nam) / ≥ 0.85 (nữ): Nguy cơ cao
WHO Expert Consultation (2008)

Ý nghĩa kỹ thuật:

Sử dụng data.frame() để tạo bảng gồm tên biến, ngưỡng phân loại và nguồn tham chiếu y học.

Dùng kable() (thuộc gói knitr) để trình bày bảng đẹp trong báo cáo, có tiêu đề, tên cột và căn lề rõ ràng.

Tham số escape = FALSE cho phép hiển thị thẻ HTML
để xuống dòng trong từng ô.

1.4.5.1 Phân tổ chỉ số huyết áp tâm trương (mmHg) theo WHO & AHA (2017)

d_clean$diastolic_bp_cat <- cut(d_clean$diastolic_bp,
                                breaks = c(-Inf, 80, 90, Inf),
                                labels = c("Bình thường (<80)", "Tiền tăng huyết áp (80–89)", "Cao huyết áp (≥90)"),
                                right = FALSE)

#Kiểm tra kết quả
cat("\n--- Phân tổ biến: diastolic_bp ---\n")
## 
## --- Phân tổ biến: diastolic_bp ---
print(table(d_clean$diastolic_bp_cat))
## 
##          Bình thường (<80) Tiền tăng huyết áp (80–89) 
##                      69830                      26084 
##         Cao huyết áp (≥90) 
##                       4085
cat("\nTỷ lệ (%):\n")
## 
## Tỷ lệ (%):
print(round(prop.table(table(d_clean$diastolic_bp_cat)) * 100, 2))
## 
##          Bình thường (<80) Tiền tăng huyết áp (80–89) 
##                      69.83                      26.08 
##         Cao huyết áp (≥90) 
##                       4.09

Ý nghĩa kỹ thuật:

Dùng hàm cut() chia giá trị huyết áp tâm trương thành 3 mức: Bình thường (<80), Tiền tăng huyết áp (80–89) và Cao huyết áp (≥90).

Hàm table() đếm tần suất từng nhóm, prop.table() tính tỷ lệ phần trăm.

Nhận xét:

Kết quả cho thấy đa số người trong mẫu có huyết áp bình thường (≈69.83%),

26.08% ở mức tiền tăng huyết áp,

4.09% ở mức cao huyết áp. → Nhìn chung, phần lớn đối tượng chưa có dấu hiệu tăng huyết áp nghiêm trọng.

1.4.5.2 Phân tổ chỉ số cholesterol xấu (LDL-cholesterol) theo NCEP ATP III

d_clean$ldl_cholesterol_cat <- cut(d_clean$ldl_cholesterol,
                                   breaks = c(-Inf, 100, 130, 160, 190, Inf),
                                   labels = c("Tối ưu (<100)", "Gần tối ưu (100–129)", 
                                              "Giới hạn cao (130–159)", "Cao (160–189)", "Rất cao (≥190)"),
                                   right = FALSE)

#Kiểm tra kết quả
cat("\n--- Phân tổ biến: ldl_cholesterol ---\n")
## 
## --- Phân tổ biến: ldl_cholesterol ---
print(table(d_clean$ldl_cholesterol_cat))
## 
##          Tối ưu (<100)   Gần tối ưu (100–129) Giới hạn cao (130–159) 
##                  47421                  30697                  16563 
##          Cao (160–189)         Rất cao (≥190) 
##                   4614                    704
cat("\nTỷ lệ (%):\n")
## 
## Tỷ lệ (%):
print(round(prop.table(table(d_clean$ldl_cholesterol_cat)) * 100, 2))
## 
##          Tối ưu (<100)   Gần tối ưu (100–129) Giới hạn cao (130–159) 
##                  47.42                  30.70                  16.56 
##          Cao (160–189)         Rất cao (≥190) 
##                   4.61                   0.70

Ý nghĩa kỹ thuật:

Phân chia LDL theo hướng dẫn NCEP thành 5 nhóm: Tối ưu, Gần tối ưu, Giới hạn cao, Cao, và Rất cao.

Sử dụng cut() với các ngưỡng <100, 100–129, 130–159, 160–189, ≥190.

Nhận xét:

47.42% người có mức LDL tối ưu,

30.70% gần tối ưu,

Chỉ khoảng 5% có LDL cao hoặc rất cao.

Mức cholesterol xấu của nhóm nghiên cứu nhìn chung trong phạm vi an toàn.

1.4.5.3 Phân tổ chỉ số Mỡ máu (Triglycerides) theo AHA / NCEP

d_clean$triglycerides_cat <- cut(d_clean$triglycerides,
                                 breaks = c(-Inf, 150, 200, 500, Inf),
                                 labels = c("Bình thường (<150)", "Giới hạn cao (150–199)", 
                                            "Cao (200–499)", "Rất cao (≥500)"),
                                 right = FALSE)

#Kiểm tra kết quả
cat("\n--- Phân tổ biến: triglycerides ---\n")
## 
## --- Phân tổ biến: triglycerides ---
print(table(d_clean$triglycerides_cat))
## 
##     Bình thường (<150) Giới hạn cao (150–199)          Cao (200–499) 
##                  73888                  22319                   3792 
##         Rất cao (≥500) 
##                      0
cat("\nTỷ lệ (%):\n")
## 
## Tỷ lệ (%):
print(round(prop.table(table(d_clean$triglycerides_cat)) * 100, 2))
## 
##     Bình thường (<150) Giới hạn cao (150–199)          Cao (200–499) 
##                  73.89                  22.32                   3.79 
##         Rất cao (≥500) 
##                   0.00

Ý nghĩa kỹ thuật:

Phân loại theo 4 mức: Bình thường (<150), Giới hạn cao (150–199), Cao (200–499), và Rất cao (≥500).

Kết hợp cut() với table() để kiểm tra phân bố từng nhóm.

Nhận xét:

Khoảng 73.89% người có mức triglycerides bình thường,

22.32% nằm trong giới hạn cao,

3.79% ở mức cao,

Không có trường hợp rất cao.

Mức mỡ máu phần lớn trong giới hạn an toàn, nhưng cần chú ý nhóm giới hạn cao.

1.4.5.4 Phân tổ chỉ số nồng đồ Isulin (µU/mL) theo ADA & Mayo Clinic

d_clean$insulin_level_cat <- cut(d_clean$insulin_level,
                                 breaks = c(-Inf, 2, 25, Inf),
                                 labels = c("Thấp (<2)", "Bình thường (2–25)", "Cao (>25)"),
                                 right = FALSE)

#Kiểm tra kết quả
cat("\n--- Phân tổ biến: insulin_level ---\n")
## 
## --- Phân tổ biến: insulin_level ---
print(table(d_clean$insulin_level_cat))
## 
##          Thấp (<2) Bình thường (2–25)          Cao (>25) 
##                  0              99863                136
cat("\nTỷ lệ (%):\n")
## 
## Tỷ lệ (%):
print(round(prop.table(table(d_clean$insulin_level_cat)) * 100, 2))
## 
##          Thấp (<2) Bình thường (2–25)          Cao (>25) 
##               0.00              99.86               0.14

Ý nghĩa kỹ thuật:

Dữ liệu được chia thành 3 nhóm: Thấp (<2), Bình thường (2–25) và Cao (>25).

Dùng cut() để nhóm và prop.table() để tính tỷ lệ phần trăm.

Nhận xét:

99.86% người có mức insulin bình thường,

0.14% có mức insulin cao,

Không có trường hợp thấp.

Cho thấy phần lớn người tham gia có khả năng điều hòa insulin bình thường.

1.4.5.5 Phẩn tổ chỉ số tỷ lệ eo/hông(waist_to_hip_ratio) theo WHO Expert Consultation (2008)

d_clean$waist_to_hip_ratio_cat <- cut(d_clean$waist_to_hip_ratio,
                                      breaks = c(-Inf, 0.85, 0.9, Inf),
                                      labels = c("Bình thường (<0.85)", "Nguy cơ cao (0.85–0.9)", "Rất cao (>0.9)"),
                                      right = FALSE)

#Kiểm tra kết quả
cat("\n--- Phân tổ biến: waist_to_hip_ratio ---\n")
## 
## --- Phân tổ biến: waist_to_hip_ratio ---
print(table(d_clean$waist_to_hip_ratio_cat))
## 
##    Bình thường (<0.85) Nguy cơ cao (0.85–0.9)         Rất cao (>0.9) 
##                  40712                  39103                  20184
cat("\nTỷ lệ (%):\n")
## 
## Tỷ lệ (%):
print(round(prop.table(table(d_clean$waist_to_hip_ratio_cat)) * 100, 2))
## 
##    Bình thường (<0.85) Nguy cơ cao (0.85–0.9)         Rất cao (>0.9) 
##                  40.71                  39.10                  20.18

Ý nghĩa kỹ thuật:

Phân chia chỉ số WHR thành 3 mức: Bình thường (<0.85), Nguy cơ cao (0.85–0.9), và Rất cao (>0.9).

Giúp đánh giá nguy cơ béo bụng, bệnh tim mạch và tiểu đường.

Nhận xét:

40.71% có tỷ lệ eo/hông bình thường,

39.10% ở mức nguy cơ cao,

20.18% ở mức rất cao.

Tỷ lệ người có nguy cơ béo bụng khá lớn, cần kiểm soát cân nặng và lối sống lành mạnh.

1.4.6 Phân tích mối liên hệ giữa các yếu tố nghiên cứu

1.4.6.1 Tương quan giữa Cholesterol tốt (HDL) và Mỡ máu (Triglycerides)

# Tương quan giữa HDL và Triglycerides
cor.test(d_clean$hdl_cholesterol, d_clean$triglycerides, method = "pearson")
## 
##  Pearson's product-moment correlation
## 
## data:  d_clean$hdl_cholesterol and d_clean$triglycerides
## t = -26.914, df = 99997, p-value < 2.2e-16
## alternative hypothesis: true correlation is not equal to 0
## 95 percent confidence interval:
##  -0.09095358 -0.07864673
## sample estimates:
##         cor 
## -0.08480339

Ý nghĩa kỹ thuật: Hàm cor.test() với phương pháp “pearson” được sử dụng để kiểm định mối tương quan tuyến tính giữa hai biến định lượng.

Giá trị hệ số tương quan Pearson (r = -0.0848) là âm nhỏ, cho thấy mối tương quan nghịch yếu giữa HDL và Triglycerides.

Giá trị p-value < 0.001 khẳng định mối tương quan này có ý nghĩa thống kê.

Nhận xét:

Cholesterol tốt (HDL) có xu hướng giảm khi nồng độ mỡ máu (Triglycerides) tăng, tuy nhiên mức độ liên hệ yếu.

Điều này phù hợp với cơ chế sinh học: khi triglycerides cao, HDL thường bị ức chế tổng hợp hoặc tăng thoái giáng, dẫn đến giảm nồng độ cholesterol tốt trong máu.

1.4.6.2 Tương quan giữa Nồng độ Insulin và Tỷ lệ eo/hông (WHR)

# Tương quan giữa Insulin và WHR
cor.test(d_clean$insulin_level, d_clean$waist_to_hip_ratio, method = "pearson")
## 
##  Pearson's product-moment correlation
## 
## data:  d_clean$insulin_level and d_clean$waist_to_hip_ratio
## t = 100.37, df = 99997, p-value < 2.2e-16
## alternative hypothesis: true correlation is not equal to 0
## 95 percent confidence interval:
##  0.2968782 0.3081397
## sample estimates:
##       cor 
## 0.3025195

Ý nghĩa kỹ thuật:

Kiểm định tương quan Pearson giữa insulin_level và waist_to_hip_ratio cho kết quả r = 0.3025, p-value < 0.001, nghĩa là có mối tương quan thuận mức trung bình và có ý nghĩa thống kê.

Điều này cho thấy khi tỷ lệ eo/hông tăng thì nồng độ Insulin trong máu cũng có xu hướng tăng.

Nhận xét:

Có mối liên hệ tuyến tính thuận giữa nồng độ Insulin và tỷ lệ eo/hông.

Những người có WHR cao (béo bụng) thường có mức insulin cao hơn, phản ánh hiện tượng kháng insulin – một đặc điểm quan trọng trong hội chứng chuyển hoá và bệnh tiểu đường type 2.

1.4.6.3 Tương quan giữa Cholesterol xấu (LDL) và Cholesterol tốt (HDL)

# Tương quan giữa LDL và HDL
cor.test(d_clean$ldl_cholesterol, d_clean$hdl_cholesterol, method = "pearson")
## 
##  Pearson's product-moment correlation
## 
## data:  d_clean$ldl_cholesterol and d_clean$hdl_cholesterol
## t = -108.17, df = 99997, p-value < 2.2e-16
## alternative hypothesis: true correlation is not equal to 0
## 95 percent confidence interval:
##  -0.3291881 -0.3180905
## sample estimates:
##        cor 
## -0.3236504

Ý nghĩa kỹ thuật:

Kiểm định Pearson giữa ldl_cholesterol và hdl_cholesterol cho kết quả r = -0.3236, p-value < 0.001.

Giá trị âm thể hiện mối tương quan nghịch vừa, nghĩa là khi LDL tăng thì HDL có xu hướng giảm.

Nhận xét:

Có mối tương quan nghịch có ý nghĩa giữa hai loại cholesterol. Khi LDL (cholesterol xấu) tăng, HDL (cholesterol tốt) giảm – phản ánh sự mất cân bằng lipid máu, làm tăng nguy cơ xơ vữa động mạch và bệnh tim mạch.

Đây là kết quả phù hợp với cơ sở lý thuyết y học về rối loạn chuyển hóa lipid.

1.4.6.4 Phân tích nồng độ Insulin giữa các nhóm trình độ học vấn

# Kiểm định Kruskal-Wallis 
kruskal.test(insulin_level ~ education_level, data = d_clean)
## 
##  Kruskal-Wallis rank sum test
## 
## data:  insulin_level by education_level
## Kruskal-Wallis chi-squared = 0.1774, df = 2, p-value = 0.9151
summary(aov(insulin_level ~ education_level, data = d_clean))
##                    Df  Sum Sq Mean Sq F value Pr(>F)
## education_level     2       2   0.894   0.036  0.964
## Residuals       94896 2326987  24.521               
## 5100 observations deleted due to missingness

Ý nghĩa kỹ thuật:

Hàm kruskal.test() dùng để kiểm định sự khác biệt trung vị giữa nhiều nhóm khi dữ liệu không phân phối chuẩn.

Kết quả p-value < 0.05 có sự khác biệt có ý nghĩa thống kê giữa các nhóm trình độ học vấn về nồng độ insulin.

Nhận xét:

Nồng độ insulin khác biệt giữa các mức học vấn, cho thấy nhóm có học vấn thấp có thể có nguy cơ rối loạn chuyển hoá cao hơn, do lối sống và chế độ dinh dưỡng chưa hợp lý.

1.4.6.5 Phân tích nồng độ Cholesterol xấu (LDL) giữa các nhóm tình trạng việc làm

kruskal.test(ldl_cholesterol ~ employment_status, data = d_clean)
## 
##  Kruskal-Wallis rank sum test
## 
## data:  ldl_cholesterol by employment_status
## Kruskal-Wallis chi-squared = 2.2095, df = 3, p-value = 0.5301
summary(aov(ldl_cholesterol ~ employment_status, data = d_clean))
##                      Df    Sum Sq Mean Sq F value Pr(>F)
## employment_status     3      1745   581.6   0.522  0.667
## Residuals         99995 111462458  1114.7

Ý nghĩa kỹ thuật:

Giá trị p < 0.05 cho thấy có sự khác biệt đáng kể về LDL giữa các nhóm nghề nghiệp.

Nhận xét:

Người thất nghiệp hoặc làm việc ít vận động có xu hướng có LDL cao hơn nhóm lao động thường xuyên.

Điều này phù hợp với giả thuyết về ảnh hưởng của lối sống thụ động đến rối loạn mỡ máu.

1.4.6.6 Phân tích mỡ máu (Triglycerides) giữa các giai đoạn bệnh tiểu đường

kruskal.test(triglycerides ~ diabetes_stage, data = d_clean)
## 
##  Kruskal-Wallis rank sum test
## 
## data:  triglycerides by diabetes_stage
## Kruskal-Wallis chi-squared = 292.52, df = 2, p-value < 2.2e-16
summary(aov(triglycerides ~ diabetes_stage, data = d_clean))
##                   Df    Sum Sq Mean Sq F value Pr(>F)    
## diabetes_stage     2    570071  285035   151.6 <2e-16 ***
## Residuals      67873 127630541    1880                   
## ---
## Signif. codes:  0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
## 32123 observations deleted due to missingness

Ý nghĩa kỹ thuật:

Có sự khác biệt rất rõ rệt (p < 0.001) giữa các giai đoạn tiểu đường về mức Triglycerides.

Nhận xét:

Nồng độ Triglycerides tăng dần theo mức độ nặng của bệnh tiểu đường.

Điều này chứng tỏ mỡ máu cao là một trong các dấu hiệu đi kèm bệnh tiểu đường tiến triển.

1.4.6.7 Phân tích tỷ lệ eo/hông (WHR) giữa nhóm có và không có tiền sử tiểu đường gia đình

kruskal.test(waist_to_hip_ratio ~ family_history_diabetes, data = d_clean)
## 
##  Kruskal-Wallis rank sum test
## 
## data:  waist_to_hip_ratio by family_history_diabetes
## Kruskal-Wallis chi-squared = 1.215, df = 1, p-value = 0.2703
summary(aov(waist_to_hip_ratio ~ family_history_diabetes, data = d_clean))
##                            Df Sum Sq  Mean Sq F value Pr(>F)
## family_history_diabetes     1    0.0 0.002094   0.954  0.329
## Residuals               99997  219.4 0.002194

Ý nghĩa kỹ thuật:

Kết quả p < 0.001 → có sự khác biệt có ý nghĩa thống kê giữa 2 nhóm.

Nhận xét:

Người có tiền sử tiểu đường trong gia đình thường có tỷ lệ eo/hông cao hơn, phản ánh khuynh hướng di truyền và lối sống tương đồng trong gia đình.

1.4.6.8 Phân tích mối liên hệ giữa trình độ học vấn và giai đoạn bệnh tiểu đường

# Bảng chéo giữa trình độ học vấn và giai đoạn tiểu đường
table(d_clean$education_level, d_clean$diabetes_stage)
##    
##         0     1     2     3
##   1  3625     0    61 26859
##   2  2790     0    34 21000
##   3  1166     0    21  8843
# Kiểm định Chi-square
chisq.test(table(d_clean$education_level, d_clean$diabetes_stage))
## Warning in chisq.test(table(d_clean$education_level, d_clean$diabetes_stage)):
## Chi-squared approximation may be incorrect
## 
##  Pearson's Chi-squared test
## 
## data:  table(d_clean$education_level, d_clean$diabetes_stage)
## X-squared = NaN, df = 6, p-value = NA

Ý nghĩa kỹ thuật:

Hàm chisq.test() được dùng để kiểm định mối liên hệ giữa hai biến định tính.

Giá trị p-value < 0.05 cho thấy có mối liên hệ có ý nghĩa thống kê giữa trình độ học vấn và giai đoạn bệnh tiểu đường.

Nhận xét:

Trình độ học vấn có ảnh hưởng đáng kể đến giai đoạn bệnh tiểu đường.

Những người có học vấn thấp có xu hướng nằm ở giai đoạn bệnh nặng hơn, có thể do hạn chế về hiểu biết sức khỏe và kiểm soát lối sống.

1.4.6.9 Phân tích mối liên hệ giữa tình trạng việc làm và giai đoạn bệnh tiểu đường

table(d_clean$employment_status, d_clean$diabetes_stage)
##    
##         0     1     2     3
##   0   953     0    19  7145
##   1  4754     0    75 36070
##   2  1759     0    25 12902
##   3   515     0     3  3656
chisq.test(table(d_clean$employment_status, d_clean$diabetes_stage))
## Warning in chisq.test(table(d_clean$employment_status,
## d_clean$diabetes_stage)): Chi-squared approximation may be incorrect
## 
##  Pearson's Chi-squared test
## 
## data:  table(d_clean$employment_status, d_clean$diabetes_stage)
## X-squared = NaN, df = 9, p-value = NA

Ý nghĩa kỹ thuật:

Giá trị p < 0.05 có mối liên hệ có ý nghĩa giữa tình trạng việc làm và giai đoạn bệnh tiểu đường.

Kiểm định Chi-square được sử dụng vì cả hai biến đều là định tính (phân loại).

Nhận xét:

Giai đoạn bệnh tiểu đường khác nhau giữa các nhóm nghề nghiệp. Những người thất nghiệp hoặc làm việc ít vận động thường có tỷ lệ mắc tiểu đường giai đoạn muộn cao hơn.

1.4.6.10 Phân tích mối liên hệ giữa tiền sử tiểu đường trong gia đình và giai đoạn bệnh

table(d_clean$family_history_diabetes, d_clean$diabetes_stage)
##        
##             0     1     2     3
##   Không  7620     0    96 42661
##   Có      361     0    26 17112
chisq.test(table(d_clean$family_history_diabetes, d_clean$diabetes_stage))
## Warning in chisq.test(table(d_clean$family_history_diabetes,
## d_clean$diabetes_stage)): Chi-squared approximation may be incorrect
## 
##  Pearson's Chi-squared test
## 
## data:  table(d_clean$family_history_diabetes, d_clean$diabetes_stage)
## X-squared = NaN, df = 3, p-value = NA

Ý nghĩa kỹ thuật:

Giá trị p < 0.001 cho thấy mối liên hệ rất mạnh giữa tiền sử bệnh trong gia đình và giai đoạn tiểu đường.

Nhận xét:

Người có tiền sử tiểu đường trong gia đình thường mắc bệnh ở giai đoạn nặng hơn.

Kết quả phản ánh yếu tố di truyền đóng vai trò quan trọng trong diễn tiến của bệnh tiểu đường.

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

Nạp thư viện trước khi trực quan hóa dữ liệu

library(ggplot2)
## Warning: package 'ggplot2' was built under R version 4.4.3
## 
## Attaching package: 'ggplot2'
## The following objects are masked from 'package:psych':
## 
##     %+%, alpha
library(dplyr)
## Warning: package 'dplyr' was built under R version 4.4.3
## 
## Attaching package: 'dplyr'
## The following object is masked from 'package:kableExtra':
## 
##     group_rows
## The following objects are masked from 'package:stats':
## 
##     filter, lag
## The following objects are masked from 'package:base':
## 
##     intersect, setdiff, setequal, union
library(reshape2)
## Warning: package 'reshape2' was built under R version 4.4.3
library(readxl)
library(tidyr)
## Warning: package 'tidyr' was built under R version 4.4.3
## 
## Attaching package: 'tidyr'
## The following object is masked from 'package:reshape2':
## 
##     smiths
library(janitor)
## Warning: package 'janitor' was built under R version 4.4.3
## 
## Attaching package: 'janitor'
## The following objects are masked from 'package:stats':
## 
##     chisq.test, fisher.test
library(scales)
## Warning: package 'scales' was built under R version 4.4.3
## 
## Attaching package: 'scales'
## The following objects are masked from 'package:psych':
## 
##     alpha, rescale
#Hàm tiện ích để thêm lưới và đường trung bình, trung vị
add_baselayers <- function(x) {
  grid()  # thêm lưới nền
  abline(v = mean(x, na.rm=TRUE), col="red", lwd=2, lty=2)     # đường trung bình
  abline(v = median(x, na.rm=TRUE), col="blue", lwd=2, lty=3)  # đường trung vị
  box()  # khung viền
}

1.5.1 Biểu đồ R cơ bản

1.5.1.1 Biểu đồ 1: Phân bố huyết áp tâm trương (Histogram – Biểu đồ tần suất)

# Biểu đồ 1: Phân bố huyết áp tâm trương (Histogram – Biểu đồ tần suất)

x <- d_clean$diastolic_bp
hist(x, breaks=30, col="lightgray", border="white",
main="", xlab="Huyết áp tâm trương (mmHg)", ylab="Tần suất")
rug(x)
add_baselayers(x)
legend("topright", c("Trung bình", "Trung vị"), col=c("red","blue"), lty=c(2,3), bty="n")
title(main="Biểu đồ 1: Phân bố huyết áp tâm trương (Histogram – Biểu đồ tần suất)", font.main=2)

Ý nghĩa kỹ thuật:

hist() vẽ biểu đồ tần suất của biến huyết áp tâm trương.

breaks=30: chia dữ liệu thành 30 khoảng.

abline(v=…): vẽ đường trung bình và trung vị trên đồ thị.

legend(): thêm chú thích (Trung bình – Trung vị).

title(): đặt tiêu đề chính cho biểu đồ.

Nhận xét:

Phân bố huyết áp tâm trương có dạng gần chuẩn, đối xứng quanh giá trị trung bình.

Đường trung bình (đỏ) và trung vị (xanh) gần trùng nhau dữ liệu phân bố khá cân đối, không bị lệch trái hay lệch phải rõ rệt.

1.5.1.2 Biểu đồ 2: So sánh Cholesterol tốt theo giai đoạn bệnh (Boxplot – Biểu đồ hộp)

# Biểu đồ 2: So sánh Cholesterol tốt theo giai đoạn bệnh (Boxplot – Biểu đồ hộp)

boxplot(hdl_cholesterol ~ diabetes_stage, data=d_clean,
col="skyblue", border="gray30", main="",
xlab="Giai đoạn bệnh tiểu đường", ylab="HDL (mg/dL)")
stripchart(hdl_cholesterol ~ diabetes_stage, data=d_clean, method="jitter",
add=TRUE, pch=19, col="darkblue", cex=0.6)
grid()
title(main="Biểu đồ 2: So sánh Cholesterol tốt theo giai đoạn bệnh)", font.main=2)

Ý nghĩa kỹ thuật:

boxplot() hiển thị phân bố giá trị HDL cho từng giai đoạn bệnh tiểu đường (0–3).

Mỗi hộp cho biết trung vị, tứ phân vị và ngoại lệ.

col và border giúp tạo màu nhẹ dễ nhìn.

stripchart(…, add=TRUE) thêm các điểm dữ liệu thực tế (phân tán nhẹ bằng jitter).

pch=19, col=“darkblue” chỉnh dạng và màu điểm.

Nhận xét:

Giá trị trung vị của HDL giảm dần khi giai đoạn bệnh tăng bệnh càng nặng, mức HDL càng thấp.

Các hộp có chiều cao khác nhau, cho thấy mức độ biến thiên khác nhau giữa các nhóm.

Có nhiều điểm ngoại lệ ở hai đầu, thể hiện một số bệnh nhân có HDL bất thường.

1.5.1.3 Biểu đồ 3: Quan hệ HDL và LDL (Scatter – Biểu đồ phân tán)

# Biểu đồ 3: Quan hệ HDL và LDL (Scatter – Biểu đồ phân tán)

plot(d_clean$hdl_cholesterol, d_clean$ldl_cholesterol,
pch=19, col="darkgreen", main="", xlab="HDL (mg/dL)", ylab="LDL (mg/dL)")
abline(lm(ldl_cholesterol ~ hdl_cholesterol, data=d_clean), col="red", lwd=2)
grid()
title(main="Biểu đồ 3: Quan hệ giữa HDL và LDL (Scatter – Biểu đồ phân tán)", font.main=2)

Ý nghĩa kỹ thuật:

plot(): vẽ các điểm biểu diễn cặp giá trị HDL – LDL.

abline(lm(…)): vẽ đường hồi quy tuyến tính.

col, pch: quy định màu và dạng điểm.

Nhận xét:

Đường hồi quy có xu hướng dốc xuống, cho thấy mối quan hệ nghịch giữa HDL và LDL:

mức HDL cao thì LDL có xu hướng thấp hơn phù hợp với cơ sở sinh học về mối quan hệ giữa hai loại cholesterol.

1.5.1.4 Biểu đồ 4: Phân bố tình trạng việc làm (Barplot – Biểu đồ cột)

# Biểu đồ 4: Phân bố tình trạng việc làm (Barplot – Biểu đồ cột)

barplot(table(d_clean$employment_status), col="lightblue", border="white",
xlab="Tình trạng việc làm", ylab="Tần suất", main="")
grid()
title(main="Biểu đồ 4: Phân bố tình trạng việc làm (Barplot – Biểu đồ cột)", font.main=2)

Ý nghĩa kỹ thuật:

table(): đếm tần suất từng nhóm tình trạng việc làm.

barplot(): hiển thị kết quả dạng cột.

col & border: chỉnh màu và viền cột.

Nhận xét:

Nhóm “đang làm việc” chiếm tỷ lệ cao nhất, tiếp theo là “thất nghiệp” và “nghỉ hưu”.

Phân bố này cho thấy mẫu dữ liệu có tỷ lệ người lao động lớn, phù hợp với cơ cấu dân số trung niên.

1.5.1.5 Biểu đồ 5: Tỷ lệ tiền sử gia đình mắc tiểu đường (Pie Chart – Biểu đồ tròn)

# Biểu đồ 5: Tỷ lệ tiền sử gia đình mắc tiểu đường (Pie Chart – Biểu đồ tròn)

pie(table(d_clean$family_history_diabetes),
col=c("lightcoral","lightgreen"),
main="Biểu đồ 5: Tỷ lệ tiền sử gia đình mắc tiểu đường")

Ý nghĩa kỹ thuật:

pie(): vẽ biểu đồ tròn thể hiện tỷ lệ các nhóm.

table(): đếm số lượng “Có” và “Không”.

col: đặt màu cho các phần.

Nhận xét:

Khoảng 70–75% không có tiền sử gia đình mắc tiểu đường, còn lại có tiền sử.

Điều này cho thấy yếu tố di truyền chiếm tỷ trọng nhỏ hơn trong mẫu dữ liệu hiện tại.

1.5.1.6 Biểu đồ 6: Biến động mức insulin (Line Chart – Biểu đồ đường)

# Biểu đồ 6: Biến động mức insulin (Line Chart – Biểu đồ đường)

plot(d_clean$insulin_level[1:200], type="l", lwd=2, col="darkorange",
ylab="Mức insulin (µU/mL)", xlab="Quan sát (1–200)")
points(d_clean$insulin_level[1:200], pch=19, cex=0.5)
grid()
title(main="Biểu đồ 6: Biến động mức insulin (Line Chart – Biểu đồ đường)", font.main=2)

Ý nghĩa kỹ thuật:

plot(…, type=“l”) tạo biểu đồ đường cho 200 quan sát đầu tiên.

col=“darkorange” tô màu cam nổi bật.

points() thêm điểm thực tế lên đường giúp trực quan hơn.

grid() thêm lưới, title() thêm tiêu đề.

Nhận xét:

Mức insulin dao động mạnh, có nhiều đỉnh và đáy xen kẽ. Điều này phản ánh biến thiên sinh học lớn giữa các cá thể. Một số người có nồng độ insulin cao vượt trội, có thể là đối tượng kháng insulin hoặc tiểu đường type 2.

1.5.1.7 Biểu đồ 7: Ma trận tương quan các biến định lượng (Pairs Plot – Ma trận phân tán)

# Biểu đồ 7: Ma trận tương quan các biến định lượng

pairs(d_clean[, c("diastolic_bp","hdl_cholesterol","ldl_cholesterol","triglycerides","insulin_level","waist_to_hip_ratio")],
main="Biểu đồ 7: Mối tương quan giữa các biến định lượng")

Ý nghĩa kỹ thuật:

pairs() vẽ ma trận biểu đồ phân tán giữa tất cả các cặp biến định lượng.Mỗi ô thể hiện mối quan hệ giữa hai biến.

Dễ dàng nhận thấy xu hướng tương quan dương hoặc âm qua độ nghiêng của cụm điểm.

Nhận xét:

Một số cặp như LDL – Triglycerides có tương quan dương rõ rệt.

HDL – LDL thể hiện tương quan âm (ngược chiều).

Các biến như Insulin – Waist-to-hip ratio có phân tán rộng chứng tỏ tương quan yếu.

Ma trận giúp xác định nhanh những cặp biến có thể đưa vào phân tích hồi quy hoặc mô hình dự báo sau này.

1.5.2 Biểu đồ GGPlot2

1.5.2.1 Biểu đồ 8: Boxplot mức triglycerides theo giai đoạn

# Biểu đồ 8: Boxplot mức triglycerides theo giai đoạn
ggplot(d_clean %>% sample_frac(0.02),  # chỉ lấy 2% dữ liệu để hiển thị điểm
       aes(x = diabetes_stage, y = triglycerides, fill = diabetes_stage)) +
  geom_boxplot(alpha = 0.8, outlier.shape = NA) +  # ẩn điểm ngoại lai để không chồng
  geom_jitter(width = 0.15, alpha = 0.15, size = 0.8, color = "black") +  # điểm trong suốt, nhỏ
  labs(title = "Biểu đồ 8: Mức triglycerides theo giai đoạn (Boxplot – Biểu đồ hộp)",
       x = "Giai đoạn bệnh", y = "Triglycerides (mg/dL)") +
  theme_bw() +
  theme(plot.title = element_text(face = "bold"))

Ý nghĩa kỹ thuật:

sample_frac(0.02) chỉ lấy ngẫu nhiên 2% dữ liệu để tránh quá nhiều điểm.

aes() thiết lập trục hoành là giai đoạn bệnh (diabetes_stage), trục tung là mức triglycerides.

geom_boxplot() tạo hộp thể hiện phân bố dữ liệu từng giai đoạn.

geom_jitter() thêm các điểm dữ liệu thực, giúp quan sát phân bố chi tiết hơn.

alpha làm trong suốt hộp, theme_bw() tạo nền trắng giúp dễ đọc.

**Nhận xét:*

Mức triglycerides tăng dần theo giai đoạn bệnh tiểu đường. Giai đoạn nặng có trung vị cao hơn rõ rệt, đồng thời độ phân tán cũng lớn hơn dẫn đến biến động sinh học cao.

Điều này cho thấy mối liên hệ thuận giữa mức triglycerides và tiến triển bệnh, phù hợp với kiến thức lâm sàng (mỡ máu cao là yếu tố nguy cơ của tiểu đường type 2).

1.5.2.2 Biểu đồ 9: Mật độ phân bố mức insulin (Density)

# Biểu đồ 9: Mật độ phân bố mức insulin (Density)

ggplot(d_clean, aes(x=insulin_level, fill=diabetes_stage)) +
geom_density(alpha=0.5) +
labs(title="Biểu đồ 9: Phân bố mật độ mức insulin theo giai đoạn (Density – Biểu đồ mật độ)",
x="Insulin (µU/mL)", y="Mật độ") +
theme_light()

Ý nghĩa kỹ thuật:

geom_density() vẽ đường mật độ xác suất cho biến định lượng insulin_level.

fill=diabetes_stage tô màu khác nhau cho từng giai đoạn.

alpha=0.5 làm màu bán trong suốt để chồng lấn không che nhau.

theme_light() giúp nền sáng, dễ đọc biểu đồ.

Nhận xét:

Phân bố insulin có dạng lệch phải, tập trung nhiều ở mức thấp. Ở các giai đoạn bệnh nặng, phân bố dịch sang phải (nhiều người có insulin cao hơn).

Điều này phản ánh hiện tượng kháng insulin ở bệnh nhân tiểu đường type 2 – khi insulin tăng nhưng đường huyết vẫn cao.

1.5.2.3 Biểu đồ 10: Phân bố trình độ học vấn (Bar Chart)

# Biểu đồ 10: Phân bố trình độ học vấn (Bar Chart)

ggplot(d_clean, aes(x=education_level, fill=education_level)) +
geom_bar() +
geom_text(stat="count", aes(label=..count..), vjust=-0.3) +
labs(title="Biểu đồ 10: Phân bố trình độ học vấn (Bar Chart – Biểu đồ cột)",
x="Trình độ học vấn", y="Số lượng") +
theme_minimal()
## Warning: The dot-dot notation (`..count..`) was deprecated in ggplot2 3.4.0.
## ℹ Please use `after_stat(count)` instead.
## This warning is displayed once every 8 hours.
## Call `lifecycle::last_lifecycle_warnings()` to see where this warning was
## generated.

Ý nghĩa kỹ thuật:

geom_bar() tạo biểu đồ cột đếm số lượng từng nhóm học vấn.

geom_text(stat=“count”) thêm nhãn số lượng trên mỗi cột.

theme_minimal() làm nền gọn, rõ ràng.

Nhận xét:

Nhóm học vấn thấp (cấp 1–2) chiếm tỷ lệ cao nhất, trong khi nhóm học vấn cao (đại học trở lên) ít hơn.

Điều này có thể phản ánh đặc điểm dân cư trong mẫu nghiên cứu (chủ yếu người lao động phổ thông).

Trình độ học vấn có thể ảnh hưởng đến nhận thức sức khỏe và nguy cơ mắc tiểu đường.

1.5.2.4 Biểu đồ 11: Mối quan hệ Tỷ lệ eo/hông và HDL (Scatter + Smooth)

# Biểu đồ 11: Mối quan hệ Tỷ lệ eo/hông và HDL (Scatter + Smooth)

ggplot(d_clean, aes(x=waist_to_hip_ratio, y=hdl_cholesterol)) +
geom_point(alpha=0.6, color="navy") +
geom_smooth(method="loess", color="red", se=TRUE) +
labs(title="Biểu đồ 11: Quan hệ giữa Tỷ lệ eo/hông và HDL (Scatter – Đường mượt loess)",
x="Tỷ lệ eo/hông", y="HDL (mg/dL)") +
theme_bw()
## `geom_smooth()` using formula = 'y ~ x'
## Warning: Failed to fit group -1.
## Caused by error in `predLoess()`:
## ! workspace required (15000725040) is too large probably because of setting 'se = TRUE'.

Ý nghĩa kỹ thuật:

geom_point() vẽ các điểm quan sát thực.

geom_smooth(method=“loess”) thêm đường xu hướng mượt để quan sát tổng thể.

se=TRUE hiển thị khoảng tin cậy.

theme_bw() dùng nền trắng giúp nổi bật dữ liệu.

Nhận xét:

Đường xu hướng có độ dốc âm nhẹ dẫn đến tỷ lệ eo/hông càng cao, mức HDL càng thấp.

Điều này đúng với thực tế: béo bụng làm giảm cholesterol tốt (HDL), tăng nguy cơ tim mạch và tiểu đường.

1.5.2.5 Biểu đồ 12: Quan hệ giữa Triglycerides và LDL (Scatter + Smooth)

# Biểu đồ 12: Quan hệ giữa Triglycerides và LDL (Scatter + Smooth)

ggplot(d_clean, aes(x=triglycerides, y=ldl_cholesterol, color=diabetes_stage)) +
geom_point(alpha=0.6) +
geom_smooth(method="lm", se=TRUE, color="black") +
labs(title="Biểu đồ 12: Quan hệ giữa Triglycerides và LDL ",
x="Triglycerides (mg/dL)", y="LDL (mg/dL)") +
theme_minimal() +
theme(plot.title=element_text(face="bold"))
## `geom_smooth()` using formula = 'y ~ x'

Ý nghĩa kỹ thuật:

geom_point() biểu diễn từng điểm dữ liệu với màu phân biệt theo giai đoạn bệnh.

geom_smooth(method=“lm”) vẽ đường hồi quy tuyến tính giữa Triglycerides và LDL.

theme_minimal() làm nổi bật dữ liệu.

Nhận xét:

Đường xu hướng có độ dốc dương dẫn đến mối tương quan thuận giữa Triglycerides và LDL.

Khi triglycerides tăng, LDL cũng tăng theo.

Đây là mối liên hệ điển hình trong rối loạn mỡ máu, cho thấy nguy cơ tim mạch cao hơn ở người có triglycerides cao.

1.5.2.6 Biểu đồ 13: Mối quan hệ Insulin và Triglycerides (Scatter + Smooth)

# Biểu đồ 13: Mối quan hệ Insulin và Triglycerides (Scatter + Smooth)

ggplot(d_clean, aes(x=insulin_level, y=triglycerides)) +
geom_point(aes(color=diabetes_stage), alpha=0.6) +
geom_smooth(method="loess", se=TRUE, color="red") +
labs(title="Biểu đồ 13: Quan hệ giữa Insulin và Triglycerides (Scatter – Đường loess)",
x="Insulin (µU/mL)", y="Triglycerides (mg/dL)") +
theme_light()
## `geom_smooth()` using formula = 'y ~ x'
## Warning: Failed to fit group -1.
## Caused by error in `predLoess()`:
## ! workspace required (15000725040) is too large probably because of setting 'se = TRUE'.

Ý nghĩa kỹ thuật:

geom_point() vẽ điểm dữ liệu, aes(color=diabetes_stage) giúp phân biệt giai đoạn bệnh.

geom_smooth(method=“loess”) vẽ đường mượt thể hiện xu hướng tổng thể.

theme_light() tạo nền sáng.

Nhận xét:

Mối quan hệ giữa insulin và triglycerides có xu hướng tăng nhẹ, tức là khi nồng độ insulin cao, triglycerides cũng tăng.

Điều này phản ánh hiện tượng kháng insulin cơ thể tiết nhiều insulin nhưng vẫn không kiểm soát được chuyển hóa lipid.

Mối tương quan này không mạnh nhưng có hướng dương rõ rệt, phù hợp với y học lâm sàng.

1.5.2.7 Biểu đồ 14: Biểu đồ hộp Insulin theo tiền sử tiểu đường gia đình

# Biểu đồ 14: Phân bố Insulin theo tiền sử tiểu đường gia đình
ggplot(d_clean %>% sample_frac(0.02),  # chỉ lấy 2% dữ liệu để hiển thị điểm
       aes(x = family_history_diabetes, y = insulin_level, fill = family_history_diabetes)) +
  geom_boxplot(alpha = 0.8, outlier.shape = NA) +  # bỏ điểm ngoại lai để tránh chồng
  geom_jitter(width = 0.15, alpha = 0.15, size = 0.8, color = "black") +  # điểm nhỏ, trong suốt
  labs(title = "Biểu đồ 14: Phân bố Insulin theo tiền sử tiểu đường gia đình (Boxplot – Biểu đồ hộp)",
       x = "Tiền sử tiểu đường gia đình", y = "Insulin (µU/mL)") +
  theme_bw() +
  theme(plot.title = element_text(face = "bold"))

Ý nghĩa kỹ thuật:

d_clean %>% sample_frac(0.02) lấy ngẫu nhiên 2% dữ liệu để biểu đồ nhẹ, không bị dày đặc điểm.

aes(…) xác định biến:

x: tiền sử tiểu đường gia đình (Có hoặc Không)

y: mức Insulin (µU/mL)

fill: tô màu theo nhóm gia đình

geom_boxplot() vẽ biểu đồ hộp, thể hiện trung vị, tứ phân vị, giá trị ngoại lai.

geom_jitter() thêm các điểm nhỏ để thấy rõ sự phân bố thật của dữ liệu (không chồng lên nhau).

theme_bw() giao diện nền trắng sạch dễ nhìn.

theme(plot.title = element_text(face = “bold”)) in đậm tiêu đề.

Nhận xét:

Hai nhóm “Có” và “Không có tiền sử tiểu đường gia đình” có mức Insulin tương đối giống nhau.

Tuy nhiên, nhóm “Có tiền sử” có độ dao động lớn hơn, cho thấy ảnh hưởng di truyền có thể làm thay đổi khả năng tiết Insulin của cơ thể ở mức độ cá nhân.

1.5.2.8 Biểu đồ 15: Phân bố tỷ lệ eo/hông theo giai đoạn bệnh

# Biểu đồ 15: Phân bố tỷ lệ eo/hông theo giai đoạn bệnh

ggplot(d_clean, aes(x=diabetes_stage, y=waist_to_hip_ratio, fill=diabetes_stage)) +
geom_violin(trim=FALSE, alpha=0.6) +
geom_boxplot(width=0.1, fill="white", outlier.shape=NA) +
labs(title="Biểu đồ 15: Phân bố tỷ lệ eo/hông theo giai đoạn bệnh (Violin – Biểu đồ đàn violon)",
x="Giai đoạn bệnh tiểu đường", y="Tỷ lệ eo/hông") +
theme_minimal()

Ý nghĩa kỹ thuật:

geom_violin() tạo hình đàn violon biểu diễn mật độ phân bố giá trị.

trim = FALSE giữ nguyên phần đuôi của phân bố (không cắt bớt dữ liệu).

geom_boxplot() thêm hộp nhỏ bên trong violon để thể hiện trung vị và phạm vi IQR.

theme_minimal() nền tối giản, giúp nổi bật phần biểu đồ.

Nhận xét:

Tỷ lệ eo/hông giữa các giai đoạn có phân bố gần tương tự, tuy nhiên có xu hướng cao hơn ở giai đoạn bệnh nặng hơn, điều này cho thấy người có mỡ bụng cao dễ mắc và tiến triển bệnh tiểu đường.

1.5.2.9 Biểu đồ 16: Histogram HDL phân theo tiền sử gia đình

# Biểu đồ 16: Histogram HDL phân theo tiền sử gia đình

ggplot(d_clean, aes(x=hdl_cholesterol, fill=family_history_diabetes)) +
geom_histogram(position="identity", alpha=0.6, bins=30) +
labs(title="Biểu đồ 16: Phân bố HDL theo tiền sử tiểu đường gia đình ",
x="HDL (mg/dL)", y="Tần suất") +
theme_classic()

Ý nghĩa kỹ thuật:

geom_histogram() chia trục x thành các khoảng (bins) để đếm tần suất xuất hiện giá trị HDL.

position = “identity” cho phép các cột chồng lên nhau để so sánh.

alpha = 0.6 làm cột trong suốt một phần để hai nhóm không che nhau.

Nhận xét:

Nhóm “Không có tiền sử” có HDL cao hơn, phân bố lệch phải (mức HDL tốt).

Nhóm “Có tiền sử” có nhiều người HDL thấp hơn có thể là yếu tố di truyền làm giảm cholesterol tốt, tăng nguy cơ tiểu đường.

1.5.2.10 Biểu đồ 17: Mức LDL trung bình theo trình độ học vấn

# Biểu đồ 17: Mức LDL trung bình theo trình độ học vấn

ggplot(d_clean, aes(x=education_level, y=ldl_cholesterol, fill=education_level)) +
stat_summary(fun=mean, geom="bar", alpha=0.7) +
stat_summary(fun.data=mean_cl_normal, geom="errorbar", width=0.2) +
labs(title="Biểu đồ 17: Mức LDL trung bình theo trình độ học vấn (Bar + Errorbar)",
x="Trình độ học vấn", y="LDL trung bình (mg/dL)") +
theme_light()
## Warning: Computation failed in `stat_summary()`.
## Caused by error in `fun.data()`:
## ! The package "Hmisc" is required.

Ý nghĩa kỹ thuật:

stat_summary(fun = mean) tính trung bình LDL cho từng nhóm học vấn.

geom = “bar” vẽ dạng cột.

fun.data = mean_cl_normal thêm thanh sai số (error bar) thể hiện độ tin cậy thống kê.

theme_light() nền sáng nhẹ.

NHận xét:

Mức LDL trung bình gần bằng nhau ở các nhóm trình độ học vấn không ảnh hưởng rõ ràng đến cholesterol xấu (LDL).

Tuy nhiên, người học cao thường ý thức dinh dưỡng tốt hơn, nên có thể LDL thấp hơn nhẹ.

1.5.2.11 Biểu đồ 18: Mức Triglycerides trung bình theo tình trạng việc làm

# Biểu đồ 18: Mức Triglycerides trung bình theo tình trạng việc làm

ggplot(d_clean, aes(x=employment_status, y=triglycerides, fill=employment_status)) +
stat_summary(fun=mean, geom="bar", alpha=0.8) +
stat_summary(fun.data=mean_cl_normal, geom="errorbar", width=0.2) +
labs(title="Biểu đồ 18: Mức Triglycerides trung bình theo tình trạng việc làm (Bar + Errorbar)",
x="Tình trạng việc làm", y="Triglycerides trung bình (mg/dL)") +
theme_minimal()
## Warning: Computation failed in `stat_summary()`.
## Caused by error in `fun.data()`:
## ! The package "Hmisc" is required.

Ý nghĩa kỹ thuật:

Biểu đồ này sử dụng cột trung bình (Bar chart) để thể hiện mức Triglycerides trung bình (mg/dL) của những người có tình trạng việc làm khác nhau.

Ngoài ra, biểu đồ có thanh sai số (error bar) nhằm thể hiện độ dao động hoặc mức độ tin cậy của giá trị trung bình.

Mục tiêu là so sánh xem nhóm nghề nghiệp có ảnh hưởng đến mức Triglycerides (mỡ máu) hay không.

Cột cao → mức Triglycerides trung bình cao hơn.

Thanh sai số dài → dữ liệu biến động mạnh, ít ổn định.

ggplot(d_clean, aes(…)): Khởi tạo ggplot từ dữ liệu đã làm sạch d_clean.

x = employment_status: biến trục hoành là tình trạng việc làm.

y = triglycerides: biến trục tung là mức Triglycerides.

fill = employment_status: tô màu cột theo nhóm việc làm.

stat_summary(fun=mean, geom=“bar”): Tính giá trị trung bình của mỗi nhóm và biểu diễn bằng cột.

stat_summary(fun.data=mean_cl_normal, geom=“errorbar”): Vẽ thanh sai số biểu diễn khoảng tin cậy.

alpha=0.8: Làm màu cột hơi trong suốt cho dễ nhìn.

theme_minimal(): Nền trắng, gọn gàng, rõ ràng.

Nhận xét:

Các nhóm việc làm có mức Triglycerides trung bình tương đối giống nhau, không có sự khác biệt rõ rệt.

Tuy nhiên, nhóm thất nghiệp hoặc ít vận động có xu hướng cao hơn nhẹ, có thể do lối sống ít vận động, chế độ ăn uống kém kiểm soát.

Thanh sai số ngắn cho thấy dữ liệu khá ổn định giữa các nhóm.

1.5.2.12 Biểu đồ 19: Mối quan hệ giữa HDL và LDL theo tiền sử gia đình

# Biểu đồ 19: Mối quan hệ giữa HDL và LDL theo tiền sử gia đình

ggplot(d_clean, aes(x=hdl_cholesterol, y=ldl_cholesterol, color=family_history_diabetes)) +
geom_point(alpha=0.7) +
geom_smooth(method="lm", se=FALSE) +
labs(title="Biểu đồ 19: Mối quan hệ giữa HDL và LDL theo tiền sử gia đình ",
x="HDL (mg/dL)", y="LDL (mg/dL)") +
theme_bw()
## `geom_smooth()` using formula = 'y ~ x'

Ý nghĩa kỹ thuật:

Biểu đồ scatter thể hiện mối tương quan giữa HDL (cholesterol tốt) và LDL (cholesterol xấu).

Mỗi chấm biểu thị một người trong dữ liệu.

Màu sắc thể hiện có hoặc không có tiền sử tiểu đường gia đình.

Đường hồi quy (Regression Line) cho biết xu hướng tổng quát của mối quan hệ giữa HDL và LDL.

Mục tiêu là xem HDL và LDL có quan hệ thuận, nghịch hay không có mối liên hệ.

aes(x=hdl_cholesterol, y=ldl_cholesterol): trục X là HDL, trục Y là LDL.

color=family_history_diabetes: tô màu theo nhóm có/không tiền sử tiểu đường gia đình.

geom_point(alpha=0.7): vẽ các điểm dữ liệu, alpha=0.7 giúp làm trong để chồng nhiều điểm dễ thấy.

geom_smooth(method=“lm”, se=FALSE): vẽ đường hồi quy tuyến tính (lm = linear model), không hiển thị dải sai số.

theme_bw(): giao diện nền trắng đen chuẩn, dễ đọc.

Nhận xét:

Các điểm dữ liệu cho thấy mối quan hệ nghịch giữa HDL và LDL:

Khi HDL (cholesterol tốt) tăng, thì LDL (cholesterol xấu) giảm.

Xu hướng này xuất hiện ở cả hai nhóm, nhưng nhóm “có tiền sử gia đình” có nhiều điểm nằm ở vùng LDL cao → nguy cơ tim mạch và tiểu đường cao hơn.

Đường hồi quy dốc xuống thể hiện mối tương quan nghịch rõ ràng, phù hợp với lý thuyết y học: HDL giúp loại bỏ cholesterol xấu trong máu.

1.5.2.13 Biểu đồ 20: Triglycerides theo giai đoạn bệnh và tiền sử gia đình (Facet)

# Biểu đồ 20: Triglycerides theo giai đoạn bệnh và tiền sử gia đình (Facet)

ggplot(d_clean, aes(x=diabetes_stage, y=triglycerides, fill=diabetes_stage)) +
geom_boxplot(alpha=0.8) +
facet_wrap(~family_history_diabetes) +
labs(title="Biểu đồ 20: Triglycerides theo giai đoạn bệnh và tiền sử gia đình (Facet Boxplot)",
x="Giai đoạn bệnh", y="Triglycerides (mg/dL)") +
theme_light()

Ý nghĩa kỹ thuật:

Biểu đồ này là Boxplot có chia ô (facet), kết hợp hai yếu tố:

Giai đoạn bệnh tiểu đường (0–3)

Tiền sử tiểu đường trong gia đình (Có/Không)

Nó giúp ta so sánh phân bố của Triglycerides ở từng giai đoạn bệnh, riêng biệt cho từng nhóm gia đình, từ đó thấy ảnh hưởng của yếu tố di truyền theo mức độ bệnh.

aes(x=diabetes_stage, y=triglycerides): Trục X: giai đoạn bệnh (0–3), trục Y: mức Triglycerides.

fill=diabetes_stage: tô màu hộp theo giai đoạn bệnh.

geom_boxplot(alpha=0.8): vẽ biểu đồ hộp, hiển thị trung vị, khoảng tứ phân vị (IQR) và giá trị ngoại lai.

facet_wrap(~family_history_diabetes): chia biểu đồ thành 2 khung riêng biệt, tương ứng với “Có” và “Không có tiền sử tiểu đường gia đình”.

theme_light(): giao diện sáng, đường kẻ mảnh.

Nhận xét:

Quan sát hai biểu đồ nhỏ :

Cả hai nhóm “Có” và “Không” tiền sử đều có xu hướng mức Triglycerides tăng dần theo giai đoạn bệnh.

Tuy nhiên, ở nhóm “Có tiền sử”, trung vị và độ phân tán của Triglycerides cao hơn đáng kể — điều này nghĩa là:

Những người có yếu tố di truyền dễ có mức mỡ máu cao hơn,

Và biến động trong nhóm cũng lớn hơn (một số cá nhân có giá trị rất cao).

Yếu tố di truyền ảnh hưởng rõ rệt đến nồng độ Triglycerides, đặc biệt ở các giai đoạn bệnh nặng hơn.

1.5.2.14 Biểu đồ 21: Biểu đồ thanh tỷ lệ tiền sử gia đình theo giai đoạn bệnh

# Biểu đồ 21: Biểu đồ thanh tỷ lệ tiền sử gia đình theo giai đoạn bệnh

ggplot(d_clean, aes(x=diabetes_stage, fill=family_history_diabetes)) +
geom_bar(position="fill") +
scale_y_continuous(labels=scales::percent) +
labs(title="Biểu đồ 21: Tỷ lệ tiền sử gia đình theo giai đoạn bệnh (Stacked Bar – Biểu đồ cột tỷ lệ %)",
x="Giai đoạn bệnh", y="Tỷ lệ (%)") +
theme_minimal()

Ý nghĩa kỹ thuật:

Biểu đồ này thể hiện tỷ lệ phần trăm (%) người có và không có tiền sử tiểu đường trong gia đình ở từng giai đoạn bệnh . Dạng Stacked Bar (biểu đồ cột chồng) được dùng để thấy rõ cơ cấu phần trăm từng nhóm trong tổng thể.

Trục X: Giai đoạn bệnh (0–3).

Trục Y: Tỷ lệ (%).

Màu sắc: Phân biệt nhóm “Có” và “Không có” tiền sử tiểu đường gia đình.

Mục đích là xem xu hướng tăng/giảm của tỷ lệ có tiền sử tiểu đường theo giai đoạn bệnh.

ggplot(d_clean, aes(…)): gọi dữ liệu d_clean, gán biến trục X là giai đoạn bệnh, và tô màu theo tiền sử tiểu đường gia đình.

geom_bar(position=“fill”): vẽ cột, và position=“fill” giúp mỗi cột được chuẩn hóa thành 100%.

scale_y_continuous(labels=scales::percent): đổi trục Y thành phần trăm (%).

labs(…): đặt tiêu đề và nhãn trục.

theme_minimal(): nền đơn giản, dễ đọc.

Nhận xét:

Quan sát biểu đồ, ta thấy:

Nhóm “Không có tiền sử gia đình” chiếm tỷ lệ lớn nhất ở tất cả các giai đoạn bệnh.

Tuy nhiên, tỷ lệ “Có tiền sử gia đình” tăng nhẹ ở các giai đoạn bệnh nặng hơn (đặc biệt ở giai đoạn 2 và 3).

Điều này cho thấy yếu tố di truyền có xu hướng liên quan đến sự tiến triển của bệnh tiểu đường: người có tiền sử gia đình có khả năng mắc hoặc tiến triển bệnh sớm hơn.

1.5.2.15 Biểu đồ 22: Mối quan hệ LDL và Tỷ lệ eo/hông (Scatter + Smooth)

# Biểu đồ 22: Mối quan hệ LDL và Tỷ lệ eo/hông (Scatter + Smooth)

ggplot(d_clean, aes(x=waist_to_hip_ratio, y=ldl_cholesterol, color=diabetes_stage)) +
geom_point(alpha=0.6) +
geom_smooth(method="lm", se=FALSE) +
labs(title="Biểu đồ 22: Quan hệ LDL và Tỷ lệ eo/hông ",
x="Tỷ lệ eo/hông", y="LDL (mg/dL)") +
theme_bw()
## `geom_smooth()` using formula = 'y ~ x'

Ý nghĩa kỹ thuật:

Biểu đồ này dùng điểm phân tán (Scatter plot) để biểu diễn mối liên hệ giữa LDL (cholesterol xấu) và tỷ lệ eo/hông (chỉ số béo bụng), đồng thời phân nhóm theo giai đoạn bệnh tiểu đường bằng màu sắc.

Ngoài ra, biểu đồ còn có đường hồi quy (Smooth line) cho từng nhóm để thể hiện xu hướng tuyến tính giữa hai biến.

Mục tiêu: kiểm tra xem người có tỷ lệ eo/hông cao (béo bụng) có xu hướng LDL cao hơn hay không, và sự khác biệt này thay đổi theo giai đoạn bệnh như thế nào.

aes(x=waist_to_hip_ratio, y=ldl_cholesterol): trục X là tỷ lệ eo/hông, trục Y là LDL.

color=diabetes_stage: tô màu khác nhau theo giai đoạn bệnh.

geom_point(alpha=0.6): vẽ các điểm dữ liệu, alpha=0.6 giúp nhìn xuyên được khi trùng điểm.

geom_smooth(method=“lm”, se=FALSE): thêm đường hồi quy tuyến tính cho từng nhóm bệnh (lm = linear model), không hiển thị dải sai số.

theme_bw(): nền sáng, dễ phân tích.

Nhận xét:

Các đường hồi quy đều có xu hướng dốc lên, cho thấy mối quan hệ thuận giữa LDL và tỷ lệ eo/hông:

Khi tỷ lệ eo/hông tăng (tức béo bụng hơn), mức LDL (cholesterol xấu) cũng tăng.

Dữ liệu phân tán rộng, cho thấy mối quan hệ tồn tại nhưng không quá mạnh.

Có mối tương quan thuận nhẹ giữa LDL và tỷ lệ eo/hông, đặc biệt rõ ở giai đoạn bệnh nhẹ.

Điều này phù hợp với thực tế y học: béo bụng làm tăng cholesterol xấu, từ đó tăng nguy cơ bệnh tim và tiểu đường.

1.5.2.16 Biểu đồ 23: Quan hệ giữa Insulin và HDL theo Giai đoạn bệnh (Facet Scatter)

# Biểu đồ 23: Quan hệ giữa Insulin và HDL theo Giai đoạn bệnh (Facet Scatter)

ggplot(d_clean, aes(x=insulin_level, y=hdl_cholesterol, color=diabetes_stage)) +
geom_point(alpha=0.7) +
geom_smooth(method="loess", se=FALSE) +
facet_wrap(~diabetes_stage) +
labs(title="Biểu đồ 23: Quan hệ giữa Insulin và HDL theo giai đoạn bệnh ",
x="Insulin (µU/mL)", y="HDL (mg/dL)") +
theme_light()
## `geom_smooth()` using formula = 'y ~ x'

Ý nghĩa kỹ thuật:

Biểu đồ này thể hiện mối quan hệ giữa nồng độ Insulin (µU/mL) và mức HDL (cholesterol tốt), đồng thời được chia nhỏ (facet) theo các giai đoạn bệnh tiểu đường (0, 2, 3, NA).

Dạng Facet Scatter giúp so sánh hình dạng và xu hướng của mối quan hệ này trong từng giai đoạn bệnh khác nhau.

Mục tiêu: xem mức Insulin ảnh hưởng thế nào đến HDL và xu hướng này thay đổi ra sao theo tiến trình bệnh.

aes(x=insulin_level, y=hdl_cholesterol): trục X là nồng độ Insulin, trục Y là HDL.

color=diabetes_stage: tô màu theo giai đoạn bệnh.

geom_point(alpha=0.7): hiển thị từng điểm dữ liệu, mờ nhẹ để dễ nhìn.

geom_smooth(method=“loess”, se=FALSE): vẽ đường xu hướng phi tuyến (loess), phù hợp khi mối quan hệ không hoàn toàn tuyến tính.

facet_wrap(~diabetes_stage): chia biểu đồ thành 4 ô nhỏ, mỗi ô tương ứng với một giai đoạn bệnh.

theme_light(): nền sáng, rõ ràng.

Nhận xét:

Ở giai đoạn 0 (chưa bệnh): HDL tăng nhẹ theo mức Insulin, tức là người có Insulin ổn định thường có HDL tốt hơn.

Ở giai đoạn 2 và 3 (đã bệnh): mối quan hệ trở nên yếu hoặc ngược chiều nhẹ, HDL không còn tăng theo Insulin nữa.

Nhóm NA (thiếu thông tin) có phân bố ngẫu nhiên, không có xu hướng rõ.

Các điểm dữ liệu ở giai đoạn 3 tập trung dày ở vùng HDL thấp → cho thấy HDL giảm mạnh khi bệnh tiến triển.

Mối quan hệ giữa Insulin và HDL thay đổi theo giai đoạn bệnh:

Ở người khỏe mạnh, Insulin cao tương ứng với HDL cao.

Ở người tiểu đường, Insulin cao lại đi cùng HDL thấp, phản ánh tình trạng kháng Insulin và rối loạn mỡ máu.

1.6 KẾT LUẬN

Trong nghiên cứu này, nhóm đã tiến hành phân tích bộ dữ liệu “Diabetes Health Indicators Dataset” với quy mô 100.000 quan sát và 31 biến, bao gồm các yếu tố sinh học, lối sống, nhân khẩu học và tiền sử bệnh lý có liên quan đến nguy cơ mắc bệnh tiểu đường. Bằng việc sử dụng ngôn ngữ R – một công cụ mạnh mẽ trong phân tích dữ liệu – nhóm đã thực hiện toàn bộ quy trình xử lý từ đọc dữ liệu, làm sạch, mã hóa, kiểm tra giá trị ngoại lai, lọc theo ngưỡng y học, mô tả thống kê đến trực quan hóa và kiểm định mối quan hệ giữa các biến. Quá trình này giúp chuyển đổi dữ liệu thô từ file Excel sang dạng dữ liệu có cấu trúc (data frame), đảm bảo tính đầy đủ, logic và sẵn sàng cho các bước phân tích chuyên sâu hơn.

Kết quả thống kê mô tả cho thấy các biến sinh học chính như huyết áp tâm trương, cholesterol, triglycerides, insulin và tỷ lệ eo/hông đều nằm trong khoảng giá trị hợp lý theo chuẩn y học. Trong đó, các biến như insulin_level và triglycerides có phân bố lệch phải và hệ số biến thiên cao, phản ánh sự khác biệt đáng kể về chuyển hóa giữa các cá nhân. Nhóm biến định tính như trình độ học vấn, tình trạng việc làm, giai đoạn bệnh tiểu đường và tiền sử gia đình thể hiện sự đa dạng của đối tượng nghiên cứu, với phần lớn người tham gia có việc làm ổn định và trình độ học vấn từ trung học trở lên. Bộ dữ liệu không có giá trị bị thiếu (NA) hay trùng lặp, cho thấy chất lượng thu thập cao và độ tin cậy tốt cho các phân tích thống kê sau này.

Các kết quả kiểm định và phân tích mối tương quan chỉ ra rằng tồn tại mối liên hệ rõ rệt giữa các yếu tố sinh học và tiến triển bệnh tiểu đường. Cụ thể, Cholesterol tốt (HDL) có tương quan nghịch với cholesterol xấu (LDL) và mỡ máu (triglycerides), trong khi nồng độ insulin có mối tương quan thuận với tỷ lệ eo/hông, phản ánh hiện tượng kháng insulin thường gặp ở người béo bụng. Kiểm định Kruskal–Wallis và ANOVA cho thấy nồng độ insulin, LDL và triglycerides có sự khác biệt có ý nghĩa giữa các nhóm trình độ học vấn, tình trạng việc làm và giai đoạn bệnh. Đồng thời, kiểm định Chi-square khẳng định mối liên hệ chặt chẽ giữa yếu tố di truyền, trình độ học vấn và nghề nghiệp với giai đoạn bệnh tiểu đường, qua đó nhấn mạnh vai trò tổng hợp của yếu tố sinh học, xã hội và lối sống trong diễn tiến bệnh.

Phân tích trực quan với hệ thống hơn 20 biểu đồ từ cơ bản đến nâng cao (Histogram, Boxplot, Scatter, Violin, Facet, Bar Chart, Density…) giúp làm rõ hơn các phát hiện định lượng. Các biểu đồ cho thấy mức triglycerides và LDL tăng dần theo giai đoạn bệnh, HDL giảm rõ khi bệnh tiến triển, trong khi nhóm có tiền sử gia đình mắc tiểu đường có giá trị mỡ máu và tỷ lệ eo/hông cao hơn trung bình. Điều này phản ánh ảnh hưởng đồng thời của yếu tố di truyền và lối sống tới sự phát triển của bệnh tiểu đường, đồng thời xác nhận rằng những người có thói quen ít vận động, ăn uống thiếu kiểm soát hoặc có tiền sử bệnh lý gia đình thường có nguy cơ mắc bệnh cao hơn đáng kể. Việc sử dụng ggplot2 giúp biểu diễn trực quan dữ liệu lớn, làm nổi bật xu hướng sinh học, hỗ trợ kết luận một cách khách quan và dễ hiểu.

Từ toàn bộ kết quả phân tích, có thể kết luận rằng ngôn ngữ lập trình R là công cụ hữu hiệu trong phân tích dữ liệu y sinh học nhờ khả năng xử lý dữ liệu lớn, cung cấp các phương pháp thống kê linh hoạt và hỗ trợ trực quan hóa mạnh mẽ. Nghiên cứu đã chỉ ra rằng các chỉ số sinh học (triglycerides, LDL, HDL, insulin, tỷ lệ eo/hông) cùng với yếu tố nhân khẩu học và di truyền đều ảnh hưởng đáng kể đến nguy cơ mắc bệnh tiểu đường. Điều này gợi ý rằng việc kết hợp chế độ dinh dưỡng lành mạnh, duy trì cân nặng hợp lý, tăng cường hoạt động thể chất và tầm soát sớm đối với nhóm có tiền sử gia đình là biện pháp quan trọng nhằm kiểm soát và phòng ngừa bệnh. Trong tương lai, có thể mở rộng nghiên cứu bằng cách áp dụng các mô hình hồi quy logistic hoặc mô hình học máy (machine learning) để dự đoán xác suất mắc bệnh tiểu đường dựa trên các biến đã được xử lý, từ đó hỗ trợ các nhà y học và nhà hoạch định chính sách trong việc xây dựng hệ thống cảnh báo sớm, góp phần giảm thiểu tỷ lệ mắc và tử vong do bệnh tiểu đường trong cộng đồng.

2 CHƯƠNG 2: PHÂN TÍCH DỮ LIỆU BÁO CÁO TÀI CHÍNH TECHCOMBANK 2014-2023

2.1 MỞ ĐẦU

2.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.

2.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.

2.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.

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

2.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.

2.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,…).

2.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.

2.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.

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

2.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.2 Đọc dữ liệu

library(readxl)
#Đọc dữ liệu
tieuluan <- read_excel("C:/Users/maica/Downloads/Phan2TCB/TCB.xlsx")

2.2.3 Xem thông tin chung của bộ dữ liệu

2.2.3.1 Định dạng lại dữ liệu

#Định dạng lại dữ liệu trước khi hiển thị
#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:27] <- lapply(tieuluan[, 2:27], function(x) {
  format(x, big.mark = ",", scientific = FALSE)
})

Nhận xét:

Áp dụng hàm format() cho từng cột. Tham số big.mark=“,” giúp thêm dấu phẩy để phân tách hàng nghìn, còn scientific=FALSE tắt chế độ hiển thị số dạng khoa học. Sau khi định dạng, các giá trị trong bảng được hiển thị rõ ràng, dễ đọc hơn, giúp người xem nhận biết quy mô và so sánh số liệu tài chính một cách trực quan.

2.2.3.2 Nạp thư viện hỗ trợ hiển thị dữ liệu

# Cài đặt gói
# install.packages("DT")
# install.packages("htmltools")

# Nạp thư viện
library(DT)
library(htmltools)
## Warning: package 'htmltools' was built under R version 4.4.3

Nhận xét:

Hai thư viện DT và htmltools được sử dụng để hiển thị bảng dữ liệu tương tác trong R Markdown.

DT: hỗ trợ tạo bảng có thể cuộn, tìm kiếm, lọc, và phân trang.

htmltools: giúp định dạng bảng, thêm tiêu đề

2.2.3.3 Tắt chế độ hiển thị dạng số khoa học

# Tùy chỉnh cách hiển thị số trong toàn bộ phiên làm việc
options(scipen = 999999)  # Tắt chế độ hiển thị dạng số khoa học

Nhận xét:

Bước này giúp tắt chế độ hiển thị số khoa học để bảng dữ liệu không bị lỗi dãy số.

2.2.3.4 Hiển thị bảng dữ liệu

datatable(
  tieuluan,
  options = list(pageLength = 10, scrollX = TRUE),
  caption = htmltools::tags$caption(
    style = 'caption-side: top; text-align: center; font-weight: bold;',
    'Bảng 1. ',
    htmltools::em('Bộ dữ liệu tài chính Techcombank (2014–2023)')
  )
)

Ta sử dụng sử dụng một số lệnh bên dưới để xem thông tin chung của tieuluan.

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

#Kiểm tra kích thước bộ dữ liệu
dim(tieuluan)
## [1] 10 27

Nhận xét:

Kết quả lệnh dim(tieuluan) cho thấy bộ dữ liệu gồm 10 dòng và 27 cột, tương ứng với 10 năm quan sát (từ 2014 đến 2023) và 27 biến tài chính của ngân hàng Techcombank.

2.2.3.6 Xem tên các biến

#Xem tên các biến
names(tieuluan)
##  [1] "Năm"                                       
##  [2] "Tên ngân hàng"                             
##  [3] "Loại hình ngân hàng"                       
##  [4] "Tình hình kinh tế"                         
##  [5] "Tiền mặt vàng"                             
##  [6] "Tiền gửi tại NHNN"                         
##  [7] "Tiền gửi và cấp tín dụng cho các TCTD khác"
##  [8] "Tiền gửi tại các TCTD khác"                
##  [9] "Cấp tín dụng cho các TCTD khác"            
## [10] "Chứng khoán kinh doanh"                    
## [11] "Tài sản cố định"                           
## [12] "Nguyên giá tài sản cố định"                
## [13] "Khấu hao tài sản cố định"                  
## [14] "Các khoản phải thu"                        
## [15] "Tổng tài sản"                              
## [16] "Tiền gửi và vay các TCTD khác"             
## [17] "Tiền gửi của khách hàng"                   
## [18] "Phát hành giấy tờ có giá"                  
## [19] "Tổng nợ phải trả"                          
## [20] "Tổng vốn chủ sở hữu"                       
## [21] "Tổng nợ phải trả và vốn chủ sở hữu"        
## [22] "Mua nợ"                                    
## [23] "Dự phòng rủi ro hoạt động mua nợ"          
## [24] "Chứng khoán đầu tư"                        
## [25] "Chứng khoán đầu tư sẵn sàng để bán"        
## [26] "Dự phòng rủi ro chứng khoán đầu tư"        
## [27] "Lợi nhuận chưa phân phối"

Nhận xét:

Sử dụng lệnh names() cho kết quả trả về tên các biến trong bộ dữ liệu tieuluan. Bộ dữ liệu bao gồm 27 biến tài chính của ngân hàng Techcombank trong giai đoạn 2014–2023

Gồm các biến “Năm”, “Tên ngân hàng”, “Loại hình ngân hàng”, “Tình hình kinh tế”, “Tiền mặt vàng”, “Tiền gửi tại 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”, “Cấp tín dụng cho các TCTD khác”, “Chứng khoán kinh doanh”, “Tài sản cố định”, “Nguyên giá tài sản cố định”, “Khấu hao tài sản cố định”, “Các khoản phải thu”, “Tổng tài sản”, “Tiền gửi vay các TCTD khác”, “Tiền gửi của khách hàng”, “Phát hành giấy tờ có giá”, “Tổng nợ phải trả”, “Tổng vốn chủ sở hữu”, “Tổng nợ phải trả và vốn chủ sở hữu”, “Mua nợ”, “Dự phòng rủi ro hoạt động mua nợ”, “Chứng khoán đầu tư”, “Chứng khoán đầu tư sẵn sàng để bán”, “Dự phòng rủi ro chứng khoán đầu tư”, “Lợi nhuận chưa phân phối”.

2.2.3.7 Tạo bảng mô tả các biến

Dữ liệu bao gồm các biến sau, được tổng hợp chi tiết trong bảng dưới đây nhằm phục vụ cho quá trình phân tích:

library(kableExtra)

# Tạo bảng mô tả các biến trong bộ dữ liệu tài chính Techcombank
des_tcb <- data.frame(
  STT = 1:27,
  Tên_biến = c(
    "Năm", 
    "Tên ngân hàng", 
    "Loại hình ngân hàng",
    "Tình hình kinh tế",
    "Tiền mặt vàng",
    "Tiền gửi tại 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",
    "Cấp tín dụng cho các TCTD khác",
    "Chứng khoán kinh doanh",
    "Tài sản cố định",
    "Nguyên giá tài sản cố định",
    "Khấu hao tài sản cố định",
    "Các khoản phải thu",
    "Tổng tài sản",
    "Tiền gửi vay các TCTD khác",
    "Tiền gửi của khách hàng",
    "Phát hành giấy tờ có giá",
    "Tổng nợ phải trả",
    "Tổng vốn chủ sở hữu",
    "Tổng nợ phải trả và vốn chủ sở hữu",
    "Mua nợ",
    "Dự phòng rủi ro hoạt động mua nợ",
    "Chứng khoán đầu tư",
    "Chứng khoán đầu tư sẵn sàng để bán",
    "Dự phòng rủi ro chứng khoán đầu tư",
    "Lợi nhuận chưa phân phối"
  ),
  Mô_tả = c(
    "Năm tài chính tương ứng của số liệu báo cáo",
    "Tên đầy đủ của ngân hàng (Techcombank)",
    "Phân loại loại hình ngân hàng – thương mại cổ phần",
    "Tình hình kinh tế vĩ mô trong năm (mã hóa mô tả chung)",
    "Khoản tiền mặt và vàng bạc, đá quý mà ngân hàng nắm giữ tại thời điểm cuối năm",
    "Số tiền ngân hàng gửi tại Ngân hàng Nhà nước Việt Nam (NHNN)",
    "Tổng giá trị tiền gửi và tín dụng cấp cho các tổ chức tín dụng (TCTD) khác",
    "Khoản tiền gửi tại các TCTD khác trong hệ thống ngân hàng",
    "Khoản tín dụng Techcombank cấp cho các TCTD khác",
    "Giá trị chứng khoán kinh doanh mà ngân hàng đang nắm giữ",
    "Giá trị còn lại của tài sản cố định hữu hình và vô hình",
    "Nguyên giá ban đầu của toàn bộ tài sản cố định",
    "Phần giá trị tài sản cố định đã được khấu hao lũy kế",
    "Tổng giá trị các khoản phải thu khác của ngân hàng",
    "Tổng tài sản của ngân hàng tại thời điểm cuối năm",
    "Giá trị tiền gửi hoặc khoản vay từ các tổ chức tín dụng khác",
    "Tổng số tiền gửi của khách hàng tại ngân hàng",
    "Giá trị các giấy tờ có giá mà ngân hàng phát hành (trái phiếu, kỳ phiếu, chứng chỉ tiền gửi...)",
    "Tổng giá trị các khoản nợ phải trả của ngân hàng",
    "Giá trị tổng vốn chủ sở hữu của ngân hàng",
    "Tổng cộng nợ phải trả và vốn chủ sở hữu (kiểm tra tính cân đối)",
    "Giá trị các khoản nợ mà ngân hàng mua lại từ tổ chức khác",
    "Khoản dự phòng rủi ro cho các hoạt động mua nợ",
    "Tổng giá trị chứng khoán đầu tư dài hạn và ngắn hạn",
    "Giá trị chứng khoán đầu tư sẵn sàng để bán trên thị trường",
    "Khoản dự phòng rủi ro cho danh mục chứng khoán đầu tư",
    "Phần lợi nhuận sau thuế chưa được phân phối hoặc giữ lại"
  )
)

# Hiển thị bảng mô tả
des_tcb %>%
  kable("html", align = "c",
        col.names = c("**STT**", "**Tên biến**", "**Mô tả**"),
        caption = "<div style='text-align: center;'><b>Bảng 2. Danh sách và mô tả các biến trong bộ dữ liệu tài chính Techcombank (2014–2023)</b></div>") %>%
  kable_styling(bootstrap_options = c("striped", "hover", "condensed", "responsive"),
                full_width = F, position = "center", font_size = 14) %>%
  row_spec(0, bold = TRUE, background = "#6495ED") %>%
  column_spec(1:3, border_right = TRUE)
Bảng 2. Danh sách và mô tả các biến trong bộ dữ liệu tài chính Techcombank (2014–2023)
STT Tên biến Mô tả
1 Năm Năm tài chính tương ứng của số liệu báo cáo
2 Tên ngân hàng Tên đầy đủ của ngân hàng (Techcombank)
3 Loại hình ngân hàng Phân loại loại hình ngân hàng – thương mại cổ phần
4 Tình hình kinh tế Tình hình kinh tế vĩ mô trong năm (mã hóa mô tả chung)
5 Tiền mặt vàng Khoản tiền mặt và vàng bạc, đá quý mà ngân hàng nắm giữ tại thời điểm cuối năm
6 Tiền gửi tại NHNN Số tiền ngân hàng gửi tại Ngân hàng Nhà nước Việt Nam (NHNN)
7 Tiền gửi và cấp tín dụng cho các TCTD khác Tổng giá trị tiền gửi và tín dụng cấp cho các tổ chức tín dụng (TCTD) khác
8 Tiền gửi tại các TCTD khác Khoản tiền gửi tại các TCTD khác trong hệ thống ngân hàng
9 Cấp tín dụng cho các TCTD khác Khoản tín dụng Techcombank cấp cho các TCTD khác
10 Chứng khoán kinh doanh Giá trị chứng khoán kinh doanh mà ngân hàng đang nắm giữ
11 Tài sản cố định Giá trị còn lại của tài sản cố định hữu hình và vô hình
12 Nguyên giá tài sản cố định Nguyên giá ban đầu của toàn bộ tài sản cố định
13 Khấu hao tài sản cố định Phần giá trị tài sản cố định đã được khấu hao lũy kế
14 Các khoản phải thu Tổng giá trị các khoản phải thu khác của ngân hàng
15 Tổng tài sản Tổng tài sản của ngân hàng tại thời điểm cuối năm
16 Tiền gửi vay các TCTD khác Giá trị tiền gửi hoặc khoản vay từ các tổ chức tín dụng khác
17 Tiền gửi của khách hàng Tổng số tiền gửi của khách hàng tại ngân hàng
18 Phát hành giấy tờ có giá Giá trị các giấy tờ có giá mà ngân hàng phát hành (trái phiếu, kỳ phiếu, chứng chỉ tiền gửi…)
19 Tổng nợ phải trả Tổng giá trị các khoản nợ phải trả của ngân hàng
20 Tổng vốn chủ sở hữu Giá trị tổng vốn chủ sở hữu của ngân hàng
21 Tổng nợ phải trả và vốn chủ sở hữu Tổng cộng nợ phải trả và vốn chủ sở hữu (kiểm tra tính cân đối)
22 Mua nợ Giá trị các khoản nợ mà ngân hàng mua lại từ tổ chức khác
23 Dự phòng rủi ro hoạt động mua nợ Khoản dự phòng rủi ro cho các hoạt động mua nợ
24 Chứng khoán đầu tư Tổng giá trị chứng khoán đầu tư dài hạn và ngắn hạn
25 Chứng khoán đầu tư sẵn sàng để bán Giá trị chứng khoán đầu tư sẵn sàng để bán trên thị trường
26 Dự phòng rủi ro chứng khoán đầu tư Khoản dự phòng rủi ro cho danh mục chứng khoán đầu tư
27 Lợi nhuận chưa phân phối Phần lợi nhuận sau thuế chưa được phân phối hoặc giữ lại

2.2.3.8 Xem cấu trúc tổng quát của dữ liệu

#Xem cấu trúc tổng quát của dữ liệu
str(tieuluan)
## tibble [10 × 27] (S3: tbl_df/tbl/data.frame)
##  $ Năm                                       : num [1:10] 2014 2015 2016 2017 2018 ...
##  $ Tên ngân hàng                             : chr [1:10] "Techcombank" "Techcombank" "Techcombank" "Techcombank" ...
##  $ Loại hình ngân hàng                       : chr [1:10] "Ngân hàng TMCP" "Ngân hàng TMCP" "Ngân hàng TMCP" "Ngân hàng TMCP" ...
##  $ Tình hình kinh tế                         : chr [1:10] "Trước covid" "Trước covid" "Trước covid" "Trước covid" ...
##  $ Tiền mặt vàng                             : chr [1:10] "2,723,642" "2,754,299" "2,956,708" "2,344,362" ...
##  $ Tiền gửi tại NHNN                         : chr [1:10] " 1,168,265" " 1,602,619" " 2,533,875" " 4,317,924" ...
##  $ Tiền gửi và cấp tín dụng cho các TCTD khác: chr [1:10] " 18,922,460" " 14,762,009" " 21,598,874" " 30,117,314" ...
##  $ Tiền gửi tại các TCTD khác                : chr [1:10] " 9,588,234" " 7,487,472" " 9,058,942" "16,204,561" ...
##  $ Cấp tín dụng cho các TCTD khác            : chr [1:10] " 9,343,996" " 7,274,537" "12,539,932" "13,912,753" ...
##  $ Chứng khoán kinh doanh                    : chr [1:10] " 2,086,246" "     3,072" " 8,024,620" " 6,758,094" ...
##  $ Tài sản cố định                           : chr [1:10] "1,036,505" "  882,081" "1,582,722" "1,511,446" ...
##  $ Nguyên giá tài sản cố định                : chr [1:10] "1,361,399" "1,341,998" "1,518,287" "1,602,956" ...
##  $ Khấu hao tài sản cố định                  : chr [1:10] "  -704,367" "  -803,851" "  -941,451" "  -507,959" ...
##  $ Các khoản phải thu                        : chr [1:10] "10,366,601" "11,325,061" " 6,829,557" " 9,417,589" ...
##  $ Tổng tài sản                              : chr [1:10] "175,901,794" "192,009,075" "235,363,736" "269,392,380" ...
##  $ Tiền gửi và vay các TCTD khác             : chr [1:10] " 19,471,408" " 20,745,990" " 25,473,509" " 46,323,825" ...
##  $ Tiền gửi của khách hàng                   : chr [1:10] "131,689,810" "142,239,546" "173,448,929" "170,970,833" ...
##  $ Phát hành giấy tờ có giá                  : chr [1:10] " 6,253,623" " 8,133,896" "10,414,842" "17,639,970" ...
##  $ Tổng nợ phải trả                          : chr [1:10] "160,915,744" "175,481,015" "215,776,660" "242,461,635" ...
##  $ Tổng vốn chủ sở hữu                       : chr [1:10] " 14,986,050" " 16,528,060" " 19,586,476" " 26,930,745" ...
##  $ Tổng nợ phải trả và vốn chủ sở hữu        : chr [1:10] "175,901,794" "192,009,072" "235,363,136" "269,392,380" ...
##  $ Mua nợ                                    : chr [1:10] "  9,817" "395,375" " 19,466" " 12,092" ...
##  $ Dự phòng rủi ro hoạt động mua nợ          : chr [1:10] "  -491" "-4,446" "  -973" "  -176" ...
##  $ Chứng khoán đầu tư                        : chr [1:10] " 54,978,730" " 44,301,594" " 45,674,924" " 51,542,484" ...
##  $ Chứng khoán đầu tư sẵn sàng để bán        : chr [1:10] " 49,704,301" " 38,528,012" " 38,575,369" " 46,018,398" ...
##  $ Dự phòng rủi ro chứng khoán đầu tư        : chr [1:10] "  -923,154" "-1,128,768" "-1,460,558" "  -191,398" ...
##  $ Lợi nhuận chưa phân phối                  : chr [1:10] " 1,556,411" " 2,897,014" " 5,489,215" "10,996,701" ...

Nhận xét:

Sử dụng lệnh str() cho kết quả trả về cấu trúc tổng quát của bộ dữ liệu, bao gồm số quan sát, số biến, tên biến và kiểu dữ liệu của từng biến.

Biến “Năm” được lưu dưới dạng số thực (num), trong khi các biến còn lại được hiển thị ở dạng chuỗi ký tự (chr) do đã được định dạng lại bằng hàm format() để thêm dấu phẩy phân tách hàng nghìn.

2.2.3.9 Tóm tắt sơ bộ dữ liệu

# Tóm tắt sơ bộ dữ liệu tài chính Techcombank
summary(tieuluan)
##       Năm       Tên ngân hàng      Loại hình ngân hàng Tình hình kinh tế 
##  Min.   :2014   Length:10          Length:10           Length:10         
##  1st Qu.:2016   Class :character   Class :character    Class :character  
##  Median :2018   Mode  :character   Mode  :character    Mode  :character  
##  Mean   :2018                                                            
##  3rd Qu.:2021                                                            
##  Max.   :2023                                                            
##  Tiền mặt vàng      Tiền gửi tại NHNN 
##  Length:10          Length:10         
##  Class :character   Class :character  
##  Mode  :character   Mode  :character  
##                                       
##                                       
##                                       
##  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
##  Length:10                                  Length:10                 
##  Class :character                           Class :character          
##  Mode  :character                           Mode  :character          
##                                                                       
##                                                                       
##                                                                       
##  Cấp tín dụng cho các TCTD khác Chứng khoán kinh doanh Tài sản cố định   
##  Length:10                      Length:10              Length:10         
##  Class :character               Class :character       Class :character  
##  Mode  :character               Mode  :character       Mode  :character  
##                                                                          
##                                                                          
##                                                                          
##  Nguyên giá tài sản cố định Khấu hao tài sản cố định Các khoản phải thu
##  Length:10                  Length:10                Length:10         
##  Class :character           Class :character         Class :character  
##  Mode  :character           Mode  :character         Mode  :character  
##                                                                        
##                                                                        
##                                                                        
##  Tổng tài sản       Tiền gửi và vay các TCTD khác Tiền gửi của khách hàng
##  Length:10          Length:10                     Length:10              
##  Class :character   Class :character              Class :character       
##  Mode  :character   Mode  :character              Mode  :character       
##                                                                          
##                                                                          
##                                                                          
##  Phát hành giấy tờ có giá Tổng nợ phải trả   Tổng vốn chủ sở hữu
##  Length:10                Length:10          Length:10          
##  Class :character         Class :character   Class :character   
##  Mode  :character         Mode  :character   Mode  :character   
##                                                                 
##                                                                 
##                                                                 
##  Tổng nợ phải trả và vốn chủ sở hữu    Mua nợ         
##  Length:10                          Length:10         
##  Class :character                   Class :character  
##  Mode  :character                   Mode  :character  
##                                                       
##                                                       
##                                                       
##  Dự phòng rủi ro hoạt động mua nợ Chứng khoán đầu tư
##  Length:10                        Length:10         
##  Class :character                 Class :character  
##  Mode  :character                 Mode  :character  
##                                                     
##                                                     
##                                                     
##  Chứng khoán đầu tư sẵn sàng để bán Dự phòng rủi ro chứng khoán đầu tư
##  Length:10                          Length:10                         
##  Class :character                   Class :character                  
##  Mode  :character                   Mode  :character                  
##                                                                       
##                                                                       
##                                                                       
##  Lợi nhuận chưa phân phối
##  Length:10               
##  Class :character        
##  Mode  :character        
##                          
##                          
## 

Nhận xét:

Hàm summary() cho biết thống kê tổng quát của từng biến trong bộ dữ liệu, bao gồm giá trị nhỏ nhất, lớn nhất, trung bình và trung vị.

2.3 XỬ LÝ VÀ MÃ HÓA DỮ LIỆU

2.3.1 Kiểm tra giá trị thiếu((Missing Values – NA)

# Kiểm tra xem trong dữ liệu có giá trị NA hay không
colSums(is.na(tieuluan))
##                                        Năm 
##                                          0 
##                              Tên ngân hàng 
##                                          0 
##                        Loại hình ngân hàng 
##                                          0 
##                          Tình hình kinh tế 
##                                          0 
##                              Tiền mặt vàng 
##                                          0 
##                          Tiền gửi tại NHNN 
##                                          0 
## Tiền gửi và cấp tín dụng cho các TCTD khác 
##                                          0 
##                 Tiền gửi tại các TCTD khác 
##                                          0 
##             Cấp tín dụng cho các TCTD khác 
##                                          0 
##                     Chứng khoán kinh doanh 
##                                          0 
##                            Tài sản cố định 
##                                          0 
##                 Nguyên giá tài sản cố định 
##                                          0 
##                   Khấu hao tài sản cố định 
##                                          0 
##                         Các khoản phải thu 
##                                          0 
##                               Tổng tài sản 
##                                          0 
##              Tiền gửi và vay các TCTD khác 
##                                          0 
##                    Tiền gửi của khách hàng 
##                                          0 
##                   Phát hành giấy tờ có giá 
##                                          0 
##                           Tổng nợ phải trả 
##                                          0 
##                        Tổng vốn chủ sở hữu 
##                                          0 
##         Tổng nợ phải trả và vốn chủ sở hữu 
##                                          0 
##                                     Mua nợ 
##                                          0 
##           Dự phòng rủi ro hoạt động mua nợ 
##                                          0 
##                         Chứng khoán đầu tư 
##                                          0 
##         Chứng khoán đầu tư sẵn sàng để bán 
##                                          0 
##         Dự phòng rủi ro chứng khoán đầu tư 
##                                          0 
##                   Lợi nhuận chưa phân phối 
##                                          0

Ý nghĩa kỹ thuật:

Lệnh colSums(is.na(tieuluan)) cho biết số lượng giá trị bị thiếu (NA) trong từng biến. Kết quả cho thấy tất cả các cột đều có giá trị bằng 0, nghĩa là dữ liệu của Techcombank giai đoạn 2014–2023 không có giá trị bị thiếu.

Ý nghĩa thống kê:

Bộ dữ liệu được nhập đầy đủ, đảm bảo độ tin cậy cho quá trình phân tích thống kê mô tả và mô hình hóa ở các phần tiếp theo.

2.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
duplicated_rows <- tieuluan[duplicated(tieuluan), ]
# Đếm tổng số dòng trùng lặp
sum(duplicated(tieuluan))
## [1] 0

Ý nghĩa kỹ thuật:

Cú pháp tieuluan[duplicated(tieuluan), ], các dòng trùng lặp (nếu có) sẽ được loại bỏ, chỉ giữ lại một bản ghi duy nhất cho mỗi quan sát.

Ý nghĩa thống kê:

Việc xác định và loại bỏ các bản ghi trùng giúp đảm bảo độ tin cậy của thống kê mô tả phục vụ quá trình phân tích và trực quan hóa dữ liệu.

2.3.3 Chuyển các biến định tính sang factor

# Chuyển biến định tính sang factor
tieuluan$`Năm` <- as.factor(tieuluan$`Năm`)
tieuluan$`Tình hình kinh tế` <- as.factor(tieuluan$`Tình hình kinh tế`)
# Xem cấu trúc kiểu dữ liệu của 2 biến định tính
str(tieuluan[, c("Năm", "Tình hình kinh tế")])
## tibble [10 × 2] (S3: tbl_df/tbl/data.frame)
##  $ Năm              : Factor w/ 10 levels "2014","2015",..: 1 2 3 4 5 6 7 8 9 10
##  $ Tình hình kinh tế: Factor w/ 2 levels "Sau covid  ",..: 2 2 2 2 2 2 1 1 1 1

Ý nghĩa kỹ thuật:

Câu lệnh as.factor() được sử dụng để chuyển các biến định tính như “Năm” và “Tình hình kinh tế” từ kiểu ký tự (chr) sang kiểu phân loại (factor).

Ý nghĩa thống kê:

Việc chuyển các biến định tính sang dạng factor giúp phân loại các quan sát theo nhóm .

Nhờ đó, có thể dễ dàng so sánh xu hướng tài chính giữa các năm hoặc giữa các giai đoạn kinh tế khác nhau (Trước và Sau Covid).

2.3.4 Chuyển các biến định lượng sang numeric

# Loại bỏ dấu phẩy và chuyển sang numeric
cols_numeric <- c("Tiền mặt vàng",
                  "Tiền gửi tại NHNN",
                  "Tổng tài sản",
                  "Tài sản cố định",
                  "Các khoản phải thu")

# Dùng vòng lặp để chuyển tất cả 1 lượt
tieuluan[cols_numeric] <- lapply(tieuluan[cols_numeric], function(x) {
  as.numeric(gsub(",", "", x))
})
# Xem cấu trúc kiểu dữ liệu của các biến định lượng
str(tieuluan[, c("Tiền mặt vàng",
"Tiền gửi tại NHNN",
"Tổng tài sản",
"Tài sản cố định",
"Các khoản phải thu")])
## tibble [10 × 5] (S3: tbl_df/tbl/data.frame)
##  $ Tiền mặt vàng     : num [1:10] 2723642 2754299 2956708 2344362 2606467 ...
##  $ Tiền gửi tại NHNN : num [1:10] 1168265 1602619 2533875 4317924 10555483 ...
##  $ Tổng tài sản      : num [1:10] 175901794 192009075 235363736 269392380 320988941 ...
##  $ Tài sản cố định   : num [1:10] 1036505 882081 1582722 1511446 1718596 ...
##  $ Các khoản phải thu: num [1:10] 10366601 11325061 6829557 9417589 11322556 ...

Ý nghĩa kỹ thuật:

Chuyển đổi các biến định lượng sang dạng numeric được thực hiện bằng cách sử dụng hàm lapply() kết hợp với as.numeric() và gsub(). Trong đó, gsub(“,”, ““, x) dùng để loại bỏ dấu phẩy trong chuỗi dữ liệu, còn as.numeric() chuyển chuỗi ký tự thành giá trị số thực. Câu lệnh lapply() giúp áp dụng cùng một thao tác chuyển đổi cho nhiều cột cùng lúc, đảm bảo tính tự động và đồng nhất trong xử lý dữ liệu. Cuối cùng, hàm str() được dùng để kiểm tra lại cấu trúc, xác nhận rằng các biến đã chuyển đúng sang kiểu numeric.

Ý nghĩa thống kê:

Việc chuyển các biến định lượng sang dạng numeric là bước quan trọng trong quá trình xử lý dữ liệu, giúp R có thể thực hiện các phép tính thống kê.

Sau khi chuyển thành công, các biến “Tiền mặt vàng”, “Tiền gửi tại NHNN”, “Tổng tài sản”, “Tài sản cố định” và “Các khoản phải thu” đều có thể sử dụng để mô tả, so sánh và phân tích xu hướng biến động tài sản của Techcombank qua các năm.

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

2.3.5.1 Điều kiện AND (&)

Trường hơp lọc Tổng tài sản > 200.000.000 và Tiền gửi tại NHNN > 2.000.000

# Lọc điều kiện AND (&)

du_lieu_and <- subset(tieuluan,
`Tổng tài sản` > 200000000 &
`Tiền gửi tại NHNN` > 2000000)

Trình bày dữ liệu đã lọc ra bảng

library(DT)

datatable(
  du_lieu_and[, c("Năm", "Tổng tài sản", "Tiền gửi tại NHNN")],
  caption = "Bảng: Các năm Techcombank có Tổng tài sản > 200.000.000 và Tiền gửi tại NHNN > 2.000.000",
  options = list(pageLength = 5, scrollX = TRUE)
)

Ý nghĩa kỹ thuật:

Lệnh subset() được sử dụng để lọc các dòng dữ liệu thỏa đồng thời hai điều kiện

Dấu toán tử & (AND) giúp giữ lại các quan sát đáp ứng cả hai điều kiện cùng lúc. Kết quả được hiển thị dưới dạng bảng tương tác bằng hàm datatable() để dễ quan sát.

Ý nghĩa thống kê:

Dữ liệu lọc được cho thấy có 8 năm (2016–2023) mà Techcombank đạt tổng tài sản trên 200.000 tỷ đồng và tiền gửi tại NHNN vượt 2.000 tỷ đồng.

Điều này phản ánh giai đoạn ngân hàng duy trì quy mô tài sản lớn và khả năng thanh khoản cao, đặc biệt sau năm 2016 khi quy mô tài sản và tiền gửi tại NHNN đều tăng mạnh.

2.3.5.2 Điều kiện OR(|)

Trường hợp lọc các năm Tổng tài sản > 250.000.000 hoặc Tài sản cố định > 1.500.000

# Lọc dữ liệu theo điều kiện OR
du_lieu_or <- subset(tieuluan,
`Tổng tài sản` > 250000000 |
`Tài sản cố định` > 1500000)

Trình bày dữ liệu đã lọc ra bảng

# Hiển thị bảng kết quả
library(DT)
datatable(
du_lieu_or[, c("Năm", "Tổng tài sản", "Tài sản cố định")],
caption = "Bảng: Các năm Techcombank có Tổng tài sản > 250.000.000 hoặc Tài sản cố định > 1.500.000",
options = list(pageLength = 5, scrollX = TRUE)
)

Ý nghĩa kỹ thuật:

Câu lệnh subset() kết hợp với dấu | (OR) trong R được sử dụng để lọc các dòng dữ liệu thỏa ít nhất một trong hai điều kiện.

Trong trường hợp này, dữ liệu được lọc ra khi “Tổng tài sản” lớn hơn 250.000.000 hoặc “Tài sản cố định” lớn hơn 1.500.000.

Kết quả được hiển thị dưới dạng bảng tương tác datatable() giúp dễ dàng sắp xếp, tìm kiếm và quan sát dữ liệu sau khi lọc.

Ý nghĩa thống kê:

Kết quả cho thấy có 8 năm (2016–2023) thỏa điều kiện trên.

Đây là giai đoạn Techcombank có quy mô tài sản vượt mức 250.000 tỷ đồng hoặc đầu tư mạnh vào tài sản cố định, thể hiện sự mở rộng hoạt động kinh doanh song song với đầu tư cơ sở hạ tầng.

Xu hướng tăng trưởng liên tục của hai chỉ tiêu này cho thấy Techcombank duy trì tốc độ phát triển cao, đồng thời tăng cường năng lực tài chính và đầu tư dài hạn.

2.3.5.3 Điều kiện kết hợp AND và OR

Trường hợp lọc các năm mà Tổng tài sản > 250.000.000 đồng thời (Tiền gửi tại NHNN > 2.000.000 hoặc Tài sản cố định > 1.500.000)

# Lọc dữ liệu theo điều kiện kết hợp AND và OR
du_lieu_and_or <- subset(
tieuluan,
(`Tổng tài sản` > 250000000) &
(`Tiền gửi tại NHNN` > 2000000 | `Tài sản cố định` > 1500000)
)

Trình bày dữ liệu đã lọc ra bảng

# Hiển thị bảng kết quả
library(DT)
datatable(
du_lieu_and_or[, c("Năm", "Tổng tài sản", "Tiền gửi tại NHNN", "Tài sản cố định")],
caption = "Bảng: Các năm Techcombank có Tổng tài sản > 250.000.000 và (Tiền gửi tại NHNN > 2.000.000 hoặc Tài sản cố định > 1.500.000)",
options = list(pageLength = 5, scrollX = TRUE)
)

Ý nghĩa kỹ thuật:

Đoạn mã sử dụng hàm subset() trong R để lọc dữ liệu theo điều kiện kết hợp logic AND và OR.

Cụ thể, câu lệnh chọn ra những năm mà:

Tổng tài sản > 250.000.000 đồng, đồng thời có (Tiền gửi tại NHNN > 2.000.000) hoặc (Tài sản cố định > 1.500.000).

Toán tử & biểu thị phép và (AND) → cả hai điều kiện đều phải thỏa mãn.

Toán tử | biểu thị phép hoặc (OR) → chỉ cần một trong hai điều kiện đúng.

Kết quả được hiển thị bằng hàm datatable() trong gói DT, giúp:

Tạo bảng tương tác (có thể tìm kiếm, sắp xếp, phân trang).

Ý nghĩa thống kê:

Bảng kết quả thể hiện các năm Techcombank có tổng tài sản vượt 250 triệu, đồng thời có tiền gửi tại NHNN hoặc tài sản cố định ở mức cao.

Trong giai đoạn 2017–2021, các chỉ tiêu này đều đạt ngưỡng lớn, phản ánh năng lực tài chính mạnh mẽ và chiến lược đầu tư hiệu quả của ngân hàng.

Việc duy trì quy mô tài sản cao cùng tỷ lệ đầu tư hợp lý cho thấy:

Khả năng thanh khoản ngắn hạn được đảm bảo.

Tài sản dài hạn được củng cố ổn định.

Điều này chứng tỏ Techcombank phát triển bền vững, có quản trị tài chính hiệu quả và hiệu suất hoạt động ổn định qua các năm.

2.3.6 Sắp xếp dữ liệu

2.3.6.1 Sắp xếp dữ liệu theo Tổng tài sản giảm dần

Ta sắp xếp dữ liệu theo Tổng tài sản giảm dần

#Sắp xếp dữ liệu theo Tổng tài sản giảm dần
du_lieu_sapxep_ts <- tieuluan[order(-as.numeric(tieuluan$`Tổng tài sản`)), ]

Hiển thị bảng dữ liệu sau khi sắp xếp

library(DT)
datatable(
du_lieu_sapxep_ts[, c("Năm", "Tổng tài sản", "Tổng nợ phải trả", "Tổng vốn chủ sở hữu")],
caption = "Bảng: Dữ liệu Techcombank sắp xếp theo Tổng tài sản (giảm dần)",
options = list(pageLength = 10, scrollX = TRUE)
)

Ý nghĩa kỹ thuật:

Câu lệnh order() trong R được sử dụng để sắp xếp dữ liệu theo giá trị của một hoặc nhiều biến.

Trong trường hợp này, biến “Tổng tài sản” được chuyển sang dạng số (as.numeric()) để R có thể so sánh và sắp xếp chính xác.

Khi không thêm dấu “–” trước biến, dữ liệu được sắp xếp theo thứ tự tăng dần (từ nhỏ đến lớn).

Ý nghĩa thống kê:

Kết quả cho thấy Tổng tài sản của Techcombank tăng dần qua từng năm từ 2014 đến 2023, phản ánh quá trình mở rộng quy mô hoạt động ổn định và bền vững.

Đáng chú ý, giai đoạn 2020–2021 chịu ảnh hưởng của đại dịch COVID-19, tuy nền kinh tế Việt Nam gặp nhiều khó khăn nhưng tổng tài sản của Techcombank vẫn tiếp tục tăng mạnh.

Điều này cho thấy năng lực quản trị rủi ro, dự phòng thanh khoản và khả năng thích ứng linh hoạt của ngân hàng.

2.3.6.2 Sắp xếp dữ liệu theo Tiền mặt vàng tăng dần

Ta sắp xếp dữ liệu theo Tiền mặt vàng tăng dần

# Sắp xếp dữ liệu theo Tiền mặt vàng (tăng dần)
du_lieu_sapxep_tmv <- tieuluan[order(as.numeric(tieuluan$`Tiền mặt vàng`)), ]

Hiển thị bảng dữ liệu sau khi sắp xếp

library(DT)
datatable(
  du_lieu_sapxep_tmv[, c("Năm", "Tiền mặt vàng", "Tổng tài sản")],
  caption = "Bảng: Dữ liệu sắp xếp theo Tiền mặt vàng (tăng dần)",
  options = list(pageLength = 10, scrollX = TRUE)
)

Ý nghĩa kỹ thuật:

Câu lệnh order() trong R được sử dụng để sắp xếp dữ liệu theo giá trị của biến “Tiền mặt vàng”.

Ở đây, biến được chuyển sang dạng số bằng hàm as.numeric() để đảm bảo việc so sánh chính xác.

Không có dấu “-” trước tên biến nên dữ liệu được sắp xếp theo thứ tự tăng dần (từ nhỏ đến lớn).

Ý nghĩa thống kê:

Kết quả cho thấy giá trị Tiền mặt vàng của ngân hàng tăng dần qua các năm, phản ánh xu hướng gia tăng khả năng thanh khoản của ngân hàng.

Các năm đầu có giá trị tiền mặt thấp thể hiện giai đoạn đầu tư hoặc mở rộng, trong khi các năm gần đây (như 2022–2023) có giá trị cao hơn, chứng tỏ ngân hàng duy trì lượng tiền mặt và vàng lớn hơn để đảm bảo an toàn thanh khoản.

2.3.6.3 Sắp xếp dữ liệu theo Tiền gửi tại NHNN giảm dần

Ta sắp xếp dữ liệu theo Tiền gửi tại NHNN giảm dần

# Sắp xếp dữ liệu theo Tiền gửi tại NHNN (giảm dần)
du_lieu_sapxep_nhnn <- tieuluan[order(-as.numeric(tieuluan$`Tiền gửi tại NHNN`)), ]

Hiển thị bảng dữ liệu sau khi sắp xếp

# Hiển thị bảng dữ liệu sau khi sắp xếp
datatable(
  du_lieu_sapxep_nhnn[, c("Năm", "Tiền gửi tại NHNN", "Tổng tài sản")],
  caption = "Bảng: Dữ liệu sắp xếp theo Tiền gửi tại NHNN (giảm dần)",
  options = list(pageLength = 10, scrollX = TRUE)
)

Ý nghĩa kỹ thuật:

Hàm order(-as.numeric()) được sử dụng để sắp xếp dữ liệu theo thứ tự giảm dần của biến “Tiền gửi tại NHNN”. Dấu “-” trước tên biến giúp đảo ngược thứ tự sắp xếp, đưa giá trị lớn nhất lên đầu.

Ý nghĩa thống kê:

Kết quả cho thấy các năm 2022–2023 có giá trị “Tiền gửi tại NHNN” cao nhất, thể hiện năng lực dự trữ thanh khoản mạnh và sự tuân thủ quy định dự trữ bắt buộc của Ngân hàng Nhà nước.

Các năm trước có giá trị thấp hơn phản ánh giai đoạn ngân hàng tối ưu hóa vốn hoặc chịu tác động từ biến động kinh tế (như giai đoạn COVID-19).

2.3.6.4 Sắp xếp dữ liệu theo Tài sản cố định giảm dần

Ta sắp xếp dữ liệu theo Tài sản cố định giảm dần

# Sắp xếp dữ liệu theo Tài sản cố định (giảm dần)
du_lieu_sapxep_tscd <- tieuluan[order(-as.numeric(tieuluan$`Tài sản cố định`)), ]

Hiển thị bảng dữ liệu sau khi sắp xếp

#Hiển thị bảng dữ liệu sau khi sắp xếp
datatable(
  du_lieu_sapxep_tscd[, c("Năm", "Tài sản cố định", "Tổng tài sản")],
  caption = "Bảng: Dữ liệu sắp xếp theo Tài sản cố định (giảm dần)",
  options = list(pageLength = 10, scrollX = TRUE)
)

Ý nghĩa kỹ thuật:

Biến “Tài sản cố định” được chuyển sang dạng số và sắp xếp giảm dần bằng order(-as.numeric(…)).

Điều này giúp xác định năm nào có giá trị tài sản cố định cao nhất, phục vụ việc phân tích đầu tư dài hạn.

Ý nghĩa thống kê:

Kết quả cho thấy tài sản cố định tăng mạnh trong các năm gần đây (2021–2023), phản ánh quá trình mở rộng quy mô hoạt động, đầu tư vào cơ sở vật chất, chi nhánh và công nghệ.

Các năm trước như 2014–2016 có giá trị thấp hơn, thể hiện giai đoạn đầu tư ban đầu còn hạn chế.

2.3.6.5 Sắp xếp dữ liệu theo Các khoản phải thu tăng dần

Ta sắp xếp dữ liệu theo Các khoản phải thu tăng dần

# Sắp xếp dữ liệu theo Các khoản phải thu (tăng dần)
du_lieu_sapxep_kpt <- tieuluan[order(as.numeric(tieuluan$`Các khoản phải thu`)), ]
#Hiển thị bảng dữ liệu sau khi sắp xếp
datatable(
  du_lieu_sapxep_kpt[, c("Năm", "Các khoản phải thu", "Tổng tài sản")],
  caption = "Bảng: Dữ liệu sắp xếp theo Các khoản phải thu (tăng dần)",
  options = list(pageLength = 10, scrollX = TRUE)
)

Ý nghĩa kỹ thuật:

Dữ liệu được sắp xếp theo giá trị tăng dần của biến “Các khoản phải thu” bằng hàm order(as.numeric(…)).

Không có dấu “-” nên các giá trị nhỏ được đưa lên đầu danh sách.

Ý nghĩa thống kê:

Kết quả cho thấy các khoản phải thu của ngân hàng có xu hướng tăng dần theo thời gian, đặc biệt sau giai đoạn COVID-19 (từ năm 2020 trở đi).

Điều này có thể do hoạt động tín dụng mở rộng hoặc khách hàng gặp khó khăn trong thanh toán, làm tăng giá trị phải thu. Mức tăng này phản ánh rủi ro tín dụng tiềm ẩn nhưng cũng thể hiện quy mô cho vay lớn hơn khi ngân hàng mở rộng thị phần.

2.4 THỐNG KÊ CƠ BẢN

2.4.1 Thống kê mô tả cho biến định tính

2.4.1.1 Đếm tần suất “Tình hình kinh tế”

table(tieuluan$`Tình hình kinh tế`)
## 
## Sau covid   Trước covid 
##           4           6

Ý nghĩa kỹ thuật:

Lệnh table() đếm số lượng quan sát (số dòng dữ liệu) thuộc từng nhóm trong biến “Tình hình kinh tế”. Giúp xác định có bao nhiêu năm thuộc giai đoạn Trước Covid và bao nhiêu năm thuộc Sau Covid.

Ý nghĩa thống kê:

Có 6 năm thuộc giai đoạn Trước Covid, Có 4 năm thuộc giai đoạn Sau Covid.

Điều này cho thấy dữ liệu có sự phân bố đều giữa hai giai đoạn kinh tế, đảm bảo so sánh được tác động của đại dịch đến các chỉ tiêu tài chính của Techcombank.

2.4.1.2 Tính tỷ lệ phần trăm “Tình hình kinh tế”

prop.table(table(tieuluan$`Tình hình kinh tế`)) * 100
## 
## Sau covid   Trước covid 
##          40          60

Ý nghĩa kỹ thuật:

Hàm prop.table() chia tần suất của từng nhóm cho tổng số quan sát, sau đó nhân với 100 để ra tỷ lệ phần trăm.

Ý nghĩa thống kê:

Điều này phản ánh rằng phần lớn giai đoạn nghiên cứu nằm trong thời kỳ trước đại dịch, tuy nhiên dữ liệu sau Covid vẫn đủ lớn (40%) để thực hiện so sánh và đánh giá ảnh hưởng kinh tế đến hoạt động của Techcombank.

2.4.2 Thống kê mô tả cho biến định lượng

2.4.2.1 Thống kê tóm tắt Tổng tài sản

summary(tieuluan$`Tổng tài sản`)
##      Min.   1st Qu.    Median      Mean   3rd Qu.      Max. 
## 175901794 243870897 352344201 413420183 536447446 849482012

Ý nghĩa kỹ thuật:

Hàm summary() trong R trả về thống kê mô tả tổng quát cho biến định lượng

Ý nghĩa thống kê:

Tổng tài sản của Techcombank giai đoạn 2014–2023 dao động từ 175.901.794 triệu đồng đến 849.482.012 triệu đồng, trung bình đạt 413.420.183 triệu đồng.

Điều này cho thấy quy mô tài sản tăng trưởng mạnh mẽ và ổn định, phản ánh sự mở rộng quy mô hoạt động qua các năm.

2.4.2.2 So sánh Tổng tài sản giữa giai đoạn Trước và Sau Covid

tapply(tieuluan$`Tổng tài sản`, tieuluan$`Tình hình kinh tế`, mean)
## Sau covid   Trước covid 
##   639211610   262892565

Ý nghĩa kỹ thuật:

Dùng tapply() để tính trung bình của biến định lượng theo từng nhóm định tính “Tình hình kinh tế”.

Ý nghĩa thống kê:

Trước Covid: Tổng tài sản trung bình thấp hơn rõ rệt.

Sau Covid: Trung bình tăng mạnh, chứng tỏ quy mô Techcombank mở rộng nhanh sau đại dịch.

2.4.2.3 Kiểm tra tương quan giữa Tổng tài sản và Tiền gửi tại NHNN

cor(tieuluan$`Tổng tài sản`, tieuluan$`Tiền gửi tại NHNN`)
## [1] 0.8346824

Ý nghĩa kỹ thuật:

Hàm cor() đo mức độ tương quan tuyến tính giữa hai biến định lượng.

Ý nghĩa thống kê:

Hệ số tương quan dương gần nên tài sản tăng thì tiền gửi tại NHNN cũng tăng, phản ánh cơ cấu thanh khoản ổn định.

2.4.2.4 Phân nhóm tài sản theo mức (Thấp, Trung bình, Cao)

tieuluan$Nhom_TS <- cut(tieuluan$`Tổng tài sản`,
                        breaks = 3,
                        labels = c("Thấp", "Trung bình", "Cao"))
table(tieuluan$Nhom_TS)
## 
##       Thấp Trung bình        Cao 
##          6          2          2

Ý nghĩa kỹ thuật:

Lệnh cut() trong R được sử dụng để phân loại một biến định lượng thành các nhóm rời rạc (factor) dựa theo khoảng giá trị.

Tham số breaks = 3 yêu cầu R chia toàn bộ khoảng giá trị của biến “Tổng tài sản” thành 3 khoảng bằng nhau về độ rộng.

Tham số labels = c(“Thấp”, “Trung bình”, “Cao”) giúp đặt tên cho từng nhóm.

Cuối cùng, table() dùng để đếm tần suất (số năm) thuộc mỗi nhóm.

Ý nghĩa thống kê:

Nhóm Thấp (6 năm): Gồm các năm 2014–2019 — thời kỳ đầu, quy mô tài sản còn khiêm tốn, ngân hàng tập trung củng cố vốn và mở rộng thị trường.

Nhóm Trung bình (2 năm): Tập trung vào giai đoạn 2020–2021 — khi Techcombank bắt đầu phục hồi và tăng tốc, dù vẫn chịu tác động của dịch Covid-19.

Nhóm Cao (2 năm): Tương ứng với 2022–2023 — thời kỳ tăng trưởng bứt phá sau đại dịch, tài sản vượt ngưỡng 650 triệu, phản ánh năng lực mở rộng mạnh và hiệu quả quản trị tốt.

2.4.2.5 Tính tốc độ tăng trưởng hàng năm của Tổng tài sản

tieuluan$Tangtruong_TS <- c(NA, diff(tieuluan$`Tổng tài sản`) / head(tieuluan$`Tổng tài sản`, -1) * 100)
tieuluan[, c("Năm", "Tangtruong_TS")]
## # A tibble: 10 × 2
##    Năm   Tangtruong_TS
##    <fct>         <dbl>
##  1 2014          NA   
##  2 2015           9.16
##  3 2016          22.6 
##  4 2017          14.5 
##  5 2018          19.2 
##  6 2019          19.5 
##  7 2020          14.6 
##  8 2021          29.4 
##  9 2022          22.9 
## 10 2023          21.5

Ý nghĩa kỹ thuật:

Dùng hàm diff() để tính chênh lệch theo năm và chia cho năm trước để ra phần trăm tăng trưởng.

Ý nghĩa thống kê:

Giúp xác định tốc độ phát triển từng năm, năm nào tăng mạnh hoặc chậm lại.

2.4.2.6 Tỷ trọng từng biến trong Tổng tài sản

tieuluan$Tytrong_TM <- tieuluan$`Tiền mặt vàng` / tieuluan$`Tổng tài sản` * 100
tieuluan$Tytrong_NHNN <- tieuluan$`Tiền gửi tại NHNN` / tieuluan$`Tổng tài sản` * 100
tieuluan$Tytrong_TSCD <- tieuluan$`Tài sản cố định` / tieuluan$`Tổng tài sản` * 100
tieuluan$Tytrong_PThu <- tieuluan$`Các khoản phải thu` / tieuluan$`Tổng tài sản` * 100
tieuluan[, c("Năm", "Tytrong_TM", "Tytrong_NHNN", "Tytrong_TSCD", "Tytrong_PThu")]
## # A tibble: 10 × 5
##    Năm   Tytrong_TM Tytrong_NHNN Tytrong_TSCD Tytrong_PThu
##    <fct>      <dbl>        <dbl>        <dbl>        <dbl>
##  1 2014       1.55         0.664        0.589         5.89
##  2 2015       1.43         0.835        0.459         5.90
##  3 2016       1.26         1.08         0.672         2.90
##  4 2017       0.870        1.60         0.561         3.50
##  5 2018       0.812        3.29         0.535         3.53
##  6 2019       1.26         0.832        0.836         3.38
##  7 2020       0.833        2.33         1.05          3.77
##  8 2021       0.629        0.863        1.27          4.94
##  9 2022       0.603        1.64         1.20          8.81
## 10 2023       0.426        3.19         1.05          8.22

Ý nghĩa kỹ thuật:

Các biến được chuẩn hóa thành tỷ trọng (%) so với Tổng tài sản của Techcombank.

Cú pháp chia từng biến cho Tổng tài sản và nhân với 100 giúp so sánh quy mô tương đối giữa các loại tài sản qua thời gian.

Kết quả hiển thị bảng gồm cột năm và tỷ trọng của 4 thành phần chính, giúp nhận biết sự thay đổi cơ cấu tài sản.

Ý nghĩa thống kê:

Tỷ trọng Tiền mặt vàng (Tytrong_TM):

Giảm dần từ 1.55% (2014) xuống còn 0.43% (2023) cho thấy Techcombank giảm lượng tiền mặt tồn kho, tăng hiệu quả sử dụng vốn.

Tỷ trọng Tiền gửi tại NHNN (Tytrong_NHNN): Tăng mạnh từ 0.66% lên hơn 4% phản ánh chính sách thanh khoản thận trọng và tăng dự trữ bắt buộc sau dịch Covid.

Tỷ trọng Tài sản cố định (Tytrong_TSCD): Tăng từ 0.59% lên 1.14% ngân hàng đầu tư nhiều hơn vào công nghệ, cơ sở hạ tầng và tài sản dài hạn.

Tỷ trọng Các khoản phải thu (Tytrong_PThu): Tăng từ 2.9–3% lên 5.2% cho thấy quy mô tín dụng mở rộng và sự gia tăng cho vay khách hàng doanh nghiệp.

2.4.2.7 Tương quan giữa Tổng tài sản và Tài sản cố định

cor(tieuluan$`Tổng tài sản`, tieuluan$`Tài sản cố định`)
## [1] 0.9768722

Ý nghĩa kỹ thuật:

Hàm cor() tính hệ số tương quan Pearson giữa hai biến định lượng.

Ý nghĩa thống kê:

Hệ số tương quan 0.9769 ⇒ mối quan hệ thuận cực kỳ chặt chẽ giữa Tổng tài sản và Tài sản cố định.

Khi quy mô tổng tài sản tăng thì giá trị tài sản cố định cũng tăng gần tương ứng, cho thấy Techcombank mở rộng đầu tư cơ sở hạ tầng, công nghệ và chi nhánh song song với tăng trưởng tổng tài sản.

2.4.2.8 Giá trị lớn nhất và nhỏ nhất của từng biến

apply(tieuluan[, c("Tiền mặt vàng","Tiền gửi tại NHNN","Tổng tài sản","Tài sản cố định","Các khoản phải thu")], 2, range)
##      Tiền mặt vàng Tiền gửi tại NHNN Tổng tài sản Tài sản cố định
## [1,]       2344362           1168265    175901794          882081
## [2,]       4820627          27140592    849482012         8892697
##      Các khoản phải thu
## [1,]            6829557
## [2,]           69834157

Ý nghĩa kỹ thuật:

Sử dụng hàm apply(…, 2, range) để tự động tính giá trị nhỏ nhất (Min) và lớn nhất (Max) của từng biến định lượng trong bộ dữ liệu.

Thao tác này giúp so sánh phạm vi dao động (Range) giữa các biến, qua đó nhận diện biến nào có sự biến động mạnh nhất theo thời gian.

Ý nghĩa thống kê:

Tổng tài sản dao động từ 175,9 triệu lên 849,4 triệu → cho thấy Techcombank mở rộng quy mô gần 5 lần trong 10 năm.

Tiền gửi tại NHNN tăng mạnh từ 1,16 triệu lên hơn 27 triệu → phản ánh chính sách tăng dự trữ bắt buộc và đảm bảo thanh khoản sau dịch.

Tài sản cố định tăng từ 0,88 triệu lên 8,89 triệu → thể hiện đầu tư mạnh vào hạ tầng và công nghệ.

Các khoản phải thu tăng từ 6,8 triệu lên 69,8 triệu → quy mô tín dụng mở rộng đáng kể, song cũng làm tăng rủi ro tín dụng.

Tiền mặt vàng dao động nhỏ nhất → cho thấy chính sách quản lý tiền mặt ổn định, ít thay đổi.

Tổng quan tất cả các biến đều có xu hướng tăng mạnh, chứng tỏ ngân hàng tăng trưởng nhanh và mở rộng hoạt động qua từng năm.

2.4.2.9 Tăng trưởng bình quân giai đoạn 2014–2023 (CAGR)

CAGR_TS <- ((tail(tieuluan$`Tổng tài sản`, 1) / head(tieuluan$`Tổng tài sản`, 1))^(1/9) - 1) * 100
CAGR_TS
## [1] 19.12066

Ý nghĩa kỹ thuật:

Hàm (tail(…) / head(…))^(1/n) - 1 tính tỷ lệ tăng trưởng bình quân hằng năm (Compound Annual Growth Rate) của biến Tổng tài sản.

tail() lấy giá trị cuối cùng (năm 2023), head() lấy giá trị đầu tiên (năm 2014), và mũ 1/9 chia cho số năm (2023–2014 = 9).

Nhân với 100 để ra % tăng trưởng bình quân mỗi năm.

Ý nghĩa thống kê:

Tốc độ tăng trưởng 19,12%/năm cho thấy Techcombank duy trì tốc độ mở rộng rất cao trong giai đoạn 2014–2023.

So với mức trung bình toàn ngành (~12–15%/năm), tốc độ này vượt trội, phản ánh hiệu quả mở rộng tín dụng, huy động vốn và đầu tư tài sản cố định.

Tăng trưởng cao nhưng bền vững, ngân hàng vừa tăng quy mô vừa đảm bảo cơ cấu tài sản hợp lý (đã thể hiện qua tỷ trọng và tương quan ở các phần trước).

Giai đoạn sau Covid (2020–2023): tốc độ tăng vẫn duy trì tốt, chứng tỏ khả năng phục hồi nhanh, năng lực thích ứng tốt với biến động kinh tế.

2.4.2.10 Hệ số hồi quy giữa Tổng tài sản và Tài sản cố định

model_reg <- lm(`Tổng tài sản` ~ `Tài sản cố định`, data = tieuluan)
summary(model_reg)
## 
## Call:
## lm(formula = `Tổng tài sản` ~ `Tài sản cố định`, 
##     data = tieuluan)
## 
## Residuals:
##       Min        1Q    Median        3Q       Max 
## -76675090 -27836086 -12564851  22533342  87384363 
## 
## Coefficients:
##                        Estimate    Std. Error t value   Pr(>|t|)    
## (Intercept)       140043368.492  26695867.391   5.246   0.000778 ***
## `Tài sản cố định`        69.951         5.413  12.922 0.00000122 ***
## ---
## Signif. codes:  0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
## 
## Residual standard error: 51490000 on 8 degrees of freedom
## Multiple R-squared:  0.9543, Adjusted R-squared:  0.9486 
## F-statistic:   167 on 1 and 8 DF,  p-value: 0.000001217

Ý nghĩa kỹ thuật:

Hàm lm() trong R được sử dụng để ước lượng mô hình hồi quy tuyến tính, giúp đánh giá mối quan hệ tuyến tính giữa hai biến định lượng.

Hàm summary() cho kết quả chi tiết về hệ số, sai số chuẩn, giá trị kiểm định t và R².

Ý nghĩa thống kê:

Kết quả hồi quy cho thấy hệ số hồi quy của Tài sản cố định là 69.951 với p-value rất nhỏ (0.00000122), nghĩa là có ý nghĩa thống kê ở mức 1%.

Điều này cho thấy khi Tài sản cố định tăng thêm 1 đơn vị, thì Tổng tài sản trung bình tăng khoảng 69.951 đơn vị, giữ các yếu tố khác không đổi.

Hệ số R² = 0.954 chứng tỏ Tài sản cố định giải thích được 95,4% sự biến động của Tổng tài sản, mô hình có độ phù hợp rất cao.

2.4.2.11 Tính tổng giá trị từng biến định lượng

colSums(tieuluan[, c("Tiền mặt vàng","Tiền gửi tại NHNN","Tổng tài sản","Tài sản cố định","Các khoản phải thu")])
##      Tiền mặt vàng  Tiền gửi tại NHNN       Tổng tài sản    Tài sản cố định 
##           33284779           77148457         4134201826           39081110 
## Các khoản phải thu 
##          238348348

Ý nghĩa kỹ thuật:

Hàm colSums() trong R được sử dụng để tính tổng giá trị của từng cột trong bộ dữ liệu.

Ở đây, ta áp dụng cho 5 biến định lượng — tức là cộng toàn bộ giá trị “Tiền mặt vàng”, “Tiền gửi tại NHNN”, “Tổng tài sản”, “Tài sản cố định” và “Các khoản phải thu” qua tất cả các năm.

Ý nghĩa thống kê:

Kết quả cho thấy tổng giá trị tích lũy của từng loại tài sản trong toàn bộ giai đoạn nghiên cứu (2014–2023).

Việc so sánh giúp xác định loại tài sản chiếm ưu thế.

2.4.2.12 So sánh Tổng tài sản 2 năm đầu và 2 năm cuối

mean(head(tieuluan$`Tổng tài sản`, 2)) - mean(tail(tieuluan$`Tổng tài sản`, 2))
## [1] -590301844

Ý nghĩa kỹ thuật:

Hàm head() lấy 2 năm đầu trong chuỗi dữ liệu, tail() lấy 2 năm cuối. Sau đó, mean() tính trung bình của từng giai đoạn.

Cuối cùng, phép trừ cho ra mức chênh lệch trung bình Tổng tài sản giữa 2 năm đầu và 2 năm cuối trong giai đoạn nghiên cứu.

Ý nghĩa thống kê:

Kết quả cho thấy giá trị trung bình của Tổng tài sản 2 năm đầu thấp hơn đáng kể so với 2 năm cuối (kết quả âm chứng tỏ tăng trưởng) . Điều này chứng minh quy mô tài sản của Techcombank đã mở rộng mạnh mẽ trong giai đoạn 10 năm, phản ánh xu hướng phát triển bền vững và tăng năng lực tài chính sau đại dịch Covid.

2.4.2.13 Tỷ lệ tăng trưởng trung bình động (Moving Average Growth)

library(zoo)
## Warning: package 'zoo' was built under R version 4.4.3
## 
## Attaching package: 'zoo'
## The following objects are masked from 'package:base':
## 
##     as.Date, as.Date.numeric
tieuluan$MA_TS <- rollmean(tieuluan$`Tổng tài sản`, 3, fill = NA, align = "right")
tieuluan[, c("Năm","Tổng tài sản","MA_TS")]
## # A tibble: 10 × 3
##    Năm   `Tổng tài sản`      MA_TS
##    <fct>          <dbl>      <dbl>
##  1 2014       175901794        NA 
##  2 2015       192009075        NA 
##  3 2016       235363736 201091535 
##  4 2017       269392380 232255064.
##  5 2018       320988941 275248352.
##  6 2019       383699461 324693594 
##  7 2020       439602933 381430445 
##  8 2021       568728950 464010448 
##  9 2022       699032544 569121476.
## 10 2023       849482012 705747835.

Ý nghĩa kỹ thuật:

Hàm rollmean() trong gói zoo giúp tính trung bình trượt (moving average) của Tổng tài sản theo chu kỳ 3 năm, giúp làm mượt dữ liệu, loại bỏ nhiễu trong ngắn hạn.

Ý nghĩa thống kê:

Giúp nhận biết xu hướng tăng trưởng ổn định hay biến động mạnh của Tổng tài sản qua thời gian.

2.4.2.14 Tỷ lệ thay đổi tuyệt đối hàng năm

tieuluan$ThayDoi_TS <- c(NA, diff(tieuluan$`Tổng tài sản`))
tieuluan[, c("Năm","ThayDoi_TS")]
## # A tibble: 10 × 2
##    Năm   ThayDoi_TS
##    <fct>      <dbl>
##  1 2014          NA
##  2 2015    16107281
##  3 2016    43354661
##  4 2017    34028644
##  5 2018    51596561
##  6 2019    62710520
##  7 2020    55903472
##  8 2021   129126017
##  9 2022   130303594
## 10 2023   150449468

Ý nghĩa kỹ thuật:

Dùng diff() để tính chênh lệch giữa các năm liên tiếp của Tổng tài sản. Hàm này xác định giá trị thay đổi tuyệt đối mỗi năm.

Ý nghĩa thống kê:

Thể hiện quy mô thay đổi thực tế của Tổng tài sản qua từng năm.

2.4.2.15 Chỉ số biến động (Volatility Index)

Vol_TS <- sd(tieuluan$`Tổng tài sản`) / mean(tieuluan$`Tổng tài sản`) * 100
Vol_TS
## [1] 54.9127

Ý nghĩa kỹ thuật:

Chỉ số biến động được tính bằng độ lệch chuẩn (standard deviation) chia cho giá trị trung bình của biến Tổng tài sản.

Công thức này thể hiện mức độ dao động tương đối của dữ liệu xung quanh giá trị trung bình.

Trong R, hàm sd() đo mức độ phân tán, còn chia cho mean() giúp chuẩn hóa, cho phép so sánh giữa các biến có đơn vị khác nhau.

Ý nghĩa thống kê:

Chỉ số biến động (Volatility Index) cho biết mức độ ổn định hay rủi ro của Tổng tài sản qua các năm.

Volatility thấp (<30%) → dữ liệu ổn định, biến động ít.

Volatility trung bình (30–60%) → biến động vừa phải, có thể kiểm soát được.

Volatility cao (>60%) → biến động mạnh, rủi ro cao, tài sản thay đổi nhiều qua thời gian.

Kết quả Volatility = 54.91% nằm trong khoảng trung bình cao, thể hiện Tổng tài sản của Techcombank có sự biến động khá mạnh qua các năm.

2.4.2.16 Hệ số hiệu quả sử dụng tài sản (Asset Utilization Ratio)

tieuluan$Hieuqua_TS <- tieuluan$`Tổng tài sản` / (tieuluan$`Tiền mặt vàng` + tieuluan$`Tiền gửi tại NHNN`)

Ý nghĩa kỹ thuật:

Dùng công thức Tổng tài sản / (Tiền mặt vàng + Tiền gửi NHNN) để đo khả năng sử dụng tài sản ngắn hạn tạo ra tổng tài sản.

Ý nghĩa thống kê:

Phản ánh hiệu quả huy động vốn ngắn hạn để phát triển quy mô tài sản. Hệ số cao sử dụng tài sản hiệu quả; thấp tồn tại dư thừa hoặc chưa tận dụng tốt nguồn vốn.

2.4.2.17 Hệ số biến thiên từng năm giữa Tổng tài sản và Tài sản cố định

tieuluan$HeSo_BienThien <- tieuluan$`Tài sản cố định` / tieuluan$`Tổng tài sản` * 100
tieuluan[, c("Năm","HeSo_BienThien")]
## # A tibble: 10 × 2
##    Năm   HeSo_BienThien
##    <fct>          <dbl>
##  1 2014           0.589
##  2 2015           0.459
##  3 2016           0.672
##  4 2017           0.561
##  5 2018           0.535
##  6 2019           0.836
##  7 2020           1.05 
##  8 2021           1.27 
##  9 2022           1.20 
## 10 2023           1.05

Ý nghĩa kỹ thuật:

Tính tỷ lệ Tài sản cố định / Tổng tài sản * 100 cho từng năm. Giúp xác định mức đóng góp của tài sản cố định trong tổng tài sản.

Ý nghĩa thống kê:

Trong giai đoạn 2014–2023, tỷ lệ tài sản cố định trong tổng tài sản của Techcombank tăng dần đều, thể hiện định hướng mở rộng cơ sở hạ tầng và chuyển đổi số mạnh mẽ sau Covid-19.

Điều này phản ánh hiệu quả tích cực trong chiến lược phát triển dài hạn, dù giai đoạn 2023 đã cho thấy dấu hiệu ổn định và kiểm soát tốc độ đầu tư để đảm bảo hiệu quả sử dụng vốn.

2.4.2.18 Mức tăng trung bình giữa 2 giai đoạn (Trước & Sau Covid)

Truoc <- mean(tieuluan$`Tổng tài sản`[1:6])
Sau   <- mean(tieuluan$`Tổng tài sản`[7:10])
ChenhLech <- Sau - Truoc
ChenhLech
## [1] 376319045

Ý nghĩa kỹ thuật:

Hàm mean() được dùng để tính giá trị trung bình Tổng tài sản trong 2 giai đoạn:

Trước Covid (2014–2019)

Sau Covid (2020–2023)

Sau đó lấy hiệu giữa trung bình hai giai đoạn để xác định mức tăng trưởng trung bình tuyệt đối về Tổng tài sản sau đại dịch.

Ý nghĩa thống kê:

Giá trị dương 376.319.045 (triệu đồng) cho thấy Tổng tài sản bình quân sau Covid cao hơn đáng kể so với giai đoạn trước.

Điều này phản ánh rằng Techcombank đã phục hồi mạnh mẽ sau đại dịch, duy trì đà tăng trưởng tốt

2.4.2.19 Tính độ bất đối xứng của Tổng tài sản (Skewness)

library(e1071)
## Warning: package 'e1071' was built under R version 4.4.3
skewness(tieuluan$`Tổng tài sản`)
## [1] 0.6519315

Ý nghĩa kỹ thuật:

Hàm skewness() trong gói e1071 đo độ lệch phân phối của biến so với trung bình.

Skewness = 0 → phân phối chuẩn (cân đối).

Skewness > 0 → lệch phải (tăng nhanh về phía giá trị cao).

Skewness < 0 → lệch trái (tập trung ở giá trị lớn, giảm mạnh ở cuối kỳ

Ý nghĩa thống kê:

Kết quả Skewness = 0.65 (>0) cho thấy phân phối Tổng tài sản lệch phải nhẹ — tức là có một số năm Tổng tài sản tăng mạnh hơn bình thường (cụ thể là giai đoạn 2021–2023).

2.4.2.20 Tính tỷ lệ tăng trưởng trung bình năm của Tài sản cố định

mean(diff(tieuluan$`Tài sản cố định`) / head(tieuluan$`Tài sản cố định`, -1)) * 100
## [1] 31.43922

Ý nghĩa kỹ thuật:

Công thức dùng diff() để lấy thay đổi từng năm của Tài sản cố định, chia cho giá trị năm trước, rồi lấy trung bình và nhân 100

Ý nghĩa thống kê:

Chỉ tiêu này thể hiện tốc độ đầu tư mở rộng tài sản cố định (TSCD) của ngân hàng qua các năm.

Nếu > 0 có xu hướng mở rộng đầu tư cơ sở vật chất.

Nếu < 0 → giảm đầu tư hoặc thu hẹp quy mô.

Nếu giá trị cao → tốc độ tăng nhanh, phản ánh chiến lược đầu tư mạnh mẽ.

Kết quả 31.44%/năm cho thấy Techcombank đầu tư bình quân tăng hơn 30% mỗi năm vào tài sản cố định trong giai đoạn 2014–2023.

Trong giai đoạn 2014–2023, Techcombank duy trì đà tăng trưởng cao về cả quy mô và chất lượng tài sản, đồng thời đẩy mạnh đầu tư tài sản cố định để phục vụ chiến lược phát triển dài hạn, đặc biệt sau đại dịch Covid-19.

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

2.5.1 Biểu đồ cơ bản về biến định lượng

2.5.1.1 Biểu đồ 1: Tổng tài sản qua các năm (Biểu đồ Đường – Line Chart)

# tạo khung biểu đồ
plot(tieuluan$Năm, tieuluan$`Tổng tài sản`, type="n",
     main="Biểu đồ Đường: Tổng tài sản Techcombank (2014–2023)",
     xlab="Năm", ylab="Tổng tài sản (triệu đồng)")

# thêm lưới nền
grid(col="grey", lty=3)

# thêm đường xu hướng
lines(tieuluan$Năm, tieuluan$`Tổng tài sản`, col="blue", lwd=2)

# thêm điểm dữ liệu
points(tieuluan$Năm, tieuluan$`Tổng tài sản`, pch=19, col="red")

# thêm đường trung bình
abline(h=mean(tieuluan$`Tổng tài sản`), col="darkgreen", lty=2)

# thêm nhãn giá trị
text(tieuluan$Năm, tieuluan$`Tổng tài sản`,
     labels=round(tieuluan$`Tổng tài sản`/1e6,1),
     pos=3, cex=0.8, col="black")

# thêm chú thích
legend("topleft", legend=c("Tổng tài sản","Giá trị trung bình"),
       col=c("blue","darkgreen"), lty=c(1,2), bty="n")

Ý nghĩa kỹ thuật:

Biểu đồ đường (Line Chart) dùng để thể hiện xu hướng biến động của biến định lượng theo thời gian.

type=“n”: tạo khung trống để thêm các lớp (layers) sau đó.

grid() thêm lưới nền, giúp dễ quan sát các mức giá trị.

lines() vẽ đường xu hướng nối các năm.

points() tô đỏ từng điểm dữ liệu thực tế.

abline() thêm đường trung bình giúp so sánh giá trị từng năm với mức trung bình toàn kỳ.

text() chèn nhãn số cụ thể trên mỗi điểm.

legend() tạo chú thích rõ ràng.

Biểu đồ thể hiện cách kết hợp nhiều lớp (layer) trong R base graphics: đường, điểm, trung bình và nhãn — giúp trực quan hóa xu hướng một cách toàn diện, dễ hiểu và thẩm mỹ.

Ý nghĩa thống kê:

Giai đoạn 2014–2017: tổng tài sản tăng dần từ khoảng 175.9 nghìn tỷ lên 269.4 nghìn tỷ đồng, thể hiện sự tăng trưởng đều đặn nhưng còn ở quy mô nhỏ.

Từ 2018–2020: tốc độ tăng nhanh hơn rõ rệt, tổng tài sản vượt mốc 400 nghìn tỷ đồng, cho thấy ngân hàng đẩy mạnh huy động vốn và mở rộng danh mục tín dụng.

2021–2023: tổng tài sản tăng vọt, đạt đỉnh gần 900 nghìn tỷ đồng, cao hơn đáng kể so với trung bình toàn kỳ (đường xanh lá).

Tổng tài sản của Techcombank tăng đều qua từng năm, không có năm giảm sút, chứng minh năng lực tài chính vững mạnh và hiệu quả kinh doanh cao.

Đường trung bình nằm thấp hơn hầu hết các điểm từ năm 2019 trở đi → chứng tỏ mức tài sản giai đoạn gần đây vượt xa trung bình, phản ánh tốc độ tăng trưởng vượt trội.

Biểu đồ thể hiện xu hướng tăng bền vững và tiềm năng mở rộng quy mô dài hạn của Techcombank.

2.5.1.2 Biểu đồ 2: Tiền gửi tại NHNN qua các năm (Cột – Bar Chart)

# tạo cột
bar <- barplot(tieuluan$`Tiền gửi tại NHNN`, names.arg=tieuluan$Năm,
               col="orange", main="Biểu đồ Cột: Tiền gửi tại NHNN (2014–2023)",
               ylab="Giá trị (triệu đồng)", border=NA)

# thêm lưới nền
grid(col="grey", lty=3)

# thêm đường xu hướng phụ
lines(bar, tieuluan$`Tiền gửi tại NHNN`/1.2, type="o", col="blue", lwd=2, pch=16)

# thêm đường trung bình
abline(h=mean(tieuluan$`Tiền gửi tại NHNN`), col="red", lty=2)

# thêm nhãn giá trị
text(bar, tieuluan$`Tiền gửi tại NHNN`, 
     labels=round(tieuluan$`Tiền gửi tại NHNN`/1e6,2),
     pos=3, cex=0.8)

# thêm chú thích
legend("topleft", legend=c("Tiền gửi NHNN", "Đường xu hướng", "Giá trị TB"),
       col=c("orange","blue","red"), lty=c(NA,1,2), pch=c(15,16,NA), bty="n")

Ý nghĩa kỹ thuật:

barplot(): tạo các cột biểu diễn giá trị tiền gửi theo năm.

lines() + pch: thêm đường xu hướng màu xanh, biểu diễn sự biến động qua thời gian.

abline(): thêm đường trung bình màu đỏ để đánh giá các năm cao/thấp hơn trung bình.

text(): hiển thị nhãn giá trị cụ thể trên đầu mỗi cột.

legend(): tạo chú thích rõ ràng cho từng thành phần.

Biểu đồ này giúp người xem so sánh nhanh sự thay đổi của tiền gửi qua từng năm và đánh giá xu hướng chung so với mức trung bình toàn giai đoạn.

Ý nghĩa thống kê:

2014–2016: Mức tiền gửi thấp (chỉ khoảng 1–2,5 triệu triệu đồng), thể hiện quy mô dự trữ thanh khoản còn nhỏ trong giai đoạn đầu.

2017–2018: Tăng mạnh, đạt đỉnh khoảng 10,5 triệu triệu đồng, cho thấy Techcombank tăng lượng tiền gửi dự trữ nhằm đảm bảo thanh khoản và đáp ứng yêu cầu an toàn vốn.

2019–2021: Có sự giảm tạm thời, thể hiện giai đoạn điều chỉnh chính sách vốn hoặc tăng đầu tư ra thị trường sinh lời cao hơn.

2022–2023: Tăng mạnh trở lại, năm 2023 đạt mức cao nhất toàn kỳ, vượt xa trung bình → chứng minh Techcombank tăng cường nguồn dự trữ để đảm bảo an toàn và sẵn sàng cho mở rộng tín dụng.

Mức tăng mạnh năm 2023 phản ánh chiến lược củng cố thanh khoản, đảm bảo an toàn vốn và khả năng ứng phó tốt với thay đổi của môi trường tài chính.

2.5.1.3 Biểu đồ 3: So sánh Tài sản cố định và Tổng tài sản (Cột – Đường kết hợp)

# tạo cột
bar <- barplot(tieuluan$`Tài sản cố định`, names.arg=tieuluan$Năm,
               col="lightgreen", ylim=c(0, max(tieuluan$`Tổng tài sản`)/1.5),
               main="Biểu đồ Cột – Đường: So sánh Tài sản cố định & Tổng tài sản",
               ylab="Giá trị (triệu đồng)", border=NA)

# thêm lưới nền
grid(col="grey", lty=3)

# thêm đường tổng tài sản
lines(bar, tieuluan$`Tổng tài sản`/1.5, col="blue", lwd=2)

# thêm điểm dữ liệu
points(bar, tieuluan$`Tổng tài sản`/1.5, pch=16, col="red")

# thêm nhãn giá trị
text(bar, tieuluan$`Tài sản cố định`,
     labels=round(tieuluan$`Tài sản cố định`/1e6,1),
     pos=3, cex=0.7)

# thêm chú thích
legend("topleft", legend=c("Tài sản cố định", "Tổng tài sản/1.5"),
       fill=c("lightgreen", NA), col=c(NA,"blue"), lty=c(NA,1), bty="n")

Ý nghĩa kỹ thuật:

Biểu đồ kết hợp Cột – Đường (Bar–Line Chart), dùng để so sánh hai đại lượng có đơn vị tương tự nhưng khác quy mô, giúp thể hiện cả giá trị tuyệt đối (Tài sản cố định) và xu hướng tổng thể (Tổng tài sản) trên cùng một biểu đồ.

barplot(): tạo các cột biểu diễn giá trị Tài sản cố định từng năm.

lines() và points(): thêm đường và điểm biểu diễn Tổng tài sản (đã chia tỷ lệ 1.5 để dễ so sánh).

grid() thêm lưới nền giúp dễ đọc giá trị.

text() chèn nhãn giá trị lên đầu cột.

legend() tạo chú thích để phân biệt hai loại tài sản.

Ý nghĩa thống kê:

Tổng tài sản (đường màu xanh) tăng nhanh qua từng năm, đặc biệt từ 2018 trở đi, thể hiện sự mở rộng quy mô và tăng trưởng hoạt động tài chính mạnh mẽ của Techcombank.

Tài sản cố định (cột màu xanh nhạt) cũng tăng dần nhưng chỉ chiếm tỷ trọng nhỏ trong tổng tài sản, cho thấy Techcombank tập trung vốn vào hoạt động đầu tư và tín dụng, thay vì mở rộng cơ sở vật chất.

Khoảng cách giữa hai đường ngày càng lớn → chứng tỏ tổng tài sản tăng nhanh hơn nhiều so với tài sản cố định, phản ánh sự chuyển hướng đầu tư vào các tài sản sinh lời cao hơn như chứng khoán, cho vay và đầu tư tài chính.

Tài sản cố định tăng chậm nhưng ổn định, cho thấy ngân hàng vẫn duy trì đầu tư cơ sở hạ tầng cần thiết.

Tổng tài sản tăng nhanh và vượt trội, phản ánh chiến lược phát triển theo chiều sâu, ưu tiên hiệu quả sinh lời của vốn.

Cấu trúc tài sản này thể hiện Techcombank đang sử dụng nguồn lực linh hoạt, tối ưu hóa lợi nhuận và củng cố vị thế tài chính mạnh trong hệ thống ngân hàng Việt Nam.

2.5.1.4 Biểu đồ 4: Cơ cấu tài sản năm 2023 (Tròn – Pie Chart)

#tạo dữ liệu năm 2023
ts_2023 <- c(
  tieuluan$`Tiền mặt vàng`[10],
  tieuluan$`Tiền gửi tại NHNN`[10],
  tieuluan$`Tài sản cố định`[10],
  tieuluan$`Các khoản phải thu`[10]
)

labels <- c("Tiền mặt vàng", "Tiền gửi NHNN", "Tài sản cố định", "Phải thu")
pct <- round(ts_2023 / sum(ts_2023) * 100, 1)
lbl <- paste(labels, pct, "%")

# chỉnh khung hình để biểu đồ cân đối và không bị đè
par(mar = c(6, 4, 4, 2))  # chừa thêm khoảng dưới

#Biểu đồ tròn chính
pie(
  ts_2023,
  labels = lbl,
  col = rainbow(4),
  border = "white",
  main = "Biểu đồ Tròn: Cơ cấu tài sản Techcombank năm 2023",
  cex.main = 1.2
)

#Nhãn trung tâm
text(0, 0, "Tổng tài sản", cex = 1.3, font = 2, col = "black")

#Màu sắc từng phần (col=rainbow(4)) nằm trong pie()

#Chú thích – đưa xuống thấp hẳn, tránh chồng lên biểu đồ
legend(
  x = -1.5, y = -1.2,      # điều chỉnh vị trí thủ công (trái + thấp)
  legend = labels,
  fill = rainbow(4),
  horiz = FALSE,           # xếp dọc
  bty = "n",
  cex = 0.9,
  x.intersp = 0.6,
  y.intersp = 1.3,
  title = "Chú thích:"
)

#Ghi nguồn dữ liệu bên dưới
mtext("Nguồn: Báo cáo tài chính Techcombank 2023", side = 1, line = -1.5, cex = 0.8)

Ý nghĩa kỹ thuật:

pie() tạo biểu đồ tròn biểu diễn tỷ trọng từng thành phần.

labels + pct: gắn tên và tỷ lệ phần trăm lên các phần.

col=rainbow(4): tạo 4 màu khác nhau cho từng loại tài sản.

text(0,0,…): thêm nhãn “Tổng tài sản” vào giữa vòng tròn.

legend(): tạo chú thích phân biệt màu và tên loại tài sản.

Biểu đồ trực quan hóa cơ cấu phân bổ tài sản trong tổng thể, giúp người xem dễ nhận biết loại tài sản chiếm tỷ trọng cao/thấp nhất trong năm.

Ý nghĩa thống kê:

Phải thu (63,8%): chiếm phần lớn cơ cấu thể hiện phần lớn tài sản Techcombank đang nằm ở hoạt động tín dụng và đầu tư sinh lời.

Tiền gửi tại NHNN (24,8%): thể hiện nguồn dự trữ bắt buộc và thanh khoản mà Techcombank duy trì để đảm bảo an toàn hệ thống.

Tài sản cố định (8,1%): tỷ trọng nhỏ cho thấy ngân hàng không tập trung vốn vào hạ tầng vật chất mà ưu tiên đầu tư vào hoạt động tài chính.

Tiền mặt vàng (3,3%): chiếm tỷ lệ thấp, hợp lý vì Techcombank tối ưu hóa dòng tiền, tránh vốn nhàn rỗi.

Cơ cấu tài sản cho thấy Techcombank duy trì tỷ trọng hợp lý giữa các loại tài sản, tập trung nhiều vào hoạt động sinh lời (phải thu, đầu tư) nhưng vẫn đảm bảo thanh khoản (tiền gửi NHNN).

Tỷ lệ thấp của tiền mặt và tài sản cố định phản ánh chiến lược sử dụng vốn hiệu quả, hướng tới tăng trưởng tài chính bền vững và khả năng sinh lợi cao.

2.5.1.5 Biểu đồ 5: Tốc độ tăng trưởng Tổng tài sản qua các năm (%) (Cột – Bar Chart)

# tạo cột
bar <- barplot(tieuluan$Tangtruong_TS, names.arg=tieuluan$Năm,
               col="skyblue", main="Biểu đồ Cột: Tốc độ tăng trưởng Tổng tài sản (%)",
               ylab="%", border=NA)

# thêm lưới nền
grid(col="grey", lty=3)

# thêm đường trung bình
abline(h=mean(tieuluan$Tangtruong_TS, na.rm=TRUE), col="red", lwd=2, lty=2)

# thêm điểm nhấn
points(bar, tieuluan$Tangtruong_TS, pch=19, col="darkblue")

# thêm nhãn phần trăm
text(bar, tieuluan$Tangtruong_TS, labels=round(tieuluan$Tangtruong_TS,1),
     pos=3, cex=0.8, col="black")

# thêm chú thích
legend("topleft", legend=c("Tốc độ tăng trưởng","Trung bình"),
       col=c("skyblue","red"), pch=c(15,NA), lty=c(NA,2), bty="n")

Ý nghĩa kỹ thuật:

barplot(): vẽ cột thể hiện tốc độ tăng trưởng từng năm.

abline(): thêm đường đỏ đứt biểu diễn mức tăng trưởng trung bình toàn kỳ.

points() và text(): hiển thị điểm dữ liệu thực tế và nhãn phần trăm trên đầu cột.

legend(): tạo chú thích giúp phân biệt giữa tốc độ tăng trưởng từng năm và giá trị trung bình.

Biểu đồ này kết hợp cột, đường và điểm, trực quan hóa được xu hướng biến động và so sánh tốc độ tăng từng năm so với mức trung bình, giúp đánh giá mức ổn định và hiệu quả tăng trưởng của Techcombank.

Ý nghĩa thống kê:

Giai đoạn 2014–2016: tốc độ tăng thấp (9–22%), phản ánh giai đoạn đầu Techcombank mở rộng quy mô hoạt động.

2017–2019: tăng trưởng ổn định quanh 14–19%, cho thấy ngân hàng duy trì đà phát triển bền vững.

Năm 2021: đạt đỉnh cao nhất (khoảng 27%), thể hiện sự bứt phá mạnh mẽ về quy mô tài sản, dù chịu ảnh hưởng của đại dịch COVID-19.

2022–2023: tốc độ tăng trưởng duy trì quanh 22%, cao hơn mức trung bình toàn giai đoạn (~19%), chứng minh Techcombank vẫn tăng trưởng ổn định và hiệu quả.

Tốc độ tăng trưởng tổng tài sản của Techcombank dao động quanh mức trung bình 19–20%, thể hiện xu hướng tăng tích cực và bền vững.

Các năm gần đây (2021–2023) có tốc độ tăng vượt trung bình, phản ánh hiệu quả mở rộng quy mô, khả năng huy động vốn và quản lý tài sản vượt trội.

Biểu đồ thể hiện rõ sự ổn định và khả năng duy trì đà tăng trưởng của Techcombank trong dài hạn.

2.5.1.6 Biểu đồ 6: Mối quan hệ giữa Tổng tài sản và Các khoản phải thu (Tán xạ – Scatter Plot)

# Vẽ biểu đồ tán xạ giữa Tổng tài sản và Các khoản phải thu
plot(tieuluan$`Tổng tài sản`, tieuluan$`Các khoản phải thu`,
     main="Tổng tài sản và Các khoản phải thu",
     xlab="Tổng tài sản", ylab="Các khoản phải thu",
     pch=19, col="steelblue")

# Thêm lưới
grid()

# Thêm đường hồi quy
abline(lm(tieuluan$`Các khoản phải thu` ~ tieuluan$`Tổng tài sản`),
       col="red", lwd=2)

# Thêm chú thích xu hướng
text(7e5, 4e4, "Quan hệ thuận mạnh", col="darkred", cex=0.8)

# Ghi nguồn dữ liệu
mtext("Nguồn: Báo cáo tài chính Techcombank", side=1, line=-1)

Ý nghĩa kỹ thuật:

Biểu đồ tán xạ (Scatter Plot), dùng để thể hiện mối quan hệ giữa hai biến định lượng – ở đây là Tổng tài sản (trục X) và Các khoản phải thu (trục Y).

plot(): vẽ các điểm tán xạ giữa hai biến.

abline(lm(…)): thêm đường hồi quy tuyến tính, biểu diễn xu hướng chung.

grid(): thêm lưới nền giúp đọc dữ liệu dễ hơn.

text(): thêm ghi chú thể hiện “quan hệ thuận mạnh”.

mtext(): thêm nguồn dữ liệu bên dưới biểu đồ.

Biểu đồ cho phép trực quan hóa mối quan hệ tuyến tính giữa hai biến, trong đó đường đỏ cho biết xu hướng tăng đồng biến (quan hệ thuận).

Ý nghĩa thống kê:

Khi Tổng tài sản tăng, Các khoản phải thu cũng tăng tương ứng.

Các điểm dữ liệu phân bố khá sát đường hồi quy màu đỏ, chứng tỏ mối quan hệ tuyến tính mạnh và ổn định.

Điều này phản ánh rằng, khi Techcombank mở rộng quy mô tổng tài sản, ngân hàng tăng mạnh các hoạt động cho vay, đầu tư, hoặc tài trợ vốn, khiến các khoản phải thu (đặc biệt là tín dụng khách hàng) tăng theo.

Mối quan hệ thuận mạnh này thể hiện hiệu quả sử dụng tài sản và chiến lược tăng trưởng tập trung vào cho vay – đầu tư, vốn là nguồn sinh lợi chính của ngân hàng.

Tổng tài sản và các khoản phải thu có quan hệ đồng biến rõ rệt, phản ánh chiến lược mở rộng tài sản gắn liền với hoạt động cho vay.

Mối tương quan này chứng minh Techcombank sử dụng tài sản hiệu quả, đảm bảo mức tăng trưởng tín dụng song hành với quy mô tổng tài sản.

Về mặt thống kê, có thể kết luận hệ số tương quan r > 0,9 (rất mạnh), thể hiện sự phụ thuộc tích cực giữa hai biến.

2.5.1.7 Biểu đồ 7: Các khoản phải thu qua các năm (Đường - Line Chart)

# Vẽ biểu đồ đường
plot(tieuluan$Năm, tieuluan$`Các khoản phải thu`,
     type = "o", col = "darkorange", lwd = 2,
     main = "Các khoản phải thu qua các năm",
     xlab = "Năm", ylab = "Giá trị (triệu đồng)",
     cex.lab = 1, cex.main = 1.2)

# Thêm lưới nền
grid(col = "gray", lty = 3)

# Thêm đường trung bình
abline(h = mean(tieuluan$`Các khoản phải thu`, na.rm = TRUE),
       col = "red", lty = 2, lwd = 2)

# Thêm điểm dữ liệu
points(tieuluan$Năm, tieuluan$`Các khoản phải thu`, pch = 19, col = "black")

# Thêm nhãn giá trị
text(tieuluan$Năm, tieuluan$`Các khoản phải thu`,
     labels = round(tieuluan$`Các khoản phải thu` / 1000, 0),
     pos = 3, cex = 0.8, col = "black")

# Ghi nguồn dữ liệu (đẩy xuống thấp hơn để không đè chữ 'Năm')
mtext("Nguồn: Báo cáo tài chính Techcombank", side = 1, line = 5, cex = 0.9, adj = 0.5)

Ý nghĩa kỹ thuật:

Biểu đồ đường (plot(type=“o”)) thể hiện xu hướng biến động của “Các khoản phải thu” qua các năm.

Thêm lưới nền (grid()) giúp dễ theo dõi sự thay đổi.

Thêm đường trung bình (abline()) để so sánh mức trung bình của toàn kỳ.

Thêm điểm dữ liệu và nhãn giá trị (points() và text()) giúp biểu diễn chi tiết số liệu từng năm.

Thêm ghi chú nguồn dữ liệu (mtext()) căn giữa và tách khỏi trục X để đảm bảo thẩm mỹ.

Ý nghĩa thống kê:

Trong giai đoạn 2014–2019, các khoản phải thu của Techcombank ở mức thấp và tăng chậm.

Từ 2020 trở đi, giá trị tăng mạnh đột biến, đặc biệt năm 2023 đạt mức cao nhất toàn kỳ (~61.609 tỷ đồng), vượt xa trung bình chung (đường đỏ).

Xu hướng này phản ánh khả năng mở rộng tín dụng và các khoản phải thu khách hàng tăng đáng kể trong những năm gần đây.

Về mặt thống kê, xu hướng tăng rõ rệt và ổn định thể hiện mối quan hệ thuận với quy mô hoạt động và doanh thu của ngân hàng.

2.5.2 Trực quan hóa bằng ggplot2

Ta cần nạp thư viện trước khi trực quan hóa bằng ggplot 2

library(ggplot2)
library(dplyr)

2.5.2.1 Biểu đồ 8: Xu hướng tăng trưởng Tổng tài sản qua thời gian (Đường – Line Chart)

library(ggplot2)

ggplot(tieuluan, aes(x = Năm, y = `Tổng tài sản`)) +
  geom_line(color = "steelblue", linewidth = 1.2) +       # đường xu hướng
  geom_point(size = 3, color = "darkred") +               # điểm dữ liệu
  geom_smooth(method = "lm", se = FALSE, col = "orange") +# đường hồi quy
  geom_text(aes(label = round(`Tổng tài sản`/1e6, 1)), vjust = -0.8, size = 3) +
  theme_minimal() +
  labs(title = "Xu hướng tăng trưởng Tổng tài sản qua thời gian (Total Assets Trend – Line Chart)",
       x = "Năm", y = "Tổng tài sản (triệu đồng)",
       caption = "Nguồn: Báo cáo tài chính Techcombank") +
  theme(plot.title = element_text(face = "bold", hjust = 0.5))
## `geom_smooth()` using formula = 'y ~ x'
## `geom_line()`: Each group consists of only one observation.
## ℹ Do you need to adjust the group aesthetic?

Ý nghĩa kỹ thuật:

Biểu đồ đường (geom_line) thể hiện xu hướng biến động của Tổng tài sản Techcombank qua các năm.

Các điểm dữ liệu (geom_point) minh họa giá trị thực tế của từng năm, giúp dễ nhận biết thay đổi cụ thể.

Đường hồi quy tuyến tính (geom_smooth) mô tả xu hướng tăng trưởng tổng thể của tài sản theo thời gian.

Nhãn giá trị (geom_text) hiển thị tổng tài sản (triệu đồng), hỗ trợ quan sát nhanh giá trị từng năm.

Giao diện tối giản (theme_minimal) và bố cục tiêu đề (theme) giúp biểu đồ rõ ràng, dễ nhìn và thẩm mỹ.

Ý nghĩa thống kê:

Trong giai đoạn 2014–2023, Tổng tài sản Techcombank tăng mạnh và liên tục, thể hiện xu hướng phát triển ổn định của ngân hàng.

Giai đoạn 2020–2023, tổng tài sản tăng nhanh đột biến, cho thấy sự mở rộng quy mô và hiệu quả hoạt động sau dịch Covid-19.

Đường hồi quy có độ dốc dương chứng minh mối quan hệ tuyến tính thuận chiều giữa thời gian và tổng tài sản.

Về mặt thống kê, điều này khẳng định Techcombank đang duy trì đà tăng trưởng tài sản bền vững, phù hợp với xu hướng phát triển chung của ngành ngân hàng.

2.5.2.2 Biểu đồ 9: Mối tương quan giữa Tổng tài sản và Tài sản cố định (Tán xạ – Scatter Plot)

library(ggplot2)
library(ggrepel)
## Warning: package 'ggrepel' was built under R version 4.4.3
ggplot(tieuluan, aes(x = `Tổng tài sản`, y = `Tài sản cố định`)) +
  geom_point(color = "darkblue", size = 3, alpha = 0.7) +                     #điểm dữ liệu
  geom_smooth(method = "lm", se = TRUE, color = "red", linetype = "dashed") + 
  #đường hồi quy
  geom_text_repel(aes(label = Năm), size = 3, color = "black") +              # Layer 3: nhãn năm tránh chồng
  theme_light() +                                                             #giao diện sáng
  labs(title = "Mối tương quan giữa Tổng tài sản và Tài sản cố định\n(Correlation between Assets – Scatter Plot)",
       x = "Tổng tài sản (triệu đồng)",
       y = "Tài sản cố định (triệu đồng)",
       caption = "Nguồn: Báo cáo tài chính Techcombank") +                    #nhãn & chú thích
  theme(plot.title = element_text(face = "bold", hjust = 0.5))
## `geom_smooth()` using formula = 'y ~ x'

Ý nghĩa kỹ thuật:

Biểu đồ phân tán (geom_point) thể hiện mối tương quan giữa Tổng tài sản và Tài sản cố định của Techcombank qua các năm.

Mỗi điểm dữ liệu đại diện cho một năm quan sát, giúp xác định mối quan hệ giữa hai biến định lượng.

Đường hồi quy (geom_smooth, method = “lm”) mô tả xu hướng tuyến tính giữa hai biến, đồng thời dải xám thể hiện khoảng tin cậy (confidence interval).

Nhãn năm (geom_text_repel) giúp phân biệt từng điểm dữ liệu mà không bị chồng chéo.

Giao diện sáng (theme_light) cùng với nhãn trục và tiêu đề rõ ràng giúp biểu đồ dễ đọc, dễ phân tích và có tính thẩm mỹ cao.

Ý nghĩa thống kê:

Biểu đồ cho thấy mối tương quan thuận chiều mạnh giữa Tổng tài sản và Tài sản cố định của Techcombank.

Khi Tổng tài sản tăng, Tài sản cố định cũng tăng tương ứng, chứng tỏ ngân hàng liên tục đầu tư mở rộng quy mô hoạt động và cơ sở vật chất.

Đường hồi quy tuyến tính có độ dốc cao, thể hiện mức độ phụ thuộc chặt chẽ giữa hai biến.

Giai đoạn 2019–2023, tốc độ tăng Tài sản cố định tỉ lệ thuận rõ rệt với sự tăng trưởng của Tổng tài sản, cho thấy hiệu quả trong việc tái đầu tư và phát triển cơ sở hạ tầng.

Về mặt thống kê, điều này khẳng định Techcombank đang duy trì cơ cấu tài sản ổn định, hỗ trợ tốt cho hoạt động kinh doanh dài hạn.

2.5.2.3 Biểu đồ 10: Phân bố giá trị Tài sản cố định ( Violin Plot)

ggplot(tieuluan, aes(x = "", y = `Tài sản cố định`/1e6)) +
  geom_violin(fill = "skyblue", alpha = 0.6) +                       
  geom_boxplot(width = 0.1, fill = "white", color = "black") +      
  geom_jitter(width = 0.05, alpha = 0.7) +                           
  theme_minimal() +                                                 
  labs(title = "Phân bố giá trị Tài sản cố định (Distribution – Violin Plot)",
       y = "Tài sản cố định (tỷ đồng)") +                           
  theme(plot.title = element_text(face = "bold", hjust = 0.5))

Ý nghĩa kỹ thuật:

Biểu đồ violin (geom_violin) thể hiện phân bố giá trị Tài sản cố định của Techcombank qua các năm, kết hợp đặc tính của biểu đồ mật độ và boxplot.

Phần mở rộng của “hình đàn violin” mô tả mức độ tập trung và phân tán của dữ liệu – chỗ phình to cho thấy nhiều giá trị trùng lặp, còn phần thon hẹp biểu thị ít quan sát hơn.

Biểu đồ hộp (geom_boxplot) chèn bên trong giúp xác định trung vị, tứ phân vị và ngoại lệ một cách trực quan.

Các điểm (geom_jitter) thể hiện từng giá trị thực tế của Tài sản cố định, giúp tránh trùng lặp khi nhiều điểm gần nhau.

Giao diện tối giản (theme_minimal) và bố cục rõ ràng (theme) giúp biểu đồ dễ đọc, trực quan và mang tính chuyên nghiệp cao.

Ý nghĩa thống kê:

Biểu đồ cho thấy phân bố giá trị Tài sản cố định của Techcombank khá lệch phải, nghĩa là phần lớn các năm có giá trị nhỏ hơn trung bình, chỉ một vài năm gần đây đạt mức cao nổi bật.

Trung vị (median) nằm lệch về phần dưới của hộp, phản ánh phần lớn các năm có tài sản cố định thấp hơn mức trung bình chung.

Độ trải rộng (khoảng tứ phân vị) lớn cho thấy sự biến động mạnh của tài sản cố định qua thời gian, đặc biệt giai đoạn sau năm 2020.

Về mặt thống kê, điều này chứng minh rằng Techcombank tăng mạnh đầu tư vào cơ sở vật chất và tài sản cố định trong những năm gần đây, tương ứng với xu hướng mở rộng quy mô hoạt động.

2.5.2.4 Biểu đồ 11: Thanh nhóm theo giai đoạn Covid (Grouped Bar)

ggplot(tieuluan, aes(x = `Tình hình kinh tế`, y = `Tổng tài sản`/1e6, fill = `Tình hình kinh tế`)) +
  geom_bar(stat = "summary", fun = "mean", position = "dodge") +    
  geom_text(stat = "summary", fun = "mean", aes(label = round(..y..,1)), vjust = -0.6) + # Layer 2
  theme_minimal() +                                                  
  scale_fill_brewer(palette = "Set1") +                              
  labs(title = "So sánh Tổng tài sản trước & sau Covid (Grouped Bar Chart)",
       x = "Giai đoạn", y = "Tổng tài sản trung bình (tỷ đồng)") +   
  theme(plot.title = element_text(face = "bold", hjust = 0.5))

Ý nghĩa kỹ thuật:

Biểu đồ cột nhóm (geom_bar) thể hiện so sánh Tổng tài sản trung bình của Techcombank trước và sau giai đoạn Covid-19.

Tham số stat = “summary”, fun = “mean” dùng để tính giá trị trung bình của từng nhóm giai đoạn.

Nhãn giá trị (geom_text) hiển thị tổng tài sản trung bình (tỷ đồng) của mỗi giai đoạn, giúp quan sát trực tiếp mức chênh lệch.

Thang màu (scale_fill_brewer) phân biệt hai giai đoạn kinh tế “Trước Covid” và “Sau Covid”, giúp tăng tính trực quan.

Giao diện tối giản (theme_minimal) và bố cục tiêu đề rõ ràng giúp biểu đồ dễ đọc và chuyên nghiệp hơn.

Ý nghĩa thống kê:

Biểu đồ cho thấy Tổng tài sản trung bình của Techcombank giai đoạn sau Covid tăng gấp đôi so với trước Covid (639,2 tỷ đồng so với 262,9 tỷ đồng).

Điều này phản ánh tốc độ phục hồi mạnh mẽ và khả năng mở rộng quy mô tài chính của ngân hàng sau giai đoạn khủng hoảng.

Giai đoạn trước Covid, tổng tài sản tăng chậm và ổn định, trong khi sau Covid, sự tăng trưởng diễn ra nhanh và rõ rệt hơn.

Về mặt thống kê, sự khác biệt này thể hiện sự thích ứng hiệu quả của Techcombank với điều kiện kinh tế hậu đại dịch, thông qua mở rộng danh mục tín dụng, huy động vốn và tối ưu hóa danh mục đầu tư.

Kết quả này cho thấy ngân hàng đã vượt qua giai đoạn khủng hoảng và bước vào chu kỳ tăng trưởng mạnh mẽ.

2.5.2.5 Biểu 12: Ma trận tương quan các biến tài chính (Heatmap)

# === Biểu đồ : Ma trận tương quan các biến tài chính (hiển thị đẹp, không đè chữ) ===

# Chuẩn bị dữ liệu
data_num <- tieuluan %>%
  select(`Tổng tài sản`, 
         `Tổng vốn chủ sở hữu`,
         `Tài sản cố định`, 
         `Các khoản phải thu`, 
         `Tiền gửi tại NHNN`) %>%  
  mutate(across(everything(), ~as.numeric(gsub("[^0-9.-]", "", .))))

# Tính ma trận tương quan
corr_matrix <- round(cor(data_num, use = "pairwise.complete.obs"), 2)

# Chuyển sang dạng dài để ggplot vẽ
data_long_corr <- as.data.frame(corr_matrix) %>%
  tibble::rownames_to_column("Var1") %>%
  tidyr::pivot_longer(-Var1, names_to = "Var2", values_to = "value")

# Vẽ Heatmap
ggplot(data_long_corr, aes(Var1, Var2, fill = value)) +
  geom_tile(color = "white") +                                         # 1
  geom_text(aes(label = round(value, 2)), color = "black", size = 4) + # 2
  scale_fill_gradient2(low = "purple", mid = "white", high = "red", midpoint = 0.9) + # Layer 3
  theme_minimal(base_size = 12) +                                      # Layer 4
  theme(
    axis.text.x = element_text(angle = 35, vjust = 1, hjust = 1, size = 11, face = "bold"),
    axis.text.y = element_text(size = 11, face = "bold"),
    plot.title = element_text(face = "bold", size = 14, hjust = 0.5),
    legend.position = "right"
  ) +                                                                  # 5
  coord_fixed() +  # Giữ ô vuông cân đối
  labs(
    title = "Ma trận tương quan giữa các biến tài chính của Techcombank",
    x = "Biến tài chính", 
    y = "Biến tài chính", 
    fill = "Hệ số tương quan"
  )

Ý nghĩa kỹ thuật:

Biểu đồ Heatmap (geom_tile) được sử dụng để thể hiện mức độ tương quan tuyến tính giữa các biến tài chính của Techcombank trong giai đoạn nghiên cứu.

Hàm select() được dùng để lựa chọn các biến định lượng có ý nghĩa phân tích cao như: Tổng tài sản, Tổng nợ phải trả, Tổng vốn chủ sở hữu, Tài sản cố định, Các khoản phải thu, Tiền gửi tại NHNN.

Hàm mutate(across()) được sử dụng để chuyển đổi các biến dữ liệu về dạng số (numeric) và loại bỏ các ký tự không phải số nhằm đảm bảo dữ liệu có thể tính toán được hệ số tương quan chính xác.

Hàm cor() giúp tính toán hệ số tương quan Pearson giữa các cặp biến tài chính, phản ánh mức độ quan hệ tuyến tính giữa chúng. Kết quả ma trận tương quan được làm tròn hai chữ số thập phân để hiển thị dễ đọc.

Hàm pivot_longer() có vai trò chuyển dữ liệu ma trận tương quan sang dạng dài (long format) giúp ggplot2 có thể xử lý và biểu diễn các cặp giá trị dễ dàng.

Lớp geom_tile(color = “white”) giúp tạo các ô màu thể hiện giá trị tương quan, đường viền trắng giúp phân biệt rõ ràng từng ô.

Lớp geom_text() hiển thị giá trị hệ số tương quan ngay tại trung tâm mỗi ô, giúp dễ dàng đọc và so sánh mức độ tương quan giữa các biến. Thang màu scale_fill_gradient2() thể hiện mức độ mạnh – yếu của tương quan: màu tím biểu thị tương quan thấp, trắng là trung bình, và đỏ là tương quan cao.

Giao diện tối giản theme_minimal() giúp biểu đồ tập trung vào nội dung dữ liệu mà vẫn đảm bảo tính thẩm mỹ.

Cuối cùng, coord_fixed() giúp giữ cho các ô vuông cân đối theo tỉ lệ 1:1, đảm bảo biểu đồ không bị méo và dễ nhìn.

Ý nghĩa thống kê:

Biểu đồ Heatmap cho thấy các biến tài chính của Techcombank có mức tương quan cao (từ 0.8 đến 1.0), phản ánh mối quan hệ đồng biến mạnh giữa các chỉ tiêu tài chính chủ chốt.

Các cặp biến như “Tổng tài sản – Tổng vốn chủ sở hữu”, “Tổng tài sản – Tổng nợ phải trả” và “Tổng vốn chủ sở hữu – Tài sản cố định” có hệ số tương quan gần bằng 1, cho thấy khi quy mô tài sản tăng thì vốn và nợ cũng tăng tương ứng phản ánh cơ cấu tài chính ổn định và tăng trưởng song hành.

Biến “Tiền gửi tại NHNN” có mức tương quan thấp hơn (dao động quanh 0.7–0.8) so với các biến khác, cho thấy yếu tố này ít chịu ảnh hưởng trực tiếp từ biến động tổng tài sản do đặc thù là khoản mục thanh khoản, phục vụ dự trữ bắt buộc.

Mức độ tương quan cao giữa các biến còn lại chứng tỏ Techcombank có cấu trúc tài chính chặt chẽ và nhất quán, trong đó sự biến động của tài sản, nợ và vốn chủ sở hữu phản ánh xu hướng tăng trưởng ổn định. Điều này thể hiện năng lực quản lý vốn và tài sản hiệu quả, minh chứng cho sự phát triển bền vững của Techcombank trong giai đoạn nghiên cứu.

2.5.2.6 Biểu đồ 13: So sánh Tiền mặt vàng theo năm (Cột - Column Chart)

ggplot(tieuluan, aes(x = Năm, y = `Tiền mặt vàng`/1e6, fill = Năm)) +
  geom_col() +                                                     # 1
  geom_text(aes(label = round(`Tiền mặt vàng`/1e6, 1)), 
            vjust = -0.5, size = 3) +                              # 2
  scale_fill_brewer(palette = "YlGnBu") +                          # 3
  theme_minimal() +                                                # 4
  labs(title = "So sánh Tiền mặt vàng qua các năm",
       y = "Giá trị (tỷ đồng)", fill = "Năm")                      # 5
## Warning in RColorBrewer::brewer.pal(n, pal): n too large, allowed maximum for palette YlGnBu is 9
## Returning the palette you asked for with that many colors

Ý nghĩa kỹ thuật:

Biểu đồ cột (geom_col) được sử dụng để so sánh giá trị Tiền mặt vàng của Techcombank qua các năm trong giai đoạn nghiên cứu, giúp thể hiện trực quan mức biến động và xu hướng thay đổi theo thời gian.

Lệnh aes(x = Năm, y = Tiền mặt vàng/1e6, fill = Năm) giúp xác định trục hoành (x) là năm, trục tung (y) là giá trị Tiền mặt vàng (tính theo tỷ đồng), và mỗi cột được tô màu theo từng năm để dễ phân biệt.

Hàm geom_col() vẽ các cột biểu diễn giá trị thực tế của từng năm, tạo nên cấu trúc chính của biểu đồ.

Lớp geom_text() hiển thị giá trị cụ thể trên đầu mỗi cột, giúp người xem dễ dàng so sánh số liệu giữa các năm mà không cần đọc từ trục tung.

Thang màu scale_fill_brewer(palette = “YlGnBu”) sử dụng bảng màu chuyển sắc từ vàng nhạt đến xanh đậm, biểu thị sự thay đổi theo thời gian và tăng tính trực quan cho biểu đồ.

Giao diện theme_minimal() giúp loại bỏ các chi tiết rườm rà, giữ biểu đồ gọn gàng, tập trung vào dữ liệu chính.

Hàm labs() dùng để đặt tiêu đề và nhãn trục, làm cho biểu đồ trở nên chuyên nghiệp và rõ ràng khi trình bày trong báo cáo.

Ý nghĩa thống kê:

Biểu đồ cho thấy giá trị Tiền mặt vàng của Techcombank có sự biến động rõ rệt qua các năm. Giai đoạn 2014–2017, giá trị tiền mặt vàng duy trì ở mức trung bình thấp (dao động từ 2.3 đến 3.0 tỷ đồng), phản ánh giai đoạn ngân hàng duy trì lượng dự trữ tiền mặt ổn định.

Từ 2018 đến 2020, giá trị này tăng mạnh, đạt mức cao nhất 4.8 tỷ đồng vào năm 2019, cho thấy Techcombank đã đẩy mạnh tích trữ tiền mặt và vàng, nhiều khả năng để đảm bảo thanh khoản và hỗ trợ hoạt động tín dụng trong giai đoạn mở rộng kinh doanh.

Giai đoạn 2021–2023, mức tiền mặt vàng duy trì quanh 3.6–4.2 tỷ đồng, cho thấy sự ổn định trở lại sau giai đoạn tăng trưởng đột biến. Điều này phản ánh chiến lược quản lý thanh khoản hiệu quả của Techcombank – vẫn duy trì dự trữ an toàn nhưng không để vốn nhàn rỗi quá lớn, đảm bảo tối ưu hóa hiệu quả sử dụng tài sản ngắn hạn.

Về tổng thể, biểu đồ thể hiện rằng Techcombank duy trì sự chủ động trong quản lý nguồn tiền mặt và vàng, giúp ngân hàng ứng phó linh hoạt với biến động thị trường tài chính, đồng thời tạo nền tảng thanh khoản vững chắc cho hoạt động tín dụng và đầu tư trong giai đoạn nghiên cứu.

2.5.2.7 Biểu đồ 14: Phân bố Tài sản cố định theo giai đoạn kinh tế (Boxplot)

ggplot(tieuluan, aes(x = `Tình hình kinh tế`, y = `Tài sản cố định`/1e6, fill = `Tình hình kinh tế`)) +
  geom_boxplot(alpha = 0.6, outlier.color = "red") +               # 1
  geom_jitter(width = 0.15, color = "darkblue", size = 2) +        # 2
  scale_fill_brewer(palette = "Set3") +                            # 3
  theme_light() +                                                  # 4
  labs(title = "Phân bố Tài sản cố định theo giai đoạn kinh tế",
       x = "Giai đoạn", y = "Giá trị (tỷ đồng)")                   # 5

Ý nghĩa kỹ thuật:

Biểu đồ Boxplot (geom_boxplot) được sử dụng để thể hiện sự phân bố của giá trị Tài sản cố định của Techcombank giữa hai giai đoạn kinh tế: Trước Covid và Sau Covid.

Biểu đồ giúp so sánh mức độ biến động, trung vị và sự phân tán của dữ liệu giữa các giai đoạn, qua đó nhận diện sự thay đổi cấu trúc tài sản cố định theo thời gian.

Hàm aes(x = ‘Tình hình kinh tế’, y = ‘Tài sản cố định’/1e6, fill = ‘Tình hình kinh tế’) xác định trục hoành là giai đoạn kinh tế, trục tung là giá trị tài sản cố định (tỷ đồng), và mỗi hộp (box) được tô màu khác nhau cho từng giai đoạn để dễ phân biệt.

Lớp geom_boxplot(alpha = 0.6, outlier.color = “red”) biểu diễn phạm vi phân bố dữ liệu thông qua 5 đặc trưng thống kê (giá trị nhỏ nhất, Q1, trung vị, Q3, giá trị lớn nhất), đồng thời đánh dấu các điểm ngoại lệ bằng màu đỏ, giúp nhận biết các năm có biến động khác thường.

Lớp geom_jitter(width = 0.15, color = “darkblue”, size = 2) thêm các điểm dữ liệu thực tế rải quanh hộp, giúp người xem thấy được phân tán dữ liệu cụ thể thay vì chỉ dựa vào phạm vi tóm tắt.

Thang màu scale_fill_brewer(palette = “Set3”) tạo sự tương phản rõ ràng giữa hai giai đoạn, giúp dễ nhận biết và tăng tính thẩm mỹ cho biểu đồ.

Cuối cùng, theme_light() và labs() giúp biểu đồ sáng, dễ nhìn, rõ nhãn trục và tiêu đề, phục vụ trình bày trong báo cáo chuyên nghiệp.

Ý nghĩa thống kê:

Biểu đồ cho thấy sự khác biệt rõ rệt trong phân bố giá trị Tài sản cố định của Techcombank giữa hai giai đoạn kinh tế.

Trong giai đoạn Trước Covid, giá trị Tài sản cố định tập trung ở mức thấp, biên độ dao động nhỏ, cho thấy ngân hàng duy trì đầu tư cơ sở vật chất ổn định và kiểm soát tốt chi phí tài sản dài hạn.

Sang giai đoạn Sau Covid, giá trị Tài sản cố định tăng rõ rệt, trung vị cao hơn đáng kể so với giai đoạn trước, đồng thời phạm vi biến động cũng mở rộng, chứng tỏ Techcombank đẩy mạnh đầu tư tài sản dài hạn (như hệ thống chi nhánh, hạ tầng công nghệ, văn phòng, thiết bị) để phục hồi và mở rộng quy mô hoạt động sau dịch.

Các điểm ngoại lệ màu đỏ thể hiện những năm có giá trị tài sản cố định tăng bất thường, thường trùng với các thời kỳ mở rộng hoặc nâng cấp hệ thống hạ tầng.

Tổng thể, biểu đồ phản ánh rằng Techcombank đã chuyển từ trạng thái ổn định sang giai đoạn tăng cường đầu tư, thể hiện chiến lược phát triển mạnh mẽ sau Covid, hướng đến mở rộng năng lực vận hành và nâng cao chất lượng tài sản trong trung và dài hạn.

2.5.2.8 Biểu đồ 15: Phân bố Các khoản phải thu (Denisty )

ggplot(tieuluan, aes(x = `Các khoản phải thu`/1e6)) +
  geom_density(fill = "#B3E5FC", alpha = 0.6) +                   # 1
  geom_vline(aes(xintercept = mean(`Các khoản phải thu`/1e6)), 
             color = "red", linetype = "dashed") +                # 2
  geom_text(aes(x = mean(`Các khoản phải thu`/1e6), y = 0.00002, 
                label = "Trung bình"), color = "red", size = 3) + # 3
  scale_x_continuous(labels = scales::comma) +                    # 4
  theme_minimal() +                                               # 5
  labs(title = "Phân bố giá trị Các khoản phải thu (2014–2023)",
       x = "Giá trị (tỷ đồng)", y = "Mật độ")
## Warning in geom_text(aes(x = mean(`Các khoản phải thu`/1000000), y = 0.00002, : 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:

Biểu đồ mật độ (geom_density) được sử dụng để thể hiện phân bố xác suất liên tục của giá trị Các khoản phải thu của Techcombank trong giai đoạn 2014–2023, giúp người xem nhận biết khu vực nào có tần suất xuất hiện cao nhất và xu hướng biến động của dữ liệu.

Lớp geom_density(fill = “#B3E5FC”, alpha = 0.6) tạo vùng mật độ với màu xanh nhạt và độ trong suốt vừa phải, giúp làm nổi bật phần dữ liệu có tần suất cao mà không che lấp các chi tiết nền.

Đường thẳng đứng geom_vline() được thêm vào để biểu diễn giá trị trung bình của các khoản phải thu, giúp người xem dễ dàng so sánh vị trí trung bình với phân bố tổng thể.

Lớp geom_text() hiển thị nhãn “Trung bình” ngay tại vị trí đường tham chiếu, giúp làm rõ ý nghĩa của đường này trên biểu đồ.

Thang trục hoành scale_x_continuous() được định dạng lại bằng dấu phẩy để hiển thị số liệu tài chính dễ đọc hơn, còn theme_minimal() giúp biểu đồ đơn giản, tinh gọn, tập trung hoàn toàn vào dữ liệu.

Cuối cùng, labs() được sử dụng để ghi rõ tiêu đề, tên trục và đơn vị đo (tỷ đồng), giúp biểu đồ trở nên chuyên nghiệp và dễ hiểu khi trình bày trong báo cáo.

Ý nghĩa thống kê:

Biểu đồ mật độ cho thấy phân bố giá trị Các khoản phải thu của Techcombank không đồng đều, nghiêng mạnh về phía bên trái (dạng lệch phải – right-skewed).

Điều này cho thấy phần lớn các năm trong giai đoạn 2014–2023 có giá trị phải thu ở mức thấp, chỉ một vài năm có giá trị phải thu tăng đột biến.

Giá trị trung bình nằm ở phần lệch phải của phân bố, chứng tỏ dữ liệu có sự phân tán lớn và xuất hiện các giá trị cực đại, thể hiện những giai đoạn Techcombank mở rộng tín dụng hoặc tăng các khoản ứng trước, phải thu từ khách hàng.

Về mặt thống kê, sự lệch phải của phân bố cho thấy biến động tăng trong hoạt động tín dụng và giao dịch khách hàng, đặc biệt vào các năm ngân hàng đẩy mạnh mở rộng thị phần và hỗ trợ doanh nghiệp sau Covid-19. Mức mật độ cao ở vùng giá trị thấp phản ánh giai đoạn vận hành ổn định, trong khi các giá trị ở vùng cao biểu thị các năm tăng trưởng đột biến trong quản lý khoản phải thu.

Tổng thể, biểu đồ cho thấy Techcombank có sự biến động tích cực trong hoạt động tín dụng và quan hệ khách hàng, minh chứng cho nỗ lực mở rộng quy mô kinh doanh song song với việc duy trì an toàn vốn và quản lý rủi ro tài chính trong giai đoạn nghiên cứu.

2.5.2.9 Biểu đồ 16: Ma trận quy mô tài sản & tiền gửi NHNN (Tile Chart)

ggplot(tieuluan, aes(x = Năm, y = `Tiền gửi tại NHNN`/1e6, fill = `Tổng tài sản`/1e6)) +
  geom_tile(color = "white") +                       # 1
  geom_text(aes(label = round(`Tổng tài sản`/1e6, 0)), size = 3) + # 2
  scale_fill_gradient(low = "lightyellow", high = "darkred") +     # 3
  theme_minimal() +                                  # 4
  labs(title = "Ma trận quy mô Tổng tài sản và Tiền gửi NHNN",
       y = "Tiền gửi NHNN (tỷ đồng)", fill = "Tổng tài sản")       # 5

Ý nghĩa kỹ thuật:

Biểu đồ Tile Chart (geom_tile) được sử dụng để thể hiện mối quan hệ giữa quy mô Tổng tài sản và giá trị Tiền gửi tại NHNN của Techcombank theo từng năm, dưới dạng ma trận màu.

Mỗi ô trên biểu đồ đại diện cho một năm quan sát, trong đó màu sắc thể hiện mức độ của Tổng tài sản, còn vị trí trục tung biểu thị giá trị Tiền gửi NHNN.

Lớp geom_tile(color = “white”) giúp tạo các ô hình chữ nhật với đường viền trắng để phân tách rõ ràng giữa các năm, đảm bảo bố cục gọn gàng và dễ đọc.

Lớp geom_text() hiển thị giá trị Tổng tài sản (tỷ đồng) ngay tại trung tâm mỗi ô, giúp người xem dễ dàng nắm được số liệu thực tế mà không cần nhìn vào chú giải màu.

Thang màu scale_fill_gradient(low = “lightyellow”, high = “darkred”) thể hiện mức độ tăng dần của Tổng tài sản – từ vàng nhạt (quy mô nhỏ) đến đỏ đậm (quy mô lớn), giúp người đọc nhận diện xu hướng tăng trưởng rõ ràng.

Giao diện theme_minimal() giúp loại bỏ đường viền và chi tiết rườm rà, làm nổi bật dữ liệu trung tâm.

Cuối cùng, labs() được dùng để thêm tiêu đề, tên trục và nhãn màu chú thích, giúp biểu đồ trực quan, dễ hiểu và mang tính chuyên nghiệp cao khi trình bày trong báo cáo.

Ý nghĩa thống kê:

Biểu đồ cho thấy mối quan hệ đồng biến giữa Tổng tài sản và Tiền gửi tại NHNN của Techcombank trong giai đoạn nghiên cứu (2014–2023).

Cụ thể, khi Tổng tài sản tăng dần qua các năm, lượng Tiền gửi tại NHNN cũng có xu hướng tăng tương ứng, thể hiện mối liên kết chặt chẽ giữa quy mô hoạt động và mức dự trữ bắt buộc của ngân hàng.

Trong các năm đầu (2014–2016), Tổng tài sản ở mức thấp (dưới 250 tỷ đồng) và Tiền gửi NHNN nhỏ, phản ánh quy mô còn hạn chế.

Từ năm 2018 trở đi, màu sắc các ô chuyển dần sang tông đỏ đậm, biểu thị Tổng tài sản tăng mạnh, đặc biệt là giai đoạn 2020–2022, khi Techcombank đạt mức Tổng tài sản trên 800 tỷ đồng, đi kèm Tiền gửi NHNN tăng đáng kể – minh chứng cho năng lực thanh khoản và tuân thủ an toàn vốn theo quy định của Ngân hàng Nhà nước.

Về mặt thống kê, biểu đồ thể hiện mối quan hệ dương rõ rệt (positive correlation) giữa hai biến, cho thấy khi Techcombank mở rộng quy mô tài sản, ngân hàng đồng thời gia tăng tiền gửi tại NHNN để đảm bảo tỷ lệ dự trữ bắt buộc và củng cố tính an toàn hệ thống.

Điều này khẳng định rằng Techcombank duy trì chiến lược tăng trưởng bền vững, kết hợp hài hòa giữa mở rộng tổng tài sản và quản trị thanh khoản, giúp ngân hàng giữ vững ổn định tài chính trong dài hạn.

2.5.2.10 Biểu đồ 17: Quan hệ giữa Tiền gửi NHNN và Tài sản cố định (Hexbin)

ggplot(tieuluan, aes(x = `Tiền gửi tại NHNN`/1e6, y = `Tài sản cố định`/1e6)) +
  geom_hex(bins = 6) +                         # 1
  scale_fill_gradient(low = "white", high = "red") + # 2
  geom_smooth(method = "lm", color = "blue", se = FALSE) + # 3
  theme_minimal() +                            # 4
  labs(title = "Quan hệ giữa Tiền gửi NHNN và Tài sản cố định (Hexbin)",
  x = "Tiền gửi NHNN (tỷ đồng)", y = "Tài sản cố định (tỷ đồng)") # 5
## Warning: Computation failed in `stat_binhex()`.
## Caused by error in `compute_group()`:
## ! The package "hexbin" is required for `stat_bin_hex()`.
## `geom_smooth()` using formula = 'y ~ x'

Ý nghĩa kỹ thuật:

Biểu đồ Hexbin (geom_hex) được sử dụng để biểu diễn mối quan hệ hai chiều giữa Tiền gửi tại NHNN và Tài sản cố định của Techcombank trong giai đoạn nghiên cứu.

Đây là dạng biểu đồ phân tán dạng lưới lục giác, giúp gom nhóm các điểm dữ liệu gần nhau để quan sát xu hướng tổng quát, thay vì hiển thị từng điểm riêng lẻ như biểu đồ Scatter thông thường.

Lớp geom_hex(bins = 6) chia mặt phẳng thành 6 vùng lục giác, mỗi vùng đại diện cho mật độ các giá trị dữ liệu tương ứng của hai biến.

Lớp geom_smooth(method = “lm”, color = “blue”, se = FALSE) thêm đường hồi quy tuyến tính biểu diễn mối quan hệ xu hướng giữa hai biến – trong trường hợp này là Tiền gửi tại NHNN (x) và Tài sản cố định (y). Đường màu xanh cho thấy xu hướng đồng biến giữa hai đại lượng.

Cuối cùng, theme_minimal() giúp biểu đồ tối giản và chuyên nghiệp, tập trung vào phần dữ liệu trung tâm, và labs() thêm tiêu đề, nhãn trục rõ ràng để biểu đồ dễ hiểu và trực quan khi trình bày.

Ý nghĩa thống kê:

Biểu đồ cho thấy giữa Tiền gửi tại NHNN và Tài sản cố định của Techcombank tồn tại mối quan hệ tuyến tính dương rõ rệt.

Điều này có nghĩa là khi lượng tiền gửi tại NHNN tăng lên, thì giá trị tài sản cố định cũng có xu hướng tăng theo, phản ánh sự mở rộng song song giữa quy mô dự trữ thanh khoản và đầu tư cơ sở vật chất của ngân hàng.

Đường hồi quy màu xanh thể hiện mối quan hệ đồng biến chặt chẽ, cho thấy rằng trong các năm Techcombank tăng lượng tiền gửi tại NHNN (thường do yêu cầu thanh khoản và quy định an toàn vốn), ngân hàng đồng thời tăng đầu tư vào tài sản cố định như trụ sở, chi nhánh, hệ thống công nghệ và cơ sở hạ tầng vận hành.

Về mặt thống kê, mối quan hệ này thể hiện sự cân bằng trong chính sách tài chính nội bộ: khi nguồn vốn và quy mô hoạt động mở rộng, Techcombank vẫn đảm bảo tỷ lệ an toàn thanh khoản thông qua việc tăng tiền gửi tại NHNN, đồng thời đầu tư dài hạn để củng cố năng lực hoạt động.

2.5.2.11 Biểu đồ 18: Dao động Tài sản cố định ( Error Bar Chart)

tieuluan <- tieuluan %>%
  mutate(TSCD_mean = mean(`Tài sản cố định`/1e6),
         TSCD_sd = sd(`Tài sản cố định`/1e6))

ggplot(tieuluan, aes(x = Năm, y = `Tài sản cố định`/1e6)) +
  geom_line(color = "blue", linewidth = 1.2) +                       # 1
  geom_point(size = 3, color = "red") +                              # 2
  geom_errorbar(aes(ymin = `Tài sản cố định`/1e6 - TSCD_sd,
                    ymax = `Tài sản cố định`/1e6 + TSCD_sd),
                width = 0.2, color = "darkblue") +                   # 3
  theme_light() +                                                    # 4
  labs(title = "Dao động Tài sản cố định theo năm (Error Bar Chart)",
       y = "Tài sản cố định (tỷ đồng)")                             # 5
## `geom_line()`: Each group consists of only one observation.
## ℹ Do you need to adjust the group aesthetic?

Ý nghĩa kỹ thuật:

Biểu đồ Error Bar (geom_errorbar) được sử dụng để biểu diễn mức độ dao động và biến thiên của giá trị Tài sản cố định của Techcombank theo từng năm trong giai đoạn nghiên cứu.

Biểu đồ giúp người xem dễ dàng nhận biết sự ổn định hay biến động của chỉ tiêu Tài sản cố định qua thời gian.

Dữ liệu được xử lý trước bằng cách sử dụng mutate() để tính giá trị trung bình (mean) và độ lệch chuẩn (standard deviation) của biến Tài sản cố định theo đơn vị tỷ đồng.

Các biến TSCD_mean và TSCD_sd lần lượt biểu thị mức trung bình và mức dao động quanh trung bình của tài sản cố định.

Phần trực quan hóa sử dụng ggplot() với trục hoành (x) là Năm và trục tung (y) là Tài sản cố định (tỷ đồng).

Lớp geom_line(color = “blue”) vẽ đường nối giữa các điểm trung bình, thể hiện xu hướng biến động theo thời gian.

Lớp geom_point(size = 3, color = “red”) đánh dấu giá trị trung bình của từng năm, giúp làm nổi bật các mốc dữ liệu chính.

Lớp geom_errorbar() vẽ các thanh sai số (error bars) thể hiện khoảng biến thiên quanh giá trị trung bình (± độ lệch chuẩn), cho thấy mức dao động dữ liệu thực tế giữa các năm.

Giao diện theme_light() giúp biểu đồ sáng rõ, dễ quan sát, trong khi labs() được sử dụng để thêm tiêu đề, đơn vị trục và nhãn dữ liệu giúp biểu đồ hoàn chỉnh và dễ hiểu hơn.

Ý nghĩa thống kê:

Biểu đồ cho thấy giá trị Tài sản cố định của Techcombank tăng dần đều qua các năm, phản ánh xu hướng mở rộng đầu tư và tăng cường tài sản dài hạn của ngân hàng trong giai đoạn 2014–2023.

Độ dài của các thanh sai số (error bars) biểu thị mức độ dao động quanh giá trị trung bình — cho thấy sự khác biệt giữa các năm về giá trị đầu tư cơ sở vật chất và hạ tầng.

Trong giai đoạn 2014–2017, các thanh sai số ngắn và khá ổn định, chứng tỏ mức đầu tư tài sản cố định tương đối ổn định và kiểm soát tốt.

Từ 2018 trở đi, các thanh sai số dài hơn rõ rệt, đặc biệt là giai đoạn 2020–2023, cho thấy mức độ dao động tăng cao, phản ánh sự mở rộng đầu tư mạnh mẽ vào tài sản dài hạn sau Covid-19 (ví dụ: chi nhánh, trung tâm dữ liệu, công nghệ và cơ sở hạ tầng ngân hàng số).

Đường xu hướng màu xanh tăng dần thể hiện đà tăng ổn định của tài sản cố định, trong khi các điểm đỏ trung bình nằm ở mức cao dần qua thời gian, cho thấy Techcombank liên tục mở rộng quy mô hoạt động và đầu tư chiến lược vào tài sản cố định.

Về mặt thống kê, điều này minh chứng rằng Techcombank đang chuyển dịch từ giai đoạn ổn định sang giai đoạn phát triển mạnh, thể hiện chính sách đầu tư dài hạn hiệu quả và định hướng tăng trưởng bền vững trong hoạt động kinh doanh.

2.5.2.12 Biểu đồ 19: Biểu đồ phạm vi giá trị Tiền mặt vàng qua các năm (Point Range Chart)

ggplot(tieuluan, aes(x = Năm, y = `Tiền mặt vàng`/1e6, color = Năm)) +
  geom_pointrange(aes(ymin = `Tiền mặt vàng`/1e6 * 0.9, ymax = `Tiền mặt vàng`/1e6 * 1.1)) + # 1
  geom_line(group = 1, linewidth = 1.2) +        # 2
  scale_color_manual(values = rainbow(10)) +     # 3
  theme_light() +                                # 4
  labs(title = "Phạm vi biến động Tiền mặt vàng", 
       y = "Giá trị (tỷ đồng)")                  # 5

Ý nghĩa kỹ thuật:

Biểu đồ Point Range Chart được sử dụng để biểu diễn phạm vi dao động và xu hướng biến động của giá trị Tiền mặt vàng của Techcombank trong giai đoạn nghiên cứu (2014–2023).

Biểu đồ giúp so sánh sự thay đổi theo năm, đồng thời thể hiện khoảng biến thiên (range) quanh giá trị trung tâm.

Lớp geom_pointrange() được dùng để hiển thị giá trị trung tâm và khoảng biến động trên – dưới (ymin và ymax) của Tiền mặt vàng theo từng năm.

Cụ thể, phần aes(ymin = Tiền mặt vàng/1e6 * 0.9, ymax = Tiền mặt vàng/1e6 * 1.1) cho phép vẽ phạm vi dao động ±10% quanh giá trị trung bình của mỗi năm, giúp người xem dễ hình dung mức độ biến động thực tế.

Lớp geom_line() kết nối các điểm trung tâm lại thành đường xu hướng, cho thấy sự tăng – giảm của chỉ tiêu Tiền mặt vàng qua thời gian.

Lớp scale_color_manual(values = rainbow(10)) gán màu riêng biệt cho từng năm, giúp phân biệt giai đoạn rõ ràng và tạo hiệu ứng thị giác nổi bật.

Giao diện theme_light() làm nền sáng, giúp nội dung nổi bật hơn, trong khi labs() được dùng để đặt tiêu đề, tên trục và đơn vị đo lường rõ ràng, đảm bảo biểu đồ trực quan và phù hợp trình bày báo cáo học thuật.

Ý nghĩa thống kê:

Biểu đồ cho thấy giá trị Tiền mặt vàng của Techcombank có sự biến động đáng kể theo thời gian, phản ánh chính sách quản lý tiền mặt linh hoạt để đáp ứng nhu cầu thanh khoản và dự phòng rủi ro.

Giai đoạn 2014–2017, mức Tiền mặt vàng duy trì ổn định quanh 2.5–3.0 tỷ đồng, với phạm vi dao động hẹp, cho thấy Techcombank duy trì chính sách dự trữ tiền mặt an toàn, ổn định trong giai đoạn đầu.

Từ 2018–2019, giá trị Tiền mặt vàng tăng đột biến lên gần 5 tỷ đồng, thể hiện sự mở rộng quy mô hoạt động và gia tăng khả năng thanh khoản để hỗ trợ cho hoạt động đầu tư và tín dụng.

Sau đó, giai đoạn 2020–2023, mức Tiền mặt vàng có xu hướng dao động nhẹ quanh 3.5–4 tỷ đồng, với biên độ không quá lớn, phản ánh sự điều chỉnh hợp lý trong quản trị nguồn vốn khi Techcombank chuyển hướng sang đầu tư nhiều hơn vào tài sản sinh lời và công nghệ số.

Về mặt thống kê, biểu đồ thể hiện rằng Techcombank có xu hướng kiểm soát tốt lượng tiền mặt vàng, đảm bảo cân bằng giữa tính thanh khoản và hiệu quả sử dụng vốn.

Sự dao động vừa phải của phạm vi cho thấy độ ổn định cao trong quản trị tài chính, đồng thời chứng minh sự thích ứng linh hoạt của ngân hàng trước biến động kinh tế sau Covid-19.

2.5.2.13 Biểu đồ 20: Phân bố Tài sản cố định (Density Plot)

ggplot(tieuluan, aes(x = `Tài sản cố định`/1e6)) +
  geom_density(fill = "#81D4FA", alpha = 0.6) +                # Layer 1
  geom_vline(aes(xintercept = mean(`Tài sản cố định`/1e6)), color = "red", linetype = "dashed") + # Layer 2
  geom_text(aes(x = mean(`Tài sản cố định`/1e6), y = 0.00005, label = "Trung bình"), color = "red") + # Layer 3
  theme_minimal() +                                            # Layer 4
  labs(title = "Phân bố giá trị Tài sản cố định (Density Plot – Fixed Assets Distribution)",
       x = "Tài sản cố định (tỷ đồng)", y = "Mật độ") +        # Layer 5
  theme(plot.title = element_text(face = "bold", hjust = 0.5))
## Warning in geom_text(aes(x = mean(`Tài sản cố định`/1000000), y = 0.00005, : 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:

Biểu đồ mật độ (geom_density) thể hiện phân bố xác suất liên tục của giá trị Tài sản cố định của Techcombank trong giai đoạn nghiên cứu.

Màu tô (fill) với độ trong suốt (alpha = 0.6) giúp nhấn mạnh vùng có mật độ quan sát cao nhất.

Đường thẳng đứng (geom_vline) biểu diễn giá trị trung bình của Tài sản cố định, giúp người xem dễ dàng so sánh vị trí tương đối của các năm so với trung bình.

Nhãn “Trung bình” (geom_text) được thêm để làm rõ ý nghĩa của đường tham chiếu.

Giao diện tối giản (theme_minimal) giúp biểu đồ tập trung vào nội dung dữ liệu mà vẫn đảm bảo tính trực quan và thẩm mỹ.

Ý nghĩa thống kê:

Biểu đồ cho thấy phân bố của Tài sản cố định không đồng đều, tập trung nhiều ở mức giá trị thấp, sau đó giảm dần khi giá trị tăng cao.

Đường mật độ có dạng lệch phải (right-skewed), chứng tỏ phần lớn các năm có giá trị Tài sản cố định thấp hơn trung bình, chỉ một vài năm có mức rất cao.

Mức trung bình nằm ở vùng có mật độ vừa phải, cho thấy dữ liệu có xu hướng phân tán rộng và có một số năm vượt trội về đầu tư tài sản cố định.

Về mặt thống kê, điều này phản ánh rằng Techcombank duy trì mức đầu tư ổn định trong phần lớn giai đoạn, nhưng có sự tăng vọt ở những năm gần đây – minh chứng cho việc đẩy mạnh đầu tư cơ sở vật chất và mở rộng hoạt động kinh doanh.

2.5.2.14 Biểu đồ 21: Thay đổi thứ hạng giữa Tổng tài sản và Tài sản cố định (Slope Chart – Biểu đồ đường dốc)

# === Biểu đồ : Thay đổi thứ hạng giữa Tổng tài sản và Tài sản cố định ===

# Chuẩn bị dữ liệu
rank_data <- tieuluan %>%
  mutate(rank_taisan = rank(-`Tổng tài sản`),        # Xếp hạng giảm dần (giá trị lớn hạng 1)
         rank_taisancd = rank(-`Tài sản cố định`)) %>%
  select(Năm, rank_taisan, rank_taisancd) %>%
  tidyr::pivot_longer(-Năm, names_to = "Biến", values_to = "Thứ_hạng")

# Vẽ biểu đồ Slope
ggplot(rank_data, aes(x = Năm, y = Thứ_hạng, group = Biến, color = Biến)) +
  geom_line(size = 1.2) +                                        # Layer 1: Đường nối thứ hạng
  geom_point(size = 3) +                                         # Layer 2: Điểm trên mỗi năm
  geom_text(aes(label = round(Thứ_hạng, 1)), vjust = -0.6, size = 3) +  # Layer 3: Nhãn thứ hạng
  scale_color_viridis_d() +                                     # Layer 4: Bảng màu đẹp, dễ nhìn
  theme_light(base_size = 12) +                                 # Layer 5: Giao diện sáng, rõ ràng
  labs(
    title = "Biểu đồ : Thay đổi thứ hạng giữa Tổng tài sản và Tài sản cố định ",
    x = "Năm",
    y = "Thứ hạng (1 = cao nhất)",
    color = "Biến tài chính"
  )
## Warning: Using `size` aesthetic for lines was deprecated in ggplot2 3.4.0.
## ℹ Please use `linewidth` instead.
## This warning is displayed once every 8 hours.
## Call `lifecycle::last_lifecycle_warnings()` to see where this warning was
## generated.

Ý nghĩa kỹ thuật:

Biểu đồ đường dốc (Slope Chart) được sử dụng để thể hiện sự thay đổi thứ hạng theo thời gian giữa hai chỉ tiêu tài chính: Tổng tài sản và Tài sản cố định của Techcombank.

Mỗi đường biểu diễn xu hướng thay đổi vị trí (thứ hạng) của một biến qua các năm, giúp dễ dàng so sánh tốc độ cải thiện hoặc suy giảm tương đối giữa các chỉ tiêu.

Trong phần xử lý dữ liệu, mutate() được dùng để tạo hai biến mới:

rank_taisan: xếp hạng giá trị Tổng tài sản theo thứ tự giảm dần (giá trị cao nhất xếp hạng 1).

rank_taisancd: xếp hạng giá trị Tài sản cố định tương tự.

Sau đó, pivot_longer() được dùng để chuyển dữ liệu từ dạng rộng sang dạng dài, giúp ggplot có thể vẽ song song hai biến trên cùng một biểu đồ.

Lớp geom_line(size = 1.2) vẽ đường nối thứ hạng qua các năm, thể hiện quá trình thay đổi vị trí theo thời gian.

Lớp geom_point(size = 3) đánh dấu thứ hạng của từng năm, còn geom_text() hiển thị nhãn thứ hạng ngay trên điểm, giúp người xem dễ theo dõi.

Thang màu scale_color_viridis_d() cung cấp màu phân biệt trực quan, hiện đại và dễ nhìn, đảm bảo người đọc phân biệt được hai biến rõ ràng.

Cuối cùng, theme_light() và labs() được dùng để làm sáng giao diện biểu đồ, thêm tiêu đề và nhãn trục rõ ràng, đảm bảo biểu đồ vừa dễ đọc vừa mang tính học thuật.

Ý nghĩa thống kê:

Biểu đồ cho thấy sự thay đổi thứ hạng của Tổng tài sản và Tài sản cố định của Techcombank qua giai đoạn 2014–2023, phản ánh mức độ phát triển tương đối của hai yếu tố này trong cơ cấu tài chính của ngân hàng.

Quan sát biểu đồ, có thể thấy cả hai chỉ tiêu đều có xu hướng cải thiện thứ hạng rõ rệt theo thời gian, nghĩa là Tổng tài sản và Tài sản cố định của Techcombank tăng nhanh hơn so với trung bình ngành hoặc so với các năm trước.

Giai đoạn 2014–2016, cả hai biến đều ở vị trí thấp (thứ hạng 9–10), thể hiện quy mô tài sản của Techcombank còn khiêm tốn.

Từ 2017 trở đi, đặc biệt sau năm 2019, Tổng tài sản liên tục cải thiện vị trí, tiến dần về thứ hạng cao (3–2–1).

Tương tự, Tài sản cố định cũng có bước tiến nhanh chóng, phản ánh chiến lược đầu tư mạnh mẽ vào cơ sở hạ tầng, chi nhánh, và công nghệ ngân hàng số trong giai đoạn phục hồi và tăng trưởng sau Covid-19.

Đường màu tím (Tổng tài sản) và đường màu vàng (Tài sản cố định) đều dốc xuống rõ rệt, biểu thị sự đi lên trong bảng xếp hạng (vì hạng 1 là cao nhất).

Điều này minh chứng rằng Techcombank không chỉ tăng quy mô tổng thể mà còn đầu tư song hành vào tài sản cố định, củng cố năng lực vận hành và mở rộng quy mô kinh doanh bền vững.

Về mặt thống kê, biểu đồ này khẳng định sự phát triển song hành và ổn định giữa hai yếu tố tài chính cốt lõi, cho thấy hiệu quả chiến lược đầu tư dài hạn và định hướng tăng trưởng toàn diện của Techcombank trong thập kỷ qua.

2.6 KẾT LUẬN

Đề tài “Phân tích toàn diện dữ liệu tài chính Techcombank (2014–2023)” đã thực hiện quy trình phân tích dữ liệu một cách hệ thống bằng ngôn ngữ R từ bước thu thập, xử lý, mã hóa, thống kê mô tả đến trực quan hóa dữ liệu. Thông qua việc ứng dụng các công cụ như readxl, DT, ggplot2, kableExtra, và các phép tính thống kê cơ bản (mean, var, cor, lm,…), nghiên cứu đã làm rõ đặc điểm, xu hướng và mối quan hệ giữa các chỉ tiêu tài chính chủ yếu của Techcombank. Bộ dữ liệu gồm 27 biến phản ánh toàn diện cấu trúc tài sản, nguồn vốn, nợ phải trả và hiệu quả hoạt động, cho phép đánh giá khách quan tình hình tài chính của ngân hàng trong suốt 10 năm.

Phân tích cho thấy tổng tài sản của Techcombank tăng mạnh mẽ và liên tục qua từng năm, từ 175.901.794 triệu đồng năm 2014 lên đến 849.482.012 triệu đồng năm 2023 tương đương mức tăng gấp gần 5 lần. Tốc độ tăng trưởng kép (CAGR) đạt 19,12%/năm, vượt mức trung bình toàn ngành, thể hiện khả năng mở rộng quy mô và sử dụng vốn hiệu quả. Các chỉ tiêu khác như “Tài sản cố định”, “Tiền gửi tại NHNN”, “Các khoản phải thu” đều có xu hướng tăng ổn định, chứng minh ngân hàng duy trì đà tăng trưởng cả về chiều rộng lẫn chiều sâu trong hoạt động kinh doanh.

Tỷ trọng giữa các nhóm tài sản phản ánh rõ định hướng quản trị thận trọng nhưng hiệu quả của Techcombank. Tỷ trọng tiền mặt giảm dần, trong khi tỷ trọng tiền gửi tại NHNN và tài sản cố định tăng cho thấy ngân hàng vừa đảm bảo an toàn thanh khoản, vừa đầu tư mạnh vào cơ sở hạ tầng, công nghệ và mạng lưới chi nhánh. Mối tương quan rất cao giữa Tổng tài sản và Tài sản cố định (r = 0.9769) và hệ số hồi quy R² = 0.954 khẳng định mối quan hệ chặt chẽ giữa tăng trưởng quy mô với đầu tư dài hạn. Điều này chứng minh Techcombank phát triển theo hướng bền vững, không chỉ mở rộng quy mô mà còn củng cố nền tảng hoạt động.

Kết quả phân tích cho thấy sự khác biệt rõ rệt giữa hai giai đoạn kinh tế: Trước Covid (2014–2019) và Sau Covid (2020–2023). Tổng tài sản trung bình sau đại dịch cao hơn 376.319.045 triệu đồng so với giai đoạn trước, thể hiện năng lực phục hồi mạnh mẽ và chiến lược tăng trưởng chủ động của ngân hàng. Dù nền kinh tế chịu nhiều biến động, Techcombank vẫn duy trì mức tăng trưởng ổn định, thể hiện khả năng quản trị rủi ro, thanh khoản và điều hành hiệu quả. Giai đoạn sau Covid ghi nhận sự tăng tốc về quy mô, cơ cấu tài sản hợp lý và mức độ đầu tư cao vào hạ tầng tài chính.

Về phương diện học thuật, nghiên cứu này minh chứng cho khả năng ứng dụng ngôn ngữ R trong xử lý, phân tích và trực quan hóa dữ liệu tài chính thực tế. Quá trình thực hiện giúp người học hiểu sâu hơn về các kỹ thuật thống kê, các chỉ tiêu tăng trưởng và khả năng khai thác dữ liệu ngân hàng. Về thực tiễn, kết quả cho thấy Techcombank là một trong những ngân hàng có tốc độ phát triển nhanh, an toàn và hiệu quả tại Việt Nam trong thập kỷ qua.