首页/新闻资讯/正文详情

旅游经济指标数据集分析预测:从特征工程到滚动预测全流程

发布时间:2026/9/24 22:14:56 来源:云帆数科 栏目:资讯中心
旅游经济指标数据集分析预测:从特征工程到滚动预测全流程
简介这份资源面向具备一定机器学习与Python基础、希望将AI方法落地到旅游经济交叉领域的学习者与数据分析从业者围绕全球旅游指标与经济指标的关系展开建模与预测实践。包内共9个文件以7个py源代码为主另含1个csv数据集与1个txt说明文件压缩包约283KB数据文件约665.76KB代码总量约44.34KB结构紧凑、便于按模块检索。代码覆盖数据清洗、探索性分析、特征标准化、回归与集成预测、时间序列建模及聚类等环节涉及随机森林、梯度提升、SVR、XGBoost、ARIMA、指数平滑、KMeans与假设检验等方法并借助geopandas与pycountry完成地理维度处理。已有40人学习下载适合作为课程设计、竞赛练手或论文复现的参考方案帮助读者快速理解从指标关联分析到预测评估的完整流程与排错思路。1. 旅游和经济指标关系数据集分析预测这套东西到底能拿来干什么手里拿到一份「旅游和经济指标关系数据集分析预测实例」里面包含 7 个源代码文件和一份 665.76 KB 的完整数据集很多人第一反应是这跟金融时序预测、用户消费预测有什么关系其实关系很大。旅游数据本身就是典型的宏观经济晴雨表——入境游客数、国内旅游收入、酒店入住率这些指标和 GDP、CPI、居民可支配收入之间存在明显的滞后相关。这套实例的核心价值是让你用一份结构化数据把「经济指标怎么影响旅游需求」这件事跑通一遍从数据清洗、特征工程到建模预测全流程都有代码可复现。它适合谁一是想入门结构化数据分析和时序预测的 Python 开发者二是做旅游行业数据运营、需要向业务方解释「为什么这个月客流掉了」的分析师三是手里有类似经济指标数据、想套用一套现成 pipeline 的从业者。665.76 KB 的数据集体量不大但字段设计通常覆盖了年份、季度、游客量、收入、价格指数等维度足够你把回归、时序分解、甚至简单的机器学习模型都试一遍。7 个源代码文件大概率是按「读取→清洗→特征→训练→评估→可视化」拆分的这种拆分方式本身就是一种可抄的工程习惯。2. 先搞清楚数据长什么样字段、粒度与相关性初探2.1 拿到数据集先做三件事读入、看形状、查缺失不管后面用什么模型第一步永远是让数据在 Python 里「现出原形」。我一般用 pandas 直接读然后立刻打印 shape、dtypes 和缺失值统计。这一步不做后面所有分析都是空中楼阁。import pandas as pd import numpy as np # 读取数据集注意编码中文数据常见 gbk 或 utf-8-sig df pd.read_csv(tourism_economy.csv, encodingutf-8-sig) # 三件事形状、类型、缺失 print(数据形状:, df.shape) print(\n字段类型:\n, df.dtypes) print(\n缺失值统计:\n, df.isnull().sum()) print(\n前5行:\n, df.head())逻辑说明encodingutf-8-sig是为了处理带 BOM 的中文 CSV避免第一列列名出现乱码。df.isnull().sum()按列统计缺失数量如果某列缺失超过 30%就要考虑是删列还是插值。参数上read_csv的parse_dates参数可以在读入时直接把日期列转成 datetime省去后面单独转换。2.2 旅游指标和经济指标的粒度对齐季度还是年度旅游数据常见粒度是月度或季度经济指标GDP、CPI往往是季度或年度。粒度不一致是这类数据集最大的坑。如果旅游是月度、GDP 是季度直接合并会导致大量 NaN。常见做法是把月度旅游数据按季度聚合求和或求均值再和季度经济指标对齐。# 假设日期列叫 date旅游收入列叫 tourism_revenue df[date] pd.to_datetime(df[date]) df df.set_index(date) # 月度转季度旅游收入求和价格指数求均值 quarterly df.resample(Q).agg({ tourism_revenue: sum, tourism_visitors: sum, cpi: mean, gdp: mean }).dropna() print(季度数据形状:, quarterly.shape) print(quarterly.head())逻辑说明resample(Q)按季度重采样agg里对不同列用不同聚合方式——流量型指标收入、游客数用 sum价格型指标CPI用 mean。dropna()去掉因重采样产生的空行。参数上如果数据是月度但你想保留月度粒度那就反过来把季度 GDP 插值成月度用interpolate(methodlinear)但插值会引入虚假精度我一般优先选聚合。2.3 相关性热力图先看谁和谁真的有关在建模之前用相关系数矩阵快速筛一遍特征。旅游收入和自己滞后一期的相关性通常极高和经济指标的相关性则要看滞后阶数。这一步能帮你砍掉大量无关字段。import seaborn as sns import matplotlib.pyplot as plt # 计算皮尔逊相关系数 corr quarterly.corr(methodpearson) plt.figure(figsize(10, 8)) sns.heatmap(corr, annotTrue, fmt.2f, cmapRdBu_r, center0) plt.title(旅游与经济指标相关性矩阵) plt.tight_layout() plt.savefig(corr_heatmap.png, dpi150) plt.show() # 打印与旅游收入相关性最高的前5个字段 print(corr[tourism_revenue].sort_values(ascendingFalse).head())逻辑说明methodpearson适合线性关系如果怀疑非线性换成spearman。center0让颜色以 0 为中心对称正相关偏红、负相关偏蓝。看结果时注意相关系数高不代表因果GDP 和旅游收入可能同时受第三因素驱动。这一步的产出是「候选特征列表」不是最终结论。3. 特征工程怎么做滞后项、差分和滚动统计3.1 给经济指标加滞后旅游需求反应没那么快经济指标对旅游的影响通常有滞后。居民收入涨了不会下个月就立刻多出游可能隔一到两个季度才体现。所以要把 GDP、CPI 这些字段做shift生成滞后特征。# 生成经济指标的滞后1期和滞后2期 for col in [gdp, cpi, income]: if col in quarterly.columns: quarterly[f{col}_lag1] quarterly[col].shift(1) quarterly[f{col}_lag2] quarterly[col].shift(2) # 去掉因 shift 产生的空行 quarterly quarterly.dropna() print(加滞后后形状:, quarterly.shape) print(quarterly.columns.tolist())逻辑说明shift(1)把当前值往下移一行表示「上一期的值」。滞后阶数怎么定看第 2 章的相关性矩阵如果旅游收入与 GDP 滞后 2 期的相关性最高就重点保留 lag2。参数上不要盲目加太多滞后每加一阶就少一行数据样本本来就少的话会很快耗尽。3.2 差分让序列平稳ADF 检验别跳过时序预测里非平稳序列直接建模会得到虚假回归。旅游收入往往有趋势和季节性需要差分。差分前先做 ADF 检验用 p 值判断是否平稳。from statsmodels.tsa.stattools import adfuller def adf_test(series, name): result adfuller(series.dropna(), autolagAIC) print(f{name} ADF统计量: {result[0]:.4f}, p值: {result[1]:.4f}) if result[1] 0.05: print(f → {name} 平稳) else: print(f → {name} 非平稳需要差分) adf_test(quarterly[tourism_revenue], 旅游收入原始) adf_test(quarterly[tourism_revenue].diff(), 旅游收入一阶差分)逻辑说明autolagAIC让 statsmodels 自动选滞后阶数。p 值小于 0.05 拒绝「存在单位根」的原假设即序列平稳。如果一阶差分后仍不平稳试二阶差分或取对数后再差分。注意差分会让数据再少一行且差分后的值解释起来是「变化量」不是绝对水平。3.3 滚动统计特征把趋势和波动量化出来除了原始值和滞后值滚动均值和滚动标准差能捕捉局部趋势和波动。旅游数据常有明显季节性滚动窗口一般取 4对应四个季度。# 滚动均值和滚动标准差窗口4个季度 quarterly[revenue_roll_mean_4] quarterly[tourism_revenue].rolling(window4).mean() quarterly[revenue_roll_std_4] quarterly[tourism_revenue].rolling(window4).std() # 同比变化率 quarterly[revenue_yoy] quarterly[tourism_revenue].pct_change(periods4) quarterly quarterly.dropna() print(最终特征集形状:, quarterly.shape) print(quarterly[[tourism_revenue, revenue_roll_mean_4, revenue_yoy]].head())逻辑说明rolling(window4)计算前四个季度的统计量pct_change(periods4)算同比。这些特征对树模型特别有用因为树模型不擅长自己发现「趋势」这种全局模式。参数上窗口大小要和业务周期匹配——季度数据用 4月度数据用 12。4. 建模与预测从线性回归到树模型怎么选4.1 基线模型先跑线性回归别一上来就上大模型很多人拿到数据直接上 LSTM 或 Transformer结果发现还不如线性回归。时序数据样本量小的时候简单模型往往更稳。先跑一个带滞后特征的线性回归当基线。from sklearn.linear_model import LinearRegression from sklearn.model_selection import TimeSeriesSplit from sklearn.metrics import mean_absolute_error, r2_score # 特征列和目标列 feature_cols [c for c in quarterly.columns if c ! tourism_revenue] X quarterly[feature_cols].values y quarterly[tourism_revenue].values # 时序交叉验证不能随机打乱 tscv TimeSeriesSplit(n_splits3) model LinearRegression() for train_idx, test_idx in tscv.split(X): X_train, X_test X[train_idx], X[test_idx] y_train, y_test y[train_idx], y[test_idx] model.fit(X_train, y_train) pred model.predict(X_test) print(fMAE: {mean_absolute_error(y_test, pred):.2f}, R2: {r2_score(y_test, pred):.4f})逻辑说明TimeSeriesSplit保证训练集永远在测试集之前避免未来信息泄露。这是时序预测和普通回归最大的区别——随机划分会让模型「偷看」未来。参数上n_splits3表示做三轮滚动样本少就设 2 或 3样本多可以设 5。4.2 树模型处理非线性随机森林和梯度提升如果线性回归的 R2 明显偏低说明经济指标和旅游收入之间可能是非线性关系。随机森林和梯度提升树能自动捕捉交互项和阈值效应。from sklearn.ensemble import RandomForestRegressor, GradientBoostingRegressor models { 随机森林: RandomForestRegressor(n_estimators200, max_depth5, random_state42), 梯度提升: GradientBoostingRegressor(n_estimators200, learning_rate0.05, max_depth3, random_state42) } for name, m in models.items(): scores [] for train_idx, test_idx in tscv.split(X): m.fit(X[train_idx], y[train_idx]) pred m.predict(X[test_idx]) scores.append(r2_score(y[test_idx], pred)) print(f{name} 平均R2: {np.mean(scores):.4f})逻辑说明max_depth5控制树深防止过拟合learning_rate0.05是梯度提升的学习率越小越稳但需要更多树。参数上样本量小于 200 时n_estimators设 100 到 300 就够再多收益递减。注意树模型不能外推如果测试集的经济指标超出训练集范围预测会失真。4.3 特征重要性哪些经济指标真正在驱动旅游树模型训练完可以直接看特征重要性这比相关系数更可靠因为它考虑了特征之间的交互。rf RandomForestRegressor(n_estimators200, max_depth5, random_state42) rf.fit(X, y) importance pd.Series(rf.feature_importances_, indexfeature_cols) importance importance.sort_values(ascendingFalse) print(特征重要性排序:\n, importance.head(10)) importance.head(10).plot(kindbarh, figsize(8, 6)) plt.xlabel(重要性) plt.tight_layout() plt.savefig(feature_importance.png, dpi150) plt.show()逻辑说明feature_importances_是基尼重要性反映每个特征在分裂时带来的不纯度下降总量。排在前面的通常是旅游收入的滞后项和滚动均值经济指标里 GDP 滞后项往往排得比较靠前。参数上如果发现某个特征重要性异常高检查它是不是目标变量的泄漏比如用了同期的旅游收入衍生字段。5. 避坑与排查这类数据集最容易翻车的五个地方5.1 现象模型 R2 高得离谱接近 1.0原因特征里混入了目标变量的同期值或未来值。比如用「旅游收入」算出来的滚动均值去预测「旅游收入」或者用了同期的 GDP 去预测同期旅游收入而 GDP 和旅游收入是同时决定的。解决检查所有特征列确保每个特征在预测时点都是已知的。滞后特征至少 lag1滚动统计要用shift(1)后再 rolling避免包含当前期。5.2 现象预测结果全是直线没有任何波动原因用了树模型做外推或者特征里全是滞后项导致模型只会复制上一期值。树模型的预测值域被训练集限制遇到新范围就输出边界值。解决如果要做外推换线性模型或 ARIMA 类时序模型。如果特征全是滞后项加入经济指标的当期或领先项前提是预测时能拿到。5.3 现象ADF 检验 p 值忽高忽低差分阶数拿不准原因样本量太小ADF 检验功效不足。665.76 KB 的数据集如果按季度聚合可能只剩几十行统计检验结果不稳定。解决不要只依赖 ADF结合时序图肉眼判断趋势和季节性。样本少于 50 行时优先用差分后的数据建模并在评估时留出足够长的测试集。5.4 现象中文列名读取后变成乱码原因CSV 编码不是 utf-8可能是 gbk 或 gb2312。解决读入时依次尝试encodingutf-8-sig、encodinggbk、encodinggb18030。如果还不行用chardet检测编码。写回文件时统一用utf-8-sig方便 Excel 打开。5.5 现象交叉验证每折结果差异巨大原因时序数据本身波动大或者某一折测试集刚好落在异常年份如疫情年份。旅游数据在特殊年份会出现断崖式下跌任何模型都预测不准。解决把异常年份单独拿出来分析不要混在常规评估里。如果数据包含 2020 年前后考虑加一个「是否异常期」的哑变量或者分段建模。6. 把预测结果用起来滚动预测与业务解读模型跑通只是第一步真正有价值的是把它变成可重复的滚动预测流程。我一般会写一个函数每次用最新数据重新训练预测下一期然后滚动前进。这样既能验证模型稳定性也能模拟真实业务场景。def rolling_forecast(df, feature_cols, target_col, model, horizon1): 滚动预测每次用历史数据训练预测下一期 predictions [] actuals [] for i in range(len(df) - horizon): train df.iloc[:i1] test df.iloc[i1:i1horizon] if len(test) 0: break model.fit(train[feature_cols], train[target_col]) pred model.predict(test[feature_cols]) predictions.append(pred[0]) actuals.append(test[target_col].values[0]) mae mean_absolute_error(actuals, predictions) print(f滚动预测 MAE: {mae:.2f}) return predictions, actuals preds, acts rolling_forecast(quarterly, feature_cols, tourism_revenue, RandomForestRegressor(n_estimators200, max_depth5, random_state42))逻辑说明这个函数模拟了「每次只拿到历史数据」的真实场景避免任何未来信息泄露。horizon1表示每次预测下一期。参数上如果数据量允许可以把horizon设成 2 或 4看模型在多步预测下的衰减情况。业务解读上我习惯把预测值和实际值画在同一张图里标注经济指标的变化节点。比如 GDP 增速放缓后的两个季度旅游收入预测值是否也跟着下调。这种图拿给业务方看比单纯报 R2 有说服力得多。最后说一个我踩过的坑早期我总想把所有经济指标都塞进模型觉得特征越多越好。后来发现在样本量只有几十行的情况下特征超过 10 个就开始过拟合交叉验证分数虚高实际滚动预测一塌糊涂。现在我的习惯是先用相关性筛一轮再用树模型的重要性砍到 5 到 8 个特征宁可少而精。这套数据集和 7 个源代码文件的价值不在于模型多复杂而在于让你把「数据对齐→特征构造→时序验证→滚动预测」这条链路完整走一遍每一步都亲手调过参数、看过输出才算真正掌握。希望帮到你。本文还有配套的精品资源点击获取

相关推荐

基于Spring Boot的重症监护室护理管理系统设计与实现
基于Spring Boot的重症监护室护理管理系统设计与实现

重症监护室的护理管理,说实话是个非常典型的“小而难”业务场景。难不在于业务逻辑有多复杂,而在于数据实时性要求高、来源零散、医疗责任界定严格。我这次做的这套基于Spring Boot框架的重症监护室急诊护理管理系统,就是针对ICU日常护理中“… · 2026/9/24 22:14:50

日志管理实战:从噪音到信号的可追溯性工程
日志管理实战:从噪音到信号的可追溯性工程

日志管理这件事,我干了十多年,从最早在机房里手抄Apache访问记录,到后来用Shell脚本轮转、grep筛错,再到如今每天处理TB级结构化日志流——它从来不是“配个Log4j就完事”的小功能,而是一套贯穿开发、测试、运维、安全… · 2026/9/24 22:14:50

垃圾分类图像分类数据集实战:从数据清洗到迁移学习模型验证
垃圾分类图像分类数据集实战:从数据清洗到迁移学习模型验证

简介:这份深度学习图像分类数据集面向从事计算机视觉入门与垃圾分类识别实践的开发者、学生及算法爱好者,围绕塑料瓶、玻璃瓶、金属瓶等可回收物类别构建,可用于训练与评估瓶类垃圾自动分拣模型。资源按目录组织,同类样本归入同一… · 2026/9/24 22:14:50

Git深度原理与工程实践:暂存区、分支模型与历史重写
Git深度原理与工程实践:暂存区、分支模型与历史重写

简介:这是一份面向新人开发者与企业/高校培训场景的Git系统性入门课件,聚焦解决零基础快速掌握Git核心操作与协作流程的实际需求。59页PPTX文件完整覆盖Git原理、安装配置、工作区/暂存区/版本库三区模型、常用命令(init/clone/add/commit/re… · 2026/9/24 22:57:35

jina-ocr-v1:面向工业级文档结构化的OCR解决方案
jina-ocr-v1:面向工业级文档结构化的OCR解决方案

1. 项目概述:为什么 jina-ocr-v1 不是又一个“能识字”的OCR,而是真正解决业务卡点的工业级工具你有没有遇到过这样的场景:扫描一份带左右两栏布局的学术论文PDF,结果OCR输出的文字全乱了顺序,左栏文字插在右栏中间&am… · 2026/9/24 22:57:35

小麦免少耕播种清秸防堵装置设计|毕设答辩|机械设计项目|毕设项目|机械设计专业
小麦免少耕播种清秸防堵装置设计|毕设答辩|机械设计项目|毕设项目|机械设计专业

一、項目介绍 摘 要 针对黄淮海小麦-玉米轮作区全量秸秆还田条件下,小麦免少耕播种作业存在的秸秆缠绕、种沟堵塞、作业效率低、播种质量差等核心问题,本课题设计一款适配中小马力拖拉机配套的小麦免少耕播种专用主动式清秸防堵装置。以适配6行小麦窄… · 2026/9/24 22:57:29

Gekko 边界与核心设计解析:市场数据、策略接口与订单执行机制
Gekko 边界与核心设计解析:市场数据、策略接口与订单执行机制

金融科技后端 【免费下载链接】gekko A bitcoin trading bot written in node - https://gekko.wizb.it/ 项目地址: https://gitcode.com/gh_mirrors/ge/gekko 点击查看 免费下载 Gekko 是一个用 Node.js 编写的免费开源加密货币自动化交易套件,本文以官… · 2026/9/24 22:57:22

论编程的个人发展成长计划
论编程的个人发展成长计划

大家好!本人就读于广东省韩山师范学院的电子信息科学与技术专业,目前是大一。对于编程,在我看来就是一门类似于英语学科的语言,不同的是英语是人类之间沟通建起的桥梁,但编程是人与计算机建起的梁渠,可以说… · 2026/9/24 22:57:22

用AI工具10分钟跑通高效求职搜索:从岗位匹配到决策看板
用AI工具10分钟跑通高效求职搜索:从岗位匹配到决策看板

你肯定遇到过这种情况:岗位描述里写着"熟悉增长模型搭建",你简历上明明做过类似的事,可平台的搜索就是搜不到;或者你花了一晚上把几个招聘App刷了个遍,收藏了二十个岗位,第二天再看已经失效了一半… · 2026/9/24 22:57:16

基于YOLOv8的渔船作业监控系统:从环境搭建到边缘部署全流程
基于YOLOv8的渔船作业监控系统:从环境搭建到边缘部署全流程

简介:这是一套面向计算机、人工智能、自动化等专业学生与教师的毕业设计级项目资源,围绕YOLOv8实现渔船作业监控系统,可用于毕设、课程设计、大作业或项目立项演示。压缩包共97个文件,约24.21MB,以70个Python源码文件为… · 2026/9/24 0:00:13

1D-CNN时间序列建模实战:从Conv1d原理到工业落地
1D-CNN时间序列建模实战:从Conv1d原理到工业落地

简介:面向时间序列数据建模的一维卷积神经网络完整实现,适合深度学习入门者及需要快速验证时序模型的研究者,能够从音频、文本、传感器或股价等序列中挖掘局部特征与时间依赖。压缩包体积很小,只有3KB,内含3个Python脚… · 2026/9/24 0:00:26

柔软的L:汉语语流中被忽视的舌肌张力控制
柔软的L:汉语语流中被忽视的舌肌张力控制

1. 这个“L”不是字母表里的L,而是舌尖上的L最近在几个方言群和语音教学社群里,反复看到有人发一句:“也说字母L:柔软的长舌”。初看以为是英语发音课笔记,点开才发现全是方言爱好者、播音系学生、语言康复师甚至戏曲演… · 2026/9/24 0:00:44

了解更多?预约专属演示

我们的顾问将为您一对一讲解产品与方案

企业微信二维码