4、数据准备与特征工程:从“脏数据”到“预测燃料”

文旅趋势预测的起点并非算法,而是数据。模型的上限由数据质量决定,特征工程则是将原始数据转化为模型可理解的“燃料”。本章聚焦于预测建模前的关键步骤:数据清洗、缺失值处理、节假日/活动特征构造,以及天气与舆情数据的融合。我们将遵循“先清洗、再构造、后融合”的工程链路,确保输入模型的数据既干净又富含业务信号。

文旅趋势预测数据准备与特征工程链路 ① 数据清洗 去重 / 格式统一 / 异常值 ② 缺失值处理 删除 / 插补 / 标记 ③ 特征构造 节假日 / 活动 / 时间窗口 ④ 数据融合 天气 / 舆情 / 多源对齐 OTA订单 / 景区闸机 / 搜索指数 历史客流 / 酒店预订 / 交通数据 节假日历 / 活动排期 / 促销计划 气象预报 / 社交媒体 / 新闻舆情 建模数据集(宽表) 时间粒度:日 / 周 / 节假日 节假日/活动特征 • 节假日类型(黄金周/小长假) • 距节假日天数(前/后窗口) • 活动级别(国际/全国/区域) • 活动主题(文化/体育/节庆) • 是否连休 / 调休影响 天气特征 • 温度(均值/极值/体感) • 降水概率 / 降水量 • 风力等级 / 空气质量 • 天气类型(晴/雨/雪) • 舒适度指数(温湿指数) 舆情特征 • 搜索指数(百度/微信) • 社交媒体提及量 • 情感倾向(正/负/中性) • 热门话题标签 • 网红打卡地传播度

4.1 数据清洗:去除噪声,统一口径

核心原理:文旅数据来源多样(OTA平台、景区票务系统、运营商信令、问卷调查),常存在重复记录、字段格式不一致、异常跳变等问题。清洗的目标是提升数据可信度,避免“垃圾进、垃圾出”。

操作流程:

  1. 去重:按用户ID+景区ID+日期+订单号进行多键去重,防止同一订单被多次统计。
  2. 格式统一:日期统一为YYYY-MM-DD,时间统一为24小时制,金额统一为人民币元,景区名称统一为官方标准名。
  3. 异常值检测:使用3σ原则或IQR(四分位距)法识别极端值。例如,某景区单日客流超过历史均值5倍以上,需核查是否为系统故障或真实大型活动。
  4. 逻辑校验:检查字段间逻辑关系,如“入园时间”不应早于“购票时间”,“游客年龄”应在0-120岁区间。
数据源常见脏数据清洗策略
OTA订单重复订单、取消未标记按订单号去重,过滤已取消状态
景区闸机设备故障导致计数为0或激增与历史同期对比,标记异常点
搜索指数爬虫抓取失败产生空值前向填充或插值处理
常见误区:不要盲目删除异常值。若某日客流异常高,可能是大型演唱会或免票政策导致,应结合活动日历核实后再决定保留或修正。

4.2 缺失值处理:不臆造,不浪费

核心原理:缺失值处理需权衡信息损失与引入偏差的风险。文旅数据中,天气数据可能因气象站故障缺失,舆情数据可能因平台接口限制不完整。

判断方法:

  • 缺失比例 < 5%:可直接删除对应记录,或使用均值/中位数填充。
  • 缺失比例 5%-20%:推荐使用时间序列插值(线性插值、样条插值)或基于相似日期的均值填充(如用上周同一天的值)。
  • 缺失比例 > 20%:该特征需谨慎使用,可考虑构造“是否缺失”作为独立二值特征,或放弃该特征。
# 示例:Python中处理缺失值
import pandas as pd
# 线性插值填充天气温度
df['temperature'] = df['temperature'].interpolate(method='linear')
# 用上周同一天填充客流缺失
df['visitors'] = df['visitors'].fillna(df['visitors'].shift(7))
经验提醒:对于节假日特征,若某年新增法定假日(如2025年新增的特定纪念日),历史数据中不存在对应记录,应使用规则填充(如参考相似假日的效应)。

4.3 节假日与活动特征构造:捕捉脉冲式需求

核心原理:文旅需求受节假日和大型活动影响呈脉冲式波动。模型需要显式感知“距离五一还有3天”或“本周有国际马拉松赛事”这类信息。

特征构造清单:

特征类别具体特征示例值
节假日类型是否黄金周、是否小长假、是否周末1(黄金周)、0(普通周末)
时间距离距下一个节假日天数(负数为已过)-2(节后第2天)
活动属性活动级别(国际/全国/区域)、活动类型国际、体育赛事
调休影响是否调休工作日、是否连休1(调休上班)、连休5天

实战场景:某主题公园预测国庆期间客流。仅用“是否节假日”二值特征,模型无法区分“国庆第一天”和“国庆最后一天”的差异。通过构造“距节假日开始天数”和“距节假日结束天数”两个连续特征,模型能学习到“假期前段客流高峰、后段回落”的模式。

案例拆解:2024年五一假期,某5A景区实际客流较预测高出23%。复盘发现,原因是“五一前一周当地举办国际音乐节”,该活动特征未纳入模型。修正后,在特征中加入“未来7天内是否有大型活动”及“活动级别”,预测误差降至6%。

4.4 天气与舆情数据融合:外部变量的价值

核心原理:天气直接影响游客出行意愿(雨天景区客流下降30%-50%),舆情反映目的地热度和口碑。融合的关键在于时间对齐和空间匹配。

融合流程:

  1. 时间对齐:天气数据使用预测日当天的预报值(而非实况),舆情数据使用前7天的累计提及量。
  2. 空间匹配:景区所在区县的气象站数据优先,若无则用最近城市数据并标注距离。
  3. 特征衍生:将天气和舆情组合成新特征,如“雨天+负面舆情”的交互项。
# 天气与舆情融合示例
# 天气:温度、降水概率;舆情:搜索指数、情感得分
df['bad_weather_negative'] = (df['precip_prob'] > 0.7) & (df['sentiment_score'] < 0.3)
df['comfort_index'] = df['temp'] - 0.55 * (1 - df['humidity']) * (df['temp'] - 26)
风险提示:舆情数据存在滞后性,当天的负面新闻可能第二天才影响客流。建议使用滞后1-3天的舆情特征,并通过交叉验证确定最优滞后阶数。

4.5 案例闭环:某古城景区预测模型的数据重构

背景与约束:某古城景区年接待游客500万人次,需预测未来14天每日客流以安排人力与物资。现有数据:近3年每日客流、节假日历、当地气象站数据、百度搜索指数。约束:预测系统需在每日早上6点前完成更新。

初始现象:原模型(仅用历史客流+节假日)MAPE(平均百分比误差)为18.5%,在暑期周末误差高达30%。

分析判断:排查发现,暑期周末误差大与当地“夜间灯光秀”活动相关,且雨天对户外演出影响显著。原模型未包含活动与天气特征。

操作步骤:

  1. 清洗历史客流数据,修正3个因闸机故障导致的异常零值。
  2. 缺失的天气数据(约8%)使用前向填充+同日期去年均值修正。
  3. 构造特征:距节假日天数、活动级别(0/1/2)、降水概率、体感温度、搜索指数7日均值。
  4. 使用LightGBM模型重新训练,采用时间序列交叉验证。

结果对比:模型MAPE从18.5%降至9.2%,暑期周末误差降至12%。代价是数据管道复杂度提升,需每日抓取活动排期和气象预报。

复盘经验:特征工程的价值大于模型选择;活动信息需提前录入系统,避免临时补充;天气特征使用预报值而非实况值,更贴近预测场景。

4.6 总结与常见误区

步骤关键要点常见误区
数据清洗多键去重、逻辑校验过度删除异常值
缺失值处理按比例选择策略全局均值填充忽略时间趋势
特征构造节假日距离、活动级别仅用二值“是否节假日”
数据融合时间对齐、空间匹配使用实况天气而非预报
核心原则:数据准备阶段应投入整个项目40%的时间。一个干净、特征丰富的宽表,能让简单模型(如线性回归)达到复杂模型80%的效果。建议建立数据质量监控看板,每日检查关键字段的缺失率和异常值数量。