1 背景介绍

上一篇文章https://zhuanlan.zhihu.com/p/91598168,使用MySQL对数据进行处理,这一篇文章使用Python的Pandas包对数据进行处理和可视化展现。 (推荐使用SQL,语法结构清晰。使用Pandas的话,构造布尔索引、分组后计数等比较麻烦。)

2 数据源介绍

数据源是天池竞赛的数据,包含2017年11月25日至2017年12月3日之间的用户行为数据。用户数大约100万,数据集记录数大约1亿。

3 分析目标

电商行业的主要分析目标有:用户、商品、网站分析、购买行为等。分析方法有:对比分析、分组分析、结构分析、矩阵分析等分析方法。

分析模型有:漏斗模型、AARRR模型、RFM模型等。

3.1 目标&需求

根据数据集已有的字段,分析目标如下:网站分析:页面浏览量PV、访客数UV、跳失率。

用户分析:购买用户数、购买次数、复购率。

商品分析:销售量排名、产品类别分布、复购率高的商品。

购买行为分析:点击、添加购物车、购买、各环节转化率。

4 数据清洗&数据处理

本次使用Pandas处理,一共有5列:userId, itemId, categoryId, behaviorType, timestamp。使用read_csv函数载入了前100万条记录。

导入数据集:

import pandas as pd

import time

# 1,导入数据集

names = ['userId', 'itemId', 'categoryId', 'behaviorType', 'timestamp'] # 构造字段名称

data = pd.read_csv(r'D:\behavior\UserBehavior.csv', nrows=1e6, names=names) # 导入前100万数据

开始数据清洗:

# 检查重复值:
print(data.duplicated(subset=['userId']))
# 检查缺失值:
print(data[data['userId'].isnull()])
# 添加时间相关的列:
data['time'] = data.timestamp.apply(lambda x: time.ctime(x)).astype('datetime64') # 增加字段:时间
data['date'] = data.time.dt.date # 增加字段:天
data['hour'] = data.time.dt.hour # 增加字段:小时
# 删除异常值:
print(data.time.dt.date.value_counts()) # 检查是否有时间范围不合规的数据
data.drop(data[(data.timestamp < 1511539200) | (data.timestamp >= 1512316800)].index, inplace=True) # 删除时间不在范围的数据

注意:(1)时间戳1511539200代表'20017-11-25 00:00:00';(2)竖线|表示条件或;

经过数据清洗后,数据如下:

5 统计分析&可视化

5.1 网站分析

页面浏览量和访客数:

pv = data.loc[data['behaviorType'] == 'pv', 'userId'].count()
uv = data.loc[data.duplicated(subset=['userId']) == False, 'userId'].count()
pv_day = data[data.behaviorType == 'pv'].groupby(by='date').agg({'userId': 'count'})
pv_hour = data[data.behaviorType == 'pv'].groupby(by='hour').agg({'userId': 'count'})
uv_day = data.drop_duplicates(subset=['userId'])[data.behaviorType == 'pv'].groupby(by='date').agg({'userId': 'count'})
uv_hour = data.drop_duplicates(subset=['userId'])[data.behaviorType == 'pv'].groupby(by='hour').agg({'userId': 'count'})

备注:如果觉得代码长,实际操作时可以分步骤做。

每用户访问页面:pv/uv≈92。

统计分析:在这100万数据中,有895636次访问,9739个独立访客,平均每个用户访问了92个页面。图-pv和uv的日走势

5.2 用户分析

有购买行为用户总数、各个用户的购买次数:

buy = data.loc[data['behaviorType'] == 'buy', :]
buyers = buy.drop_duplicates(subset=['userId']).count() # 购买人数
orders = buy['userId'].count() # 订单数量
buyer_sort = pd.value_counts(buy.userId) # 各个用户的订单数排序
print(buyer_sort.describe()) # 有购买行为的用户的描述性统计
order_date = buy.groupby(by='date').agg({'userId': 'count'}) # 每天的订单数
buyer_date = buy.drop_duplicates(subset=['userId']).groupby(by='date').agg({'userId': 'count'}) # 每天的购买用户数
order_hour = buy.groupby(by='hour').agg({'userId': 'count'}) # 各个时段的订单数
buyer_hour = buy.drop_duplicates(subset=['userId']).groupby(by='hour').agg({'userId': 'count'}) # 各个时段的购买用户数

统计分析:有6689个用户发生购买行为。最高购买次数为72次,最低购买次数为1次,平均购买次数为3.0,总共购买次数为20359。图-各时段的uv

5.3 商品分析

各个商品购买次数、各个商品类别的购买次数:

buy = data.loc[data['behaviorType'] == 'buy', :]
buyers = buy.drop_duplicates(subset=['userId']).count() # 购买人数
orders = buy['userId'].count() # 订单数量
buyer_sort = pd.value_counts(buy.userId) # 各个用户的订单数排序
print(buyer_sort.describe()) # 有购买行为的用户的描述性统计
order_date = buy.groupby(by='date').agg({'userId': 'count'}) # 每天的订单数
buyer_date = buy.drop_duplicates(subset=['userId']).groupby(by='date').agg({'userId': 'count'}) # 每天的购买用户数
order_hour = buy.groupby(by='hour').agg({'userId': 'count'}) # 各个时段的订单数
buyer_hour = buy.drop_duplicates(subset=['userId']).groupby(by='hour').agg({'userId': 'count'}) # 各个时段的购买用户数

统计分析:总共有17565件商品被购买,最大购买次数为17,最小购买次数为1,平均被购买1.16次,总共被购买20359次。商品种类一共有2513种商品。

5.4 购买行为分析

商品点击、添加到购物车、商品购买:

print(data.behaviorType.value_counts())图-注册->加入购物车->购买的漏斗图

统计分析:有895636次访问,28088次添加收藏,55447次添加到购物车,20359次购买。

6 结论和建议