目录
前言
一、数据集的来源和各个字段的意义
二、数据分析
1.引入库
2.读入数据
3.查看数据数量级
4.PV(Page View)/UV访问量
5.漏斗模型
6.用户购买商品的频次分析。
7.ARPPU(average revenue per paying user)
计算 ARPPU
ARPPU出图
8.复购情况分析
计算用户购买频次
复购周期分析
总结
本人代码萌新一枚,目前还在学习python中,这篇文章是我本人对天池大数据竞赛上的学习赛上官方对数据分析后的自己的一些见解,参考的位置我会放在文章的最后。第一次在CSDN写文章,有错误还希望大家可以指正,我都会积极改正。
例如:随着人工智能的不断发展,机器学习这门技术也越来越重要,很多人都开启了学习机器学习,本文就介绍了机器学习的基础内容。
《淘宝用户购物行为数据》提供了1万用户量级的完整行为数据,数据包含了抽样出来的1W用户在一个月时间(11.18~12.18)之内的移动端行为数据:user_action.csv(这是数据集原地址),为了简化问题相比原数据集,我们去掉了user_geohash这个大部分情况为空的字段。
字段 | 字段说明 | 提取说明 |
---|---|---|
user_id | 用户标识 | 抽样和字段脱敏 |
item_id | 商品标识 | 字段脱敏 |
behavior_type | 用户对商品的行为类型 | 包括浏览、收藏、加购物车、购买,对应取值分别是1、2、3、4 |
item_category | 商品分类标识 | 字段脱敏 |
time | 行为时间 | 精确到小时级别 |
利用该数据集可以分析淘宝用户的购物行为和浏览行为,可以让商家更清楚的知道如何最大化将自己的产品变现,如何发放消费卷和优惠卷来吸引消费者购买商品。
import pandas as pd
import numpy as np
import matplotlib.pyplot as plt
data_user = pd.read_csv('./tianchi_mobile_recommend_train_user.csv')
# 读取用户数据集,路径需要自行调整。
data_uesr.head(20) # 包含前言所有的字段
# 查看数据集量级
print('整体数据的大小为',len(data_user))
print('数据集中用户数量是:',len(set(data_user['user_id'])))
print('数据集中商品数量是:',len(set(data_user['item_id'])))
print('数据集中商品类别数量是:',len(set(data_user['item_category'])))
整体数据的大小为 12256906
数据集中用户数量是: 10000
数据集中商品数量是: 2876947
数据集中商品类别数量是: 8916
# 分割天(date)和小时(hour)
data_user['data'] = data_user['time'].map(lambda x:x.split(' ')[0])
data_user['hour'] = data_user['time'].map(lambda x:x.split(' ')[1])
data_user.head(20)
data_user.dtypes # 查看各个字段数据类型
user_id 用户标识 item_id 商品标识 behavior_type 用户对商品的行为类型 item_category 商品分类标识 time 行为时间 data 精确到一年中的那一天的时间 hour 小时
# 对数据进行类型调整成合适的类型,如:data字段是时间,则需要变成datetime类型
data_user['user_id'] = data_user['user_id'].astype('object') # 改变字段数据类型
data_user['item_id'] = data_user['item_id'].astype('object')
data_user['item_category'] = data_user['item_category'].astype('object')
data_user['time'] = data_user['time'].astype('object')
data_user['data'] = pd.to_datetime(data_user['data'])
data_user['hour'] = data_user['hour'].astype('int64')
data_user.dtypes
计算PV: PageView , UV: UniqueView
PV: 按“日期”从data_user组中选择并计算’user_id‘(用户)的数量
UV: 按“日期”从data_user组中选择并计算不同的’user_id‘(用户);
# 计算PV: PageView , UV: UniqueView
# PV: 按“日期”从data_user组中选择并计算’user_id‘(用户)的数量
# UV: 按“日期”从data_user组中选择并计算不同的’user_id‘(用户);
# PV(Page View)访问量
# 探究每一天中,用户对所有商品的总访问量
pv_daily = data_user.groupby('data')['user_id'].count()
pv_daily = pv_daily.reset_index() # 添加下标
pv_daily = pv_daily.rename(columns={'user_id':'pv_daily'})
# 将名字user_id 改为 PV_daily
# PV_daily.head()
pv_daily
PV访问量就是不管用户数量(假如一个用户访问了10000次,pv值就会增加10000)
UV访问量就是只会计算用户数量(假如一个用户访问了10000次,uv值只会+1)
# 探究每一天中,用户对所有商品的访问量,但是这个访问量,一个用户访问多次淘宝也只会记录一次访问
# 可以理解为这一天有这么多用户访问了淘宝
uv_daily = data_user.groupby('data')['user_id'].apply(lambda x:len(x.unique()))
# apply函数 apply(func [, args [, kwargs ]]) 函数用于当函数参数已经存在于一个元组或字典中时,间接地调用函数。args是一个包含将要提供给函数的按位置传递的参数的元组。如果省略了args,任何参数都不会被传递,kwargs是一个包含关键字参数的字典
# unique函数 去重函数,类似于set的用法,如果出现一样的字段,就不会占用空间
uv_daily = uv_daily.reset_index()
uv_daily = uv_daily.rename(columns={'user_id':'uv_daily'})
uv_daily
# 可视化
none,axes = plt.subplots(2,1,sharex=True) #sharex 共享X轴 两张图的X轴是相同的
# 后续画图操作不能使用fig,只能使用axes(接受的第二个参数) fig函数的下标是不可使用的
# pv_daily: pandas 对象
# Matplotlib, Pandas , histplot: 柱状图
pv_daily.plot(x='data', y='pv_daily', ax=axes[0], colormap='cividis')
# ax 划分子图 axes[表示子图的位置]
# colormap 色度图 可以生成伪彩色图像 可以应用到灰度图像 画图时可以不添加这个关键词
uv_daily.plot(x='data', y='uv_daily', ax=axes[1], colormap='RdGy')
axes[0].set_title('pv_daily')
axes[1].set_title('uv_daily')
# 从图中可以看出UV值和PV值都在12日达到了峰值,其原因可能是因为12.12双十二大促销的原因,导致消费集中的情况。
# 看一下基于每一个小时对应的访问量和去重访问量(用户数)
pv_hour = data_user.groupby('hour')['user_id'].count()
pv_hour = pv_hour.reset_index()
pv_hour = pv_hour.rename(columns={'user_id':'pv_hour'})
pv_hour
# 看一下基于每个小时对应有多少用户访问了淘宝
uv_hour = data_user.groupby('hour')['user_id'].apply(lambda x:len(x.unique()))
uv_hour = uv_hour.reset_index()
uv_hour = uv_hour.rename(columns={'user_id':'uv_hour'})
uv_hour
none,pic2 = plt.subplots(2,1,sharex=True) # sharex = True 让画布上的两个图共用一个X轴 第一个写none的原因是因为我没有发现第一个参数有什么实际上的作用,所以就用none
pv_hour.plot(x='hour',y='pv_hour',ax=pic2[0])
uv_hour.plot(x='hour',y='uv_hour',ax=pic2[1])
pic2[0].set_title('pv_hour')
pic2[0].set_title('uv_hour')
sharex = True 让画布上的两个图共用一个X轴 第一个写none的原因是因为我没有发现第一个参数有什么实际上的作用,所以就用none
图中看出,PV值(小时总访问量)在20点的时候达到峰值。出现这一现象的原因大概是大部分人都是打工人,大部分人在20点左右会下班浏览淘宝。而UV值(小时用户量)在10点的时候达到峰值,稍后数据趋于平稳,可能的原因是前面的时间点大家都在睡觉和休息,起床后会打开手机稍加浏览淘宝,关心一下商品有没有打折信息。在0点往后到5点这个时间段,UV和PV的值都普遍呈下降趋势,是一天之中最小的流量时间段。
# 因为双十二12.12的节日促销UV和PV值双双达到峰值,那可以看一看在双十二当天的小时段变化
data_user_1212 = data_user[data_user['data']=='2014-12-12']
data_user_1212.dtypes
# 计算每小时的PV
pv_hour_1212 = data_user_1212.groupby('hour')['user_id'].count()
pv_hour_1212 = pv_hour_1212.reset_index()
pv_hour_1212 = pv_hour_1212.rename(columns={'user_id':'pv_hour_1212'})
pv_hour_1212
# 计算每小时的UV
uv_hour_1212= data_user_1212.groupby('hour')['user_id'].apply(lambda x:len(x.unique()))
uv_hour_1212 = uv_hour_1212.reset_index()
uv_hour_1212 = uv_hour_1212.rename(columns={'user_id':'uv_hour_1212'})
uv_hour_1212
none,pv_1212 = plt.subplots(2,1,sharex=True)
pv_hour_1212.plot(x='hour',y='pv_hour_1212',ax=pv_1212[0],c='gray')
pv_hour.plot(x='hour',y='pv_hour',ax=pv_1212[1],c='green')
pv_1212[0].set_title('pv_hour_1212')
pv_1212[1].set_title('pv_hour')
# 双十二PV值和平常的PV相比大体上都差不太多,就是双十二期间的拐点较多,没有平常的数据平滑。其原因可能是双十二当天有商家会有优惠卷赠送活动,导致用户的访问量激增,但是总体上访问量集中在晚上的20点前后。
none,uv_1212 = plt.subplots(2,1,sharex=True)
uv_hour.plot(x='hour',y='uv_hour',ax=uv_1212[0],c='yellow')
uv_hour_1212.plot(x='hour',y='uv_hour_1212',ax=uv_1212[1],c='blue')
uv_1212[0].set_title('uv_hour')
uv_1212[1].set_title('uv_hour_1212')
# 从这个对比图可以看出 进一个月的PV值(用户总访问量)和双十二趋势大体相同,只不过双十二当天的曲线不够平滑,有很多用户激增和骤降的拐点。但是最为明显的还是20点,用户PV值突然上升,可能的原因的是20点这个时间段是许多商家开始双十二秒杀安排的时间点
# 根据behavior_type 用户对商品的行为类型 和hour 小时 进行分组。查看在每个小时段之内,进行点击、收藏、加购物车、支付四种行为的次数
# behavior_type中 点击、收藏、加购物车、支付四种行为,分别用数字1、2、3、4表示
pv_behavior = data_user.groupby(['behavior_type','hour'])['user_id'].count()
pv_behavior = pv_behavior.reset_index()
pv_behavior = pv_behavior.rename(columns={'user_id':'pv_behavior'})
pv_behavior
# 根据上面得出来点击、收藏、加购物车、支付四种行为关于每个小时的数据,画出可视图
import seaborn as sns
sns.lineplot(x='hour',y='pv_behavior',hue='behavior_type',data=pv_behavior)
# 但是出图后发现用户对点击的数量已经超过后三者,导致其他三项数据没有很直观的表现出来,所以把点击量去除,看剩下三项指标的变化
sns.lineplot(x='hour',y='pv_behavior',hue='behavior_type',data=pv_behavior[pv_behavior.behavior_type!=1])
#出图后可以看出四条曲线的总体变化基本一致,平常都是在20点前后出现最高峰,在3点左右各个数据到达最低值,由此可以看出,晚上20点这个时间段用户的无论是收藏,加购物车,支付的数量都明显增加,可能是因为20点商家也会发优惠劵来吸引用户购买商品
双十二当天用户肯定较多,所有对双十二当天的用户对淘宝的各个行为数量的PV值进行统计。
pv_behavior_1212 = data_user_1212.groupby(['behavior_type','hour'])['user_id'].count()
pv_behavior_1212 = pv_behavior_1212.reset_index()
pv_behavior_1212 = pv_behavior_1212.rename(columns={'user_id':'pv_behavior_1212'})
pv_behavior_1212
sns.lineplot(x='hour',y='pv_behavior_1212',hue='behavior_type',data=pv_behavior_1212)
sns.lineplot(x='hour',y='pv_behavior_1212',hue='behavior_type',data=pv_behavior_1212[pv_behavior_1212.behavior_type!=1])
# 除去点击量的可视图可以很明显的感受到和平常的淘宝的购物视图有些许不同。
# 1.大约在17点之前,三条曲线的分布是 收藏 < 支付 < 加购物车。而除开双十二的平常数据中却发现三条曲线是 支付 < 收藏 < 加购物车。双十二当天居然用户的支付数量超过了收藏数,这一数据的突变的原因可能是双十二有力度非常大的打折促销活动和秒杀活动,其很多商品价格要比平常便宜很多,并且很多双十二的商品都是限时抢购,许多用户顾不上收藏,只会先加入到购物车,来方便在限时的时间里买下更多的打折商品。但是支付的数量却没有高于20点之后的数量,可能是因为许多打工人还没有到下班的时间,其次,商家也是在为晚上的双十二的大活动做提前预热。
# 2.在17点到20点期间 支付 < 收藏。其原因可能是在进行一波双十二活动预热之后,许多用户开始进入淘宝浏览自己喜欢的商品,因为还未到商家的整点促销,所以大部分用户是先看好喜爱的商品,并且先加入到购物车和收藏,等到了晚上整点促销活动开始之后再进行消费。
# 3.到了20点之后,数据再一次呈现 支付 < 收藏的情况。此时可能淘宝里的各个商家已经开始大促销的活动了,这时的用户大多都集中在将自己的喜欢的商品进行抢购,从而导致支付量大幅上升的情况。
# 对转换率进行分析“浏览-收藏/加购-购买”链路的转化漏斗模型,可以帮助我们更好的了解各个环节的转化链路
behavior_type = data_user.groupby(['behavior_type'])['user_id'].count()
behavior_type
clike_num,collect_num,add_num,pay_num = behavior_type[1],behavior_type[2],behavior_type[3],behavior_type[4]
# 因为加购和收藏没有必然联系,因此我们把这两类合并在一起做分析
col_add_num = collect_num + add_num
print('浏览转化为加购/收藏的转化率:',col_add_num/clike_num*100)
print('浏览转化为购买的转化率:',pay_num/clike_num*100)
print('加购/收藏转化为购买的转化率:',pay_num/col_add_num*100)
# 浏览转化率相对于加购或收藏后够买该商品的转化率要低的很多,所以顾客更多还是对自己喜欢的商品进行购买,而不是心血来潮。
# 在查看双十二当天,各个数值之间的转化率有什么变化?
behavior_type_1212 = data_user_1212.groupby(['behavior_type'])['user_id'].count()
behavior_type_1212
clike_1212_num,collect_1212_num,add_1212_num,pay_1212_num = behavior_type_1212[1],behavior_type_1212[2],behavior_type_1212[3],behavior_type_1212[4]
col_add_1212_num = collect_1212_num + add_1212_num
print('浏览转化为加购/收藏的转化率:',col_add_1212_num/clike_1212_num*100)
print('浏览转化为购买的转化率:',pay_1212_num/clike_1212_num*100)
print('加购/收藏转化为购买的转化率:',pay_1212_num/col_add_1212_num*100)
# 双十二期间 加购/收藏转化为购买的转化率是平常的两倍,可以看出大促销对用户的购买力起到了关键性的促进作用。
# 因此,做为商家来说,利用特定的节日做促销活动是一种非常好的营销手段。
虽然说,用户的点击量和浏览量远远超过收藏,加购和支付,但是商家更看重的是用户是否在店铺消费,因此,令人关心的问题是:用户的购买频次大概分布在什么阶段。
data_user_buy = data_user[data_user.behavior_type == 4].groupby('user_id')['behavior_type'].count()
data_user_buy
data_user_buy.plot(x='user_id',y='behavior_type')
图中可以看出大部分用户的购买数量都在50以下。除开双十二高峰购物的时段,还是有用户购买次数超过200次,更有甚者购买次数达到了800次,购买次数200次以上的都可以被商家称作重点客户。
ARPU(Average Revenue Per User) 表示每日的收益在所有活跃用户中的转化。详细的描述为,每日的所有收益与每日的活跃的用户数量有关,因此可以通过ARPU来计算,每日活跃用户对每日收益的转化效率。
该数据集中没有对金额的体现。那我们可以对ARPU这个指标做一些修改,改为度量平台活跃用户每日平均消费次数。
计算公式为: ARPU = 每日消费总次数 / 每日活跃用户数
给数据集中每一个用户赋值一个1,表示有登录操作
data_user['action'] = 1
# 得到 date, user_id, behavior_type和计算用户每日的登录次数
data_user_arpu = data_user.groupby(['data','user_id','behavior_type'])['action'].count()
data_user_arpu = data_user_arpu.reset_index()
data_user_arpu.head(20)
ARPU = 每日消费总次数 / 每日活跃用户数
ARPU = data_user_arpu.groupby('data').apply(lambda x:x[x['behavior_type']==4]['action'].sum()/len(x['user_id'].unique()))
ARPU
ARPU.plot()
plt.title('ARTU')
ARPU 出图后可以看到,活跃用户每天平均消费次数在0.5次左右,双十二期间达到最高值接近2,是平时的4倍左右,表明用户在双十二的时候会集中购买自己的商品。(ARPU的公式:ARPU = 每日消费总次数 / 每日活跃用户数)
ARPPU(average revenue per paying user)是指从每位付费用户中获得的收益,它反映的是整个平台的用户消费的均值。
它的计算方式为:ARPPU = 总收入/活跃用户付费数量。但是在该数据集中没有收益金额,因此我们可以对计算方式做一点转化,将总收入转化为总的购买行为次数。
定义如下:ARPPU = 当日总消费次数/当日活跃用户付费数量 , 可以看出和ARPU唯一的区别是分母,ARPU的分母是活跃用户数(包含4种行为类型),ARPPU的坟墓是活跃付费用户数,因此ARPPU的计算会更简单:
对比一下ARPU和ARPPU的关系
ARPU = 每日消费总次数 / 每日活跃用户数
ARPPU = 当日总消费次数/当日活跃用户付费数量
data_user_arppu = data_user[data_user.behavior_type==4].groupby(['data','user_id'])['behavior_type'].count()
data_user_arppu = data_user_arppu.reset_index().rename(columns={'behavior_type':'buy_count'})
data_user_arppu.head(100)
data_user_arppu = data_user_arppu.groupby('data').apply(lambda x:x['buy_count'].sum() / x['user_id'].count())
data_user_arppu
data_user_arppu.plot()
plt.title('ARPPU')
ARPPU 图中可以看出在整个12月份整体的值都维持在2-3之间,只是在双十二期间ARPPU的值直线飙升,一度达到4.0,是平常的两倍。让我再回顾一下ARPPU的公式:ARPPU = 当日总消费次数/当日活跃用户付费数量。说明ARPPU说的值越大,它的分子就越大,而分子是当日消费的次数,说明,双十二这天用户的消费次数是大大超过平常,其原因可能是大家都会把商品先放到购物车或者收藏,到了双十二当天再进行大量的消费。
其次,我对上述中活跃用户的定义是:只要在这个月有在淘宝消费并且购买过商品的用户都算活跃用户,如果这个月用户仅仅是干了除了支付以外的事情,那就不计入在内(毕竟人嘛,都是想到金子流入自己的口袋。。)
一般来说,复购是指对产品的重复购买行为。但是这个定义在商业上是不精确的,假若一个用户在一天内多次在淘宝购买商品,不能说明这件用户对淘宝的依赖(有可能是某位用户只是第一次用,但是买的量大)。因此商业分析过程中,对于复购行为进行明确的定义。这里的复购是指:两天以上都在该平台产生了购买行为,需要指出一天多次的购买不算是复购。
因此复购率的计算方式为:复购率 = 复购用户数量 / 有购买行为的用户数量。基于这个公式,我们先计算用户在数据集中的购买频次:
我对这句话的理解就是:复购就是我在这家店(注意是这家店)买过这个商品,我觉得不错,我还想再次进行购买,这就是我理解的复购行为。但是这其中有一个特例,就是我不知道抽了什么风,或者说我非常喜欢这个商品,我一下子买了200个,虽然说买的数量相对于普通人来说非常大,但是我没有进行二次购买的行为,这就不算复购。所以,商业上对“复购”这个次重新做了定义,两天以上都是在这家店购买了商品,并且不是一天购买多次,这就是复购(可能有点晕,我也好不到哪里去。。)
data_user_pay = data_user[data_user.behavior_type == 4]
data_user_pay = data_user_pay.groupby('user_id')['data'].apply(lambda x:len(x.unique()))
data_user_pay
# 复购率 = 复购用户数量 / 有购买行为的用户数量
replace_pay = data_user_pay[data_user_pay > 1].count() / data_user_pay.count()
replace_pay
想要知道用户多久复购一次。这个数据有助于淘宝产品宣传在这个时间间隔内采取策略(例如复购期间发放优惠卷。),增加用户的复购意向,最终转化为实际收益。
data_user['action'] = 1 # 对每一行的行为记为1次,通过对行为次数的相加,从而计算频次
data_user_buy = data_user[data_user.behavior_type == 4]
data_user_buy = data_user_buy.groupby(['user_id','data'])['action'].count()
data_user_buy = data_user_buy.reset_index()
data_user_buy.head(30)
data_user_pay.value_counts().plot(kind='line')
plt.xlabel('replace_day')
plt.ylabel('count')
以上就是淘宝用户分析的内容,本文多次使用到了numpy,pandas,matplotlib.pyplot这些数据库,因为双十二是电商的购物节(比较特殊),所以将双十二期间的用户对淘宝的使用情况逐一作出了分析,然后相对比平常的用户购买情况,从商家的利益出发,是否应该多进行促销策略。