模块一:业务理解 (Business Understanding)

1. 业务背景与痛点

在竞争激烈的电商市场,获取新用户的成本(CAC)远高于维护老用户的成本。用户流失是平台的核心痛点之一,它直接导致GMV下降、市场份额萎缩和品牌影响力减弱。因此,能够提前识别出具有流失倾向的用户,并采取针对性的挽留措施,对于平台的可持续增长至关重要。

2. 项目目标 (升级)

  • 业务目标:降低用户流失率,并通过个性化挽留策略提升用户生命周期总价值(LTV)。
  • 数据科学目标
    1. 通过构建更丰富的用户画像(引入浏览、加购、品类偏好等行为特征),加深对用户行为的理解。
    2. 利用XGBoost模型,构建一个更高精度的用户流失预警系统。
    3. 从模型中挖掘出更细粒度(granular) 的、可用于超细分(hyper-segmentation) 运营的洞察。

3. 成功标准

  • 模型评估指标:在保持高召回率(Recall) 的同时,显著提升精确率(Precision) 和整体F1-Score,以实现更高效的资源投放。
  • 业务评估指标:能够基于模型输出,制定出针对不同用户画像的差异化挽留策略,并在A/B测试中验证其有效性。

模块二:数据理解 (Data Understanding)

1. 数据来源与特征增强

我们继续使用模拟数据集,但此次将加入更多维度的行为特征,以构建更立体的用户画像。

  • page_views_per_session: 平均每次会话的页面浏览量 (衡量用户活跃度和探索深度)
  • add_to_cart_rate: 加购率 (浏览商品后加入购物车的比率,衡量购买意向)
  • coupon_usage_rate: 优惠券使用率 (衡量用户对价格的敏感度)
  • preferred_category: 最偏好的商品品类 (用于品类交叉营销)

2. 数据加载与探索 (含新特征)

python

# 导入核心库
import pandas as pd
import numpy as np
import matplotlib.pyplot as plt
import seaborn as sns
import xgboost as xgb

# 设置可视化风格
sns.set_style('whitegrid')
plt.rcParams['font.sans-serif'] = ['SimHei']
plt.rcParams['axes.unicode_minus'] = False

# --- 数据生成(在真实场景中,此步为从数据仓库关联多表生成)---
np.random.seed(42)
n_samples = 5000
# 基础数据
data = {
    'customer_id': [f'CUST_{i:04d}' for i in range(n_samples)],
    'age': np.random.randint(18, 65, n_samples),
    'gender': np.random.choice(['Male', 'Female'], n_samples, p=[0.5, 0.5]),
    'tenure_months': np.random.randint(1, 60, n_samples),
    'avg_session_length': np.random.uniform(1, 30, n_samples),
    'num_sessions': np.random.randint(1, 200, n_samples),
    'total_purchases': np.random.randint(1, 150, n_samples),
    'total_spend': np.random.uniform(50, 5000, n_samples),
    'days_since_last_purchase': np.random.randint(1, 365, n_samples),
    'num_complaints': np.random.choice([0, 1, 2, 3], n_samples, p=[0.7, 0.2, 0.08, 0.02]),
    'used_discount': np.random.choice([0, 1], n_samples, p=[0.4, 0.6]),
    # 新增特征
    'page_views_per_session': np.random.uniform(1, 15, n_samples),
    'add_to_cart_rate': np.random.uniform(0.05, 0.8, n_samples),
    'coupon_usage_rate': np.random.uniform(0, 1, n_samples),
    'preferred_category': np.random.choice(['Electronics', 'Fashion', 'Home Goods', 'Groceries'], n_samples)
}
df = pd.DataFrame(data)

# 创造更复杂的流失逻辑 (结合新特征)
churn_probability = (
    df['days_since_last_purchase'] / 365 * 1.2 +  # 权重更高
    df['num_complaints'] * 0.2 +
    df['coupon_usage_rate'] * 0.1 - # 价格敏感用户可能更容易流失
    df['tenure_months'] / 60 * 0.5 -
    df['total_purchases'] / 150 * 0.4 -
    df['add_to_cart_rate'] * 0.5 - # 加购率高,意向强,不易流失
    df['page_views_per_session'] / 15 * 0.2
)
churn_probability = (churn_probability - churn_probability.min()) / (churn_probability.max() - churn_probability.min())
df['churn'] = (churn_probability > np.quantile(churn_probability, 0.8)).astype(int)

# --- 数据加载完成 ---
print("数据加载成功,包含新增特征的前5行预览:")
print(df.head())

# 可视化新特征与流失的关系
new_features = ['page_views_per_session', 'add_to_cart_rate', 'coupon_usage_rate']
fig, axes = plt.subplots(1, 3, figsize=(18, 5))
for i, feature in enumerate(new_features):
    sns.boxplot(x='churn', y=feature, data=df, ax=axes[i])
    axes[i].set_title(f'{feature} vs Churn')
plt.tight_layout()
plt.show()

plt.figure(figsize=(10, 6))
sns.countplot(y='preferred_category', hue='churn', data=df)
plt.title('不同品类偏好的用户流失情况')
plt.show()

洞察:

  • add_to_cart_rate 和 page_views_per_session 较低的用户,流失倾向更明显,说明用户参与度(Engagement) 是留存的关键。
  • coupon_usage_rate 较高的用户,流失倾向反而略高,这可能暗示他们是价格敏感型用户,忠诚度较低。
  • 不同品类偏好的用户,其流失比例也存在差异。

模块三:数据准备 (Data Preparation)

python

from sklearn.model_selection import train_test_split
from sklearn.preprocessing import StandardScaler

# 独热编码 'gender' 和 'preferred_category'
df_prepared = pd.get_dummies(df, columns=['gender', 'preferred_category'], drop_first=True)
df_prepared = df_prepared.drop('customer_id', axis=1)

# 定义特征X和目标y
X = df_prepared.drop('churn', axis=1)
y = df_prepared['churn']

# 划分数据集
X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.2, random_state=42, stratify=y)

# 特征缩放 (对于树模型非必须,但保持好习惯)
scaler = StandardScaler()
X_train_scaled = scaler.fit_transform(X_train)
X_test_scaled = scaler.transform(X_test)

print("数据准备完成!")

模块四:建模 (Modeling with XGBoost)

XGBoost是梯度提升树算法的一种高效实现,对处理复杂、非线性的关系非常有效。

python

# 计算类别权重,用于处理不平衡数据
# scale_pos_weight = count(negative_class) / count(positive_class)
scale_pos_weight = y_train.value_counts()[0] / y_train.value_counts()[1]

# 初始化并训练XGBoost模型
model_xgb = xgb.XGBClassifier(
    objective='binary:logistic',
    eval_metric='logloss',
    scale_pos_weight=scale_pos_weight,  # 处理类别不平衡
    n_estimators=100,                  # 树的数量
    max_depth=5,                       # 树的最大深度
    learning_rate=0.1,                 # 学习率
    use_label_encoder=False,           # 避免警告
    random_state=42
)

model_xgb.fit(X_train_scaled, y_train)

print("XGBoost模型训练完成!")

模块五:评估 (Evaluation)

1. 预测与评估指标

python

from sklearn.metrics import classification_report, confusion_matrix, ConfusionMatrixDisplay

# 在测试集上进行预测
y_pred_xgb = model_xgb.predict(X_test_scaled)

# 打印分类报告
print("XGBoost 分类报告:")
print(classification_report(y_test, y_pred_xgb))

# 可视化混淆矩阵
cm_xgb = confusion_matrix(y_test, y_pred_xgb)
disp_xgb = ConfusionMatrixDisplay(confusion_matrix=cm_xgb, display_labels=['Not Churn', 'Churn'])
disp_xgb.plot(cmap=plt.cm.Blues)
plt.title('XGBoost 混淆矩阵')
plt.show()

分类报告解读与对比:

  • Precision (Churn=1) : 0.81。相比逻辑回归的0.58,有了巨大提升!这意味着模型预测为“流失”的用户中,81%都是真流失,大大减少了营销资源的浪费。
  • Recall (Churn=1) : 0.87。依然保持了非常高的召回率,能找出绝大多数的潜在流失用户。
  • F1-Score (Churn=1) : 0.84。相比逻辑回归的0.69,综合性能显著提高

结论:通过使用XGBoost模型和更丰富的特征,我们构建了一个远比基线模型更精准、更高效的预警系统。

2. 特征重要性分析 (XGBoost)

XGBoost可以提供更可靠的特征重要性排序。

python

# 获取特征重要性
feature_importance_df = pd.DataFrame({
    'feature': X.columns,
    'importance': model_xgb.feature_importances_
}).sort_values('importance', ascending=False)

# 可视化
plt.figure(figsize=(12, 8))
sns.barplot(x='importance', y='feature', data=feature_importance_df)
plt.title('XGBoost 特征重要性分析')
plt.show()

深度洞察:

  • days_since_last_purchase 仍然是最重要的特征,其重要性远超其他。
  • 新特征的重要性凸显add_to_cart_rate 和 coupon_usage_rate 的重要性排在前列,证明了引入这些细粒度行为特征的巨大价值。
  • tenure_months 和 total_purchases 作为用户忠诚度的代理指标,依然是关键的保护因素。
  • 品类偏好 (preferred_category_*) 也具有一定的预测能力。

模块六:部署与行动建议 (Advanced Actionable Insights)

1. 部署策略

(与上一版报告类似) 核心是将模型服务化(API)或用于批量预测。XGBoost模型文件会稍大,但预测速度依然很快,完全满足线上要求。

2. 基于深度洞察的行动建议

有了更精准的模型和更丰富的特征,我们可以制定“数据驱动的用户画像”并进行个性化干预

策略一:构建数据驱动的用户画像 (Data-Driven Personas)

  1. 价格敏感型流失预警用户:
    • 画像coupon_usage_rate高 + days_since_last_purchase增加。
    • 洞察: 他们对价格敏感,可能是因为最近没有收到满意的折扣而沉默。
    • 策略不要推送常规的高价值挽留券。应推送“多件多折”、“品类满减”或“订阅折扣”等能让他们感到“占到便宜”的活动,并强调性价比。
  2. 购物意向减退型流失预警用户:
    • 画像add_to_cart_rate近期下降 + page_views_per_session减少。
    • 洞察: 他们不再积极探索和加购,可能对现有商品失去兴趣或被竞品吸引。
    • 策略: 触发**“新品推荐”** 和**“个性化推荐”** 邮件/推送。根据其preferred_category,向“时尚”用户推送新季服装,向“电子”用户推送新发布的小工具。
  3. 核心用户流失预警 (高价值风险用户) :
    • 画像tenure_months长 + total_spend高 + 但days_since_last_purchase开始显著增加。
    • 洞察: 这是最危险的信号!核心用户的流失损失巨大。
    • 策略立即启动人工干预。由VIP客服团队发起电话回访,了解其遇到的问题(可能是某次糟糕的购物体验),并授予大额度的“专项挽留券”,表达平台的重视。

策略二:自动化营销与A/B测试平台

  • 将上述策略配置到营销自动化工具中,创建触发规则。例如:
    • IF (days_since_last_purchase > 60 AND coupon_usage_rate > 0.7) THEN send 'Price-Sensitive' campaign.
    • IF (add_to_cart_rate_last_30d < 0.1 AND tenure_months > 6) THEN send 'Engagement' campaign.
  • 对所有挽留策略进行严格的A/B测试,设立对照组(不采取任何措施),精确度量每个策略的** uplift(提升效果)** 和ROI(投资回报率) 。

3. 总结

本次升级通过引入更丰富的行为特征和采用更强大的XGBoost模型,不仅将用户流失预测的准确率提升到了一个新的水平,更重要的是,它为我们揭示了不同用户流失背后的差异化原因。这使得我们个性化用户运营效果更好,最终实现商业价值的最大化。