目录
一、背景介绍
选取淘宝app平台2017年11月25日至2017年12月3日之间的数据集,通过行业的指标对淘宝用户行为进行分析,从而探索淘宝用户的行为模式和商品规律,具体指标包括:日PV、UV分析,付费率分析,复购行为分析,漏斗流失分析,用户价值RFM分析,各榜单top10的商品分析。
二、字段说明
用户ID :整数类型,序列化后的用户ID
商品ID:整数类型,序列化后的商品ID
商品类目ID :整数类型,序列化后的商品所属类目ID
行为类型 :字符串,枚举类型,包括('pv', 'buy', 'cart', 'fav') ,即:点击、购买、加购、喜欢
时间戳 :行为发生的时间戳
三、数据处理
1.导入库
import os
import pandas as pd
import numpy as np
import datetime
import matplotlib.pyplot as plt
from pyecharts import options as opts
from pyecharts.charts import Funnel,effectscatter
# from pyecharts.faker import Faker
from pyecharts.globals import ThemeType
import plotly.express as px
2.读取数据
os.chdir('E:\workSpace\dataProject\淘宝用户行为分析\data')
columns=["userid", 'itemid', 'categoryid', 'type', 'timestamp']
# 数据量过大,这里只选取前100w行
data=pd.read_csv('UserBehavior.csv',
engine='python',
encoding='utf-8',
names=columns,
chunksize=1000000,
iterator=True)
df=data.get_chunk(1000000)
3.查看数据
df.info()
df.head()
4.数据预处理
df['time']=pd.to_datetime(df['timestamp'],unit='s')+ datetime.timedelta(hours=8)#时区转换to_datetime的默认时区不是中国,所以要加8小时
# 数据集说明日期范围是2017年11月25日至2017年12月3日,剔除除该段时间外的数据
startTime=pd.to_datetime('2017-11-25 00:00:00')
endTime=pd.to_datetime('2017-12-3 23:59:59')
df=df[(df['time']>startTime) &( df['time']<endTime)]
df['date']=df['time'].dt.date
df['hour']=df['time'].dt.hour
df.drop(columns='timestamp',inplace=True)
df.head()
5 用户行为分析
5.1 整体情况
从整体数据来看,PV,UV,平均访问量,交易总数、交易用户比例,复购率和跳失率,用户流失分析(漏斗转换)
#查看整体情况
#pv
total_pv=df.shape[0]
# 独立访客数UV
total_uv=df['userid'].nunique()
# 有操作的商品
total_item=df['itemid'].nunique()
# 有操作的商品类目
total_category=df['categoryid'].nunique()
# 付费用户数
total_buy_user=df[df['type']=='buy'].userid.nunique()
# 非付费用户数
total_no_buy_user=total_uv-total_buy_user
#付费用户占比
buy_user_percent=round(total_buy_user/total_uv*100,2)
print('pv:{}\n独立访客数UV:{}\n有操作的商品:{}\n有操作的商品类目:{}\n付费用户数:{}\n非付费用户数:{}\n付费用户占比:{}%\n '.\
format(total_pv,total_uv,total_item,total_category,total_buy_user,total_no_buy_user,buy_user_percent)
)
5.2 行为类型
# 各行为类型数量
s_type=df.type.value_counts()
plt.figure()
# plt.pie(x=s_type.values,labels=s_type.index,radius=1.8,autopct='%.2f%%')
plt.bar(x=s_type.index,height=s_type.values)
plt.ylim(0,1000000)
for x,y in enumerate(s_type):
plt.text(x-0.2,y+10000,'%s'% y)
plt.ylabel('count')
plt.xlabel('type')
plt.show()
# 各行为的操作总数,每日平均操作数,每日平均操作用户数记录,付费用户的各行为数
df_total_type=pd.DataFrame([s_type],index=['total_type'])
df_avg_type=pd.DataFrame([s_type/9],index=['avg_type'])
df_avg_user=pd.DataFrame([s_type/total_uv],index=['avg_user'])
df_buyer_type=df[df.userid.isin(df[df['type']=='buy'].userid.unique())].type.value_counts()
df_buyer_type=pd.DataFrame([df_buyer_type],index=['buyer_type'])
pd.concat([df_total_type,df_avg_type,df_avg_user,df_buyer_type],sort=False)
#各用户的行为次数统计(交叉表)
corrtab_type=pd.crosstab(index=df['userid'],columns=df['type'],margins=True)
corrtab_type.tail()
5.3 跳失率和复购率
corrtab_type.columns=['buy', 'cart', 'fav', 'pv', 'All_type']
# 跳失率=只有点击行为的用户/总用户数
bounce_rate = round(corrtab_type[corrtab_type['pv']==corrtab_type['All_type']].shape[0]/corrtab_type.shape[0]*100,2)
print('跳失率:{:.1f}%'.format(bounce_rate))
# 复购率=购买2次及以上用户数/总购买用户数
repurchase_rate=round(corrtab_type[corrtab_type['buy']>=2].shape[0]/corrtab_type.shape[0]*100,2)
print('复购率:{:.1f}%'.format(repurchase_rate))
结论:复购率较高,跳失率低,说明淘宝对用户还是比较有吸引力的
5.4 用户转化漏斗分析
# 转化路径:点击-收藏-购买;点击-加购-购买;
df_pv=df[df['type']=='pv']
df_fav=df[df['type']=='fav']
df_cart=df[df['type']=='cart']
df_buy=df[df['type']=='buy']
# 点击-收藏
df_pv_fav=pd.merge(df_pv,df_fav,on=['userid','itemid','categoryid'],how='inner',suffixes=['_pv','_fav'])
count_pv_fav=df_pv_fav[df_pv_fav['time_pv']<df_pv_fav['time_fav']]['userid'].nunique()
# 收藏-购买
df_fav_buy=pd.merge(df_fav,df_buy,on=['userid','itemid','categoryid'],how='inner',suffixes=['_fav','_buy'])
count_fav_buy=df_fav_buy[df_fav_buy['time_fav']<df_fav_buy['time_buy']]['userid'].nunique()
# 点击-加购
df_pv_cart=pd.merge(df_pv,df_cart,on=['userid','itemid','categoryid'],how='inner',suffixes=['_pv','_cart'])
count_pv_cart=df_pv_cart[df_pv_cart['time_pv']<df_pv_cart['time_cart']]['userid'].nunique()
# 加购-购买
df_cart_buy=pd.merge(df_cart,df_buy,on=['userid','itemid','categoryid'],how='inner',suffixes=['_cart','_buy'])
count_cart_buy=df_cart_buy[df_cart_buy['time_cart']<df_cart_buy['time_buy']]['userid'].nunique()
# 点击-收藏/加购的转化率
print('点击-收藏/加购的转化率:{:.1f}%'.format((count_pv_fav+count_pv_cart)/total_uv*100))
# 收藏/加购-购买的转化率
print('收藏/加购-购买的转化率:{:.1f}%'.format((count_fav_buy+count_cart_buy)/total_uv*100))
5.5 时间维度分析
5.5.1 11月17日-12月3日各行为人数统计
df_type_date=df.groupby(by=['type','date'])['userid'].nunique().reset_index().rename(columns={'userid':'count'})
px.line(data_frame=df_type_date,x='date',y='count',color='type',title='11月17日-12月3日各行为人数统计')
结论:购买人数和加购人数呈正相关,12月2、3日有点击、加购、收藏、购买行为的人数均有所增长,可能是由于周末且双十二临近的关系
5.5.2 各时段用户行为统计
df_type_time=df.groupby(by=['hour','type']).userid.nunique().reset_index().rename(columns={'userid':'count'})
df_type_time.head()
px.line(data_frame=df_type_time,x='hour',y='count',color='type')
结论:晚上7点到11点是用户点击量行为的高峰期,此时用户加购量也随之增加,但下午1点却是用户下单的高峰期。因此,如果商家想以增长曝光度为目的,可以在晚上7点到11点之间做活动,如果是以提高营收为目的的活动,则可以在下午1点左右开始。
5.5.3 每日活跃用户、付费人数、独立用户数变化趋势
# 每日活跃用户数
active_user_norm=3 #定义活跃用户数为当天使用淘宝进行3次操作
df_user_info=df.groupby(by=['userid','date']).count().type.reset_index().rename(columns={'type':'count_num'})
df_date_active=df_user_info[df_user_info.count_num>active_user_norm].groupby(by='date').userid.count()
df_date_active
# 每日独立用户数
df_date_uv=df.groupby(by='date').userid.nunique()
df_date_uv
# 每日付费人数
df_date_buy=df[df['type']=='buy'].groupby(by='date').userid.nunique()
df_date_buy
df_date=pd.DataFrame([df_date_uv,df_date_active,df_date_buy],index=['uv','active','buy'])
df_date=df_date.T
px.line(data_frame=df_date,x=df_date.index,y=['uv','active','buy'])
5.5.4 用户累计活跃天数
df_active_date=df_user_info[df_user_info.count_num>active_user_norm].groupby(by='userid').count().count_num.value_counts().sort_index()
df_active_date=df_active_date.reset_index().rename(columns={'index':'date','count_num':'num'})
px.bar(data_frame=df_active_date,x='date',y='num')
结论:活跃天数在4-8天的人较多
5.6 用户价值分析
# RFM
# R 最近一次交易距离14月4日的天数
df_last_buy_date=df_buy.groupby(by=['userid'])['date'].max().reset_index()
df_last_buy_date.date=(pd.datetime(2017,12,4)-pd.to_datetime(df_last_buy_date.date)).map(lambda x:x.days)
df_last_buy_date.rename(columns={'date':'recent_date'},inplace=True)
df_last_buy_date
# F 购买频率
df_fre=df_buy.groupby(by='userid').type.count().reset_index().rename(columns={'type':'frequence'})
df_fre
# M 购买金额
# 数据集不含金额,不讨论该项
# 对R进行打分
def get_r_score(x):
if 0 <= x <= 1:
return 4
elif 2 <= x <= 3:
return 3
elif 4 <= x <= 6:
return 2
elif 7 <= x <= 9:
return 1
else:
return 0
# 对F打分
def get_f_score(x):
if x == 1:
return 1
elif x == 2:
return 2
elif x == 3:
return 3
elif x >= 4:
return 4
else:
return 0
df_RF=df_last_buy_date.merge(df_fre)
df_RF['r_score']=df_RF.recent_date.apply(get_r_score)
df_RF['f_score']=df_RF.frequence.apply(get_f_score)
df_RF['r_score_mean']=df_RF['r_score']>df_RF['r_score'].mean()
df_RF['f_score_mean']=df_RF['f_score']>df_RF['f_score'].mean()
# 用户价值类型
def get_user_cat(x):
if (x['r_score_mean']==True) & (x['f_score_mean']==True):
return '重要价值客户'
elif (x['r_score_mean']==True) & (x['f_score_mean']==False):
return '重要发展客户'
elif (x['r_score_mean']==False) & (x['f_score_mean']==True):
return '重要保持客户'
elif (x['r_score_mean']==False) & (x['f_score_mean']==False):
return '重要挽留客户'
else:
return None
df_RF['user_cat']=df_RF.apply(get_user_cat,axis=1)
df_RF.head()
# 用户价值分类统计
df_RF.user_cat.value_counts(1)
结论:根据RFM模型对用户分类后发现重要价值、重要挽留客户比例最高,其次是重要发展用户,淘宝作为成熟的电子商务平台,重要价值客户达到了一定的比例,在其他电商平台相继发展的大环境下,淘宝应该注重重要挽留客户,适当推出一些营销活动重要挽留客户,同时,需要提高社群管理的效率,将重要保持客户和重要发展客户转变为重要价值客户。
6 商品销售分析
6.1 商品统计
6.1.1 销量前十的商品种类
def get_top_10(df,type='buy',classfication='categoryid'): #返回前十的商品种类categoryid or 商品itemid
df_group=df[df['type']==type].groupby(classfication).count()
df_top_10=df_group.sort_values(by='userid',ascending=False).loc[:,['userid']][:10] #df类型
df_top_10.rename(columns={'userid':type},inplace=True)
return df_top_10
# 销量前十的商品种类
df_top_buy=get_top_10(df,'buy','categoryid')
df_top_buy
# pv前十的商品种类
df_top_pv=get_top_10(df,'pv','categoryid')
df_top_pv
# 收藏前十的商品种类
df_top_fav=get_top_10(df,'fav','categoryid')
df_top_fav
# 加购前十的商品种类
df_top_cart=get_top_10(df,'cart','categoryid')
df_top_cart
#销量前十的商品种类的pv,fav,cart情况对比
df_top_buy.merge(df_top_pv,how='left',left_index=True, right_index=True)\
.merge(df_top_fav,how='left',left_index=True, right_index=True)\
.merge(df_top_cart,how='left',left_index=True, right_index=True)
结论:点击、收藏、加购的前十种商品种类重合度较高,对于部分品类商品而言,虽然能吸引许多用户,但是购买转化率却相对较低,这部分产品的转化率有释放空间。
6.1.1.2 销量前十的商品种类的转化率
df_top_buy
cat_list=df_top_buy.index
#销量榜前十的商品pv\fav\cart信息
def buy_goods(df,type,classfication,goods_list):
df_group=df[(df.type==type)&(df[classfication].isin(goods_list))].groupby(by=classfication).count()
df_res=df_group.loc[:,['userid']].reindex(goods_list).fillna(0)
df_res.rename(columns={'userid':type},inplace=True)
return df_res
#销量榜前十的商品pv信息
df_goods_pv=buy_goods(df,type='pv',classfication='categoryid',goods_list=cat_list)
df_goods_pv
#销量榜前十的商品fav信息
df_goods_fav=buy_goods(df,type='fav',classfication='categoryid',goods_list=cat_list)
df_goods_fav
#销量榜前十的商品cart信息
df_goods_cart=buy_goods(df,type='cart',classfication='categoryid',goods_list=cat_list)
df_goods_cart
df_conversion_rate=df_top_buy.merge(df_goods_pv,how='left',left_index=True, right_index=True)\
.merge(df_goods_fav,how='left',left_index=True, right_index=True)\
.merge(df_goods_cart,how='left',left_index=True, right_index=True)
df_conversion_rate['pv_rate']=df_conversion_rate.apply(lambda x:x.buy/x.pv,axis=1)
df_conversion_rate['fav_rate']=df_conversion_rate.apply(lambda x:x.buy/x.fav,axis=1)
df_conversion_rate['cart_rate']=df_conversion_rate.apply(lambda x:x.buy/x.cart,axis=1)
df_conversion_rate # 转化率
结论:
- pv-buy的转化率,总体来说转化率较低,可能因为同一类商品包含很多种商品,用户可能会比价,可优化推荐算法。
- fav-rat、cart_rate中2735466、1464116、2885642、2640118都是转化率较高的种类,可能是该商品的特定群体,可以收集用户信息,分析用户画像,结合商品特点。
6.1.2 销量前十的商品
# 销量榜前十的商品
df_top_buy_item=get_top_10(df,'buy','itemid')
df_top_buy_item
item_list=df_top_buy_item.index
df_top_pv_item=buy_goods(df,'pv','itemid',item_list)
df_top_pv_item
df_top_fav_item=buy_goods(df,'fav','itemid',item_list)
df_top_fav_item
df_top_cart_item=buy_goods(df,'cart','itemid',item_list)
df_top_cart_item
## 销量榜前十的商品 pv,fav,cart情况
df_item=df_top_buy_item.merge(df_top_pv_item,how='left',left_index=True,right_index=True)\
.merge(df_top_fav_item,how='left',left_index=True,right_index=True)\
.merge(df_top_cart_item,how='left',left_index=True,right_index=True)
df_item['pv_rate']=df_item['buy']/df_item['pv']
df_item
结论:
- 3122135、2124040、1910706、1004046转化率高,分析目标群体,可以对该用户群体多推送;
- 转化率一般的,在(0.15,0.6]区间的,可以考虑吸引潜在用户,电商平台应该重点推送该商品;
- 转化率小于0.15的可以从商品本身进行分析,可能是广告推广给了非目标用户,或者定价过高
7 总结
- 在2017年11月25日至2017年12月3日这段时间内,淘宝用户的复购率相对较高,跳失率低,说明淘宝对用户有着较好的留存效果。
- 从用户转化角度看,收藏/加购->购买的转化率较低
- 购买人数在12月2、3日有有所增长,可能是由于周末且双十二临近的关系。晚上7点到11点是用户点击量行为的高峰期,此时用户加购量也随之增加,但下午1点却是用户下单的高峰期。因此,如果商家想以增长曝光度为目的,可以在晚上7点到11点之间做活动,如果是以提高营收为目的的活动,则可以在下午1点左右开始。
- 从商品角度看,虽然商品点击量、收藏量、加购量前十的商品呈现出一定的差距,但成交量前十的商品差距却不大。且成交量前十的商品中有近一半商品未在另外3个榜单之中。
- 淘宝的用户留存量较高,但消费潜能却有待释放。要想办法提高用户购买率,一方面是促进收藏加购用户朝付费用户的转化,另一方面是促进浏览不购买的用户对商品的兴趣从而促进商品的销量。