用 Python 做用户行为分析:从留存率到用户生命周期
一、引言
在互联网业务中,“用户增长”并不等于“留存增长”。很多公司在获取大量新用户后,发现活跃率却在持续下滑。
这时,用户行为分析(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,就能清晰评估:
哪类用户真正创造了长期价值。
更多推荐



所有评论(0)