• 拓端tecdat|Python决策树、随机森林、朴素贝叶斯、KNN(K-最近邻居)分类分析银行拉新活动挖掘潜在贷款客户


    原文链接:http://tecdat.cn/?p=23518 

    原文出处:拓端数据部落公众号

    项目背景:银行的主要盈利业务靠的是贷款,这些客户中的大多数是存款大小不等的责任客户(存款人)。银行拥有不断增长的客户。该银行希望增加借款人(资产客户),开展更多的贷款业务,并通过贷款利息赚取更多利润。因此,银行希望将负债的客户转换为个人贷款客户。(同时保留他们作为存款人)。该银行去年针对负债客户开展的一项活动显示,成功实现了9%以上的成功转化率。该部门希望建立一个模型,来帮助他们确定购买贷款可能性更高的潜在客户。可以增加成功率,同时降低成本。

    数据集

    下面给出的文件包含5000个客户的数据。数据包括客户人口统计信息(年龄,收入等),客户与银行的关系(抵押,证券账户等)以及客户对上次个人贷款活动的因变量(个人贷款)。在这5000个客户中,只有480个(= 9.6%)接受了先前活动中提供给他们的个人贷款

    data.head()
    

    data.columns
    

    属性信息

    属性可以相应地划分:

    • 变量 ID 一个人的客户ID与贷款之间没有关联,也无法为将来的潜在贷款客户提供任何一般性结论。我们可以忽略此信息进行模型预测。

    二进制类别具有五个变量,如下所示:

    • 个人贷款-该客户是否接受上一个广告系列提供的个人贷款? 这是我们的目标变量
    • 证券帐户-客户在银行是否有证券帐户?
    • CD帐户-客户在银行是否有存款证明(CD)帐户?
    • 网上银行-客户是否使用网上银行?
    • 信用卡-客户是否使用银行发行的信用卡?

    数值变量如下:

    • 年龄-客户的年龄
    • 工作经验
    • 收入-年收入(元)
    • CCAvg-平均信用卡消费
    • 抵押-房屋抵押价值

    有序分类变量是:

    • 家庭-客户的家庭人数
    • 教育程度-客户的教育程度

    标称变量是:

    • ID
    • 邮政编码
    data.shape
    

    data.info()
    

    1.  
      # 文件中没有列有空数据
    2.  
      data.apply(lambda x : sum(x.isnull()))

    1.  
      # 对数据进行目测
    2.  
      data.describe().transpose()

     

    1.  
      #查看有多少不同数据
    2.  
      data.apply(lambda x: len(x.unique()))

    两两变量散点图

    • 年龄 特征通常是分布的,大多数客户年龄在30岁到60岁之间。
    • 经验 大多分布在8年以上经验的客户。这里的 平均值 等于中 位数。有负数 。这可能是数据输入错误,因为通常无法衡量负面的工作经验。我们可以删除这些值,因为样本中有3或4条记录。
    • 收入出现 正偏斜。大多数客户的收入在45,000到55K之间。我们可以通过说平均值 大于 中位数来确认这一点 
    • CCAvg 也是一个正偏变量,平均支出在0K到10K之间,大多数支出不到2.5K
    • 抵押 70%的人的抵押贷款少于4万。但是最大值为635K
    • 家庭和教育变量是序数变量。家庭分布均匀

    有52条记录经验为负数。在进一步进行之前,我们需要对这些记录进行清理

    1.  
      data[data['Experience'] < 0]['Experience'].count()
    2.  
       
    52
    1.  
      #清理负数变量
    2.  
      dfExp = data.loc[data['Experience'] >0]
    3.  
      data.loc[negExp]['ID'].tolist() # 得到有负数经验的客户ID

    有52条负面经验的记录

    以下代码执行以下步骤:

    • 对于具有ID的记录,获取Age column的值 
    • 对于具有ID的记录,获取Education column的值 
    • 从具有正数经验的记录的数据框中过滤符合以上条件的记录,并取中位数
    • 将中位数填充原本负数经验的位置
    1.  
       
    2.  
      data.loc[np.where(['ID']==id)]["Education"].tolist()[0]
    3.  
      df_filtered['Experience'].median()
    1.  
      # 检查是否有负数经验的记录
    2.  
      data[data['Experience'] < 0]['Experience'].count()
    3.  
       
    0

    收入和教育对个人贷款的影响

    boxplot(x='Education',y='Income',data=data)
    

    观察 :看来教育程度为1的客户收入更高。但是,接受了个人贷款的客户的收入水平相同

    推论 :从上图可以看出,没有个人贷款的客户和拥有个人贷款的客户的抵押贷款较高。

    观察 :大多数没有贷款的客户都有证券账户

    观察:家庭人数对个人贷款没有任何影响。但是似乎3岁的家庭更有可能借贷。考虑未来的推广活动时,这可能是一个很好的观察结果。

    观察:没有CD帐户的客户,也没有贷款。这似乎占多数。但是几乎所有拥有CD帐户的客户也都有贷款

    观察:该图显示有个人贷款的人的信用卡平均费用更高。平均信用卡消费中位数为3800元,表明个人贷款的可能性更高。较低的信用卡支出(中位数为1400元)不太可能获得贷款。这可能是有用的信息。

    观察 上图显示与经验和年龄呈正相关。随着经验的增加,年龄也会增加。颜色也显示教育程度。四十多岁之间存在差距,大学以下的人也更多

    1.  
      # 与热图的关联性
    2.  
       
    3.  
      corr = data.corr()
    4.  
      plt.figure(figsize=(13,7))
    5.  
      # 创建一个掩码,以便我们只看到一次相关的值
    6.  
       
    7.  
      a = sns.heatmap(corr,mask=mask, annot=True, fmt='.2f')

    观察

    • 收入和CCAvg呈中等相关。
    • 年龄和工作经验高度相关
    sns.boxplot
    

    看下面的图,收入低于10万的家庭比高收入的家庭更不可能获得贷款。

    应用模型

    将数据分为训练集和测试集

    1.  
      train_labels = train_set
    2.  
      test_labels = test_set

    决策树分类器

    DecisionTreeClassifier(class_weight=None, criterion='entropy', ...)
    dt_model.score
    
    0.9773333333333334
    dt_model.predict(test_set)
    

    预测

    array([0, 0, 0, 0, 0])

    查看测试集 

    test_set.head(5)
    

    朴素贝叶斯

    1.  
      naive_model.fit(train_set, train_labels)
    2.  
      naive_model.score
    0.8866666666666667

    随机森林分类器

    RandomForestClassifier(max_depth=2, random_state=0)
    
    Importance.sort_values
    

    randomforest_model.score(test_set,test_labels)
    
    0.8993333333333333

    KNN(K-最近邻居)

    1.  
      data.drop(['Experience' ,'ID'] , axis = 1).drop(labels= "PersonalLoan" , axis = 1)
    2.  
      train_set_dep = data["PersonalLoan"]
    1.  
       
    2.  
      acc = accuracy_score(Y_Test, predicted)
    3.  
      print(acc)
    0.9106070713809206
    

    模型比较

    1.  
       
    2.  
      for name, model in models:
    3.  
      kfold = model_selection.KFold(n_splits=10)
    4.  
      cv_results = model_selection.cross_val_score(model, X, y, cv, scoring)
    5.  
       
    6.  
       
    7.  
      # 箱线图算法的比较
    8.  
      plt.figure()

     

    结论

    通用银行的目的是将负债客户转变为贷款客户。他们想发起新的营销活动;因此,他们需要有关数据中给出的变量之间的有联系的信息。本研究使用了四种分类算法。从上图可以看出,随机森林 算法似乎 具有最高的精度,我们可以选择它作为最终模型。


    最受欢迎的见解

    1.从决策树模型看员工为什么离职

    2.R语言基于树的方法:决策树,随机森林

    3.python中使用scikit-learn和pandas决策树

    4.机器学习:在SAS中运行随机森林数据分析报告

    5.R语言用随机森林和文本挖掘提高航空公司客户满意度

    6.机器学习助推快时尚精准销售时间序列

    7.用机器学习识别不断变化的股市状况——隐马尔可夫模型的应用

    8.python机器学习:推荐系统实现(以矩阵分解来协同过滤)

    9.python中用pytorch机器学习分类预测银行客户流失

    ▍关注我们 【大数据部落】第三方数据服务提供商,提供全面的统计分析与数据挖掘咨询服务,为客户定制个性化的数据解决方案与行业报告等。 ▍咨询链接:http://y0.cn/teradat ▍联系邮箱:3025393450@qq.com
  • 相关阅读:
    本地时间与UTC(世界协调时间)的转换
    windows共享在linux下挂载
    日期中带的 T 是什么意思
    FCBU喜马拉雅音频批量下载器
    C#使用[CefSharp]Chrome浏览器(1)安装
    云锵投资 2022 年 2 月简报
    云锵投资 2022 年 1 月简报
    MySQL分组(group by)取最大值、最小值
    tabel布局中给tr加border边框
    ant 使用指南
  • 原文地址:https://www.cnblogs.com/tecdat/p/15181105.html
Copyright © 2020-2023  润新知