1、利用Python实现用户群组分析群组分析是用于研究用户行为和提高增长的分析思路。在本 文中,将结合一个数据集利用Python来实现该分析方法。 WeekO Week 1 Week 2 Week 3 All Users 6,812 users 100.00% 2.60% 1.06% 0.86% Nov 11,2018-Nov 17,2018 2.45B users 100 00% 2 20% 1.18% 0 94% Nov 18, 2018-Nov 24. 2018 932 users 100.00% 3 00% 1.07% 0.97% Nov
2、25,2018-Dec 1,2018 100.00% 3.56% 1.33% 1.00% Dec 2,2018-Dec 8,2018 100 00% 3.06% 0.55% 0.44% Dec 9,2018-Dec 15,2018 100 00% 2.69% 0.93% Dec 16.2018-Dec 22,2018 100.00% 1.60% . philosophicalhacker. com/post/better-cohort- analysis/ 本文数据集下载地址: -in-cosmetics-shop 、什么是群组分析ID、分
3、类ID、产品编码、品牌、价格、用户ID、用户会话, 总共7个属性In [2): df - pd.read_csv(u2019-Dec.csv") df.head() Out(2]: tevent_time t event_type。 product_id tcategoryJd t category.code t 0 2019-12-01 00:00:00 UTC remove_from_cart NaN 1 2019-12-01 00:00:00 UTC view 5764655 NaN 2 2019-12-01 00:00:02 UTC cart
4、 4958 NaN 3 2019-12-01 00:00:05 UTC view 5848413 NaN 4 2019-12-01 00:00:07 UTC view 5824148 NaN import numpy as npimport pandas as pd import datetime as dtimport matplotlib.pyplot as pit import seaborn as sns#设置汉字格式:Trebuchet MS, Tahoma, Verdana, Arial, Helvetica,SimHei中文的幼圆、
5、隶书等等#解决中文无法显示问题 plt.rcParamsffont.sans-serif]=['Songti SC']#解决保存图像中负号'■'显示为方块问题 plt.rcParams['axes.unicode_minus'] = False4.2数据探索 数据的缺失 主要查看的是数据类型、数据的行列数看大小、值情况 df.dtypes #数据类型#结果 event_time event_type #结果 event_time event_type product_id category_id category_code brand price user_id us
6、er_session object object int64 int64 object object float64 int64 object dtype: object dtype: object df.shape #数据的行列数 #结果(3533286, 9) df.isnull().sum() #字段缺失值情况 #结果event_time0 event_type0product_id0 category_id0category_code 3474821 # 缺失值严重 brand1510289price0 user_id0user_session 779 d
7、type: int64五、数据清洗 主要操作是挑选数据中价格大于和去重操作: In [ 7 ] : ▼ #筛选价格大于。的行记录df1 = df.query(在本文的案例中,群组分析是按照首次访问的时间和每次的 访问来计算时间间隔,从而来计算留存情况,具体步骤为: 计算每个用户的首次访问时间min_day 记录后续每次访问时间和首次访问时间的间隔day_gap 因为是12月份的电商数据,我们将一个月分成1()份, 时间周期为3天 因为上面的两个因素都是和时间相关,所以必须导入Python 中强大的datetime库来处理时间处理的需求。 df1 = df.query(在本文的案
8、例中,群组分析是按照首次访问的时间和每次的 访问来计算时间间隔,从而来计算留存情况,具体步骤为: 计算每个用户的首次访问时间min_day 记录后续每次访问时间和首次访问时间的间隔day_gap 因为是12月份的电商数据,我们将一个月分成1()份, 时间周期为3天 因为上面的两个因素都是和时间相关,所以必须导入Python 中强大的datetime库来处理时间处理的需求。 >获取event_time中的时间:年月曰 def get_time(datetime): 函数作用:获取时间中的年月日 ” !! !! price > O') In [8]: df2 = df1.d
9、rop_duplicates()六、数据处理 event_time = datetime.strip(" UTC") # 传进来的参数去 掉UTC部分 # dt 表示 datetime 库 event_time = dt.datetime.fromisoformat(event_time) # 生成 一个 YYYY-MM-DD 的 date 对象 y = dt.date(event_time.year,event_time.month,event_time.da y) #取出年月日 return ydf2[uevent_dayn] = df2["event_timen].apply(
10、get_time) df2 令 event.time 令 event_type 令 product.id ▼ category_id ▼ category^code 令 bran 0 2019-12-01 00:00:00 UTC remove_from_cart 5712790 NaN 1 2019-12-01 00:00:00 UTC view 5764655 NaN 2 2019-12-01 00:00:02 UTC cart 4958 NaN n 3 2019-12-01 00:00:
11、05 UTC
view
5848413
NaN
freed
4
2019-12-01 00:00:07 UTC
view
5824148
NaN
2、根据每个用户user_id来确定最早时间#用户本月的最早登陆时间确定
grouping = df2.groupby("user_id")[”event_day”]grouping
In [11]: - #用户本月的最早登陆时间确定grouping = df2.groupby("user id")["eve grouping
Out[11]: 12、iesGroujdf2fnmin_dayn] = grouping.transformC'min")
df2.head()
event time ▼
event type,
product_id t
category, id ▼
category code,
brand ▼
0
2019-12-01
00:00:00 UTC
remove from_cart
5712790
NaN
1
2019-12-01
00:00:00 UTC
view
5764655
NaN
end
2
2019-12-01
00:00:02 UTC
ca 13、rt
4958
NaN
runail
3
2019-12-01
00:00:05 UTC
view
5848413
NaN
freedecor
4
2019-12-01
00:00:07 UTC
view
5824148
NaN
NaN
3、计算访问日event_day和最早访问时间的间隔#计算用户当日访问event_day和最早访问时间min_day之 间的时间间隔
#3为假定的用户分组访问周期 df2["day_gap"] = (((df2["event_dayn] - df2["min_dayu]) // 3) + dt.timedelt 14、a(days= l)).apply(lambda x:x.days)df2
Out[14 ]:
time *
event type *
product id =
category id *
category code ▼
brand *
price ▼
)-12-01
30UTC
remove _from_cart
5712790
NaN
6.27
>12-01 DOUTC
view
5764655
NaN
end
29.05
)-12-01
32 UTC
cart
4958
NaN
runail
1.19
)-12-01 15、 J5 UTC
view
5848413
NaN
freedecor
0.79
)-12-01
37 UTC
view
5824148
NaN
NaN
5.56
4、按照首次访问时间和时间间隔来统计用户数
#按照首次访问时间和下一次访问的间隔,统计用户数 grouping 1 = df2.groupby([nmin_day","day_gapn])#根据用户user.id去重统计每个组的用户数
# grouping 1 [nuser_id"].apply(pd.Series.nunique): 展示去重的总个数
# grouping! ["user_id 16、n].apply(pd.Series.unique): 展示 去重之后的具体元素
df3 = grouping 1 ["user_idn J.apply (pd.Series.nunique).reset_index()
df3.head()
▲
min_day ▼
day_gap 令
user_id 令
0
2019-12-01
1
17519
1
2019-12-01
2
2591
2
2019-12-01
3
2276
3
2019-12-01
4
2039
4
2019-12-01
5
1749
<•/.尤而小妾上面表中的数据表示的 17、是和当前的时间间隔分别为1,2,3... 的人数分别为17519, 2591, 2276等
5、生成数据透视表有了上面分组统计的数据,我们可以生成透视表 #数据透视部分
df4 = df3.pivot(index=umin_day",colunins="day_gap",values=nuser_idn)
df4.head()
Out[18]:
day_gap 令1 ▼2 ▼3 ▼4 ▼5 ▼(
min_day 令▼▼▼▼▼
2019-12-17519.02591.02276.02039.01749.0162
01
2019-12-17044.02006.01759.0157 18、8.01330.0133
02
2019-12-15240.01346.01439.01080.01024.093
03
2019-12-14745.01265.01226.0829.0930.068
04
2019-12-13725.01154.0979.0745.0671.054
05
6、改变数据形式:方便最终使用百分比显示数据一般情况下,我们习惯用百分比来表示用户的留存,很清晰 地看到用户的留存比例。首先我们取出第一列的数据(全部 行):
In [ 19 ] : size = df4.iloc[ : r0]# 所有行第一列的数hsize.head()
Out[19] 19、 min_day17519.0
17044.0
15240.0
14745.0
13725.0
float64
17519.0
17044.0
15240.0
14745.0
13725.0
float64
2019-12-012019-12-02
2019-12-032019-12-04
Name: 1r dtype:
2019-12-05后面每个数据除以相应日期的第一个数据:
# divide 函数table = df4.divide(size,axis=0) # 在行的方向上除以对应 size
中的值table.head()
群组分析Cohort 20、 Analysis,重点就是群/组,它是一种利用 用户分层和用户建模的方法,主要分析的是相同用户群体随 着时间延续的变化发展情况。
我们需要将获取到的全部用户分成一个个的组或者簇群,这 样的群或组的分层方式可以是日期、渠道或者其他特定的用 户为来划分。总之,我们可以按照实际的需求和维度来进行 用户分层。
通过群组分析,我们可以看到不同组别的留存情况。群组分 析Cohort Analysis图表和留存曲线是最常用的留存工具。这 些图表主要是告诉我们用户在我们产品的中的参与度如何, 留存率是怎样的情况,同时还可以分析用户新增速度是否达 到我们的要求。
目前市面上很多的BI工具都可以绘制群组分 21、析的图表和留 存曲线,比如Growing]。、神策大数据系统、PowerBI等。 但是,如果想自定义一些分组或分群的维度,使用Python 也是不二选择。
二、Cohort分析使用场景用户留存率分析
1. 用户流失率分析用户转化率分析
In [24]: ▼ # di vide 函数table = df4 .divide(size, axis=O)# 在行的方向上除L
table.head()
Out[24]:
day_gap ▼ 1 ▼2 令 3 ▼4 ▼5 ▼6 ▼min_day。令令令▼今▼
2019-12-011.00.1478970.1299160.1163880.099 22、8340.092642I2019-12-021.00.1176950.1032030.0925840.0780330.078209I
2019-12-031.00.0883200.0944230.0708660.0671920.061483l2019-12-041.00.0857920.0831470.0562220.0630720.046524I
2019-12-051.00.0840800.0713300.0542810.0488890.039417I保留3位小数,同时改变数据table的索引值:
#保留3位小数并乘以100table.round(3) * 100
#索引重置,只取 23、出年月日,后面的时分秒取消table.index =
群组分析绘图绘制群组分析留存热力图: #解决中文无法显示问题
pit.rcParams['font.sans-serif J=l'Songti SC'J#解决保存图像中负号」显示为方块问题
plt.rcParams['axes.unicode_minus'] = Falseplt.figure(figsize=(15,8))
plt.title(”群组分析留存图”)sns.heatmap(data=table,
annot=True,fmt=,.O%\
vmin = 0.0,vmax = 0.2,
cmap=nBuPu_rH 24、)
plt.show()
cwfl 分析
J)I4
12 01
XI9
12 02
XI9
1205
JDI9
1204
xnq
I20S
U4N»
I24J7
X14
I20S
XI9
12 W
2D\^
I2J0
XH9
12 II
3»!9
1212
S19
!2 B
X!9
12 M
JM・
12 IS
3)19
12 li
JMQ
13 17
XI9
12 18
XH。
12 19
12 30
J)i9
13 21
XI9
12 23
JDI9
12 33
XI9
12-24
25、JDI9
12 25
Xt9
123b
J>!«
12 37
3DW
13 35
颤9
1229
XI9
12 30
3)19
13 51
x%xx%%xxx%xx%xx%x%%%%%x%xxxx%%%
8%螺戒”坎以以尹以皿 U5X5X4%4 "以嗔-n以 ”或嶙碑 aw^nnn fsxE J?5%5%n4%w "
F 蜓稣力nn/螺螺5?嶙
Mnwnsxaxnw 螺!?状岫螺螺螺螺5%螺5%n5%nn虫-'XI从上面的数据中我们可以看到:前6天的留存情况还是很漂 亮(颜色较浅,留存率相对较高)。
可能原因是这是整个12月份的全量数据,导致了多数的活 跃用 26、户会被归类为月初前几天的新增活跃用户。但是数据整 体上到了月末,留存占比还是较少,月留存情况并不可观。
4.
广告转化率分析
上面是很常见的使用场景,还可以进行其他场合的延伸,比如电商网站用户的交易支付数据,不同周期内获取的用户在
交易频次、客单价等的比较分析三、用户留存
用户留存指的是随着时间延续,用户在某个周期内的存在情 况。为什么要看留存?
了解一个渠道的质量:通常是日留存,衡量用户的短期 活跃情况
观察整体的情况:用周留存或者月留存,衡量用户在平 台上的黏性留存又分为次日留存、7日 27、留存、14留存等。下面通过一个 案例来说明常见的7日留存计算规则。
问题:如何计算产品的7日留存?
D1 DAU=10
D2 DAU=6
|p3DAU
7日留存=?
3.1算法1-7 HB留存第一种算法是:第7天活跃人数/第1天活跃人数* 100%
7日留存=?
算法1:
D7/D1 * 100%= 4/10* 100%=4C
3.2算法2・7日内留存第二种算法是:第2天〜第7天去重后/第1天*100%
7日留存=?
算法2:
D2~D7去重之和/
3.3算法3 .不同定义的7日日留存 上面的算法1中是把当前日直接记为 28、Dayl,还有一种计算方法将当前日当做DayO,然后再开始计算;
Day :
算法一:g^SxlOO% 次日留存=歆舟xl00% = 80% 三日留存=簧三奏'100% = 30%
算法三:1^1 xlOO% 首日留存=蓄基 xlOO% = 80% 次日留存=舞奏xlOO% = 30%举例说明一下算法3的使用,比如DAU=1。刚好是星期2产 生的数据:
如果使用算法I,7日日留存=下周1的数据/本周2的 数据(10)
如果使用算法2, 7日日留存=下周2的数据/本周2的数据(10)
说明:算法3在一定程度上能够巧妙避开星期级别的影响
日!1!
27282930313.4 3种留存算法比较
算法1:
第7天
*100%
第1天
算法2:
算法3:
第7天
*100%
第0天
四、本文数据4.1导入数据
本文中使用的一份数据集是从kaggle T载,主要是包含事件发生时间、类型(阅览、加购、移除购物车和购买)、产品






