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

邮箱:huang.tian-yuan@qq.com

前言

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

数据导入

数据是来自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语言入门及数据挖掘
回复 人工智能     三个月入门人工智能
回复 数据分析师  数据分析师成长之路 
回复 机器学习     机器学习的商业应用
回复 数据科学     数据科学实战
回复 常用算法     常用数据挖掘算法

一生热爱,回头太难↓

R语言信用评分卡:探索性数据分析相关推荐

  1. R语言explore包进行探索性数据分析实战(EDA、exploratory data analysis):基于iris数据集

    R语言explore包进行探索性数据分析实战(EDA.exploratory data analysis):基于iris数据集 目录

  2. r k-means 分类结果_R语言信用评分卡:数据分箱(binning)

    作者:黄天元,复旦大学博士在读,热爱数据科学与R,热衷推广R在工业界与学术界的应用.邮箱:huang.tian-yuan@qq.com.欢迎合作交流 library(knitr) opts_chunk ...

  3. 基于R的信用评分卡模型解析

    信用评分流程 1.数据获取 我使用的信贷数据共有3000条数据,每条数据11个特征. rm(list=ls()) setwd("D:\\case") library(xlsx) d ...

  4. xieshiran:使用 R 语言开发评分卡模型

    为了提高评分卡模型的开发效率,我为 R 语言社区贡献了一个开源项目 scorecard 包 (HomePage, Github, CRAN).该 R 包提供了评分卡开发过程中的常用功能,包括变量粗筛. ...

  5. 《R语言与统计分析》-探索性数据分析

    ####渐近正态性的图形检验#### limite.central<- function(r=runif,distpar=c(0,1),m=0.5,s=1/sqrt(12),n=c(1,3,10 ...

  6. WOE信用评分卡--R语言实例

    目录(?)[-] 信用卡评分 一数据准备 二数据处理 三变量分析 四切分数据集 五Logistic回归 六WOE转换 七评分卡的创建和实施 转载自:http://blog.csdn.net/csqaz ...

  7. 信用评分卡模型(R语言)

    贷款风险预测-信用评分卡模型(R语言) 时间:2018年10月9日 本次的分析数据来自Kaggle数据竞赛平台的"give me some credit"竞赛项目.下载地址为:ht ...

  8. 信用评分卡--R语言

    --- title: "信用评分模型" author:"junjun" date: "2016年10月3日" output:html_doc ...

  9. 「实战案例」基于Python语言开发的信用评分卡

    信用风险计量模型可以包括跟个人信用评级,企业信用评级和国家信用评级.人信用评级有一系列评级模型组成,常见是A卡(申请评分卡).B卡(行为模型).C卡(催收模型)和F卡(反欺诈模型). 今天我们展示的是 ...

  10. Python语言实现信用评分卡建模分析

    背景介绍 信用评分技术是一种应用统计模型,其作用是为信用卡申请人计算一个风险评估分值的方法. 而这种用途的统计模型就称为信用评分卡.信用评分卡可以根据客户提供的资料.客户的历史数据以及第三方平台(支付 ...

最新文章

  1. 在Dev C++中使用c语言图形库的配置
  2. HEOI2016/TJOI2016 字符串问题
  3. linux命令行ps1变量_利用Shell中变量PS1定制Linux Shell命令主提示符
  4. 语言检测工具-langid
  5. 【Python】详解Pandas与Lambda结合进行高效数据分析
  6. 安装 Go 第三方包 go-sqlite3
  7. Oracle数据库的视图
  8. java实体null值显示_java反射实现前端接收实体对象,去除“null”字符串(示例代码)...
  9. 大数据爆炸改变企业的决策
  10. dtft频移性质_08 DTFT变换的性质
  11. 杰理AC692X---691X,690X,692X芯片差异(2)
  12. Android国家区号 中英文
  13. 小程序 怎样判断数据的类型
  14. STM32F103ZET6的芯片工程改为STM32F103C8T6的工程
  15. 正则表达式学习——(2)正则回溯
  16. 用C语言程序算交税,用C语言编写函数InComeTax计算七级累进税率的税后收入
  17. 免费超大量邮件发送服务Amazon SES和Mailgun提供SMTP和API支持
  18. MySQL基础|设置登录用户权限,访问ip地址---防止数据库误删,详细版
  19. java 响铃_怎么样编写一个java响铃程序?
  20. 中南民族大学 计算机组成原理实验报告,计算机系统结构实验报告(中南民族大学)...

热门文章

  1. Spring Boot + Prometheus + Grafana 打造可视化监控,一目了然!
  2. 4种软件架构,看看你属于哪个层次!
  3. 兼顾高可靠和低延迟,Google打算用QUIC协议替代TCP/UDP
  4. 2019年最好用的6款数据库监控工具
  5. 厉害了,苹果爸爸承认让旧 iPhone 变慢!
  6. Kotlin 1.0 正式版发布啦
  7. java给mongo数组添加_如何使用具有新值的java在mongodb中的现有集合中追加现有数组...
  8. table 条数过大优化_MySQL数据库优化的介绍(图文)
  9. 三包围结构的字是什么样的_清桦学书之结构篇——包围结构。
  10. 'pip' 不是内部或外部命令,也不是可运行的程序 或批处理文件。