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

去社区提问

简介:下面我们继续上节课的淘宝用户行为分析,依据数据进行用户行为分析,漏斗流失分析,用户价值RFM分析。完成一份专业的数据分析报告。

剁手党的神奇之旅(下)

看看‘剁手’规律

在逛淘宝时的浏览动作例如:点击,加入购物车,购买等行为都会被记录,这些数据我们经过分析也能得出关键结论,说不定又能帮助运营产品的同学发现一些有用信息,提出合理建议。

从点击查看商品到收藏加入购物车,最后完成购买,数据呈现怎样一种趋势?什么时期用户的下单购买比例最高?

最近疫情过去吹起了”地摊经济“的风,或许…你也准备练摊儿了吗?

2020最新风口,错过了淘宝错过了微商,千万不要错过地摊~

猜猜互联网人摆地摊能干嘛:

万一摆摊真成为热潮,会不会对线上支付订单数或其他数据产生较大影响?我们也可以通过数据的前后对比得出结论。

脑补了这么多,快对数据下手吧!回忆一下数据长什么样子:

原数据中记录了用户行为类型字段:用户行为类型,包括点击、收藏、加入购物车、支付四种行为,分别用数字1、2、3、4表示,那产生每种行为类型的用户有多少呢?

按照惯例,我们先查看一下总体,日期维度,时间维度下的数据表现。

1.总计点击、收藏、添加购物车、支付用户的情况

把表格中表示用户行为的这列数据按照内容1,2,3,4区分加和就能得到结果啦。

代码练习:

编程区

  1. type_1 = data[data['用户行为类型']==1]["用户身份"].count()
  2. type_2 = data[data['用户行为类型']==2]["用户身份"].count()
  3. type_3 = data[data['用户行为类型']==3]["用户身份"].count()
  4. type_4 = data[data['用户行为类型']==4]["用户身份"].count()
  5. print("点击用户:",type_1)
  6. print("收藏用户:",type_2)
  7. print("添加购物车用户:",type_3)
  8. print("支付用户:",type_4)

终端区

从结果中可以看到,完成了页面点击–>收藏–>加入购物车–>支付的用户数量,呈现逐渐下降的趋势。

不同日期维度下,数据的波动会不会有明显的差异呢?

2. 日期维度下,点击、收藏、添加购物车、支付用户的情况

我们创建一个透视表比较一下日期维度下的用户行为数据,然后再将数据绘制在图像中,运用的还是matplotlib模块。(别告诉我你已经忘记了它是干嘛的,不记得的话要往前翻一翻~)

代码练习:

编程区

  1. pv_date_type = pd.pivot_table(data,index='日期',
  2. columns='用户行为类型',
  3. values='用户身份',
  4. aggfunc=np.size)
  5. pv_date_type.columns = ["点击","收藏","加入购物车","支付"]
  6. pv_date_type.head()
  7. # 绘图如下
  8. plt.figure(figsize=(16,10))
  9. sns.lineplot(data=pv_date_type[['收藏', '加入购物车', '支付']])
  10. plt.tight_layout()
  11. #plt.savefig("不同日期不同用户行为的PV变化趋势",dpi=300)
  12. plt.show()

终端区

产生点击行为的用户数量级较大,与其它数据放在同一个坐标系中不方便我们发现数据的波动幅度,所以这里我们只绘制了收藏、加入购物车、支付的用户数据。

可以看到,三种行为的数据在每周不同天基本同幅波动,与前面pv、uv的波动规律相似。依然是周五数据整体偏低,看来大家周五下班是真的需要出门放风,释放自我。

再来看一下时间维度下的数据波动。

3.时间维度下,点击、收藏、添加购物车、支付用户的情况

以时间维度统计用户的四种行为,做出折线图,看看会得出怎样的结论。

代码练习:

编程区

  1. pv_hour_type = pd.pivot_table(data,index='小时',
  2. columns='用户行为类型',
  3. values='用户身份',
  4. aggfunc=np.size)
  5. pv_hour_type.columns = ["点击","收藏","加入购物车","支付"]
  6. pv_hour_type

终端区

代码练习:

编程区

  1. # 绘图如下
  2. plt.figure(figsize=(16,10))
  3. sns.lineplot(data=pv_hour_type[['收藏', '加入购物车', '支付']])
  4. #pv_hour_type["点击"].plot(c="pink",linewidth=5,label="点击",secondary_y=True)
  5. #plt.legend(loc="best")
  6. plt.tight_layout()
  7. # plt.savefig("不同小时不同用户行为的PV变化趋势",dpi=300)
  8. plt.show()

终端区

可以看出:凌晨五点,用户的收藏、加购、支付行为都达到了最低值,之后逐步上升,10点之后逐渐平稳,傍晚6点之后又出现了增长的趋势,22时达到了巅峰。也与我们之前日维度下统计的pv和uv值基本同步。

用户下单支付是整个流程中要得到的最终结果,下面我们着重研究一下付费情况。

4. 人均消费次数分析

每次刷淘宝一般都会一次性下单几件商品呢,心情好看中喜欢的全部买买买!还是货比三家,慎重决定?

翻翻你的订单记录,再来用数据分析看看大多数’剁手党‘每次下单都支付几件商品,说不定会发现你已经很克制自己了。

首先来看一下这两周中付费用户每天的平均消费次数,一个除法问题,用每日的【付费总次数/付费总人数】即可。

代码练习:

编程区

  1. total_custome = data[data['用户行为类型'] == 4].groupby(["日期","用户身份"])["用户行为类型"].count()\
  2. .reset_index().rename(columns={"用户行为类型":"消费次数"})
  3. total_custome
  4. `

终端区

代码练习:

编程区

  1. total_custome2 = total_custome.groupby("日期").sum()["消费次数"]/\
  2. total_custome.groupby("日期").count()["消费次数"]
  3. total_custome2.head(10)

终端区

一堆数字还是不够直观,用折线图看一下分析结果:

代码练习:

编程区

  1. # 绘图如下
  2. x = len(total_custome2.index.astype(str))
  3. y = total_custome2.index.astype(str)
  4. plt.plot(total_custome2.values)
  5. plt.xticks(range(0,15),[y[i] for i in range(0,x,1)],rotation=90)
  6. plt.title("每天的人均消费次数")
  7. plt.tight_layout()
  8. #plt.savefig("每天的人均消费次数",dpi=300)
  9. plt.show()

终端区

可以看到,这两周中付费用户每天的人均消费次数大约在1.2左右波动,付费行为整体比较稳定。

11月30日人均消费次数最低,可能因为12.1开启双十二预热活动,与其30号购买,不如等降价活动开始再下单。

我们也是精打细算的过日子啊~

5. 活跃用户人均消费次数

刚刚我们研究了付费用户的平均付费次数,那么整个大盘的活跃用户付费意愿如何呢?

如果活跃用户数量很多,但他们的人均消费次数数值偏低,运营和产品的同学可能就需要调整活动方案或者策略,想办法提高人均消费次数。

毕竟千千万和我一样月底穷得叮当响,刷刷淘宝只看不买的用户需要来自淘宝官方的关心和爱护。

来看一下活跃用户的人均消费次数结果,用【付费总次数/活跃用户数】即可。

代码练习:

编程区

  1. data["operation"] = 1
  2. aa = data.groupby(["日期","用户身份",'用户行为类型'])["operation"].count().\
  3. reset_index().rename(columns={"operation":"总计"})
  4. aa.head(10)

终端区

代码练习:

编程区

  1. aa1 = aa.groupby("日期").apply(lambda x: x[x["用户行为类型"]==4]["总计"].sum()/x["用户身份"].nunique())
  2. aa1.head(10)

终端区

紧接着上图~

代码练习:

编程区

  1. # 绘图如下
  2. x = len(aa1.index.astype(str))
  3. y = aa1.index.astype(str)
  4. plt.plot(aa1.values)
  5. plt.xticks(range(0,15),[y[i] for i in range(0,x)],rotation=90)
  6. plt.title("每天的活跃用户消费次数")
  7. plt.tight_layout()
  8. #plt.savefig("每天的活跃用户消费次数",dpi=300)
  9. plt.show()

终端区

可以看到,活跃用户的人均消费次数在0.07左右波动,业务部门的同学可以针对这个指标继续优化用户的付费转化。

6. 付费率PUR

付费率(PUR,Pay User Rate)是指统计周期内,付费账号数占活跃账号数的比例。

这里我们使用【消费人数 / 活跃用户人数】就可以得到数据。

代码练习:

编程区

  1. rate = aa.groupby("日期").apply(lambda x: x[x["用户行为类型"]==4]["total"].count()/x["用户身份"].nunique())
  2. rate.head(10)
  3. # 绘图如下
  4. x = len(rate.index.astype(str))
  5. y = rate.index.astype(str)
  6. plt.plot(rate.values)
  7. plt.xticks(range(0,15),[y[i] for i in range(0,x,1)],rotation=90)
  8. plt.title("付费率分析")
  9. plt.tight_layout()
  10. # plt.savefig("付费率分析",dpi=300)
  11. plt.show()

终端区

可以看到,付费用户在活跃用户中的占比大约为5%-6%,12月1日之后付费率整体有了一个正向的上升。

看来双十二的预售活动提高了大家的消费热情,更多用户准备开心的买买买了。后续也可以通过持续检测这项数据来对评判活动的效果和影响。

通过对用户行为的分析,我们搞清楚了下单“剁手”规律,那么没有被转化的用户都是在哪一步流失的呢?下面就根据数据来追踪一下。

漏斗分析

漏斗分析是一个常用的数据分析模型,听名字你也能大概猜出它的功能。

我们常见的“漏斗”都是将液体从大口倒入,小口漏出。在漏斗分析中,每个前步骤只会有部分用户进入到下一步骤中,是有筛选功能的。

从页面点击到最终支付,中间每一步都会流失部分用户,通过漏斗分析能让我们了解当前的转化状态,为增长提供基础。

我们在原数据中记录了用户完成页面点击–>收藏–>加入购物车–>支付四个步骤的行为数据,这四种行为之间存在转化的过程,那么每一步的转化率如何呢?一起来研究一下。

先统计每种行为的总人数,为后续铺垫一下。

代码练习:

编程区

  1. # 每种行为的人数
  2. df_count = data.groupby("用户行为类型").size().reset_index().rename(columns={"用户行为类型":"环节",0:"人数"})
  3. df_count

终端区

代码练习:

编程区

  1. type_dict = {
  2. 1:"点击",
  3. 2:"收藏",
  4. 3:"加入购物车",
  5. 4:"支付"
  6. }
  7. df_count["环节"] = df_count["环节"].map(type_dict)
  8. df_count

终端区

在实际网购过程中,收藏或将物品加入购物车,都表明用户有一定程度购买意向,只差最后一步就能完成付费下单了。所以在这步把收藏和加入购物车这两种行为相加合并,作为一个环节统计人数。

代码练习:

编程区

  1. # 将收藏及加入购物车作为一步,统计每个步骤的人数
  2. a = df_count.iloc[0]["人数"]
  3. b = df_count.iloc[1]["人数"]
  4. c = df_count.iloc[2]["人数"]
  5. d = df_count.iloc[3]["人数"]
  6. funnel = pd.DataFrame({"环节":["点击","收藏及加入购物车","支付"],"人数":[a,b+c,d]})
  7. funnel

终端区

数据准备好后,就可以开始计算每步的转化率了。这里的总体转化率计算的是从一开始的‘点击页面’到对应步骤的转化情况;单一转化率指的是从上一步到对应步骤的转化情况。

代码练习:

编程区

  1. # 计算每个步骤的转化率
  2. funnel["总体转化率"] = [i/funnel["人数"][0] for i in funnel["人数"]]
  3. funnel["单一转化率"] = np.array([1.0,2.0,3.0])
  4. for i in range(0,len(funnel["人数"])):
  5. if i == 0:
  6. funnel["单一转化率"][i] = 1.0
  7. else:
  8. funnel["单一转化率"][i] = funnel["人数"][i] / funnel["人数"][i-1]
  9. print(funnel)

终端区

看腻了折线图这次给你展示点儿不一样的~

代码练习:

编程区

  1. # 绘制漏斗分析图
  2. import plotly.express as px
  3. import plotly.graph_objs as go
  4. trace = go.Funnel(
  5. y = ["点击", "收藏及加入购物车", "购买"],
  6. x = [funnel["人数"][0], funnel["人数"][1], funnel["人数"][2]],
  7. textinfo = "value+percent initial",
  8. marker=dict(color=["deepskyblue", "lightsalmon", "tan"]),
  9. connector = {"line": {"color": "royalblue", "dash": "solid", "width": 3}})
  10. data1 =[trace]
  11. fig = go.Figure(data1)
  12. fig.show()

终端区

从上面的漏斗图可以看出,从浏览到具有购买意向(收藏和加入购物车),只有5%的转化率,但是到了真正购买的转化率只有1%。

再看“单一转化率”,即每一步的转化率,从具有购买意向到真正购买的转化率达到了20%。说明从浏览到进行收藏和加入购物车的阶段,是指标提升的重要环节。

那么负责业务的同学们就可以在这个步骤多加研究,想方设法提高这一阶段的数据。一不小心又贡献了有用信息~

用户价值分析

经过上面的分析我们可以看到,在每步中都会有大量的用户流失,那么该如何挽回?怎么从海量的用户中筛选出真正有价值的用户,让我们距离业绩小目标更近一步呢?

快乐的学习时光总是这么短暂,这是我们今天研究的最后一个问题啦。

RFM 模型是数据分析中衡量客户价值和客户创利能力的一个重要模型。为什么叫做RFM模型呢?

因为我们会搜集用户三个方面的数据来综合评定用户的价值等级,而这三项数据分别就是这里的RFM:

R(Recency)——最近一次购买的时间有多远

F(Frequency)——最近一段时间内的消费频率

M(Monetary)——最近一段时间内的消费金额

我们可以这样认为:最近一次消费时间越近的顾客是越有可能产生二次消费的群体,购买次数越多的用户是对我们产品越满意的客户,表示用户的忠诚度越高,消费金额越高的用户价值越大。

通过分析一个用户的近期购买行为(R)、购买的总体频率(F)以及消费总金额(M)三项指标,就可以描述出用户的价值状况。

我们可以将每个用户的R、F、M与均值比较,每个指标得到两个结果,大于等于或者小于,然后进行排列组合,就可以将用户划分为8个等级:重要价值用户、重要保持用户、重要唤回用户、重要深耕用户、重要挽留用户、潜力用户、新用户、一般维持用户、流失用户。

下面我们就来看一下淘宝数据的用户分类。

原数据中不包含用户的消费金额,所以我们只考虑用户的购买时间和购买次数。

首先计算出我们需要的数据:最近一次购买时间有多远和最近一段时间的消费频率。

代码练习:

编程区

  1. from datetime import datetime
  2. # 最近一次购买距离现在的天数
  3. recent_buy = data[data["用户行为类型"]==4].groupby("用户身份")["日期"].\
  4. apply(lambda x:datetime(2014,12,20) - x.sort_values().iloc[-1]).reset_index().\
  5. rename(columns={"日期":"最近消费时间距现在"})
  6. recent_buy["最近消费时间距现在"] = recent_buy["最近消费时间距现在"].apply(lambda x: x.days)
  7. recent_buy[:10]
  8. # 购买次数计算
  9. buy_freq = data[data["用户行为类型"]==4].groupby("用户身份")["日期"].count().reset_index().\
  10. rename(columns={"日期":"消费频率"})
  11. buy_freq[:10]

终端区

将这两列数据合并给用户打分,消费时间越近,消费金额越高,分数越高,也说明这个用户更有价值。

代码练习:

编程区

  1. # 将上述两列数据,合并起来
  2. rfm = pd.merge(recent_buy,buy_freq,on="用户身份")
  3. rfm[:10]
  4. # 给不同类型打分
  5. r_bins = [0,5,10,15,20,50]
  6. f_bins = [1,30,60,90,120,900]
  7. rfm["消费时间打分"] = pd.cut(rfm["最近消费时间距现在"],bins=r_bins,labels=[5,4,3,2,1],right=False)
  8. rfm["消费频率打分"] = pd.cut(rfm["消费频率"],bins=f_bins,labels=[1,2,3,4,5],right=False)
  9. for i in ["消费时间打分","消费频率打分"]:
  10. rfm[i] = rfm[i].astype(float)
  11. rfm.describe()

终端区

上面调用describe()函数我们得到消费时间和频率打分的平均值(第二行名称为mean的数据),然后把各分值与得到的均值做比较,高于均值标注‘高’,低于它则标注‘低’。综合时间和频率两项因素,最终得出综合值,以此判定用户的价值。

代码练习:

编程区

  1. # 比较各分值与各自均值的大小
  2. rfm["时间结果"] = np.where(rfm["消费时间打分"]>1.779783,"高","低")
  3. rfm["频率结果"] = np.where(rfm["消费频率打分"]>1.000401,"高","低")
  4. # 将r和f列的字符串合并起来
  5. rfm["综合值"] = rfm["时间结果"].str[:] + rfm["频率结果"].str[:]
  6. rfm.head()

终端区

根据打分结果,给用户贴上对应标签,计算出每个类型用户的数量,业务负责的同学们就可以根据标签来区别用户。

代码练习:

编程区

  1. # 自定义函数给用户贴标签
  2. def trans_labels(x):
  3. if x == "高高":
  4. return "重要价值用户"
  5. elif x == "低高":
  6. return "重要唤回用户"
  7. elif x == "高低":
  8. return "重要深耕用户"
  9. else:
  10. return "重要挽回用户"
  11. rfm["标签"] = rfm["综合值"].apply(trans_labels)
  12. # 计算出每个标签的用户数量
  13. rfm["标签"].value_counts()

终端区

可以看到,在这两周的用户群体中,有1480位是重要深耕用户,有1012位重要挽回用户,1位重要价值用户,负责业务的同学可以根据结果找到对应的用户,针对性的做一些运营手段。

到这里,我们的工作就基本结束了,掌声响起来!

哎低调低调,我只是一个平平无奇的数据分析小天才而已~

今天的淘宝数据分析就到此为止了,我们一起使用Python完成了流量指标分析、用户行为分析、漏斗流失分析和用户价值RFM分析。

其它淘宝用户的行为模式和你一样吗?如果还想继续深入研究,欢迎扫描下方二维码,添加班主任微信添,我和一群可爱的朋友们等着你,希望与你一起交流,一起进步。

扫描下方二维码,添加班主任微信

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

数据分析 1/3

剁手党的神奇之旅(下)

1.0x

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

行动力超过

累计学习

学习下一课时