数据分析项目|淘宝用户行为分析(Python+可视化)_淘宝用户行为数据分析(1)

现在能在网上找到很多很多的学习资源,有免费的也有收费的,当我拿到1套比较全的学习资源之前,我并没着急去看第1节,我而是去审视这套资源是否值得学习,有时候也会去问一些学长的意见,如果可以之后,我会对这套学习资源做1个学习计划,我的学习计划主要包括规划图和学习进度表。

分享给大家这份我薅到的免费视频资料,质量还不错,大家可以跟着学习

网上学习资料一大堆,但如果学到的知识不成体系,遇到问题时只是浅尝辄止,不再深入研究,那么很难做到真正的技术提升。

需要这份系统化学习资料的朋友,可以戳这里获取

一个人可以走的很快,但一群人才能走的更远!不论你是正从事IT行业的老鸟或是对IT行业感兴趣的新人,都欢迎加入我们的的圈子(技术交流、学习资源、职场吐槽、大厂内推、面试辅导),让我们一起学习成长!

了解到所给数据集只有5个字段、时间维度限制在9天内、商品数据均为脱敏数据、行为数据只有4种等,具有一定的局限性。结合电商平台分析指标和AARRR漏斗分析模型,比较有分析价值的是用户行为和时间这两个维度。可以初步计划从用户行为习惯、用户消费习惯和用户价值等方分析。

2.1 用户行为方面

  • 页面浏览量PV和独立访客数UV如何变化?和时间有关系吗?
  • 用户的平均访问深度是多少?平台的跳失率怎么样?
  • 用户从浏览到购买会经历哪些过程?最终的转化率如何?
  • 平台用户留存率怎么样?

2.2 用户消费方面

  • 平台的用户付费率是多少?用户复购的情况怎么样?
  • 平台商品销售情况是怎么样?
  • 商品销售之间有没有一定的联系?

2.3 用户价值方面

  • 如何判断用户价值?针对不同用户如何采取不同的运营策略?

将上述问题整理如下,便于之后有针对性的进行分析:
在这里插入图片描述

三、数据处理

处理数据,主要包括对异常值、重复值和缺失值的处理

3.1 数据导入

# 源数据共有五个字段,为其定义英文字段
columns = ['user\_id','item\_id','category\_id','behavior\_type', 'timestamp']
# 迭代读取数据
df = pd.read_csv('UserBehavior.csv', names=columns, iterator=True)

loop, chunkSize, chunks = True, 10000000, [] # 分块大小为1000W
while loop:
    try:
        chunk = df.get_chunk(chunkSize)
        chunks.append(chunk)
    except StopIteration:
        loop = False
        print('Iteration is stopped.')

data = pd.concat(chunks, ignore_index = True)

不需要全部数据的话,可以在读取数据之后通过get_chunk( ) 函数获取所需数据,如:

data = df.get_chunk(1000000) # 获取100W数据

大家可能会有疑问,这里是不是可以用Pandas的sample( )函数随机抽样比较好,我个人觉得最好不要随机抽样,稍后会解释原因。

3.2 了解数据

可以通过data.head( ) / http://data.info / data.describe( )等快速了解数据

通过对数据查看,发现原数据集是按照user_id排好序的,如果之前采用随机抽样的话,可能会破坏原有数据的信息,比如用户A在浏览多次后最终完成下单支付,随机抽样的话,可能会错过用户购买记录,最终导致数据分析不准确。

数据集原有的时间列是采用时间戳存储的,为了方便后续分析,这里将原有时间戳转为北京时间,并从中抽取出日期、时间和小时数据,处理代码如下:

# 将时间戳转换为北京时间
data['timestamp'] = pd.to_datetime(data.timestamp, unit='s') + datetime.timedelta(hours = 8)
# 将日期提取出来,这种方法提取出的日期需要进一步处理为datetime64格式
data['date'] = data['timestamp'].dt.date
data['date'] = pd.to_datetime(data['date'])
# 将时间取出来
data['time'] = data['timestamp'].dt.time
# 将小时提取出来
data['hour'] = data['timestamp'].dt.hour

格式修改完后数据如下:
在这里插入图片描述

3.3 缺失值处理

# 判断是否有缺失值
data.isnull().sum()

阿里给的数据还是比较规范的,没有缺失值。如果有缺失值的话,需要对其填补或者删除等。

3.4 异常值处理

此数据集的异常值最有可能出现在时间范围上,这里筛选出符合时间范围的数据

# 异常值处理,时间超出给定范围的即为异常值
data = data[(data['timestamp'] >= '2017-11-25') & (data['timestamp'] < '2017-12-4')]

3.5 重复值处理

将数据集中重复数据删除

# 查看是否有重复值
data.duplicated().value_counts() 
# 删除重复值
data = data.drop_duplicates(keep = 'first',inplace = False) # 去除重复值

3.6 整理数据

因为之前删除掉了异常值和重复值,会缺失部分数据索引,这里给数据按照时间和用户id排序,并重新索引。

# 重新排序、索引
data = data.sort_values(by = ['timestamp','user\_id'], ascending=True)
data = data.reset_index(drop=True)

在这里插入图片描述

四、数据分析

根据之前提出的问题对数据集进行分析

(一)用户行为习惯分析

4.1.1 页面访问量PV和独立访客数UV

下面按照日期分析UV、PV的变化趋势:

# 定义函数,可以通过接收的key值进行分组,返回pv和uv
def cal\_pvuv(key = ''): 
    pv = data.groupby(key)['user\_id'].count()
    pv.name = 'pv'
    uv = data.groupby(key)['user\_id'].apply(lambda x: x.drop_duplicates().count())
    uv.name = 'uv'
    return pd.concat([pv,uv], axis = 1).reset_index()

pvuv_daily = cal_pvuv('date') # 得到按日期聚合的pv和uv数据
pvuv_daily.plot(x = 'date', secondary_y = 'uv', grid = True, figsize =(10, 5))

在这里插入图片描述
从图可以看出pv和uv整体变化趋势相同,11月25日到12月1日之间,uv变化不明显,pv在11月26日达到小高峰,与当天刚好是周六放假密切相关。从12月1日周四开始,pv和uv涨幅明显,12月2日和12月3日与上周相比较,环比增长率31.4%,uv环比增长率35.7%,可见本次活动宣传和引流效果不错,对实际销售情况的影响将在下个模块分析。

接下来按照小时去分析用户的行为习惯:

pvuv_hour = cal_pvuv('hour')
pvuv_hour.plot(x = 'hour', secondary_y = 'uv', grid = True, figsize = (10, 5), 
                          xticks = [x for x in range(24)], title = 'pvuv\_hour')


在这里插入图片描述
从上图可以看出用户的活跃时间从上午10点持续到晚上10点,尤其是从下午6点开始呈现明显上升趋势,到晚上九点左右达到峰值,这符合大多数人的日常作息规律。由此可以建议店铺调整客服工作时间,增加下午6点到晚上10点的客服数量,促使用户从浏览向购买转换。

4.1.2 平均访问深度和跳失率

# 计算总用户数量
uv_count = len(data.user_id.unique())
# 计算总的页面浏览数量
pv_count = data[data.behavior_type == 'pv'].shape[0]
# 计算平均访问深度
print('Average access depth is %.1f' % (pv_count / uv_count))
# 计算每个用户浏览的页面数
pv_count_perUser = data[data['behavior\_type'] == 'pv'].groupby('user\_id')['behavior\_type']
                     .count().reset_index().rename(columns = {'behavior\_type':'pv\_count'})
# 计算只浏览过一次界面的用户数量
bounce_user_count = pv_count_perUser[pv_count_perUser['pv\_count'] == 1].shape[0]
print('Bounce Rate is %.3f%% ' % (100 \* (bounce_user_count / uv_count))


可以得到用户的平均访问深度为90.8,也就是说在11月25到12月3日9天内平均每个用户每天要访问10个界面,可见淘宝用户粘度很高。

按照流失率=只浏览一次界面/总用户计算的话,发现流失人数只有679人,Bounce Rate 是 0.069% 左右,所以平台整体流失率是相当低的。我觉得可以考虑将只有浏览记录再无其他行为的用户视为流失用户,分析此类人群的跳失原因。

之后可以细分到各个商品种类以及各个商品,计算其用户跳失率并采取相应的措施。

4.1.3 用户转化情况

接下来分析用户从浏览到最后下单的转化情况,首先先了解一下用户浏览、收藏、加购物车和购买行为的整体分布趋势。

pv_detail = data.groupby(['behavior\_type','hour'])['user\_id'].count().reset_index().rename(columns={'user\_id':'total\_behavior'})
fig, axes = plt.subplots(2, 1, figsize = (10,8), sharex = True)
sns.pointplot(x = 'hour',y = 'total\_behavior', hue = 'behavior\_type', data = pv_detail, ax = axes[0])
sns.pointplot(x = 'hour',y = 'total\_behavior', hue = 'behavior\_type', data = pv_detail[pv_detail.behavior_type!='pv'], ax = axes[1])
axes[0].set_title('different\_behavior\_count')
axes[0].grid()
axes[1].set_title('different\_behavior\_count\_exceptpv')
axes[1].grid()


在这里插入图片描述
四种用户行为的波动情况基本一致,其中浏览页面pv数远大于其他三项,用户加购物车、收藏和购买数依次降低,可以通过漏斗模型整体分析用户转化情况。
在这里插入图片描述
从浏览到加入购物车的转换率为6.25%,收藏商品的转换率为3.26%,最后购买的转换率为2.23%左右。

4.1.4 用户行为路径分析

因为数据中用户行为分为四类,按照浏览在前,购买最后的话,一共有16种组合,利用桑基图分析如下所示:

img

一般认为购买之前必须得先浏览,因为所给数据是截取给定时间内的,所以会存在上图下方unpv的情况。现在只考虑最后产生购买行为的情况,用户从浏览到最后购买其实只有(1)浏览-购买、(2)浏览-加购物车-购买、(3)浏览-收藏-购买、(4)浏览-加购物车-收藏-购买(浏览-收藏-加购物车-购买)等四种情况,再次利用桑基图分析如下:
在这里插入图片描述
由上图可知,大多数购买行为发生在浏览之后,并没有加购物车、收藏等行为。

4.1.5 用户留存分析

下面计算本数据中的用户留存:

# 计算n日留存率
def cal\_retention(n = 1):

    # 用于记录出现过的user\_id
    user_list = [] 
    # 取最后一天的前N天
    cal_date = pd.Series(data['date'].unique()).sort_values()[:-n] 
    # 用于存储最后留存率结果
    retention_rates = [] 
    for to_date in cal_date:
        # 通过与已经有记录的用户列表的集合对比,识别新用户
        new_user_list = set(data[data['date'] == to_date]['user\_id']) - set(user_list) 
        # 用于存储最后留存率结果
        user_list.extend(new_user_list) 
        # 第n天留存情况
        user_ndate = data[data['date'] == to_date + timedelta(n)]['user\_id'].unique()
        retention_cnt = 0
        for user_id in user_ndate:
            if user_id in new_user_list: 
                retention_cnt += 1
        retention_rate = retention_cnt / len(new_user_list) 
        # 汇总N日留存数据
        retention_rates.append(retention_rate) 
    u_retention = pd.Series(retention_rates, index = cal_date)

    return u_retention


将每日的留存率聚合后如下图所示:
在这里插入图片描述
可视化后如下:
在这里插入图片描述
因为所给数据是截取的部分数据,这里暂认为11月25日所有的登录用户都是新用户,所以11月25日的用户留存率最高。从之前的PV和UV分析可推测平台从12月1日开始搞活动,进而吸引用户登录,所以11月30日和12月1日用户留存率增加。

(二)用户消费习惯分析

4.2.1 用户付费率PUR(Paying User Rate)

根据用户付费率 = 有购买记录的用户 / 活跃用户计算:

# 分析用户付费率
paying_user_count = data[data.behavior_type == 'buy'].user_id.unique().shape[0]

print('Paying user Rate is %.2f%%' % ( 100 \* paying_user_count / uv_count))


得到用户付费率为67.94%,淘宝用户付费率还是比较高的。

4.2.2 用户购买次数

根据总购买次数 / 总付费用户可得到付费用户平均消费次数为3次,下面进一步分析各购买次数的用户分布:
在这里插入图片描述
由上图可知,购买次数为1次的用户数量最多,大约有88%的用户购买次数在5次以内,购买次数在10次以内的用户占总付费用户的98%。

4.2.3 用户复购率

根据用户复购率 = 多次购买用户数 / 总付费用户计算:

#每个付费用户的购买次数
peruser_paying_count = data[data['behavior\_type'] == 'buy'].groupby('user\_id').count()['behavior\_type']
                           .reset_index().rename(columns={'behavior\_type':'paying\_count'})
# 复购用户数量 通过筛选支付次数>=2 
paying_retention_user_count = peruser_paying_count[peruser_paying_count['paying\_count'] >= 2]['user\_id'].count()

print('Buyer Retention Rate %.2f%%' % (100 \* paying_retention_user_count / paying_user_count))


可得用户复购率为66.01%。还可以计算用户复购的间隔时间:

buyer_retention_diff = data[data.type == 'buy'].groupby('user_id').date.apply(lambda x: x.sort_values().diff(1).dropna())
buyer_retention_diff = buyer_retention_diff.map(lambda x: x.days) 
buyer_retention_diff.describe()


在这里插入图片描述

箱线图表示不太明显,根据describe()返回值分析,用户复购平均间隔1.2天,有超过50%的用户在同一天内产生多笔交易。

4.2.4 商品大类销售分析

分析商品浏览TopN和商品销售TopN的数据:

# 定义计算销售/浏览TopN的函数
def cal\_topN (index, behavior_type, n):
    # 创建透视表
    topN = pd.pivot_table(data, index = index, values = 'user\_id', columns = 'behavior\_type', fill_value=0, 
                     aggfunc='count', margins = True).sort_values(by = behavior_type, ascending = False).fillna(0).head(n)
    topN['paying\_rate'] = topN.apply(lambda x: x.buy / x.pv, axis = 1).apply(lambda x: format(x, '.2%'))
    topN = topN[['pv','buy','paying\_rate']]
    return topN


分别查看商品浏览量前10和商品销售量前10:

(1)Python所有方向的学习路线(新版)

这是我花了几天的时间去把Python所有方向的技术点做的整理,形成各个领域的知识点汇总,它的用处就在于,你可以按照上面的知识点去找对应的学习资源,保证自己学得较为全面。

最近我才对这些路线做了一下新的更新,知识体系更全面了。

在这里插入图片描述

(2)Python学习视频

包含了Python入门、爬虫、数据分析和web开发的学习视频,总共100多个,虽然没有那么全面,但是对于入门来说是没问题的,学完这些之后,你可以按照我上面的学习路线去网上找其他的知识资源进行进阶。

在这里插入图片描述

(3)100多个练手项目

我们在看视频学习的时候,不能光动眼动脑不动手,比较科学的学习方法是在理解之后运用它们,这时候练手项目就很适合了,只是里面的项目比较多,水平也是参差不齐,大家可以挑自己能做的项目去练练。

在这里插入图片描述

网上学习资料一大堆,但如果学到的知识不成体系,遇到问题时只是浅尝辄止,不再深入研究,那么很难做到真正的技术提升。

需要这份系统化学习资料的朋友,可以戳这里获取

一个人可以走的很快,但一群人才能走的更远!不论你是正从事IT行业的老鸟或是对IT行业感兴趣的新人,都欢迎加入我们的的圈子(技术交流、学习资源、职场吐槽、大厂内推、面试辅导),让我们一起学习成长!

  • 5
    点赞
  • 11
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值