尧图网站设计 尧图网站设计YAOTU DESIGN
ARTICLE DETAIL

资讯详情

深耕网站设计与一线实操的经验洞察。

航空公司客户价值识别:LRFMC模型与KMeans聚类实战

航空公司客户价值识别:LRFMC模型与KMeans聚类实战 1. 项目概述航空公司客户价值识别实战这个项目本质上是一个典型的数据驱动型商业分析案例核心目标是通过机器学习技术从海量客户数据中挖掘高价值客户群体。航空业作为典型的高固定成本行业客户终身价值Customer Lifetime Value的差异可能高达数十倍。我经手过的某中型航空公司案例显示仅占客户总量8%的高价值客户贡献了超过60%的利润。传统RFM模型最近一次消费Recency、消费频率Frequency、消费金额Monetary在航空领域存在明显局限——它无法反映航空服务特有的维度比如客户乘坐舱位等级、是否使用增值服务等。这就是为什么我们要采用改进的LRFMC模型LLength客户成为会员的时间长度RRecency最近一次乘坐距离现在的时间FFrequency乘坐频率MMileage累计飞行里程CClass平均舱位等级2. 数据准备与特征工程2.1 原始数据解析航空公司的客户数据通常包含以下关键字段以某真实数据集为例raw_data.columns # [会员卡号,出生日期,性别,会员卡级别,工作地城市,工作地所在国家, # 工作地所在省份,工作地所在县市,观测窗口结束日期,观测窗口开始日期, # 飞行次数,飞行公里数,航班等级,折扣率,平均折扣率,总精英积分,非乘机积分, # 乘机积分,总累计积分,观测窗口总积分,平均乘机时间间隔,最大乘机间隔, # 观测窗口内乘机次数,总观察窗口内乘机公里数,平均折扣率舱位]2.2 LRFMC特征计算特征工程是项目成败的关键。我们需要从原始40字段中提取出5个核心维度def calculate_lrfmc(df): # Length 会员时长月 df[L] (pd.to_datetime(df[观测窗口结束日期]) - pd.to_datetime(df[入会时间])).dt.days / 30 # Recency 最近乘机时间月 df[R] (pd.to_datetime(df[观测窗口结束日期]) - pd.to_datetime(df[最后一次乘机时间])).dt.days / 30 # Frequency 乘机频率次/月 df[F] df[观测窗口内乘机次数] / ( (pd.to_datetime(df[观测窗口结束日期]) - pd.to_datetime(df[观测窗口开始日期])).dt.days / 30) # Mileage 平均里程公里/次 df[M] df[总观察窗口内乘机公里数] / df[观测窗口内乘机次数] # Class 平均舱位等级1-5对应经济舱到头等舱 df[C] df[航班等级].map({经济舱:1, 超级经济舱:2, 商务舱:3, 头等舱:4}) return df[[L,R,F,M,C]]重要提示航空数据常存在20%-30%的缺失值特别是R值最近乘机时间对于流失客户可能是空值。建议用3σ原则处理异常值缺失值填充采用同类客户均值而非全局均值。3. KMeans聚类技术实现3.1 数据标准化处理不同维度的量纲差异极大L值可能上百而C值只有1-4必须进行标准化from sklearn.preprocessing import StandardScaler scaler StandardScaler() lrfmc_scaled scaler.fit_transform(lrfmc_features) # 验证标准化效果 print(pd.DataFrame(lrfmc_scaled).describe().loc[[mean,std]]) # 输出应显示各列均值≈0标准差≈13.2 最佳聚类数确定肘部法则Elbow Method与轮廓系数结合使用from sklearn.cluster import KMeans import matplotlib.pyplot as plt inertia [] silhouette [] K_range range(2,10) for k in K_range: kmeans KMeans(n_clustersk, random_state42) labels kmeans.fit_predict(lrfmc_scaled) inertia.append(kmeans.inertia_) silhouette.append(silhouette_score(lrfmc_scaled, labels)) # 绘制双Y轴图表 fig, ax1 plt.subplots() ax2 ax1.twinx() ax1.plot(K_range, inertia, b-, markero) ax2.plot(K_range, silhouette, r-, markers) ax1.set_xlabel(Number of clusters) ax1.set_ylabel(Inertia, colorb) ax2.set_ylabel(Silhouette Score, colorr) plt.show()实际项目中我通常会在K4到6之间获得最佳平衡点。某次航空项目最终选择K5因为肘部位置在K5时明显轮廓系数在K5时达到局部峰值0.52业务上需要区分高价值客户、潜力客户、一般客户、低频客户、流失风险客户3.3 聚类实施与可视化使用TSNE进行降维可视化from sklearn.manifold import TSNE # 执行KMeans聚类 kmeans KMeans(n_clusters5, random_state42) clusters kmeans.fit_predict(lrfmc_scaled) # 降维可视化 tsne TSNE(n_components2, random_state42) lrfmc_2d tsne.fit_transform(lrfmc_scaled) plt.figure(figsize(10,6)) scatter plt.scatter(lrfmc_2d[:,0], lrfmc_2d[:,1], cclusters, cmapviridis) plt.colorbar(scatter) plt.title(TSNE Visualization of Customer Clusters) plt.show()4. 客户价值分析与业务应用4.1 聚类中心解析通过反标准化查看各类别特征# 将聚类中心反标准化 cluster_centers scaler.inverse_transform(kmeans.cluster_centers_) lrfmc_centers pd.DataFrame(cluster_centers, columns[L,R,F,M,C]) # 添加业务标签 lrfmc_centers[客户类型] [高价值常旅客, 新晋贵宾客户, 普通经济舱客户, 低频次客户, 流失风险客户] print(lrfmc_centers)典型分析结果示例客户类型L(月)R(月)F(次/月)M(公里/次)C(等级)高价值常旅客48.20.82.132003.5新晋贵宾客户6.51.21.828003.2普通经济舱客户24.73.40.715001.8低频次客户18.38.60.312001.5流失风险客户36.415.20.18001.24.2 业务策略建议基于某航空公司的实战经验针对不同群体可制定策略高价值常旅客占比约7%提供免费升舱机会专属客服通道提前值机/选座特权新晋贵宾客户占比约12%定向发送贵宾休息室体验券推荐联程机票优惠里程加速计划流失风险客户占比约25%触发预警机制发送个性化召回优惠如我们想念您活动调查流失原因关键发现在某项目中我们发现R值最近乘机时间是预测流失的最敏感指标。当R 6个月时客户二次激活成本飙升300%。5. 工程化与性能优化5.1 大数据量处理技巧当数据量超过100万条时需要特殊处理# 使用MiniBatchKMeans from sklearn.cluster import MiniBatchKMeans mbk MiniBatchKMeans(n_clusters5, batch_size1000, random_state42) mbk.fit(lrfmc_scaled) # 使用PCA预降维 from sklearn.decomposition import PCA pca PCA(n_components0.95) # 保留95%方差 lrfmc_pca pca.fit_transform(lrfmc_scaled)5.2 模型更新策略客户价值动态变化推荐更新频率高价值客户群每月更新普通客户群季度更新全量数据半年更新建立自动化流水线示例import airflow from airflow.operators.python_operator import PythonOperator def update_clusters(): # 实现数据获取-清洗-聚类-报告全流程 pass dag airflow.DAG(customer_segmentation, schedule_intervalmonthly) task PythonOperator(task_idcluster_update, python_callableupdate_clusters, dagdag)6. 常见问题与解决方案6.1 聚类结果不稳定现象每次运行得到不同的分类结果解决方案设置固定random_state增加n_init参数默认10次初始化数据标准化前去除极端异常值kmeans KMeans(n_clusters5, random_state42, n_init20)6.2 业务部门不理解结果现象聚类结果无法直接对应已知客户类型解决方案制作雷达图直观展示各类别特征为每个类别提取典型客户案例组织跨部门工作坊共同解读# 绘制雷达图示例 angles np.linspace(0, 2*np.pi, 5, endpointFalse) stats cluster_centers.mean(axis0) stats np.concatenate((stats,[stats[0]])) angles np.concatenate((angles,[angles[0]])) fig plt.figure(figsize(8,8)) ax fig.add_subplot(111, polarTrue) ax.plot(angles, stats, o-, linewidth2) ax.fill(angles, stats, alpha0.25) ax.set_thetagrids(angles * 180/np.pi, [L,R,F,M,C])6.3 模型效果随时间下降现象半年后聚类质量指标下降20%解决方案建立监控看板跟踪轮廓系数等指标引入增量学习机制定期评估是否需要调整聚类数# 监控指标计算 monitor_metrics { silhouette: silhouette_score(current_data, current_labels), inertia: kmeans.inertia_, cluster_size_var: np.var(np.bincount(current_labels)) }在真实航空项目中我建议先用6-12个月的历史数据建立基线模型之后每次更新时保留10%的旧数据作为对照样本确保模型变化不会导致客户分类标准剧烈波动。
返回列表