原文链接:http:///?p=243461.1 项目背景:在今天产品高度同质化的品牌营销阶段,企业与企业之间的竞争集中地体现在对客户的争夺上。“用户就是上帝”促使众多的企业不惜代价去争夺尽可能多的客户。但是企业在不惜代价发展新用户的过程中,往往会忽视或无暇顾及已有客户的流失情况,结果就导致出现这样一种窘况:一边是新客户在源源不断地增加,而另一方面是辛辛苦苦找来的客户却在悄然无声地流失。因此对老用户的流失进行数据分析从而挖掘出重要信息帮助企业决策者采取措施来减少用户流失的事情至关重要,迫在眉睫。 1.2 目的:深入了解用户画像及行为偏好,挖掘出影响用户流失的关键因素,并通过算法预测客户访问的转化结果,从而更好地完善产品设计、提升用户体验。 1.3 数据说明:此次数据是携程用户一周的访问数据,为保护客户隐私,已经将数据经过了脱敏,和实际商品的订单量、浏览量、转化率等有一些差距,不影响问题的可解性。 2 读取数据 # 显示全部特征df.head() 3 切分数据# 划分训练集,测试集X\_train, X\_test, y\_train, y\_test = train\_test\_split(X, y, test\_size=0.2, random\_state=666) 3.1 理解数据可以看到变量比较的多,先进行分类,除去目标变量label,此数据集的字段可以分成三个类别:订单相关指标、客户行为相关指标、酒店相关指标。 4 特征工程 # 用训练集进行数据探索train = pd.concat(\[X\_train,y\_train\],axis=1) 4.1 数据预处理4.1.1 删除不必要的列X_train.pop("sampleid")X_test.pop("sampleid") train.pop("sampleid") 4.1.2 数据类型转换字符串类型的特征需要处理成数值型才能建模,将arrival和d相减得到"提前预定的天数",作为新的特征 # 增加列# 将两个日期变量由字符串转换为日期格式类型 train\["arrial"\] = pd.to_datimetain\["arrval"\]) X\_tst\["arival"\] = d.to\_daetime(X_est\["arival"\]) # 生成提前预定时间列(衍生变量) X\_trin\["day\_adanced"\] = (X_rain\["arival"\]-Xtrain\["d"\]).dt.days ## 删除列 X_tran.dro(columns="d","arrivl"\],inpace=True) 4.1.3 缺失值的变量生成一个指示哑变量 zsl = tain.isnll().sum()\[tain.isnll(.sum()!=0\].inex4.1.4 根据业务经验填补空缺值ordernum_oneyear 用户年订单数为0 ,lasthtlordergap 11%用600000填充 88%用600000填充 一年内距离上次下单时长,ordercanncelednum 用0填充 用户一年内取消订单数,ordercanceledprecent 用0t填充 用户一年内取消订 刚上新酒店 60 #未登录APP 118avgprice 0 填充一部分价格填充为0 近一年未下过订单的人数,cr 用0填充, tkq = \["hstoryvsit\_7ordernm","historyviit\_visit\_detaipagenum","frstorder\_b","historyvi# tbkq = \["hitoryvsit\_7dernum","hisryvisit\_isit_detailagenum"\] X_train\[i\].fillna(0,inplace=True)## 一部分用0填充,一部分用中位數填充 # 新用戶影響的相關屬性:ic\_sniti,cosuing\_cacity n\_l = picesensitive","onsmng\_cpacty"\] fori in n_l X\_trini\]\[Xra\[X\_trinnew_ser==1\].idex\]=0 X\_est\[i\]\[X\_test\[X\_test.nw\_user==1\].inex\]=0 4.1.5 异常值处理将customer\_value\_profit、ctrip_profits中的负值按0处理 a = X_trin\[\].median() X\_tran\[f\]\[X\_train\[f\]<0\]=a X\_test\[f\]\[X\_est\[\]<0\]=a tran\[f\]\[train\[f\]<0\]=a 4.1.6 缺失值填充趋于正态分布的字段,使用均值填充:businessrate\_pre2、cancelrate\_pre、businessrate_pre;偏态分布的字段,使用中位数填充. def na_ill(df):for col in df.clumns: mean = X_trai\[col\].mean() dfcol\]=df\[col\].fillna(median) return## 衍生变量年成交率 X\_train\["onear\_dalate"\]=\_tain\["odernum\_onyear"\]/X\_tran"visinum\_onyar"\] X\_st\["onyardealae"\]=X\_st\["orernum_neyear"\]/Xtest\[visitumonyear"\] X_al =pd.nca(\[Xtin,Xtes)#决策树检验 dt = Decsionr(random_state=666) pre= dt.prdict(X_test) pre\_rob = dt.preicproa(X\_test)\[:,1\] pre_ob 4.2 数据标准化 scaler = MinMacaer()#决策树检验 dt = DeonTreasifi(random_state=666) 5 特征筛选 5.1 特征选择-删除30%列X\_test = X\_test.iloc\[:,sp.get_spport()\]#决策树检验 dt = DecisonreeClssifie(random_state=666) dt.fit(X\_trin,y\_tain) dt.score(X\_tst,y\_est) pre = dt.pdict(X_test) pe\_rob = dt.redicproba(X\_test)\[:,1\] pr_rob uc(pr,tpr) 5.2 共线性/数据相关性 #共线性--严重共线性0.9以上,合并或删除d = Xtrai.crr() d\[d<0.9\]=0 #赋值显示高相关的变量 pl.fufsiz=15,15,dpi200) ssheatp(d) 6 建模与模型评估 6.1 逻辑回归 y\_prob = lr.preictproba(X\_test)\[:,1\]y\_pred = lr.predict(X\_test fpr\_lr,pr\_lr,teshold\_lr = metris.roc\_curve(y\_test,y\_prob) ac\_lr = metrcs.aucfpr\_lr,tpr_lr) score\_lr = metrics.accuracy\_score(y\_est,y\_pred) prnt("模准确率为:{0},AUC得分为{1}".fomat(score\_lr,auc\_lr)) prit("="*30 6.2 朴素贝叶斯 gnb = GasinNB() # 实例化一个LR模型gnb.fi(trai,ytran) # 训练模型 y\_prob = gn.pic\_proba(X_test)\[:,1\] # 预测1类的概率 y\_pred = gnb.preict(X\_est) # 模型对测试集的预测结果 fpr\_gnb,tprgnbtreshold\_gb = metrics.roc\_crve(ytesty\_pob) # 获取真阳率、伪阳率、阈值 aucgnb = meic.aucf\_gnb,tr\_gnb) # AUC得分 scoe\_gnb = merics.acuray\_score(y\_tes,y\_pred) # 模型准确率 6.3 支持向量机 s =SVkernel='f',C=,max_ter=10,randomstate=66).fit(Xtrain,ytrain)y\_rob = sc.decsion\_untio(X_st) # 决策边界距离 y\_ed =vc.redit(X\_test) # 模型对测试集的预测结果 fpr\_sv,tpr\_vc,theshld\_sv = mtris.rc\_urv(y\_esty\_pob) # 获取真阳率、伪阳率、阈值 au\_vc = etics.ac(fpr\_sc,tpr_sv) # 模型准确率 scre\_sv = metrics.ccuracy\_sore(_tst,ypre) 6.4 决策树 dtc.fit(X\_tran,\_raiproba(X_test)\[:,1\] # 预测1类的概率y\_pred = dtc.predct(X\_test # 模型对测试集的预测结果 fpr\_dtc,pr\_dtc,thresod\_dtc= metrcs.roc\_curvey_test,yprob) # 获取真阳率、伪阳率、阈值 6.5 随机森林 c = RndoForetlassiir(rand_stat=666) # 建立随机森rfc.it(X_tain,ytrain) # 训练随机森林模型 y\_rob = rfc.redict\_poa(X_test)\[:,1\] # 预测1类的概率 y\_pedf.pedic(\_test) # 模型对测试集的预测结果 fpr\_rfc,tp\_rfc,hreshol\_rfc = metrcs.roc\_curve(y\_test,\_prob) # 获取真阳率、伪阳率、阈值 au\_fc = meris.auc(pr\_rfctpr_fc) # AUC得分 scre\_rf = metrcs.accurac\_scor(y\_tes,y\_ped) # 模型准确率 6.6 XGboost # 读训练数据集和测试集dtainxgbatrx(X_rai,yrain) dtest=g.DMrx(Xtest # 设置xgboost建模参数 paras{'booser':'gbtee','objective': 'binay:ogistic','evlmetric': 'auc' # 训练模型 watchlst = (dtain,'trai) bs=xgb.ran(arams,dtain,n\_boost\_round=500eva=watchlst) # 输入预测为正类的概率值 y_prob=bst.redict(dtet) # 设置阈值为0.5,得到测试集的预测结果 y\_pred = (y\_prob >= 0.5)*1 # 获取真阳率、伪阳率、阈值 fpr\_xg,tpr\_xgb,heshold\_xgb = metricsroc\_curv(test,y_prob) aucxgb= metics.uc(fpr\_gb,tpr\_xgb # AUC得分 score\_gb = metricsaccurac\_sore(y\_test,y\_pred) # 模型准确率 print('模型准确率为:{0},AUC得分为:{1}'.format(score\_xgb,auc\_xgb)) 6.7 模型比较 plt.xlabel('伪阳率')plt.ylabel('真阳率') plt.title('ROC曲线') plt.savefig('模型比较图.jpg',dpi=400, bbox_inches='tight') plt.show() 6.8 重要特征ea = pd.Sries(dct(list((X\_trclumsfc.eatre\_imortancs_))))ea.srt_vlues(acedig=False fea\_s = (fa.srt\_vauesacnding=alse)).idex 6.9 流失原因分析
6.10 建议:
7 客户画像 7.1 建模用户分类# 用户画像特征user\_feature = \["decisiohabit\_user,'starprefer','lastpvgap','sid', 'lernum",'historyvisit\_visit\_detaipagenum', "onyear_dealrat \] # 流失影响特征 fea_lis = \["cityuvs", "cityorders", "h", "businessrate_pre2" # 数据标准化 Kmeans方法对正态分布数据处理效果更好 scaler = StanardScalr() lo\_atribues = pdDatarame(scr.fittransfrm(all\_cte),columns=all_ce.coluns) # 建模分类 Kmens=Means(n\_cluste=2,rndom\_state=0) #333 Keans.fi(lot_attributes # 训练模型 k\_char=Kmenscluster\_centers_ # 得到每个分类 plt.figure(figsize=(5,10)) 7.2 用户类型占比 types=\['高价值用户','潜力用户'\]ax.pie\[1\], raius=0.,colors='w') plt.savefig(用户画像.jpg'dpi=400, box_inchs='tigh') 7.3 高价值用户分析占比19.02,访问频率和预定频率都较高,消费水平高,客户价值大,追求高品质,对酒店星级要求高,客户群体多集中在老客户中, 7.4 潜力用户分析占比:80.98% 访问频率和预定频率都较低,消费水平较低,对酒店星级要求不高,客户群体多集中在新客户中,客户价值待挖掘 建议: 关于作者 |
|