본문으로 건너뛰기

© 2026 Molayo

Dev.to헤드라인2026. 06. 05. 15:02

Python을 이용한 간단한 이상 거래 탐지 (Fraud Detection) 베이스라인 구축하기

요약

Python을 사용하여 금융 거래 데이터에서 이상 징후를 포착하기 위한 기초적인 베이스라인 모델 구축 방법을 설명합니다. 단순한 데이터 로드부터 시간 기반의 이동 창(Rolling window) 피처 생성까지 실질적인 접근 방식을 다룹니다.

핵심 포인트

  • 거래 데이터의 타임스탬프 정렬 및 형식 확인의 중요성
  • 고객의 평소 패턴과 다른 행동을 포착하는 피처 생성
  • 최신성을 반영하기 위한 이동 창(Rolling window) 특징 활용

거래 데이터를 유용한 이상 거래 위험 신호로 전환하기 위한 실질적인 첫 단계

핀테크 (Fintech) 또는 금융 서비스 분야에서 일하고 있다면, 이상 거래 탐지 (Fraud Detection)는 결국 데이터 과학 (Data Science) 문제 그 이상이 됩니다.

이는 얼마나 빨리 비정상적인 행동을 포착할 수 있는지, 그 행동을 얼마나 잘 설명할 수 있는지, 그리고 당신의 신호가 사례를 검토하는 사람들에게 얼마나 유용한지에 대한 문제가 됩니다.

이 글에서 저는 거래 데이터를 사용하여 Python으로 이상 거래 탐지 베이스라인을 구축하기 시작하는 간단한 방법을 보여드리고자 합니다. 과하게 화려한 것은 없습니다. 그저 가공되지 않은 거래 데이터에서 실제로 사용할 수 있는 위험 신호 (Risk Signals)로 나아갈 수 있도록 돕는 깔끔하고 실질적인 접근 방식입니다.

목표는 완벽한 이상 거래 모델을 만드는 것이 아닙니다.

목표는 유용한 시작점을 만드는 것입니다.

우리가 해결하려는 것

다음과 같은 거래 테이블이 있다고 가정해 봅시다:

  • customer_id
  • transaction_time
  • amount
  • merchant_category
  • device_id
  • location
  • is_fraud

여러분의 임무는 손실이 발생하기 전에 의심스러운 행동을 식별하는 것입니다.

좋은 첫 단계는 다음과 같이 시간에 따른 행동을 설명하는 피처 (Features)를 생성하는 것입니다:

  • 고객이 얼마나 자주 거래하는지
  • 금액이 갑자기 변하고 있는지
  • 거래 패턴이 비정상적으로 보이는지
  • 고객이 자신의 과거 이력과 다르게 행동하고 있는지

그 지점에서 가치가 시작됩니다.

1단계: 데이터 로드하기

import pandas as pd

df = pd.read_csv("transactions.csv")
...

복잡한 작업을 하기 전에, 타임스탬프 (Timestamps)가 datetime 형식인지, 그리고 데이터가 올바르게 정렬되어 있는지 확인하십시오.

대부분의 이상 거래 피처 (Fraud Features)는 순서에 의존하기 때문에 이 작업은 매우 중요합니다.

2단계: 기본적인 행동 피처 생성하기

거래 그 자체만으로는 많은 것을 말해주지 않습니다.

유용한 질문은 다음과 같습니다: 이 거래가 일반적인 행동과 얼마나 다른가?

다음은 구축할 수 있는 몇 가지 간단한 피처 (Features)입니다.

df["hour"] = df["transaction_time"].dt.hour
df["dayofweek"] = df["transaction_time"].dt.dayofweek

...

이것들은 단순하지만, 종종 놀라울 정도로 유용합니다.

사기꾼이 항상 거액을 사용하는 것은 아닙니다. 때로는 고객의 평소 패턴과 다르게 행동할 뿐입니다.

Step 3: 이동 창 특징 (Rolling window features) 추가하기

여기서부터 상황이 더 흥미로워지기 시작합니다.

이동 특징 (Rolling features)은 최근의 행동을 포착하는 데 도움이 됩니다. 사기 탐지 (Fraud detection)에서는 최신성 (Recency)이 중요합니다.

df["tx_count_24h"] = (
    df.groupby("customer_id")["amount"]
      .transform(lambda x: x.rolling(window=5, min_periods=1).count())
...

실제 운영 환경 (Production setup)에서는 보통 행의 개수(row count)가 아닌 시간 단위로 이동 창 (Rolling windows)을 정의하지만, 이것은 훌륭하고 간단한 베이스라인 (Baseline)이 됩니다.

핵심 아이디어는 각 거래를 고객의 최근 이력과 비교하는 것입니다.

이는 대개 원시 금액 (Raw amount)만을 사용하는 것보다 훨씬 더 나은 신호 (Signal)를 제공합니다.

Step 4: 범주형 변수 (Categorical variables) 인코딩하기

사기 데이터에는 가맹점 유형 (Merchant type), 기기 (Device), 또는 위치 (Location)와 같은 유용한 범주 (Categories)가 포함되는 경우가 많습니다.

머신러닝 (Machine learning) 모델은 대개 이러한 데이터가 숫자 형식으로 변환되기를 필요로 합니다.

categorical_cols = ["merchant_category", "location"]
df_encoded = pd.get_dummies(df, columns=categorical_cols, drop_first=True)

이것은 간단한 원-핫 인코딩 (One-hot encoding) 방식입니다. 베이스라인으로서 잘 작동합니다.

데이터셋이 크다면 나중에 타겟 인코딩 (Target encoding)이나 빈도 인코딩 (Frequency encoding)을 시도해보고 싶을 수도 있지만, 원-핫 인코딩은 시작하기에 좋은 지점입니다.

Step 5: 간단한 모델 학습하기

기본적인 분류 모델 (Classification model)을 구축해 보겠습니다.

from sklearn.model_selection import train_test_split
from sklearn.linear_model import LogisticRegression
from sklearn.metrics import classification_report, roc_auc_score
...

저는 로지스틱 회귀 (Logistic regression)로 시작하는 것을 선호하는데, 그 이유는 단순하고 빠르며 설명하기 쉽기 때문입니다.

사기 탐지에서는 이 점이 중요합니다.

설명하기 쉬운 모델이 아무도 신뢰하지 않는 복잡한 모델보다 종종 더 유용합니다.

Step 6: 임계값 (Threshold) 조정하기

이것은 사기 탐지에서 가장 중요한 부분 중 하나입니다.

모델 점수 (Model score)가 곧 비즈니스 결정 (Business decision)과 동일한 것은 아닙니다.

위험 점수 (Risk score)가 충분히 높을 때만 사례를 검토하고 싶을 수도 있습니다.

threshold = 0.7
df_test = X_test.copy()
df_test["risk_score"] = pred_proba
...

실제 운영 환경에서 임계값 (threshold) 선택은 다음 요소들에 따라 달라집니다:

  • 검토 팀의 역량 (review team capacity)
  • 부정 결제 손실 허용 범위 (fraud loss tolerance)
  • 고객 불편 (customer friction)
  • 오탐 비용 (false positive cost)
  • 컴플라이언스 요구 사항 (compliance requirements)

즉, 임계값 설정은 단순한 기술적 단계가 아닙니다. 이는 비즈니스 결정 (business decision)입니다.

7단계: 특성 중요도 (feature importance) 확인하기

모델을 움직이는 동인이 무엇인지 이해하고 싶다면, 계수 (coefficients)를 살펴보세요.

feature_importance = pd.DataFrame({
    "feature": X.columns,
    "coefficient": model.coef_[0]
...

이를 통해 어떤 신호가 모델의 예측값을 높이거나 낮추는지 빠르게 파악할 수 있습니다.

예를 들어, amount_zscorerecent_amount_change가 중요하다면, 이는 모델이 단순히 원시 거래 규모 (raw transaction size)가 아니라 비정상적인 행동을 포착하고 있음을 의미합니다.

이것이 바로 부정 결제 탐지 업무에서 여러분이 원하는 바입니다.

이 베이스라인이 우리에게 가르쳐 주는 것

이 간단한 워크플로우(workflow)만으로도 이미 많은 것을 얻을 수 있습니다:

  • 거래 수준의 위험 신호 (transaction-level risk signals)
  • 고객 행동 맥락 (customer behaviour context)
  • 1차 모델 (a first-pass model)
  • 설명 가능한 출력 (explainable outputs)
  • 결정 임계값 (a decision threshold)

아직 운영 수준 (production-grade)은 아니지만, 강력한 토대가 됩니다.

그리고 많은 팀에서, 그 토대가 다음 단계로 나아가는 열쇠가 됩니다.

다음에 개선하고 싶은 점

만약 제가 이 작업을 더 발전시킨다면, 다음과 같은 것들을 추가하겠습니다:

  • 시간 기반의 이동 창 (time-based rolling windows)
  • 기기 변경 특성 (device change features)
  • 가맹점 변경 특성 (merchant change features)
  • 위치 거리 특성 (location distance features)
  • 클래스 불균형 처리 (class imbalance handling)
  • 모델 교정 (model calibration)
  • 드리프트 모니터링 (monitoring for drift)
  • 분석가 피드백 루프 (analyst feedback loops)

또한 특성 집합 (feature set)이 더 성숙해지면 Random Forest, XGBoost 또는 LightGBM과 같은 트리 기반 모델 (tree-based models)을 테스트할 것입니다.

하지만 저는 항상 동일한 원칙을 염두에 둘 것입니다:

비즈니스가 실제로 사용할 수 있는 것을 구축하라

마치며

부정 결제 탐지는 데이터 과학 (data science)이 운영 (operations)과 결합될 때 가장 잘 작동합니다.

노트북 (notebook) 상에서 보기 좋은 모델을 만드는 것만으로는 충분하지 않습니다. 모델은 사람들이 현실 세계에서 더 나은 결정을 내릴 수 있도록 도와야 합니다.

그렇기 때문에 행동 기반 피처 (behavioural features), 설명 가능성 (explainability), 그리고 임계값 설계 (threshold design)가 매우 중요합니다.

이제 막 시작하는 단계라면, 완벽한 시스템이 갖춰질 때까지 기다리지 마세요.

  • 깔끔한 베이스라인 (baseline)부터 시작하세요.
  • 행동 기반 피처 (behaviour-based features)를 추가하세요.
  • 주의 깊게 평가하세요.
  • 그다음 단계부터 개선해 나가세요.

이것이 바로 유용한 이상 거래 탐지 (fraud) 시스템이 구축되는 방식입니다.

AI 자동 생성 콘텐츠

본 콘텐츠는 Dev.to AI tag의 원문을 AI가 자동으로 요약·번역·분석한 것입니다. 원 저작권은 원저작자에게 있으며, 정확한 내용은 반드시 원문을 확인해 주세요.

원문 바로가기
0

댓글

0