又到躁动的双十一了
准备好买买买了吗
算出省钱小妙招了吗
优惠券有没有用起来呢
平常购物中,“双11”、“618”购物节、外卖的满减、商家会员等都会给消费者发放优惠券。当消费者有优惠券可用时,购买东西的冲动会增大很多。许多商家基于用户这种心理,会发放优惠券来进行促销。那商家的优惠券的发放机制是怎样的呢?
有的是普惠性质,到达一定金额后可用;有的优惠券靠抢;还有的是定向发放。最后一种方式一般来说既可以节省成本,也可以达到比较好的促销效果,提升用户活跃度。
今天我们来看下基于算法怎么进行定向优惠券发放。
通过算法模型,提升营销准确率
——以某个面包店为例
1.业务目标
根据某面包店历史6个月的用户交易记录,通过RFM模型对用户分群,并建立模型预测用户的购买概率,实现对不同用户群不同购买概率的用户实行不同的发券策略,以此提升营销的准确率,实现ROI(收益与成本控制)的最大化。
知识点1:RFM模型
RMF模型是衡量客户价值和创新能力的一个重要工具和手段,通过用户的最近一次消费时间(Recency)、消费频率(Frequency)、消费金额(Monetary)三项指标将客户划分为重要价值客户、重要发展客户、重要保持客户、重要挽留客户、一般价值客户、一般发展客户、一般保持客户、一般挽留客户等八个象限,针对不同群组的客户采取不同的运营策略,该模型常用于企业商品单价不高、交易频次高的业务中。
2.数据准备
获取面包店6个月的用户历史交易表,表信息如下:
该表中共包含21293条数据,共960个用户的交易记录。真实业务场景中,数据特征会比这个举例多很多,今天我们通过删减后的数据来看一下整个过程。
3.算法模型搭建
我们采用数栈的算法开发(AIWorks)平台进行算法模型的搭建:
1)数据分析
首先从Hive库中读取到原始数据(即上面提到的表),算法工程师需要对数据质量进行评估,分析每个特征的数据缺失情况、分布情况、异常值校验、列与列之间的相关性等,如某些列的数据缺失较大,需要进行缺失值填充或删除;标签列分布不均匀,需要通过采样方法进行数据采用;若两个特征之间的相关性过大则不适合作为模型的输入。
我们以“user_id(用户id)”这个特征列来看一下数据分布情况:
数据基本特征
可看到用户id列的ID-ness(数据差异性:字段中不同取值的数量/总行数)、Stability(数据稳定性:字段中出现频率最高且非空值的单元格数/总行数)、Missing(数据缺失率:该段中缺失的单元格数/总行数)指标都比较正常,反映出此分数据集用户数量足够、没有同一个用户的大量交易记录、数据分析均匀、无缺失数据,符合我们的期望。
数据分布情况
数据分布均匀,数据质量较好。
数据相关性
可分析列与列之间的相关性,作为模型特征选择的参考。
其他特征的数据与用户id同理,此处不再赘述。接下来进行特征处理。
2)数据处理
a.RFM用户分群
利用AIWorks封装好的数据处理组件搭建RFM分层模型,计算每个用户的RFM参数,如下图左侧分支:
· 聚合函数_F:基于6个月交易数据,对user_id(用户id)进行groupby,并对transcation(订单号)求nunique,得到每个用户的历史交易次数;
· 聚合函数_M:基于6个月交易数据,对user_id(用户id )进行groupby,并对price(商品价格)求sum,得到每个用户的历史交易总金额
· 聚合函数_R:基于6个月交易数据,对user_id(用户id )进行groupby,并对date(交易日期)取最大值,取得每个用户最后一次交易时间
· Python脚本:将上述组件计算的R、F、M值通过Python组件合并到一张表中,输出结果如下图所示:
b.用户购买情况计算
右侧分支中,利用Python脚本进行数据处理:
· Python脚本_标签列:求每个用户每天的交易金额、以及是否进行消费、R、F、M值。是否进行消费作为这份数据集的标签列,用lable标识,当每天交易金额为0时,则label=0;当每天交易金额为>0时,label=1。
3)特征处理
一般算法建模中,特征处理包含:
(1)通用特征处理:如数据缺失值填充、数据采样、类型转化等;
(2)数值型特征处理:如归一化、标准化等;
(3)字符型特征处理:字符类型的字段不能作为模型的输入,需要将这类特征先数值化,如one-hot编码、label编码等。
在当前算法场景中的RFM分层模型、用户购买率预测模型中,我们采用的模型特征都是R(最近一次消费时间)、F(消费频率)、M(消费金额)3个字段,无缺失值,都是数值类型字段,暂无需做其他特征处理。
4)特征选择
特征选择一般需要根据具体的业务场景和专家经验,选择模型的特征列,且需计算特征与特征之间的相关性(高相关性的特征选择其中一个便好,否则不容易判断该模型的特征重要性),及特征与标签列之间的相关性(选择影响标签的特征,若特征对标签无显著影响,则无需选择)。
该算法场景中,将用户的原始属性转化成R、F、M值作为模型的特征输入。可分析一下特征之间的相关性:
特征间相关性较低,可作为模型输入。
知识点2:特征与标签
算法模型一般表达的是一个数学关系,即y(标签列)和x(特征列)的关系,y是模型的输出结果,x是影响模型的因素。如下图所示:
5)模型选择与训练
a.RFM用户分群
由于在RFM分群模型的搭建中,历史数据没有标签列,即没有一个业务字段来表示该用户属于哪个群体,所以该算法问题是一个聚类问题,我们采用机器学习聚类算法中的KMeans聚类模型进行分群。
KMeans聚类模型以样本间距离为基础,将n个对象分为k个簇,使群体与群体之间的距离尽量大,而簇内具有较高的相似度。
· KMeans聚类:模型进行数据处理,将用户分成3类,输出如下:
b.用户购买概率预测
用户购买预测需要预测出未来用户是否会购买以及购买的概率,属于一个二分类问题,此处采用机器学习分类模型中的XGB分类模型进行用户分类。
XGBoost是经过优化的分布式梯度提升库,计算非常高效、且灵活与可移植性高。
· Python脚本_训练集:将历史月的用户数据作为训练集
· Python脚本_测试集:将当月的用户数据作为测试集;
· XGB分类:用训练集进行模型训练;
· 预测:用训练好的XGB模型预测今天的用户是否会购买,以及购买的概率,模型运行结果如下:
6)模型评估
采用模型评估组件评估模型的好坏。
针对XGB分类模型,我们采用混淆矩阵和二分类模型评估组件进行模型评估,可查看模型的性能指标,如下图:
模型评估结果:
· 准确率:模型预测正确的结果,占所有样本的比例;
· 精确率:模型预测出正确的会购买用户/预测出的会购买用户(无论是否正确),来表示是否筛选出正确的结果,宁可没有预测出来,但不能预测错误。
· 召回率:模型预测出正确的会购买用户/真实的会购买用户,来表示模型识别的广度。
· F1值:综合反映精确率与召回率,F1越高,在精确率与综合率的表现越好。
· AUC值:AUC是ROC曲线的面积,AUC越高代表模型的区分能力越好
该模型的各项评估指标符合期望,可对外使用。
7)输出发券用户列表
· Python脚本_目标用户:将KMeans聚类模型划分出属于“1”类别(重要价值客户:购买金额高、购买频率高、购买时间近),且XGB分类模型预测出来的今天不会购买的用户筛选出来,针对这部分人群发放优惠券,进行定向营销,该组件输出的用户列表如下,共238个用户。
由此,便得出一个可定向精准营销的用户列表,可进行后续的营销活动,以此提升营销的准确率,实现ROI的最大化。
8)模型周期性运行
若该模型正式投入线上使用,可每天定时跑批,输出最新的RFM分群用户,以及该用户在明天是否会购买的信息,从而提供给业务人员进行差异化的营销。
9)模型在线预测
除模型周期性跑批之外,也可以把该算法模型进行pipeline部署,以数据API的方式对外提供服务。外部业务系统在线调用模型,模型预测出结果,实时返回给业务系统该用户是否会购买的结果。
AIWorks-企业级算法开发平台
AIWorks是集可视化建模与交式代码编写于一体的企业级算法开发平台,支持从数据接入、算法建模、模型训练、任务运维到模型部署全链路流程,帮助企业快速构建高效、安全、稳定的分布式算法运行环境,提升算法服务能力。
算法挖掘项目持续深耕数据智能化应用领域,目前已交付金融、政府、制造、地产等多个行业,感兴趣的小伙伴欢迎联系。