Các đặc trưng thời gian

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

Bart Baesens

Professor Data Science at KU Leuven

Phân tích thời gian

  • Một số sự kiện thường xảy ra vào các thời điểm tương tự
  • Ví dụ: khách hàng giao dịch vào các khung giờ giống nhau
  • Mục tiêu: nắm bắt khía cạnh thời gian bằng các đặc trưng ý nghĩa
  • Xử lý thời gian có thể khó
    • 00:00 = 24:00
    • Không có thứ tự tự nhiên, ví dụ 23:00 $<$ hay $>$ 01:00?
Phát hiện gian lận với R
  • Không dùng trung bình số học để tính thời điểm trung bình!
    • Ví dụ: giao dịch lúc 01:00, 02:00, 21:00 và 22:00
    • Trung bình số học là 11:30, nhưng không có giao dịch gần thời điểm đó!
head(timestamps)
"20:27:28" "21:08:41" "01:30:16" "00:57:04" "23:12:14" "22:54:16"
  • Chuyển timestamp dạng số sang giờ thập phân
library(lubridate)
ts <- as.numeric(hms(timestamps)) / 3600

head(ts)
20.4577778 21.1447222  1.5044444  0.9511111 23.2038889 22.9044444
Phát hiện gian lận với R

Biểu đồ tròn

library(ggplot2)

clock <- ggplot(data.frame(ts), aes(x = ts)) +
    geom_histogram(breaks = seq(0, 24), colour = "blue", fill = "lightblue") +
    coord_polar()


arithmetic_mean <- mean(ts) clock + geom_vline(xintercept = arithmetic_mean, linetype = 2, color = "red", size = 2)
Phát hiện gian lận với R

Biểu đồ tròn với trung bình số học

đồng_hồ_sai

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

Phân phối xác suất von Mises

  • Mô hình hóa thời gian như biến chu kỳ bằng phân phối von Mises (Correa Bahnsen et al., 2016)
  • Phân phối chuẩn chu kỳ = phân phối chuẩn quấn quanh vòng tròn
  • Phân phối von Mises cho tập timestamp $D= $ {$t_1, t_2, \ldots, t_n$}

$$D\sim vonMises\left(\mu,\kappa\right)$$

  • $\mu$: trung bình chu kỳ, đo vị trí; phân phối tập trung quanh $\mu$
  • $1/\kappa$: phương sai chu kỳ; $\kappa$ đo mức tập trung
Phát hiện gian lận với R

Ước lượng tham số $\mu$ và $\kappa$

# Chuyển timestamp thập phân sang lớp "circular"
library(circular)
ts <- circular(ts, units = "hours", template = "clock24")

head(ts)
Circular Data: 
[1] 20.457889 21.144607  1.504422  0.950982 23.203917  4.904397
estimates <- mle.vonmises(ts)
p_mean <- estimates$mu %% 24
concentration <- estimates$kappa
Phát hiện gian lận với R

Biểu đồ tròn với trung bình chu kỳ

đồng_hồ_đúng

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

Khoảng tin cậy

  • Trích xuất đặc trưng mới: khoảng tin cậy cho thời điểm giao dịch
  • $S= $ {$x_i^{time}|i=1,\ldots,n$} : tập giao dịch của cùng khách hàng

(1) Ước lượng $\mu(S)$ và $\kappa(S)$ từ $S$ bằng mle.vonmises():

estimates <- mle.vonmises(ts)
p_mean <- estimates$mu %% 24
concentration <- estimates$kappa

(2) Tính mật độ (= likelihood) của các timestamp bằng dvonmises():

densities <- dvonmises(ts, mu = p_mean, kappa = concentration)
Phát hiện gian lận với R

Trích xuất đặc trưng

  • Đặc trưng nhị phân: timestamp của giao dịch mới nằm trong khoảng tin cậy (CI) với xác suất $\alpha$ (vd. 0,90; 0,95) hoặc không
  • Đặc trưng thời gian là TRUE nếu timestamp nằm trong CI, ngược lại là FALSE
  • Timestamp thuộc CI 90% nếu mật độ của nó lớn hơn ngưỡng:
alpha <- 0.90
quantile <- qvonmises(p = (1 - alpha)/2, 
                        mu = p_mean,
                        kappa = concentration) %% 24
cutoff <- dvonmises(quantile,
                      mu = p_mean, kappa = concentration)

time_feature <- densities >= cutoff
Phát hiện gian lận với R

Khoảng tin cậy

đồng_hồ_khoảng_tin_cậy

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

Khoảng tin cậy

đồng_hồ_khoảng_tin_cậy_2

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

Ví dụ

$$ $$ bảng_thời_gian

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

Khoảng tin cậy với cửa sổ thời gian trượt

## ts chứa các timestamp 18.42, 20.45, 20.88, 0.75, 19.20, 23.65 và 6.08

time_feature = c(NA, NA) for (i in 3:length(ts)) { ts_history <- ts[1:(i-1)] ## (1) Các timestamp trước đó
estimates <- mle.vonmises(ts_history) ## (2) Ước lượng mu và kappa trên dữ liệu lịch sử p_mean <- estimates$mu %% 24 concentration <- estimates$kappa
dens_i <- dvonmises(ts[i], mu = p_mean, kappa = concentration) ## (3) Ước lượng mật độ của timestamp hiện tại
alpha <- 0.90 ## (4) Kiểm tra mật độ > ngưỡng với mức tin cậy 90% quantile <- qvonmises((1-alpha)/2, mu=p_mean, kappa=concentration) %% 24 cutoff <- dvonmises(quantile, mu = p_mean, kappa = concentration) time_feature[i] <- dens_i >= cutoff }
print(time_feature)
NA    NA  TRUE FALSE  TRUE  TRUE FALSE
Phát hiện gian lận với R

Ayo berlatih!

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

Preparing Video For Download...