• 设为首页
  • 点击收藏
  • 手机版
    手机扫一扫访问
    迪恩网络手机版
  • 关注官方公众号
    微信扫一扫关注
    公众号

R语言信用评分卡:探索性数据分析

原作者: [db:作者] 来自: [db:来源] 收藏 邀请

欢迎关注天善智能,我们是专注于商业智能BI,人工智能AI,大数据分析与挖掘领域的垂直社区,学习,问答、求职一站式搞定!

对商业智能BI、大数据分析挖掘、机器学习,python,R等数据领域感兴趣的同学加微信:tstoutiao,邀请你进入数据爱好者交流群,数据爱好者们都在这儿。

作者:黄天元,复旦大学博士在读,目前研究涉及文本挖掘、社交网络分析和机器学习等。希望与大家分享学习经验,推广并加深R语言在业界的应用。

邮箱:[email protected]

前言

本文为了迭代一个探索性数据分析的通用模式,首先使用银行信贷数据进行探索性数据分析,希望能够得到一个通用的强大探索性解决方案。

数据导入

数据是来自klaR的GermanCredit数据


1library(pacman)
2p_load(tidyverse,klaR)
3
4data(GermanCredit)
5GermanCredit %>% as_tibble -> df

把表格数据已经导入到df中了。

整体把握

为了最快速地知道: - 表格有多少行、多少列 - 表格的变量都是什么数据类型的 - 表格是否存在缺失值,如果存在,是如何缺失的 - 数据大体的分布

我们决定使用最便捷的函数。首先,DataExplorer包提供了一个快速仪表盘的生成,简单粗暴直接出报告,如果是Rstudio的用户能够马上得到一个report.html,在工作目录中生成。


1p_load(DataExplorer)
2create_report(df)

先用dlookr对表格进行审视


1p_load(dlookr)
2
3diagnose(df) %>% 
4arrange(types) %>% 
5print(n = Inf)
6
7## # A tibble: 21 x 6
8## variables types missing_count missing_percent unique_count unique_rate
9## <chr> <chr> <int> <dbl> <int> <dbl>
10## 1 status fact~ 0 0 4 0.004
11## 2 credit_hi~ fact~ 0 0 5 0.005
12## 3 purpose fact~ 0 0 10 0.01 
13## 4 savings fact~ 0 0 5 0.005
14## 5 personal_~ fact~ 0 0 4 0.004
15## 6 other_deb~ fact~ 0 0 3 0.003
16## 7 property fact~ 0 0 4 0.004
17## 8 other_ins~ fact~ 0 0 3 0.003
18## 9 housing fact~ 0 0 3 0.003
19## 10 job fact~ 0 0 4 0.004
20## 11 telephone fact~ 0 0 2 0.002
21## 12 foreign_w~ fact~ 0 0 2 0.002
22## 13 credit_ri~ fact~ 0 0 2 0.002
23## 14 duration nume~ 0 0 33 0.033
24## 15 amount nume~ 0 0 921 0.921
25## 16 installme~ nume~ 0 0 4 0.004
26## 17 present_r~ nume~ 0 0 4 0.004
27## 18 age nume~ 0 0 53 0.053
28## 19 number_cr~ nume~ 0 0 4 0.004
29## 20 people_li~ nume~ 0 0 2 0.002
30## 21 employmen~ orde~ 0 0 5 0.005

上面的结果首先显示出来的,是数据名称及其类型,其次发现基本没有缺失,最后是看数据中有多少独特的取值。 此外,我们还可以用skimr包。与上面的方法相比,这个方法会自动对数据类型进行分类,而且还会给出每一个独特的值的数量,对数值型变量会给出直方图分布示意图


1p_load(skimr)
2
3skim(df)
4
5## Skim summary statistics
6## n obs: 1000 
7## n variables: 21 
8## 
9## -- Variable type:factor --------------------------------------------------------------------------------------------------
10## variable missing complete n n_unique
11## credit_history 0 1000 1000 5
12## credit_risk 0 1000 1000 2
13## employment_duration 0 1000 1000 5
14## foreign_worker 0 1000 1000 2
15## housing 0 1000 1000 3
16## job 0 1000 1000 4
17## other_debtors 0 1000 1000 3
18## other_installment_plans 0 1000 1000 3
19## personal_status_sex 0 1000 1000 4
20## property 0 1000 1000 4
21## purpose 0 1000 1000 10
22## savings 0 1000 1000 5
23## status 0 1000 1000 4
24## telephone 0 1000 1000 2
25## top_counts ordered
26## exi: 530, cri: 293, del: 88, all: 49 FALSE
27## goo: 700, bad: 300, NA: 0 FALSE
28## 1 <: 339, TRUE
29## yes: 963, no: 37, NA: 0 FALSE
30## own: 713, ren: 179, for: 108, NA: 0 FALSE
31## ski: 630, uns: 200, man: 148, une: 22 FALSE
32## non: 907, gua: 52, co-: 41, NA: 0 FALSE
33## non: 814, ban: 139, sto: 47, NA: 0 FALSE
34## mal: 548, fem: 310, mal: 92, mal: 50 FALSE
35## car: 332, rea: 282, bui: 232, unk: 154 FALSE
36## dom: 280, car: 234, rad: 181, car: 103 FALSE
37## FALSE
38## no : 394, FALSE
39## no: 596, yes: 404, NA: 0 FALSE
40## 
41## -- Variable type:numeric -------------------------------------------------------------------------------------------------
42## variable missing complete n mean sd p0 p25 p50
43## age 0 1000 1000 35.55 11.38 19 27 33 
44## amount 0 1000 1000 3271.26 2822.74 250 1365.5 2319.5
45## duration 0 1000 1000 20.9 12.06 4 12 18 
46## installment_rate 0 1000 1000 2.97 1.12 1 2 3 
47## number_credits 0 1000 1000 1.41 0.58 1 1 1 
48## people_liable 0 1000 1000 1.16 0.36 1 1 1 
49## present_residence 0 1000 1000 2.85 1.1 1 2 3 
50## p75 p100 hist
51## 42 75 ▇▇▆▃▂▁▁▁
52## 3972.25 18424 ▇▃▂▁▁▁▁▁
53## 24 72 ▇▅▅▃▁▁▁▁
54## 4 4 ▂▁▃▁▁▂▁▇
55## 2 4 ▇▁▅▁▁▁▁▁
56## 1 2 ▇▁▁▁▁▁▁▂
57## 4 4 ▂▁▆▁▁▃▁▇

一个比较好的可视化方法,是visdat包。


1p_load(visdat)
2
3vis_dat(df)

如果数据中有缺失值,也能够很好地展现出来,但是目前这里没有缺失值。

单变量数据分布

如果大家没有选择DataExplorer包的定制化数据报告服务,那么可以利用函数直接来看。


1p_load(DataExplorer)
2
3#数值型变量的分布观察
4plot_density(df)



1#因子型变量的分布观察
2plot_bar(df)


双变量数据分布

在这份数据中,响应变量是credit_risk,它代表着客户的守信水平,只有两个因子“Good”和“Bad”。我们想要看它和所有连续变量的关系。


1#响应变量为因子变量,因子变量与数值变量的关系,用箱线图表示
2plot_boxplot(df,by = "credit_risk")


如果想知道连续变量之间的关系,让我们做相关性矩阵图。


1p_load(dlookr)
2
3plot_correlate(df)

图中,越“椭圆”就越相关,蓝色是正相关,红色是负相关。如果连因子变量的相关性也想知道,那么就用DataExplorer包中的plot_correlation函数。


1plot_correlation(df)

它会把所有因子变量都用one-hot编码转化为数值型变量,然后做一个大的 相关分析矩阵。如果这不是你想要的,可以设置type参数,得到一个专门分析连续变量的图。


1plot_correlation(df,type = "c")


不过,想要同时获得相关性的信息,首推PerformanceAnalytics这个包。


1p_load(PerformanceAnalytics)
2
3df %>% 
4select_if(is.numeric) %>% #这种图只能看数值型变量的相互关系
5chart.Correlation()

对于数值型变量,这种能够同时观察分布、相关系数和显著性水平的图,非常地有效。

离群值处理

为什么要进行探索性数据分析?一方面是要对自己的数据表格有一个大致的认识,从而增进商务理解和数据理解,为后续的分析奠定基础。另一方面,就是看看数据有没有出问题,如果有缺失值,那么肯定需要插补或者删除;如果有离群值,那么也需要决定究竟是保留还是删掉。 我们这份数据集是案例数据集,因此没有缺失值,不过离群点还是可以进行检测的。如果一个记录的某一数值远离其平均水平,那么认为这个记录是离群点。至于界定“远离平均水平”的标准,要视业务本身数据分布而定。经典的离群点检测法,是箱线图判断离群点的方法(统计学上称为Tukey’s fences),这是基于单变量的。这个方法大家可以在维基查询到,网址为https://en.wikipedia.org/wiki/Outlier。很多R包默认的方法都是基于这个规则的,并可以自动删除、替代、设为缺失值。 发现离群点,要知道离群点背后的意义。比如我们的数据中,年龄这个变量有离群点,因为部分用户年龄过高,与平均值差距很大。但是这不是因为错误导致的,如果直接去除,也是不合适的。这样一来会减少信息的量,二来会忽视一些本来应该注意到的问题。离群点的寻找,一方面是为了想办法消除离群点给数据带来的影响,从而让我们的机器学习方法具有更强的鲁棒性;第二方面,其实可以找到这些离群值,然后对离群值进行一些详细的研究。很多欺诈的案例都是通过寻找离群点找到的,因为存在欺诈行为的用户,他们的行为会跟正常的用户有显著的差异。 在本案例中,我们首先要看哪些变量存在离群值。应该明确的是,分类变量是不会有离群值的,只有数值型变量才有探索离群值的意义。我们用dlookr的diagnose_outliers函数,来查看变量离群值的情况。


1diagnose_outlier(df)
2
3## # A tibble: 7 x 6
4## variables outliers_cnt outliers_ratio outliers_mean with_mean
5## <chr> <int> <dbl> <dbl> <dbl>
6## 1 duration 70 7. 50.5 20.9 
7## 2 amount 72 7.2 10940. 3271. 
8## 3 installm~ 0 0 NaN 2.97
9## 4 present_~ 0 0 NaN 2.84
10## 5 age 23 2.3 68.5 35.5 
11## 6 number_c~ 6 0.6 4 1.41
12## 7 people_l~ 155 15.5 2 1.16
13## # ... with 1 more variable: without_mean <dbl>

6个列中,第一列为变量名称,第二列是离群值个数,后面分别是离群值比例、离群值均值、包含离群值的全体的均值、去除离群值的全体的均值。因为installment_rate和present_residence变量不存在利群值,因此无法计算离群值的均值。我们看到people_liable是担保人的数量,其实它应该被认定为一个分类变量,因为它的取值只有1和2,所以如果对这个离群值做处理显然是错误的。 回归方法对离群值是敏感的,不过我们可以对变量先进行中心化、标准化,从而减少离群值的影响。如果想要得到整个数据质量报告,可以用dlookr的diagonse_report函数。


1diagnose_report(df)



探索性数据分析的下一步,应该是数据预处理(特征工程)。如果不了解业务和数据,那么预处理就无从谈起。因此我们做探索性数据分析的时候,需要尽可能地观察数据的特点,并思考其背后的原因。一般来说,探索性数据分析需要知道一下几点:

数据的行列数,即多少样本、多少特征

数据特征的属性,也就是说这些数据有多少分类变量、多少数值变量

数据特征的分布,数值变量要看密度分布,分类变量要看每个分类的占比

数据特征之间的相关性,是否存在共线性?解释变量与响应变量的关系是否明显?

数据是否存在缺失值?如果存在缺失值,是否能够解释缺失的原因?是随机缺失还是非随机缺失,或者是介于两者之间。是否能够根据其自身的特征和缺失的特点来进行插值,或者是应该剔除掉?(本案例没有出现这个情况,没有讨论,今后的案例会尝试讨论这个问题)

数据特征中是否存在离群值?离群值是什么原因导致的?是真实的还是因为错误的操作?为了进行建模,应该如何处理这些离群值?(z中心化?取对数?还是直接剔除掉)

总的来说,探索性数据分析就是对数据特征的挖掘过程,发现它们的特点,一方面加深我们对业务的认识,另一方面也防止明显的错误。以上均为个人对数据进行探索的一些方法,如果有更多探索性的方法,请各位大佬积极补充。希望能够最后迭代出一套较为通用的探索性数据分析方法,从而为广大的数据科学家带来便利。

往期精彩:

R语言ETL工程系列:总论

R爬虫小白入门:Rvest爬链家网+分析(一)

R语言ETL系列:过滤(filter)

R语言中文社区2018年终文章整理(作者篇)

R语言中文社区2018年终文章整理(类型篇)

公众号后台回复关键字即可学习

回复 爬虫            爬虫三大案例实战
回复 Python       1小时破冰入门
回复 数据挖掘     R语言入门及数据挖掘
回复 人工智能     三个月入门人工智能
回复 数据分析师  数据分析师成长之路 
回复 机器学习     机器学习的商业应用
回复 数据科学     数据科学实战
回复 常用算法     常用数据挖掘算法


鲜花

握手

雷人

路过

鸡蛋
该文章已有0人参与评论

请发表评论

全部评论

专题导读
上一篇:
R语言一元线性模型及结果分析发布时间:2022-07-18
下一篇:
R语言_第二章习题发布时间:2022-07-18
热门推荐
热门话题
阅读排行榜

扫描微信二维码

查看手机版网站

随时了解更新最新资讯

139-2527-9053

在线客服(服务时间 9:00~18:00)

在线QQ客服
地址:深圳市南山区西丽大学城创智工业园
电邮:jeky_zhao#qq.com
移动电话:139-2527-9053

Powered by 互联科技 X3.4© 2001-2213 极客世界.|Sitemap