数据介绍
数据结构及个字段所表达的含义
uid -用户id
user_city-用户所在 城市
item_id -作品id
author_id-作者id
item_city-作者城市
channel -观看到该作品的来源
finish-是否浏览完作品
like-是否对作品点赞
music_id-音乐id
duration_time -作品时长
real_time-真实时间
H-时间点
date-日期
留存率分析
数据留存矩阵图,是在留存率和用户活跃度的基础上进行绘制的
留存率
又分为次日留存率,3日留存率,5日留存率等。
计算方法:
次日留存率:(第2天 日活跃的用户 / 第1天 日活跃的用户 )*100%
3日留存率: (第3天 日活跃的用户 / 第1天 日活跃的用户)*100%
......
以此类推。
用户活跃度
通俗来讲就是当日用户的上线的数量(去重之后)
分析结果
绘制留存矩阵图(需要知道留存率和活跃度)
留存率(至少需要知道最早的一天和在线任意一天的活跃度)
间隔(最早的一天和任意一天的间隔多少天)
活跃度(需要知道间隔和日期相同时,去重的用户数量)
代码实验
导入数据
df = pd.read_csv('地址')
df.info() # 查看数据列的信息
将date列转换成 datetime类型
# 将date 转换为datetime 类型
df['date'] = pd.to_datetime(df['date'])
根据每个用户uid来确定早时间(重点咯,最早登录时间)
grouping = df.groupby("uid")["date"]
df['min_day'] = grouping.transform("min")
df.head()
确定时间间隔,获取天数 (重点咯,间隔)
df['day_gap'] = (df['date'] - df['day_min']).apply(lambda x:x.days)
df
利用间隔和最早登录的天数进行分组,重置id列(重点,活跃度)
df1 =df.groupby(['day_min','day_gap']).agg({'uid':'nunique'}).reset_index()
table1 = df1.pivot_table(columns='day_gap',index='day_min',values='uid') # 转换一下,更容易看懂
留存率计算
table2 = table1.divide(table1[0],axis=0)
table2
绘制留存矩阵图
# x 轴为 不同类型的用户留存率 # y 轴为 活跃用户的数量 s = charts.Scatter(init_opts=opts.InitOpts(bg_color='#6e7074')) s.add_xaxis(table2[1]) s.add_yaxis('次日留存数量',table1[1],label_opts=opts.LabelOpts(is_show=False),itemstyle_opts=opts.ItemStyleOpts(opacity=0.5)) s.set_global_opts( xaxis_opts=opts.AxisOpts( type_="value", splitline_opts=opts.SplitLineOpts( is_show=True ) ), yaxis_opts=opts.AxisOpts( splitline_opts=opts.SplitLineOpts( is_show=True ) ), visualmap_opts=opts.VisualMapOpts( type_='size', max_=2000, min_=100, ) ) s3 = charts.Scatter(init_opts=opts.InitOpts(bg_color='#6e7074')) s3.add_xaxis(table2[3]) s3.add_yaxis('3日留存数量', table1[3], label_opts=opts.LabelOpts(is_show=False), itemstyle_opts=opts.ItemStyleOpts(opacity=0.5)) s3.set_global_opts( xaxis_opts=opts.AxisOpts( type_="value", splitline_opts=opts.SplitLineOpts( is_show=True ) ), yaxis_opts=opts.AxisOpts( splitline_opts=opts.SplitLineOpts( is_show=True ) ), visualmap_opts=opts.VisualMapOpts( type_='size', max_=2000, min_=100, ) ) s7 = charts.Scatter(init_opts=opts.InitOpts(bg_color='#6e7074')) s7.add_xaxis(table2[7]) s7.add_yaxis('7日留存数量', table1[7], label_opts=opts.LabelOpts(is_show=False), itemstyle_opts=opts.ItemStyleOpts(opacity=0.5)) s7.set_global_opts( xaxis_opts=opts.AxisOpts( type_="value", splitline_opts=opts.SplitLineOpts( is_show=True ) ), yaxis_opts=opts.AxisOpts( splitline_opts=opts.SplitLineOpts( is_show=True ) ), visualmap_opts=opts.VisualMapOpts( type_='size', max_=2000, min_=100, ) ) s21 = charts.Scatter(init_opts=opts.InitOpts(bg_color='#6e7074')) s21.add_xaxis(table2[21]) s21.add_yaxis('21日留存数量', table1[21], label_opts=opts.LabelOpts(is_show=False), itemstyle_opts=opts.ItemStyleOpts(opacity=0.5)) s21.set_global_opts( xaxis_opts=opts.AxisOpts( type_="value", splitline_opts=opts.SplitLineOpts( is_show=True ) ), yaxis_opts=opts.AxisOpts( splitline_opts=opts.SplitLineOpts( is_show=True ), ), visualmap_opts=opts.VisualMapOpts( type_='size', max_=2000, min_=100, ) ) s.render('留存矩阵图.html')