1.提出问题
1)每天的访问量是多少?
2)每天的访客数是多少?
3)每天的平均访问量是多少?
4)每天新增用户数是多少?
5)转化率是多少?
6)复购率是多少?包括复购用户量、复购率和复购金额比
7)GMV = UV * 转化率 * 客单价 (无订单数据信息,这里不做分析)
2. 理解数据
1)数据来源
https://tianchi.aliyun.com/dataset/dataDetail?dataId=649
本数据集包含了2017年11月25日至2017年12月3日之间,有行为的约一百万随机用户的所有行为(行为包括点击、购买、加购、喜欢)。数据集的每一行表示一条用户行为,由用户ID、商品ID、商品类目ID、行为类型和时间戳组成,并以逗号分隔。一共100150807 条行为数据,其中包含:用户数量 - 987994,商品数量 - 4162024,商品类目数量 - 9439
2)数据字段信息说明:
注意到用户行为共有四种,分别是:
3. 数据清洗
import pandas as pd
import numpy as np
import time
import datetime
import matplotlib.pyplot as plt
plt.rcParams['font.sans-serif']=['SimHei'] #用来正常显示中文标签
filePath = r'F:数据分析数据UserBehavior.csv'
df = pd.read_csv(filePath,names=['userId','itemId','categoryId','behaviorType','timestamp'], encoding='utf-8' ,engine='python',iterator=True)
#1、选取样本,这里数据集量大,选取5000000条数据分析
data = df.get_chunk(5000000)
data.head()
#2.重复数据处理
data = data.drop_duplicates()
#3.缺失数据处理
data = data.dropna()
#4.数据类型转换
#数据类型查看
data.dtypes
#将时间戳转换为时间
def stamp2time(timestamp):
return time.strftime('%Y-%m-%d',time.localtime(timestamp))
data['datestamp'] = data['timestamp'].apply(stamp2time)
#转成datetime
data['datestamp'] = pd.to_datetime(data['datestamp'])
#5.数据排序
#按时间进行升序排序
data = data.sort_values(by='datestamp',ascending=True,na_position='first')
#6.异常值处理,去除2017年11月25日至2017年12月3日之之外
dt1 = datetime.datetime(year=2017,month=11,day=25);
dt2 = datetime.datetime(year=2017,month=12,day=3);
data = data[(data.datestamp>=dt1) & (data.datestamp<=dt2)]
4. 构建模型
业务指标1:每天的访问量是多少
pvData = data[data.behaviorType=='pv'].groupby(by=['datestamp'])['timestamp'].count().reset_index()
pvData.rename(columns = {'datestamp':'日期','timestamp':'访问量'},inplace=True)
pvData['日期'] = pvData['日期'].dt.strftime('%m-%d')
# 建立一个坐标轴
plt.subplot(1,1,1)
#指明x和y的值
x = pvData["日期"]
y = pvData["访问量"]
# 绘图
plt.plot(x,y,color="r",label="访问量")
# 设置标题
plt.title("玲光公司11月25日~12月3日访问量",loc="center")
# 设置x/y轴名称
plt.xlabel("日期")
plt.xlabel("访问量")
# 设置x/y轴的坐标轴范围
plt.ylim(300000,700000)
# 设置图例
plt.legend()
可以看到,12月2日和12月3日用户访问量明显增多,这两天为周末,但是11月25日和11月26日同为周末,但其访问量也只是与11月30日和12月1日持平。猜测12月2日和12月3日这两天电商平台有做促销活动引流,或者有新渠道加入让新客涌入。
业务指标2:每天的访客数是多少
user = data[['userId','datestamp']].drop_duplicates()
uvData = user.groupby(by=['datestamp'])['userId'].count().reset_index()
uvData.rename(columns = {'datestamp':'日期','userId':'访客数'},inplace=True)
uvData['日期'] = uvData['日期'].dt.strftime('%m-%d')
# 建立一个坐标轴
plt.subplot(1,1,1)
#指明x和y的值
x = uvData["日期"]
y = uvData["访客数"]
# 绘图
plt.plot(x,y,color="r",label="访客数")
# 设置标题
plt.title("玲光公司11月25日~12月3日访客数",loc="center")
# 设置x/y轴名称
plt.xlabel("日期")
plt.xlabel("访客数")
# 设置x/y轴的坐标轴范围
plt.ylim(20000,60000)
# 设置图例
plt.legend()
其访客数与访问量趋势一致,12月2日和12月3日购物的用户人数较平时增加了约34%,猜测这两天访问量增加是访客数增加所致。
业务指标3:每天的人均访问量是多少?
meanDayPv = pd.merge(pvData,uvData,how='inner',on='日期')
meanDayPv['人均访问量'] = meanDayPv["访问量"].div(meanDayPv["访客数"])
每天每个用户的平均访问量基本约为13,12月2日和12月3日也没有增加,说明12月2日和12月3日这两天访问量增加只是因为访客数增加。
业务指标4:每天新增用户数是多少?
#用户按日期排序
user['datestamp'] = user['datestamp'].dt.strftime('%m-%d')
user = user.sort_values(by='datestamp',ascending=True,na_position='first')
#重置索引
user = user.reset_index(drop=True)
n_user = []
newUser = pd.DataFrame(index=['新增用户数'],columns=uvData.日期)
newUser = newUser.fillna(0)
index = 0
for i in user.index:
if user.loc[i,'userId'] not in n_user:
datestamp = user.loc[i,'datestamp']
newUser[datestamp] = newUser[datestamp]+1
n_user.append(user.loc[i,'userId'])
index = index + 1
newUser = newUser.T
新增用户数统计:
可以看到,12月2日和12月3日,访客数最多的时候,基本没有新增用户,所以不是因为新客涌入导致访客数增加。
业务指标5:转化率是多少?
1)用户行为漏斗分析
#pv总量
pvCount = pvData['访问量'].sum()
#fav总量
favCount = data[data.behaviorType=='fav']['userId'].count()
#cart总量
cartCount = data[data.behaviorType=='cart']['userId'].count()
#buy用户总量
buyCount = data[data.behaviorType=='buy']['userId'].count()
effData = pd.DataFrame([[pvCount,favCount,cartCount,buyCount]],index=['人数'],columns=['点击','收藏','加购物车','购买'])
effData = effData.T
#计算转化率
effData['转化率'] = effData/effData.iloc[0]
# 建立一个柱形图
plt.figure(figsize=(12,4),dpi=80)
#指明x和y值
x = effData.index.tolist()
y = (round(effData['转化率']*100,2)).tolist()
#作图
rects = plt.barh(x[::-1],y[::-1],color="r",height=0.5,align="center",label="转化率")
# 设置标题
plt.title("玲光公司11月25日~12月3日用户行为漏斗")
# 添加数据标签
i = 0
for rect in rects:
width = rect.get_width()
plt.text(width+0.2, rect.get_y()+rect.get_height()/2,(str(width)+''+'%'),va='center')
#显示图例
plt.legend()
可以看到,从点击到最后转化为购买行为,转化率仅为2.24%,收藏和加入购物车转化率也很低,分别为3.24%与6.25%。造成这种结果的原因可能是用户花了大量的时间去寻找合适的商品,那么是什么原因导致用户需要花大量时间来寻找商品呢?可以猜测可能的原因:1. 商品分类不明确,商品目录层级不够,不足以让用户快速找到商品,针对这种情况,需要调整电商平台商品目录分层结构,放商品分类更详细;2. 电商平台筛选功能不能满足用户的需求,这种情况就需要优化平台的筛选功能,使用户更容易找到合适的商品。
2)独立访客行为分析
#pv用户总量
pvUser = data[['userId','datestamp']].drop_duplicates().reset_index(drop=True)
pvUserCount = pvUser['userId'].drop_duplicates().count()
#fav用户总量
favUser = data[data.behaviorType=='fav'][['userId','datestamp']].drop_duplicates()
favUserCount = favUser['userId'].drop_duplicates().count()
#cart用户总量
cartUser = data[data.behaviorType=='cart'][['userId','datestamp']].drop_duplicates()
cartUserCount = cartUser['userId'].drop_duplicates().count()
#buy用户总量
buyUser = data[data.behaviorType=='buy'][['userId','datestamp']].drop_duplicates()
buyUserCount = buyUser['userId'].drop_duplicates().count()
effUserData = pd.DataFrame([[pvUserCount,favUserCount,cartUserCount,buyUserCount]],index=['人数'],columns=['点击','收藏','加购物车','购买'])
effUserData = effUserData.T
# 建立一个柱形图
plt.plot(1,1,1)
#指明x和y值
x = effUserData.index.tolist()
y = effUserData['人数']
#作图
plt.bar(x,y,color="r",width=0.5,align="center",label="人数")
# 设置标题
plt.title("玲光公司11月25日~12月3日独立用户行为统计",loc="center")
# 添加数据标签
for a,b in zip(x,y):
plt.text(a,b,b,ha="center",va="bottom",fontsize=12)
# 设置x/y轴的名称
plt.xlabel("行为")
plt.ylabel("人数")
# 设置x/y轴的坐标轴范围
plt.ylim(0,60000)
#显示图例
plt.legend()
从独立用户行为来看,从点击到最后购买,转化率为68%,用户购买意愿很强。
业务指标6:复购率是多少?复购率=一段时间内,消费次数大于等于两次以上的人数/总的用户数
#用户购买次数统计
buyTimes = buyUser.groupby(by=['userId'])['userId'].agg({'购买次数':np.size})
userBuyTimes = buyTimes.groupby(by=['购买次数'])['购买次数'].agg({'人数':np.size}).reset_index()
# 建立一个柱形图
plt.plot(1,1,1)
#指明x和y值
x = userBuyTimes['购买次数']
y = userBuyTimes['人数']
#作图
plt.bar(x,y,color="r",width=0.5,align="center",label="人数")
# 设置标题
plt.title("玲光公司11月25日~12月3日购买次数统计",loc="center")
# 添加数据标签
for a,b in zip(x,y):
plt.text(a,b,b,ha="center",va="bottom",fontsize=12)
# 设置x/y轴的名称
plt.xlabel("购买次数")
plt.ylabel("人数")
# 设置x/y轴的坐标轴范围
plt.xlim(0,10)
plt.ylim(0,20000)
plt.xticks(x)
#显示图例
plt.legend()
复购率为 54.89%
5. 结论
1,2017年11月25日至2017年12月3日期间,12月2日和12月3日访问量和访客数比前面7天明显上升,但每天人均访问数基本一致。访客数增加导致访问量增加。而同时,这两天访客数最多的时候,却基本没有新增用户。所以猜测,12月2日和12月3日,电商平台有做促销活动吸引流量而不是新增渠道增加新客。
2,从用户行为漏斗分析来看,从点击到最后转化为购买行为,转化率仅为2.24%,收藏和加入购物车转化率也很低,分别为3.24%与6.25%,可能是用户花了大量的时间去寻找合适的商品。针对当前情况,改善转化建议:1)整电商平台商品目录分层结构,使商品分类更详细,更明确;2)优化平台的筛选功能,使用户更容易找到合适的商品。从独立访客行为来看,用户购买意愿很强。