CHƯƠNG 1: TRÌNH BÀY VỀ BỘ DỮ LIỆU THỨ NHẤT

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

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ệutạo bảng tóm tắt, nhóm sử dụng cú pháp sau:

  • Lệnh install.packages() được dùng để cài đặt các package cần thiết.
  • Lệnh 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òng31 cột, thể hiện quy mô đủ lớn cho các phân tích thống kê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ị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 meanmedian cho biết độ lệch của phân bố (skewness); trong khi sdIQR 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()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.

Xử lý dữ liệu thô và mã hóa dữ liệu

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.

Thực hiện các thống kê cơ bả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%.

Trực quan hóa dữ liệu

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.

TRÌNH BÀY VỀ DỮ LIỆU CỦA MÃ CHỨNG KHOÁN CTG

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

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.

Xử lý dữ liệu thô, mã hóa dữ liệu

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()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 chitieunhom đã được tạo và điền đúng giá trị hay chưa.

Thực hiện các thống kê cơ bản

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.

Trực quan hóa dữ liệu

Đồ thị 1 - Heatmap tương quan giữa các chỉ tiêu