百度360必应搜狗淘宝本站头条
当前位置:网站首页 > 技术文章 > 正文

从0到1建立一张评分卡之可视化分析

zhezhongyun 2025-06-23 23:39 3 浏览

 上一篇文章介绍了如何进行数据预处理,接下来介绍如何进行探索性数据分析。探索性数据分析又叫EDA,即Exploratory Data Analysis。其实数据预处理也属于EDA的一部分,EDA的目标就是快速描述一份数据集,以及对数据进行处理并可视化数据分布。只有了解数据之后,才能分析数据。今天主要介绍可视化数据分布的内容。

 首先将变量分为数值型变量和类别型变量,分别进行可视化分析。

num_features = ['int_rate_clean', 'emp_length_clean', 'annual_inc', 'dti', 'delinq_2yrs', 'earliest_cr_to_app',
                'inq_last_6mths', \
                'mths_since_last_record_clean', 'mths_since_last_delinq_clean', 'open_acc', 'pub_rec', 'total_acc',
                'limit_income', 'earliest_cr_to_app']

cat_features = ['home_ownership', 'verification_status', 'desc_clean', 'purpose', 'zip_code', 'addr_state']
feature_list=num_features+cat_features

 一共有14个数值变量和6个类别变量。先看一下类别型变量的分布图。

# 类别型变量的分布
def plot_cate_var(df,col_list,hspace=0.4,wspace=0.4,plt_size=None,plt_num=None,x=None,y=None):
    plt.figure(figsize=plt_size)
    plt.subplots_adjust(hspace=hspace,wspace=wspace)
    plt.rcParams['font.sans-serif']=['Microsoft YaHei']
    plt.rcParams['axes.unicode_minus'] = False
    for i,col in zip(range(1,plt_num+1,1),col_list):
        plt.subplot(x,y,i)
        plt.title(col)
        sns.countplot(data=df,y=col)
        plt.ylabel('')
    return plt.show()

 从上图可以看到每个类别型变量的大致分布情况。其中purpose、zip_code和addr_state这三个类别型变量的取值过多。对这类变量一般有这些处理办法:

  • 降基处理。即将占比较小的类别进行合并。
  • 用bad_rate编码后划入数值型变量,进行分箱。

 对于purpose变量,由于类别数不是很多,可以尝试进行降基;对于zip_code和addr_state,由于变量过多,所以进行bad_rate编码。

 再看一下数值型变量的分布情况。

def plot_num_col(df,col_list,hspace=0.4,wspace=0.4,plt_type=None,plt_size=None,plt_num=None,x=None,y=None):

    plt.figure(figsize=plt_size)
    plt.subplots_adjust(hspace=hspace,wspace=wspace)
    if plt_type=='hist':
        for i,col in zip(range(1,plt_num+1,1),col_list):
            plt.subplot(x,y,i)
            plt.title(col)
            sns.distplot(df[col].dropna())
            plt.xlabel('')
    return plt.show()

 数值型变量的分布用到了seaborn中的distplot画图,对应的还有一个kedplot画图方法。可以直观地看出每个变量的分布状态。 然后结合违约率,再对变量进行一下可视化分析。先对类别型变量进行可视化分析。

# 类别型变量的违约率分析
def plot_default_cate(df,col_list,target,hspace=0.4,wspace=0.4,plt_size=None,plt_num=None,x=None,y=None):
    all_bad = df[target].sum()
    total = df[target].count()
    all_default_rate = all_bad*1.0/total
    
    plt.figure(figsize=plt_size)
    plt.subplots_adjust(hspace=hspace,wspace=wspace)
    plt.rcParams['font.sans-serif']=['Microsoft YaHei']
    plt.rcParams['axes.unicode_minus'] = False
    for i,col in zip(range(1,plt_num+1,1),col_list):
        d1 = df.groupby(col)
        d2 = pd.DataFrame()
        d2['total'] = d1[target].count()
        d2['bad'] = d1[target].sum()
        d2['default_rate'] = d2['bad']/d2['total']
        d2 = d2.reset_index()
        plt.subplot(x,y,i)
        plt.title(col)
        plt.axvline(x=all_default_rate)
        sns.barplot(data=d2,y=col,x='default_rate')
        plt.ylabel('')
    return plt.show()

 这张图将每个变量取值的违约率和该变量的违约率画在一张图上进行对比,可以直观地看出哪些变量的取值违约率较高。比如homeownership变量的other取值、purpose变量的small_business取值。  同样看下数值型变量的违约率分布图。需要对数值型变量进行等深分箱。

# 数值型变量的违约率分析
def plot_default_num(df,col_list,target,hspace=0.4,wspace=0.4,q=None,plt_size=None,plt_num=None,x=None,y=None):
    all_bad = df[target].sum()
    total = df[target].count()
    all_default_rate = all_bad*1.0/total 
    
    plt.figure(figsize=plt_size)
    plt.subplots_adjust(hspace=hspace,wspace=wspace)
    for i,col in zip(range(1,plt_num+1,1),col_list):
        bucket = pd.qcut(df[col],q=q,duplicates='drop')
        d1 = df.groupby(bucket)
        d2 = pd.DataFrame()
        d2['total'] = d1[target].count()
        d2['bad'] = d1[target].sum()
        d2['default_rate'] = d2['bad']/d2['total']
        d2 = d2.reset_index()
        plt.subplot(x,y,i)
        plt.title(col)
        plt.axhline(y=all_default_rate)
        sns.pointplot(data=d2,x=col,y='default_rate',color='hotpink')
        plt.xticks(rotation=60)
        plt.xlabel('')
    return plt.show()

 对数值型变量进行等频分箱,观察每一箱的违约率占比以及单个变量的违约率占比情况。可以看到delinq_2yrs、pub_rec只有一箱。结合数值型变量的分布图发现这些变量都有一个取值的数量极多,导致在进行等频分箱的时候由于频数过大所以只有一箱。此外,大部分变量在进行等频分箱后的坏样本率是呈现单调趋势的。 总结:可视化分析有助于让数据分析更清晰明了,可以帮助理解数据,并且以清晰、简洁的图标展示出分析结果,这是非常重要的。

【作者】:Labryant

【原创公众号】:风控猎人

【简介】:某创业公司策略分析师,积极上进,努力提升。乾坤未定,你我都是黑马。

【转载说明】:转载请说明出处,谢谢合作!~

相关推荐

自助机网络监控(自助设备监控)

今日领导打电话说上次的自助机修好了,今天又不行了,这是第二次打电话了。目前也没有其他人反馈这个机器的问题。于是我就想能不能根据IP去ping这个自助机的网络是否正常,如果不正常,关机了就自动给我发到科...

C# 打字练习(WinForm)快速打字小游戏,输入正确自动爆炸效果

打字游戏窗体初始化:publicintk;PictureBoxpic=newPictureBox();//生成飞机控件privatev...

这三款颜值极高的工具完美契合win10风格,逼格满满

今天介绍三款开源软件让你的Windows10逼格再飞跃一个等级,而且功能与颜值兼具!ModernFlyouts这是一款Windows10弹出UI的替代品,比原生UI更漂亮、更现代。提示框的位置可以随意...

VC界面开发组件Xtreme Toolkit Pro全新发布v17.0.0

Codejock软件公司的XtremeToolkitPro是屡获殊荣的VC界面库,是MFC开发中最全面界面控件套包,它提供了Windows开发所需要的11种主流的VisualC++MFC控件,...

字体|好看的英文字体合集(四)(最好看的十种英文字体)

电脑里的字体不在于多而在精,拥有10000个字体不用的话也是浪费,找起来也不容易,只有经常使用的才是好字体。获取方式:私31.潮流赛博朋克金属字体32.潮流创意可扩展英文字体StretchPro3...

Qt5 C++入门教程-第13章 自定义控件(Custom Widgets)

大道至简,在Qt5C++入门教程的这一部分,我们将创建一个自定义部件。大多数工具包通常仅提供诸如按钮、文本部件或滑块等最常见的部件。没有哪个工具包能够提供所有可能的部件。程序员必须自行创建此类部件...

艾灸的美容养生功效(艾灸美容养颜)

艾灸,属于医外治物理疗法,通过百草之王艾草和13种名贵中草药特制成香条状,点燃以温热刺激患处四周或相关穴位,帮助人体全面温通经络,从而加速皮肤的血液循环,淡化色斑。艾灸疗法-温和灸1.四白穴:四白...

你可能不知道的10个CSS3中的隐藏特性

CSS3为web设计增添了许多令人惊叹的特性,这其中你经常会用到box-shadow(图层阴影),border-radius(边框圆角),transform(变形)这一类受欢迎的常用特性。但是还有一些...

不会才学-4 Tkinter 控件1一Label、Button、Entry

一、标签控件(Label)序号可选项&描述1anchor文本或图像在背景内容区的位置,默认为center,可选值为(n,s,w,e,ne,nw,sw,se,center)eswn是东南西北英文...

从0到1建立一张评分卡之可视化分析

 上一篇文章介绍了如何进行数据预处理,接下来介绍如何进行探索性数据分析。探索性数据分析又叫EDA,即ExploratoryDataAnalysis。其实数据预处理也属于EDA的一部分,EDA的目...

高温致日本冲绳最大珊瑚群90%白化褪色

来源:新华网高温致日本冲绳最大珊瑚群90%白化褪色A+A-分享2016-09-0412:50:53 来源:新华网查看原文<divclass="video-box"data-vid="...

学习笔记(十七)|PPT考点总结(ppt.1)

分享兴趣,传播快乐,增长见闻,留下美好!亲爱的您,这里是LearningYard学苑。今天小编为大家带来“学习笔记(十七)|PPT考点总结”,欢迎您的访问。Shareyourinterests,...

史上最全的浏览器兼容性问题和解决方案

微信ID:WEB_wysj(点击关注)◎◎◎◎◎◎◎◎◎一┳═┻︻▄(页底留言开放,欢迎来吐槽)●●●浏览器兼容性问题是指因为不同的浏览器对同一段CSS代码解析不同导致页面显示效果不统一...

304071纽郎缝包机送料牙架(缝包机送料牙更换)

portant;white-space:normal;font-size-adjust:none;font-stretch:normal;background-color:rgb(25...

安卓手机微信设置字体大小导致页面错位的解决方案

切图网专注网页切图、小程序切图服务,在最近的客户反应中,当安卓手机设置字体大小以后,会导致从微信公众号进入的页面也会字体放大,导致页面的不同程度的错位,要想解决这个问题,可以通过代码解决,ios相对简...