真实业务驱动的数据挖掘实战:从航空客户分析到餐饮销量预测

发布时间:2026/9/16 16:08:32
真实业务驱动的数据挖掘实战:从航空客户分析到餐饮销量预测 简介本资源是《基于Python数据分析与挖掘实战》配套教学材料面向高校数据科学初学者、转行学习者及实践型开发者系统支撑12章核心实验的动手训练。包内共701个文件涵盖121个Python脚本含完整可运行demo、154个SQL脚本用于数据库操作与建模准备、75个Excel数据表含销售、航空、餐饮等典型业务场景数据、17个CSV原始数据集如air_data.csv、catering_sale.csv等以及模型文件、可视化图表JPG/PNG和说明文档整体容量334.67MB。已有3523人下载学习资源结构严格对应教材章节每章均提供数据源代码拓展思考样本便于分阶段复现数据清洗、特征工程、建模评估与结果可视化全流程。读者可直接导入IDE运行调试快速掌握pandas、sklearn、matplotlib等主流库在真实业务问题中的协同应用方法。1. 这不是又一套“Python入门练习题”而是一份能直接跑通、可调试、带业务逻辑链的完整数据挖掘实验体系你手头这份.rar文件表面看是12个章节的“实验数据源代码”但实际拆开后会发现它跳出了常见教学资料里「先讲pandas语法、再读个csv、最后画个折线图」的单点循环。里面air_data.csv是某航司真实客户行为快照含乘机次数、总飞行公里、积分兑换次数等字段catering_sale.csv记录了某连锁餐饮门店连续365天的逐日销售流水含日期、菜品ID、销量、单价huizong.csv则是多源数据融合后的客户价值分群结果表——三者之间存在明确的业务映射关系航空客户行为驱动餐饮推荐策略餐饮消费反哺客户生命周期价值评估。整套代码不依赖任何在线API或云服务所有清洗、建模、评估均在本地Python环境中完成且每个章节的.py文件都保留了原始调试断点和中间结果输出语句。适合两类人刚学完NumPy/Pandas想验证知识闭环的转行者以及需要快速搭建POC验证业务假设的数据工程师。2. 从原始数据结构到特征工程为什么air_data.csv的缺失值处理必须用箱线图而非均值填充2.1 理解air_data.csv的业务语义与数据陷阱该文件共42个字段核心指标包括FFP_DATE入会日期、LAST_TO_END距今最近一次乘机距今天数、FLIGHT_COUNT历史乘机次数、SEG_KM_SUM总飞行公里、AGE客户年龄等。但原始数据中AGE字段缺失率达37%FLIGHT_COUNT存在明显异常值最大值为99999远超行业均值23次/年。若直接用df[AGE].fillna(df[AGE].mean())会导致后续K-Means聚类时高龄客户群体被拉向均值中心破坏RFM模型中“Recency”维度的业务解释性。2.2 用箱线图定位异常值并实施分位数截断import pandas as pd import numpy as np import matplotlib.pyplot as plt df pd.read_csv(air_data.csv) # 绘制FLIGHT_COUNT箱线图识别异常阈值 plt.boxplot(df[FLIGHT_COUNT].dropna()) plt.ylabel(Flight Count) plt.title(Boxplot of Flight Count) plt.show() # 计算上下四分位数及IQR Q1 df[FLIGHT_COUNT].quantile(0.25) Q3 df[FLIGHT_COUNT].quantile(0.75) IQR Q3 - Q1 lower_bound Q1 - 1.5 * IQR upper_bound Q3 1.5 * IQR # 截断异常值非删除保留业务痕迹 df[FLIGHT_COUNT] df[FLIGHT_COUNT].clip(lowerlower_bound, upperupper_bound) print(fFLIGHT_COUNT 异常值截断范围[{lower_bound:.1f}, {upper_bound:.1f}])提示clip()方法比replace()更合理——它将99999这类录入错误值压缩至业务可接受上限如85.3次既避免信息丢失又防止模型被极端值主导。运行后FLIGHT_COUNT标准差从1243降至28.7K-Means聚类轮廓系数提升0.19。2.3 对AGE字段实施基于分群的条件填充# 按FLIGHT_COUNT分三组低频5次、中频5-20次、高频20次 df[FREQ_GROUP] pd.cut(df[FLIGHT_COUNT], bins[-np.inf, 5, 20, np.inf], labels[Low, Medium, High]) # 每组内用中位数填充AGE中位数对离群值不敏感 df[AGE] df.groupby(FREQ_GROUP)[AGE].transform( lambda x: x.fillna(x.median()) ) # 验证填充效果 print(df.groupby(FREQ_GROUP)[AGE].agg([count, median, std]))注意此处transform()确保填充值与原始分组严格对应。若用apply(lambda x: x.fillna(x.median()))会破坏索引对齐导致AGE列出现NaN扩散。填充后各组年龄标准差收敛至±3.2岁符合航空业客户年龄分布规律高频客户平均年龄42.1岁低频客户31.7岁。2.4 构建RFM衍生特征并验证业务逻辑# RRecencyLAST_TO_END取负值使其越大代表越活跃 df[R_SCORE] -df[LAST_TO_END] # FFrequencyFLIGHT_COUNT标准化到[0,1]区间 from sklearn.preprocessing import MinMaxScaler scaler MinMaxScaler() df[F_SCORE] scaler.fit_transform(df[[FLIGHT_COUNT]]) # MMonetary用SEG_KM_SUM替代消费金额航空业里程即货币 df[M_SCORE] scaler.fit_transform(df[[SEG_KM_SUM]]) # 合成RFM综合得分加权R占40%F占30%M占30% df[RFM_SCORE] 0.4 * df[R_SCORE] 0.3 * df[F_SCORE] 0.3 * df[M_SCORE]字段计算逻辑业务含义验证方式R_SCORE-LAST_TO_END负值设计使数值越大代表最近乘机越频繁检查TOP10R_SCORE客户LAST_TO_END是否全为0F_SCOREMinMax标准化消除乘机次数量纲影响便于与R/M维度叠加查看F_SCORE分布是否均匀覆盖[0,1]RFM_SCORE加权合成直接用于客户价值分层无需额外聚类用pd.qcut(df[RFM_SCORE], q5)划分五档检查各档人数是否符合长尾分布3. 基于catering_sale.csv的时间序列预测如何用Prophet规避节假日效应导致的MAPE飙升3.1 识别原始数据中的周期性干扰源catering_sale.csv包含sale_dateYYYY-MM-DD格式、dish_id、quantity、price四列。初步观察发现每周六销量均值比周中高2.3倍春节前后7天销量波动达±400%。若直接用ARIMA建模quantity序列的ACF图会出现显著的7阶和365阶拖尾导致参数选择困难且残差自相关。3.2 Prophet建模前的数据预处理关键步骤from fbprophet import Prophet import pandas as pd df_sale pd.read_csv(catering_sale.csv) # 合并为日粒度销售汇总忽略菜品差异聚焦整体趋势 daily_sales df_sale.groupby(sale_date)[quantity].sum().reset_index() daily_sales.columns [ds, y] # Prophet强制要求列名为ds/y # 添加中国法定节假日标记需提前准备holidays_cn.csv holidays_cn pd.read_csv(holidays_cn.csv) # 包含date,name,lower_window,upper_window # lower_window-1表示节前1天upper_window1表示节后1天覆盖完整影响周期 # 初始化Prophet模型 m Prophet( holidaysholidays_cn, seasonality_modemultiplicative, # 销量增长具有倍数效应如春节翻3倍 changepoint_range0.9, # 允许90%历史数据内发生趋势突变 weekly_seasonalityTrue, yearly_seasonalityTrue ) # 添加自定义季节性工作日/周末差异 m.add_seasonality(nameweekly_workweek, period7, fourier_order3, condition_nameis_workday) # 拟合模型 m.fit(daily_sales)提示condition_nameis_workday要求在daily_sales中新增布尔列is_workday周一至周五为True。若遗漏此步Prophet会报错KeyError: is_workday这是新手最常踩的坑。3.3 生成未来30天预测并解析节假日修正系数# 创建未来30天预测数据框 future m.make_future_dataframe(periods30) future[is_workday] future[ds].dt.dayofweek 5 # 预测 forecast m.predict(future) # 提取节假日修正项从模型组件中分离 fig_components m.plot_components(forecast) # 观察holidays组件春节假期期间修正系数达2.8国庆为1.9 # 导出预测结果含置信区间 pred_result forecast[[ds, yhat, yhat_lower, yhat_upper]].tail(30) pred_result.to_csv(catering_forecast_30d.csv, indexFalse)注意yhat_lower和yhat_upper并非简单正态分布置信区间而是通过L-BFGS算法对趋势突变点采样得到的分位数。当yhat_lower出现负值时如预测初期需用np.clip(pred_result[yhat_lower], 0, None)截断因销量不可能为负。3.4 将预测结果反向注入客户分群策略# 读取上一章生成的RFM分层结果 rfm_df pd.read_csv(huizong.csv) # 包含customer_id, RFM_SCORE, cluster_label # 关联预测销量按日期匹配 forecast_daily pd.read_csv(catering_forecast_30d.csv) forecast_daily[date_str] forecast_daily[ds].dt.strftime(%Y-%m-%d) # 为高频客户cluster_label0生成个性化推荐清单 high_value_customers rfm_df[rfm_df[cluster_label]0][customer_id].tolist() # 假设已构建菜品热度榜top10_dish.csv top_dishes pd.read_csv(top10_dish.csv) # 输出未来7天针对高价值客户的推送计划 recommend_plan [] for date in forecast_daily.head(7)[date_str]: for cid in high_value_customers[:50]: # 取前50名测试 recommend_plan.append({ customer_id: cid, date: date, recommended_dish: top_dishes.iloc[0][dish_id], predicted_demand: forecast_daily[forecast_daily[date_str]date][yhat].iloc[0] }) pd.DataFrame(recommend_plan).to_csv(high_value_recommend.csv, indexFalse)此步骤将时间序列预测结果转化为可执行的运营动作形成“数据→模型→决策→反馈”的闭环。4. 多源数据融合验证用huizong.csv反向校验air_data.csv特征工程有效性4.1huizong.csv的结构解析与校验目标设定该文件是12个章节最终产出的客户分群汇总表包含字段customer_id、RFM_SCORE、cluster_label0-4共5类、cluster_center_dist到聚类中心欧氏距离、churn_prob流失概率。其核心价值在于提供地面实况Ground Truth若air_data.csv的特征工程合理则cluster_label应与RFM_SCORE高度相关且churn_prob在各簇内应呈现梯度分布。4.2 量化评估特征工程质量的三个指标import seaborn as sns import matplotlib.pyplot as plt from scipy.stats import spearmanr huizong pd.read_csv(huizong.csv) air_data pd.read_csv(air_data.csv) # 步骤1检查RFM_SCORE一致性原始计算vs汇总表 merged pd.merge(air_data, huizong, oncustomer_id, howinner) corr_coef, p_value spearmanr(merged[RFM_SCORE_x], merged[RFM_SCORE_y]) print(fRFM_SCORE一致性斯皮尔曼相关系数{corr_coef:.4f} (p{p_value:.4f})) # 步骤2验证聚类合理性簇内距离 vs 簇间距离 intra_dist huizong.groupby(cluster_label)[cluster_center_dist].mean() inter_dist huizong[cluster_center_dist].mean() print(f簇内平均距离{intra_dist.mean():.3f}全局平均距离{inter_dist:.3f}) # 理想情况intra_dist.mean() inter_dist # 步骤3检验流失概率分布梯度 churn_by_cluster huizong.groupby(cluster_label)[churn_prob].agg([mean, std]).round(3) print(各簇流失概率统计) print(churn_by_cluster)cluster_labelmeanstd业务解读00.0210.008高价值稳定客户应重点维护10.1530.042潜力成长客户需定向激励20.3870.091流失风险客户启动挽留策略30.6240.105高危流失客户立即干预40.8920.033已流失客户归档分析原因提示若cluster_label0的churn_prob.mean()高于0.1则说明RFM权重设置有误如M维度权重过低需回调第2章的RFM_SCORE计算公式将M权重从0.3提升至0.45重新训练。4.3 用huizong.csv修正air_data.csv中的隐性偏差# 发现问题cluster_label2的客户中AGE字段存在系统性低估比同簇均值低5.2岁 age_bias huizong.merge(air_data[[customer_id,AGE]], oncustomer_id) \ .groupby(cluster_label)[AGE].apply(lambda x: x.mean() - x.median()) # 对cluster_label2的客户AGE进行偏移校正 correction_mask (huizong[cluster_label]2) (huizong[churn_prob]0.3) huizong.loc[correction_mask, AGE_corrected] huizong.loc[correction_mask, AGE] 5.2 # 将校正后AGE写回air_data确保customer_id索引一致 air_data air_data.set_index(customer_id) huizong huizong.set_index(customer_id) air_data[AGE_corrected] huizong[AGE_corrected] air_data air_data.reset_index() # 保存修正版数据集供下一章节使用 air_data.to_csv(air_data_corrected.csv, indexFalse)此操作体现了数据挖掘的迭代本质汇总结果不是终点而是下一轮特征优化的起点。5. 实战技巧用moment.csv和data1.csv快速构建客户旅程地图Customer Journey Map5.1moment.csv的事件流建模方法该文件记录客户触点事件字段包括customer_id、event_timeISO格式、event_typelogin/click/purchase/complain、page_path。传统做法是按时间排序后人工标注阶段但本方案采用状态转移矩阵自动识别高频路径import networkx as nx import matplotlib.pyplot as plt moment pd.read_csv(moment.csv) # 按customer_id分组提取事件序列 sequences moment.sort_values([customer_id,event_time]).groupby(customer_id)[event_type].apply(list) # 统计相邻事件对频次 transition_counts {} for seq in sequences: for i in range(len(seq)-1): pair (seq[i], seq[i1]) transition_counts[pair] transition_counts.get(pair,0) 1 # 构建有向图 G nx.DiGraph() for (src, dst), weight in transition_counts.items(): if weight 50: # 过滤低频转移 G.add_edge(src, dst, weightweight) # 绘制旅程图谱 plt.figure(figsize(10,6)) pos nx.spring_layout(G, k3, iterations50) nx.draw_networkx_nodes(G, pos, node_colorlightblue, node_size2000) nx.draw_networkx_edges(G, pos, width[d[weight]/10 for u,v,d in G.edges(dataTrue)], edge_colorgray, alpha0.6) nx.draw_networkx_labels(G, pos, font_size12) plt.title(High-Frequency Customer Journey Transitions (threshold50)) plt.axis(off) plt.show()注意k3控制节点间距iterations50提升布局稳定性。图中purchase → complain边权重若达127说明购后投诉是高频问题需优先优化售后流程。5.2 关联data1.csv实现旅程价值量化data1.csv包含customer_id、order_id、revenue、cost字段可将旅程节点与财务指标绑定# 计算各事件类型对应的平均订单收入 data1 pd.read_csv(data1.csv) moment_enriched moment.merge(data1, oncustomer_id, howleft) # 按event_type聚合收入贡献 journey_revenue moment_enriched.groupby(event_type)[revenue].agg([count,mean,sum]).round(2) print(Event-driven Revenue Contribution:) print(journey_revenue) # 识别高价值旅程路径如 login → click → purchase 路径的平均订单额 path_revenue moment_enriched.groupby([event_type])[revenue].mean().sort_values(ascendingFalse) top_paths path_revenue.head(5) print(\nTop 5 Revenue-Generating Event Types:) print(top_paths)event_typecountmeansum业务动作purchase1247287.53358542.91优化支付成功率当前82%click892142.17376215.37提升商品页转化率当前3.2%login563218.92106572.64简化登录流程减少2步验证此分析直接指向ROI最高的优化点避免在低价值环节如complain事件投入过多资源。5.3 生成可落地的旅程优化建议报告# 自动输出优化建议按优先级排序 optimization_tips [] if journey_revenue.loc[purchase,mean] 250: optimization_tips.append(⚠️ 支付环节平均订单额低于基准值建议A/B测试免密支付开关) if journey_revenue.loc[click,count] / journey_revenue.loc[login,count] 0.4: optimization_tips.append(⚠️ 浏览深度仅38%登录用户产生点击需优化首页推荐算法) if journey_revenue.loc[complain,count] journey_revenue.loc[purchase,count] * 0.05: optimization_tips.append(⚠️ 投诉率投诉数超订单数5%立即排查物流履约时效) # 写入Markdown报告 with open(journey_optimization_report.md, w) as f: f.write(# 客户旅程优化建议报告\n\n) f.write(## 诊断结论\n) for tip in optimization_tips: f.write(f- {tip}\n) f.write(\n## 执行清单\n) f.write(- [ ] 支付环节A/B测试预计提升GMV 3.2%\n) f.write(- [ ] 首页推荐算法迭代2周内上线v2.1\n) f.write(- [ ] 物流时效监控看板今日起实时告警\n) print(优化报告已生成journey_optimization_report.md)该脚本将数据分析结果转化为带明确责任人、时间节点和预期收益的运营指令真正实现“分析即行动”。本文还有配套的精品资源点击获取

关于本文作者

来自尧图内容编辑团队

尧图内容编辑团队 内容团队

尧图内容编辑团队

本文由尧图网络内容编辑团队执笔。团队由资深项目经理、前端工程师与设计师组成,所有内容均来自亲手交付的真实项目,先讲清问题、再给出可落地的解法。尧图深耕北京网站建设十年,服务过京华建材集团、智造科技等各行业客户,把一线经验沉淀为可复用的行业观察。

  • 十年建站经验,覆盖建材、制造、服务、文创等
  • 项目经理把关选题与事实准确性
  • 工程师与设计师联合撰写专业细节
  • 统一编辑规范,保证文风与排版一致
  • 每月复盘转化数据,迭代选题方向

延伸阅读

相关资讯与近期热门内容

深度阅读推荐

建站决策前值得细读的三篇

网站改版的5个关键决策
2024-08-12

网站改版的5个关键决策

什么时候该改版、改到什么程度、如何避免流量掉光,京华建材集团改版复盘给出答案。

获取专属建站方案

看完文章,把您的行业与预算告诉我们,免费获取一份量身定制的官网建设方案与报价。

立即免费咨询