ARTICLE DETAIL

资讯详情

深耕郑州网站建设与运营推广的一线实战洞察。

航空公司客户价值分析实战:从LRFMC模型到K-Means聚类

航空公司客户价值分析实战:从LRFMC模型到K-Means聚类 1. 项目概述从数据中挖掘航空公司的“金矿”每次坐飞机你有没有想过航空公司是怎么知道该给你发什么优惠券、该把你分到哪个会员等级的这背后可不是拍脑袋决定的而是一套基于数据挖掘的精密客户价值分析系统。今天我们就来深入拆解一个经典的实战项目——“航空公司客户价值分析”。这不仅是数据挖掘课程的经典案例更是众多航空公司客户关系管理的核心。简单说就是从海量的乘客飞行记录里通过建模分析把看似杂乱无章的乘客精准地分成几类识别出谁是最有价值的“金卡”客户谁是潜力股谁又是偶尔飞一次的“过客”。这对于航空公司优化营销资源、提升服务精准度、制定票价策略有着决定性的意义。这个项目的核心就是利用乘客的历史消费数据构建一个评估模型。我们会用到像K-Means这样的聚类算法它不是简单看谁飞得多而是综合考量最近消费时间、消费频率、消费金额等多个维度经典的RFM模型变体给客户“打分”和“分群”。最终输出的不是一堆冰冷的数字而是可以直接指导业务行动的洞察比如针对高价值客户推出专属的贵宾服务以防止流失针对潜力客户设计精准的促销活动以刺激消费对于一般客户则优化成本提供标准化服务。整个过程从原始数据清洗、指标构建、到模型建立与评估是一个完整的数据科学闭环。无论你是数据分析的初学者想通过一个完整项目练手还是业务人员想理解数据如何驱动决策这篇文章都将带你走一遍最真实的实操流程避开那些教程里不会提的“坑”。2. 项目核心思路与整体设计2.1 业务目标与核心需求解析做任何数据分析项目第一步永远是搞清楚我们到底要解决什么业务问题对于航空公司客户价值分析核心业务目标通常聚焦于以下几点客户分群与差异化服务这是最直接的目标。航空公司资源有限不可能对所有乘客一视同仁。通过分析我们需要将客户划分为不同的群体例如重要保持客户、重要发展客户、重要挽留客户、一般客户与低价值客户。对不同群体实施差异化的营销和服务策略实现资源的最优配置。利润最大化与资源优化识别出贡献了80%利润的那20%客户二八定律。确保市场、销售和服务资源向这些高价值客户倾斜同时降低在低价值客户身上的无效投入。客户流失预警与挽留通过分析客户消费行为的变化趋势特别是那些曾经是高价值但近期活跃度下降的客户提前预警流失风险并制定针对性的挽留措施。产品与服务优化了解不同客户群体的偏好如航线偏好、舱位偏好、购票时间偏好为设计新的航线产品、舱位套餐、促销活动提供数据支持。为了实现这些目标我们需要将模糊的业务需求转化为可量化、可计算的数据指标。这就引出了本项目最核心的分析框架——LRFMC模型。2.2 分析模型选型为什么是LRFMC提到客户价值分析很多人会想到经典的RFM模型Recency, Frequency, Monetary。但在航空业直接套用RFM可能不够精准。我们对其进行改良形成了更适合航空业务的LRFMC模型LLoad Time客户入会时长/观测窗口时间长度。在本次分析中通常以数据观测的时间窗口长度来衡量它代表了公司拥有该客户数据的时间跨度。L值本身不一定直接参与聚类但它是理解客户生命周期阶段的重要背景。更常见的做法是我们关注的是在固定观测期内的行为。RRecency最近一次乘坐航班距观测窗口结束的时间间隔。这反映了客户的活跃度。R值越小说明客户最近刚乘坐过航班越活跃流失风险相对较低。FFrequency客户在观测窗口内乘坐航班的频率。这反映了客户的忠诚度或消费习惯。F值越大客户越可能是常旅客。MMonetary客户在观测窗口内累计的飞行里程。这直接反映了客户为公司带来的收入相关价值通常里程与票价强相关。M值越大客户价值越高。CCoefficient客户在观测窗口内乘坐舱位所对应的折扣系数的平均值。这个指标非常精妙它反映了客户的价格敏感度和消费能力。C值越小意味着客户平均享受的折扣越低接近全价票表明其可能是公商务旅客对价格不敏感价值更高C值越大意味着客户经常购买折扣票可能对价格更敏感。注意这里对C的定义是关键。很多初学者会误将“折扣系数”理解为“折扣力度”导致方向解释错误。务必明确折扣系数 票价 / 公布价。全价票系数为1打折票系数小于1。因此系数平均值越小实际支付折扣越低客户价值越高。选择LRFMC而非RFM是因为它更贴合航空业务实质M用飞行里程代替消费金额航空公司的票价浮动大同一航线不同时间价格差异巨大而里程与飞行距离挂钩更能稳定反映客户的消费“量”。引入C折扣系数这是区分公商务旅客价格不敏感刚性需求和休闲旅客价格敏感弹性需求的关键指标对客户价值判断至关重要。2.3 技术路线与工具选型明确了模型接下来就是技术实现路径。一个标准的项目流程如下数据获取与理解获取包含客户基本信息和飞行记录的原始数据表。数据清洗与预处理处理缺失值、异常值整合相关数据为分析做准备。这是最耗时但决定模型质量的基础环节。指标构建根据LRFMC模型从原始数据中计算每个客户对应的L, R, F, M, C五个指标。这里涉及大量的数据聚合操作。数据标准化由于五个指标的量纲和数量级不同例如M可能是数万公里C是0到1之间的小数必须进行标准化如Z-score标准化消除量纲影响使模型能公平对待每个特征。客户聚类分析使用K-Means聚类算法对标准化后的LRFMC数据进行分群。聚类结果分析分析每个簇的特征为其打上业务标签如“重要保持客户”并可视化呈现。模型应用与建议基于分群结果提出具体的业务建议。工具选型编程语言与库Python是绝对主流。主要依赖pandas进行数据清洗和操作numpy进行数值计算sklearn中的StandardScaler进行标准化和KMeans进行聚类matplotlib和seaborn进行可视化。为什么是K-Means对于客户分群这种无监督学习任务K-Means算法原理简单、计算效率高、解释性强非常适合作为探索性分析的首选。虽然它对异常值敏感、需要预先指定K值簇数量但在数据经过良好预处理并结合“肘部法则”或“轮廓系数”确定K值后其表现非常稳健。3. 数据预处理与LRFMC指标构建实战3.1 原始数据探查与清洗假设我们拿到一份航空公司的客户飞行记录数据包含字段如会员卡号、入会时间、性别、年龄、乘机日期、航线、飞行公里数、舱位等级、折扣系数等。第一步理解数据与问题诊断import pandas as pd import numpy as np # 加载数据 df pd.read_csv(air_data.csv) print(df.info()) # 查看数据类型、缺失情况 print(df.describe()) # 查看数值分布通过info()和describe()我们可能发现以下典型问题缺失值年龄、某些飞行记录字段可能存在缺失。异常值飞行公里数为0或极大值折扣系数为0可能是积分兑换票或大于1异常数据年龄超过合理范围。数据一致性“乘机日期”可能是字符串格式需要转换为日期类型。第二步针对性清洗缺失值处理对于年龄等客户属性若缺失比例不高可采用中位数或众数填充或直接删除缺失行若样本量足够大。对于飞行记录中的关键LRFMC指标字段如折扣系数、飞行公里数缺失通常考虑删除该条记录因为无法计算。异常值处理飞行公里数 0 的记录视为无效数据删除。折扣系数 0 的记录代表积分兑换等非现金交易需要特别注意。这部分客户行为特殊是否剔除取决于分析目标。如果分析现金客户价值可剔除如果分析整体客户行为可保留但单独标记。折扣系数 1 的记录明显错误删除。年龄 0 或 100 的记录删除或设为空值后填充。数据转换将‘乘机日期’列转换为datetime类型。实操心得数据清洗没有绝对标准每一步处理都要记录原因因为这会直接影响后续模型的解释。例如剔除所有积分兑换票可能会丢失一批高忠诚度但近期未现金消费的客户信息。建议在清洗后保留一份清洗逻辑文档。3.2 LRFMC指标的计算与整合清洗后的数据是单条飞行记录级别我们需要将其聚合到每个客户会员卡号级别计算其LRFMC值。首先需要定义观测窗口。假设我们以过去两年例如2014-01-01至2015-12-31为观测期分析在2015-12-31这个时间点上的客户价值。计算每个客户的指标# 假设 df_clean 是清洗后的数据包含‘会员卡号’‘乘机日期’‘飞行公里数’‘折扣系数’等字段 # 设定观测结束日期 observation_end pd.to_datetime(2015-12-31) # 1. 计算RRecency最近一次乘机时间距观测结束的天数 # 先找到每个客户最近一次乘机日期 last_flight_date df_clean.groupby(会员卡号)[乘机日期].max().reset_index() last_flight_date.columns [会员卡号, last_date] last_flight_date[R] (observation_end - last_flight_date[last_date]).dt.days # 2. 计算FFrequency观测窗口内的乘机次数 flight_count df_clean.groupby(会员卡号).size().reset_index(nameF) # 3. 计算MMonetary观测窗口内的总飞行公里数 total_km df_clean.groupby(会员卡号)[飞行公里数].sum().reset_index(nameM) # 4. 计算CCoefficient观测窗口内折扣系数的平均值 # 注意这里先过滤掉折扣系数为0积分票的记录因为其不反映现金支付能力 df_cash df_clean[df_clean[折扣系数] 0] avg_discount df_cash.groupby(会员卡号)[折扣系数].mean().reset_index(nameC) # 5. LLoad Time观测窗口长度例如两年或者客户入会时长至观测结束的时长。 # 如果有入会时间可以计算。此处为简化我们可能暂不将其作为聚类特征或直接用固定值。 # 假设我们使用固定观测期L对每个客户相同在标准化后会被消除因此有时不参与聚类。 # 我们这里计算客户在观测期内的首次乘机时间作为活跃开始的参考非标准L。 first_flight_date df_clean.groupby(会员卡号)[乘机日期].min().reset_index() first_flight_date.columns [会员卡号, first_date] first_flight_date[L] (observation_end - first_flight_date[first_date]).dt.days # 合并所有指标 lrfmc_data last_flight_date[[会员卡号, R]] lrfmc_data lrfmc_data.merge(flight_count, on会员卡号, howleft) lrfmc_data lrfmc_data.merge(total_km, on会员卡号, howleft) lrfmc_data lrfmc_data.merge(avg_discount, on会员卡号, howleft) # 注意左连接部分只有积分票的客户C值为NaN lrfmc_data lrfmc_data.merge(first_flight_date[[会员卡号, L]], on会员卡号, howleft) # 处理合并后可能出现的NaN值例如只有积分票的客户 # 对于C为NaN的客户可以赋值为一个特殊值如-1或删除。根据业务决定。 lrfmc_data[C].fillna(-1, inplaceTrue) # 用-1标记纯积分客户 print(lrfmc_data.head())注意事项指标方向一致性R最近消费间隔是越小越好F频率、M里程、C折扣系数平均值是越大越好吗错回顾一下C是折扣系数平均值越小代表支付折扣越低接近全价价值越高。所以R和C是越小越好F、M、L是越大越好。在后续业务分析时务必注意这一点否则会得出完全相反的结论。数据聚合的完整性确保groupby操作后没有客户丢失。使用howleft或howinner连接时要清楚其含义及对样本量的影响。特殊客户处理纯积分兑换客户C为NaN或0是一个特殊群体。他们活跃F可能高、最近有消费R小但不带来直接现金收入。需要业务方决定是单独分析还是赋予一个特殊的C值参与聚类。4. 数据标准化与K-Means聚类建模4.1 数据标准化为什么非做不可得到的LRFMC数据各个指标量纲差异巨大。R是几十到几百的天数F是几次到几十次M是几万到几十万的公里数C是0到1之间的小数。如果直接将这些数据喂给K-Means算法量级最大的M会“主导”距离计算其他特征几乎不起作用。这就像用“元”和“分”一起计算财富结果完全被“元”支配。我们使用Z-score标准化将每个特征的数据转换为均值为0、标准差为1的分布。from sklearn.preprocessing import StandardScaler # 选择需要标准化的特征列 features [L, R, F, M, C] X lrfmc_data[features] # 初始化标准化器 scaler StandardScaler() # 拟合计算均值和标准差并转换数据 X_scaled scaler.fit_transform(X) # 将标准化后的数据转换回DataFrame方便后续使用 X_scaled_df pd.DataFrame(X_scaled, columnsfeatures, indexlr_fmc_data.index)标准化后所有特征都处于同一尺度模型能公平地学习每个特征的模式。4.2 确定最佳聚类数量KK-Means需要预先指定簇的数量K。选择不当要么分得太粗客户差异被掩盖要么分得太细失去分群意义。常用方法有肘部法则计算不同K值下模型的惯性样本到其所属簇中心的距离平方和。随着K增大惯性会下降。当K增加到某个点后惯性下降幅度突然变缓这个拐点就像“手肘”对应的K值就是建议值。轮廓系数衡量一个样本与其所属簇内其他样本的相似度内聚度和与其他簇样本的不相似度分离度。轮廓系数介于[-1,1]越大越好。我们可以计算不同K值下所有样本的平均轮廓系数取最大值对应的K。from sklearn.cluster import KMeans from sklearn.metrics import silhouette_score import matplotlib.pyplot as plt inertias [] silhouette_scores [] K_range range(2, 11) # 尝试K从2到10 for k in K_range: kmeans KMeans(n_clustersk, random_state42, n_initauto) kmeans.fit(X_scaled_df) inertias.append(kmeans.inertia_) if k 2: # 轮廓系数至少需要2个簇 score silhouette_score(X_scaled_df, kmeans.labels_) silhouette_scores.append(score) # 绘制肘部法则图 plt.figure(figsize(12, 4)) plt.subplot(1, 2, 1) plt.plot(K_range, inertias, bo-) plt.xlabel(Number of clusters (K)) plt.ylabel(Inertia) plt.title(Elbow Method For Optimal K) # 绘制轮廓系数图 plt.subplot(1, 2, 2) plt.plot(range(2, 11), silhouette_scores, ro-) plt.xlabel(Number of clusters (K)) plt.ylabel(Silhouette Score) plt.title(Silhouette Score For Optimal K) plt.tight_layout() plt.show()实操心得肘部法则的“拐点”有时不明显比较主观。轮廓系数更客观但计算量稍大。建议两者结合看。例如肘部图在K3或4时下降变缓同时K3或4时轮廓系数较高那么就可以选择K3或4。此外业务理解也很重要。航空公司常见的客户分层可能就是3-5类这可以作为参考。4.3 执行K-Means聚类与结果解读假设我们通过上述方法确定K5。接下来进行聚类并分析结果。# 使用K5进行最终聚类 optimal_k 5 final_kmeans KMeans(n_clustersoptimal_k, random_state42, n_initauto) final_kmeans.fit(X_scaled_df) # 将聚类标签添加到原始数据中 lr_fmc_data[Cluster] final_kmeans.labels_ # 查看各簇的样本数量 print(lr_fmc_data[Cluster].value_counts().sort_index())聚类完成后我们需要解读每个簇的特征。最有效的方法是计算每个簇在原始LRFMC指标上的均值注意是标准化前的原始值这样才有业务意义。# 计算每个聚类中心的原始特征均值由于我们使用了标准化后的数据拟合中心点也是标准化后的需要反标准化 cluster_centers_original scaler.inverse_transform(final_kmeans.cluster_centers_) cluster_center_df pd.DataFrame(cluster_centers_original, columnsfeatures) cluster_center_df[Cluster] range(optimal_k) print(cluster_center_df) # 更直观地计算每个簇的原始数据均值 cluster_profile lr_fmc_data.groupby(Cluster)[features].mean().reset_index() print(cluster_profile)根据cluster_profile的结果我们可以给每个簇打上业务标签。例如一个典型的分析结果可能是聚类样本占比L (天数)R (天数)F (次数)M (公里)C (折扣系数)业务标签015%高非常低非常高极高非常低重要保持客户150%中中低低高一般/低价值客户210%中高中中中重要挽留客户320%中低中中低重要发展客户45%低低高高低新晋高价值客户解读簇0重要保持客户R值极低最近刚飞过F和M极高飞得频繁且里程长C值极低几乎全价票。这是航空公司的“金主”公商务旅客为主贡献最大利润。策略提供顶级会员服务专属客服优先升舱等核心目标是保持其忠诚度。簇2重要挽留客户R值非常高很久没飞了但历史上的F和M尚可。这是流失风险极高的客户。策略主动联系调查原因是转向了竞争对手还是需求变化推出强有力的挽留优惠如定向大额优惠券、里程加赠。簇3重要发展客户R值低近期活跃C值低愿意买高价票但F和M还有提升空间。这是潜力股有消费能力且活跃。策略通过发展计划如鼓励乘坐更高舱位、推荐其乘坐更多本公司航线将其向簇0转化。簇1一般/低价值客户占比最大各项指标平平C值高偏好折扣票。策略提供标准化服务通过自动化渠道进行低成本维护可推送特价促销信息。簇4新晋高价值客户L值低入会或活跃时间短但其他指标表现好。可能是新兴的商务人士。策略给予新会员礼遇引导其成为忠诚客户。5. 模型评估、可视化与业务应用5.1 聚类效果评估与可视化除了之前的轮廓系数我们还可以通过可视化直观感受聚类效果。由于我们有五个维度无法直接绘制通常采用以下方法雷达图/平行坐标图展示每个簇在各个特征上的均值轮廓非常适合比较多维度下各簇的差异。import matplotlib.pyplot as plt import seaborn as sns from pandas.plotting import parallel_coordinates # 为雷达图准备数据使用标准化后的中心点使得各维度尺度一致 radar_data pd.DataFrame(final_kmeans.cluster_centers_, columnsfeatures) radar_data[Cluster] [fCluster {i} for i in range(optimal_k)] # 平行坐标图 plt.figure(figsize(10, 6)) parallel_coordinates(radar_data, Cluster, colormaptab10, linewidth2) plt.title(Parallel Coordinates Plot of Customer Clusters (Standardized)) plt.grid(True) plt.show()平行坐标图可以清晰看到不同颜色的线代表不同簇在各个特征轴上的位置高低从而理解各簇的差异。例如代表“重要保持客户”的线应该在R和C轴上位置很低值小在F和M轴上位置很高。降维可视化PCA/t-SNE使用主成分分析或t-SNE将五维数据降至二维或三维进行散点图绘制并用聚类标签着色观察簇的分离情况。from sklearn.decomposition import PCA pca PCA(n_components2) X_pca pca.fit_transform(X_scaled_df) lr_fmc_data[PCA1] X_pca[:, 0] lr_fmc_data[PCA2] X_pca[:, 1] plt.figure(figsize(10, 8)) sns.scatterplot(datalr_fmc_data, xPCA1, yPCA2, hueCluster, palettetab10, s50, alpha0.6) plt.title(Customer Clusters Visualized by PCA) plt.legend(titleCluster) plt.show()如果散点图中不同颜色的点能形成相对清晰的区块说明聚类效果较好。5.2 业务应用建议与模型落地分析报告不能止于模型结果必须转化为 actionable insights可执行的洞察。针对不同客户群体的精准营销策略重要保持客户营销预算的重点。提供专属增值服务免费贵宾厅、快速通道、生日关怀、顶级会员专属活动。避免向其推送低折扣促销以免稀释其价值感知。重要发展客户设计“升级挑战”活动例如“未来三个月内飞行次数达到X次即可升级至金卡会员”刺激其消费频率和里程积累。重要挽留客户启动流失预警机制。客户服务部门主动进行电话回访赠送有吸引力的复飞礼包如一张高折扣优惠券或额外里程。分析其历史航线推送相关航线的优惠信息。一般及低价值客户以自动化、低成本的方式维护如邮件推送特价航线信息。重点挖掘其中可能向“重要发展客户”转化的个体例如R值低但C值也低的。产品与服务优化根据“重要保持客户”的航线偏好优化这些航班的班次和时刻并确保头等/商务舱的供应。根据“重要发展客户”的折扣系数分布设计更有吸引力的常旅客积分累积规则鼓励他们购买更高舱位。模型监控与迭代客户价值是动态变化的。需要定期如每季度重新运行此分析模型更新客户分群。监控各簇客户数量的迁移情况。例如从“重要保持客户”流入“重要挽留客户”的数量突然增加就是一个危险信号需要立即排查原因。6. 常见问题、避坑指南与进阶思考6.1 实操中遇到的典型问题与解决方案问题聚类结果不均衡某个簇的客户数量极少如1%另一个簇极多如80%。可能原因数据存在极端异常值K值选择不当某个特征如M主导了距离计算未标准化或标准化失效。排查与解决检查标准化过程确认数据已转换为均值为0、标准差1。回顾数据清洗步骤检查是否遗漏了极端异常值如一次飞行的里程异常高。尝试不同的K值或使用分层抽样确保初始中心点分布更均匀。考虑使用其他聚类算法如DBSCAN它能自动发现异常点并形成任意形状的簇。问题业务方看不懂聚类结果无法理解“簇2”代表什么。原因数据分析师只提供了技术输出没有进行业务翻译。解决这是沟通的关键。必须像上一节那样将每个簇的LRFMC特征均值用业务语言描述出来并赋予像“重要挽留客户”这样直观的标签。制作可视化图表如雷达图向业务方展示。问题模型跑出来的“高价值客户”和业务部门凭经验认定的不一致。原因可能是模型指标权重与业务直觉不符或者业务经验包含了模型未考虑的因素如客户投诉记录、社交媒体影响力。解决这是一个很好的迭代机会。与业务方深入讨论看是否需要引入新的数据源如客户服务交互数据或调整模型例如给F和M赋予不同权重使用加权K-Means。数据模型是对现实的近似需要与业务知识持续校准。6.2 避坑技巧与心得数据质量是生命线在这个项目里花在数据清洗和探索上的时间可能占60%以上。一个错误的异常值处理比如没处理折扣系数为0的积分票可能导致整个聚类中心偏移。务必仔细检查每一列数据的分布和含义。标准化前先处理异常值如果数据中有极端异常值即使做了Z-score标准化这个异常值也会使其他正常数据压缩在一个很小的范围内。务必先处理异常值再进行标准化。K-Means的随机性random_state参数非常重要。如果不固定每次运行的初始中心点随机可能导致结果略有不同。在最终报告时务必设置random_state以保证结果可复现。聚类不是终点而是起点得到5个簇只是第一步。更重要的是结合业务为每个簇制定可执行的策略并建立监控机制看策略是否有效。6.3 项目进阶与扩展方向这个基础项目可以朝多个方向深化特征工程进阶除了LRFMC是否可以加入更多特征例如飞行时间偏好工作日 vs 周末飞行比例。航线集中度客户是否集中飞某几条航线提前购票时间反映计划性。客户生命周期阶段结合入会时间L构建更复杂的生命周期价值模型。算法优化尝试其他聚类算法如层次聚类便于解释簇的层次关系、DBSCAN能识别噪声点自动确定簇数。聚类集成用多种聚类算法结果进行投票得到更稳定的分群。结合监督学习如果有部分客户已知标签如“已流失”可以先聚类再分析不同簇的流失率或者直接用分类算法预测客户价值等级。系统化与自动化将整个分析流程数据抽取、清洗、建模、评估、报告脚本化实现定期自动运行。将模型结果写入数据库与公司的CRM系统对接实现客户分群的实时查询与标签化。这个航空公司客户价值分析项目就像一把手术刀帮企业从混沌的数据中解剖出清晰的客户图谱。它完美诠释了如何将数学算法K-Means与业务逻辑LRFMC模型结合解决真实的商业问题。从数据预处理的小心翼翼到确定K值时的反复权衡再到给聚类结果赋予业务灵魂的解读每一步都充满了数据科学工作的典型挑战与乐趣。当你看到自己的分析报告被业务部门采纳并最终影响到真实的营销活动时那种成就感是无可替代的。希望这份超详细的拆解能让你不仅跑通代码更能理解每一步背后的“为什么”从而真正掌握这个经典的数据挖掘案例。
返回列表