当前位置: 首页 > news >正文

银行个人贷款接受度分析

数据集背景与字段说明

本数据集来自 Thera Bank,银行管理层希望探索如何将其负债客户(仅存款客户)转化为个人贷款客户,并保持其作为存款客户的身份。去年针对负债客户的营销活动取得了超过9%的转化率,这激励了零售营销部门通过更精准的目标营销,在有限预算下进一步提升转化率。数据集获取

字段说明(中英文对照)

字段名英文释义中文释义
IDCustomer Id客户编号
AgeCustomer’s age in completed years客户年龄(整年)
ExperienceYears of professional experience工作年限
IncomeAnnual income of the customer年收入
ZIP CodeAddress Zip code邮政编码
FamilyFamily size of customer家庭人数
CCAvgAvg. spending on credit card per month (已换算为年均)信用卡月均消费(已换算为年均)
EducationEducational level (undergraduate=1, graduate=2, advance=3)教育水平(本科=1,研究生=2,高级=3)
Personal LoanDid this customer accept the personal loan offered in campaign?是否接受个人贷款(上次活动)
Securities AccountDoes the customer have a securities account with the bank?是否有证券账户
CD AccountDoes the customer have a certificate of deposit (CD) account?是否有定期存款账户
OnlineDoes the customer use internet banking facilities是否使用网上银行
CreditCardDoes the customer use a credit card issued by universalBank?是否使用银行发行的信用卡

本博客将带你一步步分析影响客户接受个人贷款的关键因素,并通过不同机器学习模型的比较,找出最佳预测模型。每一步都配有详细代码、可视化和原理解释,帮助你深入理解整个数据分析与建模流程。


1. 数据加载与初步探索

import pandas as pd
import numpy as np
import matplotlib.pyplot as plt
import seaborn as sns
from sklearn.model_selection import train_test_split
from sklearn.preprocessing import StandardScaler
from sklearn.linear_model import LogisticRegression
from sklearn.tree import DecisionTreeClassifier
from sklearn.ensemble import RandomForestClassifier
from sklearn.svm import SVC
from sklearn.metrics import accuracy_score, confusion_matrix, classification_report
from sklearn.model_selection import cross_val_score# 设置中文显示
plt.rcParams["font.family"] = ["SimHei", "WenQuanYi Micro Hei", "Heiti TC"]
plt.rcParams['axes.unicode_minus'] = False  # 解决负号显示问题# 加载数据集
df = pd.read_csv('Bank_Personal_Loan_Modelling(1).csv')# 查看数据基本信息
print("数据集形状:", df.shape)
print("\n数据集前5行:\n", df.head())
print("\n数据统计信息:\n", df.describe())
print("\n数据类型和缺失值情况:\n", df.info())

解释:
首先,我们导入了常用的数据分析和机器学习库,并设置了中文字体以便后续可视化。然后,加载了个人贷款数据集,并通过 shapehead()describe()info() 方法初步了解数据的结构、样本量、字段类型和缺失值情况。这一步为后续的数据清洗和分析打下基础。
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述


2. 缺失值与异常值处理

# 检查缺失值
print("\n缺失值统计:\n", df.isnull().sum())# 处理异常值(例如将CCAvg中的'/'替换为'.'并转换为数值型)
df['CCAvg'] = df['CCAvg'].str.replace('/', '.').astype(float)

解释:
因为数据质量直接影响分析结果,所以我们首先检查了每一列的缺失值。随后,针对 CCAvg 字段中可能存在的异常字符(如 /),进行了替换和类型转换,确保所有特征均为可用的数值型数据。


3. 特征相关性分析

plt.figure(figsize=(15, 10))
correlation = df.corr()
sns.heatmap(correlation, annot=True, cmap='coolwarm', fmt='.2f')
plt.title('特征相关性热力图')
plt.tight_layout()
plt.show()

解释:
通过计算特征之间的相关系数,并用热力图展示,可以直观地看到各变量之间的线性关系。这样有助于我们发现哪些特征与目标变量(是否接受贷款)关系密切,为特征选择和建模提供依据。
在这里插入图片描述


4. 目标变量分布可视化

plt.figure(figsize=(8, 6))
sns.countplot(x='Personal Loan', data=df)
plt.title('个人贷款接受情况分布')
plt.xlabel('是否接受贷款 (0: 否, 1: 是)')
plt.ylabel('客户数量')
plt.show()

解释:
通过对目标变量 Personal Loan 的计数可视化,我们可以了解正负样本的分布情况。这一步有助于判断数据是否平衡,避免模型训练时因类别不均衡而产生偏差。
在这里插入图片描述


5. 特征与目标变量关系分析

5.1 收入与贷款接受关系

plt.figure(figsize=(10, 6))
sns.boxplot(x='Personal Loan', y='Income', data=df)
plt.title('收入水平与贷款接受关系')
plt.show()

解释:
通过箱线图分析收入与贷款接受的关系,可以发现收入较高的客户更倾向于接受个人贷款。这为后续特征重要性分析提供了直观依据。
在这里插入图片描述

5.2 教育水平与贷款接受关系

plt.figure(figsize=(10, 6))
sns.countplot(x='Education', hue='Personal Loan', data=df)
plt.title('教育水平与贷款接受关系')
plt.xlabel('教育水平 (1: 本科, 2: 研究生, 3: 高级)')
plt.ylabel('客户数量')
plt.legend(['未接受', '接受'])
plt.show()

解释:
通过分组计数图分析教育水平与贷款接受的关系,可以看出高学历客户更倾向于接受贷款。教育水平是影响贷款接受度的重要因素。
在这里插入图片描述

5.3 家庭规模与贷款接受关系

plt.figure(figsize=(10, 6))
sns.countplot(x='Family', hue='Personal Loan', data=df)
plt.title('家庭规模与贷款接受关系')
plt.xlabel('家庭人数')
plt.ylabel('客户数量')
plt.legend(['未接受', '接受'])
plt.show()

解释:
分析家庭规模与贷款接受的关系,发现家庭人数对贷款接受度有一定影响。不同家庭规模的客户贷款意愿存在差异。
在这里插入图片描述


6. 特征准备与数据集划分

# 准备特征和目标变量
X = df.drop(['ID', 'ZIP Code', 'Personal Loan'], axis=1)
y = df['Personal Loan']# 分割训练集和测试集
X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.3, random_state=42)# 特征标准化
scaler = StandardScaler()
X_train_scaled = scaler.fit_transform(X_train)
X_test_scaled = scaler.transform(X_test)

解释:
首先,去除无关特征(如 ID、邮编和目标变量本身),保留有效特征用于建模。然后,将数据集按 7:3 比例分为训练集和测试集。因为部分模型对特征分布敏感,所以对特征进行了标准化处理。


7. 多模型训练与评估

# 定义模型列表
models = {'逻辑回归': LogisticRegression(random_state=42),'决策树': DecisionTreeClassifier(random_state=42),'随机森林': RandomForestClassifier(random_state=42),'支持向量机': SVC(random_state=42)
}# 训练和评估模型
results = {}
for name, model in models.items():model.fit(X_train_scaled, y_train)y_pred = model.predict(X_test_scaled)accuracy = accuracy_score(y_test, y_pred)results[name] = accuracyprint(f"{name} 准确率: {accuracy:.4f}")print("分类报告:\n", classification_report(y_test, y_pred))cm = confusion_matrix(y_test, y_pred)plt.figure(figsize=(8, 6))sns.heatmap(cm, annot=True, fmt='d', cmap='Blues')plt.title(f'{name} 混淆矩阵')plt.xlabel('预测结果')plt.ylabel('实际结果')plt.show()

解释:
通过定义四种主流分类模型(逻辑回归、决策树、随机森林、支持向量机),分别在训练集上训练并在测试集上评估。每个模型输出准确率、分类报告和混淆矩阵,便于直观比较模型性能。
在这里插入图片描述

在这里插入图片描述


8. 模型准确率对比可视化

plt.figure(figsize=(10, 6))
model_names = list(results.keys())
accuracies = list(results.values())
plt.bar(model_names, accuracies, color=['blue', 'green', 'red', 'purple'])
plt.title('不同模型准确率比较')
plt.xlabel('模型名称')
plt.ylabel('准确率')
plt.ylim(0.8, 1.0)
for i, v in enumerate(accuracies):plt.text(i, v + 0.001, f'{v:.4f}', ha='center')
plt.show()

解释:
通过柱状图对比不同模型的准确率,直观展示哪种模型在本数据集上的表现最佳,为后续模型选择提供依据。
在这里插入图片描述


9. 交叉验证与最佳模型特征重要性分析

# 交叉验证进一步评估最佳模型
best_model = models[max(results, key=results.get)]
cv_scores = cross_val_score(best_model, X_train_scaled, y_train, cv=5)
print(f"\n最佳模型 {max(results, key=results.get)} 交叉验证准确率: {cv_scores.mean():.4f}{cv_scores.std():.4f})")# 特征重要性分析(针对树模型)
if hasattr(best_model, 'feature_importances_'):feature_importance = pd.DataFrame({'Feature': X.columns,'Importance': best_model.feature_importances_}).sort_values('Importance', ascending=False)plt.figure(figsize=(12, 8))sns.barplot(x='Importance', y='Feature', data=feature_importance)plt.title(f'{max(results, key=results.get)} 特征重要性')plt.tight_layout()plt.show()

解释:
通过 5 折交叉验证进一步评估最佳模型的泛化能力,确保模型稳定可靠。对于树模型,还可以输出特征重要性条形图,帮助我们理解哪些特征对贷款接受预测贡献最大。
在这里插入图片描述


10. 分析结论与洞察

  • 不同模型的准确率对比如下:
    • 逻辑回归、决策树、随机森林、支持向量机均有较好表现,其中最佳模型为 max(results, key=results.get),准确率为 results[max(results, key=results.get)]
  • 主要影响因素(特征重要性排名前五):
    • 可参考上方特征重要性图。
  • 数据洞察:
    • 收入水平与个人贷款接受度呈显著正相关。
    • 高学历客户更倾向于接受个人贷款。
    • 家庭规模对贷款接受度有一定影响。

11. 可视化结果示例

每张图都对应上文代码块的输出,建议在本地运行代码以获得完整可视化体验。

  • 特征相关性热力图
  • 个人贷款接受情况分布
  • 收入水平与贷款接受关系
  • 教育水平与贷款接受关系
  • 不同模型准确率比较
  • 特征重要性

通过上述分步分析与可视化,我们不仅找到了最佳预测模型,还深入理解了影响客户接受个人贷款的关键因素。希望本博客对你的数据分析和建模实践有所帮助!

http://www.dtcms.com/a/303115.html

相关文章:

  • el-upload开启picture形式列表展示上传的非图片文件自定义缩略图
  • 网络层描述
  • Leetcode_349.两个数组的交集
  • Word VBA快速制作试卷(2/2)
  • 【华为机试】5. 最长回文子串
  • 学习人工智能所需知识体系及路径详解
  • 记录几个SystemVerilog的语法——随机
  • 五自由度磁悬浮轴承转子:基于自适应陷波器的零振动攻克不平衡质量扰动的终极策略
  • (45) QT 提供了一个功能,以同步现代操作系统的编辑功能,在标题栏上显示 * 占位符,以显示窗体上发生了未被保存的修改
  • 三维插件 Forest 深度解析:打造高效逼真的自然环境
  • 命令执行漏洞
  • 计算机毕设分享-基于SpringBoot的健身房管理系统(开题报告+前后端源码+Lun文+开发文档+数据库设计文档)
  • USRP-X440 雷达目标发生器
  • 深入解析 Java Stream 设计:从四幕剧看流水线设计与执行机制
  • 对于ui=f(state)的理解(react)
  • Redis四种GetShell方式完整教程
  • 使用Docker在Rocky Linux 9.5上在线部署LangFlow
  • 【STM32编码器接口测速】实现测速功能
  • 删除二维特征图中指定区域的样本
  • linux系统----Ansible中的playbook简单应用
  • 【Java EE】多线程-初阶-线程的状态
  • java里List链式编程
  • 4、如何生成分布式ID?
  • Linux->模拟实现 fopen/fread/fwrite
  • Bruce Momjian 深圳 meetup 回顾
  • 大模型基础设施搭建 - 操作系统centos7
  • SDRAM
  • CTF-Web学习笔记:文件包含篇
  • 阿里给AI To C战略戴上眼镜
  • 4.应用层自定义协议与序列化