码农知识堂 - 1000bd
  •   Python
  •   PHP
  •   JS/TS
  •   JAVA
  •   C/C++
  •   C#
  •   GO
  •   Kotlin
  •   Swift
  • PYTHON用户流失数据挖掘:建立逻辑回归、XGBOOST、随机森林、决策树、支持向量机、朴素贝叶斯和KMEANS聚类用户画像...


    原文链接:http://tecdat.cn/?p=24346

    在今天产品高度同质化的品牌营销阶段,企业与企业之间的竞争集中地体现在对客户的争夺上(点击文末“阅读原文”获取完整代码数据)。

    “用户就是上帝”促使众多的企业不惜代价去争夺尽可能多的客户。但是企业在不惜代价发展新用户的过程中,往往会忽视或无暇顾及已有客户的流失情况,结果就导致出现这样一种窘况:一边是新客户在源源不断地增加,而另一方面是辛辛苦苦找来的客户却在悄然无声地流失。因此对老用户的流失进行数据分析从而挖掘出重要信息帮助企业决策者采取措施来减少用户流失的事情至关重要,迫在眉睫。

    ea0de118857dc8c00d6a7c90d3629671.png

    1.2 目的:

    深入了解用户画像及行为偏好,挖掘出影响用户流失的关键因素,并通过算法预测客户访问的转化结果,从而更好地完善产品设计、提升用户体验。

    相关视频

    1.3 数据说明:

    此次数据是携程用户一周的访问数据,为保护客户隐私,已经将数据经过了脱敏,和实际商品的订单量、浏览量、转化率等有一些差距,不影响问题的可解性。

    2 读取数据

    1. # 显示全部特征
    2. df.head()

    a430d2beaf1e2f9636af7b65956e57df.png

     3 切分数据

    1. # 划分训练集,测试集
    2. X\_train, X\_test, y\_train, y\_test = train\_test\_split(X, y, test\_size=0.2, random\_state=666)

    3.1 理解数据

    可以看到变量比较的多,先进行分类,除去目标变量label,此数据集的字段可以分成三个类别:订单相关指标、客户行为相关指标、酒店相关指标。

    57c1a668b560e3532e2b895f0bd92960.png

    5a49b032f07d2b1be76de1091266eca9.png

    4 特征工程

    1. # 用训练集进行数据探索
    2. train = pd.concat(\[X\_train,y\_train\],axis=1)

    c4ca00fa3f1929e6a42b8668f04b5ddc.png

    4.1 数据预处理

    072687daeff46b38398e24d0c37411ce.png

    f059c50f118c91e10e84ed85fd626c23.png

    4.1.1 删除不必要的列

    1. X_train.pop("sampleid")
    2. X_test.pop("sampleid")
    3. train.pop("sampleid")

    d21b494281055f19e1f0b28c31c22387.png

    4.1.2 数据类型转换

    字符串类型的特征需要处理成数值型才能建模,将arrival和d相减得到"提前预定的天数",作为新的特征

    1. # 增加列
    2. # 将两个日期变量由字符串转换为日期格式类型
    3. train\["arrial"\] = pd.to_datimetain\["arrval"\])
    4. X\_tst\["arival"\] = d.to\_daetime(X_est\["arival"\])
    5. # 生成提前预定时间列(衍生变量)
    6. X\_trin\["day\_adanced"\] = (X_rain\["arival"\]-Xtrain\["d"\]).dt.days
    7. ## 删除列
    8. X_tran.dro(columns="d","arrivl"\],inpace=True)

    4.1.3 缺失值的变量生成一个指示哑变量

    zsl = tain.isnll().sum()\[tain.isnll(.sum()!=0\].inex

    4.1.4 根据业务经验填补空缺值 

    ordernum_oneyear 用户年订单数为0 ,lasthtlordergap 11%用600000填充 88%用600000填充 一年内距离上次下单时长,ordercanncelednum 用0填充 用户一年内取消订单数,ordercanceledprecent 用0t填充 用户一年内取消订
    单率 242114 242114 -为空 有2种情况 1:新用户未下订单的空-88.42% 214097 2.老用户1年以上未消费的空 增加编码列未下订单新用户和 1年未下订单的老用户
    price\_sensitive -0 ,中位数填充 价格敏感指数,consuming\_capacity -0 中位数填充 消费能力指数 226108 -为空情况 1.从未下过单的新用户214097 2.12011个人为空原因暂不明确
    uv\_pre -24小时历史浏览次数最多酒店历史uv. cr\_pre -0,中位数填充 -24小时历史浏览次数最多酒店历史cr -0,中位数填充 29397 -为空 1.用户当天未登录APP 28633 2.刚上线的新酒店178 586 无uv,cr记录 编码添加 该APP刚上线的新酒店 764 29397
    customereval_pre2 用0填充-24小时历史浏览酒店客户评分均值, landhalfhours -24小时内登陆时长 -用0填充28633 -为空:用户当天未登录APP 28633
    hotelcr ,hoteluv -中位数填充 797

    刚上新酒店 60 #未登录APP 118

    avgprice 0 填充一部分价格填充为0 近一年未下过订单的人数,cr 用0填充,

    1. tkq = \["hstoryvsit\_7ordernm","historyviit\_visit\_detaipagenum","frstorder\_b","historyvi
    2. # tbkq = \["hitoryvsit\_7dernum","hisryvisit\_isit_detailagenum"\]
    3. X_train\[i\].fillna(0,inplace=True)
    1. ## 一部分用0填充,一部分用中位數填充
    2. # 新用戶影響的相關屬性:ic\_sniti,cosuing\_cacity
    3. n\_l = picesensitive","onsmng\_cpacty"\]
    4. fori in n_l
    5. X\_trini\]\[Xra\[X\_trinnew_ser==1\].idex\]=0
    6. X\_est\[i\]\[X\_test\[X\_test.nw\_user==1\].inex\]=0

    4.1.5 异常值处理

    将customer\_value\_profit、ctrip_profits中的负值按0处理
    将delta\_price1、delta\_price2、lowestprice中的负值按中位数处理

    1. for f in flter_two:
    2. a = X_trin\[\].median()
    3. X\_tran\[f\]\[X\_train\[f\]<0\]=a
    4. X\_test\[f\]\[X\_est\[\]<0\]=a
    5. tran\[f\]\[train\[f\]<0\]=a

    4.1.6 缺失值填充

    趋于正态分布的字段,使用均值填充:businessrate\_pre2、cancelrate\_pre、businessrate_pre;偏态分布的字段,使用中位数填充.

    1. def na_ill(df):
    2. for col in df.clumns:
    3. mean = X_trai\[col\].mean()
    4. dfcol\]=df\[col\].fillna(median)
    5. return
    1. ## 衍生变量年成交率
    2. X\_train\["onear\_dalate"\]=\_tain\["odernum\_onyear"\]/X\_tran"visinum\_onyar"\]
    3. X\_st\["onyardealae"\]=X\_st\["orernum_neyear"\]/Xtest\[visitumonyear"\]
    4. X_al =pd.nca(\[Xtin,Xtes)
    1. #决策树检验
    2. dt = Decsionr(random_state=666)
    3. pre= dt.prdict(X_test)
    4. pre\_rob = dt.preicproa(X\_test)\[:,1\]
    5. pre_ob

    8f55bc01e7842b3d3eadf664ec221e8b.png

    4.2 数据标准化

    1. scaler = MinMacaer()
    2. #决策树检验
    3. dt = DeonTreasifi(random_state=666)

    5 特征筛选

    5.1 特征选择-删除30%列

    1. X\_test = X\_test.iloc\[:,sp.get_spport()\]
    2. #决策树检验
    3. dt = DecisonreeClssifie(random_state=666)
    4. dt.fit(X\_trin,y\_tain)
    5. dt.score(X\_tst,y\_est)
    6. pre = dt.pdict(X_test)
    7. pe\_rob = dt.redicproba(X\_test)\[:,1\]
    8. pr_rob
    9. uc(pr,tpr)

    713958390d4e00522c8e55aac1cce351.png

    5.2 共线性/数据相关性

    1. #共线性--严重共线性0.9以上,合并或删除
    2. d = Xtrai.crr()
    3. d\[d<0.9\]=0 #赋值显示高相关的变量
    4. pl.fufsiz=15,15,dpi200)
    5. ssheatp(d)

    8333f6dbc5b68ddcba96e79b018d3c26.png

    6 建模与模型评估

    6.1 逻辑回归

    1. y\_prob = lr.preictproba(X\_test)\[:,1\]
    2. y\_pred = lr.predict(X\_test
    3. fpr\_lr,pr\_lr,teshold\_lr = metris.roc\_curve(y\_test,y\_prob)
    4. ac\_lr = metrcs.aucfpr\_lr,tpr_lr)
    5. score\_lr = metrics.accuracy\_score(y\_est,y\_pred)
    6. prnt("模准确率为:{0},AUC得分为{1}".fomat(score\_lr,auc\_lr))
    7. prit("="*30

    ec8ad3ef0d27d7d06a29aa78ae381a6a.png

    6.2 朴素贝叶斯

    1. gnb = GasinNB() # 实例化一个LR模型
    2. gnb.fi(trai,ytran) # 训练模型
    3. y\_prob = gn.pic\_proba(X_test)\[:,1\] # 预测1类的概率
    4. y\_pred = gnb.preict(X\_est) # 模型对测试集的预测结果
    5. fpr\_gnb,tprgnbtreshold\_gb = metrics.roc\_crve(ytesty\_pob) # 获取真阳率、伪阳率、阈值
    6. aucgnb = meic.aucf\_gnb,tr\_gnb) # AUC得分
    7. scoe\_gnb = merics.acuray\_score(y\_tes,y\_pred) # 模型准确率

    4f2b43082aa972a0365777cefbd9a307.png

    6.3 支持向量机

    1. s =SVkernel='f',C=,max_ter=10,randomstate=66).fit(Xtrain,ytrain)
    2. y\_rob = sc.decsion\_untio(X_st) # 决策边界距离
    3. y\_ed =vc.redit(X\_test) # 模型对测试集的预测结果
    4. fpr\_sv,tpr\_vc,theshld\_sv = mtris.rc\_urv(y\_esty\_pob) # 获取真阳率、伪阳率、阈值
    5. au\_vc = etics.ac(fpr\_sc,tpr_sv) # 模型准确率
    6. scre\_sv = metrics.ccuracy\_sore(_tst,ypre)

    4067fa5f999daa436236a6e2fa5269f2.png

    6.4 决策树

    1. dtc.fit(X\_tran,\_raiproba(X_test)\[:,1\] # 预测1类的概率
    2. y\_pred = dtc.predct(X\_test # 模型对测试集的预测结果
    3. fpr\_dtc,pr\_dtc,thresod\_dtc= metrcs.roc\_curvey_test,yprob) # 获取真阳率、伪阳率、阈值

    f8de0308d7389bed8da6fb39d2266b81.png

    6.5 随机森林

    1. c = RndoForetlassiir(rand_stat=666) # 建立随机森
    2. rfc.it(X_tain,ytrain) # 训练随机森林模型
    3. y\_rob = rfc.redict\_poa(X_test)\[:,1\] # 预测1类的概率
    4. y\_pedf.pedic(\_test) # 模型对测试集的预测结果
    5. fpr\_rfc,tp\_rfc,hreshol\_rfc = metrcs.roc\_curve(y\_test,\_prob) # 获取真阳率、伪阳率、阈值
    6. au\_fc = meris.auc(pr\_rfctpr_fc) # AUC得分
    7. scre\_rf = metrcs.accurac\_scor(y\_tes,y\_ped) # 模型准确率

    cdc1fa4918f6fa86dffa616d9e6b0ab8.png

    6.6 XGboost

    1. # 读训练数据集和测试集
    2. dtainxgbatrx(X_rai,yrain)
    3. dtest=g.DMrx(Xtest
    4. # 设置xgboost建模参数
    5. paras{'booser':'gbtee','objective': 'binay:ogistic','evlmetric': 'auc'
    6. # 训练模型
    7. watchlst = (dtain,'trai)
    8. bs=xgb.ran(arams,dtain,n\_boost\_round=500eva=watchlst)
    9. # 输入预测为正类的概率值
    10. y_prob=bst.redict(dtet)
    11. # 设置阈值为0.5,得到测试集的预测结果
    12. y\_pred = (y\_prob >= 0.5)*1
    13. # 获取真阳率、伪阳率、阈值
    14. fpr\_xg,tpr\_xgb,heshold\_xgb = metricsroc\_curv(test,y_prob)
    15. aucxgb= metics.uc(fpr\_gb,tpr\_xgb # AUC得分
    16. score\_gb = metricsaccurac\_sore(y\_test,y\_pred) # 模型准确率
    17. print('模型准确率为:{0},AUC得分为:{1}'.format(score\_xgb,auc\_xgb))

    d639fa6e80eb89eed2229680892f8f0d.png

    6.7 模型比较

    1. plt.xlabel('伪阳率')
    2. plt.ylabel('真阳率')
    3. plt.title('ROC曲线')
    4. plt.savefig('模型比较图.jpg',dpi=400, bbox_inches='tight')
    5. plt.show()

    180220c644459e8121a200abe9ba3c18.png


    点击标题查阅往期内容

    493ff49b91c1dcf6b24c60908fe373ea.jpeg

    Python对商店数据进行lstm和xgboost销售量时间序列建模预测分析

    outside_default.png

    左右滑动查看更多

    outside_default.png

    01

    834d643cfbc8fca542dbd22df60ae118.png

    02

    2df4d24285c6464e213889d799e89b36.png

    03

    b2bbb24dea32081e41d22d80b151abd1.png

    04

    d9c0fbdcafdde9a2d7d3ce54032aa9f3.png

    6.8 重要特征

    1. ea = pd.Sries(dct(list((X\_trclumsfc.eatre\_imortancs_))))
    2. ea.srt_vlues(acedig=False
    3. fea\_s = (fa.srt\_vauesacnding=alse)).idex

    a8d5eeb0a1d2259f57503f83abf5fb23.png

    7d9c4a4d9582c0591a6d870e7e212cfa.png

    6.9 流失原因分析

    • cityuvs和cityorders值较小时用户流失显著高于平均水平,说明携程平台小城市的酒店信息缺乏,用户转向使用小城市酒店信息较全的竞品导致用户流失

    • 访问时间点在7点-19点用户流失比例高与平均水平:工作日推送应该避开这些时间点

    • 酒店商务属性指数在0.3-0.9区间内用户流失大于平均水平,且呈现递增趋势,说明平台商务指数高的酒店和用户期望有差距(价格太高或其他原因?), 商务属性低的用户流失较少

    • 一年内距离上次下单时长越短流失越严重,受携程2015年5月-2016年1月爆出的负面新闻影响较大,企业应该更加加强自身管理,树立良好社会形象

    • 消费能力指数偏低(10-40)的用户流失较严重,这部分用户占比50%应该引起重视

    • 价格敏感指数(5-25)的人群流失高于平均水平,注重酒店品质

    • 用户转化率,用户年订单数,近1年用户历史订单数越高,24小时内否访问订单填写页的人群比例越大流失越严重,需要做好用户下单后的追踪体验, 邀请填写入住体验,整理意见作出改进

    • 提前预定天数越短流失越严重用户一年内取消订单数越高流失越严重

    6.10 建议:

    2e445008763d04d4a7fbeb22b83458c0.png

    • 考虑占取三四线城市和低端酒店范围的市场份额

    • 用户易受企业负面新闻影响,建议企业勇于承担社会责任,加强自身管理,提高公关新闻处理时效性,树立品牌良好形像

    • 在节假日前2-3周开始热门景点酒店推送

    • 做好酒店下单后的追踪体验,邀请填写入住体验,并整理用户意见作出改进

    7 客户画像

    7.1 建模用户分类

    1. # 用户画像特征
    2. user\_feature = \["decisiohabit\_user,'starprefer','lastpvgap','sid',
    3. 'lernum",'historyvisit\_visit\_detaipagenum',
    4. "onyear_dealrat
    5. \]
    6. # 流失影响特征
    7. fea_lis = \["cityuvs",
    8. "cityorders",
    9. "h",
    10. "businessrate_pre2"
    11. # 数据标准化 Kmeans方法对正态分布数据处理效果更好
    12. scaler = StanardScalr()
    13. lo\_atribues = pdDatarame(scr.fittransfrm(all\_cte),columns=all_ce.coluns)
    14. # 建模分类
    15. Kmens=Means(n\_cluste=2,rndom\_state=0) #333
    16. Keans.fi(lot_attributes # 训练模型
    17. k\_char=Kmenscluster\_centers_ # 得到每个分类
    18. plt.figure(figsize=(5,10))

    65cfc2dfa4c5005b8aa663550c9e11ba.png

    91c743408c04675306080348de6e0d4f.png

    7.2 用户类型占比

    1. types=\['高价值用户','潜力用户'\]
    2. ax.pie\[1\], raius=0.,colors='w')
    3. plt.savefig(用户画像.jpg'dpi=400, box_inchs='tigh')

    372dc27d1094540660c1ea9920c3a10f.png

    7.3 高价值用户分析

    占比19.02,访问频率和预定频率都较高,消费水平高,客户价值大,追求高品质,对酒店星级要求高,客户群体多集中在老客户中,
    建议:
    多推荐口碑好、性价比高的商务酒店连锁酒店房源吸引用户;
    在非工作日的11点、17点等日间流量小高峰时段进行消息推送。
    为客户提供更多差旅地酒店信息;
    增加客户流失成本:会员积分制,推出会员打折卡

    7.4 潜力用户分析

    占比:80.98% 访问频率和预定频率都较低,消费水平较低,对酒店星级要求不高,客户群体多集中在新客户中,客户价值待挖掘 建议:
    因为新用户居多,属于潜在客户,建议把握用户初期体验(如初期消费有优惠、打卡活动等),还可以定期推送实惠的酒店给此类用户,以培养用户消费惯性为主;
    推送的内容应多为大减价、大酬宾、跳楼价之类的;
    由于这部分用户占比较多,可结合该群体流失情况分析流失客户因素,进行该群体市场的开拓,进一步进行下沉分析,开拓新的时长。


    关于作者

    Lijie Zhang逻辑思辨能力强,考虑问题全面,熟练掌握数据清洗和数据预处理、绘图和可视化展示,熟悉机器学习 sklearn, xgboost 等库进行数据挖掘和数据建模,掌握机器学习的线性回归、逻辑回归、主成分分析、聚类、决策树、随机森林、 xgboost、 svm、神经网络算法。


    47ffdfce8ccf27f4dac61ac6690b5ce0.png

    本文摘选《PYTHON用户流失数据挖掘:建立逻辑回归、XGBOOST、随机森林、决策树、支持向量机、朴素贝叶斯和KMEANS聚类用户画像》,点击“阅读原文”获取全文完整资料。

    a495d06b2b2a7d03d53d985615db4cfb.jpeg

    e2ba3255db7cc5636c809e1d21df7413.png

    点击标题查阅往期内容

    Python对商店数据进行lstm和xgboost销售量时间序列建模预测分析

    PYTHON集成机器学习:用ADABOOST、决策树、逻辑回归集成模型分类和回归和网格搜索超参数优化

    R语言集成模型:提升树boosting、随机森林、约束最小二乘法加权平均模型融合分析时间序列数据

    Python对商店数据进行lstm和xgboost销售量时间序列建模预测分析

    R语言用主成分PCA、 逻辑回归、决策树、随机森林分析心脏病数据并高维可视化

    R语言基于树的方法:决策树,随机森林,Bagging,增强树

    R语言用逻辑回归、决策树和随机森林对信贷数据集进行分类预测

    spss modeler用决策树神经网络预测ST的股票

    R语言中使用线性模型、回归决策树自动组合特征因子水平

    R语言中自编基尼系数的CART回归决策树的实现

    R语言用rle,svm和rpart决策树进行时间序列预测

    python在Scikit-learn中用决策树和随机森林预测NBA获胜者

    python中使用scikit-learn和pandas决策树进行iris鸢尾花数据分类建模和交叉验证

    R语言里的非线性模型:多项式回归、局部样条、平滑样条、 广义相加模型GAM分析

    R语言用标准最小二乘OLS,广义相加模型GAM ,样条函数进行逻辑回归LOGISTIC分类

    R语言ISLR工资数据进行多项式回归和样条回归分析

    R语言中的多项式回归、局部回归、核平滑和平滑样条回归模型

    R语言用泊松Poisson回归、GAM样条曲线模型预测骑自行车者的数量

    R语言分位数回归、GAM样条曲线、指数平滑和SARIMA对电力负荷时间序列预测

    R语言样条曲线、决策树、Adaboost、梯度提升(GBM)算法进行回归、分类和动态可视化

    如何用R语言在机器学习中建立集成模型?

    R语言ARMA-EGARCH模型、集成预测算法对SPX实际波动率进行预测

    在python 深度学习Keras中计算神经网络集成模型

    R语言ARIMA集成模型预测时间序列分析

    R语言基于Bagging分类的逻辑回归(Logistic Regression)、决策树、森林分析心脏病患者

    R语言基于树的方法:决策树,随机森林,Bagging,增强树

    R语言基于Bootstrap的线性回归预测置信区间估计方法

    R语言使用bootstrap和增量法计算广义线性模型(GLM)预测置信区间

    R语言样条曲线、决策树、Adaboost、梯度提升(GBM)算法进行回归、分类和动态可视化

    Python对商店数据进行lstm和xgboost销售量时间序列建模预测分析

    R语言随机森林RandomForest、逻辑回归Logisitc预测心脏病数据和可视化分析

    R语言用主成分PCA、 逻辑回归、决策树、随机森林分析心脏病数据并高维可视化

    Matlab建立SVM,KNN和朴素贝叶斯模型分类绘制ROC曲线

    matlab使用分位数随机森林(QRF)回归树检测异常值

    3453b20a33ace5c06eb2851a99cad2e3.png

    12897ee67cff65c50cf6eb033abb075d.jpeg

    dc87b3b88ab18338212b6cd19504de37.png

  • 相关阅读:
    HDMI接口类型种类区分图(高清图)
    linux系统下切换源
    使用Postman调试API遇到“400 Bad Request”问题
    自动控制原理 - 3 线性系统的时域分析
    Enzo丨Enzo IHC酶抗原回收试剂解决方案
    27、JavaScript学习笔记——查看及操控窗口
    【数据聚类】基于粒子群、遗传和差分算法实现数据聚类附matlab代码
    Lumiprobe无铜点击化学解决方案
    Mathorcup数学建模竞赛第四届-【妈妈杯】C题:家庭暑期旅游套餐的设计(附MATLAB和lingo代码)
    OWASP的s-sdlc项目优秀分享
  • 原文地址:https://blog.csdn.net/tecdat/article/details/133004634
  • 最新文章
  • 攻防演习之三天拿下官网站群
    数据安全治理学习——前期安全规划和安全管理体系建设
    企业安全 | 企业内一次钓鱼演练准备过程
    内网渗透测试 | Kerberos协议及其部分攻击手法
    0day的产生 | 不懂代码的"代码审计"
    安装scrcpy-client模块av模块异常,环境问题解决方案
    leetcode hot100【LeetCode 279. 完全平方数】java实现
    OpenWrt下安装Mosquitto
    AnatoMask论文汇总
    【AI日记】24.11.01 LangChain、openai api和github copilot
  • 热门文章
  • 十款代码表白小特效 一个比一个浪漫 赶紧收藏起来吧!!!
    奉劝各位学弟学妹们,该打造你的技术影响力了!
    五年了,我在 CSDN 的两个一百万。
    Java俄罗斯方块,老程序员花了一个周末,连接中学年代!
    面试官都震惊,你这网络基础可以啊!
    你真的会用百度吗?我不信 — 那些不为人知的搜索引擎语法
    心情不好的时候,用 Python 画棵樱花树送给自己吧
    通宵一晚做出来的一款类似CS的第一人称射击游戏Demo!原来做游戏也不是很难,连憨憨学妹都学会了!
    13 万字 C 语言从入门到精通保姆级教程2021 年版
    10行代码集2000张美女图,Python爬虫120例,再上征途
Copyright © 2022 侵权请联系2656653265@qq.com    京ICP备2022015340号-1
正则表达式工具 cron表达式工具 密码生成工具

京公网安备 11010502049817号