淘宝用户行为分析
淘宝是中国深受欢迎的电商平台,经常网购的人少不了逛逛淘宝,随便看看有什么想买的或者有目的想买什么,在逛淘宝的过程中,我们会留下足迹。通过这些足迹,也就是用户的行为,我们可以对这些行为进行分析挖掘。
使用的工具是Python,主要用到了Pandas,Matplotlib,Seaborn和Pyeacharts这几个包。
数据来源于阿里云天池:https://tianchi.aliyun.com/dataset/dataDetail?dataId=46
1 提出问题
本文主要围绕这几个点展开:
- 每天的浏览量(PV)
- 每天的访客量(UV)
- 每天的人均访问量
- 用户行为的转化漏斗
- 从时间的维度分析用户行为
2 数据读取与数据探索
2.1 数据说明
数据集包含了2017年11月25日至2017年12月3日之间,有行为的约一百万随机用户的所有行为(行为包括点击、购买、加购、喜欢)。
数据主要包括5个字段,用户ID,商品ID,商品类目ID,行为类型,时间戳。一共有100,150,807条记录。
列名称 | 说明 |
---|---|
用户ID | 整数类型,序列化后的用户ID |
商品ID | 整数类型,序列化后的商品ID |
商品类目ID | 整数类型,序列化后的商品所属类目ID |
行为类型 | 字符串,枚举类型,包括('pv', 'buy', 'cart', 'fav') |
时间戳 | 行为发生的时间戳 |
2.2 数据读取
总共的数据有1亿左右,虽然pandas可以处理这么多的数据,但是电脑配置不够,所以这里只取了1千万条数据。使用pandas读取数据只需要几秒钟的时间,Excel大半天都打不开。
df = pd.read_csv('UserBehavior.csv', header=None, names=['用户ID', '商品ID', '商品类目ID', '行为类型', '时间戳'], nrows=10000000)
2.3 数据探索
查看数据信息
df.info()
1千万的数据大小有381.5M,要是全部数据大小差不多有4G
查看是否有缺失值
df.isnull().any()
没有缺失值,数据还是挺干净的。
查看数据的总体情况
df.describe()
时间戳最小值存在负值,这个是有问题,在数据清洗阶段,需要清洗。
查看前5行的数据
df.head(5)
3 数据清洗
由于数据还是比较干净,这里对时间进行处理就好了。
start_time = datetime.datetime(2017,11,25)
end_time = datetime.datetime(2017,12,4)
start_ts = time.mktime(start_time.timetuple())
end_ts = time.mktime(end_time.timetuple())
df = df[(int(start_ts) <= df['时间戳']) & (df['时间戳'] <= int(end_ts))]
数据在2017年11月25日至2017年12月3日之间,在这个区间之外的不要,负值自然也就排除掉了。
4 数据分析
4.1 每天的流量
df['时间'] = df['时间戳'].apply(lambda unix_ts: datetime.datetime.fromtimestamp(unix_ts))
df['日期'] = pd.to_datetime(df['时间'].apply(lambda unix_ts: unix_ts.strftime('%Y-%m-%d')))
s_flow = df[df['行为类型'] == 'pv'].groupby(['日期'])['行为类型'].count()
plt.figure(figsize=(10, 6))
plt.subplot(1, 1, 1)
plt.plot(s_flow)
plt.xlabel('日期', fontsize=16)
plt.ylabel('浏览量', fontsize=16)
plt.tick_params(labelsize=12)
plt.xticks(s_flow.index, rotation=30)
plt.gca().xaxis.set_major_formatter(mdates.DateFormatter('%Y/%m/%d'))
plt.grid(axis='x')
plt.title('每天浏览量折线图', fontsize=18)
plt.show()
![![
从图中可以看出,点击量在11月25日到12月1日这7天中,访问量在70000左右,12月2日和12月3日这两天浏览量显然高于其他几天,虽然这两天是星期六和星期日,但是不能直接判定是周末的原因,因为11月25日和11月26日这两天也是周末,浏览量只是略高,具体需要进一步分析。
4.2 每天的访客数
s_pv = df[df['行为类型'] == 'pv'].drop_duplicates(subset=['日期', '用户ID']).groupby(['日期'])['用户ID'].count()
plt.figure(figsize=(10, 6))
plt.subplot(1, 1, 1)
plt.plot(s_pv)
plt.xlabel('日期', fontsize=16)
plt.ylabel('访客数', fontsize=16)
plt.tick_params(labelsize=12)
plt.xticks(s_pv.index, rotation=30)
plt.yticks(range(0, 110000, 10000))
plt.gca().xaxis.set_major_formatter(mdates.DateFormatter('%Y/%m/%d'))
plt.grid(axis='x')
plt.title('每天访客数折线图', fontsize=18)
plt.show()
12月2日和12月3日的访客数高于前面一个星期,这两天访问量增加,可能是这两天有活动,带来的访问量。浏览量的增加不一定是访客数的增加,具体的情况还需要进一步进行分析。
4.3 人均浏览量
s_mpv = s_flow / s_pv
plt.figure(figsize=(10, 6))
plt.subplot(1, 1, 1)
plt.plot(s_mpv)
plt.xlabel('日期', fontsize=16)
plt.ylabel('平均流量', fontsize=16)
plt.tick_params(labelsize=12)
plt.xticks(s_mpv.index, rotation=30)
plt.yticks(range(0, 18, 2))
plt.gca().xaxis.set_major_formatter(mdates.DateFormatter('%Y/%m/%d'))
plt.grid(axis='x')
plt.title('每天人均浏览量折线图', fontsize=18)
plt.show()
每天的人均浏览量在13-14之间,一直都是在这个水平,所以可以确定,浏览量的增加就是新增的访问量带来的。
4.4 转化率
pv = df[df['行为类型'] == 'pv']['用户ID'].count()
cart = df[df['行为类型'] == 'cart']['用户ID'].count()
fav = df[df['行为类型'] == 'fav']['用户ID'].count()
buy = df[df['行为类型'] == 'buy']['用户ID'].count()
attr = ["购买:%.2f%%" % (buy / pv * 100), "收藏或加入购物车: %.2f%%" % ((fav+cart) / pv * 100),"点击量:100%"]
value = [18, 36, 54]
funnel = Funnel("转化率", width=600, height=400, title_pos='center')
funnel.add(
"商品",
attr,
value,
is_label_show=True,
label_pos="inside",
label_text_color="#fff",
is_legend_show = False
)
funnel
用户点击后收藏或加购物车的概率为9.51% ,而最后真正购买的只有 2.23%,购买转化率比较低,存在的增长空间。
4.5 从时间维度分析用户行为
4.5.1 一天中的用户行为
df['时间段'] = df['时间'].apply(lambda unix_ts: unix_ts.hour)
s_hour = df.groupby(['行为类型', '时间段'])['行为类型'].count()
plt.figure(figsize=(12, 8))
s_hour['pv'].plot(color='r', label='点击')
plt.legend(fontsize=16, loc='upper right')
plt.xticks(s_hour['pv'].index, ['0时','1时','2时','3时','4时','5时','6时','7时','8时','9时','10时','11时','12时','13时','14时','15时','16时','17时','18时','19时','20时','21时','22时','23时'], fontsize=12)
plt.yticks(range(100000, 1000000, 100000), fontsize=14)
plt.grid(b='False')
plt.xlabel('')
plt.twinx()
s_hour['fav'].plot(color='b', label='收藏')
s_hour['cart'].plot(color='k', label='加入购物车')
s_hour['buy'].plot(color='g', label='购买')
plt.xlabel('')
plt.xticks(s_hour['pv'].index, ['0时','1时','2时','3时','4时','5时','6时','7时','8时','9时','10时','11时','12时','13时','14时','15时','16时','17时','18时','19时','20时','21时','22时','23时'], fontsize=12)
plt.yticks(range(10000, 110000, 10000), fontsize=14)
plt.grid(b='False')
plt.legend(fontsize=16, loc='upper left')
plt.title('一天中用户行为分布折线图', fontsize=18)
4种行为的趋势都是一样的,主要用户活跃主要集中在10-23点,在19-23这5个小时达到顶峰,有活动可以集中在这个时间段,这个时间段用户活跃度是最高的。凌晨的那段时间大部分人处于睡眠状态,活跃度低是意料之中的。
4.5.2 一周中的用户行为
df['星期'] = df['时间'].apply(lambda unix_ts: unix_ts.weekday())
s_weekday = df['2017-11-27' <= df['时间']].groupby(['行为类型', '星期'])['行为类型'].count()
plt.figure(figsize=(12, 8))
s_weekday['pv'].plot(color='r', label='点击')
plt.legend(fontsize=16, loc='upper right')
plt.xticks(s_weekday['pv'].index, ['星期一', '星期二', '星期三', '星期四', '星期五', '星期六', '星期日'], fontsize=16)
plt.yticks(range(900000, 1400000, 100000), fontsize=14)
plt.grid(b='False')
plt.xlabel('')
plt.twinx()
s_weekday['fav'].plot(color='b', label='收藏')
s_weekday['cart'].plot(color='k', label='加入购物车')
s_weekday['buy'].plot(color='g', label='购买')
plt.xlabel('')
plt.xticks(s_weekday['pv'].index, ['星期一', '星期二', '星期三', '星期四', '星期五', '星期六', '星期日'], fontsize=16)
plt.yticks(range(20000, 110000, 10000), fontsize=14)
plt.grid(b='False')
plt.legend(fontsize=16, loc='upper left')
plt.title('一周中用户行为分布折线图', fontsize=18)
数据中一共9天,除去两天,剩下是一个完整的星期。我们从图中可以看出,星期六和星期日这两天活跃度明显增高,那么是不是可以就可以得出结论:周末休息,使用淘宝的人数增加。合情合理,周末人们都有时间,但是前面在每天的浏览量分析那里,我们知道了前面两天也是周末,但是浏览量跟后面5个工作日差距不大。并不能得出周末用户活跃度大这个结果,在这个数据集中看不出来。
结论
- 2017-12-02和2017-12-03浏览量骤然上升,对比上一个周末,新增的访问量是明显,说明这两天的活动是有效果的。
- 最终的转化率只有2.23%,用户点击后收藏或加购物车的转化率在9.51% ,可用通过活动进一步促进用户的购买。
- 从时间看,用户主要活跃在白天的时间和晚上,从10点-23点,顶峰是在19点-23点。但是周末活跃度高,并不能得出结论是周末的原因。