一、引言

在互联网业务中,“用户增长”并不等于“留存增长”。很多公司在获取大量新用户后,发现活跃率却在持续下滑。
这时,用户行为分析(User Behavior Analysis) 就显得尤为关键。通过对注册、登录、购买等行为数据的分析,我们能更好地理解用户留存、流失和转化的背后逻辑。

本文将以 Python 为主要工具,从零实现一套简单但实用的留存分析流程。


二、数据集与问题定义

假设我们有以下用户行为数据:

字段名 含义
user_id 用户ID
event_type 行为类型(register/login/purchase)
event_time 行为发生时间
channel 注册来源渠道

我们的目标是:

分析用户在注册后的第1天、第3天、第7天的留存率,并找出影响留存的关键因素。


三、数据加载与清洗


import pandas as pd # 读取数据 df = pd.read_csv('user_behavior.csv') # 时间格式转换 df['event_time'] = pd.to_datetime(df['event_time']) # 去重、删除异常数据 df.drop_duplicates(inplace=True) df = df[df['event_type'].isin(['register', 'login', 'purchase'])] print(df.head())

清洗后的数据可用于分析注册用户的后续活跃情况。


四、计算留存率

留存率(Retention Rate)衡量的是:

在某段时间注册的用户中,仍在后续某天活跃的比例。

下面用 Pandas 实现一个基础的留存分析:


# 找出每个用户的注册日期 register_df = df[df['event_type'] == 'register'][['user_id', 'event_time']] register_df.rename(columns={'event_time': 'register_date'}, inplace=True) # 合并登录数据 login_df = df[df['event_type'] == 'login'][['user_id', 'event_time']] merged = pd.merge(login_df, register_df, on='user_id', how='inner') # 计算登录距注册的天数 merged['days_after'] = (merged['event_time'] - merged['register_date']).dt.days # 分组计算留存 retention = merged.groupby('days_after')['user_id'].nunique() / register_df['user_id'].nunique() print(retention.head(10))

输出示例:


days_after 0 1.000000 1 0.682312 3 0.422891 7 0.215947 14 0.120584

这表明第1天留存为68.2%,第7天留存降至21.6%。


五、可视化展示留存曲线


import matplotlib.pyplot as plt plt.figure(figsize=(8,5)) plt.plot(retention.index, retention.values, marker='o') plt.title('User Retention Curve') plt.xlabel('Days After Registration') plt.ylabel('Retention Rate') plt.grid(True) plt.show()

📈 图解

  • 曲线呈明显下降趋势,符合典型用户流失规律;

  • 若留存下降过快,说明产品“新手期体验”存在问题。


六、渠道对比分析

很多时候,不同渠道的用户质量差异明显。
我们可以分渠道计算留存情况:


df_reg = df[df['event_type'] == 'register'][['user_id', 'event_time', 'channel']] df_login = df[df['event_type'] == 'login'][['user_id', 'event_time']] merged = pd.merge(df_login, df_reg, on='user_id') merged['days_after'] = (merged['event_time_x'] - merged['event_time_y']).dt.days retention_by_channel = merged.groupby(['channel', 'days_after'])['user_id'].nunique().unstack().fillna(0) retention_by_channel = retention_by_channel.div(df_reg['channel'].value_counts(), axis=0) print(retention_by_channel.head())

通过这个表格,我们可以清楚看到:

  • 某些广告渠道带来的用户注册量高,但留存差;

  • 自然渠道(Organic)虽注册量少,但长期留存更稳。


七、从留存到生命周期价值(LTV)

进一步分析可以结合购买行为,计算 用户生命周期价值(LTV)


purchase_df = df[df['event_type'] == 'purchase'] ltv = purchase_df.groupby('user_id')['event_time'].count().mean() print("平均生命周期购买次数:", ltv)

结合留存率与 LTV,就能清晰评估:

哪类用户真正创造了长期价值。

Logo

Agent 垂直技术社区,欢迎活跃、内容共建。

更多推荐