Intro

군입대 전, 이것저것 해보자는 생각에 xx시 빅데이터 공모전에 참가했다. xx시가 겪고 있는 문제를 발견하여, 이를 빅데이터를 통해 어떻게 해결할 수 있는지 서류심사를 거쳐 최종발표를 하는 식으로 진행되었다. xx시에 거주하지는 않지만, xx시가 타 지역에 비해 범죄와 관련된 사건이 많이 발생한 곳으로 조사되어, 이를 예방할 수 있도록 장소와 시간대에 따라 범죄를 예측하는 prototype을 만들어 최종발표에서 시현했다. 나름 공들여 생각하고 고안한 prototype이었기에, 심사위원단분들로부터 어느 정도 칭찬을 기대했다. 하지만 발표에 대한 심사위원단분들의 반응은 예상과 달리 미지근했다. 그리고 한 분이 말씀하셨다. “요즘은 워낙 cctv나 방범이 잘되어 있어서 그렇게 현실적이지 않네요. 그리고 요즘은 범죄의 숫자만 놓고 보면 살인,강간과 같은 물리적인 범죄보다는 보이스피싱, 마약,성매매 등의 범죄가 훨씬 많아요.”

그렇게 참가했다는데 의미를 두고 정신승리를 하면서 지하철을 타고 오면서 생각했다. ’마약, 성매매 같은 범죄는 어떻게 이뤄지지? 불법채팅 같은 방법으로 접촉을 하더라도 거래에 필요한 돈은 전부 현금으로 거래될까? 아니면 은행계좌로도 돈이 오갈까? 해당 거래가 범죄와 연루되어 있다는 것을 실시간으로 밝히는 방법이 있을까? 이런 꼬리에 꼬리를 무는 질문을 하다가 은행 거래 관련 데이터를 찾아보았다. 그렇게 시작된 이상거래 예측모델 프로젝또…

========================================================================================================================

Data

========================================================================================================================

  • 각 행은 각 거래(transaction)을 보여준다.

  • 각 열에 대한 정보는 self-explanatory 하기 때문에 간단하게 짚고 넘어가도록 하자.

  • 잔고 $1000가 있는 A계좌에서 잔고 $2000가 있는 B계좌로 $300달러를 송금한다고 했을 때, amount = 200, oldbalanceOrig = 1000, newbalanceOrig = 700, oldbalanceDest = 2000, newbalanceDest = 2300 과 같이 나타난다.

  • ErrorBalanceOrig와 ErrorBalanceDest 는 계좌의 잔고가 amount와 동일하게 바뀌지 않은 거래를 의미한다. amount = 400이고 oldbalanceOrig = 1000인데 newbalanceOrig = 800 일 경우, ErrorBalanceOrig = “-1”로 기입된다.

  • step: 거래 발생 시간

EDA

========================================================================================================================

========================================================================================================================

  • step을 제외한 모든 numeric 변수는 right skewed한 분산을 보인다.

========================================================================================================================

========================================================================================================================

  • 전체 거래 중, CASH_OUT (출금) > PAYMENT(납입) > CASH_IN (입금) > TRANSFER (이체) > DEBIT (추심) 순으로 거래 비율이 많다.

========================================================================================================================

========================================================================================================================

  • 전체 거래 중, 이상거래의 비율은 0.12%에 불과하다. 즉 10000개의 거래 중 약 12-13개의 이상거래가 발생한다.

========================================================================================================================

========================================================================================================================

  • 정상적인 transaction은 사람들이 활동하는 시간대에 이뤄지는 반면, 비정상적인 transactions은 특정시간대 없이 발생한다.

  • 예측 모델 성능에 어느 정도 영향을 줄 것으로 기대된다.

========================================================================================================================

========================================================================================================================

  • 이상거래의 type은 TRANSFER, CASH_OUT 만 존재한다.

  • 이상거래의 amount는 10000000까지 존재한다. 시뮬레이션 데이터인 것을 알 수 있다.

========================================================================================================================

Predictive Model

이상거래 탐지 예측모델에 2가지 알고리즘 (Logistic Regression vs. Random Forest)을 적용하여 어떤 알고리즘이 더 좋은 성능을 내는지 알아보자.

Logistic Regression

Area under the curve: 0.8436 Setting levels: control = 0, case = 1
Area under the curve: 0.8436 Setting direction: controls < cases

========================================================================================================================

  • AUC가 0.8436으로 꽤 준수한 성능을 보여준다.

========================================================================================================================

Random Forest

========================================================================================================================

  • Logistic Regression 모델에 비해 Random Forest 모델의 AUC가 0.9964로 매우 높다.

  • 아래 그래프는 Random Forest 모델에 영향을 주는 변수들에 대한 정보를 담고 있다. 거래(transaction)를 발생시키는 발신자의 계좌 거래 이후 balance 상태 (newbalanceOrig)와 앞서 새로 생성한 ErrorBalanceOrig 변수 두개가 모델 예측 성능에 가장 많은 영향을 주는 것을 알 수 있다. 그 외, step(거래시간)은 EDA에서 기대한 바와 달리 예측 성능에 많은 영향을 주지는 않는다.

========================================================================================================================

========================================================================================================================

  • 두 모델의 차이를 비교한 ROC Curve 그래프이다.

  • Random Forest (red) 가 Logistic Regression (green) 보다 훨씬 나은 성능을 보여준다.

========================================================================================================================

##           예측: NO 예측: YES
## 실제: NO    275648       393
## 실제: YES        2       838
## [1] "Accuracy: 0.998573394346308"
## [1] "Recall: 0.997619047619048"
## [1] "Precision: 0.680747359870024"

========================================================================================================================

  • FN: 정상거래 (IsFraud = 0) 라고 예측했는데, 실제로는 이상거래 (IsFraud = 1)인 경우를 뜻한다.

  • FP: 이상거래 (IsFraud = 1) 라고 예측했는데, 실제로는 정상거래 (IsFraud = 0)인 경우를 뜻한다.

  • 예측결과(0/1)는 threshold를 기준으로 0과 1사이의 확률로 정해진다. Default threshold 값은 0.5인데, 실제 상황에서는 FN 혹은 FP 값에 대한 trade-off를 고려하여 threshold 값을 지정하게 된다. 이상거래 예측의 경우, FP보다는 FN이 더 많은 기회비용을 발생시키기 때문에, FN 값을 가능한 최소화 시키는 보수적인 threshold 값 (0.01)을 찾아 지정하도록 하였다.

  • 이에 따라 생성된 Random Forest 모델의 결과는 Accuracy: 0.9986353, Recall: 0.9929329, Precision: 0.6938272 이다.

========================================================================================================================

마치며

  • 시뮬레이션 데이터이기 때문에 예측 모델 성능이 너무 잘 나온 것 같아 조금 민망하다.

  • 실제 이상거래 탐지에 사용되는 데이터는 어떻게 생겼을지 궁금하다. 예를 들어, 위치정보, device 정보, ip 주소, 고객 정보, 거래이력 등 다양한 정보가 사용 가능할 것으로 예상된다.

  • 이상거래가 발생하고 확인한 뒤 이상거래라는 label이 달릴 것으로 짐작하는데, 실제 이상거래는 어떤 과정을 통해 labeling이 되는지 궁금하다.

  • 공모전 결과에 대한 실망감(?)이 이상거래 탐지 예측모델까지 만들어 보게 되는 계기가 됐다. 故 스티브 잡스님의 Connect the dots 연설처럼 앞으로 커리어에 작은 점 하나를 찍었다고 생각하며 포스팅을 마친다.