시간 특성

R로 배우는 사기 탐지

Bart Baesens

Professor Data Science at KU Leuven

시간 분석

  • 특정 이벤트는 비슷한 시각에 발생하는 경향이 있음
  • 예: 고객이 비슷한 시간대에 거래
  • 목표: 시간 정보를 의미 있는 특성으로 포착
  • 시간 처리는 까다로움
    • 00:00 = 24:00
    • 자연스러운 순서 부재, 예: 23:00 $<$ 또는 $>$ 01:00?
R로 배우는 사기 탐지
  • 타임스탬프 평균을 산술평균으로 구하지 마십시오!
    • 예: 거래 시각이 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"
  • 디지털 타임스탬프를 시 단위 10진수로 변환
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로 배우는 사기 탐지

폰 미저스 확률분포

  • 시간을 주기 변수로 모델링: 폰 미저스 분포(Correa Bahnsen et al., 2016)
  • 주기 정규분포 = 정규분포를 원에 감싼 형태
  • 타임스탬프 집합 $D= $ {$t_1, t_2, \ldots, t_n$}의 폰 미저스 분포

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

  • $\mu$ : 주기 평균, 위치 척도. 분포는 $\mu$ 주변에 집중
  • $1/\kappa$ : 주기 분산; $\kappa$는 집중도 척도
R로 배우는 사기 탐지

모수 $\mu$와 $\kappa$ 추정

# 10진수 타임스탬프를 "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) mle.vonmises()로 $S$에 기반해 $\mu(S)$와 $\kappa(S)$ 추정:

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

(2) dvonmises()로 타임스탬프의 밀도(=가능도) 계산:

densities <- dvonmises(ts, mu = p_mean, kappa = concentration)
R로 배우는 사기 탐지

특성 추출

  • 이진 특성: 새 거래의 타임스탬프가 신뢰구간(CI)에 포함될 확률은 $\alpha$(예: 0.90, 0.95)이며, 포함/미포함으로 표시
  • 타임 특성은 CI 안이면 TRUE, 아니면 FALSE
  • 밀도가 다음 임계값보다 크면 90% CI 안에 있음:
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로 배우는 사기 탐지

예시

$$ $$ time_table

R로 배우는 사기 탐지

이동 시간 창 기반 신뢰구간

## ts에는 18.42, 20.45, 20.88, 0.75, 19.20, 23.65, 6.08이 포함됨

time_feature = c(NA, NA) for (i in 3:length(ts)) { ts_history <- ts[1:(i-1)] ## (1) 이전 타임스탬프
estimates <- mle.vonmises(ts_history) ## (2) 과거 타임스탬프로 mu와 kappa 추정 p_mean <- estimates$mu %% 24 concentration <- estimates$kappa
dens_i <- dvonmises(ts[i], mu = p_mean, kappa = concentration) ## (3) 현재 타임스탬프의 밀도 추정
alpha <- 0.90 ## (4) 신뢰수준 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로 배우는 사기 탐지

Ayo berlatih!

R로 배우는 사기 탐지

Preparing Video For Download...