Tijdfeatures

Fraudedetectie in R

Bart Baesens

Professor Data Science at KU Leuven

Tijd analyseren

  • Bepaalde events gebeuren op vergelijkbare tijdstippen
  • Voorbeeld: klant die op vergelijkbare uren transacties doet
  • Doel: tijdinformatie vangen met zinvolle features
  • Met tijd werken is lastig
    • 00:00 = 24:00
    • Geen natuurlijke ordening, bv. 23:00 $<$ of $>$ 01:00?
Fraudedetectie in R
  • Gebruik de rekenkundige gemiddelde niet voor een gemiddeld tijdstip!
    • Voorbeeld: transactie om 01:00, 02:00, 21:00 en 22:00
    • rekenkundig gemiddelde is 11:30, maar er is dan niks geboekt!
head(timestamps)
"20:27:28" "21:08:41" "01:30:16" "00:57:04" "23:12:14" "22:54:16"
  • Zet digitale timestamps om naar decimaal in uren
library(lubridate)
ts <- as.numeric(hms(timestamps)) / 3600

head(ts)
20.4577778 21.1447222  1.5044444  0.9511111 23.2038889 22.9044444
Fraudedetectie in R

Cirkulair histogram

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)
Fraudedetectie in R

Cirkulair histogram met rekenkundig gemiddelde

foute_klok

Fraudedetectie in R

von Mises-kansverdeling

  • Modelleer tijd als periodieke variabele met de von Mises-verdeling (Correa Bahnsen et al., 2016)
  • Periodieke normale verdeling = normale verdeling rond een cirkel gewikkeld
  • von Mises-verdeling van een set timestamps $D= $ {$t_1, t_2, \ldots, t_n$}

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

  • $\mu$ : periodiek gemiddelde; locatieparameter; de verdeling clustert rond $\mu$
  • $1/\kappa$ : periodieke variantie; $\kappa$ is maat voor concentratie
Fraudedetectie in R

Schat parameters $\mu$ en $\kappa$

# Converteer decimale timestamps naar klasse "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
Fraudedetectie in R

Cirkulair histogram met periodiek gemiddelde

juiste_klok

Fraudedetectie in R

Betrouwbaarheidsinterval

  • Extraheer nieuwe features: betrouwbaarheidsinterval voor het tijdstip van een transactie
  • $S= $ {$x_i^{time}|i=1,\ldots,n$} : set transacties van dezelfde klant

(1) Schat $\mu(S)$ en $\kappa(S)$ op $S$ met mle.vonmises():

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

(2) Bereken de dichtheid (= likelihood) van de timestamps met dvonmises():

densities <- dvonmises(ts, mu = p_mean, kappa = concentration)
Fraudedetectie in R

Feature-extractie

  • Binaire feature: timestamp van een nieuwe transactie ligt met kans $\alpha$ (bv. 0,90; 0,95) wel of niet in het betrouwbaarheidsinterval (BI)
  • Binaire tijdfunctie is TRUE als timestamp binnen BI valt, anders FALSE
  • Timestamp valt binnen 90%-BI als de dichtheid groter is dan de afkapwaarde:
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
Fraudedetectie in R

Betrouwbaarheidsinterval

betrouwbaarheids_klok

Fraudedetectie in R

Betrouwbaarheidsinterval

betrouwbaarheids_klok_2

Fraudedetectie in R

Voorbeeld

$$ $$ tijd_tabel

Fraudedetectie in R

Betrouwbaarheidsinterval met schuivend tijdvenster

## ts bevat de timestamps 18.42, 20.45, 20.88, 0.75, 19.20, 23.65 en 6.08

time_feature = c(NA, NA) for (i in 3:length(ts)) { ts_history <- ts[1:(i-1)] ## (1) Vorige timestamps
estimates <- mle.vonmises(ts_history) ## (2) Schat mu en kappa op historische timestamps p_mean <- estimates$mu %% 24 concentration <- estimates$kappa
dens_i <- dvonmises(ts[i], mu = p_mean, kappa = concentration) ## (3) Schat dichtheid huidig timestamp
alpha <- 0.90 ## (4) Check of dichtheid groter is dan afkap bij 90% betrouwbaarheid 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
Fraudedetectie in R

Laten we oefenen!

Fraudedetectie in R

Preparing Video For Download...