利用决策树预测vip玩家流失

author : 杨劼

整个数据挖掘流程如下

样本数据如下
数据源为appstore平台2014年6月至11月vip等级8级以上中R、大R、超R数据;
原始数据变量个数初始时为17个,参与数据建模时变量有12个;玩家流失定义为7日流失.
由于数据仓库中玩家快照、日志、中间表数据十分完整,因此在从hive中提取数据时不存在缺失值的情况

summary(lost2)
##  lost        vip_level         level            act1       
##  0: 4570   Min.   : 8.00   Min.   : 1.00   Min.   : 0.000  
##  1:12785   1st Qu.: 8.00   1st Qu.:34.00   1st Qu.: 0.000  
##            Median : 9.00   Median :43.00   Median : 0.000  
##            Mean   : 9.43   Mean   :42.27   Mean   : 7.745  
##            3rd Qu.:11.00   3rd Qu.:52.00   3rd Qu.:17.000  
##            Max.   :13.00   Max.   :79.00   Max.   :30.000  
##      acts1            act2            act3            acts3        
##  Min.   :    0   Min.   :0.000   Min.   : 0.000   Min.   :   0.00  
##  1st Qu.:    0   1st Qu.:0.000   1st Qu.: 0.000   1st Qu.:   0.00  
##  Median :    0   Median :0.000   Median : 0.000   Median :   0.00  
##  Mean   : 1447   Mean   :1.165   Mean   : 3.781   Mean   :  99.11  
##  3rd Qu.: 1799   3rd Qu.:4.000   3rd Qu.: 2.000   3rd Qu.:  22.00  
##  Max.   :14861   Max.   :5.000   Max.   :30.000   Max.   :2440.00  
##      avgdau           cash1              cash2             cash3         
##  Min.   :   1.0   Min.   :     0.0   Min.   :    0.0   Min.   :     0.0  
##  1st Qu.: 231.5   1st Qu.:     0.0   1st Qu.:    0.0   1st Qu.:     0.0  
##  Median : 316.0   Median :     0.0   Median :    0.0   Median :     0.0  
##  Mean   : 349.8   Mean   :   487.6   Mean   :  453.5   Mean   :   604.5  
##  3rd Qu.: 417.0   3rd Qu.:     0.0   3rd Qu.:   30.0   3rd Qu.:    30.0  
##  Max.   :1919.0   Max.   :165000.0   Max.   :75106.0   Max.   :117000.0

1. 利用3种决策树算法来创建决策树,筛选出准确率最高决策树

利用3种决策树算法进行10重交叉验证,这样保证了样本的选取更加平稳剔除特殊情形发生,外面套了个100次的循环,相当于每种算法计算1000次。代码如下

rate.c<-rate.r<-rate.p<-rep(0,100)
for(j in 1:100){
  num<-sample(1:10,nrow(lost2),replace=TRUE)
  res.c<-res.r<-res.p<-array(0,dim=c(2,2,10))
  for(i in 1:10){
    train<-lost2[num!=i,]
    test<-lost2[num==i,]

    model.c<-C5.0(lost~.,data=train)
    pre.c<-predict(model.c,test[,-1])
    res.c[,,i]<-as.matrix(table(pre.c,test[,1]))

    model.r<-rpart(lost~.,data=train)
    pre.r<-predict(model.r,test[,-1],type="class")
    res.r<-as.matrix(table(pre.r,test[,1]))

    model.p<-ctree(lost~.,data=train)
    pre.p<-predict(model.p,test[,-1])
    res.p<-as.matrix(table(pre.p,test[,1])) 
  }
  table.c <- apply(res.c,MARGIN=c(1,2),sum)
    rate.c[j] <- sum(diag(table.c))/sum(table.c)

    table.p <- apply(res.p,MARGIN=c(1,2),sum)
    rate.p[j] <- sum(diag(table.p))/sum(table.p)

    table.r <- apply(res.r,MARGIN=c(1,2),sum)
    rate.r[j] <- sum(diag(table.r))/sum(table.r)
}
library(reshape2)
result<-data.frame(c50=rate.c,rpart=rate.r,party=rate.p)
suppressMessages(result.melt<-melt(result))
#添加

画出的图形如下,由图可知C5.0的决策树算法更加稳健

library(ggplot2)
ggplot(result.melt,aes(variable,value,color=variable))+geom_point(position="jitter")+geom_violin(alpha=0.4)+
  scale_y_continuous(breaks=c(0.992,0.994,0.996,0.998),labels=c("99.2%","99.4%","99.6%","99.8%"))+ylab("准确率")+xlab("决策树算法")

plot of chunk unnamed-chunk-5

2.最后再看一下不同等级vip玩家的玩家流失率是否一致

各vip等级中玩家是否流失的人数如下(1:流失;0 未流失):

##          is.lost
## vip_level    0    1
##        8  1300 5675
##        9   653 2468
##        10  844 2044
##        11  761 1523
##        12  580  786
##        13  432  289

利用卡方独立性检验对上面各vip的列联表数据进行检验

vip.data<-table(vip_level=lost2$vip_level,is.lost=lost2$lost)
chisq.test(vip.data)
## 
##  Pearson's Chi-squared test
## 
## data:  vip.data
## X-squared = 932.2491, df = 5, p-value < 2.2e-16

计算得到的p.value为2.2e-16 远远小于显著性水平0.05,因此说明各vip玩家的vip等级和玩家流失直接是相互影响的。下面再使用mosaic函数对vip.data数据进行可视化如下,
蓝色表示皮尔逊残差为正值(4 ~ 18),即表示该vip等级的实际人数比期望人数多,红色表示皮尔逊残差为负值(-13 ~ -4),即表示该vip等级的实际人数比期望人数少:

vip.tab<-as.table(vip.data)
mosaic(vip.tab,shade=TRUE,legend=TRUE)

plot of chunk unnamed-chunk-8

对于上图的解读为:在is.lost=0时,随着vip等级逐渐升高各个方块中的颜色从红色渐变到蓝色,也即皮尔逊残差逐渐升高,各vip等级玩家的未流失人数比例是逐渐增加的;
在is.lost=1时,随着vip等级逐渐升高各个方块中的颜色从蓝色渐变到红色,也即皮尔逊残差逐渐降低,各vip等级玩家的流失人数比例是逐渐降低的。
总结:vip等级越高玩家黏性越好,玩家越不易流失。因此从简易性上来看接下来有必要先针对vip11 12 13这三类玩家进行细致的流失分析。