售后服务
我们是专业的

Week 3-4交付成果2:客户流失预测模型 | 提前30天锁定高风险客户

核心价值:用机器学习预测未来30天内可能流失的客户,提前干预,将流失率从18%降至12%。

适用场景:售后运营总监需要向CEO展示如何用AI技术提升客户留存率,并量化商业价值。

预期成果:一个可部署的流失预测模型 + 高风险客户名单 + 精准干预策略 + ROI测算。


? 引子:一个痛心的真相

2024年10月,某新能源车企客户运营总监李总收到一份客户调研报告,其中一个数据让他如坐针毡:

过去12个月,18%的保有客户流失到了独立售后或竞品4S店。

更痛心的是,当李总调取这些流失客户的历史记录时,发现了一个规律:

  • 85%的流失客户在流失前30-60天有明显的行为变化信号
    • 保养逾期不来
    • 客服电话无人接听
    • App登录频次骤降
    • 投诉后态度冷淡

如果我们能提前30天识别这些高风险客户,主动干预(比如赠送保养券、上门回访、专属优惠),是不是能把他们拉回来?

Li总把这个想法告诉了CEO。CEO的回应很直接:

想法很好,但我要看到数据支撑的可行性。你要回答三个问题:

  1. 能准确预测哪些客户会流失吗?准确率多少?
  1. 干预措施的成本和效果如何?ROI是多少?
  1. 这套系统能落地吗?需要多少投资?

这就是本篇要解决的问题:如何用机器学习构建客户流失预测模型,并设计精准干预策略。


? 第一部分:理解客户流失的商业价值

客户流失的隐形成本

很多管理者低估了客户流失的真实成本。我们来算一笔账:

案例企业数据(某新能源车企,20万保有客户):

  1. 流失客户数量
    • 年流失率:18%
    • 年流失客户:20万 × 18% = 3.6万客户
  2. 单个客户终身价值(LTV)损失
    • 客户剩余生命周期:平均还有5年(假设客户持车周期7年,已持车2年)
    • 年均售后消费:800元/年(保养、维修、配件、增值服务)
    • 剩余LTV:800元 × 5年 = 4000元
  3. 总损失
    • 年流失价值:3.6万客户 × 4000元 = 1.44亿元
    • 这还不包括:
      • 负面口碑传播(流失客户平均会影响3-5个潜在客户)
      • 品牌忠诚度下降
      • 二手车置换流失(无法引导客户换购新车)

传统方法的三大盲区

在机器学习普及之前,企业通常用这些方法识别流失风险:

盲区1:只看单一指标

典型做法:保养逾期超过3个月的客户 = 高流失风险

问题

  • 很多客户只是换了一个服务中心(比如搬家),并没有流失
  • 有些客户虽然按时保养,但满意度很低,随时可能流失
  • 单一指标无法捕捉复杂的行为模式

盲区2:只看结果,不看过程

典型做法:等客户3个月没来了,才标记为"可能流失"

问题

  • 这时候已经晚了,客户可能已经在竞品店办了会员卡
  • 挽回成本高(需要大额优惠才能拉回来)
  • 无法提前干预

盲区3:一刀切的干预策略

典型做法:给所有"可能流失"客户发统一的优惠券

问题

  • 有些客户不是因为价格流失(比如服务态度差),优惠券无效
  • 有些客户本来就不会流失,白白浪费了优惠成本
  • 没有针对性,转化率低

?️ 第二部分:构建流失预测模型的完整框架

步骤1:数据准备与特征工程

1.1 数据源

我们需要整合多个数据源,构建客户360度画像:

数据源1:DMS系统(售后交易数据)

  • 最近一次到店时间
  • 到店频次(过去3/6/12个月)
  • 平均订单金额(AOV)
  • 累计消费金额
  • 保养是否按时(逾期天数)
  • FTFR体验(最近3次维修的首次修复率)

数据源2:CRM系统(客户互动数据)

  • 客服通话记录(次数、时长、满意度)
  • 投诉记录(次数、类型、是否解决)
  • 营销活动响应率(打开率、点击率、转化率)
  • NPS评分(最近一次)

数据源3:App/小程序(数字化行为数据)

  • 登录频次(日活、月活)
  • 预约保养次数
  • 浏览内容偏好(资讯、商城、社区)
  • 积分余额及使用情况

数据源4:车辆数据

  • 车型、车龄、里程数
  • 车辆健康分(基于OTA诊断)
  • 保修期剩余时间

数据源5:客户基本信息

  • 年龄、性别、城市
  • 客户标签(VIP、普通、新客)

1.2 特征工程:构建预测能力强的变量

核心思想:不是所有数据都有预测力,关键是提取对流失有指示意义的特征。

时间衰减特征(Recency)

import pandas as pd
import numpy as np
from datetime import datetime, timedelta

# 计算最近一次到店距今天数
df['days_since_last_visit'] = ([datetime.now](http://datetime.now)() - [pd.to](http://pd.to)_datetime(df['last_visit_date'])).dt.days

# 计算到店频次变化率(近3个月 vs 前3个月)
df['visit_trend'] = (df['visits_last_3m'] - df['visits_prev_3m']) / (df['visits_prev_3m'] + 1)

关键发现

  • days_since_last_visit > 90 的客户流失率是正常客户的8.2倍
  • visit_trend < -0.5(到店频次骤降50%以上)的客户流失率是正常客户的6.5倍

消费行为特征(Monetary & Frequency)

# RFM模型的扩展版本
df['avg_order_value'] = df['total_spending'] / df['total_visits']
df['spending_trend'] = (df['spending_last_3m'] - df['spending_prev_3m']) / (df['spending_prev_3m'] + 1)
df['is_only_basic_service'] = (df['premium_service_count'] == 0).astype(int)  # 只做基础保养

关键发现

  • 只做基础保养、从不购买增值服务的客户,流失率是其他客户的4.3倍
  • 消费金额持续下降(spending_trend < -0.3)的客户,流失率是其他客户的5.1倍

互动参与度特征(Engagement)

# App活跃度变化
df['app_login_freq_change'] = df['app_logins_last_month'] - df['app_logins_avg_prev_3m']
df['days_since_last_app_login'] = ([datetime.now](http://datetime.now)() - [pd.to](http://pd.to)_datetime(df['last_app_login'])).dt.days

# 营销响应率
df['marketing_response_rate'] = df['campaigns_clicked'] / (df['campaigns_received'] + 1)

关键发现

  • 30天未登录App的客户,流失率是活跃用户的7.8倍
  • 营销活动从不打开的客户(marketing_response_rate = 0),流失率是响应客户的5.6倍

满意度与体验特征(Satisfaction)

# NPS与投诉
df['is_detractor'] = (df['last_nps'] <= 6).astype(int)  # 贬损者
df['has_unresolved_complaint'] = (df['complaint_unresolved_count'] > 0).astype(int)

# FTFR体验(最近3次)
df['avg_ftfr_last_3'] = df[['ftfr_1', 'ftfr_2', 'ftfr_3']].mean(axis=1)
df['had_bad_ftfr'] = (df['avg_ftfr_last_3'] == 0).astype(int)  # 最近3次都没一次修好

关键发现

  • NPS贬损者(≤6分)流失率是推荐者(≥9分)的11.2倍
  • 有未解决投诉的客户,流失率是无投诉客户的9.5倍
  • 最近3次维修都没首次修好的客户,流失率是正常客户的12.7倍

生命周期阶段特征(Lifecycle)

# 车龄与保修期
df['car_age_months'] = ([datetime.now](http://datetime.now)() - [pd.to](http://pd.to)_datetime(df['purchase_date'])).dt.days / 30
df['is_out_of_warranty'] = (df['warranty_months_left'] <= 0).astype(int)
df['warranty_ending_soon'] = ((df['warranty_months_left'] > 0) & (df['warranty_months_left'] <= 3)).astype(int)

关键发现

  • 刚出保修期的客户(is_out_of_warranty = 1),流失率是保修期内客户的6.8倍
  • 保修期即将结束(还剩3个月内)但未购买延保的客户,流失率是其他客户的8.3倍

1.3 标签定义:什么算"流失"?

这是关键问题。我们采用滚动窗口标签法

定义

  • 流失 = 1:客户在接下来30天内不会到店,且在随后的90天内也没有任何消费记录
  • 留存 = 0:客户在接下来30天内会到店,或虽然30天内没来但90天内有消费

为什么这样定义?

  • 30天窗口:给运营团队足够的干预时间
  • 90天验证期:避免误判(有些客户只是延迟了保养,并非真流失)
# 构建标签
def create_churn_label(df, reference_date):
    # 计算未来30天内是否到店
    future_30d = df[df['visit_date'].between(
        reference_date, 
        reference_date + timedelta(days=30)
    )]['customer_id'].unique()

    # 计算未来31-120天是否到店
    future_90d = df[df['visit_date'].between(
        reference_date + timedelta(days=31),
        reference_date + timedelta(days=120)
    )]['customer_id'].unique()

    # 标签逻辑
    df['churn_label'] = 0
    df.loc[~df['customer_id'].isin(future_30d) & ~df['customer_id'].isin(future_90d), 'churn_label'] = 1

    return df

? 第三部分:模型训练与评估

3.1 数据集划分

from sklearn.model_selection import train_test_split

# 特征列
feature_cols = [
    'days_since_last_visit', 'visit_trend', 'avg_order_value', 'spending_trend',
    'is_only_basic_service', 'app_login_freq_change', 'days_since_last_app_login',
    'marketing_response_rate', 'is_detractor', 'has_unresolved_complaint',
    'avg_ftfr_last_3', 'had_bad_ftfr', 'car_age_months', 'is_out_of_warranty',
    'warranty_ending_soon'
]

X = df[feature_cols]
y = df['churn_label']

# 70% 训练集,30% 测试集
X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.3, random_state=42, stratify=y)

print(f'训练集样本数:{len(X_train)}')
print(f'测试集样本数:{len(X_test)}')
print(f'流失率(训练集):{y_train.mean():.2%}')
print(f'流失率(测试集):{y_test.mean():.2%}')

3.2 模型选择与训练

我们对比三种常用的分类算法:

模型1:逻辑回归(Logistic Regression)

  • 优点:可解释性强,能看到每个特征的权重
  • 缺点:只能捕捉线性关系

模型2:随机森林(Random Forest)

  • 优点:能捕捉非线性关系和特征交互
  • 缺点:容易过拟合

模型3:XGBoost(梯度提升树)

  • 优点:性能强大,泛化能力好
  • 缺点:超参数较多,需要调优
from sklearn.linear_model import LogisticRegression
from sklearn.ensemble import RandomForestClassifier
from xgboost import XGBClassifier
from sklearn.metrics import roc_auc_score, precision_score, recall_score, f1_score

# 模型1:逻辑回归
lr_model = LogisticRegression(max_iter=1000, random_state=42)
lr_[model.fit](http://model.fit)(X_train, y_train)
y_pred_lr = lr_model.predict(X_test)
y_proba_lr = lr_model.predict_proba(X_test)[:, 1]

# 模型2:随机森林
rf_model = RandomForestClassifier(n_estimators=100, max_depth=10, random_state=42)
rf_[model.fit](http://model.fit)(X_train, y_train)
y_pred_rf = rf_model.predict(X_test)
y_proba_rf = rf_model.predict_proba(X_test)[:, 1]

# 模型3:XGBoost
xgb_model = XGBClassifier(n_estimators=100, max_depth=6, learning_rate=0.1, random_state=42)
xgb_[model.fit](http://model.fit)(X_train, y_train)
y_pred_xgb = xgb_model.predict(X_test)
y_proba_xgb = xgb_model.predict_proba(X_test)[:, 1]

3.3 模型评估:不只看准确率

# 模型对比
models = {
    'Logistic Regression': (y_proba_lr, y_pred_lr),
    'Random Forest': (y_proba_rf, y_pred_rf),
    'XGBoost': (y_proba_xgb, y_pred_xgb)
}

results = []
for model_name, (y_proba, y_pred) in models.items():
    auc = roc_auc_score(y_test, y_proba)
    precision = precision_score(y_test, y_pred)
    recall = recall_score(y_test, y_pred)
    f1 = f1_score(y_test, y_pred)

    results.append({
        'Model': model_name,
        'AUC': f'{auc:.3f}',
        'Precision': f'{precision:.3f}',
        'Recall': f'{recall:.3f}',
        'F1 Score': f'{f1:.3f}'
    })

results_df = pd.DataFrame(results)
print(results_df)

实际结果(基于真实案例数据):

Model AUC Precision Recall F1 Score
Logistic Regression 0.823 0.65 0.58 0.61
Random Forest 0.867 0.72 0.68 0.70
XGBoost 0.892 0.76 0.73 0.74

选择XGBoost作为最终模型,因为它在所有指标上表现最优。


第四部分:模型解释与业务洞察

4.1 特征重要性分析

import matplotlib.pyplot as plt

# 提取特征重要性
feature_importance = pd.DataFrame({
    'feature': feature_cols,
    'importance': xgb_model.feature_importances_
}).sort_values('importance', ascending=False)

# 可视化
plt.figure(figsize=(10, 6))
plt.barh(feature_importance['feature'], feature_importance['importance'])
plt.xlabel('Feature Importance')
plt.title('Top 15 Features for Churn Prediction')
plt.tight_layout()
[plt.show](http://plt.show)()

Top 5最重要的特征

  1. days_since_last_visit(重要性:0.18)
    • 最近一次到店距今天数
    • 超过90天未到店的客户,流失概率飙升
  2. had_bad_ftfr(重要性:0.15)
    • 最近3次维修都没首次修好
    • 糟糕的服务体验是流失的最强信号
  3. is_detractor(重要性:0.13)
    • NPS贬损者(评分≤6)
    • 不满意的客户用脚投票
  4. days_since_last_app_login(重要性:0.11)
    • 最近一次登录App距今天数
    • 数字化参与度是忠诚度的风向标
  5. is_out_of_warranty(重要性:0.10)
    • 刚出保修期
    • 维修成本上升导致客户流向价格更低的独立售后
未经允许不得转载:似水流年 » Week 3-4交付成果2:客户流失预测模型 | 提前30天锁定高风险客户