4、数据准备与清洗:航空服务数据常见格式与预处理方法
航空服务趋势预测的准确性,很大程度上取决于输入数据的质量。原始数据往往来自多个异构系统,包含订票记录(PNL)、航班时刻表(OAG)、旅客流量统计(ACI/民航局统计)、气象报文(METAR/TAF)等,这些数据在格式、粒度、时区、编码和完整性上存在显著差异。本章将系统梳理航空服务数据的常见格式,并给出可落地的数据清洗、缺失值处理和异常值检测方法,为后续构建预测模型奠定可靠的数据基础。
4.1 航空服务数据常见格式与特征
航空服务预测所需的数据通常来自四个核心系统:旅客订座系统(PNR)、航班运营系统(OAG/时刻表)、机场流量统计系统以及气象服务系统。每种数据源都有其独特的格式规范和更新频率。
| 数据类别 | 常见格式 | 关键字段 | 更新频率 | 典型问题 |
|---|---|---|---|---|
| 订票记录(PNL) | EDIFACT、CSV、JSON | PNR号、航段、舱位、票价、旅客类型 | 实时/每小时 | 重复预订、取消未标记 |
| 航班时刻表 | 固定宽度文本、XML | 航班号、起降机场、计划时间、机型 | 每日/每季 | 时区混乱、夏令时切换 |
| 旅客流量统计 | CSV、Excel、数据库导出 | 日期、机场、旅客数、航班数、货邮量 | 每日/每月 | 统计口径不一致、缺失日 |
| 气象数据 | METAR/TAF报文、JSON API | 风速、能见度、云底高、温度、降水 | 每小时/每6小时 | 报文解析错误、站点缺失 |
在实际项目中,数据工程师首先需要完成格式识别与解析。例如,EDIFACT格式的PNL记录采用分段标识符(如"TKT"表示票号段,"SSR"表示特殊服务需求),解析时需按段拆分并映射到结构化字段。而气象METAR报文则采用固定编码规则,如"METAR ZBAA 120900Z 34005MPS 3000 BR SCT010 BKN030 18/15 Q1018 NOSIG",需要正则表达式提取风速、能见度、云层等要素。
4.2 数据清洗核心方法
数据清洗的目标是提升数据的准确性、完整性、一致性和时效性。针对航空服务数据,清洗工作通常包含以下五个步骤:
- 格式标准化:统一日期格式(YYYY-MM-DD)、时间格式(HH:MM:SS)、机场代码(统一为IATA三字码)、航班号格式(航司二字码+数字)。
- 去重处理:基于PNR号+航段+出发日期生成唯一键,删除重复订票记录;对于旅客流量统计,按日期+机场去重。
- 逻辑校验:检查航班到达时间是否晚于起飞时间(考虑跨时区)、旅客数是否为非负整数、票价是否在合理区间(如经济舱票价不应为负数或超过10万元)。
- 跨源对齐:将订票数据中的航班号与时刻表匹配,确认航班是否存在;将气象数据与机场位置匹配,确保使用正确的气象站数据。
- 编码转换:处理中文字符编码(GBK/UTF-8)、特殊字符(如"&"、"<")转义、不可见字符清理。
# 示例:Python数据清洗伪代码
import pandas as pd
# 1. 读取原始订票数据
df = pd.read_csv('pnl_raw.csv', encoding='utf-8')
# 2. 格式标准化
df['dep_date'] = pd.to_datetime(df['dep_date'], format='%Y%m%d')
df['flight_no'] = df['airline_code'] + df['flight_num'].astype(str)
# 3. 去重
df = df.drop_duplicates(subset=['pnr', 'flight_no', 'dep_date'])
# 4. 逻辑校验:过滤异常票价
df = df[(df['fare'] > 0) & (df['fare'] < 100000)]
# 5. 时区统一:将UTC时间转为本地时间
df['local_time'] = df['utc_time'] + pd.Timedelta(hours=8)
4.3 缺失值处理策略
航空数据中的缺失值可能源于系统故障、人工录入遗漏或数据源本身不完整。处理缺失值前,应先评估缺失机制:完全随机缺失(MCAR)、随机缺失(MAR)或非随机缺失(MNAR)。对于航空数据,旅客流量统计中的节假日数据缺失通常属于MNAR,因为节假日系统负载高可能导致记录丢失。
| 缺失比例 | 推荐策略 | 适用场景 | 注意事项 |
|---|---|---|---|
| < 5% | 删除缺失行 | 数据量充足,缺失随机 | 避免删除关键预测变量 |
| 5% - 20% | 均值/中位数填充 | 数值型变量,分布对称 | 会降低方差,需谨慎 |
| 20% - 40% | 时间序列插值 | 旅客流量、航班量等时序数据 | 线性插值或样条插值 |
| > 40% | 模型预测填充 | 有相关特征可用 | KNN、随机森林回归 |
| 结构性缺失 | 保留缺失标记 | 航班取消导致的旅客数缺失 | 增加"是否取消"指示变量 |
对于航班取消导致的旅客流量缺失,不应简单填充为0或平均值,而应单独标记。例如,某机场某日因台风取消50个航班,旅客流量骤降,若用历史均值填充会严重扭曲趋势预测。此时应保留缺失状态,并增加一个"异常事件"标志变量供模型学习。
4.4 异常值检测与处理
航空数据中的异常值可能代表真实事件(如春运客流高峰、航班大面积延误)或数据错误(如传感器故障、人工录入错误)。检测异常值需结合统计方法和业务规则。
4.4.1 统计检测方法
- 3σ原则:适用于近似正态分布的数据,如每日旅客流量。若某日旅客数超出均值±3倍标准差,则标记为异常。
- IQR四分位距法:适用于偏态分布,定义Q1-1.5×IQR和Q3+1.5×IQR为异常边界。例如,某航线票价分布右偏,用IQR法可识别出异常高价票。
- DBSCAN聚类:基于密度聚类,将低密度区域的点视为异常。适合发现航班延误时间中的离群点。
- 孤立森林:基于随机切割的集成方法,适合高维数据,如同时检测多个机场的流量异常。
4.4.2 业务规则检测
航空领域有一些硬性约束可用于异常检测:
- 旅客数不能超过该机型最大座位数(如A320最大189座)。
- 航班飞行时间不能超过该航线历史最大飞行时间的2倍。
- 票价不能低于机场建设费+燃油附加费之和。
- 同一PNR下不能出现两个相同航段的重复预订。
背景:某航司计划预测2024年春运期间(1月26日-3月5日)的每日旅客量,用于航班运力调配。历史数据包含2019-2023年共5年的订票记录和旅客流量统计。
初始问题:2020-2022年受疫情影响,数据波动极大;2023年数据恢复正常但存在部分缺失。
关键数据指标:每日订票量、每日实际旅客数、航班取消率、平均票价、天气延误率。
清洗过程:
① 格式统一:将2019-2023年数据统一为"日期+机场+旅客数+航班数+取消数"格式;
② 缺失值处理:2020年2月(疫情暴发期)数据缺失率高达45%,采用"同期增长率法"——参考2019年同期数据,按2020年1月的下降比例折算填充;
③ 异常值检测:发现2023年1月28日(正月初七)旅客数异常高(达平日的3.2倍),经核实为返程高峰真实值,保留并标记为"节假日高峰";
④ 剔除2020-2022年极端异常月份(2-4月),避免模型学习到疫情扭曲模式。
结果:清洗后的数据集用于训练XGBoost模型,预测2024年春运日均旅客量误差控制在±5%以内,较未清洗数据模型误差降低12个百分点。
复盘经验:对于含有重大事件(疫情、自然灾害)的历史数据,不能简单删除,而应分段处理或增加事件标记变量,让模型自行学习不同时期的规律。
4.5 常见误区与总结
在航空服务数据清洗实践中,以下误区需要特别警惕:
| 误区 | 后果 | 正确做法 |
|---|---|---|
| 对所有缺失值一律用均值填充 | 扭曲时间序列趋势,降低模型灵敏度 | 区分缺失机制,采用插值或模型填充 |
| 忽略时区差异直接合并数据 | 航班时刻错位,预测偏差 | 统一转换为UTC或指定时区 |
| 将航班取消视为普通低值 | 无法捕捉异常事件影响 | 单独标记取消事件,作为特征输入 |
| 清洗后不进行数据质量复核 | 错误数据进入模型,难以追溯 | 保留清洗日志,抽样验证清洗效果 |
| 过度清洗导致数据失真 | 真实波动被抹平,预测过于平滑 | 保留合理的业务波动,仅处理明确错误 |
总结而言,航空服务数据准备的核心原则是"理解业务、尊重真实、谨慎处理"。数据清洗不是简单的技术操作,而是需要结合航空业务知识(航班运营规律、旅客出行特征、天气影响机制)进行判断的过程。建议在每次清洗操作后记录数据变更日志,包括处理时间、处理规则、影响行数,以便模型迭代时追溯数据版本。最终形成一份高质量、可解释、可复现的建模数据集,为趋势预测提供坚实支撑。