ฟีเจอร์เวลา

การตรวจจับการฉ้อโกงใน R

Bart Baesens

Professor Data Science at KU Leuven

วิเคราะห์เวลา

  • เหตุการณ์บางอย่างมักเกิดขึ้นในช่วงเวลาที่คล้ายกัน
  • ตัวอย่าง: ลูกค้าทำธุรกรรมในช่วงเวลาใกล้เคียงกัน
  • เป้าหมาย: ดึงข้อมูลด้านเวลาออกมาเป็นฟีเจอร์ที่มีความหมาย
  • การจัดการกับเวลาเป็นเรื่องที่ต้องระวัง
    • 00:00 = 24:00
    • ไม่มีลำดับตามธรรมชาติ เช่น 23:00 $<$ หรือ $>$ 01:00?
การตรวจจับการฉ้อโกงใน R
  • ห้ามใช้ค่าเฉลี่ยเลขคณิตในการคำนวณค่าเฉลี่ย timestamp!
    • ตัวอย่าง: ธุรกรรมเกิดขึ้นเวลา 01:00, 02:00, 21:00 และ 22:00
    • ค่าเฉลี่ยเลขคณิตคือ 11:30 แต่ไม่มีธุรกรรมใดเกิดขึ้นใกล้เวลานั้นเลย!
head(timestamps)
"20:27:28" "21:08:41" "01:30:16" "00:57:04" "23:12:14" "22:54:16"
  • แปลง timestamp ดิจิทัลเป็นรูปแบบทศนิยมในหน่วยชั่วโมง
library(lubridate)
ts <- as.numeric(hms(timestamps)) / 3600

head(ts)
20.4577778 21.1447222  1.5044444  0.9511111 23.2038889 22.9044444
การตรวจจับการฉ้อโกงใน R

ฮิสโทแกรมแบบวงกลม

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)
การตรวจจับการฉ้อโกงใน R

ฮิสโทแกรมแบบวงกลมกับค่าเฉลี่ยเลขคณิต

นาฬิกาที่แสดงค่าเฉลี่ยผิดพลาด

การตรวจจับการฉ้อโกงใน R

การแจกแจงความน่าจะเป็นแบบ von Mises

  • จำลองเวลาเป็นตัวแปรแบบวนซ้ำโดยใช้ von Mises distribution (Correa Bahnsen et al., 2016)
  • การแจกแจงปกติแบบวนซ้ำ = การแจกแจงปกติที่พันรอบวงกลม
  • von Mises distribution ของชุด timestamp $D= $ {$t_1, t_2, \ldots, t_n$}

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

  • $\mu$ : ค่าเฉลี่ยแบบวนซ้ำ บอกตำแหน่ง การแจกแจงจะรวมตัวอยู่รอบ $\mu$
  • $1/\kappa$ : ความแปรปรวนแบบวนซ้ำ; $\kappa$ คือค่าวัดความเข้มข้น
การตรวจจับการฉ้อโกงใน R

ประมาณค่าพารามิเตอร์ $\mu$ และ $\kappa$

# Convert the decimal timestamps to class "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
การตรวจจับการฉ้อโกงใน R

ฮิสโทแกรมแบบวงกลมกับค่าเฉลี่ยแบบวนซ้ำ

นาฬิกาที่แสดงค่าเฉลี่ยแบบวนซ้ำที่ถูกต้อง

การตรวจจับการฉ้อโกงใน R

ช่วงความเชื่อมั่น

  • ดึงฟีเจอร์ใหม่: ช่วงความเชื่อมั่นสำหรับเวลาของธุรกรรม
  • $S= $ {$x_i^{time}|i=1,\ldots,n$} : ชุดธุรกรรมที่ทำโดยลูกค้าคนเดียวกัน

(1) ประมาณค่า $\mu(S)$ และ $\kappa(S)$ จาก $S$ ด้วย mle.vonmises():

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

(2) คำนวณค่าความหนาแน่น (= likelihood) ของ timestamp ด้วย dvonmises():

densities <- dvonmises(ts, mu = p_mean, kappa = concentration)
การตรวจจับการฉ้อโกงใน R

การดึงฟีเจอร์

  • ฟีเจอร์แบบไบนารี: timestamp ของธุรกรรมใหม่อยู่ในช่วงความเชื่อมั่น (CI) ที่ความน่าจะเป็น $\alpha$ (เช่น 0.90, 0.95) หรือไม่
  • ฟีเจอร์เวลาแบบไบนารีจะเป็น TRUE หาก timestamp อยู่ใน CI และเป็น FALSE ในกรณีอื่น
  • timestamp อยู่ใน CI 90% หากค่าความหนาแน่นมากกว่า ค่า cutoff:
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
การตรวจจับการฉ้อโกงใน R

ช่วงความเชื่อมั่น

นาฬิกาแสดงช่วงความเชื่อมั่น

การตรวจจับการฉ้อโกงใน R

ช่วงความเชื่อมั่น

นาฬิกาแสดงช่วงความเชื่อมั่น 2

การตรวจจับการฉ้อโกงใน R

ตัวอย่าง

$$ $$ ตารางเวลา

การตรวจจับการฉ้อโกงใน R

ช่วงความเชื่อมั่นแบบหน้าต่างเวลาเลื่อน

## ts contains the timestamps 18.42, 20.45, 20.88, 0.75, 19.20, 23.65 and 6.08

time_feature = c(NA, NA) for (i in 3:length(ts)) { ts_history <- ts[1:(i-1)] ## (1) Previous timestamps
estimates <- mle.vonmises(ts_history) ## (2) Estimate mu and kappa on historic timestamps p_mean <- estimates$mu %% 24 concentration <- estimates$kappa
dens_i <- dvonmises(ts[i], mu = p_mean, kappa = concentration) ## (3) Estimate density of current timestamp
alpha <- 0.90 ## (4) Check if density is larger than cutoff with confidence level 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
การตรวจจับการฉ้อโกงใน R

มาฝึกกันเถอะ!

การตรวจจับการฉ้อโกงใน R

Preparing Video For Download...