Recursos de tempo

Detecção de Fraudes em R

Bart Baesens

Professor Data Science at KU Leuven

Analisando o tempo

  • Certos eventos tendem a ocorrer em momentos semelhantes
  • Exemplo: cliente faz transações em horários parecidos
  • Objetivo: captar a dimensão temporal com recursos relevantes
  • Lidar com tempo pode ser complicado
    • 00:00 = 24:00
    • Sem ordenação natural: 23:00 $<$ ou $>$ 01:00?
Detecção de Fraudes em R
  • Não use a média aritmética para calcular um horário médio!
    • Exemplo: transações às 01:00, 02:00, 21:00 e 22:00
    • a média aritmética é 11:30, mas não houve transferência perto desse horário!
head(timestamps)
"20:27:28" "21:08:41" "01:30:16" "00:57:04" "23:12:14" "22:54:16"
  • Converta horários digitais para formato decimal em horas
library(lubridate)
ts <- as.numeric(hms(timestamps)) / 3600

head(ts)
20.4577778 21.1447222  1.5044444  0.9511111 23.2038889 22.9044444
Detecção de Fraudes em R

Histograma circular

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)
Detecção de Fraudes em R

Histograma circular com média aritmética

relógio_incorreto

Detecção de Fraudes em R

Distribuição de probabilidade von Mises

  • Modele o tempo como variável periódica usando a distribuição de von Mises (Correa Bahnsen et al., 2016)
  • Normal periódica = normal enrolada em um círculo
  • Distribuição von Mises de um conjunto de horários $D= $ {$t_1, t_2, \ldots, t_n$}

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

  • $\mu$: média periódica, medida de posição; a distribuição se concentra em $\mu$
  • $1/\kappa$: variância periódica; $\kappa$ é a medida de concentração
Detecção de Fraudes em R

Estimar os parâmetros $\mu$ e $\kappa$

# Converta os horários decimais para a classe "circular"
library(circular)
ts <- circular(ts, units = "hours", template = "clock24")

head(ts)
Dados Circulares: 
[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
Detecção de Fraudes em R

Histograma circular com média periódica

relógio_correto

Detecção de Fraudes em R

Intervalo de confiança

  • Extraia novos recursos: intervalo de confiança para o horário de uma transação
  • $S= $ {$x_i^{time}|i=1,\ldots,n$}: conjunto de transações do mesmo cliente

(1) Estime $\mu(S)$ e $\kappa(S)$ com base em $S$ usando mle.vonmises():

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

(2) Calcule a densidade (= verossimilhança) dos horários com dvonmises():

densities <- dvonmises(ts, mu = p_mean, kappa = concentration)
Detecção de Fraudes em R

Extração de recursos

  • Recurso binário: o horário de uma nova transação está no intervalo de confiança (IC) com probabilidade $\alpha$ (ex.: 0,90, 0,95) ou não
  • O recurso binário é TRUE se o horário cair dentro do IC; caso contrário, FALSE
  • O horário está no IC de 90% se sua densidade for maior que o valor de corte:
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
Detecção de Fraudes em R

Intervalo de confiança

relógio_intervalo_confianca

Detecção de Fraudes em R

Intervalo de confiança

relógio_intervalo_confianca_2

Detecção de Fraudes em R

Exemplo

$$ $$ tabela_tempo

Detecção de Fraudes em R

Intervalo de confiança com janela móvel no tempo

## ts contém os horários 18.42, 20.45, 20.88, 0.75, 19.20, 23.65 e 6.08

time_feature = c(NA, NA) for (i in 3:length(ts)) { ts_history <- ts[1:(i-1)] ## (1) Horários anteriores
estimates <- mle.vonmises(ts_history) ## (2) Estime mu e kappa nos horários históricos p_mean <- estimates$mu %% 24 concentration <- estimates$kappa
dens_i <- dvonmises(ts[i], mu = p_mean, kappa = concentration) ## (3) Estime a densidade do horário atual
alpha <- 0.90 ## (4) Verifique se a densidade é maior que o corte com 90% de confiança 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
Detecção de Fraudes em R

Vamos praticar!

Detecção de Fraudes em R

Preparing Video For Download...