3. 医疗数据清洗与预处理

医疗数据可视化的质量上限,往往在清洗阶段就已经被决定。原始数据通常来自 HIS、LIS、电子病历、监护设备导出文件等多个系统,字段命名、单位、编码体系、时间精度各不相同。若直接把这些数据送入绘图函数,得到的往往不是“图不好看”,而是结论错误:同一指标被拆成两条曲线、异常值把坐标轴拉爆、重复记录让统计量翻倍。本节围绕六类核心问题展开:缺失值、异常值、重复记录、单位统一、编码映射、时间序列对齐,并给出可直接复用的处理思路与示例。

一、先建立“数据体检”意识

清洗不是盲目删改,而是先量化问题。对一份示例性的住院血糖监测数据(约 5000 行,字段含 patient_id、item_name、value、unit、record_time、dept_code),可先做一次体检:统计每个字段的缺失率、数值字段的分位数、重复行数量、单位取值集合、编码取值集合、时间戳间隔分布。这一步的产出不是图,而是一张“问题清单”,它决定了后续每一步该用哪种策略。

建议在清洗前保留一份原始数据副本(如 raw_df),所有清洗操作在副本上进行,保证过程可回溯、可复现。

二、缺失值:先判断机制,再决定填充

缺失值不能一律删除或一律填充。关键判断是缺失机制:完全随机缺失(如设备偶发丢包)、随机缺失(如某类患者更少做某检查)、非随机缺失(如危重患者某项指标未测)。对医疗数据,常用策略如下:

  • 整行删除:仅当关键字段(如 patient_id、record_time、核心指标)缺失且无法补齐时使用,并记录删除比例。
  • 统计量填充:连续指标可用中位数(比均值更抗异常值),分类字段可用众数。示例中血糖缺失率约 4.2%,用同患者同日中位数填充,比全局中位数更贴近个体基线。
  • 前向/后向填充:适用于监护类高频时序,如心率、血压,但需限制最大填充跨度(如不超过 2 个采样间隔),避免跨越长时间空档。
  • 标记缺失:新增 is_imputed 布尔列,可视化时可用虚线或浅色区分“实测”与“填充”,避免误导。

示例代码片段:

df["glucose"] = df.groupby(["patient_id", df["record_time"].dt.date])["glucose"] \
    .transform(lambda s: s.fillna(s.median()))
df["glucose_imputed"] = df["glucose"].isna()

三、异常值:区分“错误值”与“真实极端值”

异常值处理最忌“一刀切”。医疗场景中,极端值可能是录入错误(如血糖 999 mmol/L),也可能是真实危重信号(如血糖 25 mmol/L)。推荐组合使用三类方法:

  • 生理范围规则:依据临床参考区间设定硬边界,如血糖 0.5~40 mmol/L,超出即标记为可疑。
  • 统计方法:IQR 法(Q1−1.5×IQR,Q3+1.5×IQR)或 Z-score(|z|>3),适合近似正态的指标。
  • 分组检测:按患者或科室分组计算,避免把某科室整体偏高误判为异常。

处理方式应分级:明显错误值(如负值、超出仪器量程)置为缺失并记录;可疑但可能真实的极端值保留,新增 outlier_flag 列,在可视化中用不同标记呈现,交由业务判断。

四、重复记录:明确“重复”的定义

重复记录有两种:完全重复行,以及业务意义上的重复(同一患者、同一指标、同一时间点出现多条)。前者可直接去重;后者需先排序再保留策略。示例中按 patient_id + item_name + record_time 分组,若同一时间点有多条,保留最新录入时间(updated_at 最大)的一条,并统计被合并条数。去重后应核对总行数变化,若减少比例异常高(如超过 15%),需回查数据抽取逻辑。

五、单位统一与编码映射

单位不统一是医疗数据可视化的“隐形杀手”。同一血糖指标可能同时存在 mmol/L 与 mg/dL,换算关系为 1 mmol/L ≈ 18.02 mg/dL。处理时应建立“标准单位字典”,把 value 统一换算到标准单位,并保留原始单位列。编码映射同理:科室代码、性别、检验项目名称在不同系统中可能不同,需通过映射表统一为分析用编码。

原始字段原始取值示例标准编码处理方式
unitmg/dLmmol/Lvalue ÷ 18.02
sexM / F / 1 / 2male / female字典映射
dept_codeEND01 / 内分泌科END映射表关联

六、时间序列对齐

多源数据的时间戳精度不同:检验系统可能精确到秒,护理记录可能只到分钟,设备数据可能带时区。对齐前先统一时区与格式,再按分析粒度重采样。例如把血糖、胰岛素、饮食记录统一到“每小时”网格:对高频数据取均值或末值,对事件型数据取“该小时内是否发生”。对齐后可能出现新的缺失,需再次按前述策略处理。下图展示了从原始多源数据到可视化就绪数据的整体处理链路与关键判断点。

医疗数据清洗与预处理链路 HIS / LIS 检验·医嘱 电子病历 护理·病程 监护设备 高频时序 数据体检 缺失率·分位数 重复·单位·编码 缺失值处理 中位数·分组填充·标记 异常值处理 生理范围·IQR·分组检测 重复记录处理 业务主键·保留最新 单位统一 标准单位字典·换算 编码映射 字典表·统一编码 时间序列对齐 时区·重采样·网格 可视化就绪数据 统一单位·统一编码 时间对齐·质量标记 可追溯·可复现 质量标记列:is_imputed · outlier_flag · is_duplicated · unit_converted · time_aligned 每个处理动作留痕,保证可视化结论可解释、可回溯

七、把清洗结果变成“可视化就绪数据”

完成上述处理后,建议输出一张宽表:每行是一个“患者—时间点”,列包括标准化后的指标值、单位、编码、质量标记。这样在绘图时,可以直接按质量标记决定线型或颜色,例如实测值用实线、填充值用虚线、异常值用红色三角标记。清洗的目标不是让数据“看起来干净”,而是让每一个可视化结论都能追溯到具体的数据处理动作。只有单位、编码、时间三者对齐,缺失、异常、重复三者可控,后续的统计图、趋势图、分布图才具备可信度。

清洗过程中不要覆盖原始数据;每一步变换都应记录参数(如填充方法、异常阈值、去重规则),否则当图形出现异常时,将无法判断是数据问题还是绘图问题。