MAU(月活跃用户数)定义
MAU(Monthly Active Users) 指在近30天(自然月或滚动30天)内至少使用一次产品的独立用户总数,是衡量产品用户基数和长期粘性的核心指标。
关键特性:
与DAU(日活)互补:DAU反映短期爆发力,MAU体现长期生态健康度
业务价值:评估用户池规模、计算粘性比率(DAU/MAU)、指导资源投入
Python分析MAU全流程(附代码)
1. 数据准备
数据集 user_activity.csv 结构:
csv
2. 滚动30天MAU计算
python
import pandas as pd
import numpy as np
from datetime import timedelta
# 读取数据并转换日期
df = pd.read_csv('user_activity.csv', parse_dates=['event_date'])
min_date, max_date = df['event_date'].min(), df['event_date'].max()
# 生成日期范围索引
date_range = pd.date_range(min_date, max_date, freq='D')
# 计算每日MAU(滚动30天独立用户)
mau_data = []
for day in date_range:
start_date = day - timedelta(days=29) # 包含当天共30天
period_users = df[(df['event_date'] >= start_date) &
(df['event_date'] <= day)]
mau = period_users['user_id'].nunique()
mau_data.append({'date': day, 'MAU': mau})
mau_df = pd.DataFrame(mau_data)
print(mau_df.head())
输出示例:
dateMAU2023-07-0115,8922023-07-0215,915
3. 高级分析场景
场景1:MAU构成拆解(新老用户)
python
# 标记用户首活月份
df['first_active_month'] = df.groupby('user_id')['event_date'].transform('min').dt.to_period('M')
# 按日计算MAU及新老用户占比
def calculate_mau_components(day):
start_date = day - timedelta(days=29)
period_data = df[df['event_date'].between(start_date, day)]
# 新用户:首活在当月
new_users = period_data[period_data['first_active_month'] == day.to_period('M')]['user_id'].nunique()
# 老用户:首活在当月之前
returning_users = period_data[period_data['first_active_month'] < day.to_period('M')]['user_id'].nunique()
return new_users, returning_users
# 应用计算
mau_df[['new_users', 'returning_users']] = mau_df['date'].apply(
lambda x: pd.Series(calculate_mau_components(x))
)
mau_df['new_user_ratio'] = mau_df['new_users'] / mau_df['MAU'] * 100
输出:
dateMAUnew_usersreturning_usersnew_user_ratio2023-07-3118,2002,10016,10011.5%
场景2:流失健康度分析
python
# 计算月流失率 = 1 - (本月MAU - 本月新增) / 上月MAU
mau_df['prev_MAU'] = mau_df['MAU'].shift(30) # 上月同日MAU
mau_df['churn_rate'] = (1 - (mau_df['MAU'] - mau_df['new_users']) / mau_df['prev_MAU']) * 100
# 识别异常流失(>20%)
high_churn = mau_df[mau_df['churn_rate'] > 20]
场景3:DAU/MAU粘性比率
python
# 合并DAU数据(假设已有dau_df)
mau_df = mau_df.merge(dau_df, on='date', suffixes=('', '_daily'))
mau_df['stickiness'] = mau_df['DAU'] / mau_df['MAU'] * 100 # 活跃用户日均参与度
# 可视化趋势
import matplotlib.pyplot as plt
plt.figure(figsize=(12, 6))
plt.plot(mau_df['date'], mau_df['stickiness'], label='DAU/MAU Ratio')
plt.title('用户粘性趋势分析')
plt.ylabel('粘性比率 (%)')
plt.axhline(y=20, color='r', linestyle='--', label='健康基准线') # 行业基准
plt.legend()
https://i.imgur.com/5zX9TbR.png 解读:低于20%表明用户低频使用,需提升核心功能吸引力
关键业务应用
生态健康诊断
理想结构:老用户占比 > 70%(成熟产品)
报警逻辑:
python
if (mau_df['new_user_ratio'].iloc[-1] > 50) & (mau_df['stickiness'].iloc[-1] < 15):
alert("警告:过度依赖新用户且粘性不足!")
资源投入决策
老用户流失率上升 → 加强召回活动/福利投放
新用户占比过低 → 增加渠道买量预算
python
# 计算用户获取效率
cost_data = pd.read_csv('marketing_cost.csv') # 含日期、渠道成本
merged_data = mau_df.merge(cost_data, on='date')
merged_data['cost_per_mau'] = merged_data['total_cost'] / merged_data['new_users']
功能迭代评估
新版本上线后,对比MAU增长斜率
python
from scipy import stats
pre_update = mau_df[mau_df['date'] < '2023-07-01']['MAU']
post_update = mau_df[mau_df['date'] >= '2023-07-01']['MAU']
slope_pre, _ = stats.linregress(np.arange(len(pre_update)), pre_update.values)[:2]
slope_post, _ = stats.linregress(np.arange(len(post_update)), post_update.values)[:2]
print(f"版本更新前MAU月增长率: {slope_pre:.0f}人/天, 更新后: {slope_post:.0f}人/天")