output
# 每日访客数可视化
fig, ax = plt.subplots(figsize=[16,6])
sns.pointplot(uv\_daily.index, uv\_daily.values, markers=‘H’, linestyles=‘–’,color=‘m’)
x=list(range(0,16))
for a,b in zip(x,uv\_daily.values):
plt.text(a+0.1, b + 500 , ‘%i’ % b, ha=‘center’, va= ‘bottom’,fontsize=14)
plt.title(‘每日访客数’)
output
浏览量和访客数每日变化趋势大致相同,2018-04-04日前后用户数量变化波动较大,4月4日为清明节假日前一天,各数据量在当天均有明显下降,但之后逐步回升,推测应为节假日营销活动或推广拉新活动带来的影响。
#每时浏览量
pv\_hourly = behavior[behavior[‘type’] == ‘pv’].groupby(‘hour’)[‘user\_id’].count()
#每时访客数
uv\_hourly = behavior.groupby(‘hour’)[‘user\_id’].nunique()
# SQL
# 每时浏览量
SELECT date, COUNT(type) pv\_daily FROM behavior\_sql
WHERE type = ‘pv’
GROUP BY hour;
# 每时访客数
SELECT date, COUNT(DISTINCT user\_id) uv\_daily FROM behavior\_sql
GROUP BY hour;
# 浏览量随小时变化可视化
fig, ax = plt.subplots(figsize=[16,6])
sns.pointplot(pv\_hourly.index, pv\_hourly.values, markers=‘H’, linestyles=‘–’,color=‘dodgerblue’)
for a,b in zip(pv\_hourly.index,pv\_hourly.values):
plt.text(a, b + 10000 , ‘%i’ % b, ha=‘center’, va= ‘bottom’,fontsize=12)
plt.title(‘浏览量随小时变化’)
output
# 访客数随小时变化可视化
fig, ax = plt.subplots(figsize=[16,6])
sns.pointplot(uv\_hourly.index, uv\_hourly.values, markers=‘H’, linestyles=‘–’,color=‘m’)
for a,b in zip(uv\_hourly.index,uv\_hourly.values):
plt.text(a, b + 1000 , ‘%i’ % b, ha=‘center’, va= ‘bottom’,fontsize=12)
plt.title(‘访客数随小时变化’)
output
浏览量及访客数随小时变化趋势一致,在凌晨1点到凌晨5点之间,大部分用户正在休息,整体活跃度较低。凌晨5点到10点用户开始起床工作,活跃度逐渐增加,之后趋于平稳,下午6点之后大部分人恢复空闲,浏览量及访客数迎来了第二波攀升,在晚上8点中到达高峰,随后逐渐下降。可以考虑在上午9点及晚上8点增大商品推广力度,加大营销活动投入,可取的较好的收益,1点到5点之间适合做系统维护。
# 用户各操作随小时变化
type\_detail\_hour = pd.pivot\_table(columns = ‘type’,index = ‘hour’, data = behavior,aggfunc=np.size,values = ‘user\_id’)
# 用户各操作随星期变化
type\_detail\_weekday = pd.pivot\_table(columns = ‘type’,index = ‘weekday’, data = behavior,aggfunc=np.size,values = ‘user\_id’)
type\_detail\_weekday = type\_detail\_weekday.reindex([‘Monday’,‘Tuesday’,‘Wednesday’,‘Thursday’,‘Friday’,‘Saturday’,‘Sunday’])
# SQL
# 用户各操作随小时变化
SELECT hour,
SUM(CASE WHEN behavior=‘pv’ THEN 1 ELSE 0 END)AS ‘pv’,
SUM(CASE WHEN behavior=‘fav’ THEN 1 ELSE 0 END)AS ‘fav’,
SUM(CASE WHEN behavior=‘cart’ THEN 1 ELSE 0 END)AS ‘cart’,
SUM(CASE WHEN behavior=‘pay’ THEN 1 ELSE 0 END)AS ‘pay’
FROM behavior\_sql
GROUP BY hour
ORDER BY hour
# 用户各操作随星期变化
SELECT weekday,
SUM(CASE WHEN behavior=‘pv’ THEN 1 ELSE 0 END)AS ‘pv’,
SUM(CASE WHEN behavior=‘fav’ THEN 1 ELSE 0 END)AS ‘fav’,
SUM(CASE WHEN behavior=‘cart’ THEN 1 ELSE 0 END)AS ‘cart’,
SUM(CASE WHEN behavior=‘pay’ THEN 1 ELSE 0 END)AS ‘pay’
FROM behavior\_sql
GROUP BY weekday
ORDER BY weekday
tdh\_line = type\_detail\_hour.stack().reset\_index().rename(columns={0: ‘Value’})
tdw\_line = type\_detail\_weekday.stack().reset\_index().rename(columns={0: ‘Value’})
tdh\_line= tdh\_line[~(tdh\_line[‘type’] == ‘pv’)]
tdw\_line= tdw\_line[~(tdw\_line[‘type’] == ‘pv’)]
# 用户操作随小时变化可视化
fig, ax = plt.subplots(figsize=[16,6])
sns.pointplot(x=‘hour’, y=‘Value’, hue=‘type’, data=tdh\_line, linestyles=‘–’)
plt.title(‘用户操作随小时变化’)
output
用户操作随小时变化规律与PV、UV随小时规律相似,与用户作息规律相关,加入购物车和付款两条曲线贴合比比较紧密,说明大部分用户习惯加入购物车后直接购买。
关注数相对较少,可以根据用户购物车内商品进行精准推送。评论数也相对较少,说明大部分用户不是很热衷对购物体验进行反馈,可以设置一些奖励制度提高用户评论数,增大用用户粘性。
# 用户操作随星期变化可视化
fig, ax = plt.subplots(figsize=[16,6])
sns.pointplot(x=‘weekday’, y=‘Value’, hue=‘type’, data=tdw\_line[~(tdw\_line[‘type’] == ‘pv’)], linestyles=‘–’)
plt.title(‘用户操作随星期变化’)
output
周一到周四工作日期间,用户操作随星期变化比较平稳,周五至周六进入休息日,用户操作明显增多,周日又恢复正常。
4、用户行为转化漏斗
# 导入相关包
from pyecharts import options as opts
from pyecharts.charts import Funnel
import math
behavior[‘action\_time’] = pd.to\_datetime(behavior[‘action\_time’],format =‘%Y-%m-%d %H:%M:%S’)
# 用户整体行为分布
type\_dis = behavior[‘type’].value\_counts().reset\_index()
type\_dis[‘rate’] = round((type\_dis[‘type’] / type\_dis[‘type’].sum()),3)
type\_dis.style.bar(color=‘skyblue’,subset=[‘rate’])
output
用户整体行为中,有82.6%行为为浏览,实际支付操作仅占6.4,除此之外,用户评论及收藏的行为占比也较低,应当增强网站有用户之间的互动,提高评论数量和收藏率。
df\_con = behavior[[‘user\_id’, ‘sku\_id’, ‘action\_time’, ‘type’]]
df\_pv = df\_con[df\_con[‘type’] == ‘pv’]
df\_fav = df\_con[df\_con[‘type’] == ‘fav’]
df\_cart = df\_con[df\_con[‘type’] == ‘cart’]
df\_pay = df\_con[df\_con[‘type’] == ‘pay’]
df\_pv\_uid = df\_con[df\_con[‘type’] == ‘pv’][‘user\_id’].unique()
df\_fav\_uid = df\_con[df\_con[‘type’] == ‘fav’][‘user\_id’].unique()
df\_cart\_uid = df\_con[df\_con[‘type’] == ‘cart’][‘user\_id’].unique()
df\_pay\_uid = df\_con[df\_con[‘type’] == ‘pay’][‘user\_id’].unique()
pv - buy
fav\_cart\_list = set(df\_fav\_uid) | set(df\_cart\_uid)
pv\_pay\_df = pd.merge(left=df\_pv, right=df\_pay, how=‘inner’, on=[‘user\_id’, ‘sku\_id’], suffixes=(‘\_pv’, ‘\_pay’))
pv\_pay\_df = pv\_pay\_df[(~pv\_pay\_df[‘user\_id’].isin(fav\_cart\_list)) & (pv\_pay\_df[‘action\_time\_pv’] < pv\_pay\_df[‘action\_time\_pay’])]
uv = behavior[‘user\_id’].nunique()
pv\_pay\_num = pv\_pay\_df[‘user\_id’].nunique()
pv\_pay\_data = pd.DataFrame({‘type’:[‘浏览’,‘付款’],‘num’:[uv,pv\_pay\_num]})
pv\_pay\_data[‘conversion\_rates’] = (round((pv\_pay\_data[‘num’] / pv\_pay\_data[‘num’][0]),4) \* 100)
attr1 = list(pv\_pay\_data.type)
values1 = list(pv\_pay\_data.conversion\_rates)
data1 = [[attr1[i], values1[i]] for i in range(len(attr1))]
# 用户行为转化漏斗可视化
pv\_pay=(Funnel(opts.InitOpts(width=“600px”, height=“300px”))
.add(
series\_name=“”,
data\_pair=data1,
gap=2,
tooltip\_opts=opts.TooltipOpts(trigger=“item”, formatter=“{b} : {c}%”),
label\_opts=opts.LabelOpts(is\_show=True, position=“inside”),
itemstyle\_opts=opts.ItemStyleOpts(border\_color=“#fff”, border\_width=1)
)
.set\_global\_opts(title\_opts=opts.TitleOpts(title=“用户行为转化漏斗图”))
)
pv\_pay.render\_notebook()
output
pv - cart - pay
pv\_cart\_df = pd.merge(left=df\_pv, right=df\_cart, how=‘inner’, on=[‘user\_id’, ‘sku\_id’], suffixes=(‘\_pv’, ‘\_cart’))
pv\_cart\_df = pv\_cart\_df[pv\_cart\_df[‘action\_time\_pv’] < pv\_cart\_df[‘action\_time\_cart’]]
pv\_cart\_df = pv\_cart\_df[~pv\_cart\_df[‘user\_id’].isin(df\_fav\_uid)]
pv\_cart\_pay\_df = pd.merge(left=pv\_cart\_df, right=df\_pay, how=‘inner’, on=[‘user\_id’, ‘sku\_id’])
pv\_cart\_pay\_df = pv\_cart\_pay\_df[pv\_cart\_pay\_df[‘action\_time\_cart’] < pv\_cart\_pay\_df[‘action\_time’]]
uv = behavior[‘user\_id’].nunique()
pv\_cart\_num = pv\_cart\_df[‘user\_id’].nunique()
pv\_cart\_pay\_num = pv\_cart\_pay\_df[‘user\_id’].nunique()
pv\_cart\_pay\_data = pd.DataFrame({‘type’:[‘浏览’,‘加购’,‘付款’],‘num’:[uv,pv\_cart\_num,pv\_cart\_pay\_num]})
pv\_cart\_pay\_data[‘conversion\_rates’] = (round((pv\_cart\_pay\_data[‘num’] / pv\_cart\_pay\_data[‘num’][0]),4) \* 100)
attr2 = list(pv\_cart\_pay\_data.type)
values2 = list(pv\_cart\_pay\_data.conversion\_rates)
data2 = [[attr2[i], values2[i]] for i in range(len(attr2))]
# 用户行为转化漏斗可视化
pv\_cart\_buy=(Funnel(opts.InitOpts(width=“600px”, height=“300px”))
.add(
series\_name=“”,
data\_pair=data2,
gap=2,
tooltip\_opts=opts.TooltipOpts(trigger=“item”, formatter=“{b} : {c}%”),
label\_opts=opts.LabelOpts(is\_show=True, position=“inside”),
itemstyle\_opts=opts.ItemStyleOpts(border\_color=“#fff”, border\_width=1)
)
.set\_global\_opts(title\_opts=opts.TitleOpts(title=“用户行为转化漏斗图”))
)
pv\_cart\_buy.render\_notebook()
output
pv - fav - pay
pv\_fav\_df = pd.merge(left=df\_pv, right=df\_fav, how=‘inner’, on=[‘user\_id’, ‘sku\_id’], suffixes=(‘\_pv’, ‘\_fav’))
pv\_fav\_df = pv\_fav\_df[pv\_fav\_df[‘action\_time\_pv’] < pv\_fav\_df[‘action\_time\_fav’]]
pv\_fav\_df = pv\_fav\_df[~pv\_fav\_df[‘user\_id’].isin(df\_cart\_uid)]
pv\_fav\_pay\_df = pd.merge(left=pv\_fav\_df, right=df\_pay, how=‘inner’, on=[‘user\_id’, ‘sku\_id’])
pv\_fav\_pay\_df = pv\_fav\_pay\_df[pv\_fav\_pay\_df[‘action\_time\_fav’] < pv\_fav\_pay\_df[‘action\_time’]]
uv = behavior[‘user\_id’].nunique()
pv\_fav\_num = pv\_fav\_df[‘user\_id’].nunique()
pv\_fav\_pay\_num = pv\_fav\_pay\_df[‘user\_id’].nunique()
pv\_fav\_pay\_data = pd.DataFrame({‘type’:[‘浏览’,‘收藏’,‘付款’],‘num’:[uv,pv\_fav\_num,pv\_fav\_pay\_num]})
pv\_fav\_pay\_data[‘conversion\_rates’] = (round((pv\_fav\_pay\_data[‘num’] / pv\_fav\_pay\_data[‘num’][0]),4) \* 100)
attr3 = list(pv\_fav\_pay\_data.type)
values3 = list(pv\_fav\_pay\_data.conversion\_rates)
data3 = [[attr3[i], values3[i]] for i in range(len(attr3))]
# 用户行为转化漏斗可视化
pv\_fav\_buy=(Funnel(opts.InitOpts(width=“600px”, height=“300px”))
.add(
series\_name=“”,
data\_pair=data3,
gap=2,
tooltip\_opts=opts.TooltipOpts(trigger=“item”, formatter=“{b} : {c}%”),
label\_opts=opts.LabelOpts(is\_show=True, position=“inside”),
itemstyle\_opts=opts.ItemStyleOpts(border\_color=“#fff”, border\_width=1)
)
.set\_global\_opts(title\_opts=opts.TitleOpts(title=“用户行为转化漏斗图”))
)
pv\_fav\_buy.render\_notebook()
output
pv - fav - cart - pay
pv\_fav = pd.merge(left=df\_pv, right=df\_fav, how=‘inner’, on=[‘user\_id’, ‘sku\_id’],suffixes=(‘\_pv’, ‘\_fav’))
pv\_fav = pv\_fav[pv\_fav[‘action\_time\_pv’] < pv\_fav[‘action\_time\_fav’]]
pv\_fav\_cart = pd.merge(left=pv\_fav, right=df\_cart, how=‘inner’, on=[‘user\_id’, ‘sku\_id’])
pv\_fav\_cart = pv\_fav\_cart[pv\_fav\_cart[‘action\_time\_fav’]<pv\_fav\_cart[‘action\_time’]]
pv\_fav\_cart\_pay = pd.merge(left=pv\_fav\_cart, right=df\_pay, how=‘inner’, on=[‘user\_id’, ‘sku\_id’],suffixes=(‘\_cart’, ‘\_pay’))
pv\_fav\_cart\_pay = pv\_fav\_cart\_pay[pv\_fav\_cart\_pay[‘action\_time\_cart’]<pv\_fav\_cart\_pay[‘action\_time\_pay’]]
uv = behavior[‘user\_id’].nunique()
pv\_fav\_n = pv\_fav[‘user\_id’].nunique()
pv\_fav\_cart\_n = pv\_fav\_cart[‘user\_id’].nunique()
pv\_fav\_cart\_pay\_n = pv\_fav\_cart\_pay[‘user\_id’].nunique()
pv\_fav\_cart\_pay\_data = pd.DataFrame({‘type’:[‘浏览’,‘收藏’,‘加购’,‘付款’],‘num’:[uv,pv\_fav\_n,pv\_fav\_cart\_n,pv\_fav\_cart\_pay\_n]})
pv\_fav\_cart\_pay\_data[‘conversion\_rates’] = (round((pv\_fav\_cart\_pay\_data[‘num’] / pv\_fav\_cart\_pay\_data[‘num’][0]),4) \* 100)
attr4 = list(pv\_fav\_cart\_pay\_data.type)
values4 = list(pv\_fav\_cart\_pay\_data.conversion\_rates)
data4 = [[attr4[i], values4[i]] for i in range(len(attr4))]
# 用户行为转化漏斗可视化
pv\_fav\_buy=(Funnel(opts.InitOpts(width=“600px”, height=“300px”))
.add(
series\_name=“”,
data\_pair=data4,
gap=2,
tooltip\_opts=opts.TooltipOpts(trigger=“item”, formatter=“{b} : {c}%”),
label\_opts=opts.LabelOpts(is\_show=True, position=“inside”),
itemstyle\_opts=opts.ItemStyleOpts(border\_color=“#fff”, border\_width=1)
)
.set\_global\_opts(title\_opts=opts.TitleOpts(title=“用户行为转化漏斗图”))
)
pv\_fav\_buy.render\_notebook()
output
不同路径用户消费时间间隔分析:
pv - cart - pay
pcp\_interval = pv\_cart\_pay\_df.groupby([‘user\_id’, ‘sku\_id’]).apply(lambda x: (x.action\_time.min() - x.action\_time\_cart.min())).reset\_index()
pcp\_interval[‘interval’] = pcp\_interval[0].apply(lambda x: x.seconds) / 3600
pcp\_interval[‘interval’] = pcp\_interval[‘interval’].apply(lambda x: math.ceil(x))
fig, ax = plt.subplots(figsize=[16,6])
sns.countplot(pcp\_interval[‘interval’],palette=‘Set1’)
for p in ax.patches:
ax.annotate(‘{:.2f}%’.format(100\*p.get\_height()/len(pcp\_interval[‘interval’])), (p.get\_x() + 0.1, p.get\_height() + 100))
ax.set\_yscale(“log”)
plt.title(‘pv-cart-pay路径用户消费时间间隔’)
output
pv - fav - pay
pfp\_interval = pv\_fav\_pay\_df.groupby([‘user\_id’, ‘sku\_id’]).apply(lambda x: (x.action\_time.min() - x.action\_time\_fav.min())).reset\_index()
pfp\_interval[‘interval’] = pfp\_interval[0].apply(lambda x: x.seconds) / 3600
pfp\_interval[‘interval’] = pfp\_interval[‘interval’].apply(lambda x: math.ceil(x))
fig, ax = plt.subplots(figsize=[16,6])
sns.countplot(pfp\_interval[‘interval’],palette=‘Set1’)
for p in ax.patches:
ax.annotate(‘{:.2f}%’.format(100\*p.get\_height()/len(pfp\_interval[‘interval’])), (p.get\_x() + 0.1, p.get\_height() + 10))
ax.set\_yscale(“log”)
plt.title(‘pv-fav-pay路径用户消费时间间隔’)
output
两种路径下大部分用户均在4小时内完成了支付,大部分用户的购物意向很明确,也侧面说明了网站的商品分类布局和购物结算方式比较合理。
# SQL
# 漏斗图
SELECT type, COUNT(DISTINCT user\_id) user\_num
FROM behavior\_sql
GROUP BY type
ORDER BY COUNT(DISTINCT user\_id) DESC
SELECT COUNT(DISTINCT b.user\_id) AS pv\_fav\_num,COUNT(DISTINCT c.user\_id) AS pv\_fav\_pay\_num
FROM
((SELECT DISTINCT user\_id, sku\_id, action\_time FROM users WHERE type=‘pv’ ) AS a
LEFT JOIN
(SELECT DISTINCT user\_id, sku\_id, action\_time FROM users WHERE type=‘fav’
AND user\_id NOT IN
(SELECT DISTINCT user\_id
FROM behavior\_sql
WHERE type = ‘cart’)) AS b
ON a.user\_id = b.user\_id AND a.sku\_id = b.sku\_id AND a.action\_time <= b.action\_time
LEFT JOIN
(SELECT DISTINCT user\_id,sku\_id,item\_category,times\_new FROM users WHERE behavior\_type=‘pay’) AS c
ON b.user\_id = c.user\_id AND b.sku\_id = c.sku\_id AND AND b.action\_time <= c.action\_time);
比较四种不同的转化方式,最有效的转化路径为浏览直接付款转化率为21.46%,其次为浏览加购付款,转化率为12.47%,可以发现随着结算方式越来越复杂转化率越来越低。
加购的方式比收藏购买的方式转化率要高,推其原因为购物车接口进入方便且可以做不同商家比价用,而收藏则需要更繁琐的操作才可以查看到商品,因此转化率较低。
可以优化商品搜索功能,提高商品搜索准确度、易用性,减少用户搜索时间。
根据用户喜好在首页进行商品推荐,优化重排商品详情展示页,提高顾客下单欲望,提供一键购物等简化购物步骤的功能。
客服也可以留意加购及关注用户,适时推出优惠福利及时解答用户问题,引导用户购买以进一步提高转化率。
对于用户消费时间间隔,可以通过限时领券购买、限时特惠价格等进一步缩短用户付款时间,提高订单量。
5、用户留存率分析
#留存率
first\_day = datetime.date(datetime.strptime(‘2018-03-30’, ‘%Y-%m-%d’))
fifth\_day = datetime.date(datetime.strptime(‘2018-04-03’, ‘%Y-%m-%d’))
tenth\_day = datetime.date(datetime.strptime(‘2018-04-08’, ‘%Y-%m-%d’))
fifteenth\_day = datetime.date(datetime.strptime(‘2018-04-13’, ‘%Y-%m-%d’))
#第一天新用户数
user\_num\_first = behavior[behavior[‘date’] == first\_day][‘user\_id’].to\_frame()
#第五天留存用户数
user\_num\_fifth = behavior[behavior[‘date’] == fifth\_day ][‘user\_id’].to\_frame()
#第十留存用户数
user\_num\_tenth = behavior[behavior[‘date’] == tenth\_day][‘user\_id’].to\_frame()
#第十五天留存用户数
user\_num\_fifteenth = behavior[behavior[‘date’] == fifteenth\_day][‘user\_id’].to\_frame()
#第五天留存率
fifth\_day\_retention\_rate = round((pd.merge(user\_num\_first, user\_num\_fifth).nunique())
/ (user\_num\_first.nunique()),4).user\_id
#第十天留存率
tenth\_day\_retention\_rate = round((pd.merge(user\_num\_first, user\_num\_tenth ).nunique())
/ (user\_num\_first.nunique()),4).user\_id
#第十五天留存率
fifteenth\_day\_retention\_rate = round((pd.merge(user\_num\_first, user\_num\_fifteenth).nunique())
/ (user\_num\_first.nunique()),4).user\_id
# 留存率可视化
fig, ax = plt.subplots(figsize=[16,6])
sns.barplot(x=‘n日后留存率’, y=‘Rate’, data=retention\_rate,
palette=‘Set1’)
x=list(range(0,3))
for a,b in zip(x,retention\_rate[‘Rate’]):
plt.text(a, b + 0.001, ‘%.2f%%’ % (b\*100), ha=‘center’, va= ‘bottom’,fontsize=12)
plt.title(‘用户留存率’)
output
留存率反应了产品质量和保留用户的能力,按照Facebook平台流传出留存率“40–20–10”规则(规则中的数字表示的是次日留存率、第7日留存率和第30日留存率),统计周期内第五日留存率为22.81%,第15日留存率为17.44%。
反映出平台的用户依赖性较高,也因平台发展已经到达稳定阶段,用户保留率不会发生较大波动,数据量足够的情况下可以以年为单位,计算按月的留存率。要合理安排消息推送,推出签到有奖等机制提高用户粘性,进一步提高留存率。
# SQL
#n日后留存率=(注册后的n日后还登录的用户数)/第一天新增总用户数
create table retention\_rate as select count(distinct user\_id) as user\_num\_first from behavior\_sql
where date = ‘2018-03-30’;
alter table retention\_rate add column user\_num\_fifth INTEGER;
update retention\_rate set user\_num\_fifth=
(select count(distinct user\_id) from behavior\_sql
where date = ‘2018-04-03’ and user\_id in (SELECT user\_id FROM behavior\_sql
WHERE date = ‘2018-03-30’));
alter table retention\_rate add column user\_num\_tenth INTEGER;
update retention\_rate set user\_num\_tenth=
(select count(distinct user\_id) from behavior\_sql
where date = ‘2018-04-08’ and user\_id in (SELECT user\_id FROM behavior\_sql
WHERE date = ‘2018-03-30’));
alter table retention\_rate add column user\_num\_fifteenth INTEGER;
update retention\_rate set user\_num\_fifteenth=
(select count(distinct user\_id) from behavior\_sql
where date = ‘2018-04-13’ and user\_id in (SELECT user\_id FROM behavior\_sql
WHERE date = ‘2018-03-30’));
SELECT CONCAT(ROUND(100*user\_num\_fifth/user\_num\_first,2),‘%’)AS fifth\_day\_retention\_rate,
CONCAT(ROUND(100*user\_num\_tenth/user\_num\_first,2),‘%’)AS tenth\_day\_retention\_rate,
CONCAT(ROUND(100\*user\_num\_fifteenth/user\_num\_first,2),‘%’)AS fifteenth\_day\_retention\_rate
from retention\_rate;
6、商品销量分析
# 商品总数
behavior[‘sku\_id’].nunique()
output
239007
# 商品被购前产生平均操作次数
sku\_df = behavior[behavior[‘sku\_id’].isin(behavior[behavior[‘type’] == ‘pay’][‘sku\_id’].unique())].groupby(‘sku\_id’)[‘type’].value\_counts().unstack(fill\_value=0)
sku\_df[‘total’] = sku\_df.sum(axis=1)
sku\_df[‘avg\_beha’] = round((sku\_df[‘total’] / sku\_df[‘pay’]), 2)
fig, ax = plt.subplots(figsize=[8,6])
sns.scatterplot(x=‘avg\_beha’, y=‘pay’, data=sku\_df, palette=‘Set1’)
ax.set\_xscale(“log”)
ax.set\_yscale(“log”)
plt.xlabel(‘平均操作次数’)
plt.ylabel(‘销量’)
output
- 左下角操作少购买少,属于冷门购买频率较低的产品。
- 左上角操作少购买多,属于快消类产品,可选择品牌少,少数品牌垄断的行业。
- 右下角操作多购买少,品牌多,但是购买频率低,应为贵重物品类。
- 右上角操作多购买多,大众品牌,可选多,被购买频次高。
# 商品销量排行
sku\_num = (behavior[behavior[‘type’] == ‘pay’].groupby(‘sku\_id’)[‘type’].count().to\_frame()
.rename(columns={‘type’:‘total’}).reset\_index())
# 销量大于1000的商品
topsku = sku\_num[sku\_num[‘total’] > 1000].sort\_values(by=‘total’,ascending=False)
# 单个用户共购买商品种数
sku\_num\_per\_user = (behavior[behavior[‘type’] == ‘pay’]).groupby([‘user\_id’])[‘sku\_id’].nunique()
topsku.set\_index(‘sku\_id’).style.bar(color=‘skyblue’,subset=[‘total’])
output
在计算周期内订单数均突破1000以上的共有13款产品,其中152092这款产品订单数最高为1736. 推出商品组合有优惠等,提高单个用户购买产品种数。
最后
自我介绍一下,小编13年上海交大毕业,曾经在小公司待过,也去过华为、OPPO等大厂,18年进入阿里一直到现在。
深知大多数网络安全工程师,想要提升技能,往往是自己摸索成长,但自己不成体系的自学效果低效又漫长,而且极易碰到天花板技术停滞不前!
因此收集整理了一份《2024年网络安全全套学习资料》,初衷也很简单,就是希望能够帮助到想自学提升又不知道该从何学起的朋友。
既有适合小白学习的零基础资料,也有适合3年以上经验的小伙伴深入学习提升的进阶课程,基本涵盖了95%以上网络安全知识点!真正的体系化!
如果你觉得这些内容对你有帮助,需要这份全套学习资料的朋友可以戳我获取!!
由于文件比较大,这里只是将部分目录截图出来,每个节点里面都包含大厂面经、学习笔记、源码讲义、实战项目、讲解视频,并且会持续更新!
ng)
在计算周期内订单数均突破1000以上的共有13款产品,其中152092这款产品订单数最高为1736. 推出商品组合有优惠等,提高单个用户购买产品种数。
最后
自我介绍一下,小编13年上海交大毕业,曾经在小公司待过,也去过华为、OPPO等大厂,18年进入阿里一直到现在。
深知大多数网络安全工程师,想要提升技能,往往是自己摸索成长,但自己不成体系的自学效果低效又漫长,而且极易碰到天花板技术停滞不前!
因此收集整理了一份《2024年网络安全全套学习资料》,初衷也很简单,就是希望能够帮助到想自学提升又不知道该从何学起的朋友。
[外链图片转存中…(img-bgfPeh5e-1715798313515)]
[外链图片转存中…(img-gr3wEYVB-1715798313515)]
[外链图片转存中…(img-NW59GAMP-1715798313515)]
[外链图片转存中…(img-LuRfMABh-1715798313516)]
[外链图片转存中…(img-jOamHKNA-1715798313516)]
既有适合小白学习的零基础资料,也有适合3年以上经验的小伙伴深入学习提升的进阶课程,基本涵盖了95%以上网络安全知识点!真正的体系化!
如果你觉得这些内容对你有帮助,需要这份全套学习资料的朋友可以戳我获取!!
由于文件比较大,这里只是将部分目录截图出来,每个节点里面都包含大厂面经、学习笔记、源码讲义、实战项目、讲解视频,并且会持续更新!