简介这份资源面向具备一定机器学习与Python基础的数据分析学习者围绕旅游与经济指标之间的关联展开完整实战。包内共9个文件以7个py源代码为主另含1个csv数据集与1个txt说明文件压缩包约283KB数据文件约665.76KB规模轻量便于快速上手。代码覆盖数据清洗、探索性分析、统计检验与建模预测全流程涉及pandas、seaborn、geopandas等可视化与地理处理工具并集成线性回归、随机森林、梯度提升、SVR、XGBoost、决策树、KMeans聚类以及ARIMA与Holt-Winters指数平滑等时间序列方法还使用t检验与标准化预处理。读者可据此获得一套可运行的旅游经济影响分析方案理解从指标相关性挖掘到多模型对比、时序预测与聚类分群的实现思路并借助现成脚本与数据复现实验、迁移到其他经济数据集。目前已有40人学习下载。1. 旅游和经济指标关系数据集分析7 个脚本能跑出什么结论旅游人数涨了GDP 就一定跟着涨吗这个问题在学术圈吵了几十年但如果你手里有一份 665.76 KB 的world_tourism_economy_data.csv加上 7 个已经整理好的 Python 脚本一个下午就能跑出属于自己的判断。这份资源包的核心不是教你调包而是把「旅游指标 → 经济指标」这条分析链路拆成了 7 个可独立运行的脚本从 EDA 到回归、从时间序列到聚类每个脚本对应一个具体的分析视角。适合谁做过基础 pandas 清洗、想拿真实跨国面板数据练手的人也适合需要快速搭出「旅游经济影响」分析框架、再替换成自己业务数据的从业者。代码手工整理过无语法错误模块依赖列得清清楚楚拿到就能跑。2. 数据底子与脚本分工先搞清楚 7 个文件各自管什么2.1 数据集字段结构与加载方式world_tourism_economy_data.csv是典型的「国家-年份」面板结构。常见字段包括国家名称、年份、国际游客到达数、旅游收入、GDP、人口、通胀率等。加载时最容易翻车的地方是列名带空格或大小写不一致所以第一步永远是先看列名再动手。import pandas as pd df pd.read_csv(data/world_tourism_economy_data.csv) print(df.shape) print(df.columns.tolist()) print(df.dtypes) print(df.head())逻辑说明shape确认行列规模columns拿到真实列名后面所有脚本都依赖它dtypes判断哪些数值列被读成了 objecthead快速扫一眼缺失情况。参数上如果列名有前后空格加df.columns df.columns.str.strip()如果年份被读成字符串用pd.to_numeric(df[year], errorscoerce)转回来。2.2 七个脚本的职责划分这 7 个脚本不是随便堆的它们覆盖了从描述统计到预测建模的完整梯度脚本主要任务关键模块1-Tourism and Economic Impact Analysis.py基础相关性与分布分析pandas, seaborn3-TOURISM.py旅游指标趋势可视化matplotlib, pycountry4-Tourism and Economic Impact EDA eg china.py以中国为例的国别 EDApandas, matplotlib5-Analyzing Global Tourisms Economic Effects.py全球面板回归sklearn LinearRegression6-EDA Tourism.py探索性数据分析汇总seaborn, numpy7-Global Tourism Indicators and Economic Dynamics.py时间序列与预测ARIMA, SimpleExpSmoothing8-Global Tourism Economic Analysis.py聚类与集成模型KMeans, RandomForest, XGBoost理解这个分工后你就不会一上来就扎进第 8 个脚本而是按「先看分布 → 再做相关 → 再上模型」的顺序推进。常见做法是先用脚本 1 和 6 摸清数据质量再决定后面用哪些特征。2.3 环境依赖与运行顺序模块清单里既有kagglehub也有geopandas这两个是环境里最容易缺的。kagglehub用于从 Kaggle 拉取原始数据如果你已经有本地 CSV可以跳过geopandas用于地理可视化在 Windows 上装起来比较折腾建议用 conda 装而不是 pip。pip install pandas numpy seaborn matplotlib pycountry scikit-learn statsmodels xgboost scipy conda install -c conda-forge geopandas运行顺序建议先跑1和6做数据体检再跑4看单国案例然后3和5做趋势与回归最后7和8上预测与聚类。每个脚本独立可运行但共享同一份 CSV所以路径要统一。3. 从 EDA 到回归把旅游指标和经济指标接起来3.1 相关性分析与可视化旅游收入、游客到达数、GDP 三者之间的关系不是线性的直接算 Pearson 相关系数容易被极端值带偏。脚本 1 和 6 里用的是热力图加散点矩阵的组合先看整体分布再算相关。import seaborn as sns import matplotlib.pyplot as plt cols [tourism_arrivals, tourism_receipts, gdp, population] corr df[cols].corr(methodspearman) sns.heatmap(corr, annotTrue, cmapcoolwarm, fmt.2f) plt.title(Spearman Correlation) plt.show()逻辑说明用spearman而不是默认的pearson是因为旅游和经济指标常有非线性单调关系Spearman 对异常值更稳。参数上annotTrue显示数值fmt.2f控制小数位。如果某些国家数据缺失严重先df.dropna(subsetcols)再算否则相关系数会被 NaN 污染。3.2 线性回归与随机森林的对比脚本 5 用LinearRegression做基准脚本 8 用RandomForestRegressor和GradientBoostingRegressor做非线性对比。这个设计很务实先看线性模型能解释多少再看树模型有没有提升空间。from sklearn.model_selection import train_test_split from sklearn.linear_model import LinearRegression from sklearn.ensemble import RandomForestRegressor from sklearn.metrics import mean_squared_error, mean_absolute_error X df[[tourism_arrivals, tourism_receipts, population]] y df[gdp] X_train, X_test, y_train, y_test train_test_split(X, y, test_size0.2, random_state42) lr LinearRegression().fit(X_train, y_train) rf RandomForestRegressor(n_estimators200, random_state42).fit(X_train, y_train) for name, model in [(LR, lr), (RF, rf)]: pred model.predict(X_test) print(name, MSE:, mean_squared_error(y_test, pred), MAE:, mean_absolute_error(y_test, pred))逻辑说明test_size0.2留出验证集random_state42保证可复现。n_estimators200是随机森林的常用起点再高收益递减。注意 GDP 量级远大于旅游指标MSE 会很大建议对 y 做对数变换或标准化后再比较。脚本里还引入了StandardScaler这是让不同量纲特征能公平进入模型的关键一步。3.3 时间序列预测ARIMA 与指数平滑脚本 7 用了ARIMA和SimpleExpSmoothing这是处理年度旅游数据最直接的两把刀。ARIMA 适合有自相关结构的序列指数平滑适合趋势明显但噪声大的序列。from statsmodels.tsa.arima.model import ARIMA from statsmodels.tsa.holtwinters import SimpleExpSmoothing series df[df[country] China].set_index(year)[tourism_arrivals].dropna() model ARIMA(series, order(1, 1, 1)).fit() forecast model.forecast(steps3) print(forecast) ses SimpleExpSmoothing(series).fit() print(ses.forecast(3))逻辑说明order(1,1,1)是 ARIMA 的经典起步参数分别对应自回归、差分、移动平均阶数。差分阶数d1表示做一阶差分消除趋势。forecast(steps3)预测未来三年。如果序列太短少于 10 个点ARIMA 容易过拟合这时候指数平滑更稳。脚本里对每个国家单独建模注意有些国家数据点太少会报错加个长度判断再跑。4. 避坑与排查跑这份代码最容易翻车的五个地方4.1 现象pycountry报 KeyError原因国家名称在 CSV 里是中文或非标准英文pycountry只认 ISO 标准名称。解决先做名称映射或者用pycountry.countries.search_fuzzy(name)做模糊匹配匹配不到的直接跳过别硬转。4.2 现象geopandas导入失败或绘图空白原因Windows 上geopandas依赖 GDAL/Fionapip 直装经常缺底层库。解决用 conda 装geopandas或者干脆跳过地理可视化用普通条形图替代。脚本 3 里的地图部分不是核心分析缺了不影响结论。4.3 现象ARIMA 报「Too few observations」原因某些国家只有三五年数据ARIMA 需要足够样本估计参数。解决在循环里加if len(series) 10: continue或者对这些国家改用简单移动平均。别为了跑通所有国家把参数改成(0,0,0)那样等于没建模。4.4 现象回归 MSE 巨大模型看起来「完全不准」原因GDP 是万亿量级旅游指标是百万量级量纲差异导致 MSE 被 GDP 主导。解决对 y 做np.log1p()变换或者用StandardScaler标准化后再回归。评估时看 R² 和 MAE 的百分比误差别只盯 MSE。4.5 现象kagglehub下载卡住或报认证错误原因kagglehub需要配置 API token国内网络环境下经常超时。解决既然资源包里已经带了完整 CSV直接注释掉下载代码用本地路径读取。这是最省事的做法别在下载环节耗时间。5. 进阶玩法用聚类和假设检验挖出隐藏分组5.1 KMeans 把国家分成几档脚本 8 里的KMeans不是摆设。把「旅游收入占 GDP 比重」和「游客增长率」两个维度丢进去能自动分出「旅游驱动型」「经济驱动型」「双弱型」几类国家。肘部法则选 K 值比拍脑袋定 3 类靠谱。from sklearn.cluster import KMeans from sklearn.preprocessing import StandardScaler feat df.groupby(country).agg({ tourism_receipts: mean, gdp: mean, tourism_arrivals: mean }).dropna() feat[ratio] feat[tourism_receipts] / feat[gdp] X StandardScaler().fit_transform(feat[[ratio, tourism_arrivals]]) inertia [] for k in range(2, 8): km KMeans(n_clustersk, random_state42, n_init10).fit(X) inertia.append(km.inertia_) print(inertia)逻辑说明先按国家聚合取均值再构造「旅游收入/GDP」比值作为核心特征。StandardScaler必不可少否则游客数的量级会压过比值。n_init10是 sklearn 新版的推荐值避免局部最优。看inertia下降拐点选 K通常 3 到 4 类最有解释力。5.2 t 检验验证两组差异是否显著脚本里用到了scipy.stats.ttest_ind这是很多人会忽略的一步。聚类分完组后不能只看均值差异就下结论得做假设检验。from scipy.stats import ttest_ind group_a feat[feat[cluster] 0][ratio] group_b feat[feat[cluster] 1][ratio] t_stat, p_val ttest_ind(group_a, group_b, equal_varFalse) print(t:, t_stat, p:, p_val)逻辑说明equal_varFalse对应 Welch t 检验不假设两组方差相等更稳妥。p 值小于 0.05 才能说两组差异显著。如果 p 值很大说明聚类在这两个维度上没拉开差距得换特征或调整 K 值。5.3 模型验证与结果复现的检查清单跑完所有脚本后怎么确认结果可信我一般会强制走一遍这几步第一固定random_state确保每次跑结果一致第二把训练集和测试集的评估指标都打印出来看有没有过拟合第三对时间序列做滚动预测验证而不是只看一次性 forecast第四把关键结论用另一个脚本交叉验证比如回归说旅游收入影响 GDP聚类也应该能看到高旅游收入组的经济表现更好。从那以后我每次拿到新的面板数据都先跑一遍「分布 → 相关 → 回归 → 聚类」这条链路再决定要不要上复杂模型。希望这份资源包能帮你省掉搭框架的时间把精力花在解读结果上。本文还有配套的精品资源点击获取