数据清洗与预处理:构建干净的分析数据集

民航市场分析的数据来源极为庞杂——离港系统、订座系统(PNL/ADL)、收益管理系统、航班计划系统、气象服务、空管流量数据等,各自拥有不同的字段定义、时间粒度、编码规则和存储格式。原始数据中普遍存在缺失值、异常值、重复记录、时间格式不一致、航线编码混乱等问题。若不经清洗直接进入分析模型,轻则导致统计指标失真,重则使趋势判断完全偏离实际。本章围绕“处理缺失值、异常值、重复数据,统一时间格式与航线编码”五大任务,系统讲解构建干净分析数据集的完整流程与实战方法。

数据清洗与预处理五步闭环 原始数据池 离港/订座/收益/气象 ① 缺失值处理 删除/均值/插补 业务规则填充 ② 异常值处理 IQR/3σ/业务阈值 标记与修正 ③ 重复数据处理 完全/部分重复 去重规则 ④ 时间格式统一 本地/UTC/时区转换 ⑤ 航线编码统一 IATA/ICAO/城市对映射 ✅ 干净分析数据集 标准化 · 一致 · 可追溯 · 可复现

4.1 缺失值处理:从“留白”到“有据可依”

核心原理:民航数据中的缺失值并非随机出现,往往带有业务含义。例如,某航班在离港系统中缺少“实际起飞时间”,可能是航班取消、备降或系统未及时录入;收益数据中缺少“平均票价”,可能是该舱位无销售记录而非数据错误。因此,处理缺失值的第一步不是“填”,而是“理解缺失的原因”。

缺失类型 典型场景 处理策略
完全随机缺失(MCAR) 系统故障导致个别记录丢失 直接删除或均值填充
随机缺失(MAR) 航班取消导致起飞时间缺失 根据航班状态字段推断
非随机缺失(MNAR) 低价舱位无票价记录 业务规则填充或单独标记

操作流程:首先统计各字段缺失率,绘制缺失矩阵;然后结合业务逻辑判断缺失原因;最后选择处理策略——对于关键字段(如航班号、日期)缺失率超过5%的记录直接剔除;对于连续型指标(如客座率)采用同航线、同时段的均值或中位数填充;对于分类字段(如航班状态)使用众数或“未知”标记。

经验提醒:在填充“实际起飞时间”时,不要简单用“计划起飞时间”替代。建议先判断航班状态:若状态为“正常”,可用计划时间+历史平均滑行时间估算;若状态为“延误”,需结合延误原因字段综合推断。

4.2 异常值识别:区分“真异常”与“业务波动”

核心原理:民航市场数据中的异常值有两类:一是数据录入或传输错误(如客座率显示为250%),二是真实的业务极端值(如春运期间票价飙升300%)。前者必须修正或剔除,后者恰恰是市场趋势分析的重点信号,不能盲目清洗。

判断方法:采用“3σ原则”与“IQR(四分位距)法”双重校验。对于客座率、票价、航班量等指标,先计算均值和标准差,标记超出±3σ的记录;再用IQR法(Q1-1.5×IQR至Q3+1.5×IQR)交叉验证。同时设定业务阈值——例如客座率必须在0%-100%区间,票价不得低于0元,航班量不得为负数。

实战场景:某航司分析某航线月度客座率时发现7月数据异常偏低(仅52%),而历史同期均在80%以上。初步判断为异常值,但进一步核查发现该月该航线临时增加了大量经停航班,拉低了整体客座率。若直接剔除,将掩盖运力结构调整的真实信号。正确做法是:保留数据,增加“经停占比”作为辅助分析维度。

4.3 重复数据处理:识别“同一条记录”的多种形态

核心原理:重复数据不仅指完全相同的记录,还包括部分字段重复的“近似重复”。在民航数据中,同一航班可能被多个系统重复上报,或同一旅客的订座记录在不同时间点被多次抓取。

操作流程:第一步,定义唯一标识键——通常为“航班号+计划起飞日期+起飞机场+到达机场”的组合;第二步,使用排序和分组检测完全重复记录;第三步,对近似重复记录,比较关键字段的相似度(如时间差小于30分钟、航班号相同但舱位不同),根据业务规则决定保留哪一条。

-- 示例:检测重复航班记录
SELECT flight_no, dep_date, dep_airport, arr_airport, COUNT(*)
FROM raw_flight_data
GROUP BY flight_no, dep_date, dep_airport, arr_airport
HAVING COUNT(*) > 1;
风险提示:去重时务必保留原始数据的“数据来源”字段。若同一航班在离港系统和订座系统中都存在,应优先保留离港系统数据(更接近实际运行),但需记录订座系统中的相关字段(如订座量)作为补充。

4.4 时间格式统一:跨越时区与系统差异

核心原理:民航数据涉及多种时间表达:本地时间(LST)、协调世界时(UTC)、Unix时间戳、字符串日期等。不同系统对同一时刻的记录方式可能完全不同——离港系统使用本地时间,收益系统使用UTC,而订座系统可能使用带时区偏移的ISO格式。若不统一,时间序列分析将产生系统性偏差。

统一策略:建议将所有时间字段转换为“UTC时间戳+本地时区偏移”的双重格式。具体步骤:①识别各字段的原始时区;②使用Python的pandas.to_datetime()或SQL的CONVERT_TZ()函数统一转换;③生成三个派生字段——utc_time(用于计算)、local_time(用于业务解读)、time_zone(用于追溯)。

原始格式 示例 统一后格式
本地时间字符串 2025-03-15 08:30:00 2025-03-15T00:30:00Z (UTC)
Unix时间戳 1742005800 2025-03-15T00:30:00Z (UTC)
ISO带时区 2025-03-15T08:30:00+08:00 2025-03-15T00:30:00Z (UTC)

4.5 航线编码统一:从“多套编码”到“单一标准”

核心原理:航线编码是民航市场分析的骨架字段。国内数据常用三字码(如PEK代表北京首都),国际数据常用ICAO四字码(如ZBAA),部分系统还使用城市对编码(如BJS-SHA)。同一航线在不同系统中可能呈现完全不同的编码形式,直接关联会导致数据断裂。

统一方案:建立“航线编码映射表”,包含以下字段:route_key(统一主键,格式为“出发三字码-到达三字码”)、dep_airport_icao、arr_airport_icao、dep_city_code、arr_city_code、airline_iata。通过映射表将各系统的编码统一转换,同时保留原始编码字段以便追溯。

案例拆解:某民航数据分析团队在整合国内与国际航班数据时,发现“北京-上海”航线存在三种编码:国内系统记为“PEK-SHA”,国际系统记为“ZBAA-ZSSS”,收益系统记为“BJS-SHA”。通过建立映射表,统一为“PEK-SHA”作为主键,同时保留ICAO编码用于国际航线联程分析。清洗后,该航线的月度航班量统计误差从15%降至0.5%以内。

4.6 构建干净数据集的完整流程与质量校验

操作流程:将上述五步整合为标准化流水线:①数据加载与字段探查 → ②缺失值处理 → ③异常值识别与修正 → ④重复数据去重 → ⑤时间格式统一 → ⑥航线编码映射 → ⑦数据质量校验 → ⑧输出干净数据集。每一步都需要记录处理日志,包括处理规则、影响记录数、处理前后对比。

质量校验指标:完整性(无关键字段缺失)、准确性(抽样比对原始数据)、一致性(时间、编码格式统一)、唯一性(无重复记录)、时效性(数据时间范围符合分析需求)。建议使用数据质量报告自动生成工具,输出各字段的健康度评分。

常见误区:①过度清洗——将业务波动误判为异常值剔除,导致趋势失真;②忽略数据血缘——清洗后无法追溯原始记录,出现问题难以排查;③一刀切处理——对所有字段使用相同的缺失值填充策略,未考虑业务差异;④忽视时区问题——直接拼接不同时区的时间字段,导致时间序列错位。
总结复盘:数据清洗不是一次性的“打扫卫生”,而是贯穿数据分析全周期的持续过程。建议建立“清洗规则库”,将常用处理逻辑(如时间转换函数、航线映射表、异常值阈值)固化为可复用的代码模块。每次分析前运行标准化清洗流程,确保不同时间、不同团队产出的分析结果具有可比性。最终交付的干净数据集应附带完整的数据字典和处理日志,使分析结论可复现、可审计。