数据分析学习体验——实际案例_逻辑回归&线性回归

作者: 江俊
日期: 2018年3月27日

主要介绍批量生成profiling图以及五数概括的自建函数。

项目背景

某保养品公司目前有一款产品线销售情况一直不景气,公司预算有限,希望在现有的客户中挖掘出最有可能在30天内购买该产品的用户群

使用语言

R语言

使用模型

逻辑回归+线性回归

建模步骤

一、 了解数据

  • 数据结构
  • Y变量定义
  • X变量类型
  • 响应率情况
  • 花费金额分布

代码:

rm(list=ls())
setwd("./") #change the location
getwd()      #check the location
list.files() #list the files under your location

#########################################################################
########################   Part1 read data    ###########################
#########################################################################
filepath<-"./Exercise_Response_data.csv"
raw<-read.csv(filepath,stringsAsFactors = F)

dim(raw)
str(raw)
summary(raw)
var<-data.frame(var=colnames(raw),type=sapply(raw,class))

# 将结果导出到 xlsx表格
require(XLConnect)
#xlsx <- loadWorkbook('Correlation.xlsx',create=TRUE)
xlsx <- loadWorkbook('myhomework.xlsx',create = T)
createSheet(xlsx,name='variable')  #name the worksheet as 'correlation'
writeWorksheet(xlsx,var,'variable',startRow=1,startCol=1, header=TRUE)  #define the startrow,startcol,header
saveWorkbook(xlsx)

# dv_revenue
  summary(raw$dv_revenue)
  raw$dv_revenue<-ifelse(is.na(raw$dv_revenue),0,raw$dv_revenue)
  # table 自动忽略缺失值
  View(table(raw$dv_revenue))
  hist(raw$dv_revenue)                         # dv_revenue hist
  quantile(raw$dv_revenue,(1:20)/20,na.rm = T) # dv_revenue quantile

  View(t(mean_rev<-quantile(raw$dv_revenue,c(0,0.01,0.1,0.25,0.5,0.75,0.9,0.99,1),na.rm = T)))

  hist(raw[raw$dv_revenue>0 & raw$dv_revenue<=50,"dv_revenue"],main="dev_revenue <=50",xlab = "dev_revenue")

# dv_response
  table(raw$dv_response)
  prop.table(table(raw$dv_response))

执行结果:
这里写图片描述

 0     1 
22878  1220 

         0          1 
0.94937339 0.05062661 

二、拆分数据

  • train:训练集
  • test:验证集
    代码:
#########################################################################
########################   Part2 split into two    ######################
#########################################################################
# modeling segments
  table(raw$segment)
  prop.table(table(raw$segment))

#separate build sample
  train<-raw[raw$segment=="build",]
  table(train$segment)

#separate inval sample
  test<-raw[raw$segment=="inval",]
  table(test$segment)

执行结果:

build inval 
16898  7200 

  build   inval 
0.70122 0.29878 

build 
16898 

inval 
 7200 

三、 探索数据

  • 分类型、数值型
  • X内部表现
  • X与Y关系
  • 缺失值

批量生成profiling图

代码:

#########################################################################
########################   Part3 profile     ############################
#########################################################################
  #overall performance
  #总体人数,计算总体样本响应情况
  overrall<-dim(train)[1]
  #相应人数,因为响应的记为1,所以可以直接使用sum()求和
  over_responder<-sum(train$dv_response)
  #responder<-length(train$dv_response[train$dv_response==1])
  #响应率
  over_response_rate<-over_responder/overrall
  overall_perf<-data.frame(overrall,responder=over_responder,response_rate=over_response_rate)
  overall_perf

  #variable type  
  data.frame(table(sapply(train[,4:27],class)))

  #character
  #查看数据类型为某种的数据名,类似的有:is.character,is.numeric,is.factor
  chavar_name<-colnames(train[,4:27])[unlist(lapply(train[,4:27],is.character))]
  #字符型数据索引
  charater_index<-which(colnames(train) %in% chavar_name)
  lapply(train[,chavar_name],table)

  #整数型,注意可能是分类型数值
  intvar_name<-colnames(train[,4:27])[unlist(lapply(train[4:27],is.integer))]
  summary(train[,intvar_name])

  #根据结果记录分类型数值的变量名
  var_fenlei<-c(chavar_name,"Occupation","Education","Frequency_of_last_mth")
  lapply(train[,var_fenlei],table)
  #根据分类型和连续型将原数据集分成两类,方便后续profile的批量处理
  #分类型数值的索引
  fenlei_index<-which(colnames(train) %in% var_fenlei)

  #除开id列,响应变量列,字符型,分类型数值以外的连续数值型变量
  #which(colnames(train[,4:27]) %in% c("rid","dv_response","dv_revenue"))
  numvar_name<-colnames(train[,-c(1:3,fenlei_index,28:ncol(train))])

  #数值型数值的索引
  lianxu_index<-which(colnames(train) %in% numvar_name)

  ############################################### 1. Profiling for category variables####################################################
  #install.packages('plyr')
  library(plyr)

  ###################################### 1.profile 分类型数值 #########################################

  #封装函数,分类型数值
  #数据集,索引,索引长度
  profile_fenlei<-function(x,y,n){
    results<-data.frame(var=NA,category=NA,count=NA,responder=NA,
                        percent=NA,response_rate=NA,index=NA)
    for(i in 1:n){
      prof<-ddply(x,.(x[,y[i]]),summarise,count=length(id),responder=sum(dv_response)) #group by hh_gender_m_flg
      #prof
      #添加百分比结果
      propf<-within(prof,{
        index<-responder/count/over_response_rate*100
        response_rate<-responder/count*100
        percent<-count/overrall*100
      })  #add response_rate,index, percentage
      propf<-data.frame(var=colnames(train)[y[i]],propf)   
      colnames(propf)[2]<-"category"
      #行连接
      results<-rbind(results,propf)
    }
    #去除首行的空值
    results<-results[-1,]
    row.names(results)<-1:nrow(results)
    return(results)
  }
  #分类数值的profile
  results_fenlei<-profile_fenlei(train[,1:28],fenlei_index,length(fenlei_index))
  results_fenlei$category[is.na(results_fenlei$category)]<-"unknown"
  results_fenlei$category[results_fenlei$category==""]<-"unknown"
  View(results_fenlei)

  # #xlsx <- loadWorkbook('Correlation.xlsx',create=TRUE)
  # xlsx <- loadWorkbook('myhomework.xlsx')
  # createSheet(xlsx,name='profile')  #name the worksheet as 'correlation'
  # writeWorksheet(xlsx,results_fenlei,'profile',startRow=1,startCol=1, header=TRUE)  #define the startrow,startcol,header
  # saveWorkbook(xlsx)
  # 
  # 
  ###################################### 1.profile 分类型数值 #########################################

  #####################################  2.profile 连续型数值 #########################################

  ######封装函数
  #数据集,索引,索引长度,分段个数
  profile_lianxu<-function(x,y,n,m){
    var_data=x
    results<-data.frame(var=NA,category=NA,count=NA,responder=NA,
                        percent=NA,response_rate=NA,index=NA)
    for(i in 1:n){
      #分离成两部分:缺失值和无缺失值
      nomissing<-data.frame(var_data[!is.na(var_data[,y[i]]),]) #select the no missing value records 
      missing<-data.frame(var_data[is.na(var_data[,y[i]]),])    #select the missing value records
      ##################3.2.1 numeric Profiling:missing part 
      missing2<-ddply(missing,.(missing[,y[i]]),summarise,count=length(id),responder=sum(dv_response)) #group by pos_revenue_base_sp_6mo
      colnames(missing2)[1]<-"category"
      #View(missing2)
      missing_perf<-within(missing2,{
        index<-responder/count/over_response_rate*100
        response_rate<-responder/count*100
        percent<-count/overrall*100
      })   
      #View(missing_perf)
      nomissing_value<-nomissing[,y[i]]  #put the nomissing values into a variable

      nomissing$category<-cut(nomissing_value,unique(quantile(nomissing_value,(0:m)/m)),include.lowest = T) #separte into 10 groups
      #View(table(nomissing$var_category))  #take a look at the 10 category
      prof2<-ddply(nomissing,.(category),summarise,count=length(id),responder=sum(dv_response))#group by the 10 groups
      #View(prof2)
      nonmissing_perf<-within(prof2,{
        index<-responder/count/over_response_rate*100
        response_rate<-responder/count*100
        percent<-count/overrall*100
      })#add avg_revenue,index,percent
      #View(nonmissing_perf)
      #set missing_perf and non-missing_Perf together
      #View(missing_perf)
      #View(nonmissing_perf)
      #colnames(nonmissing_perf)[3]<-"responder"
      lastprofile<-rbind(nonmissing_perf,missing_perf) #set 2 data together
      lastprofile<-data.frame(var=colnames(train)[y[i]],lastprofile)
      #行连接
      results<-rbind(results,lastprofile)
    }
    #去除首行的空值
    results<-results[-1,]
    row.names(results)<-1:nrow(results)
    return(results)
  }
  #连续数值的profile
  results_lianxu<-profile_lianxu(train[,1:34],lianxu_index,length(lianxu_index),10)
  results_lianxu$category[is.na(results_lianxu$category)]<-"unknown"
  View(results_lianxu)
  ######封装函数
#####################################  2.profile 连续型数值 #########################################

    #将两个 profile 合成一个整体,输出到xlsx表格

  #xlsx <- loadWorkbook('Correlation.xlsx',create=TRUE)
  final_profile<-rbind(results_fenlei,results_lianxu)
  View(final_profile)
  xlsx <- loadWorkbook('myhomework.xlsx')
  createSheet(xlsx,name='profile')  #name the worksheet as 'correlation'
  writeWorksheet(xlsx,final_profile,'profile',startRow=1,startCol=1, header=T)  #define the startrow,startcol,header
  saveWorkbook(xlsx)

执行结果(部分截图):
所有变量的profiling图

生成连续型数值的五数概括

代码:

#########################################################################
########################   Part4 means     ##############################
#########################################################################
  # 连续性数据的五数概括
  dat_n<-train[,lianxu_index]
  mean_var<-data.frame(var=1:ncol(dat_n),mean=NA,median=NA,"0%"=NA,
                       "1%"=NA,"10%"=NA,"25%"=NA,"50%"=NA,
                       "75%"=NA,"90%"=NA,"99%"=NA,"100%"=NA,
                       max=NA,missing=NA)
  colnames(mean_var)[4:12]<-c("Minimum","1st Pthl","10th Pctl","25th Pctl","50th Pctl","75th Pctl","90th Pctl",
                              "99th Pctl","Maximum")
  for(i in 1:ncol(dat_n)){
    mean_var$var[i]=colnames(dat_n)[i]
    mean_var$mean[i]=mean(dat_n[,i],na.rm=TRUE)   #na.rm=TRUE去除NA的影响
    mean_var$median[i]=median(dat_n[,i],na.rm=TRUE)
    mean_var[i,4:12]=quantile(dat_n[,i],c(0,0.01,0.1,0.25,0.5,0.75,0.9,0.99,1),na.rm=TRUE)
    mean_var$max[i]=max(dat_n[,i],na.rm=TRUE)
    mean_var$missing[i]=sum(is.na(dat_n[,i]))
  }
  # #销毁临时变量
  # dat_n<-NULL
  #在列表中查看数值变量的统计信息
  View(mean_var)

  # 导出到 xlsx 表格
  xlsx <- loadWorkbook('myhomework.xlsx')
  createSheet(xlsx,name='means')  #name the worksheet as 'correlation'
  writeWorksheet(xlsx,mean_var,'means',startRow=1,startCol=1, header=T)  #define the startrow,startcol,header
  saveWorkbook(xlsx)

执行结果(部分截图):
仅连续型数值变量的五数概括

未完待续。。。
转载请注明出处

### 回答1: sklearn是一个常用的机器学习库,逻辑回归是其中的一个算法模型。逻辑回归用于解决分类问题,将一系列输入变量映射到离散的输出变量(二分类问题)。下面以一个电子商务网站用户是否购买广告的案例来说明如何使用sklearn的逻辑回归模型。 首先,我们要导入需要使用的库。例如使用numpy进行数值计算,使用pandas进行数据处理,使用sklearn中的逻辑回归模型。 接下来,我们要加载数据集。可以使用pandas库的read_csv()函数将CSV文件加载到DataFrame中,根据数据的特点进行数据清洗和处理。 然后,我们需要将数据集切分为特征数据和目标数据。特征数据是用来训练模型的输入变量,而目标数据是期望模型预测的结果。 对于逻辑回归模型来说,我们需要进行特征缩放。可以使用sklearn中的StandardScaler()函数对特征数据进行标准化处理。 然后,我们可以创建逻辑回归模型对象,并使用训练集对模型进行训练。可以使用sklearn中的LogisticRegression()函数来创建模型对象。 接着,我们可以使用测试集对模型进行评估。可以使用模型对象的score()函数来计算测试集上的准确率。 最后,我们可以使用训练好的模型进行预测。可以使用模型对象的predict()函数来对新的数据进行分类预测。 通过以上步骤,我们可以完成一个使用sklearn逻辑回归模型的案例逻辑回归模型在实际应用中非常常见,可以用于各种二分类问题的解决,如垃圾邮件分类、疾病预测等。 ### 回答2: Scikit-learn是一个开源机器学习库,提供了丰富的算法和工具,以支持各种机器学习任务。逻辑回归是Scikit-learn中一个常用的分类算法。 逻辑回归是一种用于预测分类变量的统计学方法。它假设输入变量与输出变量之间存在着线性关系,并使用sigmoid函数来将线性预测转化为概率。在Scikit-learn中,我们可以使用LogisticRegression类来实现逻辑回归算法。 下面以一个二分类问题的案例来介绍逻辑回归在Scikit-learn中的应用。 首先,我们需要准备训练数据集和测试数据集。训练数据集包含了特征变量(X)和对应的类别标签(y),而测试数据集只包含特征变量。 然后,我们可以使用LogisticRegression类来创建逻辑回归模型,并使用fit方法来拟合训练数据集。拟合完成后,模型将学习到最优的参数。 接下来,我们可以使用predict方法来使用训练好的模型进行预测。给定一组特征变量,模型将输出对应的类别标签。 最后,我们可以使用score方法来评估模型的性能。它将返回模型在测试数据集上的准确率,即预测正确的样本数与总样本数的比例。 总结来说,Scikit-learn的逻辑回归模块提供了一种强大的工具,用于处理二分类问题。通过预处理数据、拟合模型、进行预测和评估性能,我们可以使用这个模块来实现一个完整的逻辑回归案例。模型的预测结果可以帮助我们了解输入变量与输出变量之间的关系,并作出相应的决策。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值