72-R语言淘宝用户行为分析案例

Python042

72-R语言淘宝用户行为分析案例,第1张

参考: http://mp.weixin.qq.com/s?__biz=MzIxNjA2ODUzNg==&mid=2651440274&idx=1&sn=7c5b8062891110c191f2463c3f1060c8&chksm=8c73dc45bb04555346d33c0e91449b7603468d09d5b3b945140451e9c259a5995b55f070527d&mpshare=1&scene=24&srcid=040751THZgbr42wORjuPnmR0&sharer_sharetime=1586226101529&sharer_shareid=e7cab4ddb0b83013d3591b3744cb904b#rd

数据: https://tianchi.aliyun.com/dataset/dataDetail?dataId=46

查看数据集缺失值情况:

变量time和user_geohash都包含缺失值,其中time包含1个缺失值,user_geohash包含550130个缺失值。

因为user_geohash地理信息在数据收集过程中做过加密转换,所以选择不对缺失值进行处理。

将time列分裂为date和hour列,并转换数据类型:

PV(访问量):即Page View,指网站页面的浏览量或点击量,页面被刷新一次就计算一次。

UV(独立访客):即Unique Visitor,访问网站的一台电脑客户端为一个访客。

1)日访问量分析

2)日访客分析

结果如图所示,pv和uv访问量在双十二期间达到峰值。使用最高uv除以总人数,可得出双十二期间淘宝用户的日活跃率最高为67.5%。

3)小时访问量分析

1、2、3、4分别代表点击、收藏、加购物车和支付。从上图中可以看到点击的次数远高于其他三种行为,以至于其他三种行为的趋势看不出来,所以下图中去掉了行为1的曲线。

从整体上看,四种行为的波动情况基本一致,并且在晚上7点-10点间pv访问量最高。

同时,从下图中也可以看到,行为3(加购物车)的pv总量高于行为2(收藏),行为2又高于行为4(支付)。

1)活跃用户每天购买次数情况分析

淘宝用户消费次数普通在10次以下,因此需要重点关注消费次数在10次以上的用户。

2)活跃用户每天人均消费次数

每天消费总次数 / 每天消费总人数

可以看到每天的平均消费次数一般都在1.2次左右,双十二期间达到最高值,约为1.4。

3)付费率

每日消费总人数 / 每日总活跃人数(每日有操作行为的人数)

用户付费率在6%左右,平均低于6%,双十二期间超过16%。

4)同一时间段用户消费次数分布

大多数用户消费次数为1次,平均消费次数为2.359,75%用户消费次数在3次以下。

复购率 = 有复购行为的用户数 / 有购买行为的用户总数

复购:两天以上有购买行为,但一天内购买两次或以上只算一次购买行为

将数据按日期排序,可以看到数据集的时间跨度为从2014-11-18到2014-12-18之间,正好一个月的时间:

先按date和user_id去重,然后按user_id计数,大于1时即为复购行为:

一个月之内的复购率为46.7%,多数用户在一个月内的购买次数为1-5次。

反映用户行为状态从起点(点击)到终点(支付)各阶段的转化率情况。

将数据按商品(item_category)和用户行为分组,然后计算各行为的次数。

用户点击后,大约有4.013%的概率会加入购物车,而加入购物车后大约有35.135%的概率会支付。

“数据 - 数字时代的石油”

“数据是新的石油”

在网络上、媒体上我们经常看到有人这样宣扬。

问题是: 我们能够像提炼石油一样从数据中提炼出价值来吗?

笔者多年从事汽车及出行领域的信息技术(IT)及产品研发,在这里就车联网数据分析的一些实践做个分享,看看能够从这些数据“石油”中提炼点什么,抛砖引玉。

下面的分析是针对单个车辆的车联网数据进行分析,而不是群体车辆的行为分析。

笔者计划从下面几个方面进行探讨(具体的会根据实际情况和各方面的反馈来调整):

        - 用户出行行为分析

        - 用户驾驶行为分析

        - 燃油车车辆动态行为分析

        - 电动车电池及充放电行为分析

        - 能耗分析

本篇分享一下用户出行行为的分析过程。

先看看车联网数据到底有多大,各家OEM和后装解决方案的数据采集信号、采集频率都不同,也没有行业统一标准。这里举一个例子,让大家粗略感受一下。

        - 假设数据采集频率为1 Hz(所有信号每秒采样1次),家用汽车平均每天使用2个小时(燃油车引擎启动就开始采集数据),一年就采集了365 * 2 * 3600 = 2.628 * 106次。

        - 如果每次采集的数据量为10 KB,那么,一辆车一年就产生大约26.3 GB 的数据。

        - 一年一百万辆装备有车联网的车将会产生26.3 GB * 106= 26.3 PB。(2018年中国有6家OEM年销量过百万)。

        - 丰田、大众、雷诺日产2018年全球销量均超过1000万。假设这几家OEM在未来数年内销量均保持这一水平,并且从今年开始实现100%新车车联网,每辆车平均寿命6年,那么6年后这些OEM存量车联网的车就是6000万,每家OEM每年将新增数据:26.3 GB * 60,000,000 = 1578 PB = 1.578 EB/年.

这么大的数据量,采集、传输、存储,如果以现在的技术和市场价格,成本是十分惊人的。所以,笔者大胆猜测,大多数OEM和物流公司在实际运营中都会降低采样频率,或者减少采样信号,或者以事件驱动,而不是以固定频率采样数据,以节省成本,尽管,技术上没有问题。

对上述目标的分析,笔者使用的车联网数据集来自于一辆车联网实验性乘用轿车。数据源本身就是脱敏的,去除了位置信息、用户信息、车辆等静态信息,只有车辆的动态数据。时间跨度为:2017年6月至8月。

采样频率高于1Hz,也就是平均每秒钟采样不止一次。原则上,采样频率越高越好,这样保留了高频信息,可以更加深刻地分析车辆的动态行为。

这几年热得一塌糊涂的无人驾驶,主要传感器的采样频率都不低于10 Hz。为什么采样频率要求这么高呢?比如,在高速公路上以120公里/小时的时速行驶,那么每秒钟行驶的距离是:120000/3600 = 33.3 米/秒。也就是说,在0.1秒的时间里(对应10 Hz),车辆已经行驶了3.33 米,这个距离足以将车辆驶离车道并酿成事故。

有了原始车联网数据(通常以CSV文件格式保存),笔者要对它进行预处理,为后续的数据探索、可视化,以及模型分析准备原料。

笔者使用的工具全程都是 R语言。

如何处理?要不忘初心、牢记使命:本部分数据分析的目的是 – 用户出行行为分析 。

基于该目的,我们所需要的数据项其实很少,只需要下面三项数据就可以了(是不是太简单了点?是的,就是这么简单。就像,都是小麦,光面条就可以做出很多种,更不要说各种面包,还有数不清的 dumpling了):

        - 时间戳– 每条记录发生的日期和时间

        - 里程表

        - 引擎转速– 判断车辆状态

如果有明确的、可靠的信号用于判断车辆状态,那么不建议使用“引擎转速”了。笔者认为这完全取决于实际的数据质量和内容。如果各位大神有更好的解决方案,欢迎分享和交流哦。

把其他的数据项暂时摈弃,只保留这三项,现在可以进行下一步了。

如果上述数据中,不同信号的采集频率不一样,那么,合并(或者叫融合,信号之间的融合)数据是非常重要的一步。合并可以发生在清洗、整理、聚合中间,或之前、之后的某个时间,具体要根据实际数据的情况来决定,很难一概而论。

首先了解选择的数据集的summary信息,可以快速知道哪些字段有数据缺失,有多少缺失。如果有缺失值,需要分析这些数据对我们的分析目的会有什么影响。如果没有什么影响,就删掉它们。

其次,时间戳是以字符串的形式存储的,包括日期和时间,笔者用的数据集精确到毫秒。这样不利于后续的计算和分析。需要把它转化成便于计算和分析的数据。毫秒的精度对我们分析用户出行行为来说没有意义,所以,由时间戳生成年、月、日、时、分、秒,这样,后续可以按照这些时间尺度进行聚合。

最后,按秒对数据进行聚合。选择的数据集高于1Hz的采样频率,但是实际原始数据往往不会100%严格按照相同的采样频率生成数据,有时1秒内有多条记录,有时会有缺失,看起来不是完全连续的。如果是车速等数据,聚合时采用平均值。里程数据是个累计值,所以取每秒内的最后一个数值,为了计算简单,都用平均值也可以,因为1秒内里程数据很难有大的变化。

经过这些步骤后,数据就规整了很多,可以进行下一步了。

将数据分割成一个个单独的驾驶行程,这样可以方便后面的出行行为分析了。

如何判断一个驾驶行程的开始和结束呢?

对于燃油车,一般来说,发动机启动后,才开始采集车联网数据,所以,没有数据就可以假定为车子是熄火的。这里用的数据就是燃油车的数据。

对于纯电动车(BEV),充电的全过程都会采集数据。

对于插电混动(PHEV)车,判断的依据要更加复杂一些,这个问题以后再讨论。

需要注意的是,真实数据通常不可能是理想的,每一步都要仔细检查,如果有疑问,或者不合理,找出那些引起可疑的数据,仔细分析原因,再根据发现的原因进行调整。这是一个不断试验、不断迭代的过程。

完成技术上的分割后,需要合并、过滤,得到相对合理的“有意义的”驾驶行程,在这个示例中,笔者得到了142次驾驶行程。也就是说,从2017年6月至8月的时间里,开了142次车。

处理完这些之后,我们就可以下锅做菜了,看看能不能做出点有意思的东东来吧。

分析的过程通常是由浅入深、由全局到局部。

如果数据足够多,建议先从大的时间尺度开始,比如从年开始,到月、日、小时,再到单个驾驶行程。最后,看看这些驾驶行程之间的关系,行程和各个时间维度之间的关系。一步步深挖。

首先,对整个数据集要有一个总体的认识,这个可以通过统计下面表格中的指标来完成。列出来的指标只是用于示例,具体需要统计哪些值应该根据分析的目的、业务场景、实际的原始数据集等。还是那句话:具体情况,具体分析。

其次,我们看一看该用户每月驾驶(出行)的频次,和旅行的总里程(公里数)。如图1所示,7月份开车的次数和行驶总里程最多,差不多是6月和8月的两倍。

从每月开车的次数来看,7月份开了70次左右,6月份半个月就有接近40次,而8月份仅有34次开车记录。那我们很想知道 8 月份的开车次数为什么减少了那么多呢?

统计一下每天驾驶的次数,如图2所示。结果有些让人意外,6月份从14日至24日(11天),7月份从10至29日(共18天,中间缺了2天),8月份从5至12日,27至31日(总共13天),其他的日期没有车联网数据。接近一半的日期里没有车联网数据。

是什么原因导致的呢?是那些天用户完全没有开车吗?还是由于某种原因,数据没有传输上来呢?

回答这个问题并不难。

我们还是从查看原始数据着手,里程表是不断递增的。比对最后一条记录的里程表和第一条记录的里程表数据得知,两者的差值是5646公里。回想前面表格里统计的“总驾驶里程”为2666公里,这说明在那些缺失数据的日期里,车辆仍然驾驶了接近3000 公里。

这也提醒分析人员,如果再对这批数据按月份进行分析,已经失去了意义。

因为这批原始数据来自于一辆车联网实验性的乘用轿车,我们不能要求太高。但是对我们实践我们的研究方法依然有效。

再前进一步,从日期的角度看看用户驾驶/出行的特征。如图3所示,共统计了三个指标的分布:

        1. 左上– 每天驾驶次数的分布,中值是3次,最多有7次。说明该用户开车比较频繁。

        2. 右上– 每天行驶距离的分布,中值是63公里左右,最多一天行驶261公里。

        3. 左下和右下两张图– 每天驾驶时长的分布,中值在90分钟处,说明该用户每天大约开车一个半小时。用频率图从另一个角度可以看到驾驶时长的分布特征。

在实际工作的时候,分析人员根据实际情况选择该用什么样的图表来更好地展现。

现在分析 单次驾驶的行为特征 。先从最简单的统计特征,单次驾驶距离和驾驶时长,入手。如图4所示,

        - 该用户开车的距离多数在10公里以内,或者在30-50公里范围内。

        - 每次开车多数分布在5-15分钟内,或者在30-60分钟内。

无论是距离还是时间长度都有两个峰值,是不是有某种背后的原因? 又一次把笔者的胃口吊起来了。

下面我们看一看单次驾驶距离的散点图,如图5所示,每一次驾驶的距离在图中表示为一个小圆点,从6月14日开始的第一次驾驶到8月31日记录的第142次驾驶,总共142个点。

根据前面的距离分布图(图4)得到的启示,我们从下图中可以观察到几个特征:

        1. 有一个超过200公里的行程,鹤立鸡群。其余的都没有超过100公里的。

        2. 在15公里以下有很多点行驶距离十分接近。

        3. 在30-50公里也有很多点的行驶距离十分接近。

我们似乎找到了前述疑问的答案,但是咱们既然是做数据分析,就要显得更加“科学”和“客观”,让数据来说话,而不是凭肉眼观察和猜测,否则,怎么显示出分析师的“逼格”来呢?

如何让数据说话呢? 聚类分析 是个好的工具,尤其是这里只有一个变量,K均值的方法就可以了,简单易行。

一开始,我们并不能确切地知道(假装不知道,这样才能“客观”)该分成几个聚类簇,一个做法是:从K = 1 到n(n 的取值要足够大,以保证最佳簇个数不大于n)都做一次聚类分析,然后比较各个K值下的 Betweens/TSS (簇之间的总平方和 / 总离差平方和),该比值越大,聚类效果越好。一般来说,K值越大,该比值也会越大。极端的情况是,比如,有100个点,分成100个聚类簇,这样当然没有意义。所以这里需要一个主观判断,通常在比值差不多的情况下,应该选择最小的K值作为最佳聚类簇。

在这个例子中,我取n = 10,因为直觉告诉我,最多3或4个聚类簇就够了,在此基础上放宽一到两倍作为n的取值应该足够了。

直觉会告诉我们可能有几个聚类,但是不要完全相信直觉(否则,就不“客观”了),还是应该让数据说话。

这里多啰嗦几句:在做数据分析的时候,直觉很重要,但是笔者建议更多地应该把直觉当成线索、孕育新的想法,就像是侦探破案一样。如果有一些小伙伴一起探索、探讨就更好了,可以时不时地问问:“元芳,你怎么看?”。

好了,把K从1到10循环做聚类分析,将这10个K值对应的Betweens/TSS显示在图上,如图6所示。可以清楚地看到,K = 3 和 K = 4 时,结果非常接近,但是比 K = 2 时显著改善,所以,笔者选定 K = 3 作为最佳聚类簇。

按照K = 3做聚类分析,重新绘制图5:单次驾驶的距离– 散点图,同时用不同的颜色区别聚类簇,如图7所示。

从图中,可以清晰地看出簇1(红色)只有一个点,就是那个单次驾驶距离最大的那个点,超过200公里,再一次鲜艳地鹤立鸡群。

既然簇1(红色)只有一个点,明显是一个特例,就不再深挖了(真相是挖不下去了)。

下面对簇2和簇3分别作进一步的分析。

对簇2(绿色)的驾驶次数,分别按照一天24小时、星期、单次驾驶距离,和单次驾驶时长,作频率分布图,如图8所示。从图中可以观察到下面几个特点:

        1. 大部分驾驶行为发生在下午至晚上,以下午3点至5点最多。

        2. 周日至周六都有,但是以周二最少。 又是一个线索,不是吗? 值得进一步深挖。限于篇幅,就不再赘述了(累了,歇歇吧)。

        3. 驾驶距离大部分不超过10公里。

        4. 开车时间大部分不超过20分钟。

好像是一个生活比较有规律的人啊。

同样,对簇3(蓝色)也做同样的分析,如图9所示,仔细观察这些分布图,可以发现下面几个特点:

        1. 驾驶的时间十分有规律,大部分发生在早上10 - 11点,和晚上7 - 9点。

        2. 周一至周5特别显著,周日完全没有。

        3. 驾驶距离大部分出现在30 - 36公里之间。

        4. 开车时间大约在30 - 60分钟之间。

从这些特征不难推测,簇3反映的是工作日上下班的驾驶行为。而家里到公司的距离大约30多公里,单程需要开车30分钟至1小时。交通状况还是不错的哦。

平均来看,上班时间大约早上10点,下班时间晚上8点。是不是和某一类熟悉的人群的特征比较吻合啊?有一种似曾相识的感觉。

结合簇2的特征,工作之余,主要在方圆10公里的范围内活动。簇1告诉我们,3个月内仅有一次远门。哈哈,形象更加丰满啦!

一不小心又自嗨了,初当程序员时的毛病,这么多年还是没有完全改掉。别忘了,这3个月里还有一半的日子没有数据呢。

至此,要演示的用户出行行为的分析告一段落了。笔者用到的数据仅有三项:

        - 时间戳

        - 里程表

        - 引擎转速(仅用于推算车辆状态)。

如果辅之以更多的、“相关的”数据字段,我们可以做更加深入的、多个角度的分析。

在这个过程中,如何提出问题、从数据中发现线索、不放弃任何一个疑点,然后像个侦探一样,一步一步地挖掘。坦率地说,这个感觉真的不错。

后续,笔者还会就车联网数据在其他方面的分析,进一步分享,敬请期待!