【PostgreSQL数据分析实战:从数据清洗到可视化全流程】金融风控分析案例-10.3 风险指标可视化监控

👉 点击关注不迷路
👉 点击关注不迷路
👉 点击关注不迷路


文章大纲

  • PostgreSQL金融风控分析之风险指标可视化监控实战
    • 一、引言
    • 二、案例背景
    • 三、数据准备
      • (一)数据来源与字段说明
      • (二)数据清洗
    • 四、风险指标计算
      • (一)逾期率计算
      • (二)不良贷款率计算
      • (三)客户信用评分分布
    • 五、风险指标可视化
      • (一)可视化工具选择
      • (二)可视化图表设计
      • (三)仪表盘搭建
    • 六、结论与建议
      • (一)结论
      • (二)建议

PostgreSQL金融风控分析之风险指标可视化监控实战

一、引言

在金融领域,风险控制是核心环节之一。

  • 准确、及时地监控风险指标,对于金融机构做出明智决策、降低潜在损失至关重要。
  • PostgreSQL作为一款强大的开源关系型数据库,具备高效的数据存储、处理和分析能力,能够为金融风控分析提供坚实的数据基础。
  • 本文将结合实际案例,详细阐述如何利用PostgreSQL进行金融风控分析中的风险指标可视化监控,从数据清洗到可视化展示的全流程。

二、案例背景

某商业银行面临着日益复杂的金融风险环境,需要对贷款业务的风险进行全面监控。

  • 该银行拥有大量的客户数据、贷款数据、还款记录等,数据存储在PostgreSQL数据库中
  • 我们的目标是通过对这些数据的分析,提取关键的风险指标,并进行可视化展示,以便管理层和风控人员能够直观地了解风险状况,及时采取应对措施。

三、数据准备

(一)数据来源与字段说明

数据主要来源于银行的贷款业务系统,包括以下几个关键表:

    1. 客户信息表(customer_info):包含客户ID(customer_id)、姓名(customer_name)、年龄(age)、性别(gender)、职业(occupation)、信用评级(credit_rating)等字段。
    1. 贷款申请表(loan_application):包含贷款申请ID(application_id)、客户ID(customer_id)、贷款金额(loan_amount)、贷款期限(loan_term)、申请日期(application_date)、贷款类型(loan_type)等字段。
    1. 还款记录表(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;
      

(二)数据清洗

    1. 缺失值处理:通过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;
    1. 异常值处理:对于贷款金额字段,通过统计分析确定合理的范围,将明显超出正常范围的异常值视为错误数据并进行修正或删除。
    • 例如,贷款金额不能为负数,若存在负数记录,检查是否为输入错误,若是则进行修正,否则删除。
-- 检查贷款金额异常值(负数)
SELECT * FROM loan_application WHERE loan_amount < 0;-- 删除贷款金额为负数的异常记录
DELETE FROM loan_application WHERE loan_amount < 0;
    1. 数据一致性检查:确保各表之间的数据关联正确,例如贷款申请表中的客户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中的数据转化为直观、交互式的图表和仪表盘,方便用户进行数据分析和监控。

(二)可视化图表设计

    1. 逾期率对比柱状图:以贷款类型为横轴,逾期率为纵轴,绘制柱状图,直观展示不同贷款类型的逾期率差异。
    • 通过颜色区分不同的贷款类型,使图表更加清晰易读。
    1. 不良贷款率趋势线图:按时间维度(如月份)统计不良贷款率,绘制趋势线图,观察不良贷款率的变化趋势。
    • 可以设置预警线,当不良贷款率超过预警线时,发出警示信号。
    1. 客户信用评分饼图以信用评级为分类,绘制饼图,展示不同信用评级客户的占比情况
    • 通过标签显示具体的占比数据,方便用户快速了解客户信用分布。

(三)仪表盘搭建

将上述可视化图表整合到一个仪表盘上,形成风险指标可视化监控界面。

  • 仪表盘可以包含筛选器,允许用户根据不同的条件(如时间范围、贷款类型等)进行数据筛选,查看相应的风险指标。
  • 同时,设置交互功能,当用户点击某个图表中的数据时,其他相关图表会进行联动更新,以便更深入地分析数据。

六、结论与建议

(一)结论

通过利用PostgreSQL进行金融风控分析中的风险指标可视化监控,我们能够有效地对贷款业务的风险进行评估和监控。

  • 数据清洗到风险指标计算,再到可视化展示,整个流程实现了数据的高效处理和分析,为金融机构提供了直观、准确的风险信息
  • 通过对不同贷款类型的逾期率、不良贷款率以及客户信用评分分布的分析,我们可以发现信用贷款的风险相对较高,需要重点关注和加强风控措施。

(二)建议

    1. 针对信用贷款的高风险特点,进一步优化信用评估模型,加强对信用评级较低客户的审核和监控,提高信用贷款的准入门槛。
    1. 定期更新和维护风险指标可视化仪表盘,确保数据的及时性和准确性。同时,根据业务需求和市场变化,不断优化可视化图表和指标体系,提高监控的有效性。
    1. 结合其他数据分析方法和技术,如机器学习算法,对客户的信用风险进行更精准的预测和评估,为风险控制提供更科学的依据。

通过以上实战案例,我们展示了如何利用PostgreSQL和Tableau实现金融风控分析中的风险指标可视化监控。

  • 这一流程不仅适用于商业银行的贷款业务风险监控,也可以为其他金融领域的风险分析提供参考和借鉴。
  • 在实际应用中,需要根据具体的业务需求和数据特点,灵活调整分析方法和可视化方案,以实现更好的风险控制效果。

以上是完整的金融风控分析案例中风险指标可视化监控内容。

  • 你可以和我说说对文章内容、结构等方面的看法,若有其他修改或补充需求,也请告知我。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/web/79652.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

屏幕与触摸调试

本章配套视频介绍: 《28-屏幕与触摸设置》 【鲁班猫】28-屏幕与触摸设置_哔哩哔哩_bilibili LubanCat-RK3588系列板卡都支持mipi屏以及hdmi显示屏的显示。 19.1. 旋转触摸屏 参考文章 触摸校准 参考文章 旋转触摸方向 配置触摸旋转方向 1 2 # 1.查看触摸输入设备 xinput…

AbstractQueuedSynchronizer之AQS

一、前置知识 公平锁和非公平锁&#xff1a; 公平锁&#xff1a;锁被释放以后&#xff0c;先申请的线程先得到锁。性能较差一些&#xff0c;因为公平锁为了保证时间上的绝对顺序&#xff0c;上下文切换更频繁 非公平锁&#xff1a;锁被释放以后&#xff0c;后申…

内存泄漏系列专题分析之十一:高通相机CamX ION/dmabuf内存管理机制Camx ImageBuffer原理

【关注我,后续持续新增专题博文,谢谢!!!】 上一篇我们讲了:内存泄漏系列专题分析之八:高通相机CamX内存泄漏&内存占用分析--通用ION(dmabuf)内存拆解 这一篇我们开始讲: 内存泄漏系列专题分析之十一:高通相机CamX ION/dmabuf内存管理机制Camx ImageBuf…

《类和对象(下)》

引言&#xff1a; 书接上回&#xff0c;如果说类和对象&#xff08;上&#xff09;是入门阶段&#xff0c;类和对象&#xff08;中&#xff09;是中间阶段&#xff0c;那么这次的类和对象&#xff08;下&#xff09;就可以当做类和对象的补充及收尾。 一&#xff1a;再探构造…

Java MVC

在软件开发中&#xff0c;MVC&#xff08;Model-View-Controller&#xff09;是一种常用的设计模式&#xff0c;它将应用程序分为三个核心部分&#xff1a;模型&#xff08;Model&#xff09;、视图&#xff08;View&#xff09;和控制器&#xff08;Controller&#xff09;。这…

嵌入式学习笔记 - 关于单片机的位数

通常我们经常说一个单片机是8位的&#xff0c;16位的&#xff0c;32位的&#xff0c;那么怎么判断一款单片机的位数是多少位呢&#xff0c;判断的依据是什么呢&#xff0c; 一 单片机的位数 单片机的位数是指单片机数据总线的宽度&#xff0c;也就是一次能处理的数据的位数&a…

推荐几个常用免费的文本转语音工具

推荐几个常用免费的文本转语音工具 在数字内容创作的时代&#xff0c;文本转语音(TTS)技术已经成为内容创作者的得力助手。无论是制作视频配音、有声读物、还是为网站增加语音功能&#xff0c;这些工具都能大幅提高创作效率。今天&#xff0c;我将为大家推荐几款优质的免费文本…

Microsoft Azure DevOps针对Angular项目创建build版本的yaml

Azure DevOps针对Angular项目创建build版本的yaml&#xff0c;并通过变量控制相应job的执行与否。 注意事项&#xff1a;代码前面的空格是通过Tab控制的而不是通过Space控制的。 yaml文件中包含一下内容&#xff1a; 1. 自动触发build 通过指定code branch使提交到此代码库的…

Python Day23 学习

继续SHAP图绘制的学习 1. SHAP特征重要性条形图 特征重要性条形图&#xff08;Feature Importance Bar Plot&#xff09;是 SHAP 提供的一种全局解释工具&#xff0c;用于展示模型中各个特征对预测结果的重要性。以下是详细解释&#xff1a; 图的含义 - 横轴&#xff1a;表示…

.NET 8 + Angular WebSocket 高并发性能优化

.NET 8 Angular WebSocket 高并发性能优化。 .NET 8 WebSocket 高并发性能优化 WebSocket 是一种全双工通信协议&#xff0c;允许客户端和服务端之间保持持久连接。在高并发场景下&#xff0c;优化 WebSocket 的性能至关重要。以下是针对 .NET 8 中 WebSocket 高并发性能优化…

Ubuntu 22.04.5 LTS 基于 kubesphere 安装 cube studio

Ubuntu 22.04.5 LTS 基于 kubesphere 安装 cube studio 前置条件 已经成功安装 kubesphere v4.3.1 参考教程: https://github.com/data-infra/cube-studio/wiki/%E5%9C%A8-kubesphere-%E4%B8%8A%E6%90%AD%E5%BB%BA-cube-studio 1. 安装基础依赖 # ubuntu安装基础依赖 apt insta…

centos 7 安装 java 运行环境

centos 7 安装 java 运行环境 java -version java version "1.8.0_131" Java(TM) SE Runtime Environment (build 1.8.0_131-b11) Java HotSpot(TM) 64-Bit Server VM (build 25.131-b11, mixed mode)java -version java version "1.8.0_144" Java(TM) …

Linux系统管理与编程20:Apache

兰生幽谷&#xff0c;不为莫服而不芳&#xff1b; 君子行义&#xff0c;不为莫知而止休。 做好网络和yum配置&#xff0c;用前面dns规划的www的IP进行。 #!/bin/bash #----------------------------------------------------------- # File Name: myWeb.sh # Version: 1.0 # …

.NET 在鸿蒙系统上的适配现状

目录 .NET 在鸿蒙系统上的适配现状 鸿蒙系统对虚拟机的限制与.NET的适配挑战 NativeAOT 在鸿蒙系统中的适配原理与实现方式 已知问题与解决方案&#xff1a;鸿蒙系统中的 syscall 限制 鸿蒙系统适配中的技术难点与解决方案 跨平台编译的挑战与应对策略 依赖库管理与兼容…

kotlin JvmName注解的作用和用途

1. JvmName 注解的作用 JvmName 是 Kotlin 提供的一个注解&#xff0c;用于在编译为 Java 字节码时自定义生成的类名或方法名。 作用对象&#xff1a; 文件级别&#xff08;整个 .kt 文件&#xff09;函数、属性、类等成员 主要用途&#xff1a; 控制 Kotlin 编译后生成的 JV…

树莓派4 yolo 11l.pt性能优化后的版本

树莓派4 使用 Picamera2 拍摄图像&#xff0c;然后通过 YOLO11l.pt 进行目标检测&#xff0c;并在实时视频流中显示结果。但当前的代码在运行时可能会比较卡顿&#xff0c;主要原因包括&#xff1a; picam2.capture_array() 是一个较慢的操作&#xff1b;YOLO 推理可能耗时较长…

Docker私有仓库实战:官方registry镜像实战应用

抱歉抱歉&#xff0c;离职后反而更忙了&#xff0c;拖了好久&#xff0c;从4月拖到现在&#xff0c;在学习企业级方案Harbor之前&#xff0c;我们先学习下官方方案registry&#xff0c;话不多说&#xff0c;详情见下文。 注意&#xff1a;下文省略了基本认证 TLS加密&#xff…

MySQL 安全架构:从渗透测试到合规审计

MySQL 安全架构&#xff1a;从渗透测试到合规审计 一、数据库安全的时代挑战与核心需求 在数据成为企业核心资产的今天&#xff0c;MySQL 面临的安全威胁日益复杂。据统计&#xff0c;2024 年全球数据库泄露事件中&#xff0c;关系型数据库占比高达 68%&#xff0c;其中 MySQ…

【基础复习笔记】计算机视觉

目录 一、计算机视觉基础 1. 卷积神经网络原理 2. 目标检测系列 二、算法与模型实现 1. 在PyTorch/TensorFlow中实现自定义损失函数或网络层的步骤是什么&#xff1f; 2. 如何设计一个轻量级模型用于移动端的人脸识别&#xff1f; 3. 描述使用过的一种注意力机制&#…

Django 项目的 models 目录中,__init__.py 文件的作用

在 Django 项目的models/init.py文件中&#xff0c;这些导入语句的主要作用是将各个模型类从不同的模块中导入到models包的命名空间中。这样做有以下几个目的&#xff1a; 简化导入路径 当你需要在项目的其他地方使用这些模型时&#xff0c;可以直接从models包导入&#xff0c…