一、项目分析背景
拼多多是国内主流的手机购物APP,成立于2015年9月,用户通过发起和朋友、家人、邻居等的拼团,以更低的价格,拼团购买商品。
拼多多作为新电商开创者,致力于将娱乐社交的元素融入电商运营中,通过“社交+电商”的模式,让更多的用户带着乐趣分享实惠,享受全新的共享式购物体验。
对于各大电商平台,在“双十一”这种大促时间段,优惠券会起到非常大的促销作用。那么,如何找到更容易使用优惠券的用户,对他们精准地推送与营销,从而在双十一期间促使销售额获得很大程度上的提升呢?这将是一个待分析和解决的问题。
二、项目分析目标
根据对已获取数据的分析和信息挖掘,构建具有较好泛化能力的预测模型,从而对导入模型的未知特征矩阵数据进行优惠券是否被使用的有效预测,是此次项目的主要实践目标。
通过对包含用户属性信息以及优惠券的累计使用情况的数据集进行算法模型的构建,来预测不同属性下的消费者在未来是否会产生优惠券的使用行为,从而提出关于针对性发放优惠券、提升优惠券使用率的相关决策建议。
三、项目分析内容
1. 数据预处理
(1)导入所需库及数据集信息
(2)了解数据基本情况
1)观察数据类型和数据量
- 通过上述观察可知,整个数据集共有4个数值型变量及5个字符型变量,包含25317个数据样本,且不存在缺失值。
2)观察数据集结构与内容
通过对数据集的结构与内容进行观察可知,其包含8个特征及一个标签,特征矩阵中存有两个数据维度,分别为用户属性以及用户消费行为信息,如下是不同维度内的特征及标签列含义解读情况:
- 用户属性维度
- age:数值型变量,用户年龄
- job:字符型变量,用户岗位详情
- marital:字符型变量,用户婚姻状态
- default:字符型变量,信用卡是否存在违约行为
- 用户消费行为维度
- returned:字符型变量,用户是否有过退货行为
- loan:字符型变量,用户是否使用信用卡付款
- coupon_used_in_last6_month:数值型变量,用户在6个月内累计使用优惠券数量
- coupon_used_in_last_month:数值型变量,用户在1个月内累计使用优惠券数量
- 数据标签字段
- coupon_ind:数值型变量,用户是否在此次活动中使用优惠券
3)观察数值型变量的描述性统计情况
通过观察数值型变量的描述性统计情况可得:
-
age(用户年龄):最小值为18岁,最大值却达到了95岁,并且从分布情况来看90%以后的分布离散情况过于严重,存在一定的数据异常。首先,从数据本身入手,在99.9%处的年龄值为83岁,而最大值却达到了95岁,离散值偏离整体数据过远,存在异常。其次,从现实意义来看,95岁高龄的老年人不太可能使用拼多多软件进行购物,为此数据存在录入异常情况。后续会对异常值进行数据清洗。
-
coupon_used_in_last6_month(用户在6个月内累计使用优惠券数量):近50%的用户在6个月内仅使用过一张优惠券,而分布在75%后的用户的累计优惠券使用数量达到3张及以上,拉动整体使用数量的平均值达到了3张左右,这种现象符合帕累托定律(80/20法则),反映出拼多多近80%的优惠券使用量由仅20%的用户提供,从优惠券使用率的角度来看,拼多多存在高价值用户,后续需要有区分性的对高价值用户和一般用户制定优惠券推广策略,尝试推动一般用户提升优惠券的使用量,重点关注如何维护高价值用户的忠诚度。
除此之外,从整体分布以及合理性来看,数据存在异常值(离群值),后续需对其进行过滤,其目的是为了减少模型在学习过程中拟合效果出现偏差的可能性。
-
coupon_used_in_last_month(用户在1个月内累计使用优惠券数量):近75%的用户在近1个月内没有使用过优惠券,仅有分布在最后的15%左右的用户使用了1张及以上的优惠券。从整体上来看,优惠券累计使用数量的平均值仅为0.3,标准差值也不大,说明在近一个月内使用优惠券较多的用户数量占比很小,未能起到拉动整体平均使用量提升的效果,且数值分布较均衡,多数用户使用至多一张优惠券,仅存在极少量的离群值,可知拼多多在1个月内对优惠券的推广效果并不可观,需进一步改进优惠券的策略制定。
类似于用户在6个月内累计使用优惠券数量变量的情况,数据本身存在异常值(离群值),为此需要在后续进行数据过滤。
4)观察字符型变量的分类情况
- job(用户职位信息):通过观察用户职位的分类情况可知,其共包含11个分类,分别为admin.、blue_collar、entrepreneur、housemaid、management、retired、self_employed、services、student、technician及unemployed,其中存在163个未知分类数据,后续需对这些噪声值进行适当的处理。
- marital(用户婚姻状况):通过观察用户婚姻状况的分类情况可知,其共包含3个分类,分别为divorced、married及single,该字段并不存在异常的分类情况。
- default(用户信用卡是否存在违约行为):通过观察用户信用卡是否存在违约行为的分类情况可知,其共包含2个分类,分别为yes和no,且两者的分布情况非常不均衡,占比达到99:1。除此之外,该字段不存在异常分类情况。
- returned(用户是否有过退货行为):通过观察用户是否有过退货行为的分类情况可知,其共包含2个分类,分别为yes和no,两者的分布情况较均衡,且该字段不存在异常分类情况。
- loan(用户是否使用信用卡付款):通过观察用户是否使用信用卡付款的分类情况可知,其共包含2个分类,分别为yes和no,且两者的分布情况非常不均衡,占比达到5:1。除此之外,该字段不存在异常分类情况。
(3)数据清洗
1)数值型变量的离群值过滤
- 利用箱线图的分布规律先过滤age字段的离群值,过滤掉<下四分位—1.5x(上四分位—下四分位)以及>上四分位+1.5x(上四分位—下四分位)的离群数据样本。通过对age字段的清洗可观察到离群值已经得到了有效的过滤,清洗了近300条异常值,数据总量还有25033条。
- 进一步观察描述性统计结果发现coupon_used_in_last6_month和coupon_used_in_last_month字段依旧存在较离谱的离群值,但是为了保证不大量减少该字段所包含的信息量,将不使用箱线图分布情况进行筛选方法,而是直接删除大于99.9%处数值的样本数据,避免过度损失字段信息。
- 通过对coupon_used_in_last6_month和coupon_used_in_last_month字段采用相同方式的异常值清洗,可得上述的描述性统计结果,数据总量剩余24952条。
2)字符型变量(job变量)的噪声数据处理
- 通过前面对job变量分类情况的分析,可以获知未知分类仅占总体的0.64%,异常值数据量较少且数据的填充值具有不确定性,为此可对其直接进行删除操作。
(4)特征类型转化
为了便于后续建立分类器模型,需提前将字符型数据转化为数值型数据。(sklearn中分类器无法处理字符型)
1)job变量(用户岗位详情)的数据类型转换
- 使用数据预处理库中的LabelEncode对字符型数据进行编码处理,将字符型数据转化为0-10的数值型数据,便于后续分类器模型的建立。
2)marital变量(用户婚姻状况)的数据类型转换
- 处理方法同job变量,将用户婚姻状况字符型变量转化为3个类别,分别用0-2来表示。
3)default变量(用户信用卡是否存在违约行为)的数据类型转换
- 直接使用匿名函数将default变量进行二值化处理,no用0来表示,yes用1来表示。
4)returned变量(用户是否有过退货行为)的数据类型转换
- 直接使用匿名函数将default变量进行二值化处理,no用0来表示,yes用1来表示。
5)loan变量(用户是否使用信用卡付款)的数据类型转换
- 直接使用匿名函数将loan变量进行二值化处理,no用0来表示,yes用1来表示。
2. 算法模型的学习与调参
项目本身是解决分类型问题,且数据集多包含离散型变量,此次将选择随机森林分类器作为项目的模型。
(1)模型建立
n_estimators参数学习曲线折线图

- n_estimators参数是一个超参数,偏向于越大所得结果越好,可通过绘制学习曲线确定,随着其参数值不断增加,不会影响模型的复杂程度,从而影响模型的泛化误差,为此可作为随机森林模型第一个调整的参数。
- 构建随机森林分类器后,利用交叉验证结果绘制n_estimators参数的学习曲线,确定最佳参数值为86。
(2)模型参数调整
- 对训练集进行预测所获准确率为0.936,对测试集进行预测准确率为0.869,两者相差较大,表明现在模型处于过拟合状态(随机森林的基评估器决策树本是就是一个易过拟合的模型),接下来需要对模型进行剪枝操作,从而提升模型的泛化能力。
max_depth参数取值

- 通过对max_depth参数的学习曲线绘制,可以确定当参数值为9时,训练集和测试集的准确率差距最小,且测试集的准确率具有所大幅度的提升,分别达到了0.891和0.893。
(3)连续性变量离散化后对模型的优化
根据连续性变量的分布情况,对其进行离散化处理,从而达到优化模型预测结果的效用。
1)连续性变量的离散化
- age变量(用户年龄)的离散化
年龄频率分布直方图

- 根据图像的分布情况所示,先将用户年龄连续性变量划分为以下几个区间,分别为<=30、30-40、40-60以及>60四个年龄分布区间。
- 根据年龄分布区间的设定,再将其通过编码的方式转化为数值型,便于后续模型的学习。
- coupon_used_in_last6_month变量(用户在6个月内累计使用优惠券数量)的离散化
用户在6个月内累计使用优惠券频率分布直方图

- 根据图像的分布情况所示,先将用户在6个月内累计使用优惠券数量字段的连续性变量划分为以下几个区间,分别为2张之内、2-10张以及超出10张三个分布区间。
- 根据用户6个月内累计使用优惠券数量分布区间的设定,再将其通过编码的方式转化为数值型,便于后续模型的学习。
- coupon_used_in_last_month变量(用户在1个月内累计使用优惠券数量)的离散化
用户在1个月内累计使用优惠券频率分布直方图

- 根据图像的分布情况所示,整体呈现出非常明显的使用数量分布区间,数据本身就是离散型的变量,为此将不进行进一步修改。
2)重新构建模型
-
通过调整变量的数据类型发现,所得结果与未进行调整之前相差无几,为此可以将为调整数据类型前的模型确定为最终模型,训练集准确率和测试集准确率分别为0.891和0.893。
-
t通过对模型结果的迭代优化,基本构建出具有较优泛化能力的随机森林分类评估器,后续将利用模型对样本标签进行预测,根据预测结果构建出较易使用优惠券的用户画像。
3. 模型的结果预测
接下来将根据所建成的随机森林分类器模型,来预测训练集样本中用户是否使用优惠券的情况,并对不同优惠券使用情况下的用户属性及用户行为进行细化分析。
(1)模型中特征重要性分析
- 分析特征对于模型建立的重要性,可知用户年龄、用户是否有过退货行为、用户在1个月内累计使用优惠券数量以及用户职位详情四个特征对模型的影响程度较大,重要程度较高。
(2)模型的结果预测
- 利用predict_proba属性返回优惠券使用情况分类下的概率情况,当一方概率大于0.5时,将其样本的预测结果判定为所属分类。
- 筛选得出具有75%可能性会使用优惠券的样本数据,而非直接利用predict属性来获取用户具有50%的优惠券使用可能性,提升用户使用优惠券可能性的筛选条件,更有助于后续对用户属性及行为对优惠券使用情况影响的准确分类分析。
四、项目分析结论
根据上述分析可知,用户年龄、用户是否有过退货行为、用户在1个月内累计使用优惠券数量以及用户职位详情四个特征对模型的重要程度较高,为此,这四个特征将作为构建用户画像的主要考量因素。
1. 构建用户画像
(1)用户年龄及用户职位详情
1)用户年龄分布情况
用户年龄分布直方图

- 通过上述直方图所示,更加偏向于使用优惠券的用户,其年龄分布区间主要聚集在两个部分,分别为24-30岁以及60-67岁。
2)用户年龄与用户职位信息间相关关系
用户职位信息变量的分布情况过于松,且不具有一定规律,为此将其与用户年龄进行整体分析,从而得出更加具体且有意义的用户画像分析结果。
用户年龄与用户职位信息相关关系散点图

- 通过上述散点图分布所示,用户年龄分布在30-40以及50-55岁,且属于用户职位信息变量中unemployed类别下的用户,更加偏向于使用优惠券。
(2)用户是否有过退货行为
- 通过观察上述用户是否有过退货行为的描述性统计情况可知,偏向于使用优惠券的用户中,有超过75%的用户并未有过退货行为,大致可以推断出未产生退货行为的用户存在更大的可能性使用优惠券。
(3)用户在1个月内累计使用优惠券数量
- 根据上述描述性统计分析结果可知,用户在近1个月内产生过使用优惠券的行为更易在下一次销售活动或者消费中使用优惠券。
- 除此之外,对比1个月和6个月下用户累计使用优惠券数量的分布情况可以发现,两者的数值分布情况几乎保持一致,大致可以断定这些用户为拼多多近1个月内的新用户,之前并未有过使用优惠券行为,其全部的优惠券使用数量都集中在近1个月内。
2. 相关建议
-
构建用户画像,定位目标用户,有针对性的发放优惠券,从而提升优惠券使用率,并且间接达到促进拼多多销售额提升的效用。
-
拼多多在有针对性的发放优惠券时,需重点关注近1个月内新注册,年龄分布在24-30岁及60-67岁范围内,且很大程度上没有产生过退货行为的新用户,这类用户需被看作发放优惠券的重要目标,不仅可以提升优惠券的使用率,也可达到促进销售的效果。