##数据集介绍:

  • 数据集下载地址: 阿里云天池: User Behavior Data from Taobao for Recommendation

  • 介绍
    UserBehavior 是阿里巴巴提供的一个淘宝用户行为数据集

文件名称 说明 包含特征
UserBehavior.csv 包含所有的用户行为数据 用户 ID,商品 ID,商品类目 ID,行为类型,时间戳

UserBehavior.csv
数据集包含了 2017 年 11 月 25 日至 2017 年 12 月 3 日之间,有行为的约一百万随机用户的所有行为(行为包括点击、购买、加购、喜欢)。数据集的组织形式和 MovieLens-20M 类似,即数据集的每一行表示一条用户行为,由用户 ID、商品 ID、商品类目 ID、行为类型和时间戳组成,并以逗号分隔。

1. 明确问题&构建分析框架

1.1 提出问题

根据数据集的内容和特性, 本文主要从以下几个方面着手分析:

  • 分析淘宝APP 的流量指标
  • 分析淘宝APP 的常用用户指标
  • 研究淘宝APP 用户在不同的时间尺度下的行为分布, 分析用户行为是否存在一写的时间规律
  • 分析用户使用APP的行为路径(单击、收集、添加购物车、购买)
  • 分析用户购买的产品是否存在热销, “热钱”

1.2 分析框架构建

[分析框架]

2. 数据处理

2.1 导入必需库

import pandas as pd
import numpy as np
from matplotlib import pyplot as plt
import time
import pyecharts.options as opts
from pyecharts.charts import Funnel
import copy
#from tqdm import tqdm 分组处理的时候才会用到
  • 设置 matplotlib 相关参数

    • 用于正常显示中文
plt.rcParams['font.sans-serif']=['SimHei']
  • 用于正常显示负号
plt.rcParams['axes.unicode_minus'] = False
plt.style.use('ggplot')

2.2 输入数据

  • 设置列名
columns = ['user_id', 'item_id', 'category_id', 'behavior', 'timestamp']
  • 超大数据集的两种处理方式

    • 分块分析数据, 导入的时候要分块, 即指定 chunksize= 参数, 这样导入的是一个可迭代对象, 后续的大部分处理要用循环迭代的方式进行, 这样的做对内存的要求会小一些, 但代码复杂, 可读性不好
    • 只取部分数据, 不用指定 chunksize= 参数, 但要指定 iterator=True, 后续用 get_chunk() 取出部分数据集做分析
    • 本文采用第二种方法
data = pd.read_csv(r'D:\临时\淘宝用户行为分析汇总\UserBehavior.csv', header=None, sep=',', chunksize=500000, iterator=True, names=columns)user_behavior = data.get_chunk(4000000)user_behavior.head()

2.3 数据清洗

2.3.1 数据整体情况
  • 查看数据整体信息
user_behavior.info()

  • 查看缺失值数量
user_behavior.isnull().sum()


结果显示没有缺失值, 数据集相对完整, 干净

2.3.2 重复值处理
user_behavior.duplicated().sum()

运行结果显示有 2 个重复值, 删除重复值

  • subset 参数用来指定特定列, 默认所有列, keep 默认 first
user_behavior.drop_duplicates(inplace=True)
2.3.3 拆解时间维度, 添加时间新时间维度列
  • 保持时间戳原始格式, 同时添加日期时间, 日期, 小时这几个新列
  • localtime 的作用是将时间戳格式为本地时间
user_behavior = user_behavior.assign(datetime=user_behavior['timestamp'].map(lambda x: time.strftime('%Y-%m-%d %H:%M:%S', time.localtime(x))))
user_behavior = user_behavior.assign(date=user_behavior['timestamp'].map(lambda x: time.strftime('%Y-%m-%d', time.localtime(x))))
user_behavior = user_behavior.assign(hour=user_behavior['timestamp'].map(lambda x: time.strftime('%H', time.localtime(x))))
user_behavior.head()

  • 分组查看日期分布
date_group = user_behavior.groupby(['date']).agg({'user_id':'count'})
date_group

  • 可以看到, 数据集确实集中在 11-25 日到 12-03 日, 其他日期的数据是无效数据, 这里剔除掉
  • 只所以加这一步, 是先了解一下数据整体上看起来有没有异常
user_behavior = user_behavior[(user_behavior['date']>'2017-11-24')&(user_behavior['date']<'2017-12-04')]
  • 再次分组查看

3. 流量指标分析

3.1 绝对流量指标

根据数据集的内容, 本次分析绝对流量指标包含下面4个方面:
1.日 pv:
2.日 uv
3.活跃用户
4.日购买量

  • 日 pv
daily_pv = user_behavior[user_behavior['behavior']=='pv'][['user_id', 'date']].groupby('date').count()
daily_pv.rename(columns={'user_id':'pv'}, inplace=True)
daily_pv.head()

  • 日 uv
daily_uv = user_behavior[['user_id', 'date']].groupby('date').nunique()
daily_uv.rename(columns={'user_id':'uv'}, inplace=True)

  • **日活跃用户:**如果一个用户同一天有两次操作行为, 则认为这个用户是活跃用户
daily_active = user_behavior[['user_id', 'behavior', 'date']].groupby(['date', 'user_id']).count()
daily_active = daily_active[daily_active['behavior']>2]
daily_active = daily_active.count(level=0)
daily_active.rename(columns={'behavior': 'active_user'}, inplace=True)

  • 日付费用户
daily_purchaser = user_behavior[user_behavior['behavior']=='buy']
daily_purchaser = daily_purchaser[['user_id', 'date', 'behavior']].groupby(['date', 'user_id']).count()
daily_purchaser =daily_purchaser.count(level=0)
daily_purchaser.rename(columns={'behavior': 'buy_user'}, inplace=True)

  • 合并数据: join 不指定 index 的话, 使用默认索引, 上面都是用 date 来分组的, 索引都是date
df_target = daily_pv.join([daily_uv, daily_active, daily_purchaser])

  • 使用 matplotlib 绘图

    • 设置绘图尺寸
plt.figure(figsize=(10,4), dpi=100)
  • 设置背景颜色
plt.subplot(111, facecolor='#F0F0F0')
  • 设置轴名称, 字体大小
plt.xlabel('日期', fontsize=10)
plt.ylabel('单位/万', fontsize=10)
  • 设置轴标签
plt.xticks(fontsize=10)
plt.yticks(fontsize=10)
  • 设置标题, 显示水平网格线
plt.title('流量类绝对指标', fontsize=14)
plt.grid(axis='x')
  • 绘制拆线图
plt.plot(df_target['pv']/100000, linewidth='2', marker='o', color='#00868B', label='pv(10万)')
plt.plot(df_target['uv']/10000, linewidth='2', marker='o', color='#ff5338', label='uv(万人)')
plt.plot(df_target['active_user']/10000, linewidth='2', marker='o', color='#fe8c00', label='活跃用户(万人)')
plt.plot(df_target['buy_user']/10000, linewidth='2', marker='o', color='#595959', label='付费用户(万人)')
  • 设置图例
plt.legend(loc='best', fontsize=8)

  • 由数据绝对流量拆线图可以看出:

    • 日pv、日uv、日活跃用户和日支付用户数量均呈上升趋势,12月2日和3日均显著增加,日pv增长33.0%,日uv增长34.7%,日活跃用户增长32.0%,每日支付用户增加了24.0%(除了前七天外,该数据与前两天的平均值相比值得一提)
    • 12月2日至3日,上述指标大幅改善。虽然12月2-3日是周末,但根据上个周末11月25-6日的流量分析,可以排除周末原因。由于12月2-3日接近双12,推测最有可能的原因是双12系列促销活动预热带来的流量增加。

3.2 相对流量指标

流量指标可以反映APP的整体运营情况,而流量的相对指标可以反映整体的深层次运营情况。根据上述流量指标,相应的流量相关指标包括:

  • 人均每日点击量: 每日pv/每日uv
  • 每日活跃用户比: 每日活跃用户/每日uv
  • 每日付款用户比: 每日付款用户/每日uv
  • 跳出率: 统计时间内只浏览一次/uv的用户数;本文选择的统计时间段为一天
3.2.1 每日点击率, 活跃用户比, 跳出率
  • 人均点击量
df_target['pv/uv'] = df_target['pv']/df_target['uv']
  • 活跃用户比
df_target['active_rate'] = df_target['active_user']/df_target['uv']
  • 付费用户比
df_target['buy_rate'] = df_target['buy_user']/df_target['uv']

  • 绘图
  • 设置绘图尺寸
fig, ax1 = plt.subplots(1, 1, figsize=(20, 7), dpi=100)n = df_target.shape[0]
x = np.arange(n)color = '#595959'
  • 设置标题及轴
ax1.set_title('日均流量比例指标',fontsize=25)
ax1.set_xlabel('日期', fontsize=19)
ax1.set_ylabel('比例', color=color, fontsize=19)
  • 绘制柱状图
ax1.bar(x, df_target['active_rate'], color='#fe8c00', width=0.3, label='活跃用户比')ax1.bar(x+0.3, df_target['buy_rate'], width=0.3, color=color,label='付费用户比')
  • 刻度线设置
ax1.tick_params(axis='y', labelcolor=color, labelsize=22)
ax1.tick_params(axis='x', labelsize=22)
  • 生成次坐标轴
ax2 = ax1.twinx()
color = '#ff5338'
  • 绘制日均 uv
ax2.plot(df_target['uv']/2000, color=color, marker='o', linewidth='3', label='日UV(单位:两千人)')
  • 绘制日人均点击
ax2.plot(df_target['pv/uv'], color="#00868B", marker='o', linewidth='3', label='人均PV(单位:次)')
  • 设置次轴刻度线
ax2.tick_params(labelsize=19)
  • 设置 y 轴的上下限
plt.ylim(12, 20)
  • 紧凑布局
fig.tight_layout()
  • 设置网格线不显示
plt.grid(False)
  • 设置图例

    • bbox_to_anchor 参数用来指定 将图例放置在坐标轴上的位置 (1.15, 1) 处
    • (0, 0) 是轴坐标的左下角,而 (1.0, 1.0) 是轴坐标的右上角
plt.legend(labels=['日UV(单位:两千人)', '人均PV(单位:次)'],bbox_to_anchor=(1.185, 1.0), fontsize=17)
  • 图例显示不全, 暂不知道原因
3.2.2 跳出率统计:

统计时间维度为一天时, 得到的是每日跳出率

df = user_behavior[['date', 'user_id', 'behavior']]
  • 为不同的行为赋值
df = df.assign(behavior_num = df['behavior'].map({'pv':1, 'fav':2, 'cart':4, 'buy':8}))
  • 根据 date, user_id 分组, 对 behavior_num 求和
df_1 = df.groupby(['date', 'user_id']).sum()
  • 对 pv=1 的用户计数
daily_loss = df_1[df_1['behavior_num']==1].count(level=0)
daily_loss.rename(columns={'behavior_num':'user_loss'}, inplace=True)
  • 计算跳出率
daily_loss = daily_uv.join(daily_loss)
daily_loss['lose_rate'] = daily_loss['user_loss']/daily_loss['uv']

  • 绘制跳出率拆线图
plt.figure(figsize=(10,2), dpi=100)plt.subplot(111, facecolor='#F0F0F0')plt.xticks(fontsize=10)
plt.yticks(fontsize=10)
plt.ylim(0, 0.15)plt.title('每日跳出率', fontsize=12)
plt.grid(axis='x')plt.plot(daily_loss['lose_rate'], linewidth='2', marker='o', color='#ff5338')

  • 流量类相对指标总结

    • 人均 pv 约13次, 浮动很小, 每个用户每天浏览平均约浏览13个页面
    • 用户日活跃率和日付费率分别约为 79%, 19%, 比较稳定
    • 从12月2日到3日,用户数量增加了34.7%,但活跃比例和支付比例分别下降了2.0%和7.9%(数据来自除前七天外的最近两天的平均值)。由此可见,活动吸引的用户支付比例并不高于普通用户,推广活动带来的流量转化率降低了整体支付转化率. 建议做更准确的引流活动
    • 活动开始前(即前7天),app的日跳转率约为10.3%,用户粘性很高;活动开始后的12月2日至3日,APP的日跳跃率增加到11.0%,比活动前高7.0%,这也表明活动引流的准确性低于活动前。

4. 用户指标分析

4.1 用户购买分析

4.1.1 用户购买次数统计分析 (9天内)
df_buy_times = user_behavior[user_behavior['behavior']=='buy'][['user_id', 'behavior']].groupby(['user_id']).count()
df_buy_times.rename(columns={'behavior':'times'},inplace=True)df_buy_times.describe()

user_count=user_behavior[user_behavior['behavior']=='buy']['user_id'].nunique()
user_count

26509

综上所述,在这9天的39020个用户中,有26509个用户有购买行为。平均而言,每个用户购买大约3次,超过一半的用户购买不到3次,大多数用户购买不到5次。

4.1.2 购买次数分布
  • 绘制购买次数直方图

    • 大部分用户购买不足 10 次, 这里只看 10 次以内的分布
plt.figure(figsize=(10,4), dpi=100)
plt.subplot(111, facecolor='#F0F0F0')plt.title('购买小于10次用户数分布')
plt.xlabel('购买次数', fontsize=10)
plt.ylabel('用户数', fontsize=10)plt.hist(df_buy_times[df_buy_times['times']<=10]['times'], bins=20, color='#6462cc')plt.xticks(fontsize=10)
plt.yticks(fontsize=10)plt.xlim((1, 10))fig.tight_layout()


随着购买次数的增加,人数也在下降,这符合行业消费行为规律。在这9天内,72.8%的用户购买次数低于平均水平,而使用高频(>10)的用户比例非常小,为2.2%。它可以被识别为非常忠诚的用户,这需要关注。

4.2 复购率

复购率: 周期内产生两次或两次以上购买的用户数占用户总数的比例

4.2.1 9天内的复购率
  • 筛选购买用户
df_buy = user_behavior[user_behavior['behavior']=='buy'][['user_id', 'date', 'behavior']]
  • 计算 9 天内的复购率
df_rebuy_9 = df_buy.groupby('user_id').behavior.count()
df_rebuy_9[df_rebuy_9.values>=2].count()/df_rebuy_9.count()

0.6575502659474141

4.2.2 日复购率
  • 对日期和用户ID分组计数
df_rebuy_1 = df_buy.groupby(['date', 'user_id']).count()
  • 重命名为 total
buy_user_total.rename(columns={'behavior':'total'}, inplace=True)
  • 计算每天重复购买人数
repurchase_user = df_rebuy_1[df_rebuy_1.behavior>=2].count(level=0)
  • 重命名为复购总数
repurchase_user.rename(columns={'behavior':'repur_amount'}, inplace=True)
  • 合并到一张表中
df_repur_rate = buy_user_total.join(repurchase_user)
df_repur_rate['repur_rate'] = df_repur_rate['repur_amount']/df_repur_rate['total']df_repur_rate

  • 绘制复购率曲线图
plt.figure(figsize=(10,3), dpi=100)
plt.subplot(111, facecolor='#F0F0F0')plt.xlabel('日期', fontsize=10)
plt.xticks(fontsize=10)
plt.yticks(fontsize=10)
plt.ylim(0,0.40)plt.title('每日复购率')
plt.grid(axis='x')plt.plot(df_repur_rate.index, df_repur_rate['repur_rate'])

  • 复购率分析总结

    • 根据《精益数据分析》一书中给出的参考:当重复购买率在90天内达到30%以上时,电商模式为忠诚度模式,淘宝APP9天的回购率高达66%。因此,目前淘宝正处于电子商务的忠诚模式,因此业务的重点应该放在顾客忠诚上,即鼓励忠诚的回头客更频繁地消费。
    • 用户的回购率每天在30%左右波动。在12月初,有一个小的下降。据推测,在双十二活动之前,用户正在抑制消费,等待更多优惠活动。当然,数据的正常性只能通过比较去年同期的数据来确定。

4.3 回购率

由于数据集只包含9天的数据,本文将这9天划分为3个时间窗口,每个时间窗口的长度为3天,以分析用户的回购率。

  • 因为要涉及时间的加减, 将数据集的时间字段转换为日期格式
user_behavior['date'] = pd.to_datetime(user_behavior['date'])
  • 将日期切分成三个时间窗口 ,每个窗口包含三天
  • 添加一列, 将同一时间窗口的日期设置为日期最大的日期
  • + np.timedelta64(0, ‘D’) 加 0 天
for m, n in zip(range(1,10), user_behavior.date.unique()):if m%3 == 0:user_behavior.loc[((user_behavior.date + np.timedelta64(0, 'D'))<=n) & ((user_behavior.date + np.timedelta64(2, 'D')>=n)),'date_1'] = n
  • 按日期窗口分组, 取出窗口内 user_id 唯一值
df_buy_back = user_behavior[user_behavior.behavior =='buy'].groupby('date_1').user_id.unique()
  • 定义一个空列表, 记录相应的时间窗口和回购率
days = []
back_buy_rates = []
  • 计算回购率
for i in range(0,len(df_buy_back.index)-1):users = df_buy_back.values[i].tolist() #获取时间窗口的用户IDcount = 0for user in users:if user in df_buy_back.values[i+1].tolist(): #如果用户也在下一个时间窗口中消费,则计数加 1count +=1# 计算回购率并记录buy_back_rate = count/len(users)back_buy_rates.append(buy_back_rate)# 记录相应的时间窗口信息days.append(df_buy_back.index.tolist()[i])
  • 生成 DataFrame
back_buy_rate = pd.DataFrame({'date':days,'buy_back_rate':back_buy_rates})back_buy_rate

  • 回购率分析总结

    • 11月25日至11月27日,即首次窗口用户回购率为44.5%;在第二个时间窗口11月28日至11月30日,用户的回购率为46.7%,略高于第一个时间窗口,表明用户忠诚度正在上升

4.4 留存率

留存率是指在一定时间内开始使用应用程序并在一段时间后继续使用该应用程序的用户比例。由于数据集只有9天的数据,因此无法确认该用户是否为新用户。因此,本文将模拟分析淘宝APP作为9天内首次登录的新用户的留存率。

  • 定义留存率计算函数, n 是相应的天数
def nday_retention_rate(df,n):# 创建空集,记录用户ID;创建一个空列表,记录相应的日期和保留率users_2 = set()days = []nday_retentions = []# 筛选计算日期dates = df.date.unique()[:-n]# 循环遍历每一天for date in dates:        users_1 = copy.deepcopy(users_2) # 记录前一天的 user IDids = df[df.date==date].user_id.unique().tolist()for i in ids:users_2.add(i)  # 记录当日 user IDusers = users_2 - users_1 # 相减得到当日新增用户 ID# n天后使用应用程序的用户ID列表nday_users = df[df.date == date + np.timedelta64(n, 'D')].user_id.unique()counts = 0# 在 n 天后遍历用户 ID。如果用户 ID 在同一天使用,则计数加 1for nday_user in nday_users:if nday_user in users:counts += 1# 计算留存率, 记录相应的日期和留存率nday_retention_rate = counts/len(users)nday_retentions.append(nday_retention_rate)days.append(date)# 创建相应的 DataFrame 以装载数据df_retention_rate = pd.DataFrame({'date':days, 'The first {} Daily retention rate'.format(n): nday_retentions})return df_retention_rate
  • 用函数计算第二天, 第三天, 第七天的留存率
retention_rate_1 = nday_retention_rate(user_behavior, 1)
retention_rate_3 = nday_retention_rate(user_behavior, 3)
retention_rate_7 = nday_retention_rate(user_behavior, 7)
  • 合并上述数据
retention_rate = pd.merge(retention_rate_1, retention_rate_3, how='left', on='date')
retention_rate = pd.merge(retention_rate, retention_rate_7, how='left', on='date')retention_rate

5. 用户行为分析

5.1 用户行为时间分析

在这个数据集中,用户的行为主要包括浏览点击(pv)、 收藏(fav)、加购(cart)和付款(buy), 这里尝试以日和小时为单位分析了用户的购买行为,并分析用户在不同时间尺度下的行为规则。

5.1.1 从日期维度统计点击, 收藏, 加购及付款次数
daily_behavior = user_behavior.pivot_table(index='date', columns='behavior', aggfunc='count', values='item_id')
daily_behavior[['pv', 'fav', 'cart', 'buy']]   # 调整一下列顺序
  • 绘制用户行为拆线图
plt.figure(figsize=(12,4), dpi=100)plt.subplot(111, facecolor='#F0F0F0')plt.plot(daily_behavior['pv']/1000,linewidth='3', color='#ff5338', label='日PV(单位:千人)')
plt.plot(daily_behavior['fav'], label='fav', linewidth='3', color='#ffc900')
plt.plot(daily_behavior['cart'], label='cart', linewidth='3', color='#595959')
plt.plot(daily_behavior['buy'], label='buy', linewidth='3', color='#fe8c00')plt.xticks(fontsize=12)
plt.yticks(fontsize=12)plt.title('周期内用户行为分析')
plt.xlabel('date',fontsize=14)plt.legend(loc='best', fontsize=8)
plt.grid(axis='x')

5.1.2 从小时维度统计点击, 收藏, 加购及付款次数
hourly_behavior = user_behavior.pivot_table(index='hour', columns='behavior', aggfunc='count', values='item_id')
hourly_behavior.head(10)

  • 每日用户行为分析
plt.figure(figsize=(12,4), dpi=100)plt.subplot(111, facecolor='#F0F0F0')plt.plot(hourly_behavior['pv']/1000,linewidth='3', color='#ff5338', label='每小时PV(单位:千人)')
plt.plot(hourly_behavior['fav'], label='fav', linewidth='3', color='#ffc900')
plt.plot(hourly_behavior['cart'], label='cart', linewidth='3', color='#595959')
plt.plot(hourly_behavior['buy'], label='buy', linewidth='3', color='#fe8c00')plt.xticks(fontsize=12)
plt.yticks(fontsize=12)plt.title('每日用户行为分析')
plt.xlabel('date',fontsize=14)plt.legend(loc='best', fontsize=8)
plt.grid(axis='x')

  • 不同时间维度用户行为分析结论

    • 从日期来看:12月2日至3日,托收数量、额外购买数量、付款数量和页面浏览数量均显著增加,托收数量增加了34.7%,额外购买数量增加了38.9%,付款数量增加了19.7%;
    • 从时间维度来看:19:00-23:00是用户活动的高峰。从早上22:00到4:00,用户活动逐渐减少,直至当天最低值;从5:00到10:00,用户活动开始增加;从10:00到10:00~18这段时间是相对稳定的状态,因为这段时间大致是工作时间;可以看出,大部分用户的活动时间与人类的生物钟一致,建议参考用户的活动时间,进行相应的推广活动
    • 当然,如果有条件的话,我们可以进一步分析主要活跃用户群在不同时间段的特点(比如购买特点, 浏览点击特点),然后根据主要活跃用户群的特点,我们可以在不同时间段推出不同的产品。

5.2 用户行为路径分析

5.2.1 访问-加购-购买 漏斗分析
  • 淘宝APP 的收藏功能主要是帮助用户收集自己喜欢但不立即购买的商品,而购物车具有类似的收藏功能,但主要是方便用户批量购买商品,两者都是用来提升用户的购物体验。然而,在收藏后购买商品仍然面临着添加购物车和直接购买的选择。因此,本文的漏斗分析将排除收藏环节,仅分析 pv cart buy 的转换,转换周期设置为9天

  • 提取数据

df_route = user_behavior[['user_id', 'behavior']]
  • 删除用户的相同行为
  • 漏斗模型计算时的规则, 注意理解. 。只需要知道是否存在相应的行为,而不需要知道行为的数量
  • 删除重复值
df_route = df_route.drop_duplicates(['user_id', 'behavior'])
  • 根据是否存在4种行为,有16种组合。为行为数据指定值:1、2、4、8。经过排列和组合后,值的总和为0-15
df_route = df_route.assign(behavior_num = df_route['behavior'].map({'pv':1, 'fav':2, 'cart':4, 'buy':8}))
  • 根据用户分组,统计行为值之和,并确定用户的行为组合
df_route = df_route.groupby('user_id').sum()
df_route.reset_index(inplace=True)
df_route
  • 根据用户行为组合进行分类
user_route = df_route.groupby('behavior_num').count()
user_route.rename(columns={'user_id':'user_amount'}, inplace=True)
  • 与组合值对应的行为路径
user_route["behavior_com"] = [
"pv","fav","pv-fav","cart","pv-cart",
"fav-cart","pv-fav-cart","buy","pv-buy", "fav-buy","pv-fav-buy","cart-buy","pv-cart-buy",
"fav-cart-buy","pv-fav-cart-buy" ]user_route

  • *** 筛选每个漏斗的用户量**
  • pv:即组合值为奇数
pv = (user_route.loc[::2]).sum().values[0]
  • 浏览并加入购物车的用户数:pv-cart: 5, pv-fav-cart: 7, pv-cart-buy: 13, pv-fav-cart-buy: 15
pv_cart = (user_route.loc[[5,7,13,15]]).sum().values[0]
  • 浏览、加入购物车、购买用户数,即:pv-cart-buy:13、pv-fav-cart-buy:15
pv_cart_buy = (user_route.loc[[13,15]]).sum().values[0]
  • 合并成新表
funnel_data = pd.DataFrame({'links':['浏览', '加入购物车', '支付成功'], 'number of people':[pv, pv_cart, pv_cart_buy]})funnel_data

  • 计算各环节的转化率,绘制漏斗图
con_list=[100 if i==0 else round(funnel_data['number of people'][i]/funnel_data['number of people'][i-1]*100, 2) for i in range(0, len(funnel_data['number of people']))]
funnel_data['link coversion rate'] = con_list
funnel_data

  • 绘制漏斗图
x_data = funnel_data['links']
y_data = funnel_data['link coversion rate']data = [[x_data[i], y_data[i]] for i in range(len(x_data))]
funnell = Funnel(init_opts=opts.InitOpts(width='800px',height='400px', renderer='svg'))
funnell.add(series_name='',data_pair = data,gap=2,tooltip_opts=opts.TooltipOpts(is_show=True, trigger='item', formatter='{a} <br/>{b} : {c}%'),label_opts=opts.LabelOpts(is_show=True, position='inside', formatter='{b} {c}%'),itemstyle_opts=opts.ItemStyleOpts(border_color='#fff', border_width=1))# 设置标签和图例
funnell.set_global_opts(title_opts=opts.TitleOpts(title='用户单一转化率', pos_left='center'),legend_opts=opts.LegendOpts(pos_left=0, pos_bottom='50%', orient='vertical', item_height=12)            )funnell.render_notebook()

  • 漏斗分析总结

    • 这个漏斗分析的统计周期是 9 天。数据集中有 38861 个用户,但只有 19463 个用户有页面浏览行为,其余 159 个用户的浏览行为大概是在数据集的时间范围之外产生的。因此,统计分析采用行为分配的形式,首先排除这些用户
    • 根据分析,在这 9 天中,75.23% 的用户有浏览后加入购物车的习惯,71.74% 的用户在加入购物车后有购买行为
    • 由于数据集时间范围的限制,目前无法知道这 9 天内每个链路的转换率是否正常。需要与历史数据进行比较,才能做出最终的判断
5.2.2 用户行为路径分布
  • 筛选出9天里有浏览记录的用户, 按用户数排序
user_route = user_route.loc[[1,3,5,7,9,11,13,15]]
user_route = user_route.sort_values(by='user_amount', ascending=False)
user_route

  • 绘图
plt.figure(figsize=(8,5), dpi=120)
plt.subplot(111, facecolor='#F0F0F0')x = range(len(user_route['behavior_com']))plt.xticks(x, user_route['behavior_com'], rotation=75)
plt.title('用户行为路径分布')rects = plt.bar(x, user_route['user_amount'], width=0.6, color='#E76278')count=0
Sum=user_route["user_amount"].sum()# Set data labels, number of people in each path and their respective proportion
for rect in rects:height = rect.get_height()   rect_x = rect.get_x()        plt.text(rect.get_x() + rect.get_width()/2,height+500,str(height)+'人', ha='center',fontsize=8)plt.text(rect.get_x() + rect.get_width()/2,height+100,str('{:.2f}'.format(user_route["user_amount"].values[count]/Sum*100)) + "%",ha='center',fontsize=8) count+=1 #Percentage increase

  • 用户行为路径分析小结

    • 该分析基于用户浏览,共有 8 条路径。在这 9 天中,比例最高的 3 条路径分别是:浏览-加购-购买、浏览-收藏-加购-购买和浏览-加购,分别占总数的 32.72% 、21.22% 和 14.36% ,占总数的 68.3% ,其他用户路径的比例相近
    • 在 9 天内,68.14% 的用户使用了支付功能,75% 的用户使用了购物车功能,40.12% 的用户使用了收藏功能 (数据由包含行为的相应路径累积)
    • 28.48% 的用户使用收藏功能并支付。在 9 天内,收藏功能的付款转化率为 71.00% (28.48%/40.12%) ,未使用回收功能的用户的付款转换率为 66.23% (39.66%/59.88%)。因此,收藏功能可以在一定程度上提高用户的支付转化率,即 7.18%
    • 使用购物车和支付功能的用户比例为 53.94% ,购物车功能的支付转化率为 71.92% (53.94%/75%) ,不使用购物车功能的用户支付转化率为 56.80% (14.20%/25%) ,同样,购物车也能提高用户的支付转化率,改善率高达 26.62%
    • 总而言之, 使用收藏及购物车功能的使用者的转换率较不使用该两项功能的使用者为高。因此,建议最大限度地优化收藏和购物车功能,以促进用户更频繁地使用这两种功能,从而提高整体支付转化率。此外,还可以为用户设置提醒,提醒谁有商品在收藏和购物车,例如,如果你没有购买的商品在购物车 3 天,你可以及时提醒用户;或者如果商品在购物车有优先信息,你可以及时提醒用户

5.3 收藏/购物车购买时间间隔分布

  • 从以上分析可以看出,在这 9 天里,使用收藏和购物车功能的用户转化率相对较高。其次,进一步分析了用户在 9 天内采购商品和添加购物车的时间间隔分布。运营人员可以根据时间间隔分布为用户设置提醒功能。
5.3.1 加购物车-购物 分析
  • 筛选数据
df_cart = user_behavior[user_behavior['behavior']=='cart'][['user_id', 'item_id', 'datetime']]
df_buy = user_behavior[user_behavior['behavior']=='buy'][['user_id', 'item_id', 'datetime']]
  • 合并表
df_cart_buy = pd.merge(df_cart, df_buy, how='inner', on=['user_id', 'item_id'], suffixes=('_cart', '_buy'))
df_cart_buy['diff_time'] = pd.to_datetime(df_cart_buy['datetime_buy']) - pd.to_datetime(df_cart_buy['datetime_cart'])
  • 将时间差转化成小时
df_cart_buy['diff_time'] = pd.to_numeric(df_cart_buy['diff_time'].map(lambda x: x.days * 24 + x.seconds/3600))
  • 筛选剔除时间差大于 0 数据, 因为存在购买后再次添加购物车的情况
df_cart_buy = df_cart_buy[df_cart_buy['diff_time']>=0]
  • 将 9 天时间分为 9 组
bins = [0,24,48,72,96,120,144,168,192,240]
df_cart_buy['time_bins'] = pd.cut(df_cart_buy['diff_time'], bins=bins, include_lowest=False)
  • 分组统计
df_1 = df_cart_buy.groupby('time_bins').user_id.count()
df_1

  • 绘图
plt.figure(figsize=(10,4),dpi=100)
plt.subplot(111, facecolor='#F0F0F0')rects = plt.bar(range(0,len(df_1.index)), df_1.values, color='#6462cc')
plt.xticks(range(0, len(df_1.index)), df_1.index)
plt.xlabel('单位: 小时', fontsize=10)
plt.title('加购物车-购物 时间间隔 (9天内)')\# 设置数据标签
count=0
sum=df_1.sum()for rect in rects:height = rect.get_height()rect_x = rect.get_x()plt.text(rect.get_x()+rect.get_width()/2, height+50, str(height)+'人', ha='center', fontsize=9)plt.text(rect.get_x()+rect.get_width()/2, height+400, str('{:.2f}'.format(df_1.values[count]/sum *100))+'%', ha='center', fontsize=9)count += 1

5.3.2 收藏-购买 分析
  • 筛选数据
df_fav = user_behavior[user_behavior['behavior']=='fav'][['user_id', 'item_id', 'datetime']]
df_buy = user_behavior[user_behavior['behavior']=='buy'][['user_id', 'item_id', 'datetime']]
  • 合并表
df_fav_buy = pd.merge(df_fav, df_buy, how='inner', on=['user_id', 'item_id'], suffixes=('_fav', '_buy'))
df_fav_buy['diff_time'] = pd.to_datetime(df_fav_buy['datetime_buy']) - pd.to_datetime(df_fav_buy['datetime_fav'])
  • 将时间差转化成小时
df_fav_buy['diff_time'] = pd.to_numeric(df_fav_buy['diff_time'].map(lambda x: x.days * 24 + x.seconds/3600))
  • 筛选剔除时间差大于 0 数据, 因为存在购买后再次添加收藏的情况
df_fav_buy = df_fav_buy[df_fav_buy['diff_time']>=0]
  • 将 9 天时间分为 9 组
bins = [0,24,48,72,96,120,144,168,192,240]
df_fav_buy['time_bins'] = pd.cut(df_fav_buy['diff_time'], bins=bins, include_lowest=False)df_2

  • 绘图
plt.figure(figsize=(10,4),dpi=100)
plt.subplot(111, facecolor='#F0F0F0')rects = plt.bar(range(0,len(df_2.index)), df_2.values, color='#E76278')
plt.xticks(range(0, len(df_2.index)), df_2.index)
plt.xlabel('单位: 小时', fontsize=10)
plt.title('加购-付款 时间间隔 (9天内)')\# 设置数据标签
count=0
sum=df_2.sum()for rect in rects:height = rect.get_height()rect_x = rect.get_x()plt.text(rect.get_x()+rect.get_width()/2, height+50, str(height)+'人', ha='center', fontsize=9)plt.text(rect.get_x()+rect.get_width()/2, height+400, str('{:.2f}'.format(df_2.values[count]/sum *100))+'%', ha='center', fontsize=9)count += 1

  • 加购物车-购买, 收藏-购买 时间间隔分析总结:

    • 从以上数字可以看出,在这 9 天内,加入购物车并有购买意愿的近 58.6% 用户将在 24 小时内完成购买,超过 87.2% 的用户将在 3 天内购买;对于收藏并有购买意愿的用户,近 76.3% 的用户将在 24 小时内完成购买,超过 92% 的用户将在 3 天内购买
    • 从图中可以看出, 无论是收藏还是加购物车, 3 天后仍未购买的用户, 可以粗略的推断出用户的购买意愿不强烈. 此时, 可以通过适当的提示和活动来引导用户购买, 或者推送类似商品给用户选择

6. 用户购买产品分析

6.1 数据集中商品种类及商品分类基本情况

  • 记录中商品种类数
user_behavior['item_id'].nunique()
  • 有购买的商品种类数
user_behavior[user_behavior['behavior']=='buy']['item_id'].nunique()
  • 记录中商品分类数
user_behavior['category_id'].nunique()
  • 有购买的商品分类数
user_behavior[user_behavior['behavior']=='buy']['category_id'].nunique()
  • 在 9 天用户行为数据中,商品种类总数近 95 万种,有购买记录的商品只有 58773 种,仅占 6.1%,共有商品种类 7147 种,其中用户购买商品 3845 种,占 53.8%

6.2 商品类别购买时间分析

6.2.1 商品类别-采购次数的描述和统计
选择商品分类而非具体的商品更有代表性, 对未来的投放推送更有指导性

  • 1. 描述性统计

    • 筛选购买信息
df_buy = user_behavior[user_behavior['behavior']=='buy']
  • 商品类别分组统计
df_buy_category = df_buy[['user_id', 'category_id']].groupby('category_id').count()
df_buy_category.rename(columns={'user_id':'buy_times'}, inplace=True)
  • 商品分类的描述性统计
df_buy_category.describe()

  • 在这 9 天里,各类商品平均购买次数为 20.8 次,但 50% 以上的商品类别只购买了 4 次,显示出明显的右偏差,表明部分相对热门的商品类别平均水平有所提高

  • 2. 购买最多的前 20 个分类

  • 对购买次数排名, 取前 20 名

df_cate_top20 = df_buy_category.sort_values(by='buy_times', ascending=False).head(20)
  • 添加热卖前 20 在成交商品中的占比
df_cate_top20['percent'] = round((df_cate_top20.buy_times)/(df_cate_top20.buy_times.sum())*100,1)
  • 绘图
    plt.figure(figsize=(10,5),dpi=120)
    plt.pie(
    df_cate_top20[‘percent’],
    labels=df_cate_top20.index,
    autopct=’%1.1f%%’,
    pctdistance=0.9,
    radius=1.3,
    startangle=70,
    labeldistance=1.0
    )

plt.legend(loc=‘upper right’, fontsize=8,bbox_to_anchor=(1.4, 0.9), borderaxespad=0.3)
plt.title(‘热销TOP20商品大类交易占比’, pad=20, fontsize=12)

  • 在这 9 天里,前 20 大热门商品的购买次数占总购买次数的 20.6% ,前 20 大热门商品的购买次数占总购买次数的 0.64% ,占总购买次数的 20.6% ,也符合 28 的规律,建议对前 20 大热门商品给予更多的关注。

6.3 购买时间分析

1. 购买时间的统计描述
  • 筛选购买用户
df_buy = user_behavior[user_behavior['behavior']=='buy']
  • 商品分类统计
df_buy_item = df_buy[['user_id', 'item_id']].groupby('item_id').count()
df_buy_item = df_buy_item.rename(columns={'user_id':'buy_times'})
  • 描述性统计分析
df_buy_item.describe()

  • 在这 9 天里,每种商品的平均购买次数为 1.4 次,但 75% 以上的商品只购买过一次,购买次数最多的商品只有 62 次,没有购买量非常集中的商品,表明这 9 天的商品销售主要依靠长尾商品的积累效应,而不是突发商品的促销

  • 热销TOP20商品

df_item_top20 = df_buy_item.sort_values(by='buy_times', ascending=False).head(20)
  • 添加热销TOP20商品占比
df_item_top20['percent'] = round((df_item_top20['buy_times']/df_item_top20.buy_times.sum())*100,1)
  • 绘图
plt.figure(figsize=(10,5),dpi=120)
plt.pie(df_item_top20['percent'],labels=df_cate_top20.index,autopct='%1.1f%%',pctdistance=0.9,radius=1.3,startangle=70,labeldistance=1.0)plt.legend(loc='upper right', fontsize=8,bbox_to_anchor=(1.4, 0.9), borderaxespad=0.3)
plt.title('热销TOP20商品大类交易占比', pad=20, fontsize=12)

  • 这 9 天,前 20 大热卖品的购买量占购买总量的 0.71% ,相对较低,再次表明这 9 天推送的商品力度不够

6.4 商品转化率分布

  • 筛选用户浏览记录

    • as_index=False 如果没有这个参数, 分组依据会被设置为索引, 后面的删除是无法删除索引的
df_pv = user_behavior[user_behavior['behavior']=='pv']
  • 按商品分组统计浏览用户数
df_pv_item = df_pv[['user_id', 'item_id']].groupby('item_id', as_index=False).nunique()
df_pv_item = df_pv_item.rename(columns={'user_id':'pv_user_amount'})
df_pv_item = df_pv_item.drop('item_id',axis=1)
  • 筛选用户购买记录
df_buy = user_behavior[user_behavior['behavior']=='buy']
  • 按商品分组统计购买用户数
df_buy_item = df_buy[['user_id', 'item_id']].groupby('item_id', as_index=False).nunique()
df_buy_item = df_buy_item.rename(columns={'user_id':'buy_user_amount'})
df_buy_item = df_buy_item.drop('item_id',axis=1
  • 合并商品浏览数和购买数, 计算转化率
df_item = pd.merge(df_buy_item, df_pv_item, left_index=True, right_index=True, how='inner')
df_item['con_rate'] = df_item['buy_user_amount']/df_item['pv_user_amount']
  • 排除购买人数比浏览人数多的商品
df_item = df_item[df_item['con_rate']<=1]
df_item.describe()

  • 绘图
plt.figure(figsize=(10,4),dpi=100)
plt.subplot(111,facecolor='#F0F0F0')plt.title('商品转化率',fontsize=12)
plt.xlabel('商品转化率',fontsize=12)
plt.ylabel('商品数',fontsize=10)plt.hist(df_item['con_rate'],bins=10)plt.xticks(ticks=np.arange(0,1.1,0.1),fontsize=10)
plt.yticks(fontsize=10)

  • 转化率高于 90% 购买用户多于 1 人的商品数量
df = df_item[(df_item['con_rate']>=0.9) & (df_item['con_rate']<=1.0) & (df_item['buy_user_amount']>1)].sort_values('buy_user_amount',ascending=False)
df.shape[0]

1185

  • 商品转化率小结

    • 如上图所示,在 9 天内,商品换算率分布有两个集中区域。近 67% 的商品转化率低于 50% ,近 32% 的商品转化率高于 90% 。然而,97.3% 的高转化率商品只有一个用户购买。因此,这些商品目前不能划分为高转化率的商品,因为流量基础太小。建议注意转化率随流量增加而变化的情况
    • 购买转化率低的商品的用户数量并不大,但由于UV基数较大,整体转化率相对较低。对于这部分商品,建议相应的企业进行流量损失分析,从而提高用户从点击产品详细信息页面到最终购买的体验,从而提高转化率

7. 总结

  • 本文分析了淘宝 app 39020 用户在 9 天内产生的 400 万条行为记录。根据数据集内容的特点,主要从交通指数、用户类型指数、用户行为和用户购买商品四个方面进行分析。以下是本文的一些结论和建议。

    • 通过对流量指标的分析发现,虽然双 12 活动的预热使淘宝 APP 的访问量显著增加,但日常活跃用户和日常支付用户的比例有所下降,跳跃率也有小幅度上升,整体用户质量下降,表明活动流量的准确性不够。因此,建议对历史数据和业务目标进行分析,以确定是否需要改进和加强个性化推荐功能
    • 用户指数分析主要分析购买次数、回购率、回购率和保留率。通过对回购率的分析发现,淘宝正处于电子商务的忠诚模式中,商家的重点应放在顾客忠诚上,即鼓励忠诚的回头客更频繁地消费。其他指标可用来衡量和比较这 9 天用户的整体运作情况。如果有明显的增加或减少,需要进一步深入的拆卸分析
    • 在用户行为分析中,我们发现:
      (1). 用户使用 APP 有一定的时间规则。一周之内,用户在周末更加活跃,而一天之内,19-23 是用户活动的高峰。因此,在开展重要的营销活动时,建议不要错过这些时间点,以便能够接触到更多的活跃用户,从而达到更好的活动效果
      (2). 使用回收和购物车的用户组的支付转化率将显著高于不使用这两个功能的用户组。建议通过 AB 测试,以使用户更方便地使用收集和购物车功能
      (3). 绝大多数有购买意向的用户在购买、领取货物后 3 天内进行购买。因此,建议向用户发送关于已收货物和已购货物的促销活动的提醒。此外,使用者在 3 天后仍未购买车辆或领取货物,因此可提醒使用者及时购买,或建议使用者选择类似的货物
  • 就商品分析而言,在 9 天内,商品种类的购买次数反映了消费行业的 28 条规律,但大多数商品只购买过一次,没有热销的” 热钱”,商品的折合率也出现在两个集中区域。对于转化率低、曝光率高的商品,建议优化显示效果,提高用户购买体验,进而提出高转化率;对于转化率高、曝光率低的商品,建议优化曝光渠道,积极排放。同时,淘宝 APP 可以将一定的资源倾向于转化率高、曝光率高的商品,形成良性循环,同时也加强了对欺诈行为的监管

淘宝消费者行为分析实例(pandas, matplotlib, pyechart)(超详细)相关推荐

  1. Hive Sql 分析实例: 淘宝消费者行为分析

    本文侧重用 Hive SQL 处理数据 1. 数据集说明 这次分析用的数据是来自阿里云天池: 数据集来源:user_behavior 数据采用csv格式保存, 未解压前905MB, 解压后3.41G ...

  2. python爬虫实例电商_如何用代码爬抓电商数据(附淘宝API调用实例)

    原标题:如何用代码爬抓电商数据(附淘宝API调用实例) 欢迎关注天善智能 hellobi.com,我们是专注于商业智能BI,大数据,数据分析领域的垂直社区,学习.问答.求职,一站式搞定! 对商业智能B ...

  3. 如何用代码爬抓电商数据(附淘宝API调用实例)

    2019独角兽企业重金招聘Python工程师标准>>> 如何用代码爬抓电商数据(附淘宝API调用实例) http://www.21ds.cn/2190.html 转载于:https: ...

  4. 淘宝商品价格计算实例

    <!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8&quo ...

  5. 用微信公众号做淘宝优惠券查券和返利机器人的详细配置教程

    用微信公众号做淘宝优惠券查券和返利机器人的详细配置教程:微信公众号淘宝客机器人,微信公众号淘客系统自助搭建教程 一.淘宝联盟官方淘宝客私域渠道ID申请 1.登陆淘宝联盟 用需要开通淘宝联盟的手机淘宝扫 ...

  6. python商品销售情况数据分析_4-python数据分析-淘宝婴儿用品分析项目

    加载购买商品表的数据 购买商品表字段信息: 用户ID 商品ID 商品二级分类 商品一级分类 商品属性 购买数量 购买日期 importpandas as pdimportnumpy as npimpo ...

  7. SQL数据分析淘宝用户分析实操

    sql也能做分析? 常见的数据清洗,预处理,数据分类,数据筛选,分类汇总,以及数据透视等操作,用SQL一样可以实现(除了可视化,需要放到Excel里呈现).SQL不仅可以从数据库中读取数据,还能通过不 ...

  8. 淘宝RSA分析与学习

    淘宝,购物者的天堂.每天更有数以万计的用户登陆购买商品,其背后的技术支持,能让我们愉快的购物. 而前段时间吵得很火的,数据包劫持能够分析到你的各种行为,其中不乏网站账号密码.而为什么他们没有劫持到淘宝 ...

  9. 一、淘宝ua分析与学习之匿名函数

    写在前: 我属于比较懒段的非码农,在分析淘宝ua之前没正经学习过js,对js的理解也仅仅在与简单的运算表达式.由于最近项目上需要用到前端js,遂,开始慢慢关注js方面的文章.书籍.但是我太懒,都是三天 ...

  10. 软件系统架构质量属性——淘宝网分析

    一.可用性 可用性与系统故障及其相关后果有关 所关注的方面:如何检测系统故障,系统故障发生的频度,出现故障会发生什么情况,允许系统有多长时间非正常运行,什么时候可以安全地消除故障,如何防止故障的发生以 ...

最新文章

  1. Tomcat启动报内存溢出错误解决(两种)
  2. 矩阵字符串配置任意合并表格布局
  3. rsync常用参数组合
  4. 【Siddhi】Siddhi的window操作
  5. 2020年最好用的手机是哪一款_2020年入手5G手机最佳时期到了:5款最佳手机,您认可哪款...
  6. 严版快速排序Partion方法
  7. limit where group by having select
  8. 显控触摸屏与STC51单片机modbus通讯程序,包含触摸屏程序与c51代码
  9. SpringCloud OpenFeign调用第三方服务
  10. 23位子网掩码是多少_24位子网掩码,多少个IP地址
  11. 68个经典励志小故事|哲理小故事,让你终身受益(3)
  12. 【智能优化算法】改进的侏儒猫鼬优化算法(IDMO)附matlab代码
  13. 问题解决:ERROR: Cannot uninstall 'llvmlite'.
  14. 亚马逊运营爆款产品技巧-跨境知道
  15. 这一周通过了GoogleSummer of Code谷歌编程之夏
  16. 【解决方法】Win10还原默认打开方式图标
  17. 传奇人物张三的爱情困境
  18. 你选择双休还是单休?
  19. db2diag.log 详解
  20. 《致橡树》-- 舒婷

热门文章

  1. Linux 搭建 KMS 服务器
  2. node 请求内网_Nodejs轻松搭建局域网服务器
  3. nfc apdu指令_stm32——NFC芯片PN532的使用
  4. CFD:用软件完成流体仿真分析(step1)
  5. React09——使用脚手架编程
  6. 66天全部就业,最高薪资25000元!黑马Java学科真牛
  7. python pyhook监听扫码_Python2.7:使用Pyhook模块监听鼠标键盘事件-获取坐标实例
  8. conda和pip卸载包的注意事项
  9. 从生活中领悟设计模式(Python)
  10. Linux与Windows分区格式详解