Caractéristiques temporelles

Détection de la fraude en R

Bart Baesens

Professor Data Science at KU Leuven

Analyser le temps

  • Certains événements surviennent à des moments semblables
  • Exemple : un client effectue des opérations à des heures similaires
  • Objectif : capter l'information temporelle par des caractéristiques pertinentes
  • Gérer le temps peut être délicat
    • 00:00 = 24:00
    • Pas d'ordre naturel : par exemple, 23:00 $<$ ou $>$ 01:00 ?
Détection de la fraude en R
  • N'utilisez surtout pas la moyenne arithmétique pour un horodatage moyen !
    • Exemple : opérations à 01:00, 02:00, 21:00 et 22:00
    • la moyenne arithmétique est 11:30, mais aucune opération n'a eu lieu près de cette heure !
head(timestamps)
"20:27:28" "21:08:41" "01:30:16" "00:57:04" "23:12:14" "22:54:16"
  • Convertir les horodatages numériques en format décimal (heures)
library(lubridate)
ts <- as.numeric(hms(timestamps)) / 3600

head(ts)
20.4577778 21.1447222  1.5044444  0.9511111 23.2038889 22.9044444
Détection de la fraude en R

Histogramme circulaire

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)
Détection de la fraude en R

Histogramme circulaire avec moyenne arithmétique

horloge_erronée

Détection de la fraude en R

Loi de probabilité de von Mises

  • Modéliser le temps comme une variable périodique avec la loi de von Mises (Correa Bahnsen et al., 2016)
  • Normale périodique = loi normale enroulée sur un cercle
  • Loi de von Mises pour un ensemble d'horodatages $D= $ {$t_1, t_2, \ldots, t_n$}

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

  • $\mu$ : moyenne périodique (mesure de position), la distribution se regroupe autour de $\mu$
  • $1/\kappa$ : variance périodique ; $\kappa$ mesure la concentration
Détection de la fraude en R

Estimer les paramètres $\mu$ et $\kappa$

# Convertir les horodatages décimaux en classe "circular"
library(circular)
ts <- circular(ts, units = "hours", template = "clock24")

head(ts)
Données circulaires :
[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
Détection de la fraude en R

Histogramme circulaire avec moyenne périodique

horloge_corrigée

Détection de la fraude en R

Intervalle de confiance

  • Extraire de nouvelles caractéristiques : intervalle de confiance pour l'heure d'une opération
  • $S= $ {$x_i^{time}|i=1,\ldots,n$} : ensemble des opérations d'un même client

(1) Estimer $\mu(S)$ et $\kappa(S)$ à partir de $S$ avec mle.vonmises() :

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

(2) Calculer la densité (= vraisemblance) des horodatages avec dvonmises() :

densities <- dvonmises(ts, mu = p_mean, kappa = concentration)
Détection de la fraude en R

Extraction de caractéristiques

  • Caractéristique binaire : l'horodatage d'une nouvelle opération est dans l'intervalle de confiance (IC) avec la probabilité $\alpha$ (p. ex. 0,90, 0,95) ou non
  • La caractéristique binaire vaut TRUE si l'horodatage est dans l'IC, FALSE sinon
  • Un horodatage est dans l'IC à 90 % si sa densité dépasse la valeur seuil :
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
Détection de la fraude en R

Intervalle de confiance

horloge_confiance

Détection de la fraude en R

Intervalle de confiance

horloge_confiance_2

Détection de la fraude en R

Exemple

$$ $$ table_temps

Détection de la fraude en R

Intervalle de confiance avec fenêtre temporelle glissante

## ts contient les horodatages 18.42, 20.45, 20.88, 0.75, 19.20, 23.65 et 6.08

time_feature = c(NA, NA) for (i in 3:length(ts)) { ts_history <- ts[1:(i-1)] ## (1) Horodatages précédents
estimates <- mle.vonmises(ts_history) ## (2) Estimer mu et kappa sur les horodatages historiques p_mean <- estimates$mu %% 24 concentration <- estimates$kappa
dens_i <- dvonmises(ts[i], mu = p_mean, kappa = concentration) ## (3) Estimer la densité de l'horodatage courant
alpha <- 0.90 ## (4) Vérifier si la densité dépasse le seuil au niveau de confiance de 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
Détection de la fraude en R

Passons à la pratique !

Détection de la fraude en R

Preparing Video For Download...