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