项目简析
项目概述:
该项目集是一些模拟 Starbucks rewards 移动 app 上用户行为的数据。每隔几天,星巴克会向 app 的用户发送一些推送。这个推送可能仅仅是一条饮品的广告或者是折扣券或 BOGO(买一送一)。一些顾客可能一连几周都收不到任何推送。
顾客收到的推送可能是不同的,这就是这个数据集的挑战所在。
你的任务是将交易数据、人口统计数据和推送数据结合起来判断哪一类人群会受到某种推送的影响。这个数据集是从星巴克 app 的真实数据简化而来。因为下面的这个模拟器仅产生了一种饮品, 实际上星巴克的饮品有几十种。
每种推送都有有效期。例如,买一送一(BOGO)优惠券推送的有效期可能只有 5 天。你会发现数据集中即使是一些消息型的推送都有有效期,哪怕这些推送仅仅是饮品的广告,例如,如果一条消息型推送的有效期是 7 天,你可以认为是该顾客在这 7 天都可能受到这条推送的影响。
数据集中还包含 app 上支付的交易信息,交易信息包括购买时间和购买支付的金额。交易信息还包括该顾客收到的推送种类和数量以及看了该推送的时间。顾客做出了购买行为也会产生一条记录。
同样需要记住有可能顾客购买了商品,但没有收到或者没有看推送。
该项目拥有三个项目集:
portfolio.json – 包括推送的 id 和每个推送的元数据(持续时间、种类等等)
profile.json – 每个顾客的人口统计数据
transcript.json – 交易、收到的推送、查看的推送和完成的推送的记录
问题理解:
针对于判断哪一类人群会受到某种推送的影响这一目标,我们可以从顾客现有的特征,包括性别、收入、年龄、注册会员时长、优惠券折扣力度、优惠券的类型、对该品牌消费的水平等参数入手,建立模型的特征量进行广告推送的成功率预测。
步骤:
1.理解数据的用户特征。
2.寻找可能相关的用户特征,并进行清洗。
3.对成功率进行预测,获得模型可应用于更加偏好的推送分析。
分析目的:
根据现有的项目提供数据,预测新的用户接入并收到推送成功的概率(广告类为收到且阅读,优惠券类型为收到、阅读并核销)。
模型评估指标:
accuracy_score
分类准确率分数是指所有分类正确的百分比。分类准确率这一衡量分类器的标准比较容易理解,但是它不能告诉你响应值的潜在分布,并且它也不能告诉你分类器犯错的类型。
Precision_score
精度为真正量的数量在正量中的比例。
recall_score
召回率 =提取出的正确信息条数 /样本中的信息条数。通俗地说,就是所有准确的条目有多少被检索出来了。
F1-Score
F1分数(F1 Score),是统计学中用来衡量二分类模型精确度的一种指标。它同时兼顾了分类模型的精确率和召回率。F1分数可以看作是模型精确率和召回率的一种加权平均,它的最大值是1,最小值是0。
项目数据浏览
采用pd.read_json函数对三个json数据文件进行读取并抽样查看。

age (int) – 顾客的年龄
became_member_on (int) – 该顾客第一次注册app的时间
gender (str) – 顾客的性别(注意除了表示男性的 M 和表示女性的 F 之外,还有表示其他的 O)
id (str) – 顾客id
income (float) – 顾客的收入
初步可以判断age具有离群且异常值118,gender中明确有缺失值,income中具有缺失值。
用describe查看数据的基本情况,并且查看年龄的条状图。


对总体进行年龄分层和性别进行分层的年龄阶段数据量分析,可简单得出一百岁以上的异常值是比较多的,在对这一部分的数据完全剔除可能会导致样本的丢失情况比较严重,暂不处理。可以看出实际上星巴克的顾客年龄分布主要在40至70岁之间,而收入情况的平均数为65404。

由收入分层的柱状图中可得,数据处于50000至70000之间的用户数据最为多。

根据性别的分层分析收入情况,可以得出性别对于收入的影响较大。男性用户大部分的收入在低水平层次,而女性用户的大部分收入水平处在中间层次。

对于总体数据进行了一定的了解后,分析数据的缺失值情况。可以得出收入与性别同样缺失样本2175个。

除118岁以外的用户数据无缺失值。暂用missing_people变量存储这些年龄异常的数据,暂时不丢失。
后经过处理的,丢失118的异常值数据。

简单查看portfolio.json中的数据情况。
id (string) – 推送的id
offer_type (string) – 推送的种类,例如 BOGO、打折(discount)、信息(informational)
difficulty (int) – 满足推送的要求所需的最少花费
reward (int) – 满足推送的要求后给与的优惠
duration (int) – 推送持续的时间,单位是天
channels (字符串列表)为推送的途径平台

可以得出portfolio文件的缺失值为0,推送的优惠类型仅三种bogo,informational,discount。

event (str) – 记录的描述(比如交易记录、推送已收到、推送已阅)
person (str) – 顾客id
time (int) – 单位是小时,测试开始时计时。该数据从时间点 t=0 开始
value - (dict of strings) – 推送的id 或者交易的数额


对数据的统计可得,共有参与行为的不通用户17000名,统计的用户行为包括收到推送,阅读推送,推送核销。并分别统计不同的行为累计次数,并且可得transcript数据库中没有缺失值。
对此,对于不同的性别、推送方式、推送广告本身的使用难度、推送广告类别、折扣率是否能正确预测出用户的优惠使用情况可以进行一个分析。
数据清洗
对于transcipt的数据进行查看可以得出,对于同一的推送的offer_id包含了不同的行为标签event。通过分析同一offer_id的对应offer_type类别可以得出不同的类别,比如折扣券和纯粹的广告的真实效果,优惠券是否使用成功,广告是否阅读。而对portfolio和profile的数据进行id的合并,可以得出对于同一id的用户的信息。再结合transcript的数据,可以得到每一个行为发生的id。即可以对最小单位--事件,获得有效的用户信息。据此,建立数据清洗与重组函数。
最小单位的组成由以下单位构成:

编写transcript清洗函数:1.对event也就是推送行为的分类构建dummies变量。2.将数据集分为与推送有关的,以及与交易有关的样本。

编写portfolio清洗函数:1.为offer编写dummies变量。2.丢弃推送平台信息以及优惠赠与的信息。

编写profile清洗函数:1.取年龄不为118的非异常值。2.统计用户的成为用户的年限。3.对性别进行dummies变量。4.改名id成为person并丢弃已转换成为其他的数据的原列gender、became_member_on。

对清洗过的三种dataframe按id即现在的person进行连接。并对其中推送成功情况(对于informational的视为收到推送且浏览,对于其余类型的视为收到、浏览并核销)的样本提取出来。

接下来实现对于不同性别推送成功率的可视化柱状图。

再针对不同的推送广告类别,对不同性别的成功率进行查看。

继续对于不同的年龄阶层查看广告推送成功率(<35,35~55,>55)

对于不同的推送广告类别进行分类并dummis,针对此进行分析。
模型预测与评估
对已获得的特征向量进行预测,选择三种不同的分类器算法:
Bagging Classifier\RandomForestClassifier\AdaBoostClassifier


评估的方法有Accuracy score、Precision score、Recall score、F1 score
accuracy_score
分类准确率分数是指所有分类正确的百分比。分类准确率这一衡量分类器的标准比较容易理解,但是它不能告诉你响应值的潜在分布,并且它也不能告诉你分类器犯错的类型。
Precision_score
精度为真正量的数量在正量中的比例。
recall_score
召回率 =提取出的正确信息条数 /样本中的信息条数。通俗地说,就是所有准确的条目有多少被检索出来了。
F1-Score
F1分数(F1 Score),是统计学中用来衡量二分类模型精确度的一种指标。它同时兼顾了分类模型的精确率和召回率。F1分数可以看作是模型精确率和召回率的一种加权平均,它的最大值是1,最小值是0。
模型训练

对于第一次数据特征选择的情况分析可看到预测效果并不是十分完美。
考虑到用户对该品牌的消费能力会反应用户粘性。所以增加因素为该用户在该品牌的消费情况。考虑的因素包括核销使用最低消费、持续时间、推送方式、性别、推送类别、已消费平均费用,预测的为用户的使用成功情况。
增加消费的特征量

重新进行训练并预测,对预测数据评估结果:

可以得出该种特征变量,相对与以上情况出现了改善。
其中我们用的三种方法分别是bagging,randomForest,adaboost方法。从评估结果的信息来看,adaboost方法的准确性更高,该集成方法是将使用的给定的学习算法构建的基本分类器的预测结合起来,以此来提高分类器的通用性\鲁棒性。在该种情况下我们可以使用gridsearchcv方法来对参数进行进一步的筛选。获得最好效用的参数。
由于时间与机器性能,没有进行更多尝试,可以尝试更多的不同算法,进行对比时间空间开销。

从结果可以看出,一开始选择的300个评估节点与学习率0.2即是效果最佳的参数。
继续调整n_estimators的数量大小,将范围缩小至290,300,310,学习率调整为0.1,0.2,0.3继续进行测试。

可以看出300,0.2依然为最优选择,继续调整参数到298,300,302,0.15,0.2,0.25范围来进行训练,查看结果。

根据以上结果可得知298为最佳的结果,但是这么小的调整量对于模型的提升性能十分微小。不及修改特征输入量的提升效果强大。
结果分析
由第二次调整过的特征来进行success的分析预测,有一定程度的准确率提高。可以判定得出年龄、性别、注册时间、对该品牌的消费、用户本身收入能力、优惠券的折价力度、推送平台等因素,均对推送的成果具有影响。依据此模型,可以在之后的优惠券以及广告的推送中做到更有效的推送。
结论部分
数据分析项目的一个难点在于特征量的选取,特征量的选择需要结合编码者对于数据的理解和一定的敏感度。另一个难点在于数据结合的代码撰写,需要先心中有沟壑,最终的数据大概是什么样子,或者说需要先搭好框架再进行数据的选取,特征的选取。
改进部分
对于分类的模型还可以继续深究,可以采用gridsearchcv对激活器的数量进行多个数值训练,对于学习率也可以尝试不同的数值。也可以采用更多的分类器算法。
网友评论