基于 Flask 的德国银行信贷客户数据可视化分析系统 --- 技术文档
版本:v1.0 | 最后更新:2026-05-18
目录
1. 项目概述
1.1 项目背景
本系统是一个基于 Flask 框架的 Web 应用,用于对德国银行信贷客户数据集(German Credit Data)进行多维度可视化分析和机器学习预测。系统提供用户认证、数据管理、统计分析、可视化展示和预测建模等完整功能。
1.2 核心功能
| 功能模块 | 说明 |
|---|---|
| 用户认证 | 注册、登录、登出,基于 Flask-Login 的会话管理 |
| 数据看板 | 5 个分析维度、60+ 张交互式图表,覆盖人口统计、财务状况、信贷分析、统计分析 |
| 数据管理 | 对信贷数据的增删改查(CRUD),支持分页与搜索 |
| 预测分析 | K-Means 客户聚类、随机森林信用风险预测、肘部法则、混淆矩阵 |
1.3 数据集说明
数据来源:UCI Machine Learning Repository --- German Credit Data
- 记录数:1000 条
- 字段数:10 个
- 数据格式:CSV
| 字段 | 类型 | 说明 |
|---|---|---|
| Id | Integer | 记录编号(0-999) |
| Age | Integer | 客户年龄 |
| Sex | String | 性别:male / female |
| Job | Integer | 职业类型:0=非居民非技术工, 1=居民非技术工, 2=技术工, 3=高技能工 |
| Housing | String | 住房情况:own / rent / free |
| Saving accounts | String | 储蓄账户等级:little / moderate / quite rich / rich(可为空) |
| Checking account | String | 支票账户等级:little / moderate / rich(可为空) |
| Credit amount | Integer | 信贷金额(单位:德国马克 DM) |
| Duration | Integer | 贷款期限(月) |
| Purpose | String | 贷款用途:car / radio/TV / furniture/equipment / business / education / repairs / vacation/others / domestic appliances |

























2. 系统架构
2.1 架构概览
┌─────────────────────────────────────────────────────────┐
│ 浏览器 (Client) │
│ ┌──────────┐ ┌──────────┐ ┌──────────┐ ┌──────────┐ │
│ │ 登录页面 │ │ 数据看板 │ │ 数据管理 │ │ 预测分析 │ │
│ └────┬─────┘ └────┬─────┘ └────┬─────┘ └────┬─────┘ │
│ │ │ │ │ │
│ │ ECharts │ Fetch API │ Fetch API │ │
└───────┼─────────────┼─────────────┼─────────────┼────────┘
│ │ │ │
▼ ▼ ▼ ▼
┌─────────────────────────────────────────────────────────┐
│ Flask 应用服务器 │
│ │
│ ┌─────────────┐ ┌─────────────┐ ┌─────────────────┐ │
│ │ 认证路由 │ │ 统计 API │ │ 预测 API │ │
│ │ /login │ │ /api/stats/ │ │ /api/predict/ │ │
│ │ /register │ │ (32 个端点) │ │ (4 个端点) │ │
│ │ /logout │ │ │ │ │ │
│ └──────┬──────┘ └──────┬──────┘ └────────┬────────┘ │
│ │ │ │ │
│ ┌──────┴────────────────┴───────────────────┴────────┐ │
│ │ Flask-Login 会话管理 │ │
│ └──────────────────────┬─────────────────────────────┘ │
│ │ │
│ ┌──────────────────────┴─────────────────────────────┐ │
│ │ SQLAlchemy ORM │ │
│ └──────────────────────┬─────────────────────────────┘ │
└─────────────────────────┼───────────────────────────────┘
│
▼
┌─────────────────────┐
│ SQLite 数据库 │
│ credit_data.db │
│ - users │
│ - credit_data │
└─────────────────────┘
2.2 设计模式
- 应用工厂模式 :通过
create_app()函数创建 Flask 实例,便于测试和配置管理 - MVC 模式 :
- Model :
models.py定义 SQLAlchemy 数据模型 - View :
templates/下的 Jinja2 模板 - Controller :
app.py中的路由处理函数
- Model :
- 前端数据驱动:页面加载后通过 AJAX 调用 API 获取数据,ECharts 渲染图表
3. 技术栈
3.1 后端
| 组件 | 技术 | 版本 | 用途 |
|---|---|---|---|
| Web 框架 | Flask | 3.0.0 | 路由、请求处理、模板渲染 |
| ORM | Flask-SQLAlchemy | 3.1.1 | 数据库操作抽象层 |
| 认证 | Flask-Login | 0.6.3 | 用户会话管理、登录保护 |
| 密码加密 | Werkzeug | 3.0.1 | 密码哈希(pbkdf2) |
| 数据处理 | pandas | 2.1.4 | CSV 读取、数据聚合、统计计算 |
| 数值计算 | numpy | 1.26.2 | 数组运算、统计指标(分位数、箱线图) |
| 机器学习 | scikit-learn | 1.3.2 | KMeans 聚类、随机森林分类、特征编码 |
| 可视化(备用) | matplotlib | 3.8.2 | 后端绘图(运行时未使用) |
| 可视化(备用) | seaborn | 0.13.0 | 后端绘图(运行时未使用) |
| 数据库 | SQLite | 内置 | 本地文件数据库 |
3.2 前端
| 组件 | 技术 | 版本 | 用途 |
|---|---|---|---|
| 图表库 | ECharts | 5.4.3 (CDN) | 60+ 张交互式图表渲染 |
| 模板引擎 | Jinja2 | Flask 内置 | HTML 模板继承与渲染 |
| 样式 | 自定义 CSS3 | --- | 完整设计系统,无第三方框架 |
| 脚本 | 原生 JavaScript | --- | 无框架,无构建工具 |
| 字体 | Google Fonts | --- | Cormorant Garamond(标题)、DM Sans(正文)、JetBrains Mono(数据) |
3.3 开发环境
| 工具 | 说明 |
|---|---|
| Python | 3.8+ / 3.11 |
| 操作系统 | Windows 11 |
4. 目录结构
code/
├── app.py # 主应用文件(1326 行),包含所有路由和 API
├── config.py # 配置文件(10 行)
├── models.py # 数据模型定义(50 行)
├── init_db.py # 数据库初始化脚本(45 行)
├── requirements.txt # Python 依赖清单
├── credit_data.db # SQLite 数据库文件(86KB)
│
├── data/
│ ├── german_credit_data.csv # 原始数据集(1000 条)
│ ├── 关于银行信贷客户数据集的探索.ipynb # 探索性数据分析 Notebook
│ └── 参考链接.url
│
├── static/
│ ├── css/
│ │ └── style.css # 完整样式系统(1552 行)
│ ├── js/
│ │ └── main.js # 全局脚本(23 行)
│ └── images/
│ └── auth-bg.jpg # 登录页背景图
│
└── templates/
├── base.html # 后端布局模板(侧边栏 + 顶栏)
├── login.html # 登录页(独立页面)
├── register.html # 注册页(独立页面)
├── dashboard.html # 数据看板(1721 行,含 60+ 图表)
├── data_manage.html # 数据管理 CRUD 页面
└── predict.html # 预测分析页面
5. 数据库设计
5.1 ER 关系图
┌──────────────────┐ ┌──────────────────────────┐
│ users │ │ credit_data │
├──────────────────┤ ├──────────────────────────┤
│ id (PK) │ │ id (PK, autoincrement) │
│ username (UNIQUE) │ │ original_id (UNIQUE) │
│ password_hash │ │ age │
│ created_at │ │ sex │
└──────────────────┘ │ job │
│ housing │
│ saving_accounts (NULL) │
│ checking_account (NULL) │
│ credit_amount │
│ duration │
│ purpose │
└──────────────────────────┘
5.2 users 表
存储系统注册用户信息,用于身份认证。
| 字段 | 类型 | 约束 | 默认值 | 说明 |
|---|---|---|---|---|
| id | INTEGER | PRIMARY KEY | AUTOINCREMENT | 用户 ID |
| username | VARCHAR(80) | UNIQUE, NOT NULL, INDEX | --- | 用户名 |
| password_hash | VARCHAR(256) | NOT NULL | --- | 密码哈希值(pbkdf2) |
| created_at | DATETIME | --- | UTC now | 注册时间 |
模型方法:
set_password(password):使用werkzeug.security.generate_password_hash生成密码哈希check_password(password):使用werkzeug.security.check_password_hash验证密码- 继承
flask_login.UserMixin,提供is_authenticated、is_active等属性
5.3 credit_data 表
存储德国银行信贷客户数据,从 CSV 导入。
| 字段 | 类型 | 约束 | 说明 |
|---|---|---|---|
| id | INTEGER | PRIMARY KEY, AUTOINCREMENT | 内部记录 ID |
| original_id | INTEGER | UNIQUE | CSV 中的原始 Id 列 |
| age | INTEGER | NOT NULL | 客户年龄 |
| sex | VARCHAR(10) | NOT NULL | 性别 |
| job | INTEGER | NOT NULL | 职业类型编码(0-3) |
| housing | VARCHAR(20) | NOT NULL | 住房情况 |
| saving_accounts | VARCHAR(20) | NULLABLE | 储蓄账户等级 |
| checking_account | VARCHAR(20) | NULLABLE | 支票账户等级 |
| credit_amount | INTEGER | NOT NULL | 信贷金额(DM) |
| duration | INTEGER | NOT NULL | 贷款期限(月) |
| purpose | VARCHAR(50) | NOT NULL | 贷款用途 |
模型方法:
to_dict():序列化为字典,空值字段转换为空字符串
5.4 数据库初始化
运行 init_db.py 执行以下操作:
- 删除所有现有表(
db.drop_all()) - 创建新表(
db.create_all()) - 从
data/german_credit_data.csv导入 1000 条记录 - 创建默认管理员账户:用户名
admin,密码admin123
bash
python init_db.py
6. 后端路由与 API
6.1 应用入口
app.py 使用应用工厂模式,通过 create_app() 函数创建 Flask 应用实例。应用运行在 端口 5004,开启调试模式。
python
# app.py 末尾
if __name__ == '__main__':
app = create_app()
app.run(debug=True, port=5004)
6.2 认证机制
- 会话管理:基于 Flask-Login 的 Cookie-Session 机制
- 密码存储:Werkzeug 的 pbkdf2 哈希算法
- 路由保护 :使用
@login_required装饰器保护需要登录的页面 - 登录重定向 :未登录用户自动跳转到
/login,登录后跳转回原页面 - 记住登录 :
login_user(user, remember=True)启用持久化会话
6.3 页面路由
| 路由 | 方法 | 认证 | 模板 | 说明 |
|---|---|---|---|---|
/ |
GET | 否 | --- | 根路由,已登录跳 dashboard,未登录跳 login |
/login |
GET, POST | 否 | login.html | 登录页面 |
/register |
GET, POST | 否 | register.html | 注册页面 |
/logout |
GET | 是 | --- | 登出,跳转到登录页 |
/dashboard |
GET | 是 | dashboard.html | 数据看板(默认维度) |
/dashboard/demographics |
GET | 是 | dashboard.html | 人口统计维度 |
/dashboard/financial |
GET | 是 | dashboard.html | 财务状况维度 |
/dashboard/credit |
GET | 是 | dashboard.html | 信贷分析维度 |
/dashboard/stats |
GET | 是 | dashboard.html | 统计分析维度 |
/data |
GET | 是 | data_manage.html | 数据管理页面 |
/predict |
GET | 是 | predict.html | 预测分析页面 |
6.4 数据 CRUD API
所有 API 返回 JSON 格式数据。
GET /api/data/list
分页查询信贷数据,支持搜索。
请求参数:
| 参数 | 类型 | 默认值 | 说明 |
|---|---|---|---|
| page | int | 1 | 页码 |
| per_page | int | 20 | 每页条数 |
| search | string | "" | 搜索关键词(模糊匹配 sex、housing、purpose、saving_accounts、checking_account) |
响应示例:
json
{
"data": [
{
"id": 1,
"original_id": 0,
"age": 67,
"sex": "male",
"job": 2,
"housing": "own",
"saving_accounts": "",
"checking_account": "little",
"credit_amount": 1169,
"duration": 6,
"purpose": "radio/TV"
}
],
"total": 1000,
"pages": 50,
"current_page": 1
}
POST /api/data/add
新增信贷记录。
请求体(JSON):
json
{
"age": 30,
"sex": "male",
"job": 2,
"housing": "own",
"saving_accounts": "moderate",
"checking_account": "little",
"credit_amount": 5000,
"duration": 24,
"purpose": "car"
}
POST /api/data/update
更新信贷记录。请求体同上,额外包含 id 字段。
POST /api/data/delete
删除信贷记录。请求体:{ "id": 1 }
6.5 统计分析 API(32 个端点)
所有统计 API 均为 GET 请求,返回 JSON 数据,供前端 ECharts 图表使用。
概览统计
| 端点 | 说明 | 返回字段 |
|---|---|---|
/api/stats/overview |
总览数据 | total_count, avg_age, avg_credit, avg_duration |
/api/stats/credit_stats_summary |
综合统计摘要 | 16 个统计指标(均值、中位数、标准差、极值、分位数等) |
/api/stats/credit_health_gauge |
信贷健康评分 | score (0-100), 各维度得分 |
人口统计维度
| 端点 | 说明 | 图表类型 |
|---|---|---|
/api/stats/age_distribution |
年龄分布(6 组) | 柱状图 |
/api/stats/sex_distribution |
性别比例 | 饼图 |
/api/stats/job_distribution |
职业类型分布 | 饼图 |
/api/stats/housing_distribution |
住房情况分布 | 饼图 |
/api/stats/age_credit_analysis |
年龄 × 信贷分析 | 分组柱状图 |
/api/stats/job_credit_analysis |
职业 × 信贷分析 | 分组柱状图 |
/api/stats/sex_credit_analysis |
性别 × 信贷分析 | 分组柱状图 |
/api/stats/purpose_sex_analysis |
贷款用途 × 性别 | 水平分组柱状图 |
/api/stats/age_funnel |
年龄组漏斗图 | 漏斗图 |
/api/stats/credit_by_age_sex |
年龄 × 性别信贷 | 分组柱状图 |
/api/stats/job_housing_credit_sunburst |
职业 → 住房旭日图 | 旭日图 |
/api/stats/checking_saving_scatter |
支票 × 储蓄散点图 | 散点图 |
/api/stats/age_duration_scatter |
年龄 × 期限散点图 | 散点图 |
/api/stats/age_sex_credit_heatmap |
年龄 × 性别信贷热力图 | 热力图 |
/api/stats/sex_age_distribution |
性别 × 年龄分布 | 分组柱状图 |
财务状况维度
| 端点 | 说明 | 图表类型 |
|---|---|---|
/api/stats/saving_distribution |
储蓄账户分布 | 饼图 |
/api/stats/checking_distribution |
支票账户分布 | 饼图 |
/api/stats/housing_credit_analysis |
住房 × 信贷分析 | 分组柱状图 |
/api/stats/risk_factors |
风险因子分析 | 柱状图 |
/api/stats/job_housing_matrix |
职业 × 住房矩阵 | 堆叠柱状图 |
/api/stats/checking_credit_analysis |
支票 × 信贷分析 | 分组柱状图 |
/api/stats/saving_checking_heatmap |
储蓄 × 支票热力图 | 热力图 |
/api/stats/housing_saving_credit |
住房 × 储蓄信贷热力图 | 热力图 |
/api/stats/job_credit_sunburst |
职业 → 储蓄旭日图 | 旭日图 |
/api/stats/purpose_duration_radar |
用途 × 期限雷达图 | 雷达图 |
/api/stats/age_credit_boxplot |
年龄 × 信贷箱线图 | 箱线图 |
信贷分析维度
| 端点 | 说明 | 图表类型 |
|---|---|---|
/api/stats/purpose_distribution |
贷款用途分布 | 水平柱状图 |
/api/stats/credit_by_purpose |
用途 × 信贷统计 | 分组柱状图 |
/api/stats/credit_amount_distribution |
信贷金额分布 | 直方图 |
/api/stats/duration_distribution |
贷款期限分布 | 直方图 |
/api/stats/purpose_duration_analysis |
用途 × 期限分析 | 分组柱状图 |
/api/stats/credit_percentiles |
信贷百分位数 | 柱状图 |
/api/stats/purpose_credit_boxplot |
用途 × 信贷箱线图 | 箱线图 |
/api/stats/credit_duration_scatter |
信贷 × 期限散点图 | 散点图 |
/api/stats/duration_credit_boxplot |
期限 × 信贷箱线图 | 箱线图 |
/api/stats/duration_purpose_heatmap |
期限 × 用途热力图 | 热力图 |
/api/stats/purpose_housing_sunburst |
用途 → 住房旭日图 | 旭日图 |
/api/stats/credit_by_saving_job |
储蓄 × 职业信贷堆叠图 | 堆叠柱状图 |
/api/stats/default_rate_by_purpose |
用途违约率 | 柱状图 |
统计分析维度
| 端点 | 说明 | 图表类型 |
|---|---|---|
/api/stats/customer_radar |
客户画像雷达图 | 雷达图(整体/男/女) |
/api/stats/correlation_matrix |
相关性矩阵 | 热力图 |
/api/stats/sex_age_credit_bubble |
性别 × 年龄 × 信贷气泡图 | 气泡图 |
/api/stats/saving_checking_credit_scatter |
储蓄 × 支票信贷散点图 | 散点图 |
/api/stats/job_purpose_credit_sankey |
职业 → 用途 → 信贷桑基图 | 桑基图 |
/api/stats/job_duration_analysis |
职业 × 期限分析 | 双轴柱状图 |
/api/stats/job_purpose_heatmap |
职业 × 用途热力图 | 热力图 |
6.6 预测分析 API(4 个端点)
| 端点 | 方法 | 说明 |
|---|---|---|
/api/predict/cluster |
GET | K-Means 聚类分析(k=4) |
/api/predict/elbow |
GET | 肘部法则(k=2~10) |
/api/predict/credit_risk |
GET | 随机森林信用风险预测 |
/api/predict/confusion_matrix |
GET | 混淆矩阵 |
详细算法说明见[第 9 节](#第 9 节)。
7. 前端设计
7.1 设计系统
系统采用自定义 CSS 设计系统(static/css/style.css,1552 行),无第三方 CSS 框架。
颜色体系
| 变量名 | 色值 | 用途 |
|---|---|---|
--midnight |
#0c1222 |
主背景色(深色主题) |
--gold |
#d4a574 |
强调色、品牌色 |
--indigo |
#6366f1 |
主要交互色 |
--teal |
#2dd4bf |
积极指标 |
--coral |
#f87171 |
警告/消极指标 |
--violet |
#a78bfa |
辅助强调色 |
字体系统
| 字体 | 用途 |
|---|---|
| Cormorant Garamond | 品牌标题(衬线体) |
| DM Sans | 正文内容(无衬线体) |
| JetBrains Mono | 数据展示(等宽体) |
响应式断点
| 断点 | 适配 |
|---|---|
| > 1200px | 桌面端(3 列图表网格) |
| 768px - 1200px | 平板端(2 列) |
| < 768px | 移动端(1 列,侧边栏折叠为汉堡菜单) |
动画效果
fadeInUp:卡片进入动画slideDown:面板展开shimmer:加载骨架屏spin:加载旋转pulse:脉冲高亮ripple:按钮点击波纹- 毛玻璃效果(
backdrop-filter: blur):登录/注册卡片
7.2 页面结构
布局模板(base.html)
┌──────────────────────────────────────────────────┐
│ ┌──────────┐ ┌──────────────────────────────────┐ │
│ │ │ │ 顶栏:汉堡菜单 | 页面标题 | 日期 │ │
│ │ 侧边栏 │ ├──────────────────────────────────┤ │
│ │ │ │ │ │
│ │ 品牌Logo │ │ │ │
│ │ │ │ 内容区域 │ │
│ │ 主功能 │ │ (block content) │ │
│ │ - 看板 │ │ │ │
│ │ - 数据 │ │ │ │
│ │ - 预测 │ │ │ │
│ │ │ │ │ │
│ │ 分析维度 │ │ │ │
│ │ - 人口 │ │ │ │
│ │ - 财务 │ │ │ │
│ │ - 信贷 │ │ │ │
│ │ - 统计 │ │ │ │
│ │ │ │ │ │
│ │ 用户信息 │ │ │ │
│ │ 退出登录 │ │ │ │
│ └──────────┘ └──────────────────────────────────┘ │
└──────────────────────────────────────────────────┘
登录/注册页
独立页面(不继承 base.html),采用全屏背景图 + 毛玻璃卡片设计:
- 左侧:品牌标识 + 登录/注册表单
- 右侧:装饰性统计数字(1000 样本、8+ 维度、4 种风险类型)
- 背景:
auth-bg.jpg+ 网格覆盖层 + 发光效果
数据看板(dashboard.html)
- 顶部:4 个统计卡片(总客户数、平均年龄、平均信贷、平均期限),带数字递增动画
- 标签导航:5 个维度标签页,支持懒加载(首次切换时加载图表)
- 图表网格:每行 3 列,部分全宽图表跨越整行
- 加载状态:标签切换时显示进度条动画,图表加载时显示旋转图标
数据管理页(data_manage.html)
- 搜索框(300ms 防抖)
- 分页数据表格(每页 20 条)
- 新增/编辑模态框(9 个表单字段)
- 删除确认对话框
- Toast 通知(成功/错误)
预测分析页(predict.html)
- K-Means 聚类区域:散点图 + 肘部图 + 聚类摘要卡片
- 风险预测区域:指标行 + 特征重要性图 + 风险分布饼图 + 混淆矩阵热力图 + 准确率仪表盘
- 两个区域各有"运行分析"按钮,触发并行 API 请求
8. 数据可视化
8.1 图表类型总览
系统使用 ECharts 5.4.3 实现了 60+ 张交互式图表,涵盖以下类型:
| 图表类型 | 数量 | 应用场景 |
|---|---|---|
| 柱状图/条形图 | 18 | 分布统计、分组对比 |
| 饼图/环形图 | 8 | 占比分布 |
| 散点图/气泡图 | 6 | 相关性分析、聚类展示 |
| 热力图 | 6 | 交叉分析、相关矩阵 |
| 箱线图 | 4 | 分布离散程度 |
| 旭日图 | 4 | 多层级关系 |
| 雷达图 | 3 | 多维画像 |
| 堆叠柱状图 | 3 | 构成分析 |
| 桑基图 | 1 | 流向关系 |
| 漏斗图 | 1 | 转化/分布 |
| 仪表盘 | 2 | 综合评分 |
| 树图 | 1 | 层级占比 |
| 玫瑰图 | 1 | 极坐标分布 |
| 双轴柱状图 | 1 | 多指标对比 |
| 直方图 | 2 | 频率分布 |
8.2 图表渲染机制
- 懒加载:图表仅在对应标签页首次激活时初始化,避免首屏加载过慢
- 异步数据 :每个图表通过
fetch()调用对应的/api/stats/*端点获取数据 - 响应式 :监听
window.resize事件,自动调整图表尺寸 - 主题适配:统一使用深色主题配色,与整体 UI 风格一致
- 交互特性:支持悬浮提示(Tooltip)、图例筛选、数据缩放
8.3 关键图表说明
信贷健康评分仪表盘
综合 5 个维度的加权评分(0-100 分):
| 维度 | 权重 | 计算方式 |
|---|---|---|
| 储蓄充足度 | 25% | rich/quite rich 占比 |
| 支票覆盖度 | 20% | rich/moderate 占比 |
| 住房自有率 | 20% | own 占比 |
| 低信贷比例 | 15% | 低于中位数的比例 |
| 短期限比例 | 20% | 低于中位数的比例 |
相关性矩阵
对 9 个编码后的数值特征计算 Pearson 相关系数:
- 特征:age, sex, job, housing, saving_accounts, checking_account, credit_amount, duration, purpose
- 分类特征通过 LabelEncoder 转换为数值
职业 → 用途 → 信贷桑基图
三层层级流向图:
- 第一层:职业类型(4 类)
- 第二层:贷款用途(8 类)
- 第三层:信贷等级(低/中/高)
9. 机器学习模块
9.1 K-Means 客户聚类
端点 :/api/predict/cluster
算法配置:
- 算法:KMeans
- 簇数:k=4
- 随机种子:42
- 初始化次数:n_init=10
特征工程:
| 特征 | 类型 | 预处理 |
|---|---|---|
| age | 数值 | StandardScaler 标准化 |
| job | 数值 | StandardScaler 标准化 |
| credit_amount | 数值 | StandardScaler 标准化 |
| duration | 数值 | StandardScaler 标准化 |
| sex | 分类 | LabelEncoder → StandardScaler |
| housing | 分类 | LabelEncoder → StandardScaler |
输出:
- 散点图数据(credit_amount vs duration,按簇着色)
- 聚类摘要:每个簇的客户数、平均年龄、平均信贷、平均期限
- 惯性值(Inertia)
簇命名规则: 按信贷金额和年龄排序动态分配标签。
9.2 肘部法则
端点 :/api/predict/elbow
测试 k=2 到 k=10 的惯性值,用于辅助确定最优簇数。返回各 k 值对应的 inertia 值,前端绘制肘部曲线图。
9.3 信用风险预测
端点 :/api/predict/credit_risk
风险标签构造(规则引擎):
python
risk_score = 0
if credit_amount > median_credit:
risk_score += 1
if duration > median_duration:
risk_score += 1
risk_score += saving_risk # rich/quite_rich=0, moderate=1, little=2
high_risk = 1 if risk_score >= 3 else 0
特征矩阵(8 个特征):
| 特征 | 预处理 |
|---|---|
| age | 原始值 |
| job | 原始值 |
| credit_amount | 原始值 |
| duration | 原始值 |
| sex | LabelEncoder |
| housing | LabelEncoder |
| saving_accounts | LabelEncoder |
| checking_account | LabelEncoder |
模型配置:
- 算法:RandomForestClassifier
- 树数量:100
- 随机种子:42
- 训练/测试划分:80/20
输出:
- 模型准确率
- 特征重要性排名(柱状图)
- 风险分布(饼图:低风险 vs 高风险)
- 混淆矩阵(2×2 热力图)
9.4 模型评估
混淆矩阵结构:
| 预测低风险 | 预测高风险 | |
|---|---|---|
| 实际低风险 | TN | FP |
| 实际高风险 | FN | TP |
10. 配置与部署
10.1 应用配置
配置定义在 config.py 中:
python
class Config:
SECRET_KEY = os.environ.get('SECRET_KEY') or 'german-credit-analysis-secret-key-2024'
SQLALCHEMY_DATABASE_URI = 'sqlite:///' + os.path.join(BASE_DIR, 'credit_data.db')
SQLALCHEMY_TRACK_MODIFICATIONS = False
DATA_CSV_PATH = os.path.join(BASE_DIR, 'data', 'german_credit_data.csv')
| 配置项 | 说明 | 生产环境建议 |
|---|---|---|
| SECRET_KEY | 会话加密密钥 | 必须通过环境变量设置强随机值 |
| SQLALCHEMY_DATABASE_URI | 数据库连接字符串 | 生产环境建议切换至 PostgreSQL/MySQL |
| SQLALCHEMY_TRACK_MODIFICATIONS | 禁用修改追踪 | 保持 False |
| DATA_CSV_PATH | CSV 数据文件路径 | 仅初始化时使用 |
10.2 安装与运行
环境要求
- Python 3.8+
- pip
安装步骤
bash
# 1. 克隆或下载项目
cd code
# 2. 创建虚拟环境(推荐)
python -m venv venv
venv\Scripts\activate # Windows
# source venv/bin/activate # Linux/Mac
# 3. 安装依赖
pip install -r requirements.txt
# 4. 初始化数据库
python init_db.py
# 5. 启动应用
python app.py
访问地址
- 应用地址:
http://localhost:5004 - 默认管理员:用户名
admin,密码admin123
10.3 生产部署建议
bash
# 使用 Gunicorn(Linux/Mac)
pip install gunicorn
gunicorn -w 4 -b 0.0.0.0:5004 "app:create_app()"
# 使用 Waitress(Windows)
pip install waitress
waitress-serve --port=5004 app:create_app
生产环境清单:
- 设置强随机
SECRET_KEY环境变量 - 关闭调试模式(
debug=False) - 切换数据库至 PostgreSQL 或 MySQL
- 配置 HTTPS(Nginx 反向代理 + SSL 证书)
- 添加 CSRF 保护(Flask-WTF)
- 配置日志记录
- 添加请求频率限制
- 配置静态文件 CDN
11. 已知问题与改进方向
11.1 已知问题
| 问题 | 严重程度 | 说明 |
|---|---|---|
| ML 模型每次请求重新训练 | 中 | K-Means 和 RandomForest 在每次 API 调用时重新 fit,高并发下性能差 |
| 无 CSRF 保护 | 中 | POST 端点缺少 CSRF Token 验证 |
| 密钥硬编码 | 中 | SECRET_KEY 有默认值回退,生产环境存在安全风险 |
| 单文件架构 | 低 | app.py 1326 行,所有路由和业务逻辑集中在一个文件 |
| 无 API 限流 | 低 | 缺少请求频率限制,可能被滥用 |
| 默认管理员密码 | 低 | init_db.py 硬编码 admin/admin123 |
11.2 改进方向
架构优化
- 将
app.py拆分为 Flask Blueprint:auth.py:认证路由dashboard.py:看板路由data_api.py:数据 CRUD APIstats_api.py:统计分析 APIpredict_api.py:预测分析 API
- 引入应用配置分层(开发/测试/生产)
性能优化
- 模型持久化:训练后序列化保存(
joblib),避免重复训练 - 统计结果缓存:使用
functools.lru_cache或 Redis 缓存高频查询 - 数据库索引:为
credit_data表的purpose、sex、housing等常用查询字段添加索引
安全增强
- 集成 Flask-WTF 添加 CSRF 保护
- 移除 SECRET_KEY 硬编码默认值
- 添加 API 请求频率限制(Flask-Limiter)
- 实施密码复杂度策略
功能扩展
- 数据导出(CSV/Excel)
- 自定义图表配置(维度选择、图表类型切换)
- 更多 ML 模型(逻辑回归、SVM、XGBoost)
- 模型性能对比面板
- 定时数据刷新
- 多语言支持
附录 A:API 端点完整索引
共计 51 个路由:11 个页面路由 + 40 个 API 端点。
| 编号 | 端点 | 方法 | 类别 |
|---|---|---|---|
| 1 | / |
GET | 页面 |
| 2 | /login |
GET, POST | 认证 |
| 3 | /register |
GET, POST | 认证 |
| 4 | /logout |
GET | 认证 |
| 5 | /dashboard |
GET | 页面 |
| 6 | /dashboard/demographics |
GET | 页面 |
| 7 | /dashboard/financial |
GET | 页面 |
| 8 | /dashboard/credit |
GET | 页面 |
| 9 | /dashboard/stats |
GET | 页面 |
| 10 | /data |
GET | 页面 |
| 11 | /predict |
GET | 页面 |
| 12 | /api/data/list |
GET | CRUD |
| 13 | /api/data/add |
POST | CRUD |
| 14 | /api/data/update |
POST | CRUD |
| 15 | /api/data/delete |
POST | CRUD |
| 16-47 | /api/stats/* |
GET | 统计(32 个) |
| 48 | /api/predict/cluster |
GET | 预测 |
| 49 | /api/predict/elbow |
GET | 预测 |
| 50 | /api/predict/credit_risk |
GET | 预测 |
| 51 | /api/predict/confusion_matrix |
GET | 预测 |
附录 B:依赖清单
flask==3.0.0
flask-sqlalchemy==3.1.1
flask-login==0.6.3
werkzeug==3.0.1
pandas==2.1.4
numpy==1.26.2
scikit-learn==1.3.2
matplotlib==3.8.2
seaborn==0.13.0
附录 C:数据字段编码对照表
职业类型(Job)
| 编码 | 含义 |
|---|---|
| 0 | 非技术工 - 非居民 |
| 1 | 非技术工 - 居民 |
| 2 | 技术工 |
| 3 | 高技能工 |
储蓄账户等级(Saving accounts)
| 等级 | 说明 |
|---|---|
| little | 少量储蓄 |
| moderate | 中等储蓄 |
| quite rich | 较多储蓄 |
| rich | 大量储蓄 |
支票账户等级(Checking account)
| 等级 | 说明 |
|---|---|
| little | 少量余额 |
| moderate | 中等余额 |
| rich | 大量余额 |
贷款用途(Purpose)
| 用途 | 说明 |
|---|---|
| car | 购车 |
| radio/TV | 电子产品 |
| furniture/equipment | 家具/设备 |
| business | 商业经营 |
| education | 教育 |
| repairs | 维修 |
| vacation/others | 度假/其他 |
| domestic appliances | 家用电器 |