kharatatva/BankIQ-SQL

GitHub: kharatatva/BankIQ-SQL

一个基于 MySQL 的零售银行数据分析作品集项目,包含 12 表数据库设计、40 道 SQL 查询、多规则欺诈检测引擎及 Python EDA 可视化分析。

Stars: 0 | Forks: 0

# 🏦 BankIQ — 银行分析 SQL 项目 **一个构建在 12 表零售银行数据库之上的生产级 SQL 作品集项目** `MySQL 8.0+`  |  `Python 3.10+`  |  `Pandas`  |  `Matplotlib`  |  `Seaborn`  |  `状态:已完成 ✅`
## 📌 项目概述 BankIQ 模拟了一家中等规模零售银行的内部分析数据库,业务覆盖**印度 134 个城市**。 完全从零开始构建 —— 包含 schema 设计、逼真的数据生成,以及 40 个循序渐进的 SQL 查询, 还原了真实银行分析师、合规团队和欺诈团队日常编写的分析代码。 | 指标 | 数值 | |---|---| | 总客户数 | 150–500(通过 Faker 生成) | | 总交易笔数 | 6,169 | | 总处理交易额 | ₹16.82 Crore | | 覆盖城市数 | 134 | | 活跃贷款数 | 85 | | 不良贷款率 | 14.2% | | 平均交易额 | ₹27,269 | ## 🗂️ 仓库结构 ``` BankIQ/ │ ├── README.md ← You are here ├── FINDINGS.md ← Analyst findings report with real insights ├── .env.example ← Example env file for generate_data connection with database ├── 01_schema.sql ← CREATE TABLE for all 12 tables with constraints ├── 02_seed_data.sql ← Original seed data (30 customers, 60 transactions) ├── 03_queries.sql ← 40 SQL tasks across 7 progressive phases ├── 04_analysis.ipynb ← EDA notebook with 6 analytical charts └── scripts/ └── generate_data.py ← Faker script — generates realistic banking data ``` ## 🗃️ 数据库设计 — 12 张表 | 表名 | 描述 | |---|---| | `branches` | 分布在孟买、德里、班加罗尔、钦奈和加尔各答的 6 个实体分支机构 | | `employees` | 员工 —— 包括经理、分析师、信贷员、柜员和合规人员 | | `customers` | 具有KYC状态和CIBIL信用评分的个人和企业客户 | | `accounts` | 储蓄账户、活期账户、工资账户、定期存款和零存整取账户 | | `transactions` | 2024 年发生的 UPI、NEFT、RTGS、IMPS、ATM 和自动扣款交易 | | `loans` | 房贷、车贷、个人贷款、商业贷款、教育贷款和黄金贷款产品 | | `loan_repayments` | EMI还款记录,包含漏缴、拒付和部分付款记录 | | `cards` | 涵盖 Visa、Mastercard 和 RuPay 网络的借记卡和信用卡 | | `fixed_deposits` | 包含到期日和派息配置的定期存款(FD)明细记录 | | `kyc_documents` | 每位客户的 PAN、Aadhaar、护照和选民身份证文件 | | `fraud_alerts` | 由多规则欺诈检测引擎触发的警报标记 | | `interest_postings` | 每季度计入储蓄账户和存款账户的利息 | ## 🔗 实体关系概览 ``` branches ──< employees ──< customers ──< accounts ──< transactions ──< loans ──< loan_repayments ──< cards ──< kyc_documents accounts ──< fixed_deposits accounts ──< interest_postings loans ──< fraud_alerts ``` ## 📋 查询覆盖范围 — 涵盖 7 个阶段的 40 项任务 | 阶段 | 任务 | 涉及技能 | |---|---|---| | 阶段 1 — Schema 与预热 | 1–8 | DDL、ALTER TABLE、基础 SELECT、WHERE、ORDER BY、简单 JOIN | | 阶段 2 — 多表 JOIN | 9–16 | INNER JOIN、LEFT JOIN、反连接模式、4 表 JOIN | | 阶段 3 — 聚合与子查询 | 17–26 | 标量子查询、相关子查询、CASE WHEN、HAVING、日期运算 | | 阶段 4 — CTE | 27–31 | WITH 子句、链式 CTE、客户健康评分、薪资差异分析 | | 阶段 5 — 窗口函数 | 32–38 | RANK、DENSE_RANK、PERCENT_RANK、LAG、累计求和、移动平均值 | | 阶段 6 — 欺诈检测 | 39 | 自连接时间窗口、UNION ALL、MOD、EXTRACT、多规则引擎 | | 阶段 7 — 顶点视图 | 40 | 由 3 个链式 CTE 支撑的 CREATE VIEW,高管仪表盘 | ## ⭐ 项目亮点 ### 🔍 客户健康评分(任务 27) 基于 CTE 的评分系统,根据 KYC 验证状态、漏缴 EMI 次数和账户总余额,对每位客户进行 **A / B / C** 分级。 这与真实银行 CRM 系统中用于营销定位和风险细分的逻辑完全一致。 ### 🚨 多规则欺诈检测引擎(任务 39) 可同时标记匹配以下 4 种独立欺诈模式之一的交易: - 快速借记爆发 —— 在 60 分钟的时间窗口内发生超过 3 次借记(自连接) - 金额异常 —— 交易金额超过该账户自身平均借记金额的 3 倍 - 非营业时间活动 —— 午夜至凌晨 04:59 之间的任何交易 - 整数高额交易 —— 金额可被 ₹10,000 整除且超过 ₹50,000 通过 CTE 和 `UNION ALL` 构建,使得单笔交易可以触发多个警报标记。 ### 📊 高管分支机构仪表盘视图(任务 40) 一个由 3 个链式 CTE 支撑的 `CREATE VIEW`,整合了每个分支机构的月度交易流入、 贷款组合规模、不良贷款数量、客户总数以及平均信用评分 —— 所有这些只需一条 `SELECT` 语句即可查询。 ### 📈 探索性数据分析 (04_analysis.ipynb) 基于 Faker 生成的真实数据,使用 Matplotlib 和 Seaborn 构建的六个分析图表: - 月度交易量趋势(2024 年) - 按总存款额比较各分支机构的业绩 - 带有 CIBIL 区间叠加的客户信用评分分布 - 按城市划分的贷款违约率 - 按借记金额排名的前 5 大消费类别 - 按数量和持有余额划分的账户类型分布 ## 📊 关键发现 - **14.2% 的不良贷款率**(134 笔贷款中有 19 笔违约或成为 NPA)—— 显著高于 3–5% 的行业基准 - **二线城市在信用评分上优于特大城市** —— Tadepalligudem (885)、Kumbakonam (872) 对比孟买 (770)、德里 (777) - **58% 的城市只有 1 位客户** —— 地理集中度风险较高,孟买占据了不成比例的权重 - **平均交易额 ₹27,269** 表明许多客户将 BankIQ 作为辅助银行使用 —— 提高每位客户的交易频率是关键的增长杠杆 ## ⚙️ 设置说明 **环境要求:** MySQL 8.0+ · Python 3.10+ · pip **第 1 步 —— 创建数据库** ``` CREATE DATABASE bank_system; USE bank_system; ``` **第 2 步 —— 创建所有 12 张表** ``` mysql -u root -p bank_system < 01_schema.sql ``` **第 3 步 —— 插入种子数据** ``` mysql -u root -p bank_system < 02_seed_data.sql ``` **第 4 步 —— 生成逼真的数据量(可选,但推荐)** ``` pip install faker mysql-connector-python python scripts/generate_data.py ``` **第 5 步 —— 运行所有 40 个查询** ``` mysql -u root -p bank_system < 03_queries.sql ``` **第 6 步 —— 运行 EDA notebook** ``` pip install pandas sqlalchemy pymysql matplotlib seaborn jupyter jupyter notebook 04_analysis.ipynb ``` ## 🛠️ 展示技能 - 包含主键、外键和 CHECK 约束的关系型 schema 设计 - 处理 `branches` 和 `employees` 表之间的循环外键依赖 - 单个查询中跨越最多 4 张表的多表 JOIN - 使用 `LEFT JOIN + IS NULL` 的反连接模式 - 标量子查询和相关子查询 - 在 `SUM` 和 `COUNT` 中使用 `CASE WHEN` 进行条件聚合 - Common Table Expressions (CTE) —— 简单、链式和多级结构 - 窗口函数 —— `RANK`、`DENSE_RANK`、`PERCENT_RANK`、`LAG`、`FIRST_VALUE` - 使用 `ROWS UNBOUNDED PRECEDING` 计算累计总和 - 使用 `ROWS BETWEEN` 框架子句计算移动平均值 - 基于时间的自连接,用于滑动窗口欺诈检测 - 使用 `CREATE VIEW` 创建可复用的报表层 - 使用 Python + SQLAlchemy 实现数据库连接 - 使用 Pandas、Matplotlib 和 Seaborn 进行探索性数据分析 - 使用 Faker 库生成逼真的模拟数据 ## 📝 简历摘要 ## 👤 作者 **Tatva V. Khara** 印度,古吉拉特邦,瓦皮 (Vapi) kharatatva60@gmail.com
*MySQL 8.0+  |  Python 3.10+  |  领域:零售银行  |  类型:作品集项目* ⭐ 如果您觉得这个项目有用,请考虑给它点个 Star
标签:Python, SQL, 代码示例, 数据分析, 无后门, 系统审计, 金融科技