【PostgreSQL数据分析实战:从数据清洗到可视化全流程】金融风控分析案例-10.3 风险指标可视化监控
👉 点击关注不迷路
👉 点击关注不迷路
👉 点击关注不迷路
文章大纲
- PostgreSQL金融风控分析之风险指标可视化监控实战
- 一、引言
- 二、案例背景
- 三、数据准备
- (一)数据来源与字段说明
- (二)数据清洗
- 四、风险指标计算
- (一)逾期率计算
- (二)不良贷款率计算
- (三)客户信用评分分布
- 五、风险指标可视化
- (一)可视化工具选择
- (二)可视化图表设计
- (三)仪表盘搭建
- 六、结论与建议
- (一)结论
- (二)建议
PostgreSQL金融风控分析之风险指标可视化监控实战
一、引言
在金融领域,风险控制是核心环节之一。
- 准确、及时地监控风险指标,对于金融机构做出明智决策、降低潜在损失至关重要。
- PostgreSQL作为一款强大的开源关系型数据库,具备高效的数据存储、处理和分析能力,能够为金融风控分析提供坚实的数据基础。
- 本文将结合实际案例,详细阐述如何
利用PostgreSQL进行金融风控分析中的风险指标可视化监控
,从数据清洗到可视化展示的全流程。
二、案例背景
某商业银行面临着日益复杂的金融风险环境,需要对贷款业务的风险进行全面监控。
- 该银行拥有大量的
客户数据、贷款数据、还款记录等,数据存储在PostgreSQL数据库中
。 - 我们的目标是通过对这些数据的分析,提取关键的风险指标,并进行可视化展示,以便管理层和风控人员能够直观地了解风险状况,及时采取应对措施。
三、数据准备
(一)数据来源与字段说明
数据主要来源于银行的贷款业务系统,包括以下几个关键表:
-
- 客户信息表(customer_info):包含客户ID(customer_id)、姓名(customer_name)、年龄(age)、性别(gender)、职业(occupation)、信用评级(credit_rating)等字段。
-
- 贷款申请表(loan_application):包含贷款申请ID(application_id)、客户ID(customer_id)、贷款金额(loan_amount)、贷款期限(loan_term)、申请日期(application_date)、贷款类型(loan_type)等字段。
-
- 还款记录表(repayment_record):包含还款记录ID(record_id)、贷款申请ID(application_id)、还款日期(repayment_date)、应还金额(due_amount)、实际还款金额(actual_repayment_amount)、是否逾期(is_overdue)等字段。
- 建表语句及测试数据构造
-- 创建客户信息表 CREATE TABLE IF NOT EXISTS customer_info (customer_id SERIAL PRIMARY KEY,customer_name VARCHAR(50) NOT NULL,age SMALLINT CHECK (age BETWEEN 18 AND 70),gender VARCHAR(1) CHECK (gender IN ('M', 'F')),occupation VARCHAR(30),credit_rating VARCHAR(10) CHECK (credit_rating IN ('优秀', '良好', '中等', '较差')) );-- 创建贷款申请表 CREATE TABLE IF NOT EXISTS loan_application (application_id SERIAL PRIMARY KEY,customer_id INT NOT NULL REFERENCES customer_info(customer_id),loan_amount DECIMAL(12,2) CHECK (loan_amount > 0),loan_term SMALLINT CHECK (loan_term BETWEEN 6 AND 120), -- 贷款期限(月)application_date DATE,loan_type VARCHAR(10) CHECK (loan_type IN ('信用贷款', '抵押贷款', '担保贷款')) );-- 创建还款记录表(修正:添加due_date应还日期字段) CREATE TABLE IF NOT EXISTS repayment_record (record_id SERIAL PRIMARY KEY,application_id INT NOT NULL REFERENCES loan_application(application_id),due_date DATE NOT NULL, -- 新增:应还日期(关键字段)repayment_date DATE, -- 实际还款日期due_amount DECIMAL(12,2) CHECK (due_amount > 0), -- 应还金额actual_repayment_amount DECIMAL(12,2) CHECK (actual_repayment_amount >= 0), -- 实际还款金额is_overdue BOOLEAN -- 是否逾期(实际还款日期 > 应还日期) );-- 插入100条客户信息(使用随机函数生成) INSERT INTO customer_info (customer_name, age, gender, occupation, credit_rating) SELECT '客户' || g.id,floor(random() * 53 + 18)::SMALLINT, -- 18-70岁随机CASE WHEN random() > 0.5 THEN 'M' ELSE 'F' END,(ARRAY['教师','医生','程序员','公务员','自由职业','企业主','设计师','销售','工程师','学生'])[floor(random()*10)+1],(ARRAY['优秀','良好','中等','较差'])[floor(random()*4)+1] FROM generate_series(1,100) AS g(id);-- 插入300条贷款申请记录(每个客户1-3条) INSERT INTO loan_application (customer_id, loan_amount, loan_term, application_date, loan_type) SELECT (random() * 100 + 1)::INT, -- 随机关联客户ID(1-100)floor(random() * 495000 + 5000)::DECIMAL(12,2), -- 5000-500000元随机金额floor(random() * 115 + 6)::SMALLINT, -- 6-120期随机期限(current_date - (random() * 1825)::INT)::DATE, -- 最近5年随机申请日期(1825天≈5年)(ARRAY['信用贷款','抵押贷款','担保贷款'])[floor(random()*3)+1] FROM generate_series(1,300);-- 还款记录表数据(修正:通过子查询解决别名引用) INSERT INTO repayment_record (application_id, due_date, repayment_date, due_amount, actual_repayment_amount, is_overdue) WITH temp_data AS (SELECT la.application_id,la.application_date + (g.id * 30)::INT AS due_date,CASE WHEN random() > 0.3 THEN la.application_date + (g.id * 30)::INT + (random() * 15)::INT -- 30%逾期(+0-15天)ELSE la.application_date + (g.id * 30)::INT - (random() * 5)::INT -- 70%正常(-0-5天)END AS repayment_date,la.monthly_due AS due_amount,CASE WHEN random() > 0.05 THEN la.monthly_due -- 95%正常还款ELSE floor(random() * la.monthly_due)::DECIMAL(12,2) -- 5%部分还款END AS actual_repayment_amountFROM (SELECT application_id,application_date,loan_term,loan_amount / loan_term AS monthly_dueFROM loan_application) laCROSS JOIN generate_series(1,4) AS g(id) ) SELECT application_id,due_date,repayment_date,due_amount,actual_repayment_amount,(repayment_date > due_date) AS is_overdue -- 现在可以安全引用repayment_date别名 FROM temp_data LIMIT 1200;
(二)数据清洗
-
- 缺失值处理:通过SQL查询检查各表中的缺失值情况。
- 对于客户信息表中的信用评级字段,若存在缺失值,根据客户的其他信息(如职业、收入等)进行合理填充,或者将其标记为未知类别。
- 对于贷款申请表中的贷款期限字段,若存在缺失值,由于该字段是关键信息,无法通过其他字段推断,因此删除相应的缺失记录。
-- 检查客户信息表信用评级缺失值
SELECT COUNT(*) FROM customer_info WHERE credit_rating IS NULL;-- 填充信用评级缺失值(示例,实际需根据业务规则)
UPDATE customer_info SET credit_rating = 'medium' WHERE credit_rating IS NULL AND occupation = 'employee';-- 删除贷款申请表中贷款期限缺失的记录
DELETE FROM loan_application WHERE loan_term IS NULL;
-
- 异常值处理:对于贷款金额字段,通过统计分析确定合理的范围,将明显超出正常范围的异常值视为错误数据并进行修正或删除。
- 例如,贷款金额不能为负数,若存在负数记录,检查是否为输入错误,若是则进行修正,否则删除。
-- 检查贷款金额异常值(负数)
SELECT * FROM loan_application WHERE loan_amount < 0;-- 删除贷款金额为负数的异常记录
DELETE FROM loan_application WHERE loan_amount < 0;
-
- 数据一致性检查:确保各表之间的数据关联正确,例如贷款申请表中的客户ID必须存在于客户信息表中,还款记录表中的贷款申请ID必须存在于贷款申请表中。
- 通过外键约束或SQL查询进行检查,对于不匹配的数据进行修正或删除。
-- 检查贷款申请表中客户ID不存在于客户信息表的记录
SELECT la.* FROM loan_application la LEFT JOIN customer_info ci ON la.customer_id = ci.customer_id WHERE ci.customer_id IS NULL;-- 删除不匹配的贷款申请记录
DELETE FROM loan_application WHERE customer_id NOT IN (SELECT customer_id FROM customer_info);
四、风险指标计算
(一)逾期率计算
逾期率是衡量贷款风险的重要指标之一,它表示逾期还款的贷款占总贷款的比例。
- 计算公式为:
逾期率 = 逾期贷款笔数 / 总贷款笔数 × 100%。
在PostgreSQL中,通过以下SQL语句计算各贷款类型的逾期率:
SELECT loan_type, COUNT(CASE WHEN is_overdue = 'yes' THEN 1 END) AS overdue_loans,COUNT(*) AS total_loans,ROUND(COUNT(CASE WHEN is_overdue = 'yes' THEN 1 END) * 100.0 / COUNT(*), 2) AS overdue_rate
FROM loan_application la
JOIN repayment_record rr ON la.application_id = rr.application_id
GROUP BY loan_type;
计算结果如下表所示:
(二)不良贷款率计算
不良贷款率是指不良贷款(通常指逾期90天以上的贷款)占总贷款的比例。
- 计算公式为:
不良贷款率 = 不良贷款笔数 / 总贷款笔数 × 100%。
首先,需要确定逾期90天以上的贷款记录。
- 通过计算还款日期与应还日期的时间差,判断是否逾期90天以上。
- 在PostgreSQL中,使用
AGE
函数计算时间差:
SELECT rr.record_id, la.application_id, la.loan_type, AGE(rr.repayment_date, due_date) AS days_overdue
FROM repayment_record rr
JOIN loan_application la ON rr.application_id = la.application_id;
- 然后,计算不良贷款率:
SELECT loan_type, COUNT(CASE WHEN days_overdue > '90 days' THEN 1 END) AS bad_loans,COUNT(*) AS total_loans,ROUND(COUNT(CASE WHEN days_overdue > '90 days' THEN 1 END) * 100.0 / COUNT(*), 2) AS bad_loan_rate
FROM (SELECT rr.record_id, la.application_id, la.loan_type, AGE(rr.repayment_date, due_date) AS days_overdueFROM repayment_record rrJOIN loan_application la ON rr.application_id = la.application_id
) AS subquery
GROUP BY loan_type;
计算结果如下表所示:
(三)客户信用评分分布
客户信用评级是评估客户信用风险的重要依据。
- 通过统计不同信用评级的客户数量及其占比,了解客户的信用状况分布。
SELECT credit_rating, COUNT(*) AS customer_count,ROUND(COUNT(*) * 100.0 / (SELECT COUNT(*) FROM customer_info), 2) AS percentage
FROM customer_info
GROUP BY credit_rating
ORDER BY credit_rating;
结果如下表:
五、风险指标可视化
(一)可视化工具选择
为了实现风险指标的可视化监控,我们选择使用Tableau作为可视化工具。
- Tableau具有强大的数据可视化能力,能够快速将PostgreSQL中的数据转化为直观、交互式的图表和仪表盘,方便用户进行数据分析和监控。
(二)可视化图表设计
-
- 逾期率对比柱状图:以
贷款类型为横轴,逾期率为纵轴,绘制柱状图
,直观展示不同贷款类型的逾期率差异。
- 通过颜色区分不同的贷款类型,使图表更加清晰易读。
- 逾期率对比柱状图:以
-
- 不良贷款率趋势线图:按
时间维度(如月份)统计不良贷款率,绘制趋势线图
,观察不良贷款率的变化趋势。
- 可以设置预警线,当不良贷款率超过预警线时,发出警示信号。
- 不良贷款率趋势线图:按
-
- 客户信用评分饼图:
以信用评级为分类,绘制饼图,展示不同信用评级客户的占比情况
。
- 通过标签显示具体的占比数据,方便用户快速了解客户信用分布。
- 客户信用评分饼图:
(三)仪表盘搭建
将上述可视化图表整合到一个仪表盘上,形成风险指标可视化监控界面。
- 仪表盘可以包含筛选器,允许用户根据不同的条件(如时间范围、贷款类型等)进行数据筛选,查看相应的风险指标。
- 同时,设置交互功能,当用户点击某个图表中的数据时,其他相关图表会进行联动更新,以便更深入地分析数据。
六、结论与建议
(一)结论
通过利用PostgreSQL进行金融风控分析中的风险指标可视化监控,我们能够有效地对贷款业务的风险进行评估和监控。
- 从
数据清洗到风险指标计算,再到可视化展示,整个流程实现了数据的高效处理和分析,为金融机构提供了直观、准确的风险信息
。 - 通过对不同贷款类型的逾期率、不良贷款率以及客户信用评分分布的分析,我们可以发现信用贷款的风险相对较高,需要重点关注和加强风控措施。
(二)建议
-
- 针对信用贷款的高风险特点,进一步优化信用评估模型,加强对信用评级较低客户的审核和监控,提高信用贷款的准入门槛。
-
定期更新和维护风险指标可视化仪表盘,确保数据的及时性和准确性
。同时,根据业务需求和市场变化,不断优化可视化图表和指标体系,提高监控的有效性。
-
- 结合其他数据分析方法和技术,如
机器学习算法,对客户的信用风险进行更精准的预测和评估
,为风险控制提供更科学的依据。
- 结合其他数据分析方法和技术,如
通过以上实战案例,我们展示了如何利用PostgreSQL和Tableau实现金融风控分析中的风险指标可视化监控。
- 这一流程不仅适用于商业银行的贷款业务风险监控,也可以为其他金融领域的风险分析提供参考和借鉴。
- 在实际应用中,需要根据具体的业务需求和数据特点,灵活调整分析方法和可视化方案,以实现更好的风险控制效果。
以上是完整的金融风控分析案例中风险指标可视化监控内容。
- 你可以和我说说对文章内容、结构等方面的看法,若有其他修改或补充需求,也请告知我。
相关文章:

【PostgreSQL数据分析实战:从数据清洗到可视化全流程】金融风控分析案例-10.3 风险指标可视化监控
👉 点击关注不迷路 👉 点击关注不迷路 👉 点击关注不迷路 文章大纲 PostgreSQL金融风控分析之风险指标可视化监控实战一、引言二、案例背景三、数据准备(一)数据来源与字段说明(二)数据清洗 四、…...
数学复习笔记 6
前言 复习一下行列式的一些基本的题。感觉网课有点没跟上了。今天花点时间跟上网课的进度。要紧跟进度,然后剩下的时间再去复习前面的内容。多复习,提升自己的解题能力。 行列式和矩阵 三年级,我现在是三年级下册。。。马上就要结束大学的…...
微服务的“导航系统”:使用Spring Cloud Eureka实现服务注册与发现
在上一篇中,我们理解了微服务架构的核心理念以及Spring Cloud为我们提供的强大工具集。我们提到,微服务架构的一个核心挑战在于,服务实例的网络位置是动态的,服务之间需要一种机制来互相定位。 想象一下,你开了一家新…...

geoserver发布arcgis瓦片地图服务(最新版本)
第一步:下载geoserver服务,进入bin目录启动 需要提前安装好JDK环境,1.8及以上版本 安装完成,页面访问端口,进入控制台界面,默认用户名密码admin/geoserver 第二步:下载地图 破解版全能电子地图下载器&…...

多边形,矩形,长方体设置
在cesium中,我们可以通过既有的库来进行对地图的构建 // 向场景中添加一个几何体(立方体) scene.primitives.add(new Cesium.Primitive({// 定义几何体实例geometryInstances: new Cesium.GeometryInstance({// 使用BoxGeometry.fromDimensions方法创建…...
Spring Boot 框架概述
1. 简介 Spring Boot 是由 Pivotal 团队开发的一个用于简化 Spring 应用开发的框架。它通过提供默认配置、嵌入式服务器和自动配置等特性,让开发者能够更快速地构建独立的、生产级别的 Spring 应用。 Spring Boot 的主要特点包括: 快速创建独立的 Spri…...

(C语言)超市管理系统(测试版)(指针)(数据结构)(二进制文件读写)
目录 前言: 源代码: product.h product.c fileio.h fileio.c main.c 代码解析: fileio模块(文件(二进制)) 写文件(保存) 函数功能 代码逐行解析 关键知识点 读文…...
React百日学习计划-Grok3
关键点 研究表明,100天内学习React是可行的,尤其是你已有HTML、JS和CSS基础。该计划包括基础知识、hooks、状态管理、路由、样式化及综合项目,适合初学者。建议每天花2-3小时学习,结合免费教程和社区支持。 开始学习 学习React…...
一文辨析Java基本数据类型与包装类
Java 基本数据类型与包装类深度解析 前言一、Java 基本数据类型详解1.1 数值型1.1.1 整型1.1.2 浮点型 1.2 字符型1.3 布尔型 二、Java 包装类详解2.1 包装类与基本数据类型的对应关系2.2 包装类的常用方法 三、基本数据类型与包装类的转换3.1 装箱(Boxingÿ…...
Java游戏服务器开发流水账(3)游戏数据的缓存简介
简介 游戏服务器数据缓存是一种在游戏服务器运行过程中,用于临时存储经常访问的数据的技术手段,旨在提高游戏性能、降低数据库负载以及优化玩家体验。游戏开发中数据的缓存可以使用Java自身的内存也可以使用MemCache,Redis,注意M…...
SiLM59xx系列:高可靠性隔离驱动架构在新能源与工业电源中的关键设计解析
SiLM59xx系列产品选型: SiLM5932SHOCG-DG SiLM5992SHCG-DG SiLM5991SHCG-DG SiLM5932SHOCG-AQ SiLM5992SHCG-AQ SiLM5991SHCG-AQ 一、高功率密度驱动的核心挑战与解决方案 高压场景下的驱动需求 在新能源汽车主逆变器、光伏逆变器及工业电机控制…...

nRF Connect 下载
官方下载路径 点击,或往下拉 选对应的版本 下载成功,数字代表版本好...

基于Arduino的贪吃蛇游戏机
3D 打印迷你贪吃蛇游戏机: 在数字娱乐高度发达的今天,我们常常怀念那些经典的复古游戏。其中,贪吃蛇游戏无疑是许多人童年的记忆。今天,我将带你走进一个有趣的 DIY 项目——3D 打印迷你贪吃蛇游戏机。这个项目不仅能够让你重温经…...
talk-linux 不同用户之间终端通信
好的!下面是一个完整的指南和脚本,用于在两台 Linux 主机上配置并使用 talk 聊天功能(假设它们在同一个局域网内)。 ⸻ 🧾 一、需求说明 我们需要在两台主机上: 1. 安装 talk 和 talkd 2. 启用 talkd 服…...

【PmHub后端篇】Redis分布式锁:保障PmHub流程状态更新的关键
在分布式系统中,确保数据一致性和操作的正确执行是至关重要的。PmHub项目中,通过集成Redis分布式锁来保障流程状态更新,这是一个非常关键的技术点,以下将详细介绍其原理、实现。 1 本地锁的问题 1.1 常见的本地锁 在Java中&…...
MySQL基础入门:MySQL简介与环境搭建
引言 在数字化转型浪潮中,MySQL作为数据存储的"基石引擎",支撑着从电商交易到金融风控的各类核心业务。其高并发处理能力、灵活的架构设计及跨平台兼容性,使其成为开发者技术栈中的"常青树"。本章节将通过历史溯源、技术…...
力扣-543.二叉树的直径
题目描述 给你一棵二叉树的根节点,返回该树的 直径 。 二叉树的 直径 是指树中任意两个节点之间最长路径的 长度 。这条路径可能经过也可能不经过根节点 root 。 两节点之间路径的 长度 由它们之间边数表示。 class Solution { public:int maxLength(TreeNode *…...

Starrocks的主键表涉及到的MOR Delete+Insert更新策略
背景 写这个文章的作用主要是做一些总结和梳理,特别是正对大数据场景下的实时写入更新策略 COW 和 MOR 以及 DeleteInsert 的技术策略的演进, 这也适用于其他大数据的计算存储系统。该文章主要参考了Primary Key table. 分析总结 Starrocks 的主键表主…...

《操作系统真象还原》第十四章(2)——文件描述符、文件操作基础函数
文章目录 前言文件描述符简介文件描述符原理文件描述符实现修改thread.h修改thread.c 文件操作相关的基础函数inode操作相关函数文件相关函数编写file.h编写file.c 目录相关函数完善fs/dir.h编写fs/dir.c 路径解析相关函数实现文件检索功能修改fs.h继续完善fs.c makefile 结语 …...

EMQX v5.0通过连接器和规则同步数据
1 概述 EMQX数据集成功能,帮助用户将所有的业务数据无需额外编写代码即可快速完成处理与分发。 数据集成能力由连接器和规则两部分组成,用户可以使用数据桥接或 MQTT 主题来接入数据,使用规则处理数据后,再通过数据桥接将数据发…...

2. 盒模型/布局模块 - 响应式产品展示页_案例:电商产品网格布局
2. 盒模型/布局模块 - 响应式产品展示页 案例:电商产品网格布局 <!DOCTYPE html> <html><head><meta charset"utf-8"><title></title></head><style type"text/css">:root {--primary-color…...

LVGL的三层屏幕结构
文章目录 🌟 LVGL 的三层屏幕架构1. **Top Layer(顶层)**2. **System Layer(系统层)**3. **Active Screen(当前屏幕层)** 🧠 总结对比🔍 整体作用✅ 普通屏幕层对象&…...

【PDF】使用Adobe Acrobat dc添加水印和加密
【PDF】使用Adobe Acrobat dc添加水印和加密 文章目录 [TOC](文章目录) 前言一、添加保护加密口令二、添加水印三、实验四、参考文章总结 实验工具: 1.Adobe Acrobat dc 前言 提示:以下是本篇文章正文内容,下面案例可供参考 一、添加保护加…...
AI 搜索引擎 MindSearch
背景 RAG是一种利用文档减少大模型的幻觉,AI搜索也是 AI 搜索引擎 MindSearch 是一个开源的 AI 搜索引擎框架,具有与 Perplexity.ai Pro 相同的性能。您可以轻松部署它来构建您自己的搜索引擎,可以使用闭源 LLM(如 GPT、Claude…...

Windows下安装mysql8.0
一、下载安装离线安装包 (下载过了,可以跳过) 下载网站:MySQL :: Download MySQL Installerhttps://dev.mysql.com/downloads/installer/ 二、安装mysql 三、安装完成验证...
【android bluetooth 框架分析 02】【Module详解 7】【VendorSpecificEventManager 模块介绍】
1. 背景 我们在 gd_shim_module 介绍章节中,看到 我们将 VendorSpecificEventManager 模块加入到了 modules 中。 // system/main/shim/stack.cc modules.add<hci::VendorSpecificEventManager>();在 ModuleRegistry::Start 函数中我们对 加入的所有 module…...

水滴Android面经及参考答案
static 关键字有什么作用,它修饰的方法可以使用非静态的成员变量吗? static关键字在 Java 中有多种作用。首先,它可以用来修饰变量,被static修饰的变量称为静态变量。静态变量属于类,而不属于类的某个具体实例…...

工程师必读! 3 个最常被忽略的 TDR 测试关键细节与原理
TDR真的是一个用来看阻抗跟Delay的好工具,通过一个Port的测试就可以看到通道各个位置的阻抗变化。 可是使用上其实没这么单纯,有很多细节需要非常地小心,才可以真正地看到您想看的信息! 就让我们整理3个极为重要的TDR使用小细节&…...

C++中的各式类型转换
隐式转换: 基本类型的隐式转换: 当函数参数类型非精确匹配,但是可以转换的时候发生 如: void func1(double x){cout << x << endl; }void func2(char c){cout << c << endl; }int main(){func1(2);//…...
2025年阿里云ACP人工智能高级工程师认证模拟试题(附答案解析)
这篇文章的内容是阿里云ACP人工智能高级工程师认证考试的模拟试题。 所有模拟试题由AI自动生成,主要为了练习和巩固知识,并非所谓的 “题库”,考试中如果出现同样试题那真是纯属巧合。 1、在PAl-Studio实验运行完毕后,可以右键单…...