如何计算月度客户流失率并绘制跨年度时间序列图?
月度客户流失率计算与时间序列图实现
前提假设
首先明确数据逻辑(基于你提供的字段):
- 每条记录对应一个客户,
start_date为客户流失日期(仅当Boolean=True时有效,代表客户在该日期所属月份流失);Boolean=False表示客户从未流失,始终活跃。 - 月度期初活跃客户数 = 从未流失的客户总数 + 流失日期晚于当前月份的客户数(即当月初仍未流失的客户)。
- 月度流失客户数 = 当月内流失的客户量(
Boolean=True且start_date落在当月的客户数)。
实现步骤(Python)
用Pandas处理数据,Matplotlib/Seaborn绘图,完整代码如下:
1. 数据预处理
import pandas as pd import matplotlib.pyplot as plt import seaborn as sns # 加载数据(替换为你的数据源路径) df = pd.read_csv('customer_data.csv') # 转换日期格式,提取年月用于分组 df['start_date'] = pd.to_datetime(df['start_date']) df['churn_month'] = df['start_date'].dt.to_period('M') # 格式如2023-01
2. 统计月度流失客户数
# 筛选已流失客户,按月份统计数量 monthly_churn = df[df['Boolean'] == True].groupby('churn_month')['Boolean'].count().rename('churn_count')
3. 计算月度期初活跃客户数
先生成数据覆盖的完整月度序列,再逐个计算每月初的活跃客户量:
# 生成数据包含的所有月份 all_months = pd.period_range( start=df['start_date'].min().to_period('M'), end=df['start_date'].max().to_period('M'), freq='M' ) # 初始化存储期初活跃数的Series monthly_active_start = pd.Series(index=all_months, dtype=int) # 遍历每个月份计算活跃客户数 for month in all_months: # 期初活跃 = 从未流失的客户 + 流失月份晚于当前月的客户 active_count = len(df[(df['Boolean'] == False) | (df['churn_month'] > month)]) monthly_active_start.loc[month] = active_count monthly_active_start = monthly_active_start.rename('active_start_count')
4. 计算流失率并整合数据
# 合并数据,填充缺失值(无流失的月份补0) churn_rate_df = pd.concat([monthly_churn, monthly_active_start], axis=1).fillna(0) # 计算流失率,避免除以0的情况(除数为0时标记为NaN) churn_rate_df['churn_rate'] = churn_rate_df['churn_count'] / churn_rate_df['active_start_count'].replace(0, float('nan')) # 将Period索引转为datetime,方便绘图 churn_rate_df.index = churn_rate_df.index.to_timestamp()
5. 绘制时间序列图
plt.figure(figsize=(12, 6)) sns.lineplot(data=churn_rate_df, x=churn_rate_df.index, y='churn_rate', marker='o', color='#2ecc71') # 设置图表样式 plt.title('月度客户流失率趋势', fontsize=14) plt.xlabel('月份', fontsize=12) plt.ylabel('流失率', fontsize=12) plt.xticks(rotation=45) plt.grid(alpha=0.3) plt.tight_layout() plt.show()
适配不同数据结构的调整
如果你的start_date是客户注册日期,且存在单独的流失日期字段(比如churn_date),只需修改两处:
- 将
churn_month替换为df['churn_date'].dt.to_period('M') - 期初活跃客户数改为:
活跃客户数 = 注册日期早于当前月份的客户数 - 截至上月末已流失的客户数
内容的提问来源于stack exchange,提问作者JoMcGee
相关产品推荐
相关产品推荐

