사기 탐지 분석 (Fraud Analytics)¶
1. 개요¶
사기 탐지 분석은 금융 거래, 보험 청구, 계정 활동 등에서 부정 행위를 식별하고 방지하기 위해 데이터를 분석하는 분야.
정의¶
사기 유형¶
| 분야 | 사기 유형 |
|---|---|
| 결제 | 카드 도용, 계정 탈취 |
| 보험 | 허위 청구, 과다 청구 |
| 이커머스 | 프로모션 악용, 환불 사기 |
| 금융 | 자금세탁, 내부자 거래 |
| 광고 | 클릭 사기, 봇 트래픽 |
2. 핵심 개념¶
2.1 탐지 메트릭¶
| 지표 | 설명 |
|---|---|
| 탐지율 (Recall) | 실제 사기 중 탐지 비율 |
| 정밀도 (Precision) | 탐지 중 실제 사기 비율 |
| False Positive Rate | 정상을 사기로 오탐 |
| 손실 절감 | 탐지로 방지한 손실 |
Trade-off:
2.2 사기 특성¶
| 특성 | 설명 |
|---|---|
| 희소성 | 전체의 0.1-1% |
| 적대성 | 탐지 회피 진화 |
| 레이블 지연 | 사기 확인 시간 소요 |
| 클래스 불균형 | 극심한 불균형 |
3. 주요 분석 방법¶
3.1 규칙 기반 시스템¶
IF 금액 > $10,000 AND 해외 AND 신규계정 THEN FLAG
장점:
- 해석 가능
- 빠른 구현
- 규제 설명 용이
단점:
- 복잡한 패턴 한계
- 유지보수 어려움
- 회피 용이
3.2 이상 탐지 모델¶
비지도 학습: | 방법 | 특징 | |------|------| | Isolation Forest | 고립 용이성 | | LOF | 지역 밀도 비교 | | Autoencoder | 재구성 오차 | | One-Class SVM | 정상 경계 학습 |
장점: 레이블 불필요, 새 패턴 탐지
3.3 지도 학습 모델¶
입력: 거래 특성
출력: 사기 확률
모델:
- Logistic Regression (해석성)
- Random Forest (성능)
- XGBoost/LightGBM (최고 성능)
- Neural Network (복잡 패턴)
불균형 처리: | 방법 | 설명 | |------|------| | 오버샘플링 | SMOTE | | 언더샘플링 | Random, Tomek Links | | 비용 민감 학습 | class_weight | | 앙상블 | Balanced RF |
3.4 그래프 분석¶
3.5 시퀀스 분석¶
3.6 피처 엔지니어링¶
거래 피처:
집계 피처:
속도 피처:
4. 실무 적용 사례¶
4.1 신용카드 사기 탐지¶
실시간 파이프라인:
거래 발생 → 피처 계산 → 모델 스코어링 → 의사결정
피처:
- 거래 금액/위치/시간
- 최근 거래 패턴
- 가맹점 리스크
- 디바이스 핑거프린트
의사결정:
- Low Risk: 승인
- Medium: 추가 인증
- High: 차단
4.2 계정 탈취 탐지¶
4.3 보험 사기 탐지¶
4.4 프로모션 악용 탐지¶
5. 참고 자료¶
핵심 서적¶
| 서적 | 저자 | 주제 |
|---|---|---|
| "Fraud Analytics Using Descriptive, Predictive, and Social Network Techniques" | Baesens et al. | 종합 |
| "Machine Learning for Financial Fraud Detection" | Awoyemi et al. | ML 적용 |
주요 컨퍼런스/저널¶
| 출처 | 분야 |
|---|---|
| KDD | 데이터 마이닝 |
| IEEE S&P | 보안 |
| Journal of Financial Crime | 금융 사기 |
규제 프레임워크¶
| 규제 | 내용 |
|---|---|
| AML | 자금세탁 방지 |
| PCI-DSS | 결제 카드 보안 |
| GDPR | 개인정보 보호 |
6. 도구¶
| 도구 | 용도 |
|---|---|
| SAS Fraud Management | 엔터프라이즈 |
| FICO Falcon | 신용카드 사기 |
| Feedzai | 실시간 사기 탐지 |
| Python (PyOD) | 이상 탐지 |
| Neo4j | 그래프 분석 |
Python 사기 탐지 예시¶
from sklearn.ensemble import RandomForestClassifier
from imblearn.over_sampling import SMOTE
from sklearn.metrics import precision_recall_curve
# 불균형 처리
smote = SMOTE(random_state=42)
X_resampled, y_resampled = smote.fit_resample(X_train, y_train)
# 모델 학습
model = RandomForestClassifier(
n_estimators=100,
class_weight='balanced',
random_state=42
)
model.fit(X_resampled, y_resampled)
# 임계값 최적화
y_prob = model.predict_proba(X_test)[:, 1]
precision, recall, thresholds = precision_recall_curve(y_test, y_prob)
# 비용 기반 최적화
cost_fp = 10 # 오탐 비용
cost_fn = 1000 # 미탐 비용
costs = []
for i, threshold in enumerate(thresholds):
y_pred = (y_prob >= threshold).astype(int)
fp = ((y_pred == 1) & (y_test == 0)).sum()
fn = ((y_pred == 0) & (y_test == 1)).sum()
total_cost = cost_fp * fp + cost_fn * fn
costs.append(total_cost)
optimal_threshold = thresholds[np.argmin(costs)]