文档章节

R数据分析及可视化的一个简单例子

yinkaipeng
 yinkaipeng
发布于 2014/11/12 09:37
字数 1754
阅读 406
收藏 1
点赞 0
评论 0

需求分析

葡萄牙某银行拟根据现有客户资料建立预测模型,以配合其数据库营销策略,营销方式为电话直销,销售产品为某金融产品(term deposit),数据分析的目标为通过预测模型识别对该金融产品有较高购买意愿的用户群。  

数据形式:从数据库中导出的excel文件

数据内容:

 # bank client data:
   1 - age (numeric)
   2 - job : type of job (categorical: "admin.","unknown","unemployed","management","housemaid","entrepreneur","student",
                                       "blue-collar","self-employed","retired","technician","services")
   3 - marital : marital status (categorical: "married","divorced","single"; note: "divorced" means divorced or widowed)
   4 - education (categorical: "unknown","secondary","primary","tertiary")
   5 - default: has credit in default? (binary: "yes","no")
   6 - balance: average yearly balance, in euros (numeric)
   7 - housing: has housing loan? (binary: "yes","no")
   8 - loan: has personal loan? (binary: "yes","no")
   # related with the last contact of the current campaign:
   9 - contact: contact communication type (categorical: "unknown","telephone","cellular")
  10 - day: last contact day of the month (numeric)
  11 - month: last contact month of year (categorical: "jan", "feb", "mar", ..., "nov", "dec")
  12 - duration: last contact duration, in seconds (numeric)
   # other attributes:
  13 - campaign: number of contacts performed during this campaign and for this client (numeric, includes last contact)
  14 - pdays: number of days that passed by after the client was last contacted from a previous campaign (numeric, -1 means client was not previously contacted)
  15 - previous: number of contacts performed before this campaign and for this client (numeric)
  16 - poutcome: outcome of the previous marketing campaign (categorical: "unknown","other","failure","success")

  Output variable (desired target):
  17 - y - has the client subscribed a term deposit? (binary: "yes","no")

下面用R语言进行数据分析及可视化

> bank <- read.csv("H:/bank/bank-full.csv", sep = ";", header = T) //载入数据
> summary(bank) //对数据进行分析汇总

//导入要用到的包
> library(caret)
> library(ggplot2)
> library(gplots)
 
> require(rpart)
> require(caret)
> require(ggplot2)
> require(gplots)
//运用决策树模型对数据做初步分类建模和变量选择
> bank.tree <- rpart(y ~ ., data = bank, method = "class", cp = 0.001)
> treeImp <- varImp(bank.tree, scale = TRUE, surrogates = FALSE, competes = TRUE)
> treeImp$Variable <- rownames(treeImp)
> treeImp.sort <- treeImp[order(-treeImp$Overall), ]
> ggplot(treeImp, aes(Variable, Overall)) + geom_bar(stat = "identity") + coord_flip()

//根据cpplot对树做裁剪
plotcp(bank.tree)

//输出
> printcp(bank.tree)

Classification tree:

rpart(formula = y ~ ., data = bank, method = "class", cp = 0.001)

 

Variables actually used in tree construction:

 [1] age       balance   contact   day       duration  education housing   job       marital 

[10] month     pdays     poutcome  previous

 

Root node error: 5289/45211 = 0.11698

 

n= 45211

 

          CP nsplit rel error  xerror     xstd

0.0380034      0   1.00000 1.00000 0.012921

0.0253356      3   0.88599 0.89147 0.012287

0.0170164      4   0.86065 0.86425 0.012120

0.0080355      5   0.84364 0.84969 0.012028

0.0042226      7   0.82757 0.84061 0.011971

0.0039705     10   0.81490 0.84061 0.011971

0.0034033     13   0.80299 0.83324 0.011924

0.0022373     15   0.79618 0.82133 0.011848

0.0019537     21   0.78276 0.81584 0.011812

10 0.0017962     24   0.77690 0.81566 0.011811

11 0.0016071     26   0.77330 0.81717 0.011821

12 0.0015126     30   0.76687 0.82057 0.011843

13 0.0014180     32   0.76385 0.81906 0.011833

14 0.0013235     40   0.75099 0.81887 0.011832

15 0.0012290     44   0.74570 0.81755 0.011823

16 0.0011344     51   0.73587 0.81660 0.011817

17 0.0010399     61   0.72452 0.81868 0.011831

18 0.0010000     63   0.72244 0.82416 0.011866

//绘制决策树
> bank.tree <- rpart(y ~ ., data = bank, method = "class", cp = 0.0022373)
> plot(bank.tree, branch = 0, margin = 0.1, uniform = T)
> text(bank.tree, use.n = T, col = "red", cex = 0.6)

//变量初选,分析和变换

根据决策树分析的结果,我们选择变量重要性最高的前5个变量做进一步研究,依次是:

 

Duration : last contact duration, in seconds (numeric)

month : last contact month of year (categorical: "jan", "feb", "mar", ..., "nov", "dec")

poutcome : outcome of the previous marketing campaign (categorical: "unknown","other","failure","success")

pdays : number of days that passed by after the client was last contacted from a previous campaign (numeric, -1 means client was not previously contacted)

previous : number of contacts performed before this campaign and for this client (numeric)

//a) Duration参数分析
> bank$y_dummy = ifelse(bank$y == "yes", 1, 0)
> summary(bank$duration)
   Min. 1st Qu.  Median    Mean 3rd Qu.    Max. 
    0.0   103.0   180.0   258.2   319.0  4918.0 
> ggplot(bank, aes(duration, y_dummy)) + geom_smooth() + geom_point()

//根据拟合形态对Duration做一个二次项。
> bank$duration.sq <- bank$duration * bank$duration

//b)对month 参数分析
> summary(bank$month)
  apr   aug   dec   feb   jan   jul   jun   mar   may   nov   oct   sep 
 2932  6247   214  2649  1403  6895  5341   477 13766  3970   738   579 
> library(Rcmdr)
> plotMeans(bank$y_dummy, bank$month, error.bars = "se")

> bank$month.sel <- ifelse(bank$month == "dec", 1, 0)
> bank$month.sel <- ifelse(bank$month == "mar", 1, bank$month)
> bank$month.sel <- ifelse(bank$month == "oct", 1, bank$month)
> bank$month.sel <- ifelse(bank$month == "sep", 1, bank$month)

//c) poutcome参数分析
>summary(bank$poutcome)
failure   other success unknown 
   4901    1840    1511   36959 
> plotMeans(bank$y_dummy, bank$poutcome, error.bars = "se")

> bank$poutcome.success <- ifelse(bank$poutcome == "success", 1, 0)

//d)pdays参数分析
 
> summary(bank$pdays)
   Min. 1st Qu.  Median    Mean 3rd Qu.    Max. 
   -1.0    -1.0    -1.0    40.2    -1.0   871.0 
> bank$nocontact <- ifelse(bank$pdays == -1, 1, 0)
> bank$pdays <- ifelse(bank$pdays == -1, 0, bank$pdays)
> summary(bank$nocontact)
   Min. 1st Qu.  Median    Mean 3rd Qu.    Max. 
 0.0000  1.0000  1.0000  0.8174  1.0000  1.0000 
> plotMeans(bank$y_dummy, as.factor(bank$nocontact), error.bars = "se")

> ggplot(bank, aes(log(pdays + 1))) + geom_histogram()

> ggplot(bank, aes(log(pdays + 1), y_dummy)) + geom_smooth() + geom_point()

//e) previous参数分析
 
> summary(bank$previous)
    Min.  1st Qu.   Median     Mean  3rd Qu.     Max. 
  0.0000   0.0000   0.0000   0.5803   0.0000 275.0000 
 
> ggplot(bank, aes(log(previous + 1))) + geom_histogram()

> ggplot(bank, aes(log(previous + 1), y_dummy)) + geom_smooth() + geom_point()

> bank$previous.0 <- as.factor(ifelse(bank$previous == 0, 1, 0))
> bank$previous.1 <- as.factor(ifelse(bank$previous == 1, 1, 0))
> bank$previous.2 <- as.factor(ifelse(bank$previous == 2, 1, 0))
> bank$previous.2plus <- as.factor(ifelse(bank$previous > 2, 1, 0))

//逻辑回归建模
> logistic.full <- glm(y_dummy ~ duration + duration.sq + month.sel + poutcome.success + 
+     bank$nocontact + log(pdays + 1) + bank$previous.0 + bank$previous.1 + bank$previous.2 + 
+     bank$previous.2plus, data = bank)
> summary(logistic.full)

Call:

glm(formula = y_dummy ~ duration + duration.sq + month.sel +

    poutcome.success + bank$nocontact + log(pdays + 1) + bank$previous.0 +

    bank$previous.1 + bank$previous.2 + bank$previous.2plus,

    data = bank)

 

Deviance Residuals:

     Min        1Q    Median        3Q       Max 

-1.15672  -0.11482  -0.04176   0.01313   1.08332 

 

Coefficients: (2 not defined because of singularities)

                       Estimate Std. Error t value Pr(>|t|)   

(Intercept)           1.583e-01  2.348e-02   6.742 1.58e-11 ***

duration              6.574e-04  9.605e-06  68.444  < 2e-16 ***

duration.sq          -1.350e-07  6.145e-09 -21.971  < 2e-16 ***

month.sel            -6.720e-03  4.346e-04 -15.463  < 2e-16 ***

poutcome.success      4.555e-01  8.085e-03  56.340  < 2e-16 ***

bank$nocontact       -1.749e-01  2.336e-02  -7.490 7.04e-14 ***

log(pdays + 1)       -2.106e-02  4.335e-03  -4.858 1.19e-06 ***

bank$previous.01             NA         NA      NA       NA   

bank$previous.11     -2.522e-02  7.126e-03  -3.540 0.000401 ***

bank$previous.21     -1.641e-02  7.714e-03  -2.128 0.033367 * 

bank$previous.2plus1         NA         NA      NA       NA   

---

Signif. codes:  0 ‘***’ 0.001 ‘**’ 0.01 ‘*’ 0.05 ‘.’ 0.1 ‘ ’ 1

 

(Dispersion parameter for gaussian family taken to be 0.07690626)

 

    Null deviance: 4670.3  on 45210  degrees of freedom

Residual deviance: 3476.3  on 45202  degrees of freedom

AIC: 12340

 

Number of Fisher Scoring iterations: 2

> logistic.step <- step(logistic.full, direction = "both", k = 2)


Start:  AIC=12340.45

y_dummy ~ duration + duration.sq + month.sel + poutcome.success +

    bank$nocontact + log(pdays + 1) + bank$previous.0 + bank$previous.1 +

    bank$previous.2 + bank$previous.2plus

 

 

Step:  AIC=12340.45

y_dummy ~ duration + duration.sq + month.sel + poutcome.success +

    bank$nocontact + log(pdays + 1) + bank$previous.0 + bank$previous.1 +

    bank$previous.2

 

 

Step:  AIC=12340.45

y_dummy ~ duration + duration.sq + month.sel + poutcome.success +

    bank$nocontact + log(pdays + 1) + bank$previous.1 + bank$previous.2

 

                   Df Deviance   AIC

<none>                  3476.3 12340

- bank$previous.2   1   3476.7 12343

- bank$previous.1   1   3477.3 12351

- log(pdays + 1)    1   3478.1 12362

- bank$nocontact    1   3480.6 12394

- month.sel         1   3494.7 12577

- duration.sq       1   3513.4 12819

- poutcome.success  1   3720.4 15407

- duration          1   3836.6 16797

> summary(logistic.step)

Call:

glm(formula = y_dummy ~ duration + duration.sq + month.sel +

    poutcome.success + bank$nocontact + log(pdays + 1) + bank$previous.1 +

    bank$previous.2, data = bank)

 

Deviance Residuals:

     Min        1Q    Median        3Q       Max 

-1.15672  -0.11482  -0.04176   0.01313   1.08332 

 

Coefficients:

                   Estimate Std. Error t value Pr(>|t|)   

(Intercept)       1.583e-01  2.348e-02   6.742 1.58e-11 ***

duration          6.574e-04  9.605e-06  68.444  < 2e-16 ***

duration.sq      -1.350e-07  6.145e-09 -21.971  < 2e-16 ***

month.sel        -6.720e-03  4.346e-04 -15.463  < 2e-16 ***

poutcome.success  4.555e-01  8.085e-03  56.340  < 2e-16 ***

bank$nocontact   -1.749e-01  2.336e-02  -7.490 7.04e-14 ***

log(pdays + 1)   -2.106e-02  4.335e-03  -4.858 1.19e-06 ***

bank$previous.11 -2.522e-02  7.126e-03  -3.540 0.000401 ***

bank$previous.21 -1.641e-02  7.714e-03  -2.128 0.033367 * 

---

Signif. codes:  0 ‘***’ 0.001 ‘**’ 0.01 ‘*’ 0.05 ‘.’ 0.1 ‘ ’ 1

 

(Dispersion parameter for gaussian family taken to be 0.07690626)

 

    Null deviance: 4670.3  on 45210  degrees of freedom

Residual deviance: 3476.3  on 45202  degrees of freedom

AIC: 12340

 

Number of Fisher Scoring iterations: 2

//模型scoring和ROC评估
> require(ROCR)
载入需要的程辑包:ROCR
> bank.pred<-1/(1+exp(-predict(logistic.step)))
> roc.data <- prediction(bank.pred, labels = bank$y)
> roc.data <- performance(roc.data, "tpr", "fpr")
> plot(roc.data)

> score<-data.frame("prob.y"=bank.pred,"y"=as.factor(bank$y_dummy))
>ggplot(score, aes(x=prob.y, fill=y)) + geom_histogram(position="identity", binwidth=0.01,alpha=0.5)

通过对ROCScore分布的分析,逻辑回归Score的分类效果还是不错的。具体的score cutoff值需要根据业务要求和营销成本而定。

© 著作权归作者所有

共有 人打赏支持
yinkaipeng
粉丝 0
博文 9
码字总数 8858
作品 0
西安
程序员
在ipython notebook中调用ggplot的三种不同的方法

在大数据时代,数据可视化是一个非常热门的话题。各个BI的厂商无不在数据可视化领域里投入大量的精力。Tableau凭借其强大的数据可视化的功能成为硅谷炙手可热的上市公司。Tableau的数据可视化...

naughty
2014/07/03
0
2
数据可视化之美:经典案例与实践解析

作者:jihong10102006 随着DT时代的到来,传统的统计图表很难对复杂数据进行直观地展示。这几年数据可视化作为一个新研究领域也变得越来越火。成功的可视化,如果做得漂亮,虽表面简单却富含...

op07p6aaqo9u71
2017/10/26
0
0
R | 对亚马逊新总部可能位置进行可视化

前不久,亚马逊宣布在寻找一个城市建立第二个总部。 他们对这个城市的标准是超过100万人,同时这个城市也要人才济济。 在一个新闻网站上面发现,我发现了一些可能的城市名单,他们都有超过1...

wzgl__wh
2017/10/28
0
0
Python VS R,哪个更适合开发者?

21CTO社区导读:Python和R同时出现在20世纪九十年代。它为数据科学家提供了大量的数据模型操作的能力。在发展了30年后,Python与R开始出现不同的爱好者阵营。 90年代出现了互联网,这一事物永...

21CTO
04/28
0
0
Python和R:学哪个好?

在当下,人工智能的浪潮席卷而来。从AlphaGo、无人驾驶技术、人脸识别、语音对话,到商城推荐系统,金融业的风控,量化运营、用户洞察、企业征信、智能投顾等,人工智能的应用广泛渗透到各行...

个推君
2017/11/28
0
0
【翻译】Awesome R资源大全中文版来了,全球最火的R工具包一网打尽,超过300+工具,还在等什么?

阅读目录 0.前言 1.集成开发环境 2.语法 3.数据操作 4.图形显示 5.HTML部件 6.复用组件研究 7.Web技术和服务 8.并行计算 9.高性能 10.语言API 11.数据库管理 12.机器学习 13.自然语言处理 14...

老朱第八
2017/11/13
0
0
数据可视化工具大集合

摘要:所谓数据可视化是对大型数据库或数据仓库中的数据的可视化,它是可视化技术在非空间数据领域的应用,使人们不再局限于通过关系数据表来观察和分析数据信息,还能以更直观的方式看到数据...

阿里云云栖社区
2017/12/04
0
0
数据挖掘工程师如何选择数据可视化工具?

如何选择数据可视化工具? 如何选用数据可视化工具?在回答这个问题之前现需要回答另外一个问题,你需要用这些数据可视化工具来做什么,实现什么目的。 也许你有一个完整的想法,已经通过验证...

huangbo929
2017/07/03
0
0
numpy:python数据领域的功臣

前言 numpy对python的意义非凡,在数据分析与机器学习领域为python立下了汗马功劳。现在用python搞数据分析或机器学习经常使用的pandas、matplotlib、sklearn等库,都需要基于numpy构建。毫不...

丹追兵
2017/11/29
0
0
使用开源软件快速搭建数据分析平台

最近,国内涌现出了不少数据分析平台产品,例如魔镜和数据观。 这些产品的目标应该都是self service的BI,利用可视化提供数据探索的功能,并且加入机器学习和预测的功能。它们对标的产品应该...

naughty
2016/03/03
11.9K
57

没有更多内容

加载失败,请刷新页面

加载更多

下一页

nodejs安装以及环境配置(很好的node安装和配置文章,少走很多弯路)

一、安装环境 1、本机系统:Windows 10 Pro(64位) 2、Node.js:v6.9.2LTS(64位) 二、安装Node.js步骤 1、下载对应你系统的Node.js版本:https://nodejs.org/en/download/ 2、选安装目录进...

sprouting
14分钟前
0
0
Redisson

了解了Redisson,发现使用挺简单的,接下来准备深入学习一下。 Redisson介绍 Redisson是架设于Redis基础之上的一个Java驻内存数据网格(In-Memory Data Grid) Redisson在基于NIO的Netty框架上...

to_ln
14分钟前
0
0
python有哪些好玩的应用实现,用python爬虫做一个二维码生成器

python爬虫不止可以批量下载数据,还可以有很多有趣的应用,之前也发过很多,比如天气预报实时查询、cmd版的实时翻译、快速浏览论坛热门帖等等,这些都可以算是爬虫的另一个应用方向! 今天给...

python玩家
15分钟前
0
0
jq 判断复选框是否被选中,复选框后台接收

1. 效果 2. 代码 html部分: JS部分: var rememberLogin = $("#rememberLoginId").is(':checked')//获取复选框是否被选中 var rememberLoginval = $("#rememberLoginId").attr('value')//拿......

Lucky_Me
22分钟前
0
0
python爬虫日志(3)-爬去异步加载网页

在浏览器检查元素页面中,选取Network中的XHR选项即可观察每次加载页面,网页发出的请求,观察url的规律即可利用封装的函数对每一页进行爬取。

茫羽行
22分钟前
0
0
《趣谈网络协议》之为什么要学习网络协议?

一、协议 1.协议的定义 简单说协议就是一个规则,保证沟通交流双方可以互相听懂、理解或者可以双方合作可以顺利进行的一个约定和规则。 2.生活中例子 (1)有一种叫“程序猿”的物种,敲着一种...

aibinxiao
24分钟前
1
0
Python数据分析numpy基础-维度的认识

什么是多维数组? 核心对象是同型的多维数组(简单理解就是一个表格,通常内容都是些数字),具有相同的数据类型。 概念: 1. axes(轴):数组的维度统称为轴。 2. rank:轴的数量称为rank。...

十年磨一剑3344
28分钟前
0
0
Java 正则表达式相关资料

1.java正则表达式过滤html标签

IT追寻者
31分钟前
0
0
点赞出现数字变大效果

<!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8"> <title>Title</title> <style> .container{ padding: 50px; border: 1px solid #dddddd; } .item{ position: relative; } ......

南桥北木
49分钟前
0
0
anroid中批量将px转换成dp

package com.qu;import java.io.File;import java.io.FileWriter;import java.io.IOException;public class Aaaa {public static void main(String[] args) {String fi......

android-key
51分钟前
0
0

没有更多内容

加载失败,请刷新页面

加载更多

下一页

返回顶部
顶部