Bootstrap

pyecharts 【留存矩阵图】分析抖音用户的留存情况

数据介绍

数据结构及个字段所表达的含义

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')

 

;