数据分析/剁手党的神奇之旅(上)

去社区提问

简介:对淘宝的用户行为数据分析可以为决策提供有力支撑,一起解读数据分析常见专题分析:流量指标分析,用户行为分析,漏斗流失分析和用户价值分析。

剁手党的神奇之旅(上)

网购的高光时刻

网络购物,毫无置疑已经成为我们生活中不可或缺的一部分。

不管你信不信,据多年前(遥远的2014年)的数据显示,中国消费者每周平均网购的时间高达387分钟,(387/60 = 6.45 小时 !!!),相较全球市场的202分钟,竟多出3个小时。

此刻的你是不是正在认真地回忆那些与网络购物在一起的高光时刻呢?

Bingo!课堂提问时间:

回顾你的购物历史,

  • 你知道你在每周的周几下单次数最多吗?
  • 每天哪个时间段你出现在网络购物网站的概率最大呢?

有答案了吗?好奇的你是不是也想放眼所有网友,拥有上帝的视角,一睹为快其它网友的购物行为呢?

今天,让我们一起,用Python分析真实的淘宝app的平台数据,通过相关数据指标,一起探索淘宝用户的行为模式。

你究竟是不是整条gai最特立独行、最靓的仔,答案马上揭晓~

特别提示:如果暂时不理解代码的含义也没有关系~只通过这些案例了解Python用途就达到了目标。12课时开始将进入详细的Python语法学习,要继续加油呀。

话不多说,上数据!

下面为你献上2014.11.24到2014.12.07之间,淘宝App移动端某页面两个自然周内的用户行为数据。数据储存在csv文件中,长这个样子:

数据共包含458612条记录,每条记录有6个字段:

  • 用户身份
  • 商品id
  • 用户行为类型(包括点击、收藏、加入购物车、支付四种行为,分别用数字1、2、3、4表示)
  • 地理位置
  • 品类id(商品所属的分类)
  • 用户行为发生的时间

了解了数据,我们就可以开始挖掘数据中隐藏的信息了,我将手把手带你体验数据分析中常做的几类专题分析。

先透漏一下,我们将会完成这样的四组分析:

  • 流量指标分析
  • 用户行为分析
  • 漏斗流失分析
  • 用户价值RFM分析

准备好了吗?

数据洗刷刷

在开始酷炫操作之前,需要读取数据,对数据进行预处理。我们拿到的数据可能存在大量的缺失值,也可能因为录入错误导致有异常数据存在,需要在第一步把它们扼杀在摇篮中,得到干净标准的数据。

第一步:读取数据

随堂抽查时间到~提问:前面反复讲过Python可以让我们避免重复造轮子,原因是什么呢?

答案就是它有丰富的第三方库可以直接供我们使用(忘记的同学自行罚站)。

首先我们导入整个分析过程中将会使用到的库。

  1. # 导入相关库
  2. import pandas as pd
  3. from matplotlib import pyplot as plt
  4. import seaborn as sns
  5. import numpy as np
  6. import warnings
  7. # 有时候运行代码时会有很多warning输出,像提醒新版本之类的,如果不想这些乱糟糟的输出,可以使用如下代码
  8. warnings.filterwarnings('ignore')

然后使用pandas中的函数read_csv()读取数据:'taobao_consume.csv',并查看前五行。

这里有一个小知识点需要大家了解:

上面提到的函数和数学课上的函数是两个不同概念,看到它可千万别犯头疼(比数学课简单多了)。可以理解为它是一个方便的工具,使用它就能帮我们直接解决问题。

比如read_csv()函数功能就是读取数据,head()函数就能获得前五行数据,是不是很厉害。

代码练习:

编程区

  1. # 读取数据
  2. data = pd.read_csv('taobao_consume.csv')
  3. # 查看数据前五行
  4. data.head()

终端区

惊奇地发现第四列的五个数据全部为NaN(not a number),表示未定义或不可表示的值。

看起来待会儿需要处理一下它们。

其它数据还是比较符合预期的,可以看到‘发生行为时间’记录了日期和当天几时下单。

对于上面的用户身份,商品id,用户行为和商品分类四项数据,我们可以查看一下它们的统计指标(语音里解释一下具体得到了哪些指标,平均值标准差…):

代码练习:

编程区

  1. #查看数据统计信息
  2. data.describe()

终端区

第二步:数据预处理

查看完数据我们现在心中有底了,接下来就要对它们进行预处理。在这一步中我们要做的事情有两件:

  • 残忍丢掉无用的数据
  • 把数据处理为我们需要的格式

丢弃无用数据

查看数据前五行的时候,发现第四列有不少空值,那对整个表格来说具体有多少缺失呢,这40多万行的数据如果交给你来做是不是有点手足无措。

其实下面的一行代码就可以算出每列的数据缺失率,so easy~

代码练习:

编程区

  1. # 计算缺失率
  2. data.apply(lambda x:sum(x.isnull())/len(x))

终端区

地理位置数据缺失率72%,缺失率比较高,所以我们决定粗暴地把这列删除。

  1. # 删除地理位置列
  2. data.drop(['地理位置'], axis = 1, inplace = True)

把数据变为想要的样子

数据中下单时间记录的是下单的日期和小时,后续我们想要分析一周中哪天是大家的‘剁手’高峰期,或者在一天内几点是用户下单热门时段。

就需要把下单时间这列进行拆分,将它记为两列数据。

代码练习:

编程区

  1. # 处理日期数据为 日 小时
  2. data['日期'] = data['行为发生时间'].str[0:-3]
  3. data['小时'] = data['行为发生时间'].str[-2:]
  4. # 将time、date列都变为标准日期格式,将hour列变为int格式
  5. data['行为发生时间'] = pd.to_datetime(data['行为发生时间'])
  6. data['日期'] = pd.to_datetime(data['日期'])
  7. data['小时'] = data["小时"].astype(int)
  8. data.dtypes

终端区

经过这样一番操作,原数据中就添加了两列:日期、小时,分别记录下单日期和小时。这样一来,数据就差不多变成了我们想要的模样。

咳咳注意我说的是‘差不多’,还有一点细节微调一下就OK啦~

按下单时间排一下序。

代码练习:

编程区

  1. # 按照time列升序排序
  2. data.sort_values(by="行为发生时间",ascending=True,inplace=True)
  3. data.head()

终端区

排序之后看到最左侧的数据索引也跟着做了调整,看起来十分凌乱,非常麻烦不好处理,我们可以删除原索引,重新生成一组有序索引。

代码练习:

编程区

  1. # 删除原索引
  2. data.reset_index(drop=True,inplace=True)
  3. data.head()

终端区

一起思考:在开始分析前,我们还需要获取哪些信息呢?拿到这四十多万行表格记录的是淘宝用户的行为详情,具体究竟是哪些天的数据我们还没搞清楚呢,不同时期用户的下单激情也不同。(毕竟赶上双十一的话你懂得)

那我们就一起来看一下~用unique()函数获取到日期这一列下有多少个不同元素。

代码练习:

编程区

  1. # 对时间数据做一个概览
  2. data['日期'].unique()

终端区

原来记录的是从11月24日开始到12月7日结束的用户消费行为数据。

代码练习:

编程区

  1. # 数据统计天数
  2. data['日期'].nunique()

终端区

一共14天的数据。

这下数据全部了解清楚,可以开心地开始做分析了。

重要的流量分析

我们的分析首先从流量指标开始。

‘流量小生’,‘顶流爱豆’是电影电视和综艺节目追捧的对象,这些明星能给节目带来更多的流量,更多的关注和话题。这也是各导演制作人愿意花重金邀请顶流明星的原因。我们不得不承认,流量,真的很重要(贵)。

对于互联网公司来讲,流量意味着话语权与生命力。而评估流量最常用的指标就是pv和uv。

pv:page view的缩写,指的是页面总浏览量。每个用户每刷新一次网页,就会增加一次pv。

uv:unique visitor的缩写,指的是独立访客。

举一个简单的例子,一家服装店,今天有两位顾客光顾,顾客A试穿了3件衣服,顾客B试穿了2件衣服。

通俗地讲,uv指的就是服装店一共接待了几位客人,结果是2;pv就是顾客共试穿过多少件衣服,答案是5。

因此,如果你的1个页面有100次的访问,那么很有可能不是来自100个不同的访问者,其中有些访问者贡献了2次甚至更多的访问,那么页面的UV一定是小于等于100的。

接下来,我们就来计算一下淘宝2014.11.24到2014.12.07之间的pv和uv。

我们会从多个角度出发,对流量数据做整体解析,包括总体,日维度和小时维度的分析,看看会得出怎样的结果。

总体pv与uv

先来看一下两周的总pv和总uv。

别急着发愁~我们先从pv开始(还不是因为它简单嘛)计算页面总浏览量,不用去重,不用其他任何操作。

”那不就是把每条数据加起来算总数么“

这位同学大点声,让所有人听到你的声音!

答案就是这么简单,表格中每一行数据都是一条用户访问记录,使用count()函数求总和就能得到总体pv。

代码练习:

编程区

  1. # 两周的总pv
  2. total_pv = data['用户身份'].count()
  3. total_pv

终端区

放轻松,接着来看看uv,跟着我的思路来飞速转动大脑:

在每条访问记录中,避免重复计算相同用户访问,只求用户身份不同时的数据数量,就是我们想要的总uv。如果还觉得有点绕也没关系,来看下面的例子。

假设是这样几个数据,每条数据代表一个用户访问,我们可以看到用户身份为123和124的两个用户共访问了6次页面。pv就是总行数6,而uv就是这6行中出现不同用户身份,即不同用户访问的数量,答案就是2。

代码练习:

编程区

  1. # 两周的总uv
  2. total_uv = data['用户身份'].nunique()
  3. total_uv

终端区

从结果可以看到,在这两周中淘宝页面的总访问量为458612,页面的独立访客数为8072,也就是8072位用户共访问了458612次页面。

每日的pv和uv又是怎样的呢?

日期维度下(每日)的pv和uv

有了前面的基础,接下来的操作就显得十分轻松,只需要先按照日期把数据分组,然后同样进行上面的操作。

又是一行简单的代码(我已经听到了你惊叹的‘哇~’的声音)用日期分组,计算用户身份访问总和,就能得到每日pv数据。

代码练习:

编程区

  1. # 每日pv
  2. pv_daily = data.groupby('日期')['用户身份'].count()
  3. pv_daily

终端区

相信你已经学会抢答了,同理按照日期分组,计算得到日维度下的uv。

代码练习:

编程区

  1. # 每日uv
  2. uv_daily = data.groupby('日期')['用户身份'].nunique()
  3. uv_daily

终端区

OK数据到手~那每天的pv和uv值是否存在什么联系呢?现在想要把它们放在一起对比一下,冷冰冰的数字多不直观,如果能画出折线图展示,效果会一目了然。

前排说话闲聊的同学提醒一下后排打瞌睡的同学都集中注意力了哈,我这就带你推开数据可视化的大门。

”数据可视化“听起来很高大上的样子,在讲到这里前很多同学可能都觉得用Python编程实现数据的图形化显示“雨你无瓜”。

其实在数据量很大的情况下,Excel已经不能满足需求了。Python可以提供比Excel多很多数据展示的方法,可视化的格式很丰富。

想象在清晨,你端着一杯茶,坐在办公桌前,看着眼前大屏幕上各项指标情况,清晰,简约,一目了然,你动动鼠标,开启运筹帷幄的一天。

心里美滋滋对不对,清醒一下,下面这个可能才是真实的职场生活:

傍晚,一盏孤灯,你独坐在办公室里继续做着明天的报表,企业管理会议多,月报周报少不了,你“牺牲”在做表的途中,却还有千千万万的表格还在路上。

最可怕的事情是,你辛辛苦苦做出来的,也只是密密麻麻的数字与表格,看不到结论,谈何决策?

Python不仅可以高效处理数据,还能帮助我们实现数据可视化。这要依赖于前面我们导入的matplotlib模块,折线图,条形图,饼图,柱状图等都可以使用它来绘制。好像马上就能和痛苦的加班做表生活说拜拜了呢。

在处理之前,我们先把所需要的数据——每日pv,uv连接在同一个表里:

代码练习:

编程区

  1. # 连接两个表
  2. pv_uv_daily = pd.concat([pv_daily, uv_daily], axis = 1)
  3. pv_uv_daily.columns = ['pv', 'uv']
  4. pv_uv_daily

终端区

我们分别为pv和uv数据绘制折线图,让它们在同一子图中显示,subplot()函数就实现了这个功能。同时还可以自由设置绘制结果的线条颜色,图片大小等。

代码练习:

编程区

  1. # 绘图
  2. plt.figure(figsize=(16,10))
  3. plt.subplot(211)
  4. plt.plot(pv_daily,c="r")
  5. plt.title("每天页面的总访问量(PV)")
  6. plt.subplot(212)
  7. plt.plot(uv_daily,c="g")
  8. plt.title("每天页面的独立访客数(UV)")
  9. #plt.suptitle("PV和UV的变化趋势")
  10. plt.tight_layout()
  11. # plt.savefig("PV和UV的变化趋势",dpi=300)
  12. plt.show()

终端区

运行代码我们得到了两个美观的图表,这下清晰多了。感觉自己离喝茶生活更近一步。

从图中可以看到,pv和uv数据呈现高度的正相关。pv和uv一周中的最低值都出现在周五,推测原因可能是用户周五白天上班,晚上结束一周的工作,聚会活动比较多。

12月1日开始,pv和uv整体较上周都有所上升,追究原因我们发现12月1日开始,淘宝平台开启了双12预热活动,商家开始推出优惠信息,付定金,盖楼活动想必大家也都没少参加吧(手动狗头),带来了pv和uv的整体上涨。

那么从时间的维度来看,每天几点是用户逛淘宝的高峰时段呢?

时间维度下的pv和uv

到这里应该不需要我废话太多,直接按照时间划分数据,照旧计算结果就可以啦。

代码练习:

编程区

  1. # 每小时pv
  2. pv_hour = data.groupby('小时')['用户身份'].count()
  3. pv_hour

终端区

代码练习:

编程区

  1. # 每小时uv
  2. uv_hour = data.groupby('小时')['用户身份'].nunique()
  3. uv_hour

终端区

计算得到数据,我们再来画个折线图,从图像中分析获取信息。

代码练习:

编程区

  1. # 连接两个表
  2. pv_uv_hour = pd.concat([pv_hour, uv_hour], axis = 1)
  3. pv_uv_hour.columns = ['pv_hour', 'uv_hour']
  4. pv_uv_hour

终端区

这次我们把两个数据放在同一张图中对比观察。

代码练习:

编程区

  1. # 绘制图像
  2. plt.figure(figsize=(16,10))
  3. pv_uv_hour["pv_hour"].plot(c="steelblue",label="每个小时的页面总访问量")
  4. plt.ylabel("页面访问量")
  5. pv_uv_hour["uv_hour"].plot(c="red",label="每个小时的页面独立访客数",secondary_y=True)
  6. plt.ylabel("页面独立访客数")
  7. plt.xticks(range(0,24),pv_uv_hour.index)
  8. plt.legend(loc="best")
  9. plt.grid(True)
  10. plt.tight_layout()
  11. #plt.savefig("每个小时的PV和UV的变化趋势",dpi=300)
  12. plt.show()

终端区

从图中可以看出,晚上22:00-凌晨5:00,页面的访问用户数量和访问量逐渐降低,该时间段很多人都处在休息之中。而从早上6:00-10:00用户数量逐渐呈现上升趋势,10:00-18:00有一个比较平稳的状态,这个时间段是正常的上班时间。但是18:00以后,一直到晚上22:00,用户剧烈激增,一直达到一天中访问用户数的最大值。

参考这份数据结果,业务相关同学就可以针对用户的活跃时间段,例如18:00-22:00,采取一些促销活动。

这样一来,不管是决定推出活动还是发布上新时间,想要第一时间触达更多用户,都不再是以往“拍脑门”决定。用强有力的数据支持,让决策变得更加科学和快速,不用再反复开会七嘴八舌发表想法见解。

关于流量的分析就到这里啦,我们了解了常用指标pv,uv;经过处理得到总体,每日,每小时的数据值,并用图表将结果可视化呈现;还分析得出一些简单的结论,帮助运营更好地开展活动。

仔细品品,好像有点儿运筹帷幄内味儿了,在后面的课程中,我们一起来做些更有趣的事情,不见不散哦~欢迎扫描下方二维码,添加班主任微信。

已经添加过班主任的同学,可以直接联系对应老师,无需重复添加哦。

数据分析 1/3

剁手党的神奇之旅(上)

1.0x

恭喜完成本课时的学习!
坚持学习

行动力超过

累计学习

学习下一课时