本项目来源于数据酷客
1 项目背景
信用风险是商业银行长期以来面临的主要风险。个人消费信贷业务成为我国商业银行新的利润增长
点,而个人信用风险管理手段的落后成为制约个人消费信贷产业发展的瓶颈。在传统方法中,大部
分银行主要依靠信贷审批人员经验来决定,个人喜好对评估结果影响很大,而且随着业务量的大幅
上升,人员相对不足,造成审批时间长,效率低,成本高。
随着移动互联网技术、智能设备的普及、大数据技术的提高正改变这一状况。消费分期信贷业务经
过长期的开展,积累了大量的用户以及数据。但是面临业务规模难以扩大、坏账率较高等问题。通
常的特点包括“授信额度小”、“授信时间要求快”、“人群分散”等,其评估指标多且冗杂,对风险控制
要求较高。需要在风控流程简单、风控成本控制在较低水平的同时,保证风控效果。大数据分析能
够基于大量多种来源的数据,自动构建个人信用风险评估体系,对我国商业银行发展,特别是消费
信贷业务的发展意义重大。
2 数据描述和解析
2.1 mysql连接python获取数据
首先连接数据库,获取需要进行分析的数据
import pymysql
connection = pymysql.connect(host='59.64.78.76'
, port=3306
, user='raa_user'
, password='bigdata123'
, db='risk_assessment_analysis'
, charset='utf8mb4'//设置中文字符编码格式
, cursorclass=pymysql.cursors.DictCursor//设置游标的类型,返回的数据用字典格式存储)
try:
with connection.cursor() as cursor:
sql = "select * from risk_assessment_analysis.all_data"
cursor.execute(sql)
all_data = cursor.fetchall()//fetchall返回的是全部数据
finally:
connection.close()
# 查看数据前两个元素
print(all_data[:2])
并对数据进行一些格式转换
data = pd.DataFrame(all_data) //将已有数据转变为dataframe类型
data_5 = data.head(5) //显示前五行数据
data_des = data.describe(include='all')//查看数据信息
通过对于数据的查看,我们发现这些数据存在一些错误,比如缺失值和异常值的存在,在后续的步骤中将予以处理。
3 可视化分析
3.1 对于违约的可视化分析
在这个项目中,是否违约的比例对于这个模型来说很重要,如果分布不均匀,那么会对模型预测的精度产生很大的影响。所以可以通过画图的方式来对是否违约这个字段进行直观的分析
counts = data['Default'].value_counts(dropna=False).values
//value.counts函数的作用是统计字段中重复值的个数
//dropna 是否去重
3.2文化程度与是否违约之间的关系
data['education'] = data['education'].astype('category')//将education列中的数据改变成种类数据类型
data['education'] = data['education'].cat.set_categories(['小学', '初中', '高中', '本科以上'],ordered=T)//重命名education里面的种类为小学初中高中本科以上
counts=data['Default'].groupby(data['education']).value_counts().values
//在柱状图上面显示数据数量,将default按照education进行分组
count1 = counts[[0, 2, 4,6]]
count2 = counts[[1, 3, 5,7]]
3.3 三要素和违约率之间的关系/婚姻状况特征分布/在网时长分析
fig,[ax1,ax2] = plt.subplots(1,2,figsize=(16,6))
## 设置子图,fig代表整张图,ax1,ax2代表两张子图,subplots返回的数值有两个
sns.countplot(data['maritalStatus'], hue=data['Default'], ax=ax1)
##按照未婚数量和已婚数量进行计数,并且按照是否违规进行分组
maritalStatus_rate = data.groupby('maritalStatus')['Default'].sum() / data.groupby('maritalStatus')['Default'].count()
sns.barplot(x=['未婚','已婚'],y=maritalStatus_rate.values,ax=ax2)##按照是否结婚对是否违约进行分组,实际上就是计算未婚中和已婚中的违约人数和总人数。