朴素贝叶斯分析 数据观察
我们的目标是判断数据中的客户哪些是可以借款的,客户的借款信用是我们判断的依据之一,可以通过朴素贝叶斯的方法来分类客户的借款信用情况。观察表格数据可知,最主要可以判断客户借款信用的主要数据包括初始评价、历史正常还款期数、历史逾期还款期数、历史成功借款金额、总待还本金。而据观察,手机认证、户口认证、视频认证、学历认证、征信认证、淘宝认证等数据,并不影响客户的借款信用。
分析思路评价从高到低分别有A、B、C、D、E、F共6个等级,我们可以将其转化成分值段,分别对应着180~151、150~121、120~91、90~61、60~31、30~0,借款成功的概率(不保留小数部分)范围就分别为100%~84%,83%~67%,66%~51%,50%~34%,33%~17%,16%~0。
而我们将初始评价取分值段的中间值,即A、B、C、D、E、F分别对应着165、135、105、75、45、15,则初始的借款成功概率P0(不保留小数部分)分别为92%、75%、58%、41%、25%、9%;
将历史逾期还款期数除以历史所有还款期数(即历史正常还款期数与历史逾期还款期数之和)算出逾期还款概率,这里记为Pa,则1-Pa即为及时还款概率,这里记为Pb;
用总待还本金除以历史成功借款金额算出其欠款占比,这里记为Pc,以此衡量其成功还款概率,这里记为Pd,Pd=1-Pc;
我们将在客户及时还款概率和成功还款概率情况下计算其新的成功借款概率Pe,并重新划分评价等级。计算公式如下:
算法思路- 定义一个打开文件的函数,并提取有效的数据并保存成一定的数据格式,方便后续的使用和分析
- 计算所需的各概率值
- 计算其新的成功借款概率Pe
- 重新划分各客户的信用评价等级
from openpyxl import load_workbook
#打开数据文件
wb = load_workbook('bankLoan.xlsx')
sheet = wb['Sheet1']
shRow = sheet.max_row
#保存成字典形式
def sheet_Dict(sheet,shRow):
shDict = {}
for i in range(2,shRow):
shDict.setdefault(sheet.cell(row=i,column=1).value,[sheet.cell(row=i,column=6).value,sheet.cell(row=i,column=18).value,sheet.cell(row=i,column=19).value,sheet.cell(row=i,column=20).value,sheet.cell(row=i,column=21).value])
return shDict
#调用
sheetDict=sheet_Dict(sheet,shRow)
#设空字典存放后续计算的概率值,n用来计数不同等级出现次数,后面算(P0 |Pb )和(P0 |Pd )
dtDict={}
n1=0
n2=0
n3=0
n4=0
n5=0
n6=0
#开始算条件概率值
for key,value in sheetDict.items():
l=[]#空列表存放概率值
l.append(value[0])#先放初始等级,l[0]
#根据初始等级的不同,先放其对应的初始成功借款概率值,l[1]
if value[0]=="A":
l.append(0.92)
n1+=1
elif value[0]=="B":
l.append(0.75)
n2+=1
elif value[0]=="C":
l.append(0.58)
n3+=1
elif value[0]=="D":
l.append(0.41)
n4+=1
elif value[0]=="E":
l.append(0.25)
n5+=1
elif value[0]=="F":
l.append(0.09)
n6+=1
#存放Pd成功还款概率,l[2]
if value[1]==0:
l.append(0)
else:
l.append(1-value[2]/value[1])
#存放Pb成功还款概率,l[3]
if (value[3]+value[4])==0:
l.append(0)
else:
l.append(1-value[4]/(value[3]+value[4]))
#将新列表作为字典值
dtDict.setdefault(key,l)
#计算等级的占比即其概率,方便后续算(P0 |Pb )和(P0 |Pd )
p1=(n1/(n1+n2+n3+n4+n5+n6))
p2=n2/(n1+n2+n3+n4+n5+n6)
p3=n3/(n1+n2+n3+n4+n5+n6)
p4=n4/(n1+n2+n3+n4+n5+n6)
p5=n5/(n1+n2+n3+n4+n5+n6)
p6=n6/(n1+n2+n3+n4+n5+n6)
#开始算(P0 |Pb )和(P0 |Pd )
for key,value in dtDict.items():
l=value#用一个列表取字典的值
#判断不同等级下(P0 |Pb )和(P0 |Pd )的计算,l[4],l[5]
if value[1]==0.92:
l.append(value[2]*p1+(1-value[2])*(1-p1))
l.append(value[3]*p1+(1-value[3])*(1-p1))
elif value[1]==0.75:
l.append(value[2]*p2+(1-value[2])*(1-p2))
l.append(value[3]*p2+(1-value[3])*(1-p2))
elif value[1]==0.58:
l.append(value[2]*p3+(1-value[2])*(1-p3))
l.append(value[3]*p3+(1-value[3])*(1-p3))
elif value[1]==0.41:
l.append(value[2]*p4+(1-value[2])*(1-p4))
l.append(value[3]*p4+(1-value[3])*(1-p4))
elif value[1]==0.25:
l.append(value[2]*p5+(1-value[2])*(1-p5))
l.append(value[3]*p5+(1-value[3])*(1-p5))
elif value[1]==0.09:
l.append(value[2]*p6+(1-value[2])*(1-p6))
l.append(value[3]*p6+(1-value[3])*(1-p6))
#算出新的成功借款概率
p=(l[1]*l[2]/l[4])*(l[1]*l[3]/l[5])
#新划分等级,l[6]
if 0.84<=p :
l.append("A")
elif 0.67<=p<=0.83 :
l.append("B")
elif 0.51<=p<=0.66 :
l.append("C")
elif 0.34<=p<=0.5 :
l.append("D")
elif 0.17<=p<=0.33 :
l.append("E")
elif p<=0.16 :
l.append("F")
#输出结果
try:
print('用户ID:',key,'旧信用评价等级:',l[0],'新信用评价等级:',l[6])
except:
pass
分析结果
可以看到,经过朴素贝叶斯方法将客户的信用等级进行重新分类,有一些客户的信用等级没有发生变化;有的是提升了,这意味着该客户在被评为原信用等级的情况下可以拿到更高的借款限额和更长的还款期限;有的是降低了,这意味着该客户在被评为原信用等级的情况下不应该拿到当前的借款限额和还款期限。
方法优劣使用朴素贝叶斯方法分析数据的优点之一就是朴素贝叶斯的思路简单,在算法实现上也不困难,而且朴素贝叶斯还将各属性看作分别独立,让算法的实现更加简单;处理数据的时候可以处理多类别问题,比如在这次的分析中,就分析了A、B、C、D、E、F六个类别的信用等级;朴素贝叶斯的分类效率稳定
劣势主要在于对于输入数据的准备方式较为敏感,需要知道先验概率,还要计算后验概率;而先验概率取决于假设的模型,如果假设的模型出了错,那么分析得出的结果也是不准确的。



