接下来按照时间点分析用户的行为习惯:
pv_hour=data.groupby('hour')['user_id'].count().reset_index().rename(columns={'user_id':'pv'})
uv_hour=data.groupby('hour')['user_id'].apply(lambda x:x.drop_duplicates().count()).reset_index().rename(columns={'user_id':'uv'})
x=pv_hour["hour"]
y1=pv_hour["pv"]
y2=uv_hour["uv"]
plt.figure(figsize=(10,6))
plt.plot(x,y1,label="pv")
plt.legend(loc=6)
plt.twinx()
plt.plot(x,y2,label="uv",color='r')
plt.legend(loc=2)
从上图可发现:从19点开始用户行为数稳步上升,21、22点是一天的最高峰,23点开始有所下滑,1点至7点之间用户行为数都很少,7点后缓慢上升,到中午13点左右有一个小高峰,然后17、18点是个低谷。
这跟人们的睡眠、通勤、吃饭等时间点比较吻合,所以平台上新或者开展活动时间最好根据用户行为习惯,选择20点至23点之间的流量高峰期。
4.1.2 平均访问深度和跳失率
uv_count = data.user_id.nunique()
pv_count = data[data.behaviour_type == 'pv'].shape[0]
print('平均访问深度是 %.1f' % (pv_count / uv_count))
pv_count_perUser = data[data['behaviour_type'] == 'pv'].groupby('user_id')['behaviour_type'].count().reset_index().rename(columns = {'behaviour_type':'pv_count'})
计算只浏览过一次界面的用户数量
bounce_user_count = pv_count_perUser[pv_count_perUser['pv_count'] == 1].shape[0]
print('跳失率是 %.3f%% ' % (100 * (bounce_user_count / uv_count)))
平均访问深度是 92.1 跳失率是 0.086%
可以得到用户的平均访问深度为92.1,也就是说在11月25到12月3日9天内平均每个用户每天要访问10个界面,可见淘宝用户粘度很高。
按照 跳失率=只浏览一次界面/总用户 计算的话,发现Bounce Rate 只有 0.086% 左右,平台整体流失率相当低。
4.1.3 用户转化情况
了解一下用户浏览、收藏、加购物车和购买行为的整体分布趋势。
#不同行为类型用户pv分析
import seaborn as sns
pv_detail=data.groupby(['behaviour_type','hour'])['user_id'].count().reset_index().rename(columns={'user_id':'total_pv'})
plt.subplots(figsize = (10,5))
sns.pointplot(data=pv_detail,hue='behaviour_type',x='hour',y='total_pv')
另外三条不是很清晰,再画一次。
plt.subplots(figsize = (10,5))
sns.pointplot(data=pv_detail[pv_detail.behaviour_type!='pv'],hue='behaviour_type',x='hour',y='total_pv')
四种用户行为的波动情况基本一致,其中浏览页面pv数远大于其他三项,用户加购物车、收藏和购买数依次降低,可以通过漏斗模型整体分析用户转化情况。
data['behaviour_type'].value_counts().sort_values()
buy 24363
fav 33294
cart 66145
pv 1075608
Name: behaviour_type, dtype: int64
from pyecharts import Funnel
attrs = ['pv','cart','fav','buy']
attr_value = [1075608,66145,33294,24363]
fun= Funnel("用户行为漏斗图",title_pos='center')
fun.add(name="商品交易环节", # 指定图例名称
attr=attrs, # 指定属性名称
value = attr_value, # 指定属性所对应的值
is_label_show=True, # 指定标签是否显示
label_formatter='{c}%', # 指定标签显示的格式
label_pos="outside", # 指定标签的位置
legend_orient='vertical', # 指定图例的方向
legend_pos='left', # 指定图例的位置
is_legend_show=True) # 指定图例是否显示
fun.render()
fun
最后购买的转换率为2.27%左右。
统计每个行为的独立用户数,计算是UV到各环节的转化率:
#独立访客数UV
uv=data['user_id'].unique().shape[0]
#有过点击行为的用户数即pv
pv0=data[data["behaviour_type"]=="pv"]["user_id"].drop_duplicates()
pv=pv0.shape[0]
#有过加购物车行为的用户数即cart
cart0=data[data["behaviour_type"]=="cart"]["user_id"].drop_duplicates()
cart=cart0.shape[0]
#有过收藏行为的用户数即fav
fav0=data[data["behaviour_type"]=="fav"]["user_id"].drop_duplicates()
fav=fav0.shape[0]
#有过购买行为的用户数即buy
buy0=data[data["behaviour_type"]=="buy"]["user_id"].drop_duplicates()
buy=buy0.shape[0]
#每个行为的独立用户数
uniqueuser=pd.Series([uv,pv,cart,fav,buy],
index=['uv','pv','cart','fav','buy'])
uniqueuser
uv 11675
pv 11636
cart 8775
fav 4603
buy 8007
dtype: int64
attrs = ['uv','pv','cart','fav','buy']
attr_value = uniqueuser.values
fun1= Funnel("用户行为漏斗图",title_pos='center')
fun1.add(name="商品交易环节", # 指定图例名称
attr=attrs, # 指定属性名称
value = attr_value, # 指定属性所对应的值
is_label_show=True, # 指定标签是否显示
label_formatter='{c}%', # 指定标签显示的格式
label_pos="outside", # 指定标签的位置
legend_orient='vertical', # 指定图例的方向
legend_pos='left', # 指定图例的位置
is_legend_show=True) # 指定图例是否显示
fun1.render()
fun1
可以看到uv到最终购买的转化率为68.58%,流失率为31.42%。
对于流失率,电商平台要结合行业数据,以及以往数据,分析流失率是否是正常范围。
上面近32%的“流失用户”中,有的可能在不久的将来还会成为购买用户,因为有的加购或收藏了商品;但是上文提到的“跳失用户”只进行了一次点击,再成为活跃用户的可能性很小。
(二)用户消费习惯分析
4.2.1 用户付费率PUR(Paying User Rate)
根据 用户付费率 = 有购买记录的用户 / 活跃用户 计算:
# 用户付费率分析
paying_user_count = data[data.behaviour_type == 'buy'].user_id.nunique()
print('用户付费率是 %.2f%%' % ( 100 * paying_user_count / uv_count))
用户付费率是 68.58%
4.2.2 用户购买次数
根据 总购买次数 / 总付费用户 计算:
# 用户购买次数情况分析
import matplotlib.pyplot as plt
#用户,购买次数
user_buy=data[data.behaviour_type=='buy'].groupby('user_id')['behaviour_type'].count().reset_index().rename(columns={'behaviour_type':'cnt'})
#根据次数再分组画图
ub=user_buy.groupby('cnt')['user_id'].count()
plt.bar(ub.index,ub.values)
cnt
1 2699
2 1876
3 1253
4 742
5 460
6 299
7 209
8 123
9 85
10 58
由上图可知,购买次数为1次的用户数量最多
4.2.3 用户复购率
根据 用户复购率 = 多次购买用户数 / 总付费用户 计算:
#复购用户数量 通过筛选支付次数>=2
paying_retention_user_count = user_buy[user_buy['cnt'] >= 2]['user_id'].count()
print('复购率是 %.2f%%' % (100 * paying_retention_user_count / paying_user_count))
复购率是 66.29%
4.2.4 用户复购的间隔时间
#计算用户复购的间隔时间
buy=data[data.behaviour_type=='buy'].groupby(['user_id','date'])['item_id'].count().reset_index()
buy_day=buy.groupby('user_id').date.apply(lambda x:x.diff(1).dropna())
buy_day=buy_day.map(lambda x:x.days)
buy_day
user_id
100 1 2
2 1
117 4 1
5 1
6 1
..
1017938 15947 1
1017960 15950 4
15951 2
1017972 15954 4
1017997 15956 6
Name: date, Length: 7951, dtype: int64
buy_day.value_counts().plot(kind='bar')
4.2.5 商品销售分析
对于一类商品,衡量其市场情况,应该同时分析点击量和购买量。关于这个问题的探讨,先分别按“item_id”和“product_id”统计点击量和购买量,通过散点图看相关性。
(1)先看“item_id”的点击量和购买量整体情况:
pv_item=data[data["behaviour_type"]=="pv"].groupby("item_id")["user_id"].count().sort_values(ascending=False)
buy_item=data[data["behaviour_type"]=="buy"].groupby("item_id")["user_id"].count().sort_values(ascending=False)
merge=pd.merge(pv_item,buy_item,on=["item_id"],how="outer").fillna(0)
x=merge["user_id_x"]
y=merge["user_id_y"]
plt.figure(figsize=(8,6))
plt.scatter(x,y,marker="o")
#商品类目点击量和购买量关系图
从点击量和购买量的散点图可以看出,大部分商品类目都是点击量和购买量都比较低,整体是正相关,有少量类目的点击量或购买量很大,或点击量和购买量都比较大。
(2)再看“product_id”的点击量和购买量整体情况:
pv_product=data[data["behaviour_type"]=="pv"].groupby("product_id")["user_id"].count().sort_values(ascending=False)
buy_product=data[data["behaviour_type"]=="buy"].groupby("product_id")["user_id"].count().sort_values(ascending=False)
merge=pd.merge(pv_product,buy_product,on=["product_id"],how="outer").fillna(0)
x=merge["user_id_x"]
y=merge["user_id_y"]
plt.figure(figsize=(8,6))
plt.scatter(x,y,marker="o")
同商品类目的情况类似,大部分商品是点击量和购买量都比较低,有一定的相关性,但同时发现点击量大但购买量小的商品较多,即偏右下、偏右中的点,有一个左上角突出的点,表示有一个商品点击量不大但购买量很大。
(3)下面分析商品类目 点击量和购买量的前十:
购买top10
buytop=pd.pivot_table(data,values="user_id",columns="behaviour_type",index="item_id",aggfunc="count").sort_values(by=["buy"],ascending=False).head(10)
buytop['转化率']=buytop['buy']/buytop['pv']
buytop['转化率']=buytop['转化率'].apply(lambda x: format(x, '.2%'))
buytop
点击top10
pvtop=pd.pivot_table(data,values="user_id",columns="behaviour_type",index="item_id",aggfunc="count").sort_values(by=["pv"],ascending=False).head(10)
pvtop['转化率']=pvtop['buy']/pvtop['pv']
pvtop['转化率']=pvtop['转化率'].apply(lambda x: format(x, '.2%'))
pvtop
两表合并
pd.merge(buytop,pvtop,how='inner',on='item_id')
这6个类目的点击量和购买量都是前十,说明是很受用户欢迎的类目,无疑是重点类目,但发现其实这些类目的转化率也不是很高,电商平台应该重点推送这几类商品,因为这类商品有市场,并且可以多做活动,吸引更多的潜在客户变成购买客户。
而购买量比较高,但是点击量不突出的这类商品,也许是特定群体非常需要的,他们可能搜索和点击的目标比较明确。电商平台可以收集用户信息,分析用户画像,结合商品特点,核实是否如此。
如果是某类特征明显的用户群体购买更多,可以集中向该类用户多推送。如果没有明显的群体需求,建议对这类商品多做推广,因为原有的购买量就比较高,若是能够提高点击量,可能购买量也会再上一个台阶。
但是点击量很高,但购买量偏低的这类商品,应该先从商品本身分析,是否是用户真正需要的。为什么大部分用户点击,但购买较少,是因为价格太高?还是其他原因?调查清楚原因之后再对症下药。
三)用户价值分析 这里利用RFM模型去分析用户价值,以便针对不同用户采取不同措施。
RFM模型的概念如下: R(Recency):客户最近一次交易时间的间隔。R值越大,表示客户交易发生的日期越久,反之则表示客户交易发生的日期越近。
F(Frequency):客户在最近一段时间内交易的次数。
F值越大,表示客户交易越频繁,反之则表示客户交易不够活跃。
M(Monetary):客户在最近一段时间内交易的金额。
M值越大,表示客户价值越高,反之则表示客户价值越低。
由于所给数据集不包含用户购买金额,所以只考虑最近消费时间R和购买频率F,将客户分为重要客户、保持客户、发展客户和挽留客户。
# 1 R: 最近一次消费距今天数统计
nowDate = datetime.datetime(2017,12,4) # 假定当前时间为(2017,12,4)
user_recent_pay = data[data['behaviour_type'] == 'buy'].groupby('user_id')['date'].apply(lambda x: nowDate - x.sort_values().iloc[-1])
user_recent_pay = user_recent_pay.reset_index().rename(columns={'date':'recent'})
2 F: 消费次数统计
user_freq = data[data['behaviour_type'] == 'buy'].groupby('user_id').date.count()
user_freq = user_freq.reset_index().rename(columns={'date':'freq'})
3 通过user_id将R、F合并
rfm = pd.merge(user_recent_pay, user_freq, left_on='user_id', right_on='user_id')
4 给R、F打分score
rfm['score_recent'] = pd.qcut(rfm['recent'], 2, labels = ['1', '0'])
(1)Python所有方向的学习路线(新版)
这是我花了几天的时间去把Python所有方向的技术点做的整理,形成各个领域的知识点汇总,它的用处就在于,你可以按照上面的知识点去找对应的学习资源,保证自己学得较为全面。
最近我才对这些路线做了一下新的更新,知识体系更全面了。
(2)Python学习视频
包含了Python入门、爬虫、数据分析和web开发的学习视频,总共100多个,虽然没有那么全面,但是对于入门来说是没问题的,学完这些之后,你可以按照我上面的学习路线去网上找其他的知识资源进行进阶。
(3)100多个练手项目
我们在看视频学习的时候,不能光动眼动脑不动手,比较科学的学习方法是在理解之后运用它们,这时候练手项目就很适合了,只是里面的项目比较多,水平也是参差不齐,大家可以挑自己能做的项目去练练。