ARTICLE DETAIL

资讯详情

深耕网站视觉设计与运营推广的一线实战洞察。

餐饮数据预测实战:从数据预处理到时间序列与关联规则挖掘

餐饮数据预测实战:从数据预处理到时间序列与关联规则挖掘 简介这份资源面向餐饮行业数据分析从业者、机器学习初学者及希望将算法落地到实际业务的研究者围绕餐饮企业综合数据分析与预测展开提供从数据获取、预处理到建模评价的完整实践素材。压缩包共43个文件约1.19MB包含27个csv数据表、6个py脚本、2个xlsx说明表、1个npz数组文件及7张png图表覆盖订单明细、用户特征、菜品相似度、销售时序等多维数据脚本涵盖数据预处理、探索性分析、模型构建与评价等环节。资源已吸引242人学习下载读者可借助字段说明与数据集复现时间序列预测、回归分析、分类识别等典型任务理解特征工程与模型验证流程并参考自相关图、时序图、预测结果图等可视化输出快速搭建餐饮场景下的分析框架为库存控制、菜单优化与客户留存提供数据支撑。1. 餐饮数据预测这套资源到底能不能直接跑起来很多做数据分析的同行拿到一份餐饮数据集第一反应是打开 Jupyter 跑个df.head()然后发现字段看不懂、时间列是字符串、缺失值散落在各个表里最后不了了之。这套「机器学习-餐饮企业综合数据分析及预测」的资源包解决的就是这个从原始数据到预测结果之间的断层问题。它包含 30 多个 CSV 和 Excel 文件覆盖了用户信息、订单明细、菜品销售、客户价值、关联规则、时间序列预测等多个维度配套 6 个 Python 脚本从数据获取到模型评价形成完整链路。适合两类人一是想拿真实餐饮数据练手机器学习全流程的入门者二是需要快速验证时间序列预测或关联规则挖掘方案的一线从业者。数据集本身不复杂但字段说明和中间产物齐全省去了自己造数据的麻烦。2. 数据表结构与字段含义先搞清楚每张表在说什么2.1 核心表之间的关联关系拿到压缩包解压后根目录下散落着几十个文件第一眼容易懵。我一般先把它们按功能分成四组用户维度、订单维度、菜品维度、时间维度。用户维度包括users.csv、user_loss.csv、user_value.csv、info_user.csv、info_user_clear.csv主要记录用户 ID、注册时间、消费频次、流失标记等。订单维度包括meal_order_info.csv、meal_order_detail.csv、detail_clear.csv、sale_day.csv、sale_sum.csv、sales_volume.csv记录每笔订单的时间、金额、菜品明细。菜品维度包括meal_dishes_detail.csv、dishes_matrix.csv、dishes_model_sim.csv用于菜品相似度计算和推荐。时间维度包括2006年到2015年餐饮行业餐费收入.xlsx、profit.csv、tmp profit.csv用于宏观趋势和利润分析。关键关联字段是user_id和order_id。meal_order_info.csv里一行代表一个订单meal_order_detail.csv里一行代表订单中的一个菜品通过order_id关联。users.csv通过user_id与订单表关联。字段说明.xlsx 里对每个字段有中文解释建议先打开这个文件对照看比直接猜字段含义快得多。2.2 字段说明与数据预处理脚本的对应数据预处理.py这个脚本是整条流水线的入口。它做的事情包括读取原始 CSV、处理缺失值、转换时间格式、生成衍生特征。我截取一段典型逻辑import pandas as pd import numpy as np # 读取订单明细 detail pd.read_csv(meal_order_detail.csv, encodingutf-8) info pd.read_csv(meal_order_info.csv, encodingutf-8) # 时间列转换原始为字符串统一转 datetime info[order_time] pd.to_datetime(info[order_time], format%Y-%m-%d %H:%M:%S) info[date] info[order_time].dt.date info[hour] info[order_time].dt.hour # 缺失值处理金额字段用中位数填充类别字段用众数 detail[amount] detail[amount].fillna(detail[amount].median()) detail[dishes_name] detail[dishes_name].fillna(detail[dishes_name].mode()[0]) # 按订单聚合生成每日销售额 daily_sale info.groupby(date)[order_amount].sum().reset_index() daily_sale.columns [date, total_sale] daily_sale.to_csv(sale_day.csv, indexFalse)这段代码的逻辑说明第一步把订单时间从字符串转成 datetime这是后续做时间序列分析的前提不转的话groupby(date)会报错或者结果不对。第二步对金额缺失用中位数填充餐饮数据里金额分布通常右偏中位数比均值更稳。第三步按天聚合销售额生成sale_day.csv这个文件在后续时序预测里会反复用到。参数方面format必须和原始字符串格式完全匹配差一个空格都会解析失败encoding如果遇到乱码常见做法是换成gbk或utf-8-sig试一下。2.3 探索性分析脚本的输出物探索性分析.py负责生成可视化图表压缩包里已经包含了部分输出结果每日用餐人数折线图.png、每日营业额折线图.png、客户特征分布图.png、时序图.png、自相关图.png、差分后自相关图.png。这些图不是装饰是判断数据是否适合做时间序列预测的依据。比如自相关图.png如果衰减很慢说明序列不平稳需要差分差分后自相关图.png如果快速衰减到零附近说明差分后平稳可以用 ARIMA 类模型。我一般会先看这两张图再决定模型参数而不是直接套默认值。3. 从数据到预测时间序列与关联规则两条线怎么跑3.1 时间序列预测的完整流程构建模型.py里主要包含时间序列预测和关联规则挖掘两部分。时间序列这条线核心目标是预测未来 3 天的销售额或用餐人数。压缩包里已经有未来3天预测结果图.png说明作者跑通过一次。我按自己的习惯把流程拆成四步平稳性检验、模型定阶、训练预测、残差检查。import pandas as pd import numpy as np from statsmodels.tsa.stattools import adfuller from statsmodels.tsa.arima.model import ARIMA import matplotlib.pyplot as plt # 读取每日销售额 sale pd.read_csv(sale_day.csv, parse_dates[date], index_coldate) ts sale[total_sale] # 平稳性检验 adf_result adfuller(ts.dropna()) print(fADF统计量: {adf_result[0]:.4f}, p值: {adf_result[1]:.4f}) if adf_result[1] 0.05: ts_diff ts.diff().dropna() adf_result_diff adfuller(ts_diff) print(f差分后p值: {adf_result_diff[1]:.4f}) # 模型训练ARIMA(p,d,q)d由差分次数决定 model ARIMA(ts, order(1, 1, 1)) model_fit model.fit() print(model_fit.summary()) # 预测未来3天 forecast model_fit.forecast(steps3) print(未来3天预测值:) print(forecast) # 残差检查 residuals model_fit.resid plt.figure(figsize(10, 4)) plt.plot(residuals) plt.title(Residuals) plt.savefig(residual_check.png)逻辑说明ADF 检验的 p 值大于 0.05 说明序列非平稳需要差分。order(1,1,1)里的三个参数分别是 AR 阶数、差分次数、MA 阶数差分次数 d 由前面检验决定p 和 q 通常看 ACF 和 PACF 图来定但实操中从 (1,1,1) 或 (2,1,2) 开始试也常见。forecast(steps3)直接输出未来 3 天预测值。残差图如果呈现随机分布、没有明显趋势说明模型基本可用如果残差还有周期性说明模型没抓干净需要加季节项。参数调整时order里的 p 和 q 每增加 1模型复杂度上升训练时间变长但未必提升精度我一般用 AIC 准则辅助判断。3.2 关联规则挖掘与菜品推荐另一条线是关联规则对应apriori.py和rules.csv、rules_new.csv、rules_item.csv、ruledata.csv。餐饮场景里关联规则用来发现「点了 A 的人大概率也会点 B」用于菜单推荐或套餐设计。Apriori 算法的核心参数是最小支持度和最小置信度。from mlxtend.frequent_patterns import apriori, association_rules import pandas as pd # 读取订单-菜品矩阵每行一个订单每列一个菜品值为1或0 dishes_matrix pd.read_csv(dishes_matrix.csv, index_col0) # 挖掘频繁项集最小支持度设为0.05 frequent_itemsets apriori(dishes_matrix, min_support0.05, use_colnamesTrue) # 生成关联规则最小置信度设为0.3 rules association_rules(frequent_itemsets, metricconfidence, min_threshold0.3) # 按提升度排序提升度1说明正相关 rules rules.sort_values(lift, ascendingFalse) rules.to_csv(rules_new.csv, indexFalse) print(rules[[antecedents, consequents, support, confidence, lift]].head(10))参数说明min_support0.05表示一个菜品组合至少在 5% 的订单里同时出现才被保留设太高规则太少设太低规则爆炸。min_threshold0.3表示置信度至少 30%即点了 A 的人有 30% 以上也点了 B。lift大于 1 说明 A 和 B 正相关小于 1 说明负相关等于 1 说明独立。我一般会先跑一版看规则数量如果超过几百条就提高支持度或置信度阈值再跑。dishes_matrix.csv是 0-1 矩阵如果原始数据是订单明细需要先用pivot_table或groupby转成这个格式。3.3 模型评价脚本的用法模型评价.py负责计算预测误差和分类指标。时间序列常用 MAE、RMSE、MAPE分类任务常用准确率、召回率、F1。这个脚本通常会读取预测结果和真实值输出指标表格。我一般会关注 MAPE因为它对量纲不敏感餐饮销售额预测里 MAPE 低于 15% 算不错低于 10% 算很好。如果 MAPE 超过 30%大概率是数据里有异常值或者模型没捕捉到周期性。4. 避坑与常见问题跑这套代码容易翻车的几个地方4.1 时间列解析失败导致后续全错现象pd.to_datetime报ValueError: time data 2023/1/1 does not match format %Y-%m-%d。原因原始 CSV 里时间格式不统一有的用斜杠有的用横杠有的月份没补零。解决先pd.to_datetime(info[order_time], infer_datetime_formatTrue)让 pandas 自动推断或者用errorscoerce把解析失败的置为 NaT再检查有多少条失败。我一般会先跑一遍info[order_time].head(20)看实际格式再决定 format 参数。4.2 编码问题导致中文列名乱码现象读取 CSV 后列名显示为\xe8\x8f\x9c\xe5\x93\x81之类的字节串。原因文件保存时用了 GBK 编码读取时默认 UTF-8。解决pd.read_csv(meal_order_detail.csv, encodinggbk)或encodingutf-8-sig。如果还不行用chardet.detect(open(file.csv,rb).read())检测实际编码。压缩包里部分文件是 Excel 格式用pd.read_excel读取时不需要 encoding 参数。4.3 ARIMA 模型不收敛或报错现象model_fit model.fit()抛出LinAlgError或ConvergenceWarning。原因数据里有缺失值、无穷大值或者差分后序列长度太短。解决先ts ts.replace([np.inf, -np.inf], np.nan).dropna()清理确保序列长度至少 30 个点以上。如果还不行把order里的 p 和 q 降到 0 或 1或者改用SARIMAX加季节项。我遇到过差分后只剩十几个点的情况这时候 ARIMA 基本没法用得换指数平滑或 Prophet。4.4 关联规则数量过多或过少现象apriori跑出来几千条规则或者一条都没有。原因支持度阈值设得不合适。解决先统计菜品出现频率把min_support设为出现频率最低的那个菜品的支持度附近。如果规则太多提高min_support到 0.1 或 0.2如果一条都没有降到 0.01 再试。另外注意dishes_matrix.csv必须是 0-1 矩阵如果里面是数量而不是 0/1需要先二值化。4.5 预测结果与业务常识矛盾现象模型预测未来 3 天销售额为负数或者比历史最高值还高好几倍。原因模型对异常值敏感或者差分还原时出错。解决检查原始序列有没有负值或极端值用 IQR 方法识别异常点并替换为中位数。预测值如果为负说明模型设定有问题常见做法是改用对数变换后再预测最后再指数还原。另外餐饮数据有明显的周末效应如果模型没考虑星期几预测会系统性偏高或偏低。5. 进阶技巧把预测结果落到业务决策上跑通模型只是第一步真正有价值的是把预测结果翻译成采购和排班建议。我一般会在预测出未来 3 天销售额后再乘一个菜品结构系数估算出各品类的大致需求量。比如历史数据里热菜占比 60%、凉菜 15%、饮品 25%就用预测销售额乘以这些比例再除以平均单价得到各品类的备货量。这个系数可以从meal_dishes_detail.csv里按品类汇总算出来。另一个技巧是用关联规则做套餐推荐。rules_new.csv里提升度最高的那几条规则直接对应「如果顾客点了 A推荐 B」的策略。我通常会把提升度大于 1.5 且置信度大于 0.4 的规则筛出来人工审核一遍把明显不合理的组合去掉剩下的交给运营配置到点餐系统里。注意关联规则反映的是历史共现关系不代表因果关系所以推荐时最好加上「搭配购买更优惠」之类的引导而不是强制捆绑。验证预测效果不能只看 MAPE。我习惯把历史数据切成训练集和测试集比如用前 80% 训练、后 20% 测试滚动预测多次看误差是否稳定。如果某一段时间误差突然变大回去查那段时间有没有节假日或促销活动这些事件往往需要单独建模或加虚拟变量。压缩包里的2006年到2015年餐饮行业餐费收入.xlsx可以用来做宏观趋势对照看看企业数据和大盘走势是否一致如果偏离太大说明企业自身有特殊情况。从那以后我每次拿到新的餐饮数据集都强制先跑一遍字段说明对照和缺失值统计再动手建模。这套资源里的脚本和中间产物省了很多重复劳动但前提是你要清楚每张表在说什么、每个参数在控制什么。希望帮到你。本文还有配套的精品资源点击获取
返回列表