dau3\_df = behavior.groupby([‘date’,‘user\_id’])[‘type’].count().reset\_index()
dau3\_df = dau3\_df[dau3\_df[‘type’] >= 3]
# 每日高活跃用户数(每日操作数大于3次)
dau3\_num = dau3\_df.groupby(‘date’)[‘user\_id’].nunique()
# SQL
SELECT date, COUNT(DISTINCT user\_id)
FROM
(SELECT date, user\_id, COUNT(type)
FROM behavior\_sql
GROUP BY date, user\_id
HAVING COUNT(type) >= 3) dau3
GROUP BY date;
fig, ax = plt.subplots(figsize=[16,6])
sns.pointplot(dau3\_num.index, dau3\_num.values, markers=‘D’, linestyles=‘–’,color=‘teal’)
x=list(range(0,16))
for a,b in zip(x,dau3\_num.values):
plt.text(a+0.1, b + 300 , ‘%i’ % b, ha=‘center’, va= ‘bottom’,fontsize=14)
plt.title(‘每日高活跃用户数’)
output
每日高活跃用户数在大部分4万以上,2018-04-04之前数量比较平稳,之后数量一直攀升,8号9号达到最高,随后下降,推测数据波动应为营销活动产生的。
# 高活跃用户累计活跃天数分布
dau3\_cumsum = dau3\_df.groupby(‘user\_id’)[‘date’].count()
# SQL
SELECT user\_id, COUNT(date)
FROM
(SELECT date, user\_id, COUNT(type)
FROM behavior\_sql
GROUP BY date, user\_id
HAVING COUNT(type) >= 3) dau3
GROUP BY user\_id;
fig, ax = plt.subplots(figsize=[16,6])
ax.set\_yscale(“log”)
sns.countplot(dau3\_cumsum.values,palette=‘Set1’)
for p in ax.patches:
ax.annotate(‘{:.2f}%’.format(100\*p.get\_height()/len(dau3\_cumsum.values)), (p.get\_x() + 0.2, p.get\_height() + 100))
plt.title(‘高活跃用户累计活跃天数分布’)
output
统计周期内,大部分高活跃用户累计活跃天数在六天以下,但也存在高达十六天的超级活跃用户数量,对累计天数较高的用户要推出连续登录奖励等继续维持其对平台的黏性,对累计天数较低的用户要适当进行推送活动消息等对其进行召回。
#每日浏览量
pv\_daily = behavior[behavior[‘type’] == ‘pv’].groupby(‘date’)[‘user\_id’].count()
#每日访客数
uv\_daily = behavior.groupby(‘date’)[‘user\_id’].nunique()
# SQL
#每日浏览量
SELECT date, COUNT(type) pv\_daily FROM behavior\_sql
WHERE type = ‘pv’
GROUP BY date;
#每日访客数
SELECT date, COUNT(DISTINCT user\_id) uv\_daily FROM behavior\_sql
GROUP BY date;
# 每日浏览量可视化
fig, ax = plt.subplots(figsize=[16,6])
sns.pointplot(pv\_daily.index, pv\_daily.values,markers=‘D’, linestyles=‘–’,color=‘dodgerblue’)
x=list(range(0,16))
for a,b in zip(x,pv\_daily.values):
plt.text(a+0.1, b + 2000 , ‘%i’ % b, ha=‘center’, va= ‘bottom’,fontsize=14)
plt.title(‘每日浏览量’)
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
## 最后
**自我介绍一下,小编13年上海交大毕业,曾经在小公司待过,也去过华为、OPPO等大厂,18年进入阿里一直到现在。**
**深知大多数网络安全工程师,想要提升技能,往往是自己摸索成长,但自己不成体系的自学效果低效又漫长,而且极易碰到天花板技术停滞不前!**
**因此收集整理了一份《2024年网络安全全套学习资料》,初衷也很简单,就是希望能够帮助到想自学提升又不知道该从何学起的朋友。**
![img](https://img-blog.csdnimg.cn/img_convert/a2f622fd18116f729af52ba7cb849ffd.png)
![img](https://img-blog.csdnimg.cn/img_convert/d353d3d0f1f057f323b353e76ef901d2.png)
![img](https://img-blog.csdnimg.cn/img_convert/ff2b9c287b33891e8d8442b574a7238c.png)
![img](https://img-blog.csdnimg.cn/img_convert/70dabbd6856714fc99151397eb9fb109.png)
![img](https://img-blog.csdnimg.cn/img_convert/a0a63de1a0763512ec80641cc52d3493.png)
**既有适合小白学习的零基础资料,也有适合3年以上经验的小伙伴深入学习提升的进阶课程,基本涵盖了95%以上网络安全知识点!真正的体系化!**
[**如果你觉得这些内容对你有帮助,需要这份全套学习资料的朋友可以戳我获取!!**](https://bbs.csdn.net/topics/618653875)
**由于文件比较大,这里只是将部分目录截图出来,每个节点里面都包含大厂面经、学习笔记、源码讲义、实战项目、讲解视频,并且会持续更新!**
que())
/ (user\_num\_first.nunique()),4).user\_id
## 最后
**自我介绍一下,小编13年上海交大毕业,曾经在小公司待过,也去过华为、OPPO等大厂,18年进入阿里一直到现在。**
**深知大多数网络安全工程师,想要提升技能,往往是自己摸索成长,但自己不成体系的自学效果低效又漫长,而且极易碰到天花板技术停滞不前!**
**因此收集整理了一份《2024年网络安全全套学习资料》,初衷也很简单,就是希望能够帮助到想自学提升又不知道该从何学起的朋友。**
[外链图片转存中...(img-mIOEDI77-1715798282909)]
[外链图片转存中...(img-WabD5pVd-1715798282909)]
[外链图片转存中...(img-PnGWLm29-1715798282909)]
[外链图片转存中...(img-1ijDN1Rr-1715798282910)]
[外链图片转存中...(img-cXQDvMUK-1715798282910)]
**既有适合小白学习的零基础资料,也有适合3年以上经验的小伙伴深入学习提升的进阶课程,基本涵盖了95%以上网络安全知识点!真正的体系化!**
[**如果你觉得这些内容对你有帮助,需要这份全套学习资料的朋友可以戳我获取!!**](https://bbs.csdn.net/topics/618653875)
**由于文件比较大,这里只是将部分目录截图出来,每个节点里面都包含大厂面经、学习笔记、源码讲义、实战项目、讲解视频,并且会持续更新!**