Bộ dữ liệu sử dụng: Credit Card Fraud Detection Dataset (nguồn: Kaggle).
Để chuẩn bị môi trường phân tích cho các thao tác khám phá và thống kê, đảm bảo có các công cụ để tính toán, làm sạch dữ liệu và tạo bảng tóm tắt, nhóm sử dụng cú pháp sau:
install.packages() được dùng để cài đặt
các package cần thiết.library() được dùng để nạp
package vào phiên làm việc R để sử dụng hàm.1.Đọc dữ liệu
Hàm read_csv() được sử dụng để đọc tệp
CSV vào một tibble (data frame hiện
đại), với khả năng tự động dò kiểu cột cơ
bản.
Bước này rất quan trọng vì nó nhập nguồn dữ liệu thô vào R ở dạng bảng để chuẩn bị cho các bước tính toán thống kê* và phân tích tiếp theo.
Bộ dữ liệu được nạp thành công với dạng tibble, gồm 284.807 dòng và 31 cột, thể hiện quy mô đủ lớn cho các phân tích thống kê và mô hình học máy.
2.Xem nhanh 6 dòng đầu
Hàm head() hiển thị vài quan sát đầu tiên để kiểm tra
cấu trúc dữ liệu ban đầu (cột/giá trị).
Thao tác này giúp nhanh chóng kiểm tra tính hợp lý của dữ liệu (ví dụ: định dạng số, tồn tại header, giá trị ngoại lệ rõ rệt), từ đó quyết định bước làm sạch tiếp theo.
Sáu dòng đầu tiên cho thấy các biến được gán đúng tên, không bị lỗi định dạng, giá trị trong các cột Time, Amount, Class đều mang dạng số hợp lý.
3. Kích thước (số dòng và cột)
## [1] 284807 31
Hàm dim() được sử dụng để trả về số hàng và số
cột (kích thước dữ liệu).
Thao tác này giúp xác định quy mô mẫu (n) và số tính năng (p) — đây là thông tin quan trọng để đánh giá sức mạnh thống kê, tốc độ xử lý và chọn phương pháp phân tích phù hợp.
Hàm dim() xác nhận dữ liệu có 284.807 quan sát và 31
biến — đảm bảo khối lượng dữ liệu đủ lớn để đạt ý nghĩa thống kê
mạnh.
4. Cấu trúc dữ liệu và kiểu biến
## spc_tbl_ [284,807 × 31] (S3: spec_tbl_df/tbl_df/tbl/data.frame)
## $ Time : num [1:284807] 0 0 1 1 2 2 4 7 7 9 ...
## $ V1 : num [1:284807] -1.36 1.192 -1.358 -0.966 -1.158 ...
## $ V2 : num [1:284807] -0.0728 0.2662 -1.3402 -0.1852 0.8777 ...
## $ V3 : num [1:284807] 2.536 0.166 1.773 1.793 1.549 ...
## $ V4 : num [1:284807] 1.378 0.448 0.38 -0.863 0.403 ...
## $ V5 : num [1:284807] -0.3383 0.06 -0.5032 -0.0103 -0.4072 ...
## $ V6 : num [1:284807] 0.4624 -0.0824 1.8005 1.2472 0.0959 ...
## $ V7 : num [1:284807] 0.2396 -0.0788 0.7915 0.2376 0.5929 ...
## $ V8 : num [1:284807] 0.0987 0.0851 0.2477 0.3774 -0.2705 ...
## $ V9 : num [1:284807] 0.364 -0.255 -1.515 -1.387 0.818 ...
## $ V10 : num [1:284807] 0.0908 -0.167 0.2076 -0.055 0.7531 ...
## $ V11 : num [1:284807] -0.552 1.613 0.625 -0.226 -0.823 ...
## $ V12 : num [1:284807] -0.6178 1.0652 0.0661 0.1782 0.5382 ...
## $ V13 : num [1:284807] -0.991 0.489 0.717 0.508 1.346 ...
## $ V14 : num [1:284807] -0.311 -0.144 -0.166 -0.288 -1.12 ...
## $ V15 : num [1:284807] 1.468 0.636 2.346 -0.631 0.175 ...
## $ V16 : num [1:284807] -0.47 0.464 -2.89 -1.06 -0.451 ...
## $ V17 : num [1:284807] 0.208 -0.115 1.11 -0.684 -0.237 ...
## $ V18 : num [1:284807] 0.0258 -0.1834 -0.1214 1.9658 -0.0382 ...
## $ V19 : num [1:284807] 0.404 -0.146 -2.262 -1.233 0.803 ...
## $ V20 : num [1:284807] 0.2514 -0.0691 0.525 -0.208 0.4085 ...
## $ V21 : num [1:284807] -0.01831 -0.22578 0.248 -0.1083 -0.00943 ...
## $ V22 : num [1:284807] 0.27784 -0.63867 0.77168 0.00527 0.79828 ...
## $ V23 : num [1:284807] -0.11 0.101 0.909 -0.19 -0.137 ...
## $ V24 : num [1:284807] 0.0669 -0.3398 -0.6893 -1.1756 0.1413 ...
## $ V25 : num [1:284807] 0.129 0.167 -0.328 0.647 -0.206 ...
## $ V26 : num [1:284807] -0.189 0.126 -0.139 -0.222 0.502 ...
## $ V27 : num [1:284807] 0.13356 -0.00898 -0.05535 0.06272 0.21942 ...
## $ V28 : num [1:284807] -0.0211 0.0147 -0.0598 0.0615 0.2152 ...
## $ Amount: num [1:284807] 149.62 2.69 378.66 123.5 69.99 ...
## $ Class : num [1:284807] 0 0 0 0 0 0 0 0 0 0 ...
## - attr(*, "spec")=
## .. cols(
## .. Time = col_double(),
## .. V1 = col_double(),
## .. V2 = col_double(),
## .. V3 = col_double(),
## .. V4 = col_double(),
## .. V5 = col_double(),
## .. V6 = col_double(),
## .. V7 = col_double(),
## .. V8 = col_double(),
## .. V9 = col_double(),
## .. V10 = col_double(),
## .. V11 = col_double(),
## .. V12 = col_double(),
## .. V13 = col_double(),
## .. V14 = col_double(),
## .. V15 = col_double(),
## .. V16 = col_double(),
## .. V17 = col_double(),
## .. V18 = col_double(),
## .. V19 = col_double(),
## .. V20 = col_double(),
## .. V21 = col_double(),
## .. V22 = col_double(),
## .. V23 = col_double(),
## .. V24 = col_double(),
## .. V25 = col_double(),
## .. V26 = col_double(),
## .. V27 = col_double(),
## .. V28 = col_double(),
## .. Amount = col_double(),
## .. Class = col_double()
## .. )
## - attr(*, "problems")=<externalptr>
Hàm str() (structure) liệt kê tên cột, kiểu dữ
liệu (numeric, character, v.v.) và một số giá trị
mẫu.
Thao tác này giúp xác định kiểu biến để quyết định phương pháp xử lý (ví dụ: biến số, biến phân loại) và lựa chọn thống kê mô tả phù hợp (mean/ median cho số, frequency cho phân loại).
Kết quả str() cho thấy tất cả các biến PCA (V1–V28) là kiểu numeric, biến Amount và Time cũng dạng số, biến Class dạng integer — thuận lợi cho các phép tính thống kê.
5. Chuẩn hóa tên cột (viết thường, không ký tự đặc biệt)
## [1] "time" "v1" "v2" "v3" "v4" "v5" "v6" "v7"
## [9] "v8" "v9" "v10" "v11" "v12" "v13" "v14" "v15"
## [17] "v16" "v17" "v18" "v19" "v20" "v21" "v22" "v23"
## [25] "v24" "v25" "v26" "v27" "v28" "amount" "class"
Hàm clean_names() từ gói janitor chuẩn
hóa tên cột (chuyển về chữ thường, dấu gạch
dưới thay ký tự đặc biệt).
Việc này giúp tên cột nhất quán, tránh lỗi khi chọn cột, và làm cho script reproducible (có thể tái lập); đây là bước quan trọng khi tái sử dụng code và thực hiện các thao tác chọn/biến đổi dữ liệu.
Sau clean_names(), các biến được chuyển thành chữ thường (ví dụ: v1, v2, …, amount, class) giúp việc thao tác, gọi biến trong code dễ dàng và tránh lỗi cú pháp.
6. Tổng số giá trị NA trên toàn bộ bảng và theo cột
## [1] 0
## named numeric(0)
Hàm is.na() được dùng để phát hiện giá trị thiếu
(NA); sau đó, hàm colSums() tính tổng số giá trị
NA theo cột.
Thao tác này giúp xác định xem cần thực hiện imputation (điền khuyết) hay loại bỏ quan sát. Giá trị NA có thể làm sai lệch thống kê (mean, sd) nếu không được xử lý chính xát.
Kết quả cho thấy 0 giá trị NA trên toàn bộ 31 biến — dữ liệu hoàn chỉnh, không cần xử lý imputation, giúp giảm sai lệch thống kê.
7. Thống kê tóm tắt cho các biến số
## time v1 v2 v3
## Min. : 0 Min. :-56.40751 Min. :-72.71573 Min. :-48.3256
## 1st Qu.: 54202 1st Qu.: -0.92037 1st Qu.: -0.59855 1st Qu.: -0.8904
## Median : 84692 Median : 0.01811 Median : 0.06549 Median : 0.1798
## Mean : 94814 Mean : 0.00000 Mean : 0.00000 Mean : 0.0000
## 3rd Qu.:139321 3rd Qu.: 1.31564 3rd Qu.: 0.80372 3rd Qu.: 1.0272
## Max. :172792 Max. : 2.45493 Max. : 22.05773 Max. : 9.3826
## v4 v5 v6 v7
## Min. :-5.68317 Min. :-113.74331 Min. :-26.1605 Min. :-43.5572
## 1st Qu.:-0.84864 1st Qu.: -0.69160 1st Qu.: -0.7683 1st Qu.: -0.5541
## Median :-0.01985 Median : -0.05434 Median : -0.2742 Median : 0.0401
## Mean : 0.00000 Mean : 0.00000 Mean : 0.0000 Mean : 0.0000
## 3rd Qu.: 0.74334 3rd Qu.: 0.61193 3rd Qu.: 0.3986 3rd Qu.: 0.5704
## Max. :16.87534 Max. : 34.80167 Max. : 73.3016 Max. :120.5895
## v8 v9 v10 v11
## Min. :-73.21672 Min. :-13.43407 Min. :-24.58826 Min. :-4.79747
## 1st Qu.: -0.20863 1st Qu.: -0.64310 1st Qu.: -0.53543 1st Qu.:-0.76249
## Median : 0.02236 Median : -0.05143 Median : -0.09292 Median :-0.03276
## Mean : 0.00000 Mean : 0.00000 Mean : 0.00000 Mean : 0.00000
## 3rd Qu.: 0.32735 3rd Qu.: 0.59714 3rd Qu.: 0.45392 3rd Qu.: 0.73959
## Max. : 20.00721 Max. : 15.59499 Max. : 23.74514 Max. :12.01891
## v12 v13 v14 v15
## Min. :-18.6837 Min. :-5.79188 Min. :-19.2143 Min. :-4.49894
## 1st Qu.: -0.4056 1st Qu.:-0.64854 1st Qu.: -0.4256 1st Qu.:-0.58288
## Median : 0.1400 Median :-0.01357 Median : 0.0506 Median : 0.04807
## Mean : 0.0000 Mean : 0.00000 Mean : 0.0000 Mean : 0.00000
## 3rd Qu.: 0.6182 3rd Qu.: 0.66251 3rd Qu.: 0.4931 3rd Qu.: 0.64882
## Max. : 7.8484 Max. : 7.12688 Max. : 10.5268 Max. : 8.87774
## v16 v17 v18
## Min. :-14.12985 Min. :-25.16280 Min. :-9.498746
## 1st Qu.: -0.46804 1st Qu.: -0.48375 1st Qu.:-0.498850
## Median : 0.06641 Median : -0.06568 Median :-0.003636
## Mean : 0.00000 Mean : 0.00000 Mean : 0.000000
## 3rd Qu.: 0.52330 3rd Qu.: 0.39968 3rd Qu.: 0.500807
## Max. : 17.31511 Max. : 9.25353 Max. : 5.041069
## v19 v20 v21
## Min. :-7.213527 Min. :-54.49772 Min. :-34.83038
## 1st Qu.:-0.456299 1st Qu.: -0.21172 1st Qu.: -0.22839
## Median : 0.003735 Median : -0.06248 Median : -0.02945
## Mean : 0.000000 Mean : 0.00000 Mean : 0.00000
## 3rd Qu.: 0.458949 3rd Qu.: 0.13304 3rd Qu.: 0.18638
## Max. : 5.591971 Max. : 39.42090 Max. : 27.20284
## v22 v23 v24
## Min. :-10.933144 Min. :-44.80774 Min. :-2.83663
## 1st Qu.: -0.542350 1st Qu.: -0.16185 1st Qu.:-0.35459
## Median : 0.006782 Median : -0.01119 Median : 0.04098
## Mean : 0.000000 Mean : 0.00000 Mean : 0.00000
## 3rd Qu.: 0.528554 3rd Qu.: 0.14764 3rd Qu.: 0.43953
## Max. : 10.503090 Max. : 22.52841 Max. : 4.58455
## v25 v26 v27
## Min. :-10.29540 Min. :-2.60455 Min. :-22.565679
## 1st Qu.: -0.31715 1st Qu.:-0.32698 1st Qu.: -0.070839
## Median : 0.01659 Median :-0.05214 Median : 0.001342
## Mean : 0.00000 Mean : 0.00000 Mean : 0.000000
## 3rd Qu.: 0.35072 3rd Qu.: 0.24095 3rd Qu.: 0.091045
## Max. : 7.51959 Max. : 3.51735 Max. : 31.612198
## v28 amount class
## Min. :-15.43008 Min. : 0.00 Min. :0.000000
## 1st Qu.: -0.05296 1st Qu.: 5.60 1st Qu.:0.000000
## Median : 0.01124 Median : 22.00 Median :0.000000
## Mean : 0.00000 Mean : 88.35 Mean :0.001727
## 3rd Qu.: 0.07828 3rd Qu.: 77.17 3rd Qu.:0.000000
## Max. : 33.84781 Max. :25691.16 Max. :1.000000
Hàm summary() cung cấp các thống kê cơ
bản (min, 1st Qu., median,
mean, 3rd Qu., max); được kết hợp với
select_if() để chỉ chọn các cột numeric
(định lượng).
Thao tác này giúp nhận diện phân bố(lệch phải/trái), outliers (giá trị ngoại lệ), và những đặc điểm cơ bản như sự khác biệt giữa trung vị và trung bình — đây là thông tin cần thiết cho chuẩn hóa hoặc chuyển đổi biến.
Các thống kê mô tả cho thấy nhiều biến PCA có trung bình gần 0 và phương sai nhỏ, đúng tính chất của dữ liệu sau PCA.
8. Bảng tần suất và tỷ lệ phần trăm cho biến class
##
## 0 1
## 284315 492
##
## 0 1
## 99.8272514 0.1727486
Hàm table() được dùng để đếm tần suất (số lượng) của các
nhóm; sau đó prop.table() chuyển kết quả này sang tỷ lệ
phần trăm.
Thao tác này giúp xác định mức độ mất cân bằng lớp (class imbalance) — đây là yếu tố quyết định chiến lược sampling và lựa chọn metric (precision/ recall hơn accuracy) khi xây dựng mô hình.
Bảng tần suất cho thấy chỉ khoảng 492 giao dịch gian lận so với hơn 284.000 giao dịch hợp lệ, tức tỷ lệ 0.17% gian lận, thể hiện mất cân bằng dữ liệu cực mạnh.
9. Thống kê chi tiết cho Amount: mean, median, sd, IQR, min, max
Hàm summarise() được dùng để tính các thống kê mô tả
chính như mean (trung bình), median (trung vị),
sd (độ lệch chuẩn) và IQR (khoảng tứ phân vị).
Việc so sánh mean và median cho biết độ lệch của phân bố (skewness); trong khi sd và IQR cho biết mức độ biến thiên và tính bền vững trước outliers (IQR ít nhạy hơn với outliers).
Trung bình khoảng 88.3, trung vị chỉ 22.0, độ lệch chuẩn lớn và giá trị cao nhất lên đến 25.691, chứng tỏ phần lớn giao dịch nhỏ, vài giao dịch giá trị cực lớn kéo lệch phân phối.
10. Số lượng giá trị duy nhất trên mỗi cột (để phát hiện biến hằng hoặc biến categorical)
## time v1 v2 v3 v4 v5 v6 v7 v8 v9 v10
## 124592 275663 275663 275663 275663 275663 275663 275663 275663 275663 275663
## v11 v12 v13 v14 v15 v16 v17 v18 v19 v20 v21
## 275663 275663 275663 275663 275663 275663 275663 275663 275663 275663 275663
## v22 v23 v24 v25 v26 v27 v28 amount class
## 275663 275663 275663 275663 275663 275663 275663 32767 2
Các hàm unique() và length() được sử dụng
kết hợp để xác định số lượng giá trị khác nhau (giá trị độc nhất) trong
một cột.
Thao tác này giúp phân loại biến: nếu một cột có rất ít giá trị độc nhất (ví dụ 2 giá trị), nó có thể là biến phân loại (categorical); ngược lại, nếu một cột có 1 giá trị duy nhất thì không có ý nghĩa phân biệt và có thể loại bỏ khỏi tập dữ liệu.
Kết quả cho thấy các biến PCA có giá trị khác nhau ở hầu hết các dòng (liên tục), trong khi biến Class chỉ có 2 giá trị duy nhất (0 và 1) — đúng đặc trưng của bài toán nhị phân.
11. Kiểm tra class/kiểu dữ liệu của từng biến
## time v1 v2 v3 v4 v5 v6 v7
## "numeric" "numeric" "numeric" "numeric" "numeric" "numeric" "numeric" "numeric"
## v8 v9 v10 v11 v12 v13 v14 v15
## "numeric" "numeric" "numeric" "numeric" "numeric" "numeric" "numeric" "numeric"
## v16 v17 v18 v19 v20 v21 v22 v23
## "numeric" "numeric" "numeric" "numeric" "numeric" "numeric" "numeric" "numeric"
## v24 v25 v26 v27 v28 amount class
## "numeric" "numeric" "numeric" "numeric" "numeric" "numeric" "numeric"
sapply(…, class) trả kiểu cột (numeric, integer, character, factor…).
kiểu dữ liệu xác định loại thống kê phù hợp (ví dụ: trung bình cho numeric, tỷ lệ cho factor) và ảnh hưởng tới cách mã hóa trước khi mô hình hóa.
Tất cả các biến đều là numeric hoặc integer, không có biến dạng chuỗi (character) — thuận tiện cho việc trực tiếp áp dụng mô hình học máy mà không cần mã hóa thêm.
12. Mô tả phân bố của biến Time theo đơn vị giờ)
## Min. 1st Qu. Median Mean 3rd Qu. Max.
## 0.00 15.00 23.00 25.85 38.00 47.00
Chuyển thời gian từ giây sang giờ bằng phép chia floor(time/3600) và biểu diễn bằng histogram.
Phân tích phân bố thời gian giúp nhận biết các khoảng giờ giao dịch tập trung, có thể liên quan tới hành vi hoặc rủi ro gian lận.
Phân bố cho thấy các giao dịch diễn ra liên tục trong ngày nhưng tập trung nhiều ở khung giờ 8h–18h, phản ánh hoạt động tài chính chủ yếu trong giờ hành chính.
Phần này trình bày 11 thao tác xử lý dữ liệu thô và mã hóa dữ liệu, bao gồm kiểm tra, biến đổi, tạo biến mới, và chuẩn hóa để đảm bảo dữ liệu sẵn sàng cho phân tích.
1.Loại bỏ các giao dịch có giá trị Amount > 99th percentile
Sử dụng ngưỡng 99th percentile để loại bỏ các giá trị cực đoan ở đuôi phải.
Giảm ảnh hưởng của outliers lên các chỉ tiêu trung bình và phương sai, giúp mô hình ổn định hơn.
Khoảng 1% giao dịch giá trị cao nhất bị loại bỏ, giúp phân phối Amount cân đối hơn.
2. Chuẩn hóa biến Amount về phân phối chuẩn (z-score)
scale() chuẩn hóa biến theo công thức Z = (x - mean)/sd.
Giúp so sánh giữa các biến có đơn vị khác nhau và tránh biến có độ lớn chi phối mô hình.
Biến amount_scaled có trung bình ≈ 0 và độ lệch chuẩn ≈ 1.
3. Phân nhóm giá trị Amount thành 3 mức
##
## Cao Thấp Trung bình
## 25988 191045 64925
Dùng case_when() để chia giá trị liên tục thành nhóm rời rạc.
Biến rời rạc hỗ trợ so sánh tỷ lệ gian lận giữa các nhóm mức độ chi tiêu.
Có 191.045 là giao dịch ở nhóm thấp, 64.925 giao dịch ở nhóm trung bình và 25.988 giao dịch ở nhóm cao.
4. Tạo biến khung giờ giao dịch (sáng, chiều, tối)
##
## Chiều Đêm Sáng Tối
## 95236 23813 70064 92845
Chia biến time (giờ) thành 4 khung thời gian trong ngày.
Cho phép đánh giá xu hướng gian lận theo thời điểm giao dịch trong ngày.
Có 70.064 giao dịch vào buổi sáng, 95.236 giao dịch chiều, 23.813 giao dịch đêm và 92.845 giao dịch tối
5. Kiểm tra biến không có phương sai (variance = 0)
## character(0)
Đếm số giá trị duy nhất trong mỗi cột, tìm biến hằng.
Biến không biến thiên không mang thông tin, nên loại bỏ trước khi mô hình hóa.
Không có biến nào có phương sai bằng 0 — dữ liệu đảm bảo tính đa dạng.
6. Kiểm tra tương quan giữa Amount và 3 biến PCA đầu tiên
## amount v1
## amount 1.0000000 -0.1125346
## v1 -0.1125346 1.0000000
cor() tính hệ số tương quan Pearson giữa các biến định lượng.
Giúp phát hiện biến liên quan để chọn lọc đặc trưng khi xây dựng mô hình.
Các hệ số tương quan nhỏ (|r| < 0.1), cho thấy Amount độc lập với các thành phần PCA đầu.
7. Giảm độ lệch của biến Amount bằng căn bậc hai
Áp dụng biến đổi căn bậc hai để giảm độ lệch phải (skewness).
Giúp phân phối gần chuẩn hơn, cải thiện giả định của các phép kiểm định và hồi quy.
Phân phối amount_sqrt trở nên đối xứng hơn so với gốc.
8. Mã hóa biến nhóm Amount thành dạng factor có thứ tự
Mã hóa lại biến phân loại thành factor có thứ tự (ordered factor).
Giúp mô hình hiểu được mức độ tăng dần của giá trị chi tiêu.
Biến amount_group đã có thứ tự logic, thuận tiện cho mô hình hồi quy tuần tự.
9. Tạo mẫu cân bằng tạm thời để minh họa (undersampling)
##
## 0 1
## 483 483
Undersampling lớp đa số để tạo bộ mẫu có số lượng 2 lớp bằng nhau.
Giúp các mô hình phân loại không bị lệch về lớp chiếm đa số.
Mẫu cân bằng gồm số lượng gian lận và hợp lệ bằng nhau (~483 mỗi loại).
10. Phát hiện ngoại lệ trong biến V1 bằng z-score
## [1] 3720
Tính z-score và đếm số điểm dữ liệu vượt 3 độ lệch chuẩn.
Giúp nhận diện các quan sát bất thường trong không gian PCA.
Có một lượng nhỏ điểm ngoại lệ trong V1 nhưng không đáng kể so với toàn tập.
11. Chuẩn hóa toàn bộ 28 biến PCA về khoảng [0,1] bằng Min–Max Scaling
Dùng công thức Min–Max Scaling đưa toàn bộ 28 biến PCA về khoảng [0,1].
Giúp các biến có cùng thang đo, tránh hiện tượng biến có độ lớn cao chi phối kết quả phân tích đa biến.
Tất cả các biến V1–V28 đều được chuẩn hóa; dữ liệu hiện đồng nhất về thang giá trị, sẵn sàng cho mô hình hồi quy, phân cụm hoặc phát hiện gian lận.
Trong phần này, nhóm thực hiện 22 thao tác nhằm mô tả đặc điểm dữ liệu, nhận diện các xu hướng, phân phối, mối liên hệ giữa các biến và đánh giá sơ bộ hiện tượng gian lận.
1. Tóm tắt toàn bộ dữ liệu sau xử lý
## time v1 v2 v3
## Min. : 0 Min. :0.0000 Min. :0.0000 Min. :0.0000
## 1st Qu.: 54250 1st Qu.:0.9320 1st Qu.:0.6743 1st Qu.:0.7621
## Median : 84728 Median :0.9510 Median :0.6837 Median :0.7866
## Mean : 94834 Mean :0.9509 Mean :0.6834 Mean :0.7827
## 3rd Qu.:139345 3rd Qu.:0.9770 3rd Qu.:0.6942 3rd Qu.:0.8062
## Max. :172792 Max. :1.0000 Max. :1.0000 Max. :1.0000
## v4 v5 v6 v7
## Min. :0.0000 Min. :0.0000 Min. :0.0000 Min. :0.0000
## 1st Qu.:0.2567 1st Qu.:0.3981 1st Qu.:0.5665 1st Qu.:0.7261
## Median :0.3006 Median :0.4090 Median :0.5788 Median :0.7361
## Mean :0.3015 Mean :0.4103 Mean :0.5853 Mean :0.7349
## 3rd Qu.:0.3409 3rd Qu.:0.4205 3rd Qu.:0.5953 3rd Qu.:0.7449
## Max. :1.0000 Max. :1.0000 Max. :1.0000 Max. :1.0000
## v8 v9 v10 v11
## Min. :0.0000 Min. :0.0000 Min. :0.0000 Min. :0.0000
## 1st Qu.:0.7832 1st Qu.:0.4408 1st Qu.:0.4978 1st Qu.:0.2399
## Median :0.7857 Median :0.4611 Median :0.5069 Median :0.2833
## Mean :0.7855 Mean :0.4629 Mean :0.5089 Mean :0.2852
## 3rd Qu.:0.7889 3rd Qu.:0.4834 3rd Qu.:0.5182 3rd Qu.:0.3292
## Max. :1.0000 Max. :1.0000 Max. :1.0000 Max. :1.0000
## v12 v13 v14 v15
## Min. :0.0000 Min. :0.0000 Min. :0.0000 Min. :0.0000
## 1st Qu.:0.6890 1st Qu.:0.4963 1st Qu.:0.6317 1st Qu.:0.3793
## Median :0.7095 Median :0.5577 Median :0.6477 Median :0.4405
## Mean :0.7042 Mean :0.5590 Mean :0.6459 Mean :0.4357
## 3rd Qu.:0.7275 3rd Qu.:0.6230 3rd Qu.:0.6625 3rd Qu.:0.4986
## Max. :1.0000 Max. :1.0000 Max. :1.0000 Max. :1.0000
## v16 v17 v18 v19
## Min. :0.0000 Min. :0.0000 Min. :0.0000 Min. :0.0000
## 1st Qu.:0.6641 1st Qu.:0.7171 1st Qu.:0.6525 1st Qu.:0.4258
## Median :0.6900 Median :0.7292 Median :0.6882 Median :0.4693
## Mean :0.6868 Mean :0.7311 Mean :0.6885 Mean :0.4690
## 3rd Qu.:0.7121 3rd Qu.:0.7427 3rd Qu.:0.7247 3rd Qu.:0.5125
## Max. :1.0000 Max. :1.0000 Max. :1.0000 Max. :1.0000
## v20 v21 v22 v23
## Min. :0.0000 Min. :0.0000 Min. :0.0000 Min. :0.0000
## 1st Qu.:0.5776 1st Qu.:0.5578 1st Qu.:0.4306 1st Qu.:0.6214
## Median :0.5813 Median :0.5610 Median :0.4588 Median :0.6239
## Mean :0.5824 Mean :0.5614 Mean :0.4586 Mean :0.6242
## 3rd Qu.:0.5861 3rd Qu.:0.5644 3rd Qu.:0.4857 3rd Qu.:0.6266
## Max. :1.0000 Max. :1.0000 Max. :1.0000 Max. :1.0000
## v24 v25 v26 v27
## Min. :0.0000 Min. :0.0000 Min. :0.0000 Min. :0.0000
## 1st Qu.:0.3618 1st Qu.:0.4782 1st Qu.:0.3119 1st Qu.:0.6934
## Median :0.4194 Median :0.5004 Median :0.3611 Median :0.6956
## Mean :0.4134 Mean :0.4994 Mean :0.3703 Mean :0.6955
## 3rd Qu.:0.4775 3rd Qu.:0.5226 3rd Qu.:0.4133 3rd Qu.:0.6983
## Max. :1.0000 Max. :1.0000 Max. :1.0000 Max. :1.0000
## v28 amount class time_hour
## Min. :0.0000 Min. : 0.00 Min. :0.000000 Min. : 0.00
## 1st Qu.:0.3396 1st Qu.: 5.47 1st Qu.:0.000000 1st Qu.:10.00
## Median :0.3414 Median : 21.19 Median :0.000000 Median :15.00
## Mean :0.3411 Mean : 70.72 Mean :0.001713 Mean :14.05
## 3rd Qu.:0.3433 3rd Qu.: 74.95 3rd Qu.:0.000000 3rd Qu.:19.00
## Max. :1.0000 Max. :1017.50 Max. :1.000000 Max. :23.00
## amount_scaled.V1 amount_group time_period
## Min. :-0.5480064087510 Thấp :191045 Length:281958
## 1st Qu.:-0.5056174494640 Trung bình: 64925 Class :character
## Median :-0.3837976249680 Cao : 25988 Mode :character
## Mean : 0.0000000000000
## 3rd Qu.: 0.0328075763609
## Max. : 7.3369599668500
## amount_sqrt
## Min. : 0.000
## 1st Qu.: 2.339
## Median : 4.603
## Mean : 6.331
## 3rd Qu.: 8.657
## Max. :31.898
summary() cho thống kê cơ bản của từng biến (Min, 1st Qu., Median, Mean, 3rd Qu., Max).
Giúp nhìn tổng quan phân phối và phạm vi giá trị của các biến chính.
Các biến PCA có trung bình gần 0, Amount lệch phải mạnh, Class chỉ có 2 giá trị (0–1).
2. Mô tả thống kê biến Time
## Min. 1st Qu. Median Mean 3rd Qu. Max.
## 0 54250 84728 94834 139345 172792
Tính giá trị nhỏ nhất, lớn nhất và trung bình thời điểm giao dịch.
Giúp hiểu phạm vi thời gian hoạt động, hữu ích khi xem xét chu kỳ trong ngày.
Time dao động từ 0 đến ~172,792 giây (~48 giờ) — tức dữ liệu trong 2 ngày giao dịch.
3. Thống kê chi tiết biến Amount
Sử dụng các hàm thống kê cơ bản (mean, median, sd, …).
So sánh Mean–Median để phát hiện độ lệch phân phối.
Mean ≈ 70.71, Median ≈ 21.19 → phân phối lệch phải rõ rệt.
4. Kiểm tra độ lệch (skewness) và độ nhọn (kurtosis)
## [1] 3.579118
## [1] 15.5468
Sử dụng hàm skewness() và kurtosis() để đo hình dạng phân phối.
Skewness > 0 nghĩa là lệch phải; kurtosis > 3 nghĩa là phân phối nhọn hơn chuẩn.
Skewness ≈ 3+, kurtosis ≈ 15.5+ → phân phối Amount cực kỳ lệch phải.
5. Vẽ histogram cho Amount
Dùng histogram thể hiện mật độ giá trị Amount.
Giúp trực quan hóa phân phối và phát hiện lệch.
Đa số giao dịch tập trung ở mức < 200 USD, vài giao dịch > 200 USD.
6. Vẽ boxplot để phát hiện ngoại lệ của Amount
Boxplot hiển thị trung vị, tứ phân vị và điểm ngoại lệ.
Giúp định lượng số lượng và độ xa của outliers.
Nhiều outliers phía trên; phân phối không đối xứng.
7. Tần suất của biến Class
##
## 0 1
## 281475 483
##
## 0 1
## 99.8286979 0.1713021
Tính tần suất và phần trăm từng loại.
Xác định tỷ lệ giữa giao dịch hợp lệ và gian lận.
Khoảng 0.17% giao dịch gian lận — dataset mất cân bằng nghiêm trọng.
8. So sánh trung bình Amount giữa hai nhóm Class
Dùng group_by() và summarise() để tính trung bình theo nhóm.
Kiểm tra xem giao dịch gian lận có xu hướng giá trị cao hơn không.
Giao dịch gian lận có Amount trung bình cao hơn nhẹ so với giao dịch hợp lệ.
9. Kiểm định t-test giữa hai nhóm Class
##
## Welch Two Sample t-test
##
## data: amount by class
## t = -3.3015, df = 482.89, p-value = 0.001033
## alternative hypothesis: true difference in means between group 0 and group 1 is not equal to 0
## 95 percent confidence interval:
## -42.12955 -10.69226
## sample estimates:
## mean in group 0 mean in group 1
## 70.67117 97.08207
Kiểm định giả thuyết sự khác biệt trung bình giữa 2 nhóm độc lập.
Xem Amount có khác biệt có ý nghĩa giữa gian lận và hợp lệ.
p-value = 0.001 < 0.05 → có khác biệt có ý nghĩa thống kê.
10. Ma trận tương quan giữa 5 biến đầu (Amount + V1–V4)
## amount v1
## amount 1.0000000 -0.1125346
## v1 -0.1125346 1.0000000
cor() tính hệ số tương quan Pearson giữa các biến định lượng.
Kiểm tra mối quan hệ tuyến tính giữa Amount và các PCA components.
Các hệ số thấp (<0.1), chứng tỏ tính độc lập cao giữa các biến PCA.
11. Biểu đồ tương quan (corrplot)
Dùng corrplot() để trực quan hóa ma trận tương quan.
Giúp nhận diện nhóm biến có tương quan cao (có thể gây đa cộng tuyến).
Một số cặp biến PCA có tương quan âm nhẹ, đa phần gần 0.
12. Thống kê trung bình Amount theo khung giờ
Tính trung bình theo biến phân loại time_period.
Xem giá trị giao dịch có thay đổi theo thời điểm trong ngày.
Trung bình giao dịch cao nhất vào khung “Chiều”.
13. So sánh độ biến thiên Amount giữa 2 nhóm Class
Tính độ lệch chuẩn theo nhóm.
Độ biến thiên lớn thể hiện sự không đồng nhất về hành vi chi tiêu.
Nhóm gian lận có độ lệch chuẩn cao hơn rõ rệt (175.7317 > 128.9442).
14. So sánh trung vị Amount theo nhóm Class
Sử dụng trung vị (median) – thước đo bền vững với outlier.
Giúp đánh giá xu hướng trung tâm khi dữ liệu lệch.
Trung vị gần nhau, chứng tỏ khác biệt chủ yếu do vài giá trị cực đại.
15. Đếm số lượng giao dịch theo từng giờ
Dùng group_by() đếm số lượng quan sát theo thời gian.
Giúp nhận biết thời điểm cao điểm hoạt động giao dịch.
Số lượng giao dịch cao vào khoảng 8h–18h, giảm mạnh ban đêm.
16. Tỷ lệ gian lận theo khung giờ
Tính tỷ lệ phần trăm gian lận cho từng khung thời gian.
Xác định thời điểm trong ngày có nguy cơ cao.
Các khung giờ đều không có tỷ lệ gian lận.
17. Tỷ lệ gian lận theo nhóm Amount
Tính tỷ lệ gian lận theo nhóm chi tiêu.
Kiểm tra xem giao dịch giá trị lớn có dễ gian lận hơn không.
Cả 3 nhóm đều có tỷ lệ gần ngang nhau.
18. Hệ số biến thiên (CV) của Amount
## [1] 1.824796
CV = SD / Mean thể hiện mức độ biến động tương đối.
Dùng so sánh độ phân tán giữa các biến không cùng thang đo.
CV cao (~1.8) → phân phối Amount biến động mạnh.
19. Chuẩn hóa Amount bằng z-score và mô tả
## V1
## Min. :-0.54801
## 1st Qu.:-0.50562
## Median :-0.38380
## Mean : 0.00000
## 3rd Qu.: 0.03281
## Max. : 7.33696
Chuẩn hóa dữ liệu để phục vụ phân tích đa biến.
Biến có trung bình 0, SD=1 giúp mô hình ổn định và dễ so sánh.
amount_z đạt chuẩn hóa đúng, không thay đổi thứ tự dữ liệu.
20. Tính ma trận hiệp phương sai giữa 3 biến đầu
## v1
## v1 0.001467571
cov() đo mức biến động đồng thời giữa các biến định lượng
Cho biết biến có tăng giảm cùng chiều hay không.
Các giá trị nhỏ gần 0(0.0014) → biến PCA gần như độc lập.
21. Đếm số outlier dựa theo z-score của Amount
## [1] 7734
Xác định điểm nằm ngoài 3 độ lệch chuẩn.
Cho biết giao dịch bất thường.
Có 7734 giao dịch bất thường.
22. Tổng hợp chỉ tiêu thống kê toàn bộ dữ liệu
Tạo bảng tổng hợp cuối cùng cho toàn bộ tập dữ liệu.
Tóm tắt nhanh tình trạng dữ liệu trước khi phân tích nâng cao.
Dữ liệu gồm ~281,958 quan sát, 37 biến, không có NA, tỷ lệ gian lận ≈ 0.17%.
Phần này trình bày 21 đồ thị trực quan hóa đặc trưng của bộ dữ liệu.
Để đảm bảo hiệu quả tính toán và khả năng hiển thị rõ ràng trên đồ thị, nhóm quyết định tiến hành lấy mẫu con (sub-sampling). Cụ thể, chúng tôi sử dụng câu lệnh data_sample <- data %>% sample_n(10000) để chọn ngẫu nhiên 10.000 quan sát từ tổng thể hơn 280.000 giao dịch. Việc này giúp giảm tải đáng kể cho hệ thống khi thực hiện trực quan hóa các biến PCA (V1 đến V28), đồng thời vẫn đảm bảo mẫu có tính đại diện cao cho tập dữ liệu gốc.
Đồ thị 1 – Histogram phân phối Amount
Đồ thị 1 cho thấy phân bố số tiền giao dịch (Amount) bị lệch phải nghiêm trọng, với phần lớn giá trị tập trung ở mức thấp và có đuôi dài về phía giá trị lớn (outliers).
Đồ thị 2 – Boxplot Amount theo Class
Đồ thị 2 cho thấy mặc dù cả hai nhóm đều có trung vị thấp, sự khác biệt về phương sai (biến động) của biến Amount giữa giao dịch hợp lệ và gian lận là có thể nhận thấy. Điều này gợi ý rằng biến Amount (và phiên bản chuẩn hóa của nó) là một đặc trưng có giá trị để phân biệt giữa hai nhóm Class trong quá trình xây dựng mô hình.
Đồ thị 3 – Biểu đồ tần suất Class
Đồ thị 3 tần suất hai loại giao dịch cho thấy dữ liệu mất cân bằng nghiêm trọng, với 281.475 giao dịch Không gian lận áp đảo so với chỉ 483 giao dịch Gian lận.
Đồ thị 4 – Mật độ Amount theo Class
Đồ thị 4 cho thấy mật độ phân phối của số tiền giao dịch (Amount) tập trung cực kỳ cao ở giá trị $0, sau đó giảm nhanh chóng và kéo dài về phía bên phải, xác nhận phân phối lệch phải nghiêm trọng như đã thấy ở histogram.
Đồ thị 5 – Heatmap ma trận tương quan
Đồ thị 5 cho thấy hệ số tương quan (r) giữa hầu hết các cặp biến V1 đến V10 là rất thấp (gần 0, màu trắng/tím nhạt), khẳng định rằng các thành phần chính (PCA) đã phân tách thành công sự biến thiên của dữ liệu và độc lập tuyến tính với nhau.
Đồ thị 6 - Phân bố của biến Time
Đồ thị 6 cho thấy phân bố thời gian giao dịch có tính chu kỳ rõ ràng với hai đỉnh cao (tần suất khoảng 10.000) tương ứng với hai giai đoạn hoạt động mạnh nhất trong ngày (thường là ban ngày), và giảm mạnh ở khoảng giữa (tần suất thấp nhất), thể hiện sự ngừng trệ vào ban đêm (khoảng giữa trục Time).
Đồ thị 7 - Boxplot Amount
Đồ thị 7 cho thấy phân bố số tiền giao dịch (Amount) tập trung cực kỳ chặt chẽ ở các giá trị rất nhỏ (hộp và trung vị gần $0), trong khi phần lớn dữ liệu (chấm màu cam) và giá trị cực đại (đường đỏ) trải dài rất xa lên trên (outliers), xác nhận phân bố lệch phải nghiêm trọng.
Đồ thị 8 - Phân bố log(amount)
Đồ thị 8 cho thấy sau khi chuyển đổi logarit, phân bố của biến Amount đã trở nên đối xứng và chuẩn hơn, giảm bớt độ lệch phải nghiêm trọng ban đầu, nhưng vẫn còn đa đỉnh (multimodal), cho thấy số tiền giao dịch vẫn tập trung quanh nhiều mức giá trị khác nhau.
Đồ thị 9 - Quan hệ giữa v1 và v2
Đồ thị 9 cho thấy không có mối quan hệ tuyến tính đáng kể giữa hai biến v1 và v2 (đường xu hướng màu đen gần như nằm ngang), và các điểm dữ liệu tập trung dày đặc ở góc trên bên phải của biểu đồ (giá trị v1 và v2 cao), thể hiện tính độc lập của hai thành phần PCA này.
Đồ thị 10 - Quan hệ v3 và v4
Đồ thị 10 cho thấy mối quan hệ phi tuyến tính giữa v3 và v4 (đường xu hướng màu đỏ là hình parabol), và các điểm dữ liệu tập trung dày đặc ở góc dưới bên phải (vùng màu xanh lá/vàng), cho thấy một cụm dữ liệu chính tại vị trí v3 cao và v4 thấp.
Đồ thị 11 - Histogram v5
Đồ thị 11 cho thấy phân bố của biến v5 rất tập trung và đối xứng xung quanh giá trị trung bình/trung vị (đường đứt đoạn màu xanh dương), gần như là phân phối chuẩn, với độ nhọn cao (rất ít sự biến động) và không có đuôi dài đáng kể.
Đồ thị 12 - Quan hệ v6 ~ v7
Đồ thị 12 cho thấy không có mối quan hệ tuyến tính rõ ràng giữa v6 và v7 (đường xu hướng màu đen gần như nằm ngang), và các điểm dữ liệu tập trung dày đặc ở giữa biểu đồ (vùng màu nâu sẫm), xác nhận tính độc lập của hai thành phần PCA này.
Đồ thị 13 - Phân bố v8
Đồ thị 13 cho thấy phân bố của biến v8 có độ nhọn cực kỳ cao (leptokurtic), với mật độ tập trung gần như tuyệt đối tại một giá trị duy nhất (khoảng 0.78), thể hiện sự biến thiên cực kỳ thấp và tính đồng nhất cao của đặc trưng này.
Đồ thị 14 - Quan hệ v9 ~ v10
Đồ thị 14 cho thấy không có mối quan hệ tuyến tính giữa v9 và v10 (đường xu hướng màu xanh lá nằm ngang), và các điểm dữ liệu tập trung rất chặt chẽ thành một khối hình bầu dục ở trung tâm, xác nhận tính độc lập tuyến tính của hai thành phần PCA này.
Đồ thị 15 - Phân bố v11
Đồ thị 15 cho thấy phân bố của biến v11 gần như đối xứng nhưng hơi lệch phải nhẹ (trung vị/trung bình - đường đứt đoạn - nằm lệch về bên trái của đỉnh cao nhất), có độ nhọn vừa phải và biến động cao hơn so với các biến PCA trước đó.
Đồ thị 16 - Phân bố v12
Đồ thị 16 cho thấy phân bố của biến v12 bị lệch trái nhẹ (Left-Skewed) với đuôi ngắn hơn kéo về bên phải và tập trung cực kỳ cao (độ nhọn lớn) xung quanh giá trị trung bình/trung vị (đường đứt đoạn màu đỏ).
Đồ thị 17 - Quan hệ giữa v13 và v14
Đồ thị 17 cho thấy không có mối quan hệ tuyến tính rõ ràng giữa v13 và v14 (đường xu hướng màu xanh lá nằm ngang), và các điểm dữ liệu tập trung dày đặc ở trung tâm, xác nhận tính độc lập tuyến tính của hai thành phần PCA này.
Đồ thị 18 - Phân bố v15
Đồ thị 18 cho thấy phân bố của biến v15 tương đối đối xứng nhưng hơi lệch trái nhẹ (trung vị/trung bình - đường đứt đoạn màu xanh dương - nằm lệch sang phải so với đỉnh cao nhất), có độ nhọn và biến động vừa phải, tập trung chủ yếu quanh giá trị 0.45.
Đồ thị 19 - Quan hệ v16 và v17
Đồ thị 19 cho thấy không có mối quan hệ tuyến tính rõ ràng giữa v16 và v17 (đường xu hướng màu đen nằm ngang), và các điểm dữ liệu tập trung dày đặc ở góc trên bên phải của biểu đồ, xác nhận tính độc lập tuyến tính của hai thành phần PCA này.
Đồ thị 20 - Phân bố v18
Đồ thị 20 cho thấy phân bố của biến v18 gần như đối xứng xung quanh giá trị trung bình/trung vị (đường đứt đoạn màu đỏ), có độ nhọn cao (tập trung mạnh) và biến động tương đối thấp, với hầu hết các giá trị nằm trong khoảng từ 0.50 đến 0.85.
Đồ thị 21 - Quan hệ v19 và v20
Đồ thị 21 cho thấy không có mối quan hệ tuyến tính rõ ràng giữa v19 và v20 (đường xu hướng màu đen gần như nằm ngang), và các điểm dữ liệu tập trung dày đặc quanh trung tâm với phân bố rộng, xác nhận tính độc lập tuyến tính của hai thành phần PCA này.
1. Kiểm tra kích thước dữ liệu
## [1] 85 11
## [1] 26 11
## [1] 50 8
Hàm dim() cho biết số hàng và cột trong mỗi bảng dữ liệu.
Giúp xác định độ lớn và mức độ chi tiết của từng bộ báo cáo tài chính.
Dữ liệu BCĐKT có khoảng vài chục chỉ tiêu theo nhiều năm, hai bảng còn lại có quy mô tương tự — cho thấy đây là bộ dữ liệu theo chuỗi thời gian doanh nghiệp.
2. Xem qua 6 dòng đầu của từng bảng
Hàm head() hiển thị 6 dòng đầu để hiểu cách bố trí cột.
Giúp nhận diện biến nào là tên chỉ tiêu, biến nào là giá trị, và dữ liệu có theo chiều ngang hay dọc.
Cấu trúc dữ liệu ban đầu là dạng “rộng”, tức mỗi năm là một cột giá trị.
3. Xem qua tên biến
Hàm names() liệt kê tên các cột trong dataset.
Việc nhận biết tên biến giúp định hướng chuẩn hóa dữ liệu cho các bước sau (thống nhất tên năm, chỉ tiêu, giá trị…).
Tên biến gồm “Chỉ tiêu”, “2020”, “2021”, “2022”, “2023”… → dạng dữ liệu theo năm.
4. Kiểm tra kiểu dữ liệu của các biến
## tibble [85 × 11] (S3: tbl_df/tbl/data.frame)
## $ BẢNG CÂN ĐỐI KẾ TOÁN: chr [1:85] "A.TÀI SẢN" "B.NỢ PHẢI TRẢ VÀ VỐN CHỦ SỞ HỮU" "CÁC CHỈ TIÊU NGOÀI BẢNG" "I.Tiền mặt, vàng bạc, đá quý" ...
## $ 2015 : chr [1:85] NA NA NA "5,090,768,000,000" ...
## $ 2016 : chr [1:85] NA NA NA "5,187,131,000,000" ...
## $ 2017 : chr [1:85] NA NA NA "5,979,830,000,000" ...
## $ 2018 : chr [1:85] NA NA NA "7,028,347,000,000" ...
## $ 2019 : chr [1:85] NA NA NA "8,282,726,000,000" ...
## $ 2020 : chr [1:85] NA NA NA "9,930,181,000,000" ...
## $ 2021 : chr [1:85] NA NA NA "11,330,659,000,000" ...
## $ 2022 : chr [1:85] NA NA NA "11,066,956,000,000" ...
## $ 2023 : chr [1:85] NA NA NA "9,759,580,000,000" ...
## $ 2024 : chr [1:85] NA NA NA "11,147,549,000,000" ...
str() hiển thị kiểu dữ liệu (character, numeric, date, v.v.).
Giúp biết cột “Chỉ tiêu” là ký tự (character) và các cột năm là số (numeric).
Hầu hết giá trị số đã được nhận diện đúng, đảm bảo có thể xử lý tiếp.
5. Kiểm tra giá trị thiếu (NA)
## BẢNG CÂN ĐỐI KẾ TOÁN 2015 2016
## 0 32 27
## 2017 2018 2019
## 32 32 33
## 2020 2021 2022
## 33 31 31
## 2023 2024
## 23 29
Dùng is.na() kết hợp colSums() để đếm số lượng giá trị thiếu theo cột.
Xác định các biến có thiếu dữ liệu để xử lý sau.
Một số chỉ tiêu có thiếu giá trị ở các năm gần nhất, phản ánh việc báo cáo chưa hoàn thiện hoặc thay đổi chuẩn kế toán.
6. Kiểm tra tính trùng lặp chỉ tiêu
## [1] 0
Dùng duplicated() để xác định các chỉ tiêu xuất hiện nhiều lần.
Tránh tình trạng trùng tên chỉ tiêu khiến thống kê bị sai.
Không có bản ghi trùng, dữ liệu hợp lệ.
7. Kiểm tra tổng quát giá trị âm
## [1] 9
So sánh toàn bảng với 0 để đếm số giá trị âm.
Một số chỉ tiêu có thể mang giá trị âm (ví dụ Lợi nhuận sau thuế âm → lỗ).
Xuất hiện 9 giá trị âm hợp lý ở các năm suy giảm lợi nhuận.
8. Xem phân bố năm trong dữ liệu
## [1] "2015" "2016" "2017" "2018" "2019" "2020" "2021" "2022" "2023" "2024"
Liệt kê tất cả tên cột trừ cột đầu (“Chỉ tiêu”) để xem danh sách năm.
Xác định khoảng thời gian chuỗi số liệu (ví dụ 2018–2023).
Dữ liệu có tính chuỗi thời gian, đủ dài cho mô hình phân tích tài chính doanh nghiệp.
9. Kiểm tra giá trị lớn nhất và nhỏ nhất theo năm
## 2015 2016 2017
## [1,] "-1,844,708,000,000" "-1,307,000,000" "-1,270,252,000,000"
## [2,] "99,169,216,000,000" "948,699,076,000,000" "9,165,251,000,000"
## 2018 2019 2020
## [1,] "-1,503,144,000,000" "-1,727,733,000,000" "-1,985,624,000,000"
## [2,] "907,000,000" "97,131,629,000,000" "990,331,285,000,000"
## 2021 2022 2023
## [1,] "-125,753,000,000" "-10,143,350,000,000" "-10,508,202,000,000"
## [2,] "93,649,511,000,000" "91,370,419,000,000" "9,759,580,000,000"
## 2024
## [1,] "-106,441,000,000"
## [2,] "970,729,000,000"
sapply() áp dụng hàm range() trên từng cột năm.
Giúp hiểu quy mô tài sản, vốn, doanh thu theo từng năm.
Tài sản tăng dần qua các năm, thể hiện xu hướng mở rộng quy mô.
10. Xem 5 chỉ tiêu có giá trị lớn nhất năm gần nhất
arrange(desc()) để sắp xếp giảm dần và lấy 5 dòng đầu.
Xác định nhóm chỉ tiêu chiếm tỷ trọng cao nhất trong tổng tài sản.
Tổng tài sản, Vốn chủ sở hữu và Cho vay khách hàng đứng đầu bảng.
11. Mô tả thống kê cơ bản của Báo cáo KQKD
## 2015 2016 2017 2018
## Length:26 Length:26 Length:26 Length:26
## Class :character Class :character Class :character Class :character
## Mode :character Mode :character Mode :character Mode :character
## 2019 2020 2021 2022
## Length:26 Length:26 Length:26 Length:26
## Class :character Class :character Class :character Class :character
## Mode :character Mode :character Mode :character Mode :character
## 2023 2024
## Length:26 Length:26
## Class :character Class :character
## Mode :character Mode :character
summary() cung cấp min, max, median, mean,… cho từng biến.
Giúp nhận biết độ lệch, trung bình và biên độ biến động của doanh thu và lợi nhuận.
Doanh thu thuần tăng đều, trong khi lợi nhuận biến động theo chu kỳ thị trường.
12. Kiểm tra cấu trúc bảng LCTT
## tibble [50 × 8] (S3: tbl_df/tbl/data.frame)
## $ Bảng Lưu Chuyển Tiền Tệ: chr [1:50] "Lưu chuyển tiền từ hoạt động kinh doanh" "Những thay đổi về tài sản hoạt động" "Những thay đổi về công nợ hoạt động" "Lưu chuyển tiền từ hoạt động đầu tư" ...
## $ 2015 : chr [1:50] NA NA NA NA ...
## $ 2016 : chr [1:50] NA NA NA NA ...
## $ 2017 : chr [1:50] NA NA NA NA ...
## $ 2018 : chr [1:50] NA NA NA NA ...
## $ 2019 : chr [1:50] NA NA NA NA ...
## $ 2020 : chr [1:50] NA NA NA NA ...
## $ 2021 : chr [1:50] NA NA NA NA ...
str() giúp xem kiểu dữ liệu và độ dài từng biến trong bảng lưu chuyển tiền tệ.
Dữ liệu đúng định dạng numeric sẽ thuận lợi cho việc tính dòng tiền thuần.
Dữ liệu hợp lệ, đủ thông tin cho phân tích dòng tiền ở chương sau.
13. Đếm số lượng chỉ tiêu (dòng dữ liệu) trong từng bảng báo cáo
## [1] 85
## [1] 26
## [1] 50
Dùng hàm nrow() để đếm số dòng (mỗi dòng tương ứng với một chỉ tiêu trong báo cáo).
Số dòng cho biết mức độ chi tiết của từng báo cáo — báo cáo có nhiều chỉ tiêu hơn thường thể hiện thông tin tài chính chi tiết hơn.
ctg_bcđkt có 85 dòng → bảng cân đối kế toán được trình bày chi tiết.
ctg_kqkd ngắn hơn (26) dòng).
ctg_lctt có 50 dòng.
Sau khi thu thập 3 báo cáo tài chính của mã cổ phiếu CTG (Báo cáo Cân đối kế toán – BCĐKT, Báo cáo Kết quả kinh doanh – KQKD và Báo cáo Lưu chuyển tiền tệ – LCTT), bước tiếp theo là làm sạch, chuẩn hóa và mã hóa dữ liệu để phục vụ cho phân tích ở các chương sau.
1. Kiểm tra định dạng dữ liệu đầu vào
## tibble [85 × 11] (S3: tbl_df/tbl/data.frame)
## $ BẢNG CÂN ĐỐI KẾ TOÁN: chr [1:85] "A.TÀI SẢN" "B.NỢ PHẢI TRẢ VÀ VỐN CHỦ SỞ HỮU" "CÁC CHỈ TIÊU NGOÀI BẢNG" "I.Tiền mặt, vàng bạc, đá quý" ...
## $ 2015 : chr [1:85] NA NA NA "5,090,768,000,000" ...
## $ 2016 : chr [1:85] NA NA NA "5,187,131,000,000" ...
## $ 2017 : chr [1:85] NA NA NA "5,979,830,000,000" ...
## $ 2018 : chr [1:85] NA NA NA "7,028,347,000,000" ...
## $ 2019 : chr [1:85] NA NA NA "8,282,726,000,000" ...
## $ 2020 : chr [1:85] NA NA NA "9,930,181,000,000" ...
## $ 2021 : chr [1:85] NA NA NA "11,330,659,000,000" ...
## $ 2022 : chr [1:85] NA NA NA "11,066,956,000,000" ...
## $ 2023 : chr [1:85] NA NA NA "9,759,580,000,000" ...
## $ 2024 : chr [1:85] NA NA NA "11,147,549,000,000" ...
## tibble [26 × 11] (S3: tbl_df/tbl/data.frame)
## $ BÁO CÁO KẾT QUẢ KINH DOANH: chr [1:26] "Thu nhập lãi và các khoản thu nhập tương tự" "Thu nhập từ hoạt động khác" "Chi phí hoạt động khác" "VI. Lãi/lỗ thuần từ hoạt động khác" ...
## $ 2015 : chr [1:26] "42,471,731,000,000" "4,108,124,000,000" "1,905,838,000,000" "2,202,286,000,000" ...
## $ 2016 : chr [1:26] "52,990,698,000,000" "2,595,010,000,000" "1,290,509,000,000" "1,304,501,000,000" ...
## $ 2017 : chr [1:26] "65,277,199,000,000" "3,233,912,000,000" "1,240,047,000,000" "1,993,865,000,000" ...
## $ 2018 : chr [1:26] "74,176,120,000,000" "2,903,224,000,000" "1,024,814,000,000" "1,878,410,000,000" ...
## $ 2019 : chr [1:26] "82,742,771,000,000" "2,357,430,000,000" "859,995,000,000" "1,497,435,000,000" ...
## $ 2020 : chr [1:26] "83,677,717,000,000" "2,694,931,000,000" "785,226,000,000" "1,909,705,000,000" ...
## $ 2021 : chr [1:26] "84,628,302,000,000" "4,516,269,000,000" "1,118,203,000,000" "3,398,066,000,000" ...
## $ 2022 : chr [1:26] "104,664,634,000,000" "7,506,525,000,000" "969,157,000,000" "6,537,368,000,000" ...
## $ 2023 : chr [1:26] "132,671,737,000,000" "7,080,218,000,000" "1,277,142,000,000" "5,803,076,000,000" ...
## $ 2024 : chr [1:26] "124,460,685,000,000" "10,687,733,000,000" "2,268,947,000,000" "8,418,786,000,000" ...
## tibble [50 × 8] (S3: tbl_df/tbl/data.frame)
## $ Bảng Lưu Chuyển Tiền Tệ: chr [1:50] "Lưu chuyển tiền từ hoạt động kinh doanh" "Những thay đổi về tài sản hoạt động" "Những thay đổi về công nợ hoạt động" "Lưu chuyển tiền từ hoạt động đầu tư" ...
## $ 2015 : chr [1:50] NA NA NA NA ...
## $ 2016 : chr [1:50] NA NA NA NA ...
## $ 2017 : chr [1:50] NA NA NA NA ...
## $ 2018 : chr [1:50] NA NA NA NA ...
## $ 2019 : chr [1:50] NA NA NA NA ...
## $ 2020 : chr [1:50] NA NA NA NA ...
## $ 2021 : chr [1:50] NA NA NA NA ...
Giúp xác định kiểu dữ liệu (numeric, character, factor) và cấu trúc khung dữ liệu để chọn phương pháp xử lý phù hợp.
2. Chuẩn hóa tên cột dữ liệu
Hàm clean_names() giúp chuẩn hóa tiêu đề cột về dạng chữ thường, có gạch dưới (_), tránh lỗi khi gọi biến trong R.
3. Kiểm tra giá trị thiếu (NA)
## bang_can_doi_ke_toan x2015 x2016
## 0 32 27
## x2017 x2018 x2019
## 32 32 33
## x2020 x2021 x2022
## 33 31 31
## x2023 x2024
## 23 29
## bao_cao_ket_qua_kinh_doanh x2015
## 0 6
## x2016 x2017
## 4 4
## x2018 x2019
## 4 4
## x2020 x2021
## 4 4
## x2022 x2023
## 4 1
## x2024
## 1
## bang_luu_chuyen_tien_te x2015 x2016
## 0 14 15
## x2017 x2018 x2019
## 15 19 15
## x2020 x2021
## 17 17
Xác định xem dữ liệu có bị thiếu (NA) ở cột nào để quyết định có cần xử lý hoặc thay thế.
4. Thay thế giá trị thiếu bằng 0
Trong báo cáo tài chính, các ô trống thường đại diện cho giá trị bằng 0 → xử lý này đảm bảo tính toàn vẹn số liệu.
5. Chuẩn hóa định dạng cột năm và mã hóa thành factor
Giúp nhóm, so sánh và trực quan hóa dễ dàng theo từng năm tài chính.
6. Loại bỏ khoảng trắng và ký tự thừa trong tên chỉ tiêu
Đảm bảo các chỉ tiêu tài chính được nhận diện chính xác, tránh trùng lặp do lỗi định dạng.
7. Chuyển đổi giá trị về dạng numeric
Một số cột giá trị có thể được lưu dưới dạng text → chuyển sang numeric giúp tính toán và phân tích được.
8. Chuẩn hóa đơn vị tính (triệu đồng)
Đưa toàn bộ số liệu về cùng một đơn vị (triệu đồng) giúp dễ đọc và so sánh.
9. Loại bỏ dòng trống hoặc chỉ tiêu không có giá trị
Giữ lại các chỉ tiêu có số liệu thực tế, loại bỏ dòng mô tả hoặc mục rỗng.
10. Mã hóa nhóm chỉ tiêu theo cấu trúc báo cáo
Mã hóa nhóm chỉ tiêu giúp dễ dàng lọc, tổng hợp và trực quan hóa từng phần trong báo cáo.
11. Chuẩn hóa dữ liệu theo từng năm
Sắp xếp thứ tự theo năm giúp thuận tiện khi biểu diễn chuỗi thời gian tài chính.
12. Kiểm tra bộ dữ liệu sau khi xử lý
## --- Cấu trúc Bảng cân đối kế toán (ctg_bcđkt) ---
## tibble [67 × 14] (S3: tbl_df/tbl/data.frame)
## $ bang_can_doi_ke_toan: num [1:67] NA NA NA 1 2 3 NA 1 2 NA ...
## ..- attr(*, "problems")= tibble [44 × 4] (S3: tbl_df/tbl/data.frame)
## .. ..$ row : int [1:44] 1 2 3 4 5 6 10 13 14 17 ...
## .. ..$ col : int [1:44] NA NA NA NA NA NA NA NA NA NA ...
## .. ..$ expected: chr [1:44] "a number" "a number" "a number" "a number" ...
## .. ..$ actual : chr [1:44] "A.TÀI SẢN" "B.NỢ PHẢI TRẢ VÀ VỐN CHỦ SỞ HỮU" "CÁC CHỈ TIÊU NGOÀI BẢNG" "I.Tiền mặt, vàng bạc, đá quý" ...
## $ x2015 : num [1:67] 5090768 11892969 66018789 64385375 1633414 ...
## $ x2016 : num [1:67] 5187131 13502594 94469281 91031828 3437453 ...
## $ x2017 : num [1:67] 5.98e+06 2.08e+07 1.08e+08 1.02e+08 5.57e+06 ...
## $ x2018 : num [1:67] 7.03e+06 2.32e+07 1.31e+08 1.26e+08 4.24e+06 ...
## $ x2019 : num [1:67] 8.28e+06 2.49e+07 1.29e+08 1.23e+08 6.30e+06 ...
## $ x2020 : num [1:67] 9.93e+06 5.76e+07 1.03e+08 9.26e+07 9.90e+06 ...
## $ x2021 : num [1:67] 1.13e+07 2.34e+07 1.49e+08 1.30e+08 1.95e+07 ...
## $ x2022 : num [1:67] 1.11e+07 2.97e+07 2.42e+08 2.22e+08 2.00e+07 ...
## $ x2023 : num [1:67] 9.76e+06 4.06e+07 2.80e+08 2.59e+08 2.06e+07 ...
## $ x2024 : num [1:67] 1.11e+07 3.44e+07 3.78e+08 3.71e+08 7.95e+06 ...
## $ nam : logi [1:67] NA NA NA NA NA NA ...
## $ chitieu : num [1:67] NA NA NA NA NA NA NA NA NA NA ...
## $ nhom : chr [1:67] "Khac" "Khac" "Khac" "Khac" ...
##
## --- 5 Dòng đầu Bảng cân đối kế toán (ctg_bcđkt) ---
##
## --- Cấu trúc Kết quả kinh doanh (ctg_kqkd) ---
## tibble [25 × 14] (S3: tbl_df/tbl/data.frame)
## $ bao_cao_ket_qua_kinh_doanh: num [1:25] NA NA NA NA NA NA NA NA NA 7 ...
## ..- attr(*, "problems")= tibble [21 × 4] (S3: tbl_df/tbl/data.frame)
## .. ..$ row : int [1:21] 1 2 3 4 5 6 7 8 9 13 ...
## .. ..$ col : int [1:21] NA NA NA NA NA NA NA NA NA NA ...
## .. ..$ expected: chr [1:21] "a number" "a number" "a number" "a number" ...
## .. ..$ actual : chr [1:21] "Thu nhập lãi và các khoản thu nhập tương tự" "Thu nhập từ hoạt động khác" "Chi phí hoạt động khác" "VI. Lãi/lỗ thuần từ hoạt động khác" ...
## $ x2015 : num [1:25] 42471731 4108124 1905838 2202286 40960 ...
## $ x2016 : num [1:25] 52990698 2595010 1290509 1304501 146759 ...
## $ x2017 : num [1:25] 65277199 3233912 1240047 1993865 743046 ...
## $ x2018 : num [1:25] 74176120 2903224 1024814 1878410 374238 ...
## $ x2019 : num [1:25] 82742771 2357430 859995 1497435 628400 ...
## $ x2020 : num [1:25] 83677717 2694931 785226 1909705 524038 ...
## $ x2021 : num [1:25] 84628302 4516269 1118203 3398066 477382 ...
## $ x2022 : num [1:25] 1.05e+08 7.51e+06 9.69e+05 6.54e+06 5.12e+05 ...
## $ x2023 : num [1:25] 1.33e+08 7.08e+06 1.28e+06 5.80e+06 2.87e+05 ...
## $ x2024 : num [1:25] 1.24e+08 1.07e+07 2.27e+06 8.42e+06 3.91e+05 ...
## $ nam : logi [1:25] NA NA NA NA NA NA ...
## $ chitieu : num [1:25] NA NA NA NA NA NA NA NA NA NA ...
## $ nhom : chr [1:25] "Ket qua" "Ket qua" "Ket qua" "Ket qua" ...
##
## --- 5 Dòng đầu Kết quả kinh doanh (ctg_kqkd) ---
##
## --- Cấu trúc Lưu chuyển tiền tệ (ctg_lctt) ---
## tibble [38 × 11] (S3: tbl_df/tbl/data.frame)
## $ bang_luu_chuyen_tien_te: num [1:38] 1 9 10 11 12 13 14 15 16 17 ...
## ..- attr(*, "problems")= tibble [13 × 4] (S3: tbl_df/tbl/data.frame)
## .. ..$ row : int [1:13] 1 2 3 4 5 22 33 41 42 43 ...
## .. ..$ col : int [1:13] NA NA NA NA NA NA NA NA NA NA ...
## .. ..$ expected: chr [1:13] "a number" "a number" "a number" "a number" ...
## .. ..$ actual : chr [1:13] "Lưu chuyển tiền từ hoạt động kinh doanh" "Những thay đổi về tài sản hoạt động" "Những thay đổi về công nợ hoạt động" "Lưu chuyển tiền từ hoạt động đầu tư" ...
## $ x2015 : num [1:38] 4.25e+07 6.76e+06 -2.71e+07 NA -1.05e+08 ...
## $ x2016 : num [1:38] 5.16e+07 -2.22e+06 -9.73e+06 -6.83e+05 -1.24e+08 ...
## $ x2017 : num [1:38] 6.49e+07 -1.92e+06 3.50e+06 1.54e+05 -1.21e+08 ...
## $ x2018 : num [1:38] 81997808 1061676 22721999 247596 -71531023 ...
## $ x2019 : num [1:38] 82973160 -2320366 -8477370 -188546 -61586214 ...
## $ x2020 : num [1:38] 82205508 -2406359 -11750383 332590 -80062325 ...
## $ x2021 : num [1:38] 8.29e+07 -9.75e+06 -5.92e+07 -1.32e+06 -1.15e+08 ...
## $ nam : logi [1:38] NA NA NA NA NA NA ...
## $ chitieu : num [1:38] NA NA NA NA NA NA NA NA NA NA ...
## $ nhom : chr [1:38] "Khac" "Khac" "Khac" "Khac" ...
##
## --- 5 Dòng đầu Lưu chuyển tiền tệ (ctg_lctt) ---
Việc chạy str() và head() lần cuối
giúp:
Xác nhận rằng các cột số liệu đã được chuyển sang dạng
numeric và các cột
nam/nhom đã được chuyển thành dạng
factor một cách chính xác.
Đảm bảo không còn giá trị NA nào
trong các cột số liệu (nhờ bước thay thế NA bằng 0).
Kiểm tra xem các cột chitieu và
nhom đã được tạo và điền đúng giá trị hay
chưa.
1. Tổng quan dữ liệu
## bang_can_doi_ke_toan x2015 x2016
## Min. :1.000 Min. : -5371361 Min. : -6862066
## 1st Qu.:1.000 1st Qu.: 1633414 1st Qu.: 1914685
## Median :2.000 Median : 8665767 Median : 7843816
## Mean :2.371 Mean : 90068050 Mean :101871177
## 3rd Qu.:3.000 3rd Qu.: 54237247 3rd Qu.: 45722057
## Max. :5.000 Max. :779483487 Max. :948699076
## NA's :32 NA's :14 NA's :9
## x2017 x2018 x2019
## Min. : -8303019 Min. : -13008383 Min. : -12945694
## 1st Qu.: 2704255 1st Qu.: 599602 1st Qu.: 3216546
## Median : 8974710 Median : 8974698 Median : 10303518
## Mean : 126236363 Mean : 133711413 Mean : 145193679
## 3rd Qu.: 63685400 3rd Qu.: 62600159 3rd Qu.: 72290874
## Max. :1095022339 Max. :1164434735 Max. :1240711475
## NA's :14 NA's :14 NA's :15
## x2020 x2021 x2022
## Min. : -12561402 Min. : -25795102 Min. : -29763833
## 1st Qu.: 2155087 1st Qu.: 1709920 1st Qu.: 1460379
## Median : 9917427 Median : 10913406 Median : 11733126
## Mean : 156285448 Mean : 172603837 Mean : 204610864
## 3rd Qu.: 66259490 3rd Qu.: 60386965 3rd Qu.: 101427081
## Max. :1341436468 Max. :1531587398 Max. :1808429764
## NA's :15 NA's :13 NA's :13
## x2023 x2024 nam chitieu
## Min. : -27772921 Min. : -36664125 Mode:logical Min. : NA
## 1st Qu.: 2300310 1st Qu.: 2617552 NA's:67 1st Qu.: NA
## Median : 19827598 Median : 15283100 Median : NA
## Mean : 210422219 Mean : 261827977 Mean :NaN
## 3rd Qu.: 93827508 3rd Qu.: 149298054 3rd Qu.: NA
## Max. :2032613606 Max. :2385387732 Max. : NA
## NA's :5 NA's :11 NA's :67
## nhom
## Length:67
## Class :character
## Mode :character
##
##
##
##
## bao_cao_ket_qua_kinh_doanh x2015 x2016
## Min. :2.0 Min. : 18957 Min. : -289
## 1st Qu.:3.0 1st Qu.: 925515 1st Qu.: 309224
## Median :4.0 Median : 2426574 Median : 1696004
## Mean :4.8 Mean : 7041843 Mean : 7612139
## 3rd Qu.:7.0 3rd Qu.: 8188945 3rd Qu.: 8103870
## Max. :8.0 Max. :42471731 Max. :52990698
## NA's :20 NA's :5 NA's :3
## x2017 x2018 x2019 x2020
## Min. : -125718 Min. : 0 Min. : -790728 Min. : 0
## 1st Qu.: 718236 1st Qu.: 458146 1st Qu.: 686299 1st Qu.: 647263
## Median : 2220504 Median : 2835376 Median : 3095091 Median : 3658324
## Mean : 9396598 Mean : 9890633 Mean :12038401 Mean :12937014
## 3rd Qu.: 8990513 3rd Qu.: 7496055 3rd Qu.:12697896 3rd Qu.:15503320
## Max. :65277199 Max. :74176120 Max. :82742771 Max. :83677717
## NA's :3 NA's :3 NA's :3 NA's :3
## x2021 x2022 x2023 x2024
## Min. : -38346 Min. : -112163 Min. : -154121 Min. : -288044
## 1st Qu.: 651449 1st Qu.: 626472 1st Qu.: 1277142 1st Qu.: 2268947
## Median : 4564220 Median : 6199658 Median : 7080218 Median : 8418786
## Mean :13967602 Mean : 17345354 Mean : 22005100 Mean : 23434461
## 3rd Qu.:17488330 3rd Qu.: 20461408 3rd Qu.: 24989525 3rd Qu.: 27598829
## Max. :84628302 Max. :104664634 Max. :132671737 Max. :124460685
## NA's :3 NA's :3
## nam chitieu nhom
## Mode:logical Min. : NA Length:25
## NA's:25 1st Qu.: NA Class :character
## Median : NA Mode :character
## Mean :NaN
## 3rd Qu.: NA
## Max. : NA
## NA's :25
## bang_luu_chuyen_tien_te x2015 x2016
## Min. : 1.00 Min. :-105121197 Min. :-123541758
## 1st Qu.: 4.00 1st Qu.: -2298822 1st Qu.: -1860422
## Median : 8.50 Median : 19678 Median : -8573
## Mean : 9.60 Mean : 4490491 Mean : 8894493
## 3rd Qu.:14.75 3rd Qu.: 5181968 3rd Qu.: 2924150
## Max. :22.00 Max. : 87064648 Max. : 162100084
## NA's :8 NA's :2 NA's :3
## x2017 x2018 x2019
## Min. :-121036561 Min. :-78750497 Min. :-61586214
## 1st Qu.: -1789040 1st Qu.: -1289742 1st Qu.: -1731615
## Median : 153928 Median : 247596 Median : -26124
## Mean : 9119522 Mean : 12345704 Mean : 5174979
## 3rd Qu.: 6948850 3rd Qu.: 23751488 3rd Qu.: 962418
## Max. : 131675894 Max. :155544719 Max. :155046744
## NA's :3 NA's :7 NA's :3
## x2020 x2021 nam chitieu
## Min. :-80062325 Min. :-115334497 Mode:logical Min. : NA
## 1st Qu.: -2406359 1st Qu.: -4000535 NA's:38 1st Qu.: NA
## Median : 23990 Median : -21267 Median : NA
## Mean : 6074558 Mean : 11176664 Mean :NaN
## 3rd Qu.: 4717441 3rd Qu.: 4732099 3rd Qu.: NA
## Max. :160166076 Max. : 171516828 Max. : NA
## NA's :5 NA's :5 NA's :38
## nhom
## Length:38
## Class :character
## Mode :character
##
##
##
##
Dùng summary() để thống kê nhanh giá trị nhỏ nhất, trung vị, trung bình, lớn nhất cho từng cột numeric.
Giúp nắm sơ bộ phân bố dữ liệu tài chính từng báo cáo.
Hiển thị bảng tóm tắt cho mỗi biến trong 3 bộ dữ liệu.
2. Kích thước bộ dữ liệu
## [1] 67 14
## [1] 25 14
## [1] 38 11
dim() trả số hàng và số cột.
Kiểm tra quy mô từng bảng (bao nhiêu chỉ tiêu × bao nhiêu năm).
Bảng cân đối kế toán có 67 hàng và 14 cột, bảng kết quả kinh doanh có 25 hàng 14 cột, bảng lưu chuyển tiền tệ có 38 hàng và 11 cột.
3. Danh sách cột numeric
## bang_can_doi_ke_toan x2015 x2016
## TRUE TRUE TRUE
## x2017 x2018 x2019
## TRUE TRUE TRUE
## x2020 x2021 x2022
## TRUE TRUE TRUE
## x2023 x2024 nam
## TRUE TRUE FALSE
## chitieu nhom
## TRUE FALSE
## bao_cao_ket_qua_kinh_doanh x2015
## TRUE TRUE
## x2016 x2017
## TRUE TRUE
## x2018 x2019
## TRUE TRUE
## x2020 x2021
## TRUE TRUE
## x2022 x2023
## TRUE TRUE
## x2024 nam
## TRUE FALSE
## chitieu nhom
## TRUE FALSE
## bang_luu_chuyen_tien_te x2015 x2016
## TRUE TRUE TRUE
## x2017 x2018 x2019
## TRUE TRUE TRUE
## x2020 x2021 nam
## TRUE TRUE FALSE
## chitieu nhom
## TRUE FALSE
sapply(…, is.numeric) xác định cột dạng số.
Đảm bảo các cột giá trị đã được chuyển đúng dạng numeric sau tiền xử lý.Liệt kê cột TRUE/FALSE thể hiện numeric hay không.
4. Trung bình từng biến
summarise(across(…, mean)) tính trung bình theo cột.
Trung bình biểu thị giá trị đại diện cho mỗi chỉ tiêu tài chính. Một hàng mean cho tất cả biến numeric trong từng bảng.
5. Trung vị (median)
Dùng median() để tính trung vị cho từng cột số.
Trung vị ít bị ảnh hưởng bởi ngoại lệ, đo “giá trị giữa”. Một hàng median cho từng bảng.
6. Độ lệch chuẩn (SD)
sd() đo độ phân tán dữ liệu.
SD cao → biến động lớn giữa các năm hoặc chỉ tiêu. Kết quả: Một hàng SD cho từng báo cáo.
7. Phương sai (Variance)
var() trả phương sai = SD².
Cho biết mức độ biến thiên của dữ liệu. Kết quả: Một hàng phương sai cho mỗi dataset.
8. Giá trị nhỏ nhất và lớn nhất
Kết hợp list(min, max) để lấy biên dưới & trên.
Giúp phát hiện giá trị cực trị, ngoại lệ. Ta có được bảng min/max của các biến numeric.
9. Khoảng giá trị (Range)
## # A tibble: 1 × 12
## bang_can_doi_ke_toan x2015 x2016 x2017 x2018 x2019 x2020 x2021 x2022
## <dbl> <dbl> <dbl> <dbl> <dbl> <dbl> <dbl> <dbl> <dbl>
## 1 4 7.85e8 9.56e8 1.10e9 1.18e9 1.25e9 1.35e9 1.56e9 1.84e9
## # ℹ 3 more variables: x2023 <dbl>, x2024 <dbl>, chitieu <dbl>
## # A tibble: 1 × 12
## bao_cao_ket_qua_kinh…¹ x2015 x2016 x2017 x2018 x2019 x2020 x2021 x2022
## <dbl> <dbl> <dbl> <dbl> <dbl> <dbl> <dbl> <dbl> <dbl>
## 1 6 4.25e7 5.30e7 6.54e7 7.42e7 8.35e7 8.37e7 8.47e7 1.05e8
## # ℹ abbreviated name: ¹bao_cao_ket_qua_kinh_doanh
## # ℹ 3 more variables: x2023 <dbl>, x2024 <dbl>, chitieu <dbl>
## # A tibble: 1 × 9
## bang_luu_chuyen_tien_te x2015 x2016 x2017 x2018 x2019 x2020 x2021
## <dbl> <dbl> <dbl> <dbl> <dbl> <dbl> <dbl> <dbl>
## 1 21 192185845 285641842 2.53e8 2.34e8 2.17e8 2.40e8 2.87e8
## # ℹ 1 more variable: chitieu <dbl>
đưa na.rm = TRUE vào từng max() và min() trong lambda ~ …
Ta có được bảng kết quả mỗi object ranges_* là một hàng chứa range (max - min) cho từng cột numeric trong từng bảng.
10. Phân vị (Quantiles)
quantile() tính phân vị cho từng cột.
Cho thấy phân bố dữ liệu qua các mức phần tư (Q1–Q3). Ta có được bảng gồm 5 hàng (0%,25%,50%,75%,100%) mỗi biến.
11. IQR (Interquartile Range)
IQR() = Q3 - Q1 dùng để đo độ phân tán của vùng trung tâm, bền với outliers. Kết quả cho ra được là ta có 1 hàng IQR cho từng bảng
12. Hệ số biến thiên (CV)
CV = SD / Mean. Có ý nghĩa so sánh mức độ biến động tương đối giữa các biến. Kết quả cho ra CV từng chỉ tiêu, không có đơn vị đo.
13. Skewness (Độ lệch phân phối)
Dùng moments::skewness(). Với ý nghĩa nếu Skew > 0 → nghiêng phải; Skew < 0 → nghiêng trái. Kết quả cho ra hệ số skewness cho từng chỉ tiêu.
14. Kurtosis (Độ nhọn phân phối)
Dùng moments::kurtosis(). Với ý nghĩa nếu Kurtosis cao → đuôi dài, nhiều ngoại lệ. Kết quả cho ra Giá trị kurtosis của từng biến.
15. Số lượng giá trị khác 0
Đếm số phần tử khác 0. Xác định tỷ lệ chỉ tiêu có giá trị thực thay vì rỗng.
16. Tỷ lệ giá trị bằng 0
Trung bình điều kiện .x == 0. Với ý nghĩa Tỷ lệ 0 cao → chỉ tiêu ít hoạt động hoặc lỗi nhập liệu.
17. Kiểm tra NA
## bang_can_doi_ke_toan x2015 x2016
## 32 14 9
## x2017 x2018 x2019
## 14 14 15
## x2020 x2021 x2022
## 15 13 13
## x2023 x2024 nam
## 5 11 67
## chitieu nhom
## 67 0
## bao_cao_ket_qua_kinh_doanh x2015
## 20 5
## x2016 x2017
## 3 3
## x2018 x2019
## 3 3
## x2020 x2021
## 3 3
## x2022 x2023
## 3 0
## x2024 nam
## 0 25
## chitieu nhom
## 25 0
## bang_luu_chuyen_tien_te x2015 x2016
## 8 2 3
## x2017 x2018 x2019
## 3 7 3
## x2020 x2021 nam
## 5 5 38
## chitieu nhom
## 38 0
colSums(is.na()) đếm NA từng cột. Đảm bảo toàn bộ NA đã được thay thế bằng 0 ở bước trước. Các cột đều hiển thị 0 nếu sạch.
18. Ma trận tương quan
## bang_can_doi_ke_toan x2015 x2016 x2017 x2018 x2019 x2020
## bang_can_doi_ke_toan 1 NA NA NA NA NA NA
## x2015 NA 1 NA NA NA NA NA
## x2016 NA NA 1 NA NA NA NA
## x2017 NA NA NA 1 NA NA NA
## x2018 NA NA NA NA 1 NA NA
## x2019 NA NA NA NA NA 1 NA
## x2020 NA NA NA NA NA NA 1
## x2021 NA NA NA NA NA NA NA
## x2022 NA NA NA NA NA NA NA
## x2023 NA NA NA NA NA NA NA
## x2024 NA NA NA NA NA NA NA
## chitieu NA NA NA NA NA NA NA
## x2021 x2022 x2023 x2024 chitieu
## bang_can_doi_ke_toan NA NA NA NA NA
## x2015 NA NA NA NA NA
## x2016 NA NA NA NA NA
## x2017 NA NA NA NA NA
## x2018 NA NA NA NA NA
## x2019 NA NA NA NA NA
## x2020 NA NA NA NA NA
## x2021 1 NA NA NA NA
## x2022 NA 1 NA NA NA
## x2023 NA NA 1 NA NA
## x2024 NA NA NA 1 NA
## chitieu NA NA NA NA 1
## bao_cao_ket_qua_kinh_doanh x2015 x2016 x2017 x2018
## bao_cao_ket_qua_kinh_doanh 1 NA NA NA NA
## x2015 NA 1 NA NA NA
## x2016 NA NA 1 NA NA
## x2017 NA NA NA 1 NA
## x2018 NA NA NA NA 1
## x2019 NA NA NA NA NA
## x2020 NA NA NA NA NA
## x2021 NA NA NA NA NA
## x2022 NA NA NA NA NA
## x2023 NA NA NA NA NA
## x2024 NA NA NA NA NA
## chitieu NA NA NA NA NA
## x2019 x2020 x2021 x2022 x2023 x2024 chitieu
## bao_cao_ket_qua_kinh_doanh NA NA NA NA NA NA NA
## x2015 NA NA NA NA NA NA NA
## x2016 NA NA NA NA NA NA NA
## x2017 NA NA NA NA NA NA NA
## x2018 NA NA NA NA NA NA NA
## x2019 1 NA NA NA NA NA NA
## x2020 NA 1 NA NA NA NA NA
## x2021 NA NA 1 NA NA NA NA
## x2022 NA NA NA 1 NA NA NA
## x2023 NA NA NA NA 1.0000000 0.9844614 NA
## x2024 NA NA NA NA 0.9844614 1.0000000 NA
## chitieu NA NA NA NA NA NA 1
## bang_luu_chuyen_tien_te x2015 x2016 x2017 x2018 x2019
## bang_luu_chuyen_tien_te 1 NA NA NA NA NA
## x2015 NA 1 NA NA NA NA
## x2016 NA NA 1 NA NA NA
## x2017 NA NA NA 1 NA NA
## x2018 NA NA NA NA 1 NA
## x2019 NA NA NA NA NA 1
## x2020 NA NA NA NA NA NA
## x2021 NA NA NA NA NA NA
## chitieu NA NA NA NA NA NA
## x2020 x2021 chitieu
## bang_luu_chuyen_tien_te NA NA NA
## x2015 NA NA NA
## x2016 NA NA NA
## x2017 NA NA NA
## x2018 NA NA NA
## x2019 NA NA NA
## x2020 1 NA NA
## x2021 NA 1 NA
## chitieu NA NA 1
cor() tính Pearson correlation giữa các cột số.
Đánh giá mức độ đồng biến giữa các chỉ tiêu. Ma trận giá trị [-1,1] thể hiện mối tương quan.
19. Ma trận hiệp phương sai
## bang_can_doi_ke_toan x2015 x2016 x2017 x2018 x2019 x2020
## bang_can_doi_ke_toan NA NA NA NA NA NA NA
## x2015 NA NA NA NA NA NA NA
## x2016 NA NA NA NA NA NA NA
## x2017 NA NA NA NA NA NA NA
## x2018 NA NA NA NA NA NA NA
## x2019 NA NA NA NA NA NA NA
## x2020 NA NA NA NA NA NA NA
## x2021 NA NA NA NA NA NA NA
## x2022 NA NA NA NA NA NA NA
## x2023 NA NA NA NA NA NA NA
## x2024 NA NA NA NA NA NA NA
## chitieu NA NA NA NA NA NA NA
## x2021 x2022 x2023 x2024 chitieu
## bang_can_doi_ke_toan NA NA NA NA NA
## x2015 NA NA NA NA NA
## x2016 NA NA NA NA NA
## x2017 NA NA NA NA NA
## x2018 NA NA NA NA NA
## x2019 NA NA NA NA NA
## x2020 NA NA NA NA NA
## x2021 NA NA NA NA NA
## x2022 NA NA NA NA NA
## x2023 NA NA NA NA NA
## x2024 NA NA NA NA NA
## chitieu NA NA NA NA NA
## bao_cao_ket_qua_kinh_doanh x2015 x2016 x2017 x2018
## bao_cao_ket_qua_kinh_doanh NA NA NA NA NA
## x2015 NA NA NA NA NA
## x2016 NA NA NA NA NA
## x2017 NA NA NA NA NA
## x2018 NA NA NA NA NA
## x2019 NA NA NA NA NA
## x2020 NA NA NA NA NA
## x2021 NA NA NA NA NA
## x2022 NA NA NA NA NA
## x2023 NA NA NA NA NA
## x2024 NA NA NA NA NA
## chitieu NA NA NA NA NA
## x2019 x2020 x2021 x2022 x2023 x2024
## bao_cao_ket_qua_kinh_doanh NA NA NA NA NA NA
## x2015 NA NA NA NA NA NA
## x2016 NA NA NA NA NA NA
## x2017 NA NA NA NA NA NA
## x2018 NA NA NA NA NA NA
## x2019 NA NA NA NA NA NA
## x2020 NA NA NA NA NA NA
## x2021 NA NA NA NA NA NA
## x2022 NA NA NA NA NA NA
## x2023 NA NA NA NA 1.041585e+15 1.000999e+15
## x2024 NA NA NA NA 1.000999e+15 9.926023e+14
## chitieu NA NA NA NA NA NA
## chitieu
## bao_cao_ket_qua_kinh_doanh NA
## x2015 NA
## x2016 NA
## x2017 NA
## x2018 NA
## x2019 NA
## x2020 NA
## x2021 NA
## x2022 NA
## x2023 NA
## x2024 NA
## chitieu NA
## bang_luu_chuyen_tien_te x2015 x2016 x2017 x2018 x2019
## bang_luu_chuyen_tien_te NA NA NA NA NA NA
## x2015 NA NA NA NA NA NA
## x2016 NA NA NA NA NA NA
## x2017 NA NA NA NA NA NA
## x2018 NA NA NA NA NA NA
## x2019 NA NA NA NA NA NA
## x2020 NA NA NA NA NA NA
## x2021 NA NA NA NA NA NA
## chitieu NA NA NA NA NA NA
## x2020 x2021 chitieu
## bang_luu_chuyen_tien_te NA NA NA
## x2015 NA NA NA
## x2016 NA NA NA
## x2017 NA NA NA
## x2018 NA NA NA
## x2019 NA NA NA
## x2020 NA NA NA
## x2021 NA NA NA
## chitieu NA NA NA
cov() đo hiệp phương sai.
Phản ánh chiều và cường độ biến thiên đồng thời.
20. Tổng hợp theo năm
group_by(nam) + summarise(sum). Với ý nghĩa cho ra được tổng giá trị tài chính theo từng năm.
Bảng tổng hợp giá trị theo năm tài chính.
21. Hệ số biến thiên theo năm (Coefficient of Variation by Year)
Tính sd/mean cho từng năm — chuẩn hóa biến động của từng chỉ tiêu theo năm.
Ý nghĩa: CV theo năm giúp phát hiện năm có biến động tài chính mạnh hay ổn định.
22. Mức tăng trưởng trung bình năm (CAGR) cho từng biến
Hàm calc_cagr(). CAGR đo tốc độ tăng trưởng bình quân hằng năm của từng chỉ tiêu — rất hữu ích trong báo cáo tài chính. Kết quả cho được một hàng chứa % tăng trưởng trung bình cho từng chỉ tiêu qua giai đoạn.
23. Hệ số biến thiên theo nhóm chỉ tiêu (nhom)
Tính CV trong từng nhóm “Tài sản”, “Nguồn vốn”, “Doanh thu”, “Chi phí”,…
Với mục đích giúp phát hiện nhóm nào biến động mạnh nhất — ví dụ, nhóm “Chi phí” có CV cao → rủi ro cao.
Kết quả cho ra bảng thể hiện độ ổn định (CV thấp = ổn định) của từng nhóm chỉ tiêu.
Đồ thị 1 - Heatmap tương quan giữa các chỉ tiêu