LRFMC模型Python 3.12实战:5步构建航空公司客户价值聚类分析

在航空业竞争日益激烈的今天,如何精准识别高价值客户并制定差异化服务策略,成为航空公司提升盈利能力的关键。传统RFM模型在航空领域存在明显局限——它无法区分同样消费金额但实际价值差异显著的客户(如短途经济舱与长途商务舱旅客)。本文将带您用Python 3.12完整实现专为航空业优化的LRFMC模型,通过5个关键步骤完成从数据清洗到业务落地的全流程分析。

1. 环境准备与数据加载

工欲善其事,必先利其器。我们选择Python 3.12作为分析工具,因其在数据处理和机器学习方面的性能优化尤为突出。以下是需要安装的核心库及其作用:

# 必需库列表(建议使用conda创建专属环境)
import pandas as pd  # 数据操作(1.5.3+)
import numpy as np   # 数值计算(1.24.0+)
from sklearn.preprocessing import StandardScaler  # 数据标准化
from sklearn.cluster import KMeans  # 聚类分析(1.3.0+)
import matplotlib.pyplot as plt  # 可视化(3.7.0+)
plt.style.use('seaborn-v0_8')  # 设置现代可视化风格

航空数据通常包含数十个字段,我们需要重点关注与LRFMC模型相关的6个原始属性:

| 原始字段        | 数据类型 | 业务含义                     |
|----------------|----------|-----------------------------|
| FFP_DATE       | datetime | 会员入会日期                 |
| LOAD_TIME      | datetime | 观测窗口结束日期             |
| LAST_TO_END    | int      | 最近一次乘机间隔天数         |
| FLIGHT_COUNT   | int      | 观测窗口内飞行次数           |
| SEG_KM_SUM     | float    | 观测窗口内总飞行里程(公里) |
| AVG_DISCOUNT   | float    | 平均折扣率(0-1)           |

数据加载时需特别注意字符编码问题,航空数据常包含中文注释,推荐使用UTF-8或GB18030编码:

raw_data = pd.read_csv('air_data.csv', 
                      encoding='gb18030',
                      parse_dates=['FFP_DATE', 'LOAD_TIME'])

2. 数据预处理与特征工程

2.1 智能数据清洗策略

航空数据常见的异常情况需要针对性处理:

  • 票价空值 :可能是未实际乘机的注册会员
  • 零票价但飞行记录 :积分兑换或员工免票
  • 异常折扣率 :系统录入错误
# 构建多条件过滤规则
condition = (
    raw_data['SUM_YR_1'].notnull() &  # 票价1非空
    raw_data['SUM_YR_2'].notnull() &  # 票价2非空
    (
        (raw_data['SUM_YR_1'] > 0) |  # 票价1为正
        (raw_data['SUM_YR_2'] > 0) |  # 或票价2为正
        (
            (raw_data['SEG_KM_SUM'] == 0) &  # 或零里程且
            (raw_data['avg_discount'] == 0)   # 零折扣
        )
    )
)
clean_data = raw_data[condition].copy()

2.2 LRFMC特征构造

传统RFM模型扩展为航空专属的LRFMC五维特征:

# 计算L特征(会员忠诚度)
clean_data['L'] = (
    (clean_data['LOAD_TIME'] - clean_data['FFP_DATE'])
    .dt.days / 30  # 转换为月数
).round(1)

# 直接映射其他特征
feature_map = {
    'R': 'LAST_TO_END',    # 最近消费间隔
    'F': 'FLIGHT_COUNT',   # 消费频率
    'M': 'SEG_KM_SUM',     # 飞行里程
    'C': 'avg_discount'    # 折扣系数
}
lrfmc_data = clean_data[['L'] + list(feature_map.values())]
lrfmc_data.columns = ['L'] + list(feature_map.keys())

提示:L特征的单位转换(天→月)能有效缩小数值范围,提升后续聚类效果

3. 数据标准化与聚类分析

3.1 标准化处理

不同特征的量纲差异会导致聚类结果偏向大数值特征,我们采用Z-score标准化:

scaler = StandardScaler()
scaled_data = scaler.fit_transform(lrfmc_data)
scaled_df = pd.DataFrame(scaled_data, 
                        columns=[f'Z_{col}' for col in lrfmc_data.columns])

标准化后的数据分布应符合以下特征:

  • 各特征均值≈0
  • 标准差≈1
  • 95%数据落在[-2,2]区间

3.2 K-Means聚类实战

确定最佳聚类数需要结合肘部法则和业务理解:

# 寻找最佳K值(2-10范围内)
inertia = []
for k in range(2, 11):
    kmeans = KMeans(n_clusters=k, random_state=42, n_init=10)
    kmeans.fit(scaled_df)
    inertia.append(kmeans.inertia_)

# 可视化肘部曲线
plt.plot(range(2,11), inertia, marker='o')
plt.xlabel('Number of clusters')
plt.ylabel('Inertia')
plt.title('Elbow Method for Optimal K')
plt.show()

基于航空业务场景,我们选择K=5进行最终建模:

final_kmeans = KMeans(n_clusters=5, random_state=42, n_init=10)
clusters = final_kmeans.fit_predict(scaled_df)
lrfmc_data['Cluster'] = clusters  # 添加聚类标签

4. 可视化与业务解读

4.1 雷达图呈现客户特征

# 准备雷达图数据
cluster_means = lrfmc_data.groupby('Cluster').mean()
labels = cluster_means.columns.tolist()
stats = cluster_means.values.tolist()

# 绘制雷达图
fig = plt.figure(figsize=(10, 8))
ax = fig.add_subplot(111, polar=True)

angles = np.linspace(0, 2*np.pi, len(labels), endpoint=False).tolist()
angles += angles[:1]  # 闭合图形

for stat in stats:
    stat += stat[:1]  # 闭合图形
    ax.plot(angles, stat, linewidth=2, linestyle='solid', label=f'Cluster {stats.index(stat)}')
    ax.fill(angles, stat, alpha=0.25)

ax.set_thetagrids(np.degrees(angles[:-1]), labels)
ax.set_title('Customer Segmentation Radar Chart', pad=20)
ax.legend(loc='upper right', bbox_to_anchor=(1.3, 1.1))
plt.tight_layout()

4.2 客户价值分类与营销策略

根据聚类中心特征,我们将客户划分为5个价值等级:

| 客户类型       | L    | R    | F    | M    | C    | 营销策略                     |
|---------------|------|------|------|------|------|-----------------------------|
| 重要保持客户 | 高   | 低   | 高   | 高   | 中   | 提供专属客服、升舱特权       |
| 重要发展客户 | 中   | 中   | 中   | 高   | 高   | 定向里程促销、联名卡推荐     |
| 重要挽留客户 | 高   | 高   | 高   | 高   | 中   | 流失预警、高价值挽回优惠     |
| 一般客户     | 低   | 高   | 低   | 低   | 低   | 基础会员福利、偶尔促销触达   |
| 低价值客户   | 低   | 高   | 低   | 低   | 低   | 减少营销资源投入             |

典型业务解读示例:

  • Cluster 0 (重要保持客户):平均入会时间58个月,最近乘机在1个月内,年均飞行18次,累计里程12万公里。这类客户仅占8%但贡献40%营收,需提供定制化服务。
  • Cluster 3 (重要挽留客户):虽然历史消费频次高,但最近6个月无乘机记录,应立即启动客户挽回计划,如发送限量版优惠券或免费休息室体验券。

5. 模型部署与业务集成

5.1 新客户实时分类

将训练好的模型封装为预测API:

import joblib

# 保存模型
joblib.dump(final_kmeans, 'lrfmc_kmeans.pkl')
joblib.dump(scaler, 'lrfmc_scaler.pkl')

# 加载模型进行预测
def predict_new_customer(data):
    model = joblib.load('lrfmc_kmeans.pkl')
    scaler = joblib.load('lrfmc_scaler.pkl')
    scaled_data = scaler.transform(data)
    return model.predict(scaled_data)

5.2 自动化报表系统

使用Python自动化生成客户分群报告:

def generate_cluster_report(df):
    report = []
    for cluster in sorted(df['Cluster'].unique()):
        subset = df[df['Cluster'] == cluster]
        desc = subset.describe().loc[['mean', 'std']].T
        report.append(f"\n=== Cluster {cluster} ===\n{desc.to_string()}")
    return "\n".join(report)

with open('cluster_report.txt', 'w') as f:
    f.write(generate_cluster_report(lrfmc_data))

实际项目中,这类分析通常会与航空公司CRM系统集成,实现:

  • 自动标签客户价值等级
  • 触发差异化营销流程
  • 实时监控客户价值变迁
  • 预测客户生命周期价值
Logo

Agent 垂直技术社区,欢迎活跃、内容共建。

更多推荐