devthapallykarthikgoud/Healthcare-Claims-Fraud-Detection-Analytics-Dashboard
GitHub: devthapallykarthikgoud/Healthcare-Claims-Fraud-Detection-Analytics-Dashboard
一个结合 SQL 分析、随机森林机器学习与 Power BI 可视化的医疗保险理赔欺诈检测 pipeline,用于自动化识别高风险理赔并辅助支付合规团队优先人工复核。
Stars: 0 | Forks: 0
# 🏥 医疗保健理赔欺诈检测与分析仪表板
用于检测欺诈性、重复和高风险医疗保健保险理赔的端到端分析 pipeline —— 结合了基于 SQL 的支付合规性分析、Random Forest 欺诈分类器以及交互式 Power BI 仪表板。
   
## 📌 概述
医疗保险支付方处理着海量的理赔,手动审查每一条理赔是否存在欺诈是无法扩展的。本项目构建了一个完整的 pipeline —— 从原始理赔数据生成、基于 SQL 的风险分析,到训练好的欺诈分类器以及适配 Power BI 的输出结果 —— 旨在帮助支付合规团队**优先确定哪些理赔需要人工复核**,而不是平等对待所有理赔。
该数据集包含跨 **500 家 provider** 和 **19,867 名患者**的 **100,400 条合成医疗保健理赔**,其中嵌入了真实的欺诈模式(provider 聚类、编码套高、同日重复计费),使模型能够学习到真实的特征信号,而非随机噪声。
## 🎯 问题陈述
1. 生成一个嵌入了欺诈模式的真实理赔数据集(因为真实的支付方数据是不公开的)。
2. 使用 SQL 提取支付合规性信号 —— provider 风险排名、重复计费、欺诈率趋势。
3. 构建能够捕捉*相对*异常行为的特征(而不仅仅是原始理赔金额)。
4. 训练一个分类器对理赔级别的欺诈风险进行评分,并在罕见的稀有事件目标上进行适当评估。
5. 导出带有预测评分的数据集,用于构建 Power BI 仪表板。
## 🗂️ 数据集
| 字段 | 描述 |
|---|---|
| `claim_id`, `patient_id`, `provider_id` | 标识符 |
| `procedure_code`, `diagnosis_code` | CPT / ICD 风格代码 |
| `payer_type` | Medicare, Medicaid, Private Insurance, Self-Pay |
| `claim_amount` | 账单金额 |
| `service_date`, `claim_date` | 服务与提交时间 |
| `claim_status` | Approved, Denied, Pending, Under Review |
| `is_duplicate_flag`, `is_high_risk_provider` | 嵌入的真实标签信号字段 |
| `is_fraud` | 目标标签 |
**数据集统计(实际生成的数据):**
- 100,400 条理赔 · 500 家 provider · 19,867 名患者
- **欺诈率:3.70%**(真实的罕见事件类别不平衡)
- 25 家 provider (5%) 被设定为高风险欺诈集群
- 理赔金额:均值 $2,816.60,中位数 $2,719.10,最大值 $16,074.82
## 🛠️ 技术栈
| 层级 | 工具 |
|---|---|
| 数据生成 | Python, NumPy, Pandas |
| SQL 分析 | SQLite, 窗口函数, CTE |
| 特征工程 | Pandas, NumPy |
| 机器学习 | scikit-learn (Random Forest, 类别平衡) |
| 仪表板 | Power BI |
## 🔄 Pipeline
```
01_generate_data.py → healthcare_claims.csv (100,400 rows)
│
02_sql_analysis.py → provider risk ranking, duplicate detection,
monthly fraud trend, payer risk rank
│
03_model_training.py → feature engineering, Random Forest training,
evaluation, claims_with_predictions_for_powerbi.csv
│
Power BI Dashboard → built on the predictions-scored CSV
```
## 🧮 SQL 分析 (`02_sql_analysis.py`)
在 SQLite 中执行的四个查询,涵盖了核心的支付合规性问题:
**1. Provider 风险排名(CTE + 聚合)** — 理赔量 ≥50 的 provider,按欺诈率排名:
```
WITH provider_stats AS (
SELECT
provider_id,
COUNT(*) AS total_claims,
SUM(is_fraud) AS fraud_claims,
ROUND(AVG(claim_amount), 2) AS avg_claim_amount,
ROUND(100.0 * SUM(is_fraud) / COUNT(*), 2) AS fraud_rate_pct
FROM claims
GROUP BY provider_id
HAVING total_claims >= 50
)
SELECT * FROM provider_stats ORDER BY fraud_rate_pct DESC LIMIT 10;
```
排名最高的结果:`PRV0111` — 239 条理赔,**66.11% 欺诈率**,平均理赔金额 $6,280。
**2. 同日重复计费检测** — 在患者 + provider + 服务日期 + 手术项目上进行 `GROUP BY`,并使用 `HAVING COUNT(*) > 1`。
**3. 带有 3 个月滚动平均值的月度欺诈率趋势(窗口函数):**
```
ROUND(AVG(fraud_rate_pct) OVER (
ORDER BY claim_month
ROWS BETWEEN 2 PRECEDING AND CURRENT ROW
), 2) AS rolling_3mo_avg_fraud_rate
```
欺诈率在 25 个月内(2024 年 1 月 – 2026 年 1 月)稳定在 3.4%–4.1% 之间,没有失控的增长趋势 —— 这与合成生成逻辑保持一致。
**4. 使用 `RANK()` 的支付方类型风险排名** — Private Insurance 的欺诈率最高 (3.75%),Self-Pay 最低 (3.65%) —— 差距很小,表明该数据集中的欺诈更多是由 *provider* 行为而非支付方类型驱动的。
## 🧠 特征工程 (`03_model_training.py`)
仅靠原始字段无法很好地分离欺诈行为 —— 特征编码了*相对*上下文,而不是绝对数值:
| 特征 | 重要性 |
|---|---|
| `provider_hist_fraud_rate` | Provider 自身的历史欺诈率(最强的预测因子) |
| `claim_amount_zscore` | **按手术代码**标准化的理赔金额 —— 用于捕获相对于该特定手术正常成本的过度计费行为,而非全局阈值 |
| `days_to_submit` | 服务日期与理赔提交之间的间隔 |
| `is_weekend_submission` | 周末提交模式 |
| `is_duplicate_flag`, `is_high_risk_provider` | 直接风险信号 |
分类字段(`payer_type`, `claim_status`)经过标签编码,用于基于树的模型。
## 🤖 模型 — Random Forest (类别平衡)
```
RandomForestClassifier(
n_estimators=200, max_depth=10, min_samples_leaf=5,
class_weight="balanced", random_state=42, n_jobs=-1
)
```
之所以特别使用 `class_weight="balanced"`,是因为欺诈数据仅占数据总量的 3.70% —— 未加权模型会默认预测“非欺诈”,并且在表面上看起来依然准确。
### 实际结果(80/20 分层抽样,测试集)
| 指标 | 得分 |
|---|---|
| 准确率 | 97.37% |
| 精确率 | 58.92% |
| **召回率 (欺诈类)** | **95.15%** |
| F1 分数 | 72.77% |
| ROC-AUC | 98.93% |
**混淆矩阵:**
| | 预测:非欺诈 | 预测:欺诈 |
|---|---|---|
| **实际:非欺诈** | 18,844 | 493 |
| **实际:欺诈** | 36 | 707 |
**特征重要性:**
| 特征 | 重要性 |
|---|---|
| `provider_hist_fraud_rate` | 31.2% |
| `is_high_risk_provider` | 30.2% |
| `claim_amount_zscore` | 20.8% |
| `claim_amount` | 8.6% |
| `is_duplicate_flag` | 7.3% |
| `claim_status_enc` | 1.1% |
| `days_to_submit` | 0.4% |
| `payer_type_enc` | 0.2% |
| `is_weekend_submission` | 0.1% |
Provider 级别的行为(历史欺诈率 + 高风险标志)合计驱动了模型超过 60% 的决策 —— 这进一步印证了该数据集中的欺诈集中在*谁*在计费,而不仅仅是计费了*什么*。
## 📊 Power BI 仪表板
`claims_with_predictions_for_powerbi.csv` — 包含每条理赔预测概率 `predicted_fraud_prob` 的完整理赔数据集,可直接在 Power BI 中进行连接。仪表板页面:
- **概述** — 总理赔数、标记理赔率、总风险价值
- **Provider 风险** — 按 provider 排列的欺诈率排名,下钻至具体理赔
- **趋势** — 带有 3 个月滚动平均值的月度欺诈率
## 📁 项目结构
```
├── 01_generate_data.py # Synthetic claims data generator
├── 02_sql_analysis.py # SQL payment-integrity queries (SQLite)
├── 03_model_training.py # Feature engineering + Random Forest
├── healthcare_claims.csv # Raw generated dataset (100,400 rows)
├── claims_with_predictions_for_powerbi.csv # Scored dataset for Power BI
├── fraud_model.pkl # Trained model
├── feature_importances.csv
├── sql_output_*.csv # Saved query results
└── dashboard/
└── claims_fraud_dashboard.pbix
```
## 🚀 如何运行
```
pip install -r requirements.txt
python 01_generate_data.py # generates healthcare_claims.csv
python 02_sql_analysis.py # runs SQL analysis, saves sql_output_*.csv
python 03_model_training.py # trains model, saves predictions CSV
```
在 Power BI Desktop 中打开 `dashboard/claims_fraud_dashboard.pbix`,并将其指向 `claims_with_predictions_for_powerbi.csv`。
## ⚠️ 局限性与未来工作
- **合成标签:** 欺诈是通过嵌入规则模拟的,而非经过确认的调查 —— 实际部署时需要根据真实的特别调查组 (SIU) / 审计结果重新训练。
- **精确率权衡:** 在 58.92% 的精确率下,大约十分之四被标记的理赔是误报 —— 生产系统会根据实际的审核人员处理能力调整决策阈值,而不是使用默认的 0.5 截止值。
- **冷启动 provider:** 对于没有历史记录的全新 provider,`provider_hist_fraud_rate`(首要特征)是不可靠的 —— 将需要一个同类群体备用方案。
- **模型比较:** 仅对 Random Forest 进行了基准测试;XGBoost/LightGBM 的比较是顺理成章的下一步。
## 👤 作者
**Devathapally Umakarthikeya**
数据分析师 | Python | SQL | Power BI
[作品集](https://umakarthikeya.online) · [LinkedIn](https://linkedin.com/in/umakarthikeya) · [GitHub](https://github.com/devthapallykarthikgoud)
标签:Apex, Power BI, SQL, 代码示例, 医疗保险理赔, 反欺诈, 多线程, 数据分析, 机器学习, 系统审计, 逆向工具