淘宝用户行为数据分析

  • 背景
  • 分析目标
  • 数据清洗
    • 数据读取
    • 数据预处理
  • 数据分析
    • 总体了解
    • 每日行为数据统计
    • 转化率
    • 用户行为时间分布
    • RFM用户价值模型
  • 结论

背景

从阿里天池中获取淘宝用户行为数据UserBehavior.csv.zip,数据集下载解压后约9个G。以下是数据的5个特征,其中行为id包括浏览、加购、收藏、购买(pv、cart、fav、buy)

用户id 商品id 类目id 行为id 时间戳
user_id item_id cate_id act_id time

数据集约7千万条数据,选取了10万条数据进行了处理与分析。主要使用pandasmatplotlib

分析目标

通过探索淘宝用户行为,发现可提升的部分,优化营销策略,最终提升GMV。

  • 用户行为分析(pv、uv、cart、buy、dnu、复购率)
  • 漏斗模型的各环节转化率(pv-cart&fav-buy)
  • RFM用户价值模型(最近购买时间、购买次数)
  • TOP商品分析(购买最多,点击最多等)

数据清洗

数据读取

导入numpy、pandas、matplotlib库

import numpy as np
import pandas as pd
import matplotlib.pyplot as plt
%matplotlib inline

数据地址、列名称准备

# 本地数据地址
path = '/Users/valkyrja/Documents/dataanalysis/taobao.csv'
# 准备列名称
col_na = ['user_id', 'item_id', 'cate_id', 'act_id', 'time']
data = pd.read_csv(path, header = None, names = col_na, encoding = 'utf8')
# 取前10万行数据
data = data.iloc[0:100000, :]
# 概览数据
data.info()


索引:0-99999,共10万行数据。
列数:共6列
空值:没有空值
类型:time为字符串类型,需要调整为datetime类型

数据预处理

# 调整时间戳格式
data['time'] = pd.to_datetime(data['time'], unit = 's')
# 查看是否有重复行,因为无空值所以不进行空值的查看
data.duplicated().sum()
data.duplicated().value_counts()
# 两种方法都可以,结果没有重复行,无须去重操作

# 新增日期、星期、小时列
data['date'] = pd.to_datetime(data['time'].dt.date)
data['week'] = data['time'].dt.dayofweek
data['hour'] = data['time'].dt.hour
# 概览处理后的数据
data.info()


时间、日期、星期、小时已经完成了调整。

数据分析

总体了解

days = data['date'].max() - data['date'].min()
print('数据横跨{}'.format(days))
print('起始日期{}'.format(data['date'].min()))
print('终止日期{}'.format(data['date'].max()))


大致为84天的数据,随着分析我发现这里其实是有问题的,往后看就知道了。

# 观察在这期间共有多少个用户、多少种商品、多少类目
user_item_cate = ['user_id', 'item_id', 'cate_id']
for i in user_item_cate:r = data[i].nunique()print('去重后共{} {}'.format(r, i))


总体观察:共983个用户,64467种商品,3128个商品类目。

# 对用户行为进行分类统计数量
p_c_f_b = data['act_id'].value_counts()
print(p_c_f_b)
# 简单作图观察
plt.bar(p_c_f_b.index, p_c_f_b.values, color = 'c')
for a,b in zip(p_c_f_b.index, p_c_f_b.values):plt.text(a,b+0.1,'%.0f'%b,ha = 'center',va = 'bottom',fontsize=18)

每日行为数据统计

# 查看每日的pv
daily_data = data[data['act_id'] == 'pv'].groupby(by = ['date'], as_index = False).agg({'act_id':'count'}).rename(columns = {'act_id':'pv'})


这时发现了奇怪的数据,前5天的pv是个位数,可能是最开始分数据的时候没有分全。那么其他行为的数据可能更低了。

fav = data[data['act_id'] == 'fav'].groupby(by = ['date'], as_index = False).agg({'act_id':'count'}).rename({'act_id':'fav'})
cart = data[data['act_id'] == 'cart'].groupby(by = ['date'], as_index = False).agg({'act_id':'count'}).rename({'act_id':'cart'})
buy = data[data['act_id'] == 'buy'].groupby(by = ['date'], as_index = False).agg({'act_id':'count'}).rename({'act_id':'buy'})

观察了数据,判断11月24日之前为缺失数据,按丢弃处理,因为数据量很少,不影响大范围的分析。

# 重新定义初始数据,获取 pv大于10的数据
data = data[data['date'] >= '2017-11-24']
daily_data = daily_data[daily_data['pv'] > 10]
# 重置索引
daily_data.reset_index(drop = True, inplace = True)
daily_data['fav'] = fav['act_id']
daily_data['cart'] = cart['act_id']
daily_data['buy'] = buy['act_id']


目前为止,共10天连续的数据,11月24日-12月03日。

# 获取每日的uv量,先按日期、用户去重,再按日期分组统计uv量
uv = data.drop_duplicates(subset = ['date', 'user_id']).groupby(by = ['date'], as_index = False).agg({'user_id':'count'})
daily_data['uv'] = uv['user_id']
# 为数据增添星期辅助列 0-6:Mon-Sun, 加1后就变为1-7:Mon-Sun
daily_data['week'] = daily_data['date'].dt.dayofweek + 1
# 每日购买用户量、付费比例、人均购买量、付费人均购买量、活跃用户、日新增用户
daily_data['buyer'] = data[data['act_id'] == 'buy'].drop_duplicates(subset = ['date', 'user_id']).groupby(by = ['date'], as_index = False).agg({'user_id':'count'})['user_id']
daily_data['buy_rate'] = round(daily_data['buyer'] / daily_data['uv'], 2)
daily_data['arppu'] = round(daily_data['buy'] / daily_data['buyer'], 2)
daily_data['dnu'] = data.groupby(by = ['user_id'], as_index = False).agg({'date':'min'}).groupby(by = ['date'], as_index = False).agg({'user_id':'count'})
# 获取活跃用户数量,每天行为动作数量大于等于3即为活跃标志
dau = data.groupby(by = ['date', 'user_id'], as_index = False).agg({'act_id':'count'})
daily_data['dau'] = dau[dau['act_id'] >= 3].groupby(by = ['date'], as_index = False).agg({'user_id':'count'})['user_id']

跳出率 = 仅有pv行为用户数量 / 总uv
复购率 = 2次以上购买行为用户总量 / 总buyer

# 跳出率和复购率
only_pv = data['user_id'].nunique() - data[data['act_id'].isin(['cart', 'fav', 'buy'])]['user_id'].nunique()
jump_rate = round(only_pv / data['user_id'].nunique(), 2)
re_buy = data[data['act_id'] == 'buy'].groupby(by = ['user_id'], as_index = False).agg({'act_id':'count'})
re_buy_2 = round(re_buy[re_buy['act_id'] >= 2].count()['user_id'] / data[data['act_id'] == 'buy']['user_id'].nunique(), 2)
# 跳出率为7%,复购率为66%

两个数据需要结合同比数据或环比数据分析,而且需要对比业内的水平。
就淘宝来说,66%的复购率还是需要进行提高的,朝着75%以上的水平。
跳出率需要专门分析用户跳出的时间,以及浏览程度,是否详情页的文案内容不到位,没有突出产品的特点,浏览流畅度等,后期可进行专门的用户调研或ABtest。

现在得到的就是一个比较全面的日常数据大表

# 观察uv、dau、buyer的趋势图
for i in ['uv', 'dau', 'buyer']:plt.plot(daily_data['date'], daily_data[i], label = i, linewidth = 1)
plt.xticks(rotation=60)
plt.legend()

转化率

此处转化率可分为2条路径,浏览-收藏-购买、浏览-加购-购买。

pv_data = data[data['act_id'] == 'pv']
fav_data = data[data['act_id'] == 'fav']
cart_data = data[data['act_id'] == 'cart']
buy_data = data[data['act_id'] == 'buy']
# 获取浏览-收藏和收藏-购买的数据
pv_fav = pd.merge(pv_data, fav_data, on = ['user_id', 'item_id', 'cate_id'], suffixes = ('_pv', '_fav'))
fav_buy = pd.merge(fav_data, buy_data, on = ['user_id', 'item_id', 'cate_id'],suffixes = ('_fav', '_buy'))
count_pv_fav = pv_fav[pv_fav['time_pv'] > pv_fav['time_fav']]['user_id'].nunique()
count_fav_buy = fav_buy[fav_buy['time_fav'] > fav_buy['time_buy']]['user_id'].nunique()
# 获取浏览-加购和加购-购买的数据
pv_cart = pd.merge(pv_data, cart_data, on = ['user_id', 'item_id', 'cate_id'], suffixes = ('_pv', '_cart'))
cart_buy = pd.merge(cart_data, buy_data, on = ['user_id', 'item_id', 'cate_id'],suffixes = ('_cart', '_buy'))
count_pv_cart = pv_cart[pv_cart['time_pv'] > pv_cart['time_cart']]['user_id'].nunique()
count_cart_buy = cart_buy[cart_buy['time_cart'] > cart_buy['time_buy']]['user_id'].nunique()
pv_fav_cart = round((count_pv_fav + count_pv_cart) / pv_data['user_id'].nunique(), 2)
cart_fav_buy = round((count_fav_buy + count_cart_buy) / pv_data['user_id'].nunique(), 2)
print('浏览用户量:', pv_data['user_id'].nunique())
print('收藏-加购量:', count_pv_fav + count_pv_cart)
print('购买量:',count_fav_buy + count_cart_buy)
print('浏览-收藏&加购转化率:', pv_fav_cart * 100, '%', '收藏&加购-购买转化率:',cart_fav_buy * 100, '%')



pv到cart&fav的转化率达81%,但是购买的转化率仅为3%,由于没有环比数据进行参考无法评估高低。但购买率有机会继续提升。
提升购买转化率,需要从用户浏览详情页-订单页-付款页面的行为进行分析,app流畅的是否满足用户,付款渠道足够支持,产品优点足够突出。
例如:用户浏览详情页后,是否与客服进行了沟通,主要沟通的问题是否未在详情页说明,运费险等。
将FAQ放在详情页是否有助于用户了解产品,有助于下单。

用户行为时间分布

这里从每天的时间纬度上观察一下用户的行为变化,用户在哪个时间段发生购买行为最集中。

for i in ['fav', 'cart', 'buy']:r = data[data['act_id'] == i].groupby(by = ['hour'], as_index = False).agg({'act_id':'count'})plt.plot(r['hour'], r['act_id'], label = i)plt.xticks(range(1, 25, 1))plt.legend()

用户在10:00-14:00时间段收藏与加购次数是最大的,但购买却没有大幅度的变化,在这个时间段能否推一些满减折扣的活动,或增加一些push,增加这段时间的购买行为。当然这也需要进行用户调研与AB测试。
此外在21点后,购买行为有一定幅度提升,那么营销活动也需要从这里下手。

一周中用户行为的分布情况

for i in ['fav', 'cart', 'buy']:r = data[data['act_id'] == i].groupby(by = ['week'], as_index = False).agg({'act_id':'count'})plt.plot(r['week'], r['act_id'], label = i)plt.legend()


周四用户加购行为极速攀升,这是购买前的提示。周五的购买行为开始提升,表明更多的用户是在周五购买,周中可能是在挑选商品。
所以周四、周五是运营的一个重要时间节点,要充分把握。
需要优化的是,如何将周五的购买时间节点进行前提,让用户在加购后就下单购买,是否突出今日下单,周末即可使用的文案信息。

RFM用户价值模型

RFM用户价值模型主要从用户最近一次的购买行为、历史购买次数、消费总金额3个纬度进行分析,共8个分析结果。本次数据仅对最近一次购买时间、购买次数进行分析,4个分析结果。
一般来说,最近一次购买时间越近,那么用户可能越忠实。购买次数越多,那么用户可能越活跃。购买金额在一定程度上代表用户的价值。

RFM = data[data['act_id'] == 'buy'].groupby(by = ['user_id'], as_index = False).agg({'act_id':'count', 'date':'min'})
RFM['R'] = (pd.to_datetime('2017-12-03') - RFM['date']).dt.days
RFM.rename(columns = {'act_id':'F'}, inplace = True)
RFM.drop(columns = ['date'], inplace = True)


最近一次购买距离12月03日为0天,最远为9天。
购买最少为1次,最多为49次。

R_score F_score
0-1得4分 1得1分
2-3得3分 2得2分
4-6得2分 3得3分
7-9得1分 大于4得4分
# 购买次数评分
def F_score(f):if f == 1:return 1elif f == 2:return 2elif f == 3:return 3else:return 4# 最近一次购买得分
def R_score(r):if r <= 1:return 4elif r <= 3:return 3elif r <= 6:return 2else:return 1
# 对应分数若大于等于平均分则为1,否则为0
RFM['R_C'] = ( RFM['R_score'] >= RFM['R_score'].mean()) * 1
RFM['F_C'] = ( RFM['F_score'] >= RFM['F_score'].mean()) * 1

# 给用户打标
def user_class(uc):R_C, F_C = ucif R_C == 0 and F_C == 0:return 'dont_go' # 均0分:挽留elif R_C == 0 and F_C == 1:return 'call_back' # 0, 1分:召回elif R_C == 1 and F_C == 0:return 'maintain' # 1, 0分:维持elif R_C == 1 and F_C == 1:return 'high_value' # 均1分:高价值RFM['uc'] = RFM[['R_C', 'F_C']].apply(user_class, axis = 1)


# 绘制饼图观察数据分布
RFM_pie = RFM.groupby(by = ['uc'], as_index = False).agg({'user_id':'count'})
RFM_pie.rename(columns = {'uc':'class', 'user_id':'num'}, inplace = True)
label = RFM_pie['class']
value = RFM_pie['num']
plt.pie(value, labels = label, autopct='%1.1f%%')


对不同的标签的用户进行不同的运营策略,具体方式需要和运营侧同学沟通。
对高价值用户是否提供更会员权益,召回用户是否进行push或较大的优惠券。对维持状态的用户进行小幅度的优惠提供,促使向高价值用户的转化等。
具体要结合投入产出比的实际情况。
总结来说就是,将用户尽量往上一个级别去提升,无论是购买频次、购买金额、品牌忠诚度等方面。

item_rank = data.groupby(by = ['item_id'])['act_id'].value_counts().unstack().fillna(0)
item_rank.sort_values(by = 'buy', ascending = False, inplace = True)
TOP = item_rank.iloc[0:20]
TOP[TOP['buy/pv'] < 1]


观察销量前20的数据,卖出2-4件产品。TOP1产品在前五转化率的排名较低,虽然曝光非常多,但是需要在详情页-下单-付款的链路中排查购买不成功的原因。

结论

  1. 收藏&加购-购买的转化率需要进行优化,可以结合用户周中行为动作与每天中用户的收藏购买时间节点进行push或限时优惠券的发放,可能会促进用户的及时购买。
  2. 通过RFM模型可知,需要对不同种类的用制定销售策略,召回类用户进行push&限时优惠券,挽留用户可在大型购物节点进行push和优惠券,高价值用户则可授予会员、独特优惠体现其地位,维持类用户则需要尽量向高价值用户进行转化,可通过vip限时体验等运营方法。
  3. 结合产品的类别分析用户自然属性,进行更为详细的打标,将更有助于定向转化。性别、年龄、地区、偏好等。
  4. 更加具体的分析需要结合用户的行为路径,在详情页停留、跳出的时间、下单中断的操作、付款中断的操作。通过用户调研、AB测试可以优化以上步骤,使得购买更加流畅。
  5. 忠实用户需要进行专门的运营方法,这些用户可以不仅可以带来GMV,还可以转介用户,这一点需要格外留意,因为这种用户拉新的成本极低,应该充分把握。

淘宝用户行为数据分析相关推荐

  1. mysql 时间段内的周末_淘宝用户行为数据分析(MySQL)

    利用MySQL对淘宝用户行为数据进行分析.分析步骤如下: 1 提出问题 2 理解数据 3 数据清洗 4 构建模型 5 结论 6 建议 淘宝是目前国内最大的电商平台,人们网购的主要渠道之一.买家通过搜索 ...

  2. 天池-淘宝用户行为数据分析(python+Tableau)

    天池-淘宝用户行为数据分析(python+Tableau) 一.背景 ​ 用户行为分析可以让产品更加详细.清楚地了解用户的行为习惯,从而找出网站.app.推广渠道等产品存在的问题,有助于产品发掘高转化 ...

  3. 基于MySQL的淘宝用户行为数据分析

    前言 本文针对淘宝app的运营数据,以行业常见指标对用户行为进行分析,包括UV.PV.新增用户分析.漏斗流失分析.留存分析.用户价值分析.复购分析等内容,使用的分析工具以MySQL为主,涉及分组汇总, ...

  4. 案例:淘宝用户行为数据分析(SQL实现)

    一.项目介绍 本文针对淘宝APP的运营数据,使用阿里云天池上公开的数据集,以行业常见指标对用户行为进行分析,主要工具为MySQL,涉及分组汇总,引用变量,视图,关联查询等内容,可视化工具为excel和 ...

  5. 大数据实战 --- 淘宝用户行为数据分析

    目录 开发环境 数据描述 功能需求 数据准备 数据清洗 用户行为分析 找出有价值的用户 开发环境 Hadoop+Hive+Spark+HBase 启动Hadoop:start-all.sh 启动zoo ...

  6. 【毕业设计】大数据淘宝用户行为数据分析与可视化 - flink

    文章目录 0 前言 1.环境准备 1.1 flink 下载相关 jar 包 1.2 生成 kafka 数据 1.3 开发前的三个小 tip 2.flink-sql 客户端编写运行 sql 2.1 创建 ...

  7. 使用Python对淘宝用户行为进行数据分析

    淘宝用户数据分析 1 分析背景与意义 2 分析思路 3 分析内容 3.1 提出问题 3.2 理解数据 3.3 数据清洗 3.3.1 数据导入 3.3.2 缺失值分析 3.3.3 选取时间范围 3.3. ...

  8. MySQL项目-淘宝用户购物行为数据可视化分析

    一.项目背景与目的 1.1 项目背景 UserBehavior是阿里巴巴提供的一个淘宝用户行为数据集,用于隐式反馈推荐问题的研究.数据集包含了2017年11月25日至2017年12月3日之间,有行为的 ...

  9. MySQL数据项目分析实战——淘宝用户行为分析

    MySQL数据项目分析实战--淘宝用户行为分析 一.项目背景 二.项目目标 2.1分析目的 2.2分析维度 三.数据的收集与整理 3.1数据来源 3.2数据说明 3.3理解数据 3.4导入数据 四.数 ...

  10. 【数据分析实战】淘宝用户行为模式分析

    文章导览 目标定义 数据获取 数据抽样 探索性分析 数据清洗 用户行为分析 用户消费行为分析 漏斗分析 用户行为和商品种类分析 用户价值度RFM模型分析 1.目标定义 以淘宝APP2014年11月18 ...

最新文章

  1. python判断质数的函数并输出_【python基础】|| 用python判断输入的数是否为素数
  2. K.O. -------- Eclipse中Maven的报错处理
  3. Prolog基本程序
  4. Cocos Creator实现的《点我+1》
  5. CF1060D Social Circles
  6. C 的 6 种内存顺序,你都知道吗?
  7. pythonsocket中tcp通信接收不到数据_TCP 为什么三次握手而不是两次握手(正解版)...
  8. 【视频】视频基本参数介绍
  9. leetcode题解776-旋转字符串
  10. VS使用scanf函数报错解决方法
  11. Xcode6 viewDidLoad 中View的subviews 为空
  12. 送给大学生新生的建议
  13. 信道估计之LMMSE估计
  14. Linux gerp 命令使用方法
  15. CAD对话框不见后要如何调出
  16. 因为计算机中丢失MSVCp,无法启动此程序,因为计算机中丢失MSVCP140.dll的
  17. D语言使用dub编译ms-coff文件
  18. 物理卷、卷组与逻辑卷的关系及相关操作详述
  19. PDF文件如何在线分割
  20. Qt之QListWidget控件的应用

热门文章

  1. 操作系统的三个抽象概念
  2. PHP实现免费代理池
  3. win10桌面不见了如何找到
  4. linux微信登陆失败,微信登陆失败原因与解决方法
  5. 走进龙芯3A3000(二)安装Gentoo N64
  6. PDF/CDF 用matlab计算和绘图1
  7. 降噪耳机简介及降噪技术-ANC、ENC、DSP、CVC
  8. linux重装系统步骤 包含raid【主要针对服务器重装】
  9. iPhone所有屏幕分辨率
  10. OPNsense用户手册-高可用性和硬件故障转移