LRFMC模型 Python 3.12 实战:5步构建航空公司客户价值聚类分析
·
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系统集成,实现:
- 自动标签客户价值等级
- 触发差异化营销流程
- 实时监控客户价值变迁
- 预测客户生命周期价值
更多推荐



所有评论(0)