LRFMC模型 Python 3.12 实战:5步完成航空公司客户价值聚类与雷达图可视化
LRFMC模型Python 3.12实战:5步完成航空公司客户价值聚类与雷达图可视化
在航空业这个竞争激烈的市场中,理解客户价值并采取针对性策略已成为企业生存发展的关键。传统RFM模型在分析航空客户时存在明显局限——飞行里程和折扣率的复杂性使得单纯以消费金额衡量客户价值变得不再准确。这正是LRFMC模型的价值所在,它通过五个维度全面评估航空客户价值,为企业资源分配提供科学依据。
本文将带您使用Python 3.12完整实现LRFMC模型分析流程,从数据清洗到可视化呈现,最终产出可直接用于业务决策的客户分群结果。不同于理论讲解,我们聚焦于可落地的代码实现和直观的结果解读,让数据真正产生商业价值。
1. 环境准备与数据加载
工欲善其事,必先利其器。我们首先配置Python 3.12的分析环境。建议使用Anaconda创建独立环境,避免包版本冲突:
conda create -n airline python=3.12 conda activate airline pip install pandas numpy scikit-learn matplotlib seaborn航空公司客户数据通常包含会员基本信息、乘机记录、消费明细等。假设我们已获得包含以下关键字段的原始数据集:
- 会员信息:FFP_DATE(入会日期)、LOAD_TIME(观测窗口结束时间)
- 乘机行为:LAST_TO_END(最后一次乘机距结束时间)、FLIGHT_COUNT(飞行次数)
- 消费特征:SEG_KM_SUM(总飞行公里数)、avg_discount(平均折扣率)
加载数据并初步探索:
import pandas as pd import numpy as np # 加载原始数据 raw_data = pd.read_csv('air_data.csv', encoding='utf-8') print(f"原始数据量: {len(raw_data)}条记录") print("数据概览:") print(raw_data.head(3)) # 检查缺失值 missing_values = raw_data.isnull().sum() print("\n缺失值统计:") print(missing_values[missing_values > 0])典型的数据质量问题包括票价空值、异常零值记录等。这些"脏数据"会严重影响后续分析,必须谨慎处理。
2. 数据预处理与特征工程
高质量的分析始于干净的数据。航空数据清洗需结合业务逻辑,我们重点关注两类问题记录:
- 票价空值:可能表示客户无实际乘机记录
- 零票价异常:票价为零但折扣率非零且飞行里程为正,数据矛盾
清洗代码实现:
# 复制原始数据避免污染 clean_data = raw_data.copy() # 规则1:删除票价空值记录 clean_data = clean_data[clean_data['SUM_YR_1'].notnull() & clean_data['SUM_YR_2'].notnull()] # 规则2:删除异常零值记录 zero_fare = (clean_data['SUM_YR_1'] == 0) & (clean_data['SUM_YR_2'] == 0) nonzero_discount = (clean_data['avg_discount'] != 0) positive_distance = (clean_data['SEG_KM_SUM'] > 0) anomaly_index = zero_fare & nonzero_discount & positive_distance clean_data = clean_data[~anomaly_index] print(f"清洗后数据量: {len(clean_data)}条")接下来构造LRFMC特征。这五个维度分别反映客户的不同价值侧面:
| 指标 | 计算公式 | 业务意义 |
|---|---|---|
| L (客户关系长度) | LOAD_TIME - FFP_DATE | 会员忠诚度时长 |
| R (最近消费时间) | LAST_TO_END | 客户活跃程度 |
| F (消费频率) | FLIGHT_COUNT | 客户乘机频次 |
| M (飞行里程) | SEG_KM_SUM | 客户贡献规模 |
| C (平均折扣率) | avg_discount | 客户价值质量 |
特征构造代码:
# 转换日期格式 clean_data['FFP_DATE'] = pd.to_datetime(clean_data['FFP_DATE']) clean_data['LOAD_TIME'] = pd.to_datetime(clean_data['LOAD_TIME']) # 计算L特征:会员时长(月) clean_data['L'] = ((clean_data['LOAD_TIME'] - clean_data['FFP_DATE']).dt.days / 30).round(1) # 其他特征直接映射 clean_data['R'] = clean_data['LAST_TO_END'] clean_data['F'] = clean_data['FLIGHT_COUNT'] clean_data['M'] = clean_data['SEG_KM_SUM'] clean_data['C'] = clean_data['avg_discount'] # 选择最终特征 lrfmc_data = clean_data[['L', 'R', 'F', 'M', 'C']]由于各指标量纲差异大(如L是月数,M是公里数),必须进行标准化处理:
from sklearn.preprocessing import StandardScaler scaler = StandardScaler() lrfmc_scaled = scaler.fit_transform(lrfmc_data) lrfmc_scaled = pd.DataFrame(lrfmc_scaled, columns=['ZL', 'ZR', 'ZF', 'ZM', 'ZC']) print("标准化后数据样例:") print(lrfmc_scaled.head())3. K-Means聚类建模
聚类分析是客户分群的核心。我们使用K-Means算法,关键步骤包括:
- 确定最佳聚类数(K值)
- 训练聚类模型
- 评估聚类效果
3.1 寻找最佳K值
肘部法则(Elbow Method)通过观察不同K值下SSE(误差平方和)的变化确定最佳聚类数:
import matplotlib.pyplot as plt from sklearn.cluster import KMeans sse = [] k_range = range(1, 10) for k in k_range: kmeans = KMeans(n_clusters=k, random_state=42) kmeans.fit(lrfmc_scaled) sse.append(kmeans.inertia_) # 绘制肘部曲线 plt.figure(figsize=(8, 4)) plt.plot(k_range, sse, 'bo-') plt.xlabel('聚类数 K') plt.ylabel('SSE') plt.title('肘部法则确定最佳K值') plt.grid(True) plt.show()航空客户分析通常选择K=5,对应五类典型客户群体。这与业务经验相符,也便于后续制定差异化策略。
3.2 训练聚类模型
确定K=5后,训练最终模型:
k = 5 kmeans = KMeans(n_clusters=k, random_state=42) clusters = kmeans.fit_predict(lrfmc_scaled) # 将聚类结果加入数据集 lrfmc_data['Cluster'] = clusters lrfmc_scaled['Cluster'] = clusters # 查看各类样本分布 cluster_dist = lrfmc_data['Cluster'].value_counts().sort_index() print("各类客户数量分布:") print(cluster_dist)3.3 聚类中心分析
聚类中心反映各类客户的典型特征:
cluster_centers = pd.DataFrame( scaler.inverse_transform(kmeans.cluster_centers_), columns=['L', 'R', 'F', 'M', 'C'] ) cluster_centers['Cluster'] = range(k) print("各类客户特征中心值:") print(cluster_centers.round(1))通过对比各维度数值,我们已能初步识别高价值客户群。但为了更直观理解,需要进一步可视化分析。
4. 客户价值可视化分析
4.1 雷达图绘制
雷达图能同时展示五个维度的特征,是呈现客户群特征的理想选择:
import numpy as np # 准备雷达图数据 labels = ['L', 'R', 'F', 'M', 'C'] centers = cluster_centers.drop('Cluster', axis=1) angles = np.linspace(0, 2*np.pi, len(labels), endpoint=False) angles = np.concatenate((angles, [angles[0]])) # 闭合图形 # 绘制雷达图 fig = plt.figure(figsize=(10, 6)) ax = fig.add_subplot(111, polar=True) for i in range(k): values = centers.iloc[i].values values = np.concatenate((values, [values[0]])) ax.plot(angles, values, 'o-', linewidth=2, label=f'Cluster {i}') ax.fill(angles, values, alpha=0.1) ax.set_thetagrids(angles * 180/np.pi, labels) ax.set_title('航空客户群特征雷达图', pad=20) ax.grid(True) ax.legend(loc='upper right', bbox_to_anchor=(1.2, 1.1)) plt.show()4.2 业务解读与客户命名
结合雷达图和聚类中心,我们为每类客户赋予业务含义:
| 类别 | L(忠诚度) | R(活跃度) | F(频率) | M(里程) | C(折扣) | 客户类型 |
|---|---|---|---|---|---|---|
| 0 | 高 | 低 | 高 | 高 | 高 | 重要保持客户 |
| 1 | 中 | 中 | 中 | 中 | 中 | 一般客户 |
| 2 | 低 | 高 | 低 | 低 | 低 | 低价值客户 |
| 3 | 高 | 中 | 低 | 低 | 高 | 重要发展客户 |
| 4 | 中 | 高 | 中 | 中 | 低 | 重要挽留客户 |
重要保持客户(Cluster 0)是最优质的客户群体:入会时间长、最近有乘机、频率高、里程多且不在意折扣。航空公司应优先保障这类客户的服务体验,防止流失。
5. 分析结果应用与策略建议
数据价值在于落地应用。基于聚类结果,我们可制定精准营销策略:
- 重要保持客户:提供专属增值服务(如免费升舱、贵宾厅),增强客户粘性
- 重要发展客户:设计里程加速计划,鼓励增加乘机频次
- 重要挽留客户:发送个性化召回优惠,了解流失原因
- 一般客户:通过常旅客计划培养忠诚度
- 低价值客户:控制营销资源投入,关注低成本获客渠道
将聚类结果保存为Excel,便于业务部门使用:
# 合并原始数据与聚类结果 final_data = pd.concat([clean_data, pd.Series(clusters, name='Cluster')], axis=1) # 保存分析结果 with pd.ExcelWriter('airline_cluster_results.xlsx') as writer: final_data.to_excel(writer, sheet_name='客户明细', index=False) cluster_centers.to_excel(writer, sheet_name='聚类中心', index=False) # 添加业务解读 interpretation = pd.DataFrame({ 'Cluster': range(5), '客户类型': ['重要保持客户', '一般客户', '低价值客户', '重要发展客户', '重要挽留客户'], '营销策略': [ '提供专属增值服务,如免费升舱、贵宾厅', '通过常旅客计划培养忠诚度', '控制营销资源投入,关注低成本获客', '设计里程加速计划,鼓励增加乘机频次', '发送个性化召回优惠,了解流失原因' ] }) interpretation.to_excel(writer, sheet_name='业务解读', index=False)在实际项目中,可进一步将分析过程封装为自动化报表或Dashboard,定期更新客户分群结果,形成数据驱动的客户管理闭环。
