ThePriEdit/fraud-detection-analysis
GitHub: ThePriEdit/fraud-detection-analysis
基于 SQL 的金融欺诈检测分析项目,通过规则驱动的风险评分模型识别四种典型欺诈模式并对交易进行分级标记。
Stars: 0 | Forks: 0
# 🔍 欺诈检测分析 — SQL 与数据分析
## 📌 项目概述
金融欺诈每年造成数十亿美元的损失。本项目使用结构化交易数据、基于 SQL 的模式检测和综合风险评分模型,模拟了真实世界中的欺诈检测流水线。
**关键结果:**
- 分析了 1,200 名客户的 **10,000+ 条交易记录**
- 检测出涵盖约 15% 交易的 **4 种独立欺诈模式**
- 使用多规则 SQL 逻辑标记了 **5–10% 的高风险**交易
- 识别出 **30%+ 的异常金额激增**作为主要的欺诈信号
- 构建了**综合风险评分模型**(0–100)以优先安排调查工作
## 🗂️ 仓库结构
```
fraud-detection/
│
├── data/
│ ├── transactions.csv # 10,000 synthetic transaction records
│ └── fraud-detection-analysis.xlsx # Excel dashboard with summary & flagged data
│
├── sql/
│ ├── 01_schema_and_load.sql # Table schema & data loading
│ ├── 02_exploratory_analysis.sql # EDA queries (distributions, trends)
│ ├── 03_fraud_detection_queries.sql # Core detection logic (JOINs, CTEs, Windows)
│ └── 04_risk_scoring_model.sql # Rule-based composite scoring system
│
└── README.md
```
## 📊 数据集描述
| 列名 | 类型 | 描述 |
|---|---|---|
| `transaction_id` | VARCHAR | 唯一交易 ID (TXN0000001 格式) |
| `customer_id` | VARCHAR | 客户标识符 (CUST00001 格式) |
| `transaction_date` | DATE | 交易日期 (2023 年) |
| `transaction_time` | TIME | 交易时间 (HH:MM:SS) |
| `amount` | DECIMAL | 交易金额 (₹) |
| `merchant_category` | VARCHAR | 零售、旅游、电子产品等 |
| `location` | VARCHAR | 城市或国际/未知 |
| `payment_method` | VARCHAR | 信用卡、UPI、网上银行等 |
| `is_fraud` | VARCHAR | 真实标签 (是/否) |
| `fraud_reason` | VARCHAR | 欺诈模式类型 |
**数据集统计信息:**
- 10,000 笔总交易
- ₹50 – ₹20,00,000 金额范围
- 8 个商户类别,10 个地区,5 种支付方式
## 🔎 检测到的欺诈模式
### 1. 🔴 金额激增 (分数: +40 分)
交易金额超过**客户历史平均值的 3 倍**。
**检测方式:**与按客户汇总的基线数据进行 JOIN 连接。
```
SELECT t.transaction_id, t.amount, cb.avg_amount,
ROUND(t.amount / cb.avg_amount, 2) AS amount_ratio
FROM transactions t
JOIN customer_baselines cb ON t.customer_id = cb.customer_id
WHERE t.amount > cb.avg_amount * 3;
```
### 2. 🟠 高频交易 (分数: +15 分)
客户在一天内进行了**超过 5 笔交易**。
**检测方式:**使用 HAVING 子句按客户和日期进行 GROUP BY 分组。
```
SELECT customer_id, transaction_date, COUNT(*) AS txn_count
FROM transactions
GROUP BY customer_id, transaction_date
HAVING COUNT(*) > 5;
```
### 3. 🟠 地点异常 (分数: +25 分)
交易发起自**国际或未知地点**。
**检测方式:**简单的 WHERE 筛选并与客户历史记录进行 JOIN 连接。
```
SELECT * FROM transactions
WHERE location IN ('International', 'Unknown');
```
### 4. 🟡 非工作时间交易 (分数: +20 分)
交易发生在**午夜至凌晨 4 点**之间。
**检测方式:**对 transaction_time 使用 HOUR() 函数。
```
SELECT * FROM transactions
WHERE HOUR(transaction_time) BETWEEN 0 AND 3;
```
## 🧮 风险评分模型
每笔交易都会被分配一个综合的基于规则的分数 (0–100):
| 规则 | 条件 | 分数 |
|---|---|---|
| 金额激增 | 金额 > 客户平均值的 3 倍 | +40 |
| 地点风险 | 国际 / 未知 | +25 |
| 非工作时间 | 交易时间在 12AM–4AM 之间 | +20 |
| 高频交易 | 一天内 >5 笔交易 | +15 |
**风险等级:**
| 分数 | 等级 | 措施 |
|---|---|---|
| 60–100 | 🔴 极高危 (CRITICAL) | 拦截并上报至反欺诈团队 |
| 40–59 | 🟠 高危 (HIGH) | 标记以供人工审核 |
| 20–39 | 🟡 中危 (MEDIUM) | 监控并记录 |
| 0–19 | 🟢 低危 (LOW) | 正常处理 |
## ⚙️ 使用的 SQL 技术
| 技术 | 用途 |
|---|---|
| `JOIN` | 连接交易数据与客户基线 |
| `CTE (WITH 子句)` | 构建多步欺诈检测流水线 |
| `窗口函数` | 按客户进行滚动聚合 |
| `HAVING` | 聚合后筛选频率 |
| `CASE WHEN` | 基于规则的分数分配 |
| `STDDEV / AVG` | 按客户生成统计基线 |
| `DATE / HOUR 函数` | 时间模式检测 |
| `UNION ALL` | 合并多个欺诈标记表 |
| `VIEW` | 可复用的欺诈标记与基线层 |
## 🚀 如何运行 (推荐使用 SQLite)
本项目使用 SQLite 进行开发和测试。
### 步骤:
1. 打开 SQLite 或 DB Browser for SQLite
2. 导入数据集:
* 将 `data/transactions.csv` 作为名为 `transactions` 的表加载
3. 按顺序运行 SQL 文件:
* `01_schema_and_load.sql`
* `02_exploratory_analysis.sql`
* `03_fraud_detection_queries.sql`
* `04_risk_scoring_model.sql`
### 替代方案:
你也可以使用在线工具(如 SQLite Online)运行此项目,只需上传数据集并执行查询即可。
## 📈 关键发现
| 洞察 | 数值 |
|---|---|
| 总体欺诈率 | 占交易的 ~15% |
| 最主要欺诈模式 | 金额激增 (占欺诈的 53%) |
| 最高风险类别 | 电子产品与旅游 |
| 欺诈高峰时段 | 12 AM – 3 AM |
| 最高风险地点 | 国际与未知 |
| 平均欺诈金额 | 比正常交易高约 3.8 倍 |
## 💡 建议
1. **实时金额激增警报** — 拦截超过客户平均值 5 倍的交易,待 OTP 验证通过后放行
2. **地理位置速度检查** — 标记在 2 小时内在 2 个或更多地点进行交易的客户
3. **非工作时间阻力** — 对 12 AM 至 4 AM 之间的交易增加增强型身份验证
4. **频率节流** — 在一天内发生 8 笔以上交易后进行软拦截,并发送短信确认
5. **机器学习下一步** — 使用被标记与正常的数据训练 Isolation Forest 或 XGBoost 分类器
## 🧠 我的方法
我构建这个项目是为了模拟欺诈分析师如何使用 SQL 检测可疑交易。
我没有依赖机器学习,而是将重点放在基于规则的检测上:
- 识别异常的交易金额激增
- 检测异常的交易频率
- 标记高风险的地点和时间模式
这帮助我理解了真实世界的欺诈检测系统在应用高级模型之前是如何确定风险优先级的。
## ⚠️ 局限性
- 基于规则的方法可能会产生误报
- 无法自动适应新的欺诈模式
- 需要对阈值进行调优(例如,平均值的 3 倍)
## 🔄 后续步骤
- 应用机器学习 (Isolation Forest / XGBoost)
- 添加实时流检测
## 🛠️ 技术栈



## 👤 作者
Priyanka R More
📧 priyarmore88@gmail.com
🔗 [LinkedIn](https://www.linkedin.com/in/priyanka-more-a476021a6/) | [作品集](https://github.com/ThePriEdit)
标签:CTE, EDA, ETL, Excel, JavaCC, SQL, SQL分析, 云计算, 交易安全, 交易监控, 代码示例, 仪表盘, 反欺诈, 复合评分模型, 多线程, 异常检测, 探索性数据分析, 数据仓库, 数据分析, 模式识别, 欺诈检测, 窗口函数, 系统审计, 网络安全, 规则引擎, 逆向工具, 金融数据分析, 金融科技, 隐私保护, 风控模型, 风险评分