import pandas as pd
import numpy as np
import matplotlib.pyplot as plt
# 解决中文乱码问题
plt.rcParams['font.sans-serif'] = ['SimHei']
# 解决负号无法正常显示的问题
plt.rcParams['axes.unicode_minus'] = False
'''
某银行的数据分析师计算坏账率
用户ID 好坏客户 年龄 负债率 月收入 家属数量
0 1 1 45 0.802982 9120.0 2.0
1 2 0 40 0.121876 2600.0 1.0
2 3 0 38 0.085113 3042.0 0.0
3 4 0 30 0.036050 3300.0 0.0
4 5 0 49 0.024926 63588.0 0.0
'''
data = pd.read_csv('Myxlsxdata/loan.csv', encoding='gb2312')
'''
是不是收入越高的人坏账率越低
'''
# 首先进行缺失值处理,用均值填充法
data = data.fillna({'月收入': data['月收入'].mean()})
# 对月收入进行分析
# 因为月收入属于连续值,对连续值进行分析时,我们一般都会将连续值进行离散化
# 就是将连续值进行区间分割,分成若干类别
cut_bins = [0, 5000, 10000, 15000, 20000, 100000]
income_cut = pd.cut(data['月收入'], cut_bins)
# 区间分好后就可以查看每个区间的坏账率
# 坏账率就是所有借款用户中逾期不还用户的占比
# 逾期不还的用户的好坏客户字段表记为1,按期还款的标记为0
# 坏账率 = 好坏客户字段之和(坏账客户数) / 好坏客户字段的计数(所有借款用户)
all_income_user = data['好坏客户'].groupby(income_cut).count()
bad_income_user = data['好坏客户'].groupby(income_cut).sum()
income_bad_rate = bad_income_user / all_income_user
income_bad_rate.plot.bar()
plt.show()
'''
年龄和坏账率的关系
'''
# 先对年龄进行离散值处理
age_cut = pd.qcut(data['年龄'], 6)
all_age_user = data['好坏客户'].groupby(age_cut).count()
bad_age_user = data['好坏客户'].groupby(age_cut).sum()
age_bad_rate = bad_age_user / all_age_user
age_bad_rate.plot.bar()
plt.show()
'''
家庭人口数量和坏账率的关系
'''
# 人口数量也是连续值,但因为数值不大,就当作离散值处理
all_age_fam_num = data.groupby('家属数量')['好坏客户'].count()
bad_age_fam_num = data.groupby('家属数量')['好坏客户'].sum()
fam_num_bad_rate = bad_age_fam_num / all_age_fam_num
fam_num_bad_rate.plot()
plt.show()