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

news2025/5/14 10:26:24

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


文章大纲

  • 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_amount
          FROM (
              SELECT 
                  application_id,
                  application_date,
                  loan_term,
                  loan_amount / loan_term AS monthly_due
              FROM loan_application
          ) la
          CROSS 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_overdue
    FROM repayment_record rr
    JOIN 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.coloradmin.cn/o/2375299.html

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

相关文章

geoserver发布arcgis瓦片地图服务(最新版本)

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

多边形,矩形,长方体设置

在cesium中,我们可以通过既有的库来进行对地图的构建 // 向场景中添加一个几何体&#xff08;立方体&#xff09; scene.primitives.add(new Cesium.Primitive({// 定义几何体实例geometryInstances: new Cesium.GeometryInstance({// 使用BoxGeometry.fromDimensions方法创建…

(C语言)超市管理系统(测试版)(指针)(数据结构)(二进制文件读写)

目录 前言&#xff1a; 源代码&#xff1a; product.h product.c fileio.h fileio.c main.c 代码解析&#xff1a; fileio模块&#xff08;文件&#xff08;二进制&#xff09;&#xff09; 写文件&#xff08;保存&#xff09; 函数功能 代码逐行解析 关键知识点 读文…

nRF Connect 下载

官方下载路径 点击&#xff0c;或往下拉 选对应的版本 下载成功&#xff0c;数字代表版本好

基于Arduino的贪吃蛇游戏机

3D 打印迷你贪吃蛇游戏机&#xff1a; 在数字娱乐高度发达的今天&#xff0c;我们常常怀念那些经典的复古游戏。其中&#xff0c;贪吃蛇游戏无疑是许多人童年的记忆。今天&#xff0c;我将带你走进一个有趣的 DIY 项目——3D 打印迷你贪吃蛇游戏机。这个项目不仅能够让你重温经…

【PmHub后端篇】Redis分布式锁:保障PmHub流程状态更新的关键

在分布式系统中&#xff0c;确保数据一致性和操作的正确执行是至关重要的。PmHub项目中&#xff0c;通过集成Redis分布式锁来保障流程状态更新&#xff0c;这是一个非常关键的技术点&#xff0c;以下将详细介绍其原理、实现。 1 本地锁的问题 1.1 常见的本地锁 在Java中&…

Starrocks的主键表涉及到的MOR Delete+Insert更新策略

背景 写这个文章的作用主要是做一些总结和梳理&#xff0c;特别是正对大数据场景下的实时写入更新策略 COW 和 MOR 以及 DeleteInsert 的技术策略的演进&#xff0c; 这也适用于其他大数据的计算存储系统。该文章主要参考了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数据集成功能&#xff0c;帮助用户将所有的业务数据无需额外编写代码即可快速完成处理与分发。 数据集成能力由连接器和规则两部分组成&#xff0c;用户可以使用数据桥接或 MQTT 主题来接入数据&#xff0c;使用规则处理数据后&#xff0c;再通过数据桥接将数据发…

2. 盒模型/布局模块 - 响应式产品展示页_案例:电商产品网格布局

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

LVGL的三层屏幕结构

文章目录 &#x1f31f; LVGL 的三层屏幕架构1. **Top Layer&#xff08;顶层&#xff09;**2. **System Layer&#xff08;系统层&#xff09;**3. **Active Screen&#xff08;当前屏幕层&#xff09;** &#x1f9e0; 总结对比&#x1f50d; 整体作用✅ 普通屏幕层对象&…

【PDF】使用Adobe Acrobat dc添加水印和加密

【PDF】使用Adobe Acrobat dc添加水印和加密 文章目录 [TOC](文章目录) 前言一、添加保护加密口令二、添加水印三、实验四、参考文章总结 实验工具&#xff1a; 1.Adobe Acrobat dc 前言 提示&#xff1a;以下是本篇文章正文内容&#xff0c;下面案例可供参考 一、添加保护加…

Windows下安装mysql8.0

一、下载安装离线安装包 &#xff08;下载过了&#xff0c;可以跳过&#xff09; 下载网站&#xff1a;MySQL :: Download MySQL Installerhttps://dev.mysql.com/downloads/installer/ 二、安装mysql 三、安装完成验证

水滴Android面经及参考答案

static 关键字有什么作用&#xff0c;它修饰的方法可以使用非静态的成员变量吗&#xff1f; static关键字在 Java 中有多种作用。首先&#xff0c;它可以用来修饰变量&#xff0c;被static修饰的变量称为静态变量。静态变量属于类&#xff0c;而不属于类的某个具体实例&#xf…

工程师必读! 3 个最常被忽略的 TDR 测试关键细节与原理

TDR真的是一个用来看阻抗跟Delay的好工具&#xff0c;通过一个Port的测试就可以看到通道各个位置的阻抗变化。 可是使用上其实没这么单纯&#xff0c;有很多细节需要非常地小心&#xff0c;才可以真正地看到您想看的信息&#xff01; 就让我们整理3个极为重要的TDR使用小细节&…

C++中的各式类型转换

隐式转换&#xff1a; 基本类型的隐式转换&#xff1a; 当函数参数类型非精确匹配&#xff0c;但是可以转换的时候发生 如&#xff1a; void func1(double x){cout << x << endl; }void func2(char c){cout << c << endl; }int main(){func1(2);//…

Nacos源码—9.Nacos升级gRPC分析七

大纲 10.gRPC客户端初始化分析 11.gRPC客户端的心跳机制(健康检查) 12.gRPC服务端如何处理客户端的建立连接请求 13.gRPC服务端如何映射各种请求与对应的Handler处理类 14.gRPC简单介绍 10.gRPC客户端初始化分析 (1)gRPC客户端代理初始化的源码 (2)gRPC客户端启动的源码…

【计算机视觉】基于深度学习的实时情绪检测系统:emotion-detection项目深度解析

基于深度学习的实时情绪检测系统&#xff1a;emotion-detection项目深度解析 1. 项目概述2. 技术原理与模型架构2.1 核心算法1) 数据预处理流程2) 改进型MobileNetV2 2.2 系统架构 3. 实战部署指南3.1 环境配置3.2 数据集准备3.3 模型训练3.4 实时推理 4. 常见问题与解决方案4.…

【图像处理基石】什么是油画感?

在图像处理中&#xff0c;“油画感”通常指图像呈现出类似油画的块状纹理、笔触痕迹或色彩过渡不自然的现象&#xff0c;表现为细节模糊、边缘不锐利、颜色断层或人工纹理明显。这种问题常见于照片处理、视频帧截图或压缩后的图像&#xff0c;本质是画质受损的一种表现。以下是…

AD PCB布线的常用命令

PCB布线顺序&#xff1a;先信号&#xff0c;再电源&#xff0c;再GNG 1.多根走线的应用 将IC上的引脚分类 更改一类引脚以及引线的颜色&#xff0c;画出走线&#xff08;将脚引出&#xff09; 选中这些走线&#xff0c;点击‘交互式总线布线’&#xff0c;便可以多根拉线 shi…