数据清洗

什么是数据清洗

不可不知的三大要点

数据清洗,也称数据清理或数据整理,是识别和处理给定数据集中的异常的过程。清洗数据可以采用各种方法,包括管理离群值、估计缺失数据或滤除噪声。

通过清洗数据,工程师和数据科学家可以提高结果的质量,并避免基于有缺陷或不完整的数据得出错误的结论。

MATLAB® 提供简化数据清洗的函数和 App,让您可以专注于分析和解决问题。

数据清洗的重要性

数据清洗方法可应用于各个领域,包括信号处理、AI 和计算金融。

信号处理

从模拟传感器获得的信号会受到各种噪声源的影响,导致数据不一致。预处理涉及使用数据清洗方法,例如去除离群值和平滑处理,以确保分析是在干净且有意义的数据上执行的。

高级去噪方法,如自适应滤波器和小波变换,有助于去除噪声,同时防止受白噪声影响的宽带信号系统丢失基础信号信息。

图 1 显示的展示某人在 365 天内记录的每日体重 - 其中有缺失值。该图显示原始读数和插值读数。图上放大了 200 至 250 天的数据,显示了已识别的缺失值,以及通过插值得出的替换值。

MATLAB 图,x 轴表示天数,y 轴表示体重(千克)。原始体重数据用蓝色绘制,用圆圈表示使用插值方法填充的缺失体重值。

图 1. 某人每日体重数据的 MATLAB 图,其缺失条目使用插值方法填充。

人工智能

AI 模型的性能和可靠性直接取决于输入数据的质量。数据清洗能消除可误导 AI 模型的噪声、不一致、缺失值和离群值,从而避免导致有偏差或错误的结果。干净的输入数据可确保 AI 算法学习有效的模式并提供准确的预测。

图 2 显示的 MATLAB 图展示使用 fillmissingfilloutlierssmoothdata 函数清洗缺失数据、离群数据和噪声后的负载功耗数据,这些数据随后输入到 AI 模型中以生成准确的负载功耗预测。图 3 显示了使用 MATLAB 绘制的预测模型的结果、实际数据以及他们之间的误差量。如果不使用清洗后的数据集来训练模型,预测误差可能会更高。

MATLAB 图:显示功耗原始数据和使用数据清洗方法后的干净数据。

图 2. 使用 MATLAB 进行数据清洗前后的负载功耗图。

使用 MATLAB 中基于装袋树的回归 AI 模型创建的功耗数据的负载预测图,以及显示实际数据与预测数据之间差异的 MATLAB 图,其中 x 轴表示月份,y 轴表示误差(兆瓦)。

图 3. 使用 MATLAB 绘制的预测负载功耗的 AI 模型的验证结果。a) 基于装袋树的回归模型,绘制了预测数据对实际功耗数据的图。b) 预测数据与实际功耗数据之间的误差。

计算金融学

准确的金融模型、风险评估和投资策略依赖于干净的数据。金融分析师在数据清洗上花费大量时间应对数据带来的挑战,远多于实际建模。缺失数据、大规模数据或不同数据源可能导致有偏差的预测和有缺陷的决策。数据清洗是提高金融分析准确度和可靠性的有效方法。图 4 显示一家公司的年均股价中的缺失值。右图使用了 MATLAB 中的 fillmissing 函数通过线性插值填充缺失数据。

一家公司的年均股价原始数据的 MATLAB 图,包含缺失值及其清洗版本的图,其中的缺失值是通过线性插值这一填充缺失数据清洗方法补上的。

图 4. MATLAB 图显示使用线性插值填充一家公司年均股价中的缺失数据。

数据清洗的工作原理

数据清洗是一种迭代过程,涉及不同方法,具体取决于您的数据集、最终分析的目标以及可用的工具和软件。数据清洗通常涉及以下一个或多个步骤:

典型的数据清洗步骤

填充缺失数据

缺失数据指数据集中缺失的值或信息,导致出现 NULL、0、空字符串或无效 (NaN) 数据点。值缺失可能有多种原因,例如数据采集、数据传输和数据转换。缺失数据会对数据分析和建模的质量和有效性产生重大影响;因此,在数据清洗过程中适当地处理缺失数据非常重要。

缺失数据可分为三个类别,识别正确的类别可以帮助您选择合适的填充方法:

  1. 随机缺失 (MAR) - 在此类别中,具有缺失值的变量依赖于数据集中的其他变量。例如,以中继方式传输遥测数据(如辐射度级别、电网电压、频率等)的屋顶太阳能装置在夜间或雨天会有缺失值;由于没有足够的太阳辐射度为系统供电,因此电网电压或频率的缺失值是由低辐射度水平引起的。
  2. 完全随机缺失 (MCAR) - 在此类别中,缺失值的根本原因与数据集中的任何其他变量完全无关。例如,天气遥测中的丢包可能是由传感器故障或高通道噪声引起的。
  3. 非随机缺失 (MNAR) - 它适用于缺失数据的根本原因与变量本身相关的情况。例如,如果以中继方式传输温度信息的传感器已达到其测量限值,它将导致以饱和阈值形式出现的缺失值。

识别缺失数据听起来很简单,但用合适的估计值替换它是复杂的过程。您可以先通过可视化或搜索无效值来发现缺失值。替换缺失值涉及生成可能接近实际值的值。根据数据的性质,填充这些缺失值的方法可能会有所不同。例如:

  • 像温度这样变化缓慢的数据可以简单地使用最近的有效值。
  • 表现出季节性和低随机性的数据集(如天气)可以使用统计方法,如移动平均值、中位数或 K 最近邻法。
  • 表现出与其先前值有强依赖性的数据集(如股价或经济指标)非常适合使用基于插值的方法来生成缺失数据。

图 5 显示原始太阳辐射度数据,其缺失值使用 fillmissing 函数来填充。在这里,缺失值是使用基于移动中位数窗的方法来填充的。

图 5. 太阳辐射度原始数据集的时间序列图,其缺失值使用 MATLAB 中的 fillmissing 函数来填充。

管理离群值

离群值是数据集中与大多数观测值显著偏离的数据点。它们可能是异常的高值或低值,似乎不遵循数据的一般模式。离群值会使数据集的统计分析和解释失真,可能导致误导性的结果。离群值的出现可能有多种原因,包括测量误差、数据输入错误、自然变异性或所研究的基础过程中真正存在的异常。

管理离群值涉及两个可配置的步骤:

  1. 检测
  2. 检测离群值涉及定义有效的工作范围,超出该范围的任何数据点都识别为离群值。用于定义有效工作范围的方法与数据集的属性、来源和目的相关。这些方法有多种,涵盖简单的方法(如基于可视化或基于固定阈值的离群值检测)和统计方法(如中位数绝对偏差),以及基于距离的方法(如欧几里德距离和马氏距离)等。

  3. 填充离群值
  4. 在识别离群值后,可以用生成的值替换它们。用于替换离群值的生成方法与用于填充缺失数据的方法相似。

图 6 显示具有两个离群值的输入数据,这些离群值是使用线性插值中位数检测方法进行检测和填充的。

图显示使用中位数阈值检测到的两个离群值,它们是使用 MATLAB 中的“清洗离群数据”实时编辑器任务通过线性插值方法以交互方式填充的。

图 6. “清洗离群数据”实时编辑器任务分别使用中位数阈值和线性插值方法检测和填充离群值。

平滑

平滑是一种数据分析方法,用于减少数据集中的噪声、变异性或不规则性,以更清晰地揭示底层模式或趋势。它通常应用于统计学、信号处理、时间序列分析和图像处理等各个领域。

与其他数据清洗方法一样,平滑方法也高度依赖于数据的性质和领域。您可以使用简单的统计方法,如移动平均滤波器、加权移动平均滤波器或基于移动中位数的滤波器,也可以使用更复杂的方法,如样条、傅里叶变换平滑和卡尔曼滤波。平滑函数要求数据集是有序的并以固定间隔采样。

示意图:显示原始含噪输入数据,以及应用 MATLAB 中的数据清洗方法 smoothdata 函数后的数据,该函数用于去除输入信号中的噪声。

图 7. MATLAB 图,使用 smoothdata 函数通过移动平均滤波器进行了平滑处理的含噪数据集。

使用深度学习模型进行数据清洗

传统的数据清洗方法适用于可以用常见的统计和数学模型建模的数据。但对于不适合标准模型的复杂数据集,如人类语音、EEG 信号等,我们可以利用深度学习模型来执行数据清洗。

在图 8 所示的示例中,语音信号中充满了在背景中运行的洗衣机的噪声。诸如平滑或离群值去除之类的数据清洗方法不能有效地去除这类噪声,因为其音频频谱与语音信号重叠。深度学习网络,如全连接卷积网络,能够清洗或去噪语音信号,从而去除噪声并保留基础信号。

四个图,分别显示了干净的语音信号,被背景中的洗衣机噪声污染的版本,使用全连接网络对语音信号去噪的版本,以及使用卷积网络对语音信号去噪的版本,这些图在 MATLAB 中绘制。

图 8. 干净和含噪的语音信号的 MATLAB 图,以及两个深度学习网络(全连接和卷积网络)的去噪输出。

使用 Excel 进行数据清洗

Microsoft® Excel® 是用于清洗和准备数据的常用工具。它提供内置命令,如“删除重复项”及“查找和替换”,您可以使用这些命令来标准化数据集。您也可以应用条件格式来突出显示不一致之处,或使用透视表来识别和更正错误。然而,对于更大的数据集,诸如处理缺失值、合并数据集或应用自定义逻辑等任务通常需要手动完成。自动化的缺乏会增加处理中发生意外错误和不一致的风险,尤其是在处理复杂数据集时。

MATLAB 可以帮助处理 Excel 中数据清洗的一些更耗时的部分,特别是在处理更大的数据集时。MATLAB 脚本和函数使数据清洗变换变得透明,因此您可以始终看到采取了哪些步骤,并根据需要进行调整。例如,您可以使用 fillmissing 自动处理数据中的空白,而不是手动搜索缺失值。通过将 MATLAB 与 Excel 结合使用,您可以更一致地处理更混乱的数据集,同时保持对处理过程的控制。

使用 MATLAB 进行数据清洗

数据清洗是许多工程和科学工作流中重要的第一步。MATLAB 提供多种函数和交互式低代码方法(App 和实时编辑器任务)来高效地执行数据清洗。

交互功能

使用高级函数编写代码可能非常高效,特别是当您熟悉语言语法和不同函数选项时。然而,确定合适的数据清洗方法通常是一个迭代过程,为每次迭代花费时间使代码恰到好处可能会减慢进度。使用 MATLAB 中的交互式工具,您可以快速试验不同数据清洗方法,可视化每种方法对数据集的影响,然后确定最佳清洗方法。实时编辑器任务和 App(如数据清洗器)使您能够以更少的编码量轻松浏览、清洗、准备和完成数据分析任务。这些工具还可以自动生成 MATLAB 代码以供重用。

实时编辑器任务

实时编辑器任务是可以嵌入到实时脚本中的简单点选式界面或小型 App。任务表示一系列 MATLAB 命令,当您以交互方式浏览参数时,这些命令会自动运行;结果会立即显示。使用任务可缩短开发时间、减少错误并缩短在绘图上花费的时间。您可以使用一系列实时编辑器任务(如“清洗缺失数据”、“清洗离群数据”、“平滑数据”等)以交互方式执行不同数据清洗操作。

截图:MATLAB 中的数据预处理工具栏,提供一系列可供选择的交互式任务来执行数据清洗。

图 9. MATLAB 中可用于数据预处理的实时任务集合。

图 10. 使用“清洗缺失数据”实时编辑器任务以交互方式填充缺失数据。

数据清洗器

数据清洗器支持您处理和清洗列向原始数据。您可以通过交互方式迭代并可视化各种数据清洗选择项对原始数据的影响。

使用此 App,您可以:

  • 从 MATLAB 工作区或文件访问列向数据。
  • 使用可视化、数据和摘要视图探查数据。
  • 按变量排序,并重命名或删除变量。
  • 对时间表中的数据重设时间、堆叠或分叠表变量、清洗缺失数据、清洗离群数据、平滑数据或归一化数据。
  • 根据您要分析数据的方式,编辑和重新排序先前执行的数据清洗步骤。
  • 将清洗后的数据导出到 MATLAB 工作区,或将用于数据清洗的 MATLAB 代码导出为脚本或函数。

图 11. 使用 MATLAB 中的数据清洗器来探查和清洗时间序列数据。

如何使用 MATLAB 清洗数据
视频长度为 5:28

如何使用 MATLAB 清洗数据

了解如何使用 MATLAB 中的数据清洗器,通过简单的清洗步骤清洗杂乱的数据,并为分析和模型开发做好准备。

数据清洗是数据分析中重要的第一步,目的是使数据适合进一步分析。有关详细信息,请查看以下资源。

资源

通过文档、示例、视频等拓展您的知识。