sharia143/invoice-anomaly-detection-uk

GitHub: sharia143/invoice-anomaly-detection-uk

一个结合 Python 规则校验与 Isolation Forest 的发票异常检测 pipeline,用于自动发现车队计费中的编码错误、重复条目和统计离群值,并通过 Power BI 仪表板进行可视化审查。

Stars: 0 | Forks: 0

# 英国发票异常检测 **一个可复现的 Python + Power BI pipeline,用于找出悄悄破坏领导层报告的发票错误。** 本项目作为英国车队、保险替代车辆及 Motability 风格计费环境下的 MI / 数据分析师职位的作品集而构建——在这些场景中,发票来自多个数据源,明细项目可能被错误编码,而单一的日期格式错误可能会悄无声息地导致季度对账出现偏差。 ## 核心结果 - **合成数据集:** 5,020 份英国格式发票,包含约 5% 的植入异常 - **Pipeline 召回率:** 在植入异常上达到 **93.9%** - **技术栈:** Python (Pandas, scikit-learn Isolation Forest) + 基于规则的验证 + Power BI 仪表板 ## 项目初衷 在商业 MI 工作中,同样的问题会在各个行业中反复出现: - **错误编码的明细项目** — 错误的 VAT 税率、错误的类别、错误的成本代码 - **重复条目** — 相同的车辆、相同的客户、相同的周期,被计费两次 - **异常值费用** — 损坏 / 里程 / 超额费用远超类别常态 - **日期重叠** — 不同车辆间的租赁周期出现不可能的重叠 - **VAT 完整性中断** — 小计 × 0.20 ≠ 记录的 VAT 金额 这些问题大多是被人工发现的,不仅发现得晚,而且往往是在它们已经影响到客户咨询或董事会汇报之后才被察觉。本项目展示了一种端到端的自动化方法:使用基于规则的验证进行确定性检查,并使用 Isolation Forest (`scikit-learn`) 进行统计异常值检查,最终输出为可加载到 Power BI 中进行审查和筛选的 CSV 文件。 ## 文件 ``` README.md — This file requirements.txt — Python dependencies .gitignore — Excludes __pycache__, .pbix, etc. generate_synthetic_invoices.py — Generates the 5,020-row UK invoice dataset invoices_uk_synthetic.csv — Generated dataset (committed for reviewers) data_validation.py — Rule-based validation layer (5 deterministic checks) anomaly_model.py — Isolation Forest wrapper run_pipeline.py — End-to-end orchestration flagged_invoices.csv — Pipeline output (committed for reviewers) invoice_anomaly_detection.ipynb — Walkthrough notebook powerbi_dashboard_design.md — Dashboard layout + DAX measures ``` 扁平化布局 — 每个文件都位于仓库根目录,因此无需设置任何路径即可直接开箱即用运行 pipeline。 ## 运行方式 ``` # 1. 安装依赖 pip install -r requirements.txt # 2. 生成 synthetic dataset python generate_synthetic_invoices.py # 3. 运行 end-to-end pipeline python run_pipeline.py # 输出:flagged_invoices.csv — 每个带有异常标志和 reason codes 的发票 ``` ## 数据集概览 | 字段 | 类型 | 示例 | |---|---|---| | `invoice_id` | string | `INV-2026-00042` | | `customer_id` | string | `CUST-1042` | | `insurer_code` | string | `INS-MOT-01` (Motability), `INS-AVI-02` (Aviva) 等 | | `vehicle_reg` | string | `LV21 KFD` | | `vehicle_type` | string | `Standard`, `Adapted-Wheelchair`, `Adapted-HandControls`, `Specialist-Larger`, `Specialist-LWB` | | `hire_start_date` | date | `2026-03-12` | | `hire_end_date` | date | `2026-03-19` | | `days_hired` | int | `7` | | `daily_rate_gbp` | float | `42.50` | | `mileage_charge_gbp` | float | `18.20` | | `damage_charge_gbp` | float | `0.00` | | `subtotal_gbp` | float | `315.70` | | `vat_rate` | float | `0.20` | | `vat_amount_gbp` | float | `63.14` | | `total_gbp` | float | `378.84` | | `invoice_date` | date | `2026-03-20` | | `is_seeded_anomaly` | bool | 真实标签 (Ground-truth flag) | ## Pipeline 检测内容 ### 规则层(确定性) 1. **VAT 完整性中断** — `subtotal × 0.20` 与 `vat_amount` 的偏差超过 £0.05 2. **重复发票** — 具有相同的 `vehicle_reg + customer_id + hire_start_date` 3. **日期合理性中断** — `hire_end_date ≤ hire_start_date` 或 `days_hired ≠ (end − start)` 4. **缺失必填字段** — 关键列中存在任何空值 5. **总额不匹配** — `total_gbp` 与 `subtotal + vat` 的偏差超过 £0.05 ### 统计层(Isolation Forest) - 在数值特征上进行训练:`days_hired`, `daily_rate_gbp`, `mileage_charge_gbp`, `damage_charge_gbp`, `subtotal_gbp`, `total_gbp` - `contamination=0.05` — 假设约 5% 的发票为异常 - 为每份发票输出 `anomaly_score` 和二元的 `is_outlier` 标记 - 捕捉在所有规则通过的情况下,相对于类别基线仍然显得异常的费用 ### 组合输出 每份发票都会获得一个 `review_status`,值为 `OK`、`RULE_FLAG`、`STATISTICAL_FLAG` 或 `BOTH`,外加一个 `flag_reason` 文本字段,列出了触发了哪些检查。这就是 Power BI 要使用的数据。 ## Power BI 仪表板 请参阅 `powerbi_dashboard_design.md` 了解仪表板结构: - 按原因划分的异常计数(卡片 + 条形图) - 随时间变化的异常情况(折线图) - 前 20 个被标记的发票(钻取表) - 按保险公司 / 车辆类型划分的明细 - 包含 DAX 度量值 `.pbix` 文件是在本地针对 `flagged_invoices.csv` 构建的,未提交到仓库中(因为它是一个大型二进制文件)。 ## 技术栈 - **Python 3.10+** (Pandas, NumPy, scikit-learn, Faker) - **Power BI Desktop** 用于审查仪表板 - **DAX** 用于 KPI 度量 - **Git / GitHub** 用于版本控制 ## 局限性与后续步骤 - 使用**合成数据** — 模式是真实的,但并非提取自真实的车队账单 - 规则阈值(`£0.05`, `5% contamination`)可根据业务场景进行调优 - 真实的生产环境部署会增加:源系统连接器、告警(电子邮件 / Teams webhook)、反馈循环(分析师标记假阳性),以及针对验证规则的单元测试 ## 关于作者 由 **Sharia Alam** 构建 — 数据科学硕士毕业生(预期优异,曼彻斯特城市大学),获得 Microsoft PL-300 Power BI Data Analyst Associate 认证。现居 Chester。正在寻找 MI / BI / 数据分析师职位的机会。 - LinkedIn: [linkedin.com/in/sharia-alam](https://linkedin.com/in/sharia-alam) - Email: sharia.alam@outlook.com
标签:Isolation Forest, Power BI, Python, 代码示例, 发票审计, 异常检测, 数据分析, 无后门, 逆向工具