Phát hiện gian lận với R
Tim Verdonck
Professor Data Science at KU Leuven
Ngoại lệ là quan sát lệch khỏi mẫu hình của đa số dữ liệu.
Ngoại lệ có thể cảnh báo gian lận.
Một công cụ phổ biến để phát hiện ngoại lệ là
Z-score $z_i$ cho quan sát $x_i$ được tính:
$$z_i=\frac{x_i-\hat{\mu}}{\hat{\sigma}} = \frac{x_i-\overline{x}}{s}$$
Bộ dữ liệu loginc chứa thu nhập hằng tháng của 10 người sau biến đổi log:
loginc: 7.876 7.681 7.628 ... 7.764 9.912 # <-- thu nhập cuối rõ ràng là ngoại lệ!
Mean <- mean(loginc)
Sd <- sd(loginc)
zscore <- (loginc - Mean) / Sd
abs(zscore) > 3
FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE
Trung bình mẫu: $$\overline{x}=\frac{1}{n}\sum_i x_i$$
mean(loginc)mean(loginc9)
7.9864477.772392
loginc9 chứa cùng các quan sát như loginc trừ ngoại lệ.
Sắp $n$ quan sát tăng dần, trung vị mẫu, $Med(X_n)$, là quan sát thứ $(n+1)/2$ (n lẻ) hoặc trung bình của quan sát thứ $n/2$ và $n/2+1$ (n chẵn).
median(loginc)
7.816658
median(loginc9)
7.764296
(1) Độ lệch chuẩn mẫu: $$s= \sqrt{\frac{1}{n-1}\sum_i (x_i-\hat{\mu})^2}$$
sd(loginc)
0.6976615
sd(loginc9)
0.1791729
(2) Độ lệch tuyệt đối theo trung vị (MAD): $$Mad(X_n)=1.4826Med(|x_i-Med(X_n)|)$$
(3) Khoảng tứ phân vị (chuẩn hóa): $$IQR(X_n)= IQR = 0.7413(Q_3-Q_1)$$ trong đó $Q_1$ và $Q_3$ là tứ phân vị thứ nhất và thứ ba
IQR(loginc)/1.349
0.2056784
mad(loginc)
0.2396159
mad(loginc9)
0.201305
IQR(loginc9)/1.349
0.1839295
Thay các ước lượng vững để tính z-score vững:
$$z_i=\frac{x_i-\hat{\mu}}{\hat{\sigma}} =\frac{x_i-Med(X_n)}{Mad(X_n)}$$
robzscore <- (loginc - median(loginc)) / mad(loginc)abs(robzscore) > 3 ## Kiểm tra ngoại lệ
FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE TRUE
robzscore[10] ## Z-score vững của ngoại lệ
8.748523

boxplot(los, col = "blue", ylab = "Lenght of Stay (LOS)")$out
59 33 42 67 35 47 102 36 27 31 27 30 29 32 37 27 38


Ngoại lệ theo boxplot điều chỉnh:
library(robustbase)
adjbox(los)$out
59 67 102
Thống kê do boxplot điều chỉnh tính:
adjboxStats(los)$stats
2 4 8 13 47


Phát hiện gian lận với R