☰
旅游与经济指标关系分析:7个Python脚本实战
2026/10/12 21:24:23 网站建设 项目流程

简介:这份资源面向具备一定机器学习与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判断哪些数值列被读成了 object,head快速扫一眼缺失情况。参数上,如果列名有前后空格,加df.columns = df.columns.str.strip();如果年份被读成字符串,用pd.to_numeric(df["year"], errors="coerce")转回来。

2.2 七个脚本的职责划分

这 7 个脚本不是随便堆的,它们覆盖了从描述统计到预测建模的完整梯度:

脚本主要任务关键模块
1-Tourism and Economic Impact Analysis.py基础相关性与分布分析pandas, seaborn
3-TOURISM.py旅游指标趋势可视化matplotlib, pycountry
4-Tourism and Economic Impact EDA eg china.py以中国为例的国别 EDApandas, matplotlib
5-Analyzing Global Tourisms Economic Effects.py全球面板回归sklearn LinearRegression
6-EDA Tourism.py探索性数据分析汇总seaborn, numpy
7-Global Tourism Indicators and Economic Dynamics.py时间序列与预测ARIMA, SimpleExpSmoothing
8-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(method="spearman") sns.heatmap(corr, annot=True, cmap="coolwarm", fmt=".2f") plt.title("Spearman Correlation") plt.show()

逻辑说明:用spearman而不是默认的pearson,是因为旅游和经济指标常有非线性单调关系,Spearman 对异常值更稳。参数上,annot=True显示数值,fmt=".2f"控制小数位。如果某些国家数据缺失严重,先df.dropna(subset=cols)再算,否则相关系数会被 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_size=0.2, random_state=42) lr = LinearRegression().fit(X_train, y_train) rf = RandomForestRegressor(n_estimators=200, random_state=42).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_size=0.2留出验证集,random_state=42保证可复现。n_estimators=200是随机森林的常用起点,再高收益递减。注意 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(steps=3) print(forecast) ses = SimpleExpSmoothing(series).fit() print(ses.forecast(3))

逻辑说明:order=(1,1,1)是 ARIMA 的经典起步参数,分别对应自回归、差分、移动平均阶数。差分阶数d=1表示做一阶差分消除趋势。forecast(steps=3)预测未来三年。如果序列太短(少于 10 个点),ARIMA 容易过拟合,这时候指数平滑更稳。脚本里对每个国家单独建模,注意有些国家数据点太少会报错,加个长度判断再跑。

4. 避坑与排查:跑这份代码最容易翻车的五个地方

4.1 现象:pycountry报 KeyError

原因:国家名称在 CSV 里是中文或非标准英文,pycountry只认 ISO 标准名称。解决:先做名称映射,或者用pycountry.countries.search_fuzzy(name)做模糊匹配,匹配不到的直接跳过,别硬转。

4.2 现象:geopandas导入失败或绘图空白

原因:Windows 上geopandas依赖 GDAL/Fiona,pip 直装经常缺底层库。解决:用 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_clusters=k, random_state=42, n_init=10).fit(X) inertia.append(km.inertia_) print(inertia)

逻辑说明:先按国家聚合取均值,再构造「旅游收入/GDP」比值作为核心特征。StandardScaler必不可少,否则游客数的量级会压过比值。n_init=10是 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_var=False) print("t:", t_stat, "p:", p_val)

逻辑说明:equal_var=False对应 Welch t 检验,不假设两组方差相等,更稳妥。p 值小于 0.05 才能说两组差异显著。如果 p 值很大,说明聚类在这两个维度上没拉开差距,得换特征或调整 K 值。

5.3 模型验证与结果复现的检查清单

跑完所有脚本后,怎么确认结果可信?我一般会强制走一遍这几步:第一,固定random_state,确保每次跑结果一致;第二,把训练集和测试集的评估指标都打印出来,看有没有过拟合;第三,对时间序列做滚动预测验证,而不是只看一次性 forecast;第四,把关键结论用另一个脚本交叉验证,比如回归说旅游收入影响 GDP,聚类也应该能看到高旅游收入组的经济表现更好。从那以后我每次拿到新的面板数据,都先跑一遍「分布 → 相关 → 回归 → 聚类」这条链路,再决定要不要上复杂模型。希望这份资源包能帮你省掉搭框架的时间,把精力花在解读结果上。

本文还有配套的精品资源,点击获取

需要专业的网站建设服务?

联系我们获取免费的网站建设咨询和方案报价,让我们帮助您实现业务目标

立即咨询